/ Hex Artifact Content
Login

Artifact b90c5175b080a7d511fb06da0ada0c3d65d20b3b:


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 72 65 64 2e 20 49 6e 20 65 69 74 68 65 72 20  rred. In either 
7d00: 63 61 73 65 2c 20 74 68 72 6f 77 20 61 20 54 63  case, throw a Tc
7d10: 6c 20 65 78 63 65 70 74 69 6f 6e 0a 20 20 20 20  l exception.    
7d20: 20 20 2a 2a 20 61 6e 64 20 74 72 79 20 74 6f 20    ** and try to 
7d30: 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61  rollback the tra
7d40: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  nsaction..      
7d50: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20  **.      ** But 
7d60: 69 74 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65  it could also be
7d70: 20 74 68 61 74 20 74 68 65 20 75 73 65 72 20 65   that the user e
7d80: 78 65 63 75 74 65 64 20 6f 6e 65 20 6f 72 20 6d  xecuted one or m
7d90: 6f 72 65 20 42 45 47 49 4e 2c 20 0a 20 20 20 20  ore BEGIN, .    
7da0: 20 20 2a 2a 20 43 4f 4d 4d 49 54 2c 20 53 41 56    ** COMMIT, SAV
7db0: 45 50 4f 49 4e 54 2c 20 52 45 4c 45 41 53 45 20  EPOINT, RELEASE 
7dc0: 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 63 6f 6d 6d  or ROLLBACK comm
7dd0: 61 6e 64 73 20 74 68 61 74 20 61 72 65 20 63 6f  ands that are co
7de0: 6e 66 75 73 69 6e 67 0a 20 20 20 20 20 20 2a 2a  nfusing.      **
7df0: 20 74 68 69 73 20 6d 65 74 68 6f 64 27 73 20 6c   this method's l
7e00: 6f 67 69 63 2e 20 4e 6f 74 20 63 6c 65 61 72 20  ogic. Not clear 
7e10: 68 6f 77 20 74 68 69 73 20 77 6f 75 6c 64 20 62  how this would b
7e20: 65 20 62 65 73 74 20 68 61 6e 64 6c 65 64 2e 0a  e best handled..
7e30: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28        */.    if(
7e40: 20 72 63 21 3d 54 43 4c 5f 45 52 52 4f 52 20 29   rc!=TCL_ERROR )
7e50: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
7e60: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
7e70: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
7e80: 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20  pDb->db), 0);.  
7e90: 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52      rc = TCL_ERR
7ea0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  OR;.    }.    sq
7eb0: 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e  lite3_exec(pDb->
7ec0: 64 62 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20  db, "ROLLBACK", 
7ed0: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  0, 0, 0);.  }.  
7ee0: 70 44 62 2d 3e 64 69 73 61 62 6c 65 41 75 74 68  pDb->disableAuth
7ef0: 2d 2d 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  --;..  return rc
7f00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73  ;.}../*.** Unles
7f10: 73 20 53 51 4c 49 54 45 5f 54 45 53 54 20 69 73  s SQLITE_TEST is
7f20: 20 64 65 66 69 6e 65 64 2c 20 74 68 69 73 20 66   defined, this f
7f30: 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 73 69 6d  unction is a sim
7f40: 70 6c 65 20 77 72 61 70 70 65 72 20 61 72 6f 75  ple wrapper arou
7f50: 6e 64 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 70 72  nd.** sqlite3_pr
7f60: 65 70 61 72 65 5f 76 32 28 29 2e 20 49 66 20 53  epare_v2(). If S
7f70: 51 4c 49 54 45 5f 54 45 53 54 20 69 73 20 64 65  QLITE_TEST is de
7f80: 66 69 6e 65 64 2c 20 74 68 65 6e 20 69 74 20 75  fined, then it u
7f90: 73 65 73 20 65 69 74 68 65 72 0a 2a 2a 20 73 71  ses either.** sq
7fa0: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
7fb0: 28 29 20 6f 72 20 6c 65 67 61 63 79 20 69 6e 74  () or legacy int
7fc0: 65 72 66 61 63 65 20 73 71 6c 69 74 65 33 5f 70  erface sqlite3_p
7fd0: 72 65 70 61 72 65 28 29 2c 20 64 65 70 65 6e 64  repare(), depend
7fe0: 69 6e 67 0a 2a 2a 20 6f 6e 20 77 68 65 74 68 65  ing.** on whethe
7ff0: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 5b 64 62  r or not the [db
8000: 5f 75 73 65 5f 6c 65 67 61 63 79 5f 70 72 65 70  _use_legacy_prep
8010: 61 72 65 5d 20 63 6f 6d 6d 61 6e 64 20 68 61 73  are] command has
8020: 20 62 65 65 6e 20 75 73 65 64 20 74 6f 20 0a 2a   been used to .*
8030: 2a 20 63 6f 6e 66 69 67 75 72 65 20 74 68 65 20  * configure the 
8040: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  connection..*/.s
8050: 74 61 74 69 63 20 69 6e 74 20 64 62 50 72 65 70  tatic int dbPrep
8060: 61 72 65 28 0a 20 20 53 71 6c 69 74 65 44 62 20  are(.  SqliteDb 
8070: 2a 70 44 62 2c 20 20 20 20 20 20 20 20 20 20 20  *pDb,           
8080: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
8090: 73 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  se object */.  c
80a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c  onst char *zSql,
80b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
80c0: 2a 20 53 51 4c 20 74 6f 20 63 6f 6d 70 69 6c 65  * SQL to compile
80d0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
80e0: 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 20 20 20 20  mt **ppStmt,    
80f0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 72        /* OUT: Pr
8100: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
8110: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
8120: 20 2a 2a 70 7a 4f 75 74 20 20 20 20 20 20 20 20   **pzOut        
8130: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f        /* OUT: Po
8140: 69 6e 74 65 72 20 74 6f 20 6e 65 78 74 20 53 51  inter to next SQ
8150: 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29  L statement */.)
8160: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
8170: 54 45 53 54 0a 20 20 69 66 28 20 70 44 62 2d 3e  TEST.  if( pDb->
8180: 62 4c 65 67 61 63 79 50 72 65 70 61 72 65 20 29  bLegacyPrepare )
8190: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  {.    return sql
81a0: 69 74 65 33 5f 70 72 65 70 61 72 65 28 70 44 62  ite3_prepare(pDb
81b0: 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  ->db, zSql, -1, 
81c0: 70 70 53 74 6d 74 2c 20 70 7a 4f 75 74 29 3b 0a  ppStmt, pzOut);.
81d0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
81e0: 75 72 6e 20 73 71 6c 69 74 65 33 5f 70 72 65 70  urn sqlite3_prep
81f0: 61 72 65 5f 76 32 28 70 44 62 2d 3e 64 62 2c 20  are_v2(pDb->db, 
8200: 7a 53 71 6c 2c 20 2d 31 2c 20 70 70 53 74 6d 74  zSql, -1, ppStmt
8210: 2c 20 70 7a 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a  , pzOut);.}../*.
8220: 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20 63 61  ** Search the ca
8230: 63 68 65 20 66 6f 72 20 61 20 70 72 65 70 61 72  che for a prepar
8240: 65 64 2d 73 74 61 74 65 6d 65 6e 74 20 6f 62 6a  ed-statement obj
8250: 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ect that impleme
8260: 6e 74 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74  nts the.** first
8270: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69   SQL statement i
8280: 6e 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69  n the buffer poi
8290: 6e 74 65 64 20 74 6f 20 62 79 20 70 61 72 61 6d  nted to by param
82a0: 65 74 65 72 20 7a 49 6e 2e 20 49 66 0a 2a 2a 20  eter zIn. If.** 
82b0: 6e 6f 20 73 75 63 68 20 70 72 65 70 61 72 65 64  no such prepared
82c0: 2d 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 20 62  -statement can b
82d0: 65 20 66 6f 75 6e 64 2c 20 61 6c 6c 6f 63 61 74  e found, allocat
82e0: 65 20 61 6e 64 20 70 72 65 70 61 72 65 20 61 20  e and prepare a 
82f0: 6e 65 77 0a 2a 2a 20 6f 6e 65 2e 20 49 6e 20 65  new.** one. In e
8300: 69 74 68 65 72 20 63 61 73 65 2c 20 62 69 6e 64  ither case, bind
8310: 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
8320: 75 65 73 20 6f 66 20 74 68 65 20 72 65 6c 65 76  ues of the relev
8330: 61 6e 74 20 54 63 6c 0a 2a 2a 20 76 61 72 69 61  ant Tcl.** varia
8340: 62 6c 65 73 20 74 6f 20 61 6e 79 20 24 76 61 72  bles to any $var
8350: 2c 20 3a 76 61 72 20 6f 72 20 40 76 61 72 20 76  , :var or @var v
8360: 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20  ariables in the 
8370: 73 74 61 74 65 6d 65 6e 74 2e 20 42 65 66 6f 72  statement. Befor
8380: 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2c 20  e.** returning, 
8390: 73 65 74 20 2a 70 70 50 72 65 53 74 6d 74 20 74  set *ppPreStmt t
83a0: 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70  o point to the p
83b0: 72 65 70 61 72 65 64 2d 73 74 61 74 65 6d 65 6e  repared-statemen
83c0: 74 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  t object..**.** 
83d0: 4f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72  Output parameter
83e0: 20 2a 70 7a 4f 75 74 20 69 73 20 73 65 74 20 74   *pzOut is set t
83f0: 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e  o point to the n
8400: 65 78 74 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ext SQL statemen
8410: 74 20 69 6e 0a 2a 2a 20 62 75 66 66 65 72 20 7a  t in.** buffer z
8420: 49 6e 2c 20 6f 72 20 74 6f 20 74 68 65 20 27 5c  In, or to the '\
8430: 30 27 20 62 79 74 65 20 61 74 20 74 68 65 20 65  0' byte at the e
8440: 6e 64 20 6f 66 20 7a 49 6e 20 69 66 20 74 68 65  nd of zIn if the
8450: 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 6e 65 78 74  re is no.** next
8460: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
8470: 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
8480: 20 54 43 4c 5f 4f 4b 20 69 73 20 72 65 74 75 72   TCL_OK is retur
8490: 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
84a0: 54 43 4c 5f 45 52 52 4f 52 20 69 73 20 72 65 74  TCL_ERROR is ret
84b0: 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20  urned.** and an 
84c0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6c 6f  error message lo
84d0: 61 64 65 64 20 69 6e 74 6f 20 69 6e 74 65 72 70  aded into interp
84e0: 72 65 74 65 72 20 70 44 62 2d 3e 69 6e 74 65 72  reter pDb->inter
84f0: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
8500: 20 64 62 50 72 65 70 61 72 65 41 6e 64 42 69 6e   dbPrepareAndBin
8510: 64 28 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  d(.  SqliteDb *p
8520: 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Db,             
8530: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
8540: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61   object */.  cha
8550: 72 20 63 6f 6e 73 74 20 2a 7a 49 6e 2c 20 20 20  r const *zIn,   
8560: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8570: 53 51 4c 20 74 6f 20 63 6f 6d 70 69 6c 65 20 2a  SQL to compile *
8580: 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  /.  char const *
8590: 2a 70 7a 4f 75 74 2c 20 20 20 20 20 20 20 20 20  *pzOut,         
85a0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e      /* OUT: Poin
85b0: 74 65 72 20 74 6f 20 6e 65 78 74 20 53 51 4c 20  ter to next SQL 
85c0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53  statement */.  S
85d0: 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a  qlPreparedStmt *
85e0: 2a 70 70 50 72 65 53 74 6d 74 20 20 20 20 20 2f  *ppPreStmt     /
85f0: 2a 20 4f 55 54 3a 20 4f 62 6a 65 63 74 20 75 73  * OUT: Object us
8600: 65 64 20 74 6f 20 63 61 63 68 65 20 73 74 61 74  ed to cache stat
8610: 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 6f  ement */.){.  co
8620: 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d  nst char *zSql =
8630: 20 7a 49 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a   zIn;         /*
8640: 20 50 6f 69 6e 74 65 72 20 74 6f 20 66 69 72 73   Pointer to firs
8650: 74 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  t SQL statement 
8660: 69 6e 20 7a 49 6e 20 2a 2f 0a 20 20 73 71 6c 69  in zIn */.  sqli
8670: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
8680: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
8690: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
86a0: 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 53 71  t object */.  Sq
86b0: 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70  lPreparedStmt *p
86c0: 50 72 65 53 74 6d 74 3b 20 20 20 20 20 20 2f 2a  PreStmt;      /*
86d0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 61 63 68   Pointer to cach
86e0: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  ed statement */.
86f0: 20 20 69 6e 74 20 6e 53 71 6c 3b 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 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a    /* Length of z
8720: 53 71 6c 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  Sql in bytes */.
8730: 20 20 69 6e 74 20 6e 56 61 72 3b 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 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76    /* Number of v
8760: 61 72 69 61 62 6c 65 73 20 69 6e 20 73 74 61 74  ariables in stat
8770: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ement */.  int i
8780: 50 61 72 6d 20 3d 20 30 3b 20 20 20 20 20 20 20  Parm = 0;       
8790: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
87a0: 78 74 20 66 72 65 65 20 65 6e 74 72 79 20 69 6e  xt free entry in
87b0: 20 61 70 50 61 72 6d 20 2a 2f 0a 20 20 69 6e 74   apParm */.  int
87c0: 20 69 3b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   i;.  Tcl_Interp
87d0: 20 2a 69 6e 74 65 72 70 20 3d 20 70 44 62 2d 3e   *interp = pDb->
87e0: 69 6e 74 65 72 70 3b 0a 0a 20 20 2a 70 70 50 72  interp;..  *ppPr
87f0: 65 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a  eStmt = 0;..  /*
8800: 20 54 72 69 6d 20 73 70 61 63 65 73 20 66 72 6f   Trim spaces fro
8810: 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 7a  m the start of z
8820: 53 71 6c 20 61 6e 64 20 63 61 6c 63 75 6c 61 74  Sql and calculat
8830: 65 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 20  e the remaining 
8840: 6c 65 6e 67 74 68 2e 20 2a 2f 0a 20 20 77 68 69  length. */.  whi
8850: 6c 65 28 20 69 73 73 70 61 63 65 28 7a 53 71 6c  le( isspace(zSql
8860: 5b 30 5d 29 20 29 7b 20 7a 53 71 6c 2b 2b 3b 20  [0]) ){ zSql++; 
8870: 7d 0a 20 20 6e 53 71 6c 20 3d 20 73 74 72 6c 65  }.  nSql = strle
8880: 6e 33 30 28 7a 53 71 6c 29 3b 0a 0a 20 20 66 6f  n30(zSql);..  fo
8890: 72 28 70 50 72 65 53 74 6d 74 20 3d 20 70 44 62  r(pPreStmt = pDb
88a0: 2d 3e 73 74 6d 74 4c 69 73 74 3b 20 70 50 72 65  ->stmtList; pPre
88b0: 53 74 6d 74 3b 20 70 50 72 65 53 74 6d 74 3d 70  Stmt; pPreStmt=p
88c0: 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 29 7b  PreStmt->pNext){
88d0: 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 50 72  .    int n = pPr
88e0: 65 53 74 6d 74 2d 3e 6e 53 71 6c 3b 0a 20 20 20  eStmt->nSql;.   
88f0: 20 69 66 28 20 6e 53 71 6c 3e 3d 6e 20 0a 20 20   if( nSql>=n .  
8900: 20 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28        && memcmp(
8910: 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c 20  pPreStmt->zSql, 
8920: 7a 53 71 6c 2c 20 6e 29 3d 3d 30 0a 20 20 20 20  zSql, n)==0.    
8930: 20 20 20 20 26 26 20 28 7a 53 71 6c 5b 6e 5d 3d      && (zSql[n]=
8940: 3d 30 20 7c 7c 20 7a 53 71 6c 5b 6e 2d 31 5d 3d  =0 || zSql[n-1]=
8950: 3d 27 3b 27 29 0a 20 20 20 20 29 7b 0a 20 20 20  =';').    ){.   
8960: 20 20 20 70 53 74 6d 74 20 3d 20 70 50 72 65 53     pStmt = pPreS
8970: 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20  tmt->pStmt;.    
8980: 20 20 2a 70 7a 4f 75 74 20 3d 20 26 7a 53 71 6c    *pzOut = &zSql
8990: 5b 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 5d  [pPreStmt->nSql]
89a0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 6e  ;..      /* When
89b0: 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
89c0: 65 6d 65 6e 74 20 69 73 20 66 6f 75 6e 64 2c 20  ement is found, 
89d0: 75 6e 6c 69 6e 6b 20 69 74 20 66 72 6f 6d 20 74  unlink it from t
89e0: 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 63 68  he.      ** cach
89f0: 65 20 6c 69 73 74 2e 20 20 49 74 20 77 69 6c 6c  e list.  It will
8a00: 20 6c 61 74 65 72 20 62 65 20 61 64 64 65 64 20   later be added 
8a10: 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65 67 69  back to the begi
8a20: 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 6f  nning.      ** o
8a30: 66 20 74 68 65 20 63 61 63 68 65 20 6c 69 73 74  f the cache list
8a40: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6d 70   in order to imp
8a50: 6c 65 6d 65 6e 74 20 4c 52 55 20 72 65 70 6c 61  lement LRU repla
8a60: 63 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f  cement..      */
8a70: 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65 53  .      if( pPreS
8a80: 74 6d 74 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  tmt->pPrev ){.  
8a90: 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e        pPreStmt->
8aa0: 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
8ab0: 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 3b 0a  PreStmt->pNext;.
8ac0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8ad0: 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69       pDb->stmtLi
8ae0: 73 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70  st = pPreStmt->p
8af0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
8b00: 20 20 20 20 69 66 28 20 70 50 72 65 53 74 6d 74      if( pPreStmt
8b10: 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
8b20: 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65     pPreStmt->pNe
8b30: 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 50 72 65  xt->pPrev = pPre
8b40: 53 74 6d 74 2d 3e 70 50 72 65 76 3b 0a 20 20 20  Stmt->pPrev;.   
8b50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8b60: 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20    pDb->stmtLast 
8b70: 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65  = pPreStmt->pPre
8b80: 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  v;.      }.     
8b90: 20 70 44 62 2d 3e 6e 53 74 6d 74 2d 2d 3b 0a 20   pDb->nStmt--;. 
8ba0: 20 20 20 20 20 6e 56 61 72 20 3d 20 73 71 6c 69       nVar = sqli
8bb0: 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
8bc0: 65 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b  er_count(pStmt);
8bd0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8be0: 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20    }.  }.  .  /* 
8bf0: 49 66 20 6e 6f 20 70 72 65 70 61 72 65 64 20 73  If no prepared s
8c00: 74 61 74 65 6d 65 6e 74 20 77 61 73 20 66 6f 75  tatement was fou
8c10: 6e 64 2e 20 43 6f 6d 70 69 6c 65 20 74 68 65 20  nd. Compile the 
8c20: 53 51 4c 20 74 65 78 74 2e 20 41 6c 73 6f 20 61  SQL text. Also a
8c30: 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 61 20 6e  llocate.  ** a n
8c40: 65 77 20 53 71 6c 50 72 65 70 61 72 65 64 53 74  ew SqlPreparedSt
8c50: 6d 74 20 73 74 72 75 63 74 75 72 65 2e 20 20 2a  mt structure.  *
8c60: 2f 0a 20 20 69 66 28 20 70 50 72 65 53 74 6d 74  /.  if( pPreStmt
8c70: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  ==0 ){.    int n
8c80: 42 79 74 65 3b 0a 0a 20 20 20 20 69 66 28 20 53  Byte;..    if( S
8c90: 51 4c 49 54 45 5f 4f 4b 21 3d 64 62 50 72 65 70  QLITE_OK!=dbPrep
8ca0: 61 72 65 28 70 44 62 2c 20 7a 53 71 6c 2c 20 26  are(pDb, zSql, &
8cb0: 70 53 74 6d 74 2c 20 70 7a 4f 75 74 29 20 29 7b  pStmt, pzOut) ){
8cc0: 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  .      Tcl_SetOb
8cd0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
8ce0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
8cf0: 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28  (sqlite3_errmsg(
8d00: 70 44 62 2d 3e 64 62 29 2c 20 2d 31 29 29 3b 0a  pDb->db), -1));.
8d10: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
8d20: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
8d30: 20 20 69 66 28 20 70 53 74 6d 74 3d 3d 30 20 29    if( pStmt==0 )
8d40: 7b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  {.      if( SQLI
8d50: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 65  TE_OK!=sqlite3_e
8d60: 72 72 63 6f 64 65 28 70 44 62 2d 3e 64 62 29 20  rrcode(pDb->db) 
8d70: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ){.        /* A 
8d80: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 65 72 72  compile-time err
8d90: 6f 72 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  or in the statem
8da0: 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ent. */.        
8db0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
8dc0: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
8dd0: 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65  StringObj(sqlite
8de0: 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
8df0: 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 20 20 20  ), -1));.       
8e00: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
8e10: 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  R;.      }else{.
8e20: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
8e30: 74 61 74 65 6d 65 6e 74 20 77 61 73 20 61 20 6e  tatement was a n
8e40: 6f 2d 6f 70 2e 20 20 43 6f 6e 74 69 6e 75 65 20  o-op.  Continue 
8e50: 74 6f 20 74 68 65 20 6e 65 78 74 20 73 74 61 74  to the next stat
8e60: 65 6d 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a  ement.        **
8e70: 20 69 6e 20 74 68 65 20 53 51 4c 20 73 74 72 69   in the SQL stri
8e80: 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ng..        */. 
8e90: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
8ea0: 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  L_OK;.      }.  
8eb0: 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28    }..    assert(
8ec0: 20 70 50 72 65 53 74 6d 74 3d 3d 30 20 29 3b 0a   pPreStmt==0 );.
8ed0: 20 20 20 20 6e 56 61 72 20 3d 20 73 71 6c 69 74      nVar = sqlit
8ee0: 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
8ef0: 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a  r_count(pStmt);.
8f00: 20 20 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65      nByte = size
8f10: 6f 66 28 53 71 6c 50 72 65 70 61 72 65 64 53 74  of(SqlPreparedSt
8f20: 6d 74 29 20 2b 20 6e 56 61 72 2a 73 69 7a 65 6f  mt) + nVar*sizeo
8f30: 66 28 54 63 6c 5f 4f 62 6a 20 2a 29 3b 0a 20 20  f(Tcl_Obj *);.  
8f40: 20 20 70 50 72 65 53 74 6d 74 20 3d 20 28 53 71    pPreStmt = (Sq
8f50: 6c 50 72 65 70 61 72 65 64 53 74 6d 74 2a 29 54  lPreparedStmt*)T
8f60: 63 6c 5f 41 6c 6c 6f 63 28 6e 42 79 74 65 29 3b  cl_Alloc(nByte);
8f70: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 72 65  .    memset(pPre
8f80: 53 74 6d 74 2c 20 30 2c 20 6e 42 79 74 65 29 3b  Stmt, 0, nByte);
8f90: 0a 0a 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e  ..    pPreStmt->
8fa0: 70 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20  pStmt = pStmt;. 
8fb0: 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71     pPreStmt->nSq
8fc0: 6c 20 3d 20 28 69 6e 74 29 28 2a 70 7a 4f 75 74  l = (int)(*pzOut
8fd0: 20 2d 20 7a 53 71 6c 29 3b 0a 20 20 20 20 70 50   - zSql);.    pP
8fe0: 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 20 3d 20 73  reStmt->zSql = s
8ff0: 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d 74  qlite3_sql(pStmt
9000: 29 3b 0a 20 20 20 20 70 50 72 65 53 74 6d 74 2d  );.    pPreStmt-
9010: 3e 61 70 50 61 72 6d 20 3d 20 28 54 63 6c 5f 4f  >apParm = (Tcl_O
9020: 62 6a 20 2a 2a 29 26 70 50 72 65 53 74 6d 74 5b  bj **)&pPreStmt[
9030: 31 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  1];.#ifdef SQLIT
9040: 45 5f 54 45 53 54 0a 20 20 20 20 69 66 28 20 70  E_TEST.    if( p
9050: 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 3d 3d 30  PreStmt->zSql==0
9060: 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
9070: 7a 43 6f 70 79 20 3d 20 54 63 6c 5f 41 6c 6c 6f  zCopy = Tcl_Allo
9080: 63 28 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c  c(pPreStmt->nSql
9090: 20 2b 20 31 29 3b 0a 20 20 20 20 20 20 6d 65 6d   + 1);.      mem
90a0: 63 70 79 28 7a 43 6f 70 79 2c 20 7a 53 71 6c 2c  cpy(zCopy, zSql,
90b0: 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 29   pPreStmt->nSql)
90c0: 3b 0a 20 20 20 20 20 20 7a 43 6f 70 79 5b 70 50  ;.      zCopy[pP
90d0: 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 5d 20 3d 20  reStmt->nSql] = 
90e0: 27 5c 30 27 3b 0a 20 20 20 20 20 20 70 50 72 65  '\0';.      pPre
90f0: 53 74 6d 74 2d 3e 7a 53 71 6c 20 3d 20 7a 43 6f  Stmt->zSql = zCo
9100: 70 79 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  py;.    }.#endif
9110: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
9120: 50 72 65 53 74 6d 74 20 29 3b 0a 20 20 61 73 73  PreStmt );.  ass
9130: 65 72 74 28 20 73 74 72 6c 65 6e 33 30 28 70 50  ert( strlen30(pP
9140: 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 29 3d 3d 70  reStmt->zSql)==p
9150: 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 20 29 3b  PreStmt->nSql );
9160: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 6d 65  .  assert( 0==me
9170: 6d 63 6d 70 28 70 50 72 65 53 74 6d 74 2d 3e 7a  mcmp(pPreStmt->z
9180: 53 71 6c 2c 20 7a 53 71 6c 2c 20 70 50 72 65 53  Sql, zSql, pPreS
9190: 74 6d 74 2d 3e 6e 53 71 6c 29 20 29 3b 0a 0a 20  tmt->nSql) );.. 
91a0: 20 2f 2a 20 42 69 6e 64 20 76 61 6c 75 65 73 20   /* Bind values 
91b0: 74 6f 20 70 61 72 61 6d 65 74 65 72 73 20 74 68  to parameters th
91c0: 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 24 20  at begin with $ 
91d0: 6f 72 20 3a 20 2a 2f 20 20 0a 20 20 66 6f 72 28  or : */  .  for(
91e0: 69 3d 31 3b 20 69 3c 3d 6e 56 61 72 3b 20 69 2b  i=1; i<=nVar; i+
91f0: 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  +){.    const ch
9200: 61 72 20 2a 7a 56 61 72 20 3d 20 73 71 6c 69 74  ar *zVar = sqlit
9210: 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
9220: 72 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20 69 29  r_name(pStmt, i)
9230: 3b 0a 20 20 20 20 69 66 28 20 7a 56 61 72 21 3d  ;.    if( zVar!=
9240: 30 20 26 26 20 28 7a 56 61 72 5b 30 5d 3d 3d 27  0 && (zVar[0]=='
9250: 24 27 20 7c 7c 20 7a 56 61 72 5b 30 5d 3d 3d 27  $' || zVar[0]=='
9260: 3a 27 20 7c 7c 20 7a 56 61 72 5b 30 5d 3d 3d 27  :' || zVar[0]=='
9270: 40 27 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  @') ){.      Tcl
9280: 5f 4f 62 6a 20 2a 70 56 61 72 20 3d 20 54 63 6c  _Obj *pVar = Tcl
9290: 5f 47 65 74 56 61 72 32 45 78 28 69 6e 74 65 72  _GetVar2Ex(inter
92a0: 70 2c 20 26 7a 56 61 72 5b 31 5d 2c 20 30 2c 20  p, &zVar[1], 0, 
92b0: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 56  0);.      if( pV
92c0: 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ar ){.        in
92d0: 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 75 38 20  t n;.        u8 
92e0: 2a 64 61 74 61 3b 0a 20 20 20 20 20 20 20 20 63  *data;.        c
92f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
9300: 20 3d 20 28 70 56 61 72 2d 3e 74 79 70 65 50 74   = (pVar->typePt
9310: 72 20 3f 20 70 56 61 72 2d 3e 74 79 70 65 50 74  r ? pVar->typePt
9320: 72 2d 3e 6e 61 6d 65 20 3a 20 22 22 29 3b 0a 20  r->name : "");. 
9330: 20 20 20 20 20 20 20 63 68 61 72 20 63 20 3d 20         char c = 
9340: 7a 54 79 70 65 5b 30 5d 3b 0a 20 20 20 20 20 20  zType[0];.      
9350: 20 20 69 66 28 20 7a 56 61 72 5b 30 5d 3d 3d 27    if( zVar[0]=='
9360: 40 27 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  @' ||.          
9370: 20 28 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63   (c=='b' && strc
9380: 6d 70 28 7a 54 79 70 65 2c 22 62 79 74 65 61 72  mp(zType,"bytear
9390: 72 61 79 22 29 3d 3d 30 20 26 26 20 70 56 61 72  ray")==0 && pVar
93a0: 2d 3e 62 79 74 65 73 3d 3d 30 29 20 29 7b 0a 20  ->bytes==0) ){. 
93b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 61 64           /* Load
93c0: 20 61 20 42 4c 4f 42 20 74 79 70 65 20 69 66 20   a BLOB type if 
93d0: 74 68 65 20 54 63 6c 20 76 61 72 69 61 62 6c 65  the Tcl variable
93e0: 20 69 73 20 61 20 62 79 74 65 61 72 72 61 79 20   is a bytearray 
93f0: 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  and.          **
9400: 20 69 74 20 68 61 73 20 6e 6f 20 73 74 72 69 6e   it has no strin
9410: 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  g representation
9420: 20 6f 72 20 74 68 65 20 68 6f 73 74 0a 20 20 20   or the host.   
9430: 20 20 20 20 20 20 20 2a 2a 20 70 61 72 61 6d 65         ** parame
9440: 74 65 72 20 6e 61 6d 65 20 62 65 67 69 6e 73 20  ter name begins 
9450: 77 69 74 68 20 22 40 22 2e 20 2a 2f 0a 20 20 20  with "@". */.   
9460: 20 20 20 20 20 20 20 64 61 74 61 20 3d 20 54 63         data = Tc
9470: 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72  l_GetByteArrayFr
9480: 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b  omObj(pVar, &n);
9490: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
94a0: 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74  e3_bind_blob(pSt
94b0: 6d 74 2c 20 69 2c 20 64 61 74 61 2c 20 6e 2c 20  mt, i, data, n, 
94c0: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
94d0: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e            Tcl_In
94e0: 63 72 52 65 66 43 6f 75 6e 74 28 70 56 61 72 29  crRefCount(pVar)
94f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 72 65  ;.          pPre
9500: 53 74 6d 74 2d 3e 61 70 50 61 72 6d 5b 69 50 61  Stmt->apParm[iPa
9510: 72 6d 2b 2b 5d 20 3d 20 70 56 61 72 3b 0a 20 20  rm++] = pVar;.  
9520: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
9530: 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d 70  c=='b' && strcmp
9540: 28 7a 54 79 70 65 2c 22 62 6f 6f 6c 65 61 6e 22  (zType,"boolean"
9550: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
9560: 20 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d    Tcl_GetIntFrom
9570: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 56 61 72  Obj(interp, pVar
9580: 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  , &n);.         
9590: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
95a0: 74 28 70 53 74 6d 74 2c 20 69 2c 20 6e 29 3b 0a  t(pStmt, i, n);.
95b0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
95c0: 28 20 63 3d 3d 27 64 27 20 26 26 20 73 74 72 63  ( c=='d' && strc
95d0: 6d 70 28 7a 54 79 70 65 2c 22 64 6f 75 62 6c 65  mp(zType,"double
95e0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
95f0: 20 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20     double r;.   
9600: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 44 6f         Tcl_GetDo
9610: 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  ubleFromObj(inte
9620: 72 70 2c 20 70 56 61 72 2c 20 26 72 29 3b 0a 20  rp, pVar, &r);. 
9630: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
9640: 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28 70 53 74  _bind_double(pSt
9650: 6d 74 2c 20 69 2c 20 72 29 3b 0a 20 20 20 20 20  mt, i, r);.     
9660: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63 3d     }else if( (c=
9670: 3d 27 77 27 20 26 26 20 73 74 72 63 6d 70 28 7a  ='w' && strcmp(z
9680: 54 79 70 65 2c 22 77 69 64 65 49 6e 74 22 29 3d  Type,"wideInt")=
9690: 3d 30 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  =0) ||.         
96a0: 20 20 20 20 20 28 63 3d 3d 27 69 27 20 26 26 20       (c=='i' && 
96b0: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 69 6e  strcmp(zType,"in
96c0: 74 22 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20  t")==0) ){.     
96d0: 20 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74       Tcl_WideInt
96e0: 20 76 3b 0a 20 20 20 20 20 20 20 20 20 20 54 63   v;.          Tc
96f0: 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d  l_GetWideIntFrom
9700: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 56 61 72  Obj(interp, pVar
9710: 2c 20 26 76 29 3b 0a 20 20 20 20 20 20 20 20 20  , &v);.         
9720: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
9730: 74 36 34 28 70 53 74 6d 74 2c 20 69 2c 20 76 29  t64(pStmt, i, v)
9740: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
9750: 0a 20 20 20 20 20 20 20 20 20 20 64 61 74 61 20  .          data 
9760: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
9770: 20 2a 29 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   *)Tcl_GetString
9780: 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e  FromObj(pVar, &n
9790: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
97a0: 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70  ite3_bind_text(p
97b0: 53 74 6d 74 2c 20 69 2c 20 28 63 68 61 72 20 2a  Stmt, i, (char *
97c0: 29 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45  )data, n, SQLITE
97d0: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
97e0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
97f0: 6f 75 6e 74 28 70 56 61 72 29 3b 0a 20 20 20 20  ount(pVar);.    
9800: 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e        pPreStmt->
9810: 61 70 50 61 72 6d 5b 69 50 61 72 6d 2b 2b 5d 20  apParm[iParm++] 
9820: 3d 20 70 56 61 72 3b 0a 20 20 20 20 20 20 20 20  = pVar;.        
9830: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
9840: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
9850: 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20  ind_null(pStmt, 
9860: 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i);.      }.    
9870: 7d 0a 20 20 7d 0a 20 20 70 50 72 65 53 74 6d 74  }.  }.  pPreStmt
9880: 2d 3e 6e 50 61 72 6d 20 3d 20 69 50 61 72 6d 3b  ->nParm = iParm;
9890: 0a 20 20 2a 70 70 50 72 65 53 74 6d 74 20 3d 20  .  *ppPreStmt = 
98a0: 70 50 72 65 53 74 6d 74 3b 0a 0a 20 20 72 65 74  pPreStmt;..  ret
98b0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
98c0: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 73  *.** Release a s
98d0: 74 61 74 65 6d 65 6e 74 20 72 65 66 65 72 65 6e  tatement referen
98e0: 63 65 20 6f 62 74 61 69 6e 65 64 20 62 79 20 63  ce obtained by c
98f0: 61 6c 6c 69 6e 67 20 64 62 50 72 65 70 61 72 65  alling dbPrepare
9900: 41 6e 64 42 69 6e 64 28 29 2e 0a 2a 2a 20 54 68  AndBind()..** Th
9910: 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 65 78  ere should be ex
9920: 61 63 74 6c 79 20 6f 6e 65 20 63 61 6c 6c 20 74  actly one call t
9930: 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
9940: 66 6f 72 20 65 61 63 68 20 63 61 6c 6c 20 74 6f  for each call to
9950: 0a 2a 2a 20 64 62 50 72 65 70 61 72 65 41 6e 64  .** dbPrepareAnd
9960: 42 69 6e 64 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  Bind()..**.** If
9970: 20 74 68 65 20 64 69 73 63 61 72 64 20 70 61 72   the discard par
9980: 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65  ameter is non-ze
9990: 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 73 74 61  ro, then the sta
99a0: 74 65 6d 65 6e 74 20 69 73 20 64 65 6c 65 74 65  tement is delete
99b0: 64 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79  d.** immediately
99c0: 2e 20 4f 74 68 65 72 77 69 73 65 20 69 74 20 69  . Otherwise it i
99d0: 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c  s added to the L
99e0: 52 55 20 6c 69 73 74 20 61 6e 64 20 6d 61 79 20  RU list and may 
99f0: 62 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 62  be returned.** b
9a00: 79 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 63  y a subsequent c
9a10: 61 6c 6c 20 74 6f 20 64 62 50 72 65 70 61 72 65  all to dbPrepare
9a20: 41 6e 64 42 69 6e 64 28 29 2e 0a 2a 2f 0a 73 74  AndBind()..*/.st
9a30: 61 74 69 63 20 76 6f 69 64 20 64 62 52 65 6c 65  atic void dbRele
9a40: 61 73 65 53 74 6d 74 28 0a 20 20 53 71 6c 69 74  aseStmt(.  Sqlit
9a50: 65 44 62 20 2a 70 44 62 2c 20 20 20 20 20 20 20  eDb *pDb,       
9a60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
9a70: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
9a80: 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74  .  SqlPreparedSt
9a90: 6d 74 20 2a 70 50 72 65 53 74 6d 74 2c 20 20 20  mt *pPreStmt,   
9aa0: 20 20 20 2f 2a 20 50 72 65 70 61 72 65 64 20 73     /* Prepared s
9ab0: 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20  tatement handle 
9ac0: 74 6f 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  to release */.  
9ad0: 69 6e 74 20 64 69 73 63 61 72 64 20 20 20 20 20  int discard     
9ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9af0: 2f 2a 20 54 72 75 65 20 74 6f 20 64 65 6c 65 74  /* True to delet
9b00: 65 20 28 6e 6f 74 20 63 61 63 68 65 29 20 74 68  e (not cache) th
9b10: 65 20 70 50 72 65 53 74 6d 74 20 2a 2f 0a 29 7b  e pPreStmt */.){
9b20: 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20  .  int i;..  /* 
9b30: 46 72 65 65 20 74 68 65 20 62 6f 75 6e 64 20 73  Free the bound s
9b40: 74 72 69 6e 67 20 61 6e 64 20 62 6c 6f 62 20 70  tring and blob p
9b50: 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 66  arameters */.  f
9b60: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 72 65 53 74  or(i=0; i<pPreSt
9b70: 6d 74 2d 3e 6e 50 61 72 6d 3b 20 69 2b 2b 29 7b  mt->nParm; i++){
9b80: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
9b90: 43 6f 75 6e 74 28 70 50 72 65 53 74 6d 74 2d 3e  Count(pPreStmt->
9ba0: 61 70 50 61 72 6d 5b 69 5d 29 3b 0a 20 20 7d 0a  apParm[i]);.  }.
9bb0: 20 20 70 50 72 65 53 74 6d 74 2d 3e 6e 50 61 72    pPreStmt->nPar
9bc0: 6d 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 44  m = 0;..  if( pD
9bd0: 62 2d 3e 6d 61 78 53 74 6d 74 3c 3d 30 20 7c 7c  b->maxStmt<=0 ||
9be0: 20 64 69 73 63 61 72 64 20 29 7b 0a 20 20 20 20   discard ){.    
9bf0: 2f 2a 20 49 66 20 74 68 65 20 63 61 63 68 65 20  /* If the cache 
9c00: 69 73 20 74 75 72 6e 65 64 20 6f 66 66 2c 20 64  is turned off, d
9c10: 65 61 6c 6c 6f 63 61 74 65 64 20 74 68 65 20 73  eallocated the s
9c20: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
9c30: 64 62 46 72 65 65 53 74 6d 74 28 70 50 72 65 53  dbFreeStmt(pPreS
9c40: 74 6d 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  tmt);.  }else{. 
9c50: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 70 72     /* Add the pr
9c60: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
9c70: 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   to the beginnin
9c80: 67 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 6c  g of the cache l
9c90: 69 73 74 2e 20 2a 2f 0a 20 20 20 20 70 50 72 65  ist. */.    pPre
9ca0: 53 74 6d 74 2d 3e 70 4e 65 78 74 20 3d 20 70 44  Stmt->pNext = pD
9cb0: 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 0a 20 20 20  b->stmtList;.   
9cc0: 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76   pPreStmt->pPrev
9cd0: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 44   = 0;.    if( pD
9ce0: 62 2d 3e 73 74 6d 74 4c 69 73 74 20 29 7b 0a 20  b->stmtList ){. 
9cf0: 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73      pDb->stmtLis
9d00: 74 2d 3e 70 50 72 65 76 20 3d 20 70 50 72 65 53  t->pPrev = pPreS
9d10: 74 6d 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  tmt;.    }.    p
9d20: 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20 70  Db->stmtList = p
9d30: 50 72 65 53 74 6d 74 3b 0a 20 20 20 20 69 66 28  PreStmt;.    if(
9d40: 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 3d 3d   pDb->stmtLast==
9d50: 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
9d60: 74 28 20 70 44 62 2d 3e 6e 53 74 6d 74 3d 3d 30  t( pDb->nStmt==0
9d70: 20 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 73   );.      pDb->s
9d80: 74 6d 74 4c 61 73 74 20 3d 20 70 50 72 65 53 74  tmtLast = pPreSt
9d90: 6d 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  mt;.    }else{. 
9da0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44 62       assert( pDb
9db0: 2d 3e 6e 53 74 6d 74 3e 30 20 29 3b 0a 20 20 20  ->nStmt>0 );.   
9dc0: 20 7d 0a 20 20 20 20 70 44 62 2d 3e 6e 53 74 6d   }.    pDb->nStm
9dd0: 74 2b 2b 3b 0a 20 20 20 0a 20 20 20 20 2f 2a 20  t++;.   .    /* 
9de0: 49 66 20 77 65 20 68 61 76 65 20 74 6f 6f 20 6d  If we have too m
9df0: 61 6e 79 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  any statement in
9e00: 20 63 61 63 68 65 2c 20 72 65 6d 6f 76 65 20 74   cache, remove t
9e10: 68 65 20 73 75 72 70 6c 75 73 20 66 72 6f 6d 20  he surplus from 
9e20: 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 64 20  .    ** the end 
9e30: 6f 66 20 74 68 65 20 63 61 63 68 65 20 6c 69 73  of the cache lis
9e40: 74 2e 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65  t.  */.    while
9e50: 28 20 70 44 62 2d 3e 6e 53 74 6d 74 3e 70 44 62  ( pDb->nStmt>pDb
9e60: 2d 3e 6d 61 78 53 74 6d 74 20 29 7b 0a 20 20 20  ->maxStmt ){.   
9e70: 20 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74     SqlPreparedSt
9e80: 6d 74 20 2a 70 4c 61 73 74 20 3d 20 70 44 62 2d  mt *pLast = pDb-
9e90: 3e 73 74 6d 74 4c 61 73 74 3b 0a 20 20 20 20 20  >stmtLast;.     
9ea0: 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d   pDb->stmtLast =
9eb0: 20 70 4c 61 73 74 2d 3e 70 50 72 65 76 3b 0a 20   pLast->pPrev;. 
9ec0: 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61       pDb->stmtLa
9ed0: 73 74 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  st->pNext = 0;. 
9ee0: 20 20 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74 2d       pDb->nStmt-
9ef0: 2d 3b 0a 20 20 20 20 20 20 64 62 46 72 65 65 53  -;.      dbFreeS
9f00: 74 6d 74 28 70 4c 61 73 74 29 3b 0a 20 20 20 20  tmt(pLast);.    
9f10: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  }.  }.}../*.** S
9f20: 74 72 75 63 74 75 72 65 20 75 73 65 64 20 77 69  tructure used wi
9f30: 74 68 20 64 62 45 76 61 6c 58 58 58 28 29 20 66  th dbEvalXXX() f
9f40: 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20  unctions:.**.** 
9f50: 20 20 64 62 45 76 61 6c 49 6e 69 74 28 29 0a 2a    dbEvalInit().*
9f60: 2a 20 20 20 64 62 45 76 61 6c 53 74 65 70 28 29  *   dbEvalStep()
9f70: 0a 2a 2a 20 20 20 64 62 45 76 61 6c 46 69 6e 61  .**   dbEvalFina
9f80: 6c 69 7a 65 28 29 0a 2a 2a 20 20 20 64 62 45 76  lize().**   dbEv
9f90: 61 6c 52 6f 77 49 6e 66 6f 28 29 0a 2a 2a 20 20  alRowInfo().**  
9fa0: 20 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c   dbEvalColumnVal
9fb0: 75 65 28 29 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ue().*/.typedef 
9fc0: 73 74 72 75 63 74 20 44 62 45 76 61 6c 43 6f 6e  struct DbEvalCon
9fd0: 74 65 78 74 20 44 62 45 76 61 6c 43 6f 6e 74 65  text DbEvalConte
9fe0: 78 74 3b 0a 73 74 72 75 63 74 20 44 62 45 76 61  xt;.struct DbEva
9ff0: 6c 43 6f 6e 74 65 78 74 20 7b 0a 20 20 53 71 6c  lContext {.  Sql
a000: 69 74 65 44 62 20 2a 70 44 62 3b 20 20 20 20 20  iteDb *pDb;     
a010: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a020: 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  Database handle 
a030: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53  */.  Tcl_Obj *pS
a040: 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ql;             
a050: 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 68       /* Object h
a060: 6f 6c 64 69 6e 67 20 73 74 72 69 6e 67 20 7a 53  olding string zS
a070: 71 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ql */.  const ch
a080: 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20  ar *zSql;       
a090: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 61 69          /* Remai
a0a0: 6e 69 6e 67 20 53 51 4c 20 74 6f 20 65 78 65 63  ning SQL to exec
a0b0: 75 74 65 20 2a 2f 0a 20 20 53 71 6c 50 72 65 70  ute */.  SqlPrep
a0c0: 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65 53 74  aredStmt *pPreSt
a0d0: 6d 74 3b 20 20 20 20 20 20 2f 2a 20 43 75 72 72  mt;      /* Curr
a0e0: 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ent statement */
a0f0: 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 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 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
a120: 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64  columns returned
a130: 20 62 79 20 70 53 74 6d 74 20 2a 2f 0a 20 20 54   by pStmt */.  T
a140: 63 6c 5f 4f 62 6a 20 2a 70 41 72 72 61 79 3b 20  cl_Obj *pArray; 
a150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a160: 2a 20 4e 61 6d 65 20 6f 66 20 61 72 72 61 79 20  * Name of array 
a170: 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 54 63  variable */.  Tc
a180: 6c 5f 4f 62 6a 20 2a 2a 61 70 43 6f 6c 4e 61 6d  l_Obj **apColNam
a190: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
a1a0: 20 41 72 72 61 79 20 6f 66 20 63 6f 6c 75 6d 6e   Array of column
a1b0: 20 6e 61 6d 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a   names */.};../*
a1c0: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e 79 20  .** Release any 
a1d0: 63 61 63 68 65 20 6f 66 20 63 6f 6c 75 6d 6e 20  cache of column 
a1e0: 6e 61 6d 65 73 20 63 75 72 72 65 6e 74 6c 79 20  names currently 
a1f0: 68 65 6c 64 20 61 73 20 70 61 72 74 20 6f 66 0a  held as part of.
a200: 2a 2a 20 74 68 65 20 44 62 45 76 61 6c 43 6f 6e  ** the DbEvalCon
a210: 74 65 78 74 20 73 74 72 75 63 74 75 72 65 20 70  text structure p
a220: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
a230: 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  st argument..*/.
a240: 73 74 61 74 69 63 20 76 6f 69 64 20 64 62 52 65  static void dbRe
a250: 6c 65 61 73 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  leaseColumnNames
a260: 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a  (DbEvalContext *
a270: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43  p){.  if( p->apC
a280: 6f 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 69 6e  olName ){.    in
a290: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
a2a0: 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  ; i<p->nCol; i++
a2b0: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63  ){.      Tcl_Dec
a2c0: 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 61 70 43  rRefCount(p->apC
a2d0: 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20  olName[i]);.    
a2e0: 7d 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28  }.    Tcl_Free((
a2f0: 63 68 61 72 20 2a 29 70 2d 3e 61 70 43 6f 6c 4e  char *)p->apColN
a300: 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 61 70 43  ame);.    p->apC
a310: 6f 6c 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a  olName = 0;.  }.
a320: 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 7d    p->nCol = 0;.}
a330: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
a340: 7a 65 20 61 20 44 62 45 76 61 6c 43 6f 6e 74 65  ze a DbEvalConte
a350: 78 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  xt structure..**
a360: 0a 2a 2a 20 49 66 20 70 41 72 72 61 79 20 69 73  .** If pArray is
a370: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
a380: 69 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  it contains the 
a390: 6e 61 6d 65 20 6f 66 20 61 20 54 63 6c 20 61 72  name of a Tcl ar
a3a0: 72 61 79 0a 2a 2a 20 76 61 72 69 61 62 6c 65 2e  ray.** variable.
a3b0: 20 54 68 65 20 22 2a 22 20 6d 65 6d 62 65 72 20   The "*" member 
a3c0: 6f 66 20 74 68 69 73 20 61 72 72 61 79 20 69 73  of this array is
a3d0: 20 73 65 74 20 74 6f 20 61 20 6c 69 73 74 20 63   set to a list c
a3e0: 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 74 68 65  ontaining.** the
a3f0: 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f   names of the co
a400: 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62  lumns returned b
a410: 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  y the statement 
a420: 61 73 20 70 61 72 74 20 6f 66 20 65 61 63 68 0a  as part of each.
a430: 2a 2a 20 63 61 6c 6c 20 74 6f 20 64 62 45 76 61  ** call to dbEva
a440: 6c 53 74 65 70 28 29 2c 20 69 6e 20 6f 72 64 65  lStep(), in orde
a450: 72 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72  r from left to r
a460: 69 67 68 74 2e 20 65 2e 67 2e 20 69 66 20 74 68  ight. e.g. if th
a470: 65 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 74  e names .** of t
a480: 68 65 20 72 65 74 75 72 6e 65 64 20 63 6f 6c 75  he returned colu
a490: 6d 6e 73 20 61 72 65 20 61 2c 20 62 20 61 6e 64  mns are a, b and
a4a0: 20 63 2c 20 69 74 20 64 6f 65 73 20 74 68 65 20   c, it does the 
a4b0: 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 20 74 68  equivalent of th
a4c0: 65 20 0a 2a 2a 20 74 63 6c 20 63 6f 6d 6d 61 6e  e .** tcl comman
a4d0: 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 65 74  d:.**.**     set
a4e0: 20 24 7b 70 41 72 72 61 79 7d 28 2a 29 20 7b 61   ${pArray}(*) {a
a4f0: 20 62 20 63 7d 0a 2a 2f 0a 73 74 61 74 69 63 20   b c}.*/.static 
a500: 76 6f 69 64 20 64 62 45 76 61 6c 49 6e 69 74 28  void dbEvalInit(
a510: 0a 20 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74  .  DbEvalContext
a520: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
a530: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
a540: 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69 6e   structure to in
a550: 69 74 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 53 71  itialize */.  Sq
a560: 6c 69 74 65 44 62 20 2a 70 44 62 2c 20 20 20 20  liteDb *pDb,    
a570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a580: 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   Database handle
a590: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70   */.  Tcl_Obj *p
a5a0: 53 71 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Sql,            
a5b0: 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20        /* Object 
a5c0: 63 6f 6e 74 61 69 6e 69 6e 67 20 53 51 4c 20 73  containing SQL s
a5d0: 63 72 69 70 74 20 2a 2f 0a 20 20 54 63 6c 5f 4f  cript */.  Tcl_O
a5e0: 62 6a 20 2a 70 41 72 72 61 79 20 20 20 20 20 20  bj *pArray      
a5f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
a600: 6d 65 20 6f 66 20 54 63 6c 20 61 72 72 61 79 20  me of Tcl array 
a610: 74 6f 20 73 65 74 20 28 2a 29 20 65 6c 65 6d 65  to set (*) eleme
a620: 6e 74 20 6f 66 20 2a 2f 0a 29 7b 0a 20 20 6d 65  nt of */.){.  me
a630: 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f  mset(p, 0, sizeo
a640: 66 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 29  f(DbEvalContext)
a650: 29 3b 0a 20 20 70 2d 3e 70 44 62 20 3d 20 70 44  );.  p->pDb = pD
a660: 62 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20 3d 20 54  b;.  p->zSql = T
a670: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 70 53 71  cl_GetString(pSq
a680: 6c 29 3b 0a 20 20 70 2d 3e 70 53 71 6c 20 3d 20  l);.  p->pSql = 
a690: 70 53 71 6c 3b 0a 20 20 54 63 6c 5f 49 6e 63 72  pSql;.  Tcl_Incr
a6a0: 52 65 66 43 6f 75 6e 74 28 70 53 71 6c 29 3b 0a  RefCount(pSql);.
a6b0: 20 20 69 66 28 20 70 41 72 72 61 79 20 29 7b 0a    if( pArray ){.
a6c0: 20 20 20 20 70 2d 3e 70 41 72 72 61 79 20 3d 20      p->pArray = 
a6d0: 70 41 72 72 61 79 3b 0a 20 20 20 20 54 63 6c 5f  pArray;.    Tcl_
a6e0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 41 72  IncrRefCount(pAr
a6f0: 72 61 79 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ray);.  }.}../*.
a700: 2a 2a 20 4f 62 74 61 69 6e 20 69 6e 66 6f 72 6d  ** Obtain inform
a710: 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
a720: 72 6f 77 20 74 68 61 74 20 74 68 65 20 44 62 45  row that the DbE
a730: 76 61 6c 43 6f 6e 74 65 78 74 20 70 61 73 73 65  valContext passe
a740: 64 20 61 73 20 74 68 65 0a 2a 2a 20 66 69 72 73  d as the.** firs
a750: 74 20 61 72 67 75 6d 65 6e 74 20 63 75 72 72 65  t argument curre
a760: 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a  ntly points to..
a770: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
a780: 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28 0a 20 20  bEvalRowInfo(.  
a790: 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70  DbEvalContext *p
a7a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
a7b0: 2f 2a 20 45 76 61 6c 75 61 74 69 6f 6e 20 63 6f  /* Evaluation co
a7c0: 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 2a  ntext */.  int *
a7d0: 70 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20  pnCol,          
a7e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
a7f0: 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  T: Number of col
a800: 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 54  umn names */.  T
a810: 63 6c 5f 4f 62 6a 20 2a 2a 2a 70 61 70 43 6f 6c  cl_Obj ***papCol
a820: 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 2f  Name           /
a830: 2a 20 4f 55 54 3a 20 41 72 72 61 79 20 6f 66 20  * OUT: Array of 
a840: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a  column names */.
a850: 29 7b 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  ){.  /* Compute 
a860: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a  column names */.
a870: 20 20 69 66 28 20 30 3d 3d 70 2d 3e 61 70 43 6f    if( 0==p->apCo
a880: 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 71 6c  lName ){.    sql
a890: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
a8a0: 20 3d 20 70 2d 3e 70 50 72 65 53 74 6d 74 2d 3e   = p->pPreStmt->
a8b0: 70 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20 69  pStmt;.    int i
a8c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a8d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
a8e0: 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  ator variable */
a8f0: 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20  .    int nCol;  
a900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a910: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
a920: 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64  columns returned
a930: 20 62 79 20 70 53 74 6d 74 20 2a 2f 0a 20 20 20   by pStmt */.   
a940: 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 43 6f 6c   Tcl_Obj **apCol
a950: 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 2f  Name = 0;      /
a960: 2a 20 41 72 72 61 79 20 6f 66 20 63 6f 6c 75 6d  * Array of colum
a970: 6e 20 6e 61 6d 65 73 20 2a 2f 0a 0a 20 20 20 20  n names */..    
a980: 70 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 20 3d  p->nCol = nCol =
a990: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
a9a0: 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20  count(pStmt);.  
a9b0: 20 20 69 66 28 20 6e 43 6f 6c 3e 30 20 26 26 20    if( nCol>0 && 
a9c0: 28 70 61 70 43 6f 6c 4e 61 6d 65 20 7c 7c 20 70  (papColName || p
a9d0: 2d 3e 70 41 72 72 61 79 29 20 29 7b 0a 20 20 20  ->pArray) ){.   
a9e0: 20 20 20 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 28     apColName = (
a9f0: 54 63 6c 5f 4f 62 6a 2a 2a 29 54 63 6c 5f 41 6c  Tcl_Obj**)Tcl_Al
aa00: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54 63 6c 5f  loc( sizeof(Tcl_
aa10: 4f 62 6a 2a 29 2a 6e 43 6f 6c 20 29 3b 0a 20 20  Obj*)*nCol );.  
aa20: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
aa30: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
aa40: 20 20 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 20     apColName[i] 
aa50: 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
aa60: 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  bj(sqlite3_colum
aa70: 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29 2c  n_name(pStmt,i),
aa80: 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 54 63   -1);.        Tc
aa90: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 61  l_IncrRefCount(a
aaa0: 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20  pColName[i]);.  
aab0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 61      }.      p->a
aac0: 70 43 6f 6c 4e 61 6d 65 20 3d 20 61 70 43 6f 6c  pColName = apCol
aad0: 4e 61 6d 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Name;.    }..   
aae0: 20 2f 2a 20 49 66 20 72 65 73 75 6c 74 73 20 61   /* If results a
aaf0: 72 65 20 62 65 69 6e 67 20 73 74 6f 72 65 64 20  re being stored 
ab00: 69 6e 20 61 6e 20 61 72 72 61 79 20 76 61 72 69  in an array vari
ab10: 61 62 6c 65 2c 20 74 68 65 6e 20 63 72 65 61 74  able, then creat
ab20: 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 61 72 72  e.    ** the arr
ab30: 61 79 28 2a 29 20 65 6e 74 72 79 20 66 6f 72 20  ay(*) entry for 
ab40: 74 68 61 74 20 61 72 72 61 79 0a 20 20 20 20 2a  that array.    *
ab50: 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 41 72  /.    if( p->pAr
ab60: 72 61 79 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  ray ){.      Tcl
ab70: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 20  _Interp *interp 
ab80: 3d 20 70 2d 3e 70 44 62 2d 3e 69 6e 74 65 72 70  = p->pDb->interp
ab90: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20  ;.      Tcl_Obj 
aba0: 2a 70 43 6f 6c 4c 69 73 74 20 3d 20 54 63 6c 5f  *pColList = Tcl_
abb0: 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20 20 20  NewObj();.      
abc0: 54 63 6c 5f 4f 62 6a 20 2a 70 53 74 61 72 20 3d  Tcl_Obj *pStar =
abd0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
abe0: 6a 28 22 2a 22 2c 20 2d 31 29 3b 0a 0a 20 20 20  j("*", -1);..   
abf0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
ac00: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
ac10: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
ac20: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
ac30: 70 2c 20 70 43 6f 6c 4c 69 73 74 2c 20 61 70 43  p, pColList, apC
ac40: 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20  olName[i]);.    
ac50: 20 20 7d 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e    }.      Tcl_In
ac60: 63 72 52 65 66 43 6f 75 6e 74 28 70 53 74 61 72  crRefCount(pStar
ac70: 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a  );.      Tcl_Obj
ac80: 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20  SetVar2(interp, 
ac90: 70 2d 3e 70 41 72 72 61 79 2c 20 70 53 74 61 72  p->pArray, pStar
aca0: 2c 20 70 43 6f 6c 4c 69 73 74 2c 20 30 29 3b 0a  , pColList, 0);.
acb0: 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65        Tcl_DecrRe
acc0: 66 43 6f 75 6e 74 28 70 53 74 61 72 29 3b 0a 20  fCount(pStar);. 
acd0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
ace0: 70 61 70 43 6f 6c 4e 61 6d 65 20 29 7b 0a 20 20  papColName ){.  
acf0: 20 20 2a 70 61 70 43 6f 6c 4e 61 6d 65 20 3d 20    *papColName = 
ad00: 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20  p->apColName;.  
ad10: 7d 0a 20 20 69 66 28 20 70 6e 43 6f 6c 20 29 7b  }.  if( pnCol ){
ad20: 0a 20 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 70 2d  .    *pnCol = p-
ad30: 3e 6e 43 6f 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  >nCol;.  }.}../*
ad40: 0a 2a 2a 20 52 65 74 75 72 6e 20 6f 6e 65 20 6f  .** Return one o
ad50: 66 20 54 43 4c 5f 4f 4b 2c 20 54 43 4c 5f 42 52  f TCL_OK, TCL_BR
ad60: 45 41 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52  EAK or TCL_ERROR
ad70: 2e 20 49 66 20 54 43 4c 5f 45 52 52 4f 52 20 69  . If TCL_ERROR i
ad80: 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2c 20 74  s.** returned, t
ad90: 68 65 6e 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  hen an error mes
ada0: 73 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69  sage is stored i
adb0: 6e 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65  n the interprete
adc0: 72 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75  r before.** retu
add0: 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 20 72  rning..**.** A r
ade0: 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 54  eturn value of T
adf0: 43 4c 5f 4f 4b 20 6d 65 61 6e 73 20 74 68 65 72  CL_OK means ther
ae00: 65 20 69 73 20 61 20 72 6f 77 20 6f 66 20 64 61  e is a row of da
ae10: 74 61 20 61 76 61 69 6c 61 62 6c 65 2e 20 54 68  ta available. Th
ae20: 65 0a 2a 2a 20 64 61 74 61 20 6d 61 79 20 62 65  e.** data may be
ae30: 20 61 63 63 65 73 73 65 64 20 75 73 69 6e 67 20   accessed using 
ae40: 64 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28 29 20  dbEvalRowInfo() 
ae50: 61 6e 64 20 64 62 45 76 61 6c 43 6f 6c 75 6d 6e  and dbEvalColumn
ae60: 56 61 6c 75 65 28 29 2e 20 54 68 69 73 0a 2a 2a  Value(). This.**
ae70: 20 69 73 20 61 6e 61 6c 6f 67 6f 75 73 20 74 6f   is analogous to
ae80: 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c   a return of SQL
ae90: 49 54 45 5f 52 4f 57 20 66 72 6f 6d 20 73 71 6c  ITE_ROW from sql
aea0: 69 74 65 33 5f 73 74 65 70 28 29 2e 20 49 66 20  ite3_step(). If 
aeb0: 54 43 4c 5f 42 52 45 41 4b 0a 2a 2a 20 69 73 20  TCL_BREAK.** is 
aec0: 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 74  returned, then t
aed0: 68 65 20 53 51 4c 20 73 63 72 69 70 74 20 68 61  he SQL script ha
aee0: 73 20 66 69 6e 69 73 68 65 64 20 65 78 65 63 75  s finished execu
aef0: 74 69 6e 67 20 61 6e 64 20 74 68 65 72 65 20 61  ting and there a
af00: 72 65 0a 2a 2a 20 6e 6f 20 66 75 72 74 68 65 72  re.** no further
af10: 20 72 6f 77 73 20 61 76 61 69 6c 61 62 6c 65 2e   rows available.
af20: 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72   This is similar
af30: 20 74 6f 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e   to SQLITE_DONE.
af40: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
af50: 62 45 76 61 6c 53 74 65 70 28 44 62 45 76 61 6c  bEvalStep(DbEval
af60: 43 6f 6e 74 65 78 74 20 2a 70 29 7b 0a 20 20 63  Context *p){.  c
af70: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 72 65 76  onst char *zPrev
af80: 53 71 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  Sql = 0;       /
af90: 2a 20 50 72 65 76 69 6f 75 73 20 76 61 6c 75 65  * Previous value
afa0: 20 6f 66 20 70 2d 3e 7a 53 71 6c 20 2a 2f 0a 0a   of p->zSql */..
afb0: 20 20 77 68 69 6c 65 28 20 70 2d 3e 7a 53 71 6c    while( p->zSql
afc0: 5b 30 5d 20 7c 7c 20 70 2d 3e 70 50 72 65 53 74  [0] || p->pPreSt
afd0: 6d 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  mt ){.    int rc
afe0: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 50 72  ;.    if( p->pPr
aff0: 65 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20  eStmt==0 ){.    
b000: 20 20 7a 50 72 65 76 53 71 6c 20 3d 20 28 70 2d    zPrevSql = (p-
b010: 3e 7a 53 71 6c 3d 3d 7a 50 72 65 76 53 71 6c 20  >zSql==zPrevSql 
b020: 3f 20 30 20 3a 20 70 2d 3e 7a 53 71 6c 29 3b 0a  ? 0 : p->zSql);.
b030: 20 20 20 20 20 20 72 63 20 3d 20 64 62 50 72 65        rc = dbPre
b040: 70 61 72 65 41 6e 64 42 69 6e 64 28 70 2d 3e 70  pareAndBind(p->p
b050: 44 62 2c 20 70 2d 3e 7a 53 71 6c 2c 20 26 70 2d  Db, p->zSql, &p-
b060: 3e 7a 53 71 6c 2c 20 26 70 2d 3e 70 50 72 65 53  >zSql, &p->pPreS
b070: 74 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tmt);.      if( 
b080: 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 20 72 65 74  rc!=TCL_OK ) ret
b090: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 65 6c 73  urn rc;.    }els
b0a0: 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 73  e{.      int rcs
b0b0: 3b 0a 20 20 20 20 20 20 53 71 6c 69 74 65 44 62  ;.      SqliteDb
b0c0: 20 2a 70 44 62 20 3d 20 70 2d 3e 70 44 62 3b 0a   *pDb = p->pDb;.
b0d0: 20 20 20 20 20 20 53 71 6c 50 72 65 70 61 72 65        SqlPrepare
b0e0: 64 53 74 6d 74 20 2a 70 50 72 65 53 74 6d 74 20  dStmt *pPreStmt 
b0f0: 3d 20 70 2d 3e 70 50 72 65 53 74 6d 74 3b 0a 20  = p->pPreStmt;. 
b100: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d       sqlite3_stm
b110: 74 20 2a 70 53 74 6d 74 20 3d 20 70 50 72 65 53  t *pStmt = pPreS
b120: 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a 0a 20 20 20  tmt->pStmt;..   
b130: 20 20 20 72 63 73 20 3d 20 73 71 6c 69 74 65 33     rcs = sqlite3
b140: 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20  _step(pStmt);.  
b150: 20 20 20 20 69 66 28 20 72 63 73 3d 3d 53 51 4c      if( rcs==SQL
b160: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20  ITE_ROW ){.     
b170: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
b180: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b190: 69 66 28 20 70 2d 3e 70 41 72 72 61 79 20 29 7b  if( p->pArray ){
b1a0: 0a 20 20 20 20 20 20 20 20 64 62 45 76 61 6c 52  .        dbEvalR
b1b0: 6f 77 49 6e 66 6f 28 70 2c 20 30 2c 20 30 29 3b  owInfo(p, 0, 0);
b1c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
b1d0: 63 73 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  cs = sqlite3_res
b1e0: 65 74 28 70 53 74 6d 74 29 3b 0a 0a 20 20 20 20  et(pStmt);..    
b1f0: 20 20 70 44 62 2d 3e 6e 53 74 65 70 20 3d 20 73    pDb->nStep = s
b200: 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74  qlite3_stmt_stat
b210: 75 73 28 70 53 74 6d 74 2c 53 51 4c 49 54 45 5f  us(pStmt,SQLITE_
b220: 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53  STMTSTATUS_FULLS
b230: 43 41 4e 5f 53 54 45 50 2c 31 29 3b 0a 20 20 20  CAN_STEP,1);.   
b240: 20 20 20 70 44 62 2d 3e 6e 53 6f 72 74 20 3d 20     pDb->nSort = 
b250: 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61  sqlite3_stmt_sta
b260: 74 75 73 28 70 53 74 6d 74 2c 53 51 4c 49 54 45  tus(pStmt,SQLITE
b270: 5f 53 54 4d 54 53 54 41 54 55 53 5f 53 4f 52 54  _STMTSTATUS_SORT
b280: 2c 31 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e  ,1);.      pDb->
b290: 6e 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  nIndex = sqlite3
b2a0: 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 53 74  _stmt_status(pSt
b2b0: 6d 74 2c 53 51 4c 49 54 45 5f 53 54 4d 54 53 54  mt,SQLITE_STMTST
b2c0: 41 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 2c 31  ATUS_AUTOINDEX,1
b2d0: 29 3b 0a 20 20 20 20 20 20 64 62 52 65 6c 65 61  );.      dbRelea
b2e0: 73 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 29  seColumnNames(p)
b2f0: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 65 53  ;.      p->pPreS
b300: 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  tmt = 0;..      
b310: 69 66 28 20 72 63 73 21 3d 53 51 4c 49 54 45 5f  if( rcs!=SQLITE_
b320: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  OK ){.        /*
b330: 20 49 66 20 61 20 72 75 6e 2d 74 69 6d 65 20 65   If a run-time e
b340: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 70  rror occurs, rep
b350: 6f 72 74 20 74 68 65 20 65 72 72 6f 72 20 61 6e  ort the error an
b360: 64 20 73 74 6f 70 20 72 65 61 64 69 6e 67 0a 20  d stop reading. 
b370: 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51         ** the SQ
b380: 4c 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 64  L.  */.        d
b390: 62 52 65 6c 65 61 73 65 53 74 6d 74 28 70 44 62  bReleaseStmt(pDb
b3a0: 2c 20 70 50 72 65 53 74 6d 74 2c 20 31 29 3b 0a  , pPreStmt, 1);.
b3b0: 23 69 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  #if SQLITE_TEST.
b3c0: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
b3d0: 44 62 2d 3e 62 4c 65 67 61 63 79 50 72 65 70 61  Db->bLegacyPrepa
b3e0: 72 65 20 26 26 20 72 63 73 3d 3d 53 51 4c 49 54  re && rcs==SQLIT
b3f0: 45 5f 53 43 48 45 4d 41 20 26 26 20 7a 50 72 65  E_SCHEMA && zPre
b400: 76 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  vSql ){.        
b410: 20 20 2f 2a 20 49 66 20 74 68 65 20 72 75 6e 74    /* If the runt
b420: 69 6d 65 20 65 72 72 6f 72 20 77 61 73 20 61 6e  ime error was an
b430: 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 2c 20   SQLITE_SCHEMA, 
b440: 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
b450: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61  .          ** ha
b460: 6e 64 6c 65 20 69 73 20 63 6f 6e 66 69 67 75 72  ndle is configur
b470: 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 6c 65  ed to use the le
b480: 67 61 63 79 20 73 71 6c 69 74 65 33 5f 70 72 65  gacy sqlite3_pre
b490: 70 61 72 65 28 29 20 0a 20 20 20 20 20 20 20 20  pare() .        
b4a0: 20 20 2a 2a 20 69 6e 74 65 72 66 61 63 65 2c 20    ** interface, 
b4b0: 72 65 74 72 79 20 70 72 65 70 61 72 65 28 29 2f  retry prepare()/
b4c0: 73 74 65 70 28 29 20 6f 6e 20 74 68 65 20 73 61  step() on the sa
b4d0: 6d 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  me SQL statement
b4e0: 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54  ..          ** T
b4f0: 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73  his only happens
b500: 20 6f 6e 63 65 2e 20 49 66 20 74 68 65 72 65 20   once. If there 
b510: 69 73 20 61 20 73 65 63 6f 6e 64 20 53 51 4c 49  is a second SQLI
b520: 54 45 5f 53 43 48 45 4d 41 0a 20 20 20 20 20 20  TE_SCHEMA.      
b530: 20 20 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68      ** error, th
b540: 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20  e error will be 
b550: 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
b560: 63 61 6c 6c 65 72 2e 20 2a 2f 0a 20 20 20 20 20  caller. */.     
b570: 20 20 20 20 20 70 2d 3e 7a 53 71 6c 20 3d 20 7a       p->zSql = z
b580: 50 72 65 76 53 71 6c 3b 0a 20 20 20 20 20 20 20  PrevSql;.       
b590: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
b5a0: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
b5b0: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a        Tcl_SetObj
b5c0: 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65  Result(pDb->inte
b5d0: 72 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rp,.            
b5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c               Tcl
b5f0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71  _NewStringObj(sq
b600: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
b610: 2d 3e 64 62 29 2c 20 2d 31 29 29 3b 0a 20 20 20  ->db), -1));.   
b620: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
b630: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c  ERROR;.      }el
b640: 73 65 7b 0a 20 20 20 20 20 20 20 20 64 62 52 65  se{.        dbRe
b650: 6c 65 61 73 65 53 74 6d 74 28 70 44 62 2c 20 70  leaseStmt(pDb, p
b660: 50 72 65 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20  PreStmt, 0);.   
b670: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
b680: 20 20 2f 2a 20 46 69 6e 69 73 68 65 64 20 2a 2f    /* Finished */
b690: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 42 52  .  return TCL_BR
b6a0: 45 41 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  EAK;.}../*.** Fr
b6b0: 65 65 20 61 6c 6c 20 72 65 73 6f 75 72 63 65 73  ee all resources
b6c0: 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20   currently held 
b6d0: 62 79 20 74 68 65 20 44 62 45 76 61 6c 43 6f 6e  by the DbEvalCon
b6e0: 74 65 78 74 20 73 74 72 75 63 74 75 72 65 20 70  text structure p
b6f0: 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20  assed.** as the 
b700: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20  first argument. 
b710: 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  There should be 
b720: 65 78 61 63 74 6c 79 20 6f 6e 65 20 63 61 6c 6c  exactly one call
b730: 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
b740: 6e 0a 2a 2a 20 66 6f 72 20 65 61 63 68 20 63 61  n.** for each ca
b750: 6c 6c 20 74 6f 20 64 62 45 76 61 6c 49 6e 69 74  ll to dbEvalInit
b760: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
b770: 69 64 20 64 62 45 76 61 6c 46 69 6e 61 6c 69 7a  id dbEvalFinaliz
b780: 65 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20  e(DbEvalContext 
b790: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 50  *p){.  if( p->pP
b7a0: 72 65 53 74 6d 74 20 29 7b 0a 20 20 20 20 73 71  reStmt ){.    sq
b7b0: 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70  lite3_reset(p->p
b7c0: 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 29 3b  PreStmt->pStmt);
b7d0: 0a 20 20 20 20 64 62 52 65 6c 65 61 73 65 53 74  .    dbReleaseSt
b7e0: 6d 74 28 70 2d 3e 70 44 62 2c 20 70 2d 3e 70 50  mt(p->pDb, p->pP
b7f0: 72 65 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  reStmt, 0);.    
b800: 70 2d 3e 70 50 72 65 53 74 6d 74 20 3d 20 30 3b  p->pPreStmt = 0;
b810: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 41  .  }.  if( p->pA
b820: 72 72 61 79 20 29 7b 0a 20 20 20 20 54 63 6c 5f  rray ){.    Tcl_
b830: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e  DecrRefCount(p->
b840: 70 41 72 72 61 79 29 3b 0a 20 20 20 20 70 2d 3e  pArray);.    p->
b850: 70 41 72 72 61 79 20 3d 20 30 3b 0a 20 20 7d 0a  pArray = 0;.  }.
b860: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
b870: 6e 74 28 70 2d 3e 70 53 71 6c 29 3b 0a 20 20 64  nt(p->pSql);.  d
b880: 62 52 65 6c 65 61 73 65 43 6f 6c 75 6d 6e 4e 61  bReleaseColumnNa
b890: 6d 65 73 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mes(p);.}../*.**
b8a0: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
b8b0: 72 20 74 6f 20 61 20 54 63 6c 5f 4f 62 6a 20 73  r to a Tcl_Obj s
b8c0: 74 72 75 63 74 75 72 65 20 77 69 74 68 20 72 65  tructure with re
b8d0: 66 2d 63 6f 75 6e 74 20 30 20 74 68 61 74 20 63  f-count 0 that c
b8e0: 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 76  ontains.** the v
b8f0: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 69 43 6f  alue for the iCo
b900: 6c 27 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  l'th column of t
b910: 68 65 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79  he row currently
b920: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 0a 2a   pointed to by.*
b930: 2a 20 74 68 65 20 44 62 45 76 61 6c 43 6f 6e 74  * the DbEvalCont
b940: 65 78 74 20 73 74 72 75 63 74 75 72 65 20 70 61  ext structure pa
b950: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
b960: 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  t argument..*/.s
b970: 74 61 74 69 63 20 54 63 6c 5f 4f 62 6a 20 2a 64  tatic Tcl_Obj *d
b980: 62 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65  bEvalColumnValue
b990: 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a  (DbEvalContext *
b9a0: 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20  p, int iCol){.  
b9b0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
b9c0: 74 6d 74 20 3d 20 70 2d 3e 70 50 72 65 53 74 6d  tmt = p->pPreStm
b9d0: 74 2d 3e 70 53 74 6d 74 3b 0a 20 20 73 77 69 74  t->pStmt;.  swit
b9e0: 63 68 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ch( sqlite3_colu
b9f0: 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c 20 69  mn_type(pStmt, i
ba00: 43 6f 6c 29 20 29 7b 0a 20 20 20 20 63 61 73 65  Col) ){.    case
ba10: 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a   SQLITE_BLOB: {.
ba20: 20 20 20 20 20 20 69 6e 74 20 62 79 74 65 73 20        int bytes 
ba30: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
ba40: 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20 69 43  _bytes(pStmt, iC
ba50: 6f 6c 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  ol);.      const
ba60: 20 63 68 61 72 20 2a 7a 42 6c 6f 62 20 3d 20 73   char *zBlob = s
ba70: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c  qlite3_column_bl
ba80: 6f 62 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29 3b  ob(pStmt, iCol);
ba90: 0a 20 20 20 20 20 20 69 66 28 20 21 7a 42 6c 6f  .      if( !zBlo
baa0: 62 20 29 20 62 79 74 65 73 20 3d 20 30 3b 0a 20  b ) bytes = 0;. 
bab0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f       return Tcl_
bac0: 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28  NewByteArrayObj(
bad0: 28 75 38 2a 29 7a 42 6c 6f 62 2c 20 62 79 74 65  (u8*)zBlob, byte
bae0: 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  s);.    }.    ca
baf0: 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  se SQLITE_INTEGE
bb00: 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  R: {.      sqlit
bb10: 65 5f 69 6e 74 36 34 20 76 20 3d 20 73 71 6c 69  e_int64 v = sqli
bb20: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
bb30: 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20  (pStmt, iCol);. 
bb40: 20 20 20 20 20 69 66 28 20 76 3e 3d 2d 32 31 34       if( v>=-214
bb50: 37 34 38 33 36 34 37 20 26 26 20 76 3c 3d 32 31  7483647 && v<=21
bb60: 34 37 34 38 33 36 34 37 20 29 7b 0a 20 20 20 20  47483647 ){.    
bb70: 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e      return Tcl_N
bb80: 65 77 49 6e 74 4f 62 6a 28 28 69 6e 74 29 76 29  ewIntObj((int)v)
bb90: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
bba0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 63         return Tc
bbb0: 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28  l_NewWideIntObj(
bbc0: 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  v);.      }.    
bbd0: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
bbe0: 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20  E_FLOAT: {.     
bbf0: 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 65 77 44   return Tcl_NewD
bc00: 6f 75 62 6c 65 4f 62 6a 28 73 71 6c 69 74 65 33  oubleObj(sqlite3
bc10: 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70  _column_double(p
bc20: 53 74 6d 74 2c 20 69 43 6f 6c 29 29 3b 0a 20 20  Stmt, iCol));.  
bc30: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
bc40: 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  ITE_NULL: {.    
bc50: 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 65 77    return Tcl_New
bc60: 53 74 72 69 6e 67 4f 62 6a 28 70 2d 3e 70 44 62  StringObj(p->pDb
bc70: 2d 3e 7a 4e 75 6c 6c 2c 20 2d 31 29 3b 0a 20 20  ->zNull, -1);.  
bc80: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
bc90: 6e 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  n Tcl_NewStringO
bca0: 62 6a 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65  bj((char*)sqlite
bcb0: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
bcc0: 74 6d 74 2c 20 69 43 6f 6c 29 2c 20 2d 31 29 3b  tmt, iCol), -1);
bcd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 75 73 69  .}../*.** If usi
bce0: 6e 67 20 54 63 6c 20 76 65 72 73 69 6f 6e 20 38  ng Tcl version 8
bcf0: 2e 36 20 6f 72 20 67 72 65 61 74 65 72 2c 20 75  .6 or greater, u
bd00: 73 65 20 74 68 65 20 4e 52 20 66 75 6e 63 74 69  se the NR functi
bd10: 6f 6e 73 20 74 6f 20 61 76 6f 69 64 0a 2a 2a 20  ons to avoid.** 
bd20: 72 65 63 75 72 73 69 76 65 20 65 76 61 6c 75 74  recursive evalut
bd30: 69 6f 6e 20 6f 66 20 73 63 72 69 70 74 73 20 62  ion of scripts b
bd40: 79 20 74 68 65 20 5b 64 62 20 65 76 61 6c 5d 20  y the [db eval] 
bd50: 61 6e 64 20 5b 64 62 20 74 72 61 6e 73 5d 0a 2a  and [db trans].*
bd60: 2a 20 63 6f 6d 6d 61 6e 64 73 2e 20 45 76 65 6e  * commands. Even
bd70: 20 69 66 20 74 68 65 20 68 65 61 64 65 72 73 20   if the headers 
bd80: 75 73 65 64 20 77 68 69 6c 65 20 63 6f 6d 70 69  used while compi
bd90: 6c 69 6e 67 20 74 68 65 20 65 78 74 65 6e 73 69  ling the extensi
bda0: 6f 6e 0a 2a 2a 20 61 72 65 20 38 2e 36 20 6f 72  on.** are 8.6 or
bdb0: 20 6e 65 77 65 72 2c 20 74 68 65 20 63 6f 64 65   newer, the code
bdc0: 20 73 74 69 6c 6c 20 74 65 73 74 73 20 74 68 65   still tests the
bdd0: 20 54 63 6c 20 76 65 72 73 69 6f 6e 20 61 74 20   Tcl version at 
bde0: 72 75 6e 74 69 6d 65 2e 0a 2a 2a 20 54 68 69 73  runtime..** This
bdf0: 20 61 6c 6c 6f 77 73 20 73 74 75 62 73 2d 65 6e   allows stubs-en
be00: 61 62 6c 65 64 20 62 75 69 6c 64 73 20 74 6f 20  abled builds to 
be10: 62 65 20 75 73 65 64 20 77 69 74 68 20 6f 6c 64  be used with old
be20: 65 72 20 54 63 6c 20 6c 69 62 72 61 72 69 65 73  er Tcl libraries
be30: 2e 0a 2a 2f 0a 23 69 66 20 54 43 4c 5f 4d 41 4a  ..*/.#if TCL_MAJ
be40: 4f 52 5f 56 45 52 53 49 4f 4e 3e 38 20 7c 7c 20  OR_VERSION>8 || 
be50: 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49  (TCL_MAJOR_VERSI
be60: 4f 4e 3d 3d 38 20 26 26 20 54 43 4c 5f 4d 49 4e  ON==8 && TCL_MIN
be70: 4f 52 5f 56 45 52 53 49 4f 4e 3e 3d 36 29 0a 23  OR_VERSION>=6).#
be80: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 54   define SQLITE_T
be90: 43 4c 5f 4e 52 45 20 31 0a 73 74 61 74 69 63 20  CL_NRE 1.static 
bea0: 69 6e 74 20 44 62 55 73 65 4e 72 65 28 76 6f 69  int DbUseNre(voi
beb0: 64 29 7b 0a 20 20 69 6e 74 20 6d 61 6a 6f 72 2c  d){.  int major,
bec0: 20 6d 69 6e 6f 72 3b 0a 20 20 54 63 6c 5f 47 65   minor;.  Tcl_Ge
bed0: 74 56 65 72 73 69 6f 6e 28 26 6d 61 6a 6f 72 2c  tVersion(&major,
bee0: 20 26 6d 69 6e 6f 72 2c 20 30 2c 20 30 29 3b 0a   &minor, 0, 0);.
bef0: 20 20 72 65 74 75 72 6e 28 20 28 6d 61 6a 6f 72    return( (major
bf00: 3d 3d 38 20 26 26 20 6d 69 6e 6f 72 3e 3d 36 29  ==8 && minor>=6)
bf10: 20 7c 7c 20 6d 61 6a 6f 72 3e 38 20 29 3b 0a 7d   || major>8 );.}
bf20: 0a 23 65 6c 73 65 0a 2f 2a 20 0a 2a 2a 20 43 6f  .#else./* .** Co
bf30: 6d 70 69 6c 69 6e 67 20 75 73 69 6e 67 20 68 65  mpiling using he
bf40: 61 64 65 72 73 20 65 61 72 6c 69 65 72 20 74 68  aders earlier th
bf50: 61 6e 20 38 2e 36 2e 20 49 6e 20 74 68 69 73 20  an 8.6. In this 
bf60: 63 61 73 65 20 4e 52 20 63 61 6e 6e 6f 74 20 62  case NR cannot b
bf70: 65 0a 2a 2a 20 75 73 65 64 2c 20 73 6f 20 44 62  e.** used, so Db
bf80: 55 73 65 4e 72 65 28 29 20 74 6f 20 61 6c 77 61  UseNre() to alwa
bf90: 79 73 20 72 65 74 75 72 6e 20 7a 65 72 6f 2e 20  ys return zero. 
bfa0: 41 64 64 20 23 64 65 66 69 6e 65 73 20 66 6f 72  Add #defines for
bfb0: 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 54 63   the other.** Tc
bfc0: 6c 5f 4e 52 78 78 78 28 29 20 66 75 6e 63 74 69  l_NRxxx() functi
bfd0: 6f 6e 73 20 74 6f 20 70 72 65 76 65 6e 74 20 74  ons to prevent t
bfe0: 68 65 6d 20 66 72 6f 6d 20 63 61 75 73 69 6e 67  hem from causing
bff0: 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 65 72 72   compilation err
c000: 6f 72 73 2c 0a 2a 2a 20 65 76 65 6e 20 74 68 6f  ors,.** even tho
c010: 75 67 68 20 74 68 65 20 6f 6e 6c 79 20 69 6e 76  ugh the only inv
c020: 6f 63 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 6d  ocations of them
c030: 20 61 72 65 20 77 69 74 68 69 6e 20 63 6f 6e 64   are within cond
c040: 69 74 69 6f 6e 61 6c 20 62 6c 6f 63 6b 73 20 0a  itional blocks .
c050: 2a 2a 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  ** of the form:.
c060: 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 44 62 55 73  **.**   if( DbUs
c070: 65 4e 72 65 28 29 20 29 20 7b 20 2e 2e 2e 20 7d  eNre() ) { ... }
c080: 0a 2a 2f 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  .*/.# define SQL
c090: 49 54 45 5f 54 43 4c 5f 4e 52 45 20 30 0a 23 20  ITE_TCL_NRE 0.# 
c0a0: 64 65 66 69 6e 65 20 44 62 55 73 65 4e 72 65 28  define DbUseNre(
c0b0: 29 20 30 0a 23 20 64 65 66 69 6e 65 20 54 63 6c  ) 0.# define Tcl
c0c0: 5f 4e 52 41 64 64 43 61 6c 6c 62 61 63 6b 28 61  _NRAddCallback(a
c0d0: 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 30 0a 23 20  ,b,c,d,e,f) 0.# 
c0e0: 64 65 66 69 6e 65 20 54 63 6c 5f 4e 52 45 76 61  define Tcl_NREva
c0f0: 6c 4f 62 6a 28 61 2c 62 2c 63 29 20 30 0a 23 20  lObj(a,b,c) 0.# 
c100: 64 65 66 69 6e 65 20 54 63 6c 5f 4e 52 43 72 65  define Tcl_NRCre
c110: 61 74 65 43 6f 6d 6d 61 6e 64 28 61 2c 62 2c 63  ateCommand(a,b,c
c120: 2c 64 2c 65 2c 66 29 20 30 0a 23 65 6e 64 69 66  ,d,e,f) 0.#endif
c130: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
c140: 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66  ction is part of
c150: 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
c160: 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6d 6d 61  ion of the comma
c170: 6e 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 24 64 62 20  nd:.**.**   $db 
c180: 65 76 61 6c 20 53 51 4c 20 3f 41 52 52 41 59 4e  eval SQL ?ARRAYN
c190: 41 4d 45 3f 20 53 43 52 49 50 54 0a 2a 2f 0a 73  AME? SCRIPT.*/.s
c1a0: 74 61 74 69 63 20 69 6e 74 20 44 62 45 76 61 6c  tatic int DbEval
c1b0: 4e 65 78 74 43 6d 64 28 0a 20 20 43 6c 69 65 6e  NextCmd(.  Clien
c1c0: 74 44 61 74 61 20 64 61 74 61 5b 5d 2c 20 20 20  tData data[],   
c1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1e0: 2f 2a 20 64 61 74 61 5b 30 5d 20 69 73 20 74 68  /* data[0] is th
c1f0: 65 20 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74  e (DbEvalContext
c200: 2a 29 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  *) */.  Tcl_Inte
c210: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 20  rp *interp,     
c220: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c230: 54 63 6c 20 69 6e 74 65 72 70 72 65 74 65 72 20  Tcl interpreter 
c240: 2a 2f 0a 20 20 69 6e 74 20 72 65 73 75 6c 74 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 20 2f 2a 20 52 65 73            /* Res
c270: 75 6c 74 20 73 6f 20 66 61 72 20 2a 2f 0a 29 7b  ult so far */.){
c280: 0a 20 20 69 6e 74 20 72 63 20 3d 20 72 65 73 75  .  int rc = resu
c290: 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  lt;             
c2a0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
c2b0: 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20  n code */..  /* 
c2c0: 54 68 65 20 66 69 72 73 74 20 65 6c 65 6d 65 6e  The first elemen
c2d0: 74 20 6f 66 20 74 68 65 20 64 61 74 61 5b 5d 20  t of the data[] 
c2e0: 61 72 72 61 79 20 69 73 20 61 20 70 6f 69 6e 74  array is a point
c2f0: 65 72 20 74 6f 20 61 20 44 62 45 76 61 6c 43 6f  er to a DbEvalCo
c300: 6e 74 65 78 74 0a 20 20 2a 2a 20 73 74 72 75 63  ntext.  ** struc
c310: 74 75 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 75  ture allocated u
c320: 73 69 6e 67 20 54 63 6c 5f 41 6c 6c 6f 63 28 29  sing Tcl_Alloc()
c330: 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 65 6c 65  . The second ele
c340: 6d 65 6e 74 20 6f 66 20 64 61 74 61 5b 5d 0a 20  ment of data[]. 
c350: 20 2a 2a 20 69 73 20 61 20 70 6f 69 6e 74 65 72   ** is a pointer
c360: 20 74 6f 20 61 20 54 63 6c 5f 4f 62 6a 20 63 6f   to a Tcl_Obj co
c370: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 63 72  ntaining the scr
c380: 69 70 74 20 74 6f 20 72 75 6e 20 66 6f 72 20 65  ipt to run for e
c390: 61 63 68 20 72 6f 77 0a 20 20 2a 2a 20 72 65 74  ach row.  ** ret
c3a0: 75 72 6e 65 64 20 62 79 20 74 68 65 20 71 75 65  urned by the que
c3b0: 72 69 65 73 20 65 6e 63 61 70 73 75 6c 61 74 65  ries encapsulate
c3c0: 64 20 69 6e 20 64 61 74 61 5b 30 5d 2e 20 2a 2f  d in data[0]. */
c3d0: 0a 20 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74  .  DbEvalContext
c3e0: 20 2a 70 20 3d 20 28 44 62 45 76 61 6c 43 6f 6e   *p = (DbEvalCon
c3f0: 74 65 78 74 20 2a 29 64 61 74 61 5b 30 5d 3b 0a  text *)data[0];.
c400: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69    Tcl_Obj *pScri
c410: 70 74 20 3d 20 28 54 63 6c 5f 4f 62 6a 20 2a 29  pt = (Tcl_Obj *)
c420: 64 61 74 61 5b 31 5d 3b 0a 20 20 54 63 6c 5f 4f  data[1];.  Tcl_O
c430: 62 6a 20 2a 70 41 72 72 61 79 20 3d 20 70 2d 3e  bj *pArray = p->
c440: 70 41 72 72 61 79 3b 0a 0a 20 20 77 68 69 6c 65  pArray;..  while
c450: 28 20 28 72 63 3d 3d 54 43 4c 5f 4f 4b 20 7c 7c  ( (rc==TCL_OK ||
c460: 20 72 63 3d 3d 54 43 4c 5f 43 4f 4e 54 49 4e 55   rc==TCL_CONTINU
c470: 45 29 20 26 26 20 54 43 4c 5f 4f 4b 3d 3d 28 72  E) && TCL_OK==(r
c480: 63 20 3d 20 64 62 45 76 61 6c 53 74 65 70 28 70  c = dbEvalStep(p
c490: 29 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  )) ){.    int i;
c4a0: 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20  .    int nCol;. 
c4b0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 43     Tcl_Obj **apC
c4c0: 6f 6c 4e 61 6d 65 3b 0a 20 20 20 20 64 62 45 76  olName;.    dbEv
c4d0: 61 6c 52 6f 77 49 6e 66 6f 28 70 2c 20 26 6e 43  alRowInfo(p, &nC
c4e0: 6f 6c 2c 20 26 61 70 43 6f 6c 4e 61 6d 65 29 3b  ol, &apColName);
c4f0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
c500: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
c510: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 20    Tcl_Obj *pVal 
c520: 3d 20 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56 61  = dbEvalColumnVa
c530: 6c 75 65 28 70 2c 20 69 29 3b 0a 20 20 20 20 20  lue(p, i);.     
c540: 20 69 66 28 20 70 41 72 72 61 79 3d 3d 30 20 29   if( pArray==0 )
c550: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62  {.        Tcl_Ob
c560: 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c  jSetVar2(interp,
c570: 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 30   apColName[i], 0
c580: 2c 20 70 56 61 6c 2c 20 30 29 3b 0a 20 20 20 20  , pVal, 0);.    
c590: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
c5a0: 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28   Tcl_ObjSetVar2(
c5b0: 69 6e 74 65 72 70 2c 20 70 41 72 72 61 79 2c 20  interp, pArray, 
c5c0: 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 70 56  apColName[i], pV
c5d0: 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  al, 0);.      }.
c5e0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
c5f0: 65 20 72 65 71 75 69 72 65 64 20 69 6e 74 65 72  e required inter
c600: 70 72 65 74 65 72 20 76 61 72 69 61 62 6c 65 73  preter variables
c610: 20 61 72 65 20 6e 6f 77 20 70 6f 70 75 6c 61 74   are now populat
c620: 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ed with the data
c630: 20 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68   .    ** from th
c640: 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2e 20 49  e current row. I
c650: 66 20 75 73 69 6e 67 20 4e 52 45 2c 20 73 63 68  f using NRE, sch
c660: 65 64 75 6c 65 20 63 61 6c 6c 62 61 63 6b 73 20  edule callbacks 
c670: 74 6f 20 65 76 61 6c 75 61 74 65 0a 20 20 20 20  to evaluate.    
c680: 2a 2a 20 73 63 72 69 70 74 20 70 53 63 72 69 70  ** script pScrip
c690: 74 2c 20 74 68 65 6e 20 74 6f 20 69 6e 76 6f 6b  t, then to invok
c6a0: 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
c6b0: 61 67 61 69 6e 20 74 6f 20 66 65 74 63 68 20 74  again to fetch t
c6c0: 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 72  he next.    ** r
c6d0: 6f 77 20 28 6f 72 20 63 6c 65 61 6e 20 75 70 20  ow (or clean up 
c6e0: 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  if there is no n
c6f0: 65 78 74 20 72 6f 77 20 6f 72 20 74 68 65 20 73  ext row or the s
c700: 63 72 69 70 74 20 74 68 72 6f 77 73 20 61 6e 0a  cript throws an.
c710: 20 20 20 20 2a 2a 20 65 78 63 65 70 74 69 6f 6e      ** exception
c720: 29 2e 20 41 66 74 65 72 20 73 63 68 65 64 75 6c  ). After schedul
c730: 69 6e 67 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  ing the callback
c740: 73 2c 20 72 65 74 75 72 6e 20 63 6f 6e 74 72 6f  s, return contro
c750: 6c 20 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a  l to the .    **
c760: 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 2a 2a 0a   caller..    **.
c770: 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 20 75 73      ** If not us
c780: 69 6e 67 20 4e 52 45 2c 20 65 76 61 6c 75 61 74  ing NRE, evaluat
c790: 65 20 70 53 63 72 69 70 74 20 64 69 72 65 63 74  e pScript direct
c7a0: 6c 79 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65 20  ly and continue 
c7b0: 77 69 74 68 20 74 68 65 0a 20 20 20 20 2a 2a 20  with the.    ** 
c7c0: 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  next iteration o
c7d0: 66 20 74 68 69 73 20 77 68 69 6c 65 28 2e 2e 2e  f this while(...
c7e0: 29 20 6c 6f 6f 70 2e 20 20 2a 2f 0a 20 20 20 20  ) loop.  */.    
c7f0: 69 66 28 20 44 62 55 73 65 4e 72 65 28 29 20 29  if( DbUseNre() )
c800: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 4e 52 41 64  {.      Tcl_NRAd
c810: 64 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70  dCallback(interp
c820: 2c 20 44 62 45 76 61 6c 4e 65 78 74 43 6d 64 2c  , DbEvalNextCmd,
c830: 20 28 76 6f 69 64 2a 29 70 2c 20 28 76 6f 69 64   (void*)p, (void
c840: 2a 29 70 53 63 72 69 70 74 2c 20 30 2c 20 30 29  *)pScript, 0, 0)
c850: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
c860: 63 6c 5f 4e 52 45 76 61 6c 4f 62 6a 28 69 6e 74  cl_NREvalObj(int
c870: 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20 30 29  erp, pScript, 0)
c880: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
c890: 20 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c     rc = Tcl_Eval
c8a0: 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 70 53  ObjEx(interp, pS
c8b0: 63 72 69 70 74 2c 20 30 29 3b 0a 20 20 20 20 7d  cript, 0);.    }
c8c0: 0a 20 20 7d 0a 0a 20 20 54 63 6c 5f 44 65 63 72  .  }..  Tcl_Decr
c8d0: 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74  RefCount(pScript
c8e0: 29 3b 0a 20 20 64 62 45 76 61 6c 46 69 6e 61 6c  );.  dbEvalFinal
c8f0: 69 7a 65 28 70 29 3b 0a 20 20 54 63 6c 5f 46 72  ize(p);.  Tcl_Fr
c900: 65 65 28 28 63 68 61 72 20 2a 29 70 29 3b 0a 0a  ee((char *)p);..
c910: 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b    if( rc==TCL_OK
c920: 20 7c 7c 20 72 63 3d 3d 54 43 4c 5f 42 52 45 41   || rc==TCL_BREA
c930: 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 52 65 73  K ){.    Tcl_Res
c940: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  etResult(interp)
c950: 3b 0a 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f  ;.    rc = TCL_O
c960: 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  K;.  }.  return 
c970: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
c980: 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d 61 6e   "sqlite" comman
c990: 64 20 62 65 6c 6f 77 20 63 72 65 61 74 65 73 20  d below creates 
c9a0: 61 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d 61 6e  a new Tcl comman
c9b0: 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f  d for each.** co
c9c0: 6e 6e 65 63 74 69 6f 6e 20 69 74 20 6f 70 65 6e  nnection it open
c9d0: 73 20 74 6f 20 61 6e 20 53 51 4c 69 74 65 20 64  s to an SQLite d
c9e0: 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 72  atabase.  This r
c9f0: 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65  outine is invoke
ca00: 64 0a 2a 2a 20 77 68 65 6e 65 76 65 72 20 6f 6e  d.** whenever on
ca10: 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65  e of those conne
ca20: 63 74 69 6f 6e 2d 73 70 65 63 69 66 69 63 20 63  ction-specific c
ca30: 6f 6d 6d 61 6e 64 73 20 69 73 20 65 78 65 63 75  ommands is execu
ca40: 74 65 64 0a 2a 2a 20 69 6e 20 54 63 6c 2e 20 20  ted.** in Tcl.  
ca50: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
ca60: 79 6f 75 20 72 75 6e 20 54 63 6c 20 63 6f 64 65  you run Tcl code
ca70: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
ca80: 2a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 20  *       sqlite3 
ca90: 64 62 31 20 20 22 6d 79 5f 64 61 74 61 62 61 73  db1  "my_databas
caa0: 65 22 0a 2a 2a 20 20 20 20 20 20 20 64 62 31 20  e".**       db1 
cab0: 63 6c 6f 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20  close.**.** The 
cac0: 66 69 72 73 74 20 63 6f 6d 6d 61 6e 64 20 6f 70  first command op
cad0: 65 6e 73 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e  ens a connection
cae0: 20 74 6f 20 74 68 65 20 22 6d 79 5f 64 61 74 61   to the "my_data
caf0: 62 61 73 65 22 20 64 61 74 61 62 61 73 65 0a 2a  base" database.*
cb00: 2a 20 61 6e 64 20 63 61 6c 6c 73 20 74 68 61 74  * and calls that
cb10: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 22 64 62 31   connection "db1
cb20: 22 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20 63  ".  The second c
cb30: 6f 6d 6d 61 6e 64 20 63 61 75 73 65 73 20 74 68  ommand causes th
cb40: 69 73 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65  is.** subroutine
cb50: 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 2e 0a   to be invoked..
cb60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62  */.static int Db
cb70: 4f 62 6a 43 6d 64 28 76 6f 69 64 20 2a 63 64 2c  ObjCmd(void *cd,
cb80: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
cb90: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 54 63  erp, int objc,Tc
cba0: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a  l_Obj *const*obj
cbb0: 76 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  v){.  SqliteDb *
cbc0: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a  pDb = (SqliteDb*
cbd0: 29 63 64 3b 0a 20 20 69 6e 74 20 63 68 6f 69 63  )cd;.  int choic
cbe0: 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 54 43  e;.  int rc = TC
cbf0: 4c 5f 4f 4b 3b 0a 20 20 73 74 61 74 69 63 20 63  L_OK;.  static c
cc00: 6f 6e 73 74 20 63 68 61 72 20 2a 44 42 5f 73 74  onst char *DB_st
cc10: 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 61 75  rs[] = {.    "au
cc20: 74 68 6f 72 69 7a 65 72 22 2c 20 20 20 20 20 20  thorizer",      
cc30: 20 20 20 22 62 61 63 6b 75 70 22 2c 20 20 20 20     "backup",    
cc40: 20 20 20 20 20 20 20 20 22 62 75 73 79 22 2c 0a          "busy",.
cc50: 20 20 20 20 22 63 61 63 68 65 22 2c 20 20 20 20      "cache",    
cc60: 20 20 20 20 20 20 20 20 20 20 22 63 68 61 6e 67            "chang
cc70: 65 73 22 2c 20 20 20 20 20 20 20 20 20 20 20 22  es",           "
cc80: 63 6c 6f 73 65 22 2c 0a 20 20 20 20 22 63 6f 6c  close",.    "col
cc90: 6c 61 74 65 22 2c 20 20 20 20 20 20 20 20 20 20  late",          
cca0: 20 20 22 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65    "collation_nee
ccb0: 64 65 64 22 2c 20 20 22 63 6f 6d 6d 69 74 5f 68  ded",  "commit_h
ccc0: 6f 6f 6b 22 2c 0a 20 20 20 20 22 63 6f 6d 70 6c  ook",.    "compl
ccd0: 65 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ete",           
cce0: 22 63 6f 70 79 22 2c 20 20 20 20 20 20 20 20 20  "copy",         
ccf0: 20 20 20 20 20 22 65 6e 61 62 6c 65 5f 6c 6f 61       "enable_loa
cd00: 64 5f 65 78 74 65 6e 73 69 6f 6e 22 2c 0a 20 20  d_extension",.  
cd10: 20 20 22 65 72 72 6f 72 63 6f 64 65 22 2c 20 20    "errorcode",  
cd20: 20 20 20 20 20 20 20 20 22 65 76 61 6c 22 2c 20          "eval", 
cd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 65 78               "ex
cd40: 69 73 74 73 22 2c 0a 20 20 20 20 22 66 75 6e 63  ists",.    "func
cd50: 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 20 20  tion",          
cd60: 20 22 69 6e 63 72 62 6c 6f 62 22 2c 20 20 20 20   "incrblob",    
cd70: 20 20 20 20 20 20 22 69 6e 74 65 72 72 75 70 74        "interrupt
cd80: 22 2c 0a 20 20 20 20 22 6c 61 73 74 5f 69 6e 73  ",.    "last_ins
cd90: 65 72 74 5f 72 6f 77 69 64 22 2c 20 20 22 6e 75  ert_rowid",  "nu
cda0: 6c 6c 76 61 6c 75 65 22 2c 20 20 20 20 20 20 20  llvalue",       
cdb0: 20 20 22 6f 6e 65 63 6f 6c 75 6d 6e 22 2c 0a 20    "onecolumn",. 
cdc0: 20 20 20 22 70 72 6f 66 69 6c 65 22 2c 20 20 20     "profile",   
cdd0: 20 20 20 20 20 20 20 20 20 22 70 72 6f 67 72 65           "progre
cde0: 73 73 22 2c 20 20 20 20 20 20 20 20 20 20 22 72  ss",          "r
cdf0: 65 6b 65 79 22 2c 0a 20 20 20 20 22 72 65 73 74  ekey",.    "rest
ce00: 6f 72 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ore",           
ce10: 20 22 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 22   "rollback_hook"
ce20: 2c 20 20 20 20 20 22 73 74 61 74 75 73 22 2c 0a  ,     "status",.
ce30: 20 20 20 20 22 74 69 6d 65 6f 75 74 22 2c 20 20      "timeout",  
ce40: 20 20 20 20 20 20 20 20 20 20 22 74 6f 74 61 6c            "total
ce50: 5f 63 68 61 6e 67 65 73 22 2c 20 20 20 20 20 22  _changes",     "
ce60: 74 72 61 63 65 22 2c 0a 20 20 20 20 22 74 72 61  trace",.    "tra
ce70: 6e 73 61 63 74 69 6f 6e 22 2c 20 20 20 20 20 20  nsaction",      
ce80: 20 20 22 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79    "unlock_notify
ce90: 22 2c 20 20 20 20 20 22 75 70 64 61 74 65 5f 68  ",     "update_h
cea0: 6f 6f 6b 22 2c 0a 20 20 20 20 22 76 65 72 73 69  ook",.    "versi
ceb0: 6f 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  on",            
cec0: 22 77 61 6c 5f 68 6f 6f 6b 22 2c 20 20 20 20 20  "wal_hook",     
ced0: 20 20 20 20 20 30 0a 20 20 7d 3b 0a 20 20 65 6e       0.  };.  en
cee0: 75 6d 20 44 42 5f 65 6e 75 6d 20 7b 0a 20 20 20  um DB_enum {.   
cef0: 20 44 42 5f 41 55 54 48 4f 52 49 5a 45 52 2c 20   DB_AUTHORIZER, 
cf00: 20 20 20 20 20 20 20 44 42 5f 42 41 43 4b 55 50         DB_BACKUP
cf10: 2c 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 42  ,           DB_B
cf20: 55 53 59 2c 0a 20 20 20 20 44 42 5f 43 41 43 48  USY,.    DB_CACH
cf30: 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 44  E,             D
cf40: 42 5f 43 48 41 4e 47 45 53 2c 20 20 20 20 20 20  B_CHANGES,      
cf50: 20 20 20 20 44 42 5f 43 4c 4f 53 45 2c 0a 20 20      DB_CLOSE,.  
cf60: 20 20 44 42 5f 43 4f 4c 4c 41 54 45 2c 20 20 20    DB_COLLATE,   
cf70: 20 20 20 20 20 20 20 20 44 42 5f 43 4f 4c 4c 41          DB_COLLA
cf80: 54 49 4f 4e 5f 4e 45 45 44 45 44 2c 20 44 42 5f  TION_NEEDED, DB_
cf90: 43 4f 4d 4d 49 54 5f 48 4f 4f 4b 2c 0a 20 20 20  COMMIT_HOOK,.   
cfa0: 20 44 42 5f 43 4f 4d 50 4c 45 54 45 2c 20 20 20   DB_COMPLETE,   
cfb0: 20 20 20 20 20 20 20 44 42 5f 43 4f 50 59 2c 20         DB_COPY, 
cfc0: 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 45              DB_E
cfd0: 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e  NABLE_LOAD_EXTEN
cfe0: 53 49 4f 4e 2c 0a 20 20 20 20 44 42 5f 45 52 52  SION,.    DB_ERR
cff0: 4f 52 43 4f 44 45 2c 20 20 20 20 20 20 20 20 20  ORCODE,         
d000: 44 42 5f 45 56 41 4c 2c 20 20 20 20 20 20 20 20  DB_EVAL,        
d010: 20 20 20 20 20 44 42 5f 45 58 49 53 54 53 2c 0a       DB_EXISTS,.
d020: 20 20 20 20 44 42 5f 46 55 4e 43 54 49 4f 4e 2c      DB_FUNCTION,
d030: 20 20 20 20 20 20 20 20 20 20 44 42 5f 49 4e 43            DB_INC
d040: 52 42 4c 4f 42 2c 20 20 20 20 20 20 20 20 20 44  RBLOB,         D
d050: 42 5f 49 4e 54 45 52 52 55 50 54 2c 0a 20 20 20  B_INTERRUPT,.   
d060: 20 44 42 5f 4c 41 53 54 5f 49 4e 53 45 52 54 5f   DB_LAST_INSERT_
d070: 52 4f 57 49 44 2c 20 44 42 5f 4e 55 4c 4c 56 41  ROWID, DB_NULLVA
d080: 4c 55 45 2c 20 20 20 20 20 20 20 20 44 42 5f 4f  LUE,        DB_O
d090: 4e 45 43 4f 4c 55 4d 4e 2c 0a 20 20 20 20 44 42  NECOLUMN,.    DB
d0a0: 5f 50 52 4f 46 49 4c 45 2c 20 20 20 20 20 20 20  _PROFILE,       
d0b0: 20 20 20 20 44 42 5f 50 52 4f 47 52 45 53 53 2c      DB_PROGRESS,
d0c0: 20 20 20 20 20 20 20 20 20 44 42 5f 52 45 4b 45           DB_REKE
d0d0: 59 2c 0a 20 20 20 20 44 42 5f 52 45 53 54 4f 52  Y,.    DB_RESTOR
d0e0: 45 2c 20 20 20 20 20 20 20 20 20 20 20 44 42 5f  E,           DB_
d0f0: 52 4f 4c 4c 42 41 43 4b 5f 48 4f 4f 4b 2c 20 20  ROLLBACK_HOOK,  
d100: 20 20 44 42 5f 53 54 41 54 55 53 2c 0a 20 20 20    DB_STATUS,.   
d110: 20 44 42 5f 54 49 4d 45 4f 55 54 2c 20 20 20 20   DB_TIMEOUT,    
d120: 20 20 20 20 20 20 20 44 42 5f 54 4f 54 41 4c 5f         DB_TOTAL_
d130: 43 48 41 4e 47 45 53 2c 20 20 20 20 44 42 5f 54  CHANGES,    DB_T
d140: 52 41 43 45 2c 0a 20 20 20 20 44 42 5f 54 52 41  RACE,.    DB_TRA
d150: 4e 53 41 43 54 49 4f 4e 2c 20 20 20 20 20 20 20  NSACTION,       
d160: 44 42 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59  DB_UNLOCK_NOTIFY
d170: 2c 20 20 20 20 44 42 5f 55 50 44 41 54 45 5f 48  ,    DB_UPDATE_H
d180: 4f 4f 4b 2c 0a 20 20 20 20 44 42 5f 56 45 52 53  OOK,.    DB_VERS
d190: 49 4f 4e 2c 20 20 20 20 20 20 20 20 20 20 20 44  ION,           D
d1a0: 42 5f 57 41 4c 5f 48 4f 4f 4b 0a 20 20 7d 3b 0a  B_WAL_HOOK.  };.
d1b0: 20 20 2f 2a 20 64 6f 6e 27 74 20 6c 65 61 76 65    /* don't leave
d1c0: 20 74 72 61 69 6c 69 6e 67 20 63 6f 6d 6d 61 73   trailing commas
d1d0: 20 6f 6e 20 44 42 5f 65 6e 75 6d 2c 20 69 74 20   on DB_enum, it 
d1e0: 63 6f 6e 66 75 73 65 73 20 74 68 65 20 41 49 58  confuses the AIX
d1f0: 20 78 6c 63 20 63 6f 6d 70 69 6c 65 72 20 2a 2f   xlc compiler */
d200: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3c 32 20 29  ..  if( objc<2 )
d210: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
d220: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
d230: 2c 20 6f 62 6a 76 2c 20 22 53 55 42 43 4f 4d 4d  , objv, "SUBCOMM
d240: 41 4e 44 20 2e 2e 2e 22 29 3b 0a 20 20 20 20 72  AND ...");.    r
d250: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
d260: 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47  .  }.  if( Tcl_G
d270: 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69  etIndexFromObj(i
d280: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20  nterp, objv[1], 
d290: 44 42 5f 73 74 72 73 2c 20 22 6f 70 74 69 6f 6e  DB_strs, "option
d2a0: 22 2c 20 30 2c 20 26 63 68 6f 69 63 65 29 20 29  ", 0, &choice) )
d2b0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
d2c0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 73  _ERROR;.  }..  s
d2d0: 77 69 74 63 68 28 20 28 65 6e 75 6d 20 44 42 5f  witch( (enum DB_
d2e0: 65 6e 75 6d 29 63 68 6f 69 63 65 20 29 7b 0a 0a  enum)choice ){..
d2f0: 20 20 2f 2a 20 20 20 20 24 64 62 20 61 75 74 68    /*    $db auth
d300: 6f 72 69 7a 65 72 20 3f 43 41 4c 4c 42 41 43 4b  orizer ?CALLBACK
d310: 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f  ?.  **.  ** Invo
d320: 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c  ke the given cal
d330: 6c 62 61 63 6b 20 74 6f 20 61 75 74 68 6f 72 69  lback to authori
d340: 7a 65 20 65 61 63 68 20 53 51 4c 20 6f 70 65 72  ze each SQL oper
d350: 61 74 69 6f 6e 20 61 73 20 69 74 20 69 73 0a 20  ation as it is. 
d360: 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 2e 20 20 35   ** compiled.  5
d370: 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 61   arguments are a
d380: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 63  ppended to the c
d390: 61 6c 6c 62 61 63 6b 20 62 65 66 6f 72 65 20 69  allback before i
d3a0: 74 20 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6b 65  t is.  ** invoke
d3b0: 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28  d:.  **.  **   (
d3c0: 31 29 20 54 68 65 20 61 75 74 68 6f 72 69 7a 61  1) The authoriza
d3d0: 74 69 6f 6e 20 74 79 70 65 20 28 65 78 3a 20 53  tion type (ex: S
d3e0: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42  QLITE_CREATE_TAB
d3f0: 4c 45 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52  LE, SQLITE_INSER
d400: 54 2c 20 2e 2e 2e 29 0a 20 20 2a 2a 20 20 20 28  T, ...).  **   (
d410: 32 29 20 46 69 72 73 74 20 64 65 73 63 72 69 70  2) First descrip
d420: 74 69 76 65 20 6e 61 6d 65 20 28 64 65 70 65 6e  tive name (depen
d430: 64 73 20 6f 6e 20 61 75 74 68 6f 72 69 7a 61 74  ds on authorizat
d440: 69 6f 6e 20 74 79 70 65 29 0a 20 20 2a 2a 20 20  ion type).  **  
d450: 20 28 33 29 20 53 65 63 6f 6e 64 20 64 65 73 63   (3) Second desc
d460: 72 69 70 74 69 76 65 20 6e 61 6d 65 0a 20 20 2a  riptive name.  *
d470: 2a 20 20 20 28 34 29 20 4e 61 6d 65 20 6f 66 20  *   (4) Name of 
d480: 74 68 65 20 64 61 74 61 62 61 73 65 20 28 65 78  the database (ex
d490: 3a 20 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22  : "main", "temp"
d4a0: 29 0a 20 20 2a 2a 20 20 20 28 35 29 20 4e 61 6d  ).  **   (5) Nam
d4b0: 65 20 6f 66 20 74 72 69 67 67 65 72 20 74 68 61  e of trigger tha
d4c0: 74 20 69 73 20 64 6f 69 6e 67 20 74 68 65 20 61  t is doing the a
d4d0: 63 63 65 73 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ccess.  **.  ** 
d4e0: 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 73 68 6f  The callback sho
d4f0: 75 6c 64 20 72 65 74 75 72 6e 20 6f 6e 20 6f 66  uld return on of
d500: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
d510: 74 72 69 6e 67 73 3a 20 53 51 4c 49 54 45 5f 4f  trings: SQLITE_O
d520: 4b 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 49  K,.  ** SQLITE_I
d530: 47 4e 4f 52 45 2c 20 6f 72 20 53 51 4c 49 54 45  GNORE, or SQLITE
d540: 5f 44 45 4e 59 2e 20 20 41 6e 79 20 6f 74 68 65  _DENY.  Any othe
d550: 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  r return value i
d560: 73 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2a  s an error..  **
d570: 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 6d 65  .  ** If this me
d580: 74 68 6f 64 20 69 73 20 69 6e 76 6f 6b 65 64 20  thod is invoked 
d590: 77 69 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74  with no argument
d5a0: 73 2c 20 74 68 65 20 63 75 72 72 65 6e 74 20 61  s, the current a
d5b0: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 0a 20 20 2a  uthorization.  *
d5c0: 2a 20 63 61 6c 6c 62 61 63 6b 20 73 74 72 69 6e  * callback strin
d5d0: 67 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 20  g is returned.. 
d5e0: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 41 55   */.  case DB_AU
d5f0: 54 48 4f 52 49 5a 45 52 3a 20 7b 0a 23 69 66 64  THORIZER: {.#ifd
d600: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
d610: 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20  UTHORIZATION.   
d620: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
d630: 74 28 69 6e 74 65 72 70 2c 20 22 61 75 74 68 6f  t(interp, "autho
d640: 72 69 7a 61 74 69 6f 6e 20 6e 6f 74 20 61 76 61  rization not ava
d650: 69 6c 61 62 6c 65 20 69 6e 20 74 68 69 73 20 62  ilable in this b
d660: 75 69 6c 64 22 2c 20 30 29 3b 0a 20 20 20 20 72  uild", 0);.    r
d670: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
d680: 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 6f  .#else.    if( o
d690: 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54  bjc>3 ){.      T
d6a0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
d6b0: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
d6c0: 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a   "?CALLBACK?");.
d6d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
d6e0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73  _ERROR;.    }els
d6f0: 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b  e if( objc==2 ){
d700: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
d710: 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 20 20 20  zAuth ){.       
d720: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
d730: 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a  t(interp, pDb->z
d740: 41 75 74 68 2c 20 30 29 3b 0a 20 20 20 20 20 20  Auth, 0);.      
d750: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
d760: 20 20 20 63 68 61 72 20 2a 7a 41 75 74 68 3b 0a     char *zAuth;.
d770: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20        int len;. 
d780: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 41       if( pDb->zA
d790: 75 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 54  uth ){.        T
d7a0: 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 41 75  cl_Free(pDb->zAu
d7b0: 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  th);.      }.   
d7c0: 20 20 20 7a 41 75 74 68 20 3d 20 54 63 6c 5f 47     zAuth = Tcl_G
d7d0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
d7e0: 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a  objv[2], &len);.
d7f0: 20 20 20 20 20 20 69 66 28 20 7a 41 75 74 68 20        if( zAuth 
d800: 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20  && len>0 ){.    
d810: 20 20 20 20 70 44 62 2d 3e 7a 41 75 74 68 20 3d      pDb->zAuth =
d820: 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20   Tcl_Alloc( len 
d830: 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d  + 1 );.        m
d840: 65 6d 63 70 79 28 70 44 62 2d 3e 7a 41 75 74 68  emcpy(pDb->zAuth
d850: 2c 20 7a 41 75 74 68 2c 20 6c 65 6e 2b 31 29 3b  , zAuth, len+1);
d860: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
d870: 20 20 20 20 20 20 70 44 62 2d 3e 7a 41 75 74 68        pDb->zAuth
d880: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
d890: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75      if( pDb->zAu
d8a0: 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  th ){.        pD
d8b0: 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65  b->interp = inte
d8c0: 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  rp;.        sqli
d8d0: 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a  te3_set_authoriz
d8e0: 65 72 28 70 44 62 2d 3e 64 62 2c 20 61 75 74 68  er(pDb->db, auth
d8f0: 5f 63 61 6c 6c 62 61 63 6b 2c 20 70 44 62 29 3b  _callback, pDb);
d900: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
d910: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65        sqlite3_se
d920: 74 5f 61 75 74 68 6f 72 69 7a 65 72 28 70 44 62  t_authorizer(pDb
d930: 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ->db, 0, 0);.   
d940: 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
d950: 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  f.    break;.  }
d960: 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 62 61  ..  /*    $db ba
d970: 63 6b 75 70 20 3f 44 41 54 41 42 41 53 45 3f 20  ckup ?DATABASE? 
d980: 46 49 4c 45 4e 41 4d 45 0a 20 20 2a 2a 0a 20 20  FILENAME.  **.  
d990: 2a 2a 20 4f 70 65 6e 20 6f 72 20 63 72 65 61 74  ** Open or creat
d9a0: 65 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  e a database fil
d9b0: 65 20 6e 61 6d 65 64 20 46 49 4c 45 4e 41 4d 45  e named FILENAME
d9c0: 2e 20 20 54 72 61 6e 73 66 65 72 20 74 68 65 0a  .  Transfer the.
d9d0: 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20    ** content of 
d9e0: 6c 6f 63 61 6c 20 64 61 74 61 62 61 73 65 20 44  local database D
d9f0: 41 54 41 42 41 53 45 20 28 64 65 66 61 75 6c 74  ATABASE (default
da00: 3a 20 22 6d 61 69 6e 22 29 20 69 6e 74 6f 20 74  : "main") into t
da10: 68 65 0a 20 20 2a 2a 20 46 49 4c 45 4e 41 4d 45  he.  ** FILENAME
da20: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
da30: 20 20 63 61 73 65 20 44 42 5f 42 41 43 4b 55 50    case DB_BACKUP
da40: 3a 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  : {.    const ch
da50: 61 72 20 2a 7a 44 65 73 74 46 69 6c 65 3b 0a 20  ar *zDestFile;. 
da60: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
da70: 53 72 63 44 62 3b 0a 20 20 20 20 73 71 6c 69 74  SrcDb;.    sqlit
da80: 65 33 20 2a 70 44 65 73 74 3b 0a 20 20 20 20 73  e3 *pDest;.    s
da90: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 70  qlite3_backup *p
daa0: 42 61 63 6b 75 70 3b 0a 0a 20 20 20 20 69 66 28  Backup;..    if(
dab0: 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20   objc==3 ){.    
dac0: 20 20 7a 53 72 63 44 62 20 3d 20 22 6d 61 69 6e    zSrcDb = "main
dad0: 22 3b 0a 20 20 20 20 20 20 7a 44 65 73 74 46 69  ";.      zDestFi
dae0: 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  le = Tcl_GetStri
daf0: 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20  ng(objv[2]);.   
db00: 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d   }else if( objc=
db10: 3d 34 20 29 7b 0a 20 20 20 20 20 20 7a 53 72 63  =4 ){.      zSrc
db20: 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  Db = Tcl_GetStri
db30: 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20  ng(objv[2]);.   
db40: 20 20 20 7a 44 65 73 74 46 69 6c 65 20 3d 20 54     zDestFile = T
db50: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
db60: 76 5b 33 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  v[3]);.    }else
db70: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
db80: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
db90: 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 44 41 54 41   2, objv, "?DATA
dba0: 42 41 53 45 3f 20 46 49 4c 45 4e 41 4d 45 22 29  BASE? FILENAME")
dbb0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
dbc0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
dbd0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
dbe0: 5f 6f 70 65 6e 28 7a 44 65 73 74 46 69 6c 65 2c  _open(zDestFile,
dbf0: 20 26 70 44 65 73 74 29 3b 0a 20 20 20 20 69 66   &pDest);.    if
dc00: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
dc10: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
dc20: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
dc30: 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74  , "cannot open t
dc40: 61 72 67 65 74 20 64 61 74 61 62 61 73 65 3a 20  arget database: 
dc50: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71  ",.           sq
dc60: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 65  lite3_errmsg(pDe
dc70: 73 74 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  st), (char*)0);.
dc80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c        sqlite3_cl
dc90: 6f 73 65 28 70 44 65 73 74 29 3b 0a 20 20 20 20  ose(pDest);.    
dca0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
dcb0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  OR;.    }.    pB
dcc0: 61 63 6b 75 70 20 3d 20 73 71 6c 69 74 65 33 5f  ackup = sqlite3_
dcd0: 62 61 63 6b 75 70 5f 69 6e 69 74 28 70 44 65 73  backup_init(pDes
dce0: 74 2c 20 22 6d 61 69 6e 22 2c 20 70 44 62 2d 3e  t, "main", pDb->
dcf0: 64 62 2c 20 7a 53 72 63 44 62 29 3b 0a 20 20 20  db, zSrcDb);.   
dd00: 20 69 66 28 20 70 42 61 63 6b 75 70 3d 3d 30 20   if( pBackup==0 
dd10: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
dd20: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
dd30: 2c 20 22 62 61 63 6b 75 70 20 66 61 69 6c 65 64  , "backup failed
dd40: 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  : ",.           
dd50: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
dd60: 44 65 73 74 29 2c 20 28 63 68 61 72 2a 29 30 29  Dest), (char*)0)
dd70: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
dd80: 63 6c 6f 73 65 28 70 44 65 73 74 29 3b 0a 20 20  close(pDest);.  
dd90: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
dda0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
ddb0: 77 68 69 6c 65 28 20 20 28 72 63 20 3d 20 73 71  while(  (rc = sq
ddc0: 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 73 74 65  lite3_backup_ste
ddd0: 70 28 70 42 61 63 6b 75 70 2c 31 30 30 29 29 3d  p(pBackup,100))=
dde0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 7d 0a 20  =SQLITE_OK ){}. 
ddf0: 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75     sqlite3_backu
de00: 70 5f 66 69 6e 69 73 68 28 70 42 61 63 6b 75 70  p_finish(pBackup
de10: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
de20: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
de30: 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b      rc = TCL_OK;
de40: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
de50: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
de60: 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 63 6b  lt(interp, "back
de70: 75 70 20 66 61 69 6c 65 64 3a 20 22 2c 0a 20 20  up failed: ",.  
de80: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
de90: 5f 65 72 72 6d 73 67 28 70 44 65 73 74 29 2c 20  _errmsg(pDest), 
dea0: 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
deb0: 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b   rc = TCL_ERROR;
dec0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
ded0: 65 33 5f 63 6c 6f 73 65 28 70 44 65 73 74 29 3b  e3_close(pDest);
dee0: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
def0: 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 62 75 73  .  /*    $db bus
df00: 79 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a  y ?CALLBACK?.  *
df10: 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  *.  ** Invoke th
df20: 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b  e given callback
df30: 20 69 66 20 61 6e 20 53 51 4c 20 73 74 61 74 65   if an SQL state
df40: 6d 65 6e 74 20 61 74 74 65 6d 70 74 73 20 74 6f  ment attempts to
df50: 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 6c 6f 63   open.  ** a loc
df60: 6b 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  ked database fil
df70: 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  e..  */.  case D
df80: 42 5f 42 55 53 59 3a 20 7b 0a 20 20 20 20 69 66  B_BUSY: {.    if
df90: 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20  ( objc>3 ){.    
dfa0: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
dfb0: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
dfc0: 6a 76 2c 20 22 43 41 4c 4c 42 41 43 4b 22 29 3b  jv, "CALLBACK");
dfd0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
dfe0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c  L_ERROR;.    }el
dff0: 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29  se if( objc==2 )
e000: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  {.      if( pDb-
e010: 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 20 20  >zBusy ){.      
e020: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
e030: 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e  lt(interp, pDb->
e040: 7a 42 75 73 79 2c 20 30 29 3b 0a 20 20 20 20 20  zBusy, 0);.     
e050: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
e060: 20 20 20 20 63 68 61 72 20 2a 7a 42 75 73 79 3b      char *zBusy;
e070: 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  .      int len;.
e080: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
e090: 42 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Busy ){.        
e0a0: 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 42  Tcl_Free(pDb->zB
e0b0: 75 73 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  usy);.      }.  
e0c0: 20 20 20 20 7a 42 75 73 79 20 3d 20 54 63 6c 5f      zBusy = Tcl_
e0d0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
e0e0: 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b  (objv[2], &len);
e0f0: 0a 20 20 20 20 20 20 69 66 28 20 7a 42 75 73 79  .      if( zBusy
e100: 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20   && len>0 ){.   
e110: 20 20 20 20 20 70 44 62 2d 3e 7a 42 75 73 79 20       pDb->zBusy 
e120: 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e  = Tcl_Alloc( len
e130: 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20   + 1 );.        
e140: 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 42 75 73  memcpy(pDb->zBus
e150: 79 2c 20 7a 42 75 73 79 2c 20 6c 65 6e 2b 31 29  y, zBusy, len+1)
e160: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
e170: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 42 75 73         pDb->zBus
e180: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  y = 0;.      }. 
e190: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 42       if( pDb->zB
e1a0: 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70  usy ){.        p
e1b0: 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74  Db->interp = int
e1c0: 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  erp;.        sql
e1d0: 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65  ite3_busy_handle
e1e0: 72 28 70 44 62 2d 3e 64 62 2c 20 44 62 42 75 73  r(pDb->db, DbBus
e1f0: 79 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a  yHandler, pDb);.
e200: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e210: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73       sqlite3_bus
e220: 79 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64  y_handler(pDb->d
e230: 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  b, 0, 0);.      
e240: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  }.    }.    brea
e250: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
e260: 20 24 64 62 20 63 61 63 68 65 20 66 6c 75 73 68   $db cache flush
e270: 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63 61  .  **     $db ca
e280: 63 68 65 20 73 69 7a 65 20 6e 0a 20 20 2a 2a 0a  che size n.  **.
e290: 20 20 2a 2a 20 46 6c 75 73 68 20 74 68 65 20 70    ** Flush the p
e2a0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
e2b0: 74 20 63 61 63 68 65 2c 20 6f 72 20 73 65 74 20  t cache, or set 
e2c0: 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
e2d0: 65 72 20 6f 66 0a 20 20 2a 2a 20 63 61 63 68 65  er of.  ** cache
e2e0: 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20  d statements..  
e2f0: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 41 43  */.  case DB_CAC
e300: 48 45 3a 20 7b 0a 20 20 20 20 63 68 61 72 20 2a  HE: {.    char *
e310: 73 75 62 43 6d 64 3b 0a 20 20 20 20 69 6e 74 20  subCmd;.    int 
e320: 6e 3b 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  n;..    if( objc
e330: 3c 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  <=2 ){.      Tcl
e340: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
e350: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
e360: 63 61 63 68 65 20 6f 70 74 69 6f 6e 20 3f 61 72  cache option ?ar
e370: 67 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  g?");.      retu
e380: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
e390: 20 20 7d 0a 20 20 20 20 73 75 62 43 6d 64 20 3d    }.    subCmd =
e3a0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
e3b0: 6f 6d 4f 62 6a 28 20 6f 62 6a 76 5b 32 5d 2c 20  omObj( objv[2], 
e3c0: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 2a 73 75  0 );.    if( *su
e3d0: 62 43 6d 64 3d 3d 27 66 27 20 26 26 20 73 74 72  bCmd=='f' && str
e3e0: 63 6d 70 28 73 75 62 43 6d 64 2c 22 66 6c 75 73  cmp(subCmd,"flus
e3f0: 68 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  h")==0 ){.      
e400: 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
e410: 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67         Tcl_Wrong
e420: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
e430: 32 2c 20 6f 62 6a 76 2c 20 22 66 6c 75 73 68 22  2, objv, "flush"
e440: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
e450: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
e460: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e470: 20 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65    flushStmtCache
e480: 28 20 70 44 62 20 29 3b 0a 20 20 20 20 20 20 7d  ( pDb );.      }
e490: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 2a  .    }else if( *
e4a0: 73 75 62 43 6d 64 3d 3d 27 73 27 20 26 26 20 73  subCmd=='s' && s
e4b0: 74 72 63 6d 70 28 73 75 62 43 6d 64 2c 22 73 69  trcmp(subCmd,"si
e4c0: 7a 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ze")==0 ){.     
e4d0: 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a   if( objc!=4 ){.
e4e0: 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e          Tcl_Wron
e4f0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
e500: 20 32 2c 20 6f 62 6a 76 2c 20 22 73 69 7a 65 20   2, objv, "size 
e510: 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  n");.        ret
e520: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
e530: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
e540: 20 20 20 20 69 66 28 20 54 43 4c 5f 45 52 52 4f      if( TCL_ERRO
e550: 52 3d 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  R==Tcl_GetIntFro
e560: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
e570: 76 5b 33 5d 2c 20 26 6e 29 20 29 7b 0a 20 20 20  v[3], &n) ){.   
e580: 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
e590: 64 52 65 73 75 6c 74 28 20 69 6e 74 65 72 70 2c  dResult( interp,
e5a0: 20 22 63 61 6e 6e 6f 74 20 63 6f 6e 76 65 72 74   "cannot convert
e5b0: 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 20 20   \"", .         
e5c0: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
e5d0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
e5e0: 33 5d 2c 30 29 2c 20 22 5c 22 20 74 6f 20 69 6e  3],0), "\" to in
e5f0: 74 65 67 65 72 22 2c 20 30 29 3b 0a 20 20 20 20  teger", 0);.    
e600: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
e610: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
e620: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
e630: 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20   if( n<0 ){.    
e640: 20 20 20 20 20 20 20 20 66 6c 75 73 68 53 74 6d          flushStm
e650: 74 43 61 63 68 65 28 20 70 44 62 20 29 3b 0a 20  tCache( pDb );. 
e660: 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 30             n = 0
e670: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
e680: 65 20 69 66 28 20 6e 3e 4d 41 58 5f 50 52 45 50  e if( n>MAX_PREP
e690: 41 52 45 44 5f 53 54 4d 54 53 20 29 7b 0a 20 20  ARED_STMTS ){.  
e6a0: 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 4d 41            n = MA
e6b0: 58 5f 50 52 45 50 41 52 45 44 5f 53 54 4d 54 53  X_PREPARED_STMTS
e6c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
e6d0: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 6d 61 78          pDb->max
e6e0: 53 74 6d 74 20 3d 20 6e 3b 0a 20 20 20 20 20 20  Stmt = n;.      
e6f0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
e700: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c  }else{.      Tcl
e710: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 20 69  _AppendResult( i
e720: 6e 74 65 72 70 2c 20 22 62 61 64 20 6f 70 74 69  nterp, "bad opti
e730: 6f 6e 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  on \"", .       
e740: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
e750: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
e760: 30 29 2c 20 22 5c 22 3a 20 6d 75 73 74 20 62 65  0), "\": must be
e770: 20 66 6c 75 73 68 20 6f 72 20 73 69 7a 65 22 2c   flush or size",
e780: 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   0);.      retur
e790: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
e7a0: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
e7b0: 7d 0a 0a 20 20 2f 2a 20 20 20 20 20 24 64 62 20  }..  /*     $db 
e7c0: 63 68 61 6e 67 65 73 0a 20 20 2a 2a 0a 20 20 2a  changes.  **.  *
e7d0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
e7e0: 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
e7f0: 20 77 65 72 65 20 6d 6f 64 69 66 69 65 64 2c 20   were modified, 
e800: 69 6e 73 65 72 74 65 64 2c 20 6f 72 20 64 65 6c  inserted, or del
e810: 65 74 65 64 20 62 79 0a 20 20 2a 2a 20 74 68 65  eted by.  ** the
e820: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 49 4e 53   most recent INS
e830: 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44  ERT, UPDATE or D
e840: 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c  ELETE statement,
e850: 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67 20 0a   not including .
e860: 20 20 2a 2a 20 61 6e 79 20 63 68 61 6e 67 65 73    ** any changes
e870: 20 6d 61 64 65 20 62 79 20 74 72 69 67 67 65 72   made by trigger
e880: 20 70 72 6f 67 72 61 6d 73 2e 0a 20 20 2a 2f 0a   programs..  */.
e890: 20 20 63 61 73 65 20 44 42 5f 43 48 41 4e 47 45    case DB_CHANGE
e8a0: 53 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  S: {.    Tcl_Obj
e8b0: 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 69   *pResult;.    i
e8c0: 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
e8d0: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
e8e0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
e8f0: 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 20  objv, "");.     
e900: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
e910: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 52 65  R;.    }.    pRe
e920: 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62  sult = Tcl_GetOb
e930: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  jResult(interp);
e940: 0a 20 20 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f  .    Tcl_SetIntO
e950: 62 6a 28 70 52 65 73 75 6c 74 2c 20 73 71 6c 69  bj(pResult, sqli
e960: 74 65 33 5f 63 68 61 6e 67 65 73 28 70 44 62 2d  te3_changes(pDb-
e970: 3e 64 62 29 29 3b 0a 20 20 20 20 62 72 65 61 6b  >db));.    break
e980: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24  ;.  }..  /*    $
e990: 64 62 20 63 6c 6f 73 65 0a 20 20 2a 2a 0a 20 20  db close.  **.  
e9a0: 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20  ** Shutdown the 
e9b0: 64 61 74 61 62 61 73 65 0a 20 20 2a 2f 0a 20 20  database.  */.  
e9c0: 63 61 73 65 20 44 42 5f 43 4c 4f 53 45 3a 20 7b  case DB_CLOSE: {
e9d0: 0a 20 20 20 20 54 63 6c 5f 44 65 6c 65 74 65 43  .    Tcl_DeleteC
e9e0: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 54  ommand(interp, T
e9f0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
ea00: 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 29  Obj(objv[0], 0))
ea10: 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
ea20: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  /*.  **     
ea30: 24 64 62 20 63 6f 6c 6c 61 74 65 20 4e 41 4d 45  $db collate NAME
ea40: 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a   SCRIPT.  **.  *
ea50: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53  * Create a new S
ea60: 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e  QL collation fun
ea70: 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d  ction called NAM
ea80: 45 2e 20 20 57 68 65 6e 65 76 65 72 0a 20 20 2a  E.  Whenever.  *
ea90: 2a 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20  * that function 
eaa0: 69 73 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b  is called, invok
eab0: 65 20 53 43 52 49 50 54 20 74 6f 20 65 76 61 6c  e SCRIPT to eval
eac0: 75 61 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f  uate the functio
ead0: 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  n..  */.  case D
eae0: 42 5f 43 4f 4c 4c 41 54 45 3a 20 7b 0a 20 20 20  B_COLLATE: {.   
eaf0: 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43 6f   SqlCollate *pCo
eb00: 6c 6c 61 74 65 3b 0a 20 20 20 20 63 68 61 72 20  llate;.    char 
eb10: 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 68 61 72  *zName;.    char
eb20: 20 2a 7a 53 63 72 69 70 74 3b 0a 20 20 20 20 69   *zScript;.    i
eb30: 6e 74 20 6e 53 63 72 69 70 74 3b 0a 20 20 20 20  nt nScript;.    
eb40: 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
eb50: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
eb60: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
eb70: 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20 53 43 52   objv, "NAME SCR
eb80: 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74  IPT");.      ret
eb90: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
eba0: 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d     }.    zName =
ebb0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
ebc0: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30  omObj(objv[2], 0
ebd0: 29 3b 0a 20 20 20 20 7a 53 63 72 69 70 74 20 3d  );.    zScript =
ebe0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
ebf0: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26  omObj(objv[3], &
ec00: 6e 53 63 72 69 70 74 29 3b 0a 20 20 20 20 70 43  nScript);.    pC
ec10: 6f 6c 6c 61 74 65 20 3d 20 28 53 71 6c 43 6f 6c  ollate = (SqlCol
ec20: 6c 61 74 65 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28  late*)Tcl_Alloc(
ec30: 20 73 69 7a 65 6f 66 28 2a 70 43 6f 6c 6c 61 74   sizeof(*pCollat
ec40: 65 29 20 2b 20 6e 53 63 72 69 70 74 20 2b 20 31  e) + nScript + 1
ec50: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c   );.    if( pCol
ec60: 6c 61 74 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  late==0 ) return
ec70: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
ec80: 70 43 6f 6c 6c 61 74 65 2d 3e 69 6e 74 65 72 70  pCollate->interp
ec90: 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 70   = interp;.    p
eca0: 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78 74 20 3d  Collate->pNext =
ecb0: 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 3b 0a   pDb->pCollate;.
ecc0: 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 7a 53      pCollate->zS
ecd0: 63 72 69 70 74 20 3d 20 28 63 68 61 72 2a 29 26  cript = (char*)&
ece0: 70 43 6f 6c 6c 61 74 65 5b 31 5d 3b 0a 20 20 20  pCollate[1];.   
ecf0: 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20 3d   pDb->pCollate =
ed00: 20 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 6d   pCollate;.    m
ed10: 65 6d 63 70 79 28 70 43 6f 6c 6c 61 74 65 2d 3e  emcpy(pCollate->
ed20: 7a 53 63 72 69 70 74 2c 20 7a 53 63 72 69 70 74  zScript, zScript
ed30: 2c 20 6e 53 63 72 69 70 74 2b 31 29 3b 0a 20 20  , nScript+1);.  
ed40: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 72    if( sqlite3_cr
ed50: 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 70  eate_collation(p
ed60: 44 62 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 53  Db->db, zName, S
ed70: 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20 20 20  QLITE_UTF8, .   
ed80: 20 20 20 20 20 70 43 6f 6c 6c 61 74 65 2c 20 74       pCollate, t
ed90: 63 6c 53 71 6c 43 6f 6c 6c 61 74 65 29 20 29 7b  clSqlCollate) ){
eda0: 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65  .      Tcl_SetRe
edb0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
edc0: 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72  ar *)sqlite3_err
edd0: 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 54 43  msg(pDb->db), TC
ede0: 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20  L_VOLATILE);.   
edf0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
ee00: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  ROR;.    }.    b
ee10: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
ee20: 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63 6f 6c    **     $db col
ee30: 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 20 53 43  lation_needed SC
ee40: 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43  RIPT.  **.  ** C
ee50: 72 65 61 74 65 20 61 20 6e 65 77 20 53 51 4c 20  reate a new SQL 
ee60: 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69  collation functi
ee70: 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20  on called NAME. 
ee80: 20 57 68 65 6e 65 76 65 72 0a 20 20 2a 2a 20 74   Whenever.  ** t
ee90: 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  hat function is 
eea0: 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53  called, invoke S
eeb0: 43 52 49 50 54 20 74 6f 20 65 76 61 6c 75 61 74  CRIPT to evaluat
eec0: 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a  e the function..
eed0: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43    */.  case DB_C
eee0: 4f 4c 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 3a  OLLATION_NEEDED:
eef0: 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21   {.    if( objc!
ef00: 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =3 ){.      Tcl_
ef10: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
ef20: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53  erp, 2, objv, "S
ef30: 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72  CRIPT");.      r
ef40: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
ef50: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
ef60: 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64  Db->pCollateNeed
ef70: 65 64 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  ed ){.      Tcl_
ef80: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62  DecrRefCount(pDb
ef90: 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64  ->pCollateNeeded
efa0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 62  );.    }.    pDb
efb0: 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64  ->pCollateNeeded
efc0: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
efd0: 4f 62 6a 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  Obj(objv[2]);.  
efe0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
eff0: 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65  nt(pDb->pCollate
f000: 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 73 71 6c  Needed);.    sql
f010: 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e  ite3_collation_n
f020: 65 65 64 65 64 28 70 44 62 2d 3e 64 62 2c 20 70  eeded(pDb->db, p
f030: 44 62 2c 20 74 63 6c 43 6f 6c 6c 61 74 65 4e 65  Db, tclCollateNe
f040: 65 64 65 64 29 3b 0a 20 20 20 20 62 72 65 61 6b  eded);.    break
f050: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24  ;.  }..  /*    $
f060: 64 62 20 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 20 3f  db commit_hook ?
f070: 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20  CALLBACK?.  **. 
f080: 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67   ** Invoke the g
f090: 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 6a 75  iven callback ju
f0a0: 73 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74  st before commit
f0b0: 74 69 6e 67 20 65 76 65 72 79 20 53 51 4c 20 74  ting every SQL t
f0c0: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a  ransaction..  **
f0d0: 20 49 66 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   If the callback
f0e0: 20 74 68 72 6f 77 73 20 61 6e 20 65 78 63 65 70   throws an excep
f0f0: 74 69 6f 6e 20 6f 72 20 72 65 74 75 72 6e 73 20  tion or returns 
f100: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74  non-zero, then t
f110: 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  he.  ** transact
f120: 69 6f 6e 20 69 73 20 61 62 6f 72 74 65 64 2e 20  ion is aborted. 
f130: 20 49 66 20 43 41 4c 4c 42 41 43 4b 20 69 73 20   If CALLBACK is 
f140: 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c  an empty string,
f150: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 0a 20 20   the callback.  
f160: 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e 0a  ** is disabled..
f170: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43    */.  case DB_C
f180: 4f 4d 4d 49 54 5f 48 4f 4f 4b 3a 20 7b 0a 20 20  OMMIT_HOOK: {.  
f190: 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a    if( objc>3 ){.
f1a0: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
f1b0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
f1c0: 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41  , objv, "?CALLBA
f1d0: 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74  CK?");.      ret
f1e0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
f1f0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a     }else if( obj
f200: 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66  c==2 ){.      if
f210: 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29  ( pDb->zCommit )
f220: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  {.        Tcl_Ap
f230: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
f240: 70 2c 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 2c  p, pDb->zCommit,
f250: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
f260: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
f270: 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 0a 20 20 20  ar *zCommit;.   
f280: 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
f290: 20 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d    if( pDb->zComm
f2a0: 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  it ){.        Tc
f2b0: 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 43 6f 6d  l_Free(pDb->zCom
f2c0: 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mit);.      }.  
f2d0: 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 54 63      zCommit = Tc
f2e0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
f2f0: 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e  bj(objv[2], &len
f300: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6f  );.      if( zCo
f310: 6d 6d 69 74 20 26 26 20 6c 65 6e 3e 30 20 29 7b  mmit && len>0 ){
f320: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 43  .        pDb->zC
f330: 6f 6d 6d 69 74 20 3d 20 54 63 6c 5f 41 6c 6c 6f  ommit = Tcl_Allo
f340: 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20  c( len + 1 );.  
f350: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62        memcpy(pDb
f360: 2d 3e 7a 43 6f 6d 6d 69 74 2c 20 7a 43 6f 6d 6d  ->zCommit, zComm
f370: 69 74 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20  it, len+1);.    
f380: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f390: 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20   pDb->zCommit = 
f3a0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
f3b0: 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69   if( pDb->zCommi
f3c0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  t ){.        pDb
f3d0: 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  ->interp = inter
f3e0: 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  p;.        sqlit
f3f0: 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 70  e3_commit_hook(p
f400: 44 62 2d 3e 64 62 2c 20 44 62 43 6f 6d 6d 69 74  Db->db, DbCommit
f410: 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20  Handler, pDb);. 
f420: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f430: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d      sqlite3_comm
f440: 69 74 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c  it_hook(pDb->db,
f450: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
f460: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
f470: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
f480: 62 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c 0a 20  b complete SQL. 
f490: 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
f4a0: 54 52 55 45 20 69 66 20 53 51 4c 20 69 73 20 61  TRUE if SQL is a
f4b0: 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c 20 73 74   complete SQL st
f4c0: 61 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e  atement.  Return
f4d0: 20 46 41 4c 53 45 20 69 66 0a 20 20 2a 2a 20 61   FALSE if.  ** a
f4e0: 64 64 69 74 69 6f 6e 61 6c 20 6c 69 6e 65 73 20  dditional lines 
f4f0: 6f 66 20 69 6e 70 75 74 20 61 72 65 20 6e 65 65  of input are nee
f500: 64 65 64 2e 20 20 54 68 69 73 20 69 73 20 73 69  ded.  This is si
f510: 6d 69 6c 61 72 20 74 6f 20 74 68 65 0a 20 20 2a  milar to the.  *
f520: 2a 20 62 75 69 6c 74 2d 69 6e 20 22 69 6e 66 6f  * built-in "info
f530: 20 63 6f 6d 70 6c 65 74 65 22 20 63 6f 6d 6d 61   complete" comma
f540: 6e 64 20 6f 66 20 54 63 6c 2e 0a 20 20 2a 2f 0a  nd of Tcl..  */.
f550: 20 20 63 61 73 65 20 44 42 5f 43 4f 4d 50 4c 45    case DB_COMPLE
f560: 54 45 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53 51  TE: {.#ifndef SQ
f570: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45  LITE_OMIT_COMPLE
f580: 54 45 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  TE.    Tcl_Obj *
f590: 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74  pResult;.    int
f5a0: 20 69 73 43 6f 6d 70 6c 65 74 65 3b 0a 20 20 20   isComplete;.   
f5b0: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
f5c0: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
f5d0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
f5e0: 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 22 29 3b 0a  , objv, "SQL");.
f5f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
f600: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
f610: 20 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 73    isComplete = s
f620: 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 28  qlite3_complete(
f630: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
f640: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30  omObj(objv[2], 0
f650: 29 20 29 3b 0a 20 20 20 20 70 52 65 73 75 6c 74  ) );.    pResult
f660: 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73   = Tcl_GetObjRes
f670: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  ult(interp);.   
f680: 20 54 63 6c 5f 53 65 74 42 6f 6f 6c 65 61 6e 4f   Tcl_SetBooleanO
f690: 62 6a 28 70 52 65 73 75 6c 74 2c 20 69 73 43 6f  bj(pResult, isCo
f6a0: 6d 70 6c 65 74 65 29 3b 0a 23 65 6e 64 69 66 0a  mplete);.#endif.
f6b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
f6c0: 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6f 70 79    /*    $db copy
f6d0: 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69   conflict-algori
f6e0: 74 68 6d 20 74 61 62 6c 65 20 66 69 6c 65 6e 61  thm table filena
f6f0: 6d 65 20 3f 53 45 50 41 52 41 54 4f 52 3f 20 3f  me ?SEPARATOR? ?
f700: 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f 0a 20  NULLINDICATOR?. 
f710: 20 2a 2a 0a 20 20 2a 2a 20 43 6f 70 79 20 64 61   **.  ** Copy da
f720: 74 61 20 69 6e 74 6f 20 74 61 62 6c 65 20 66 72  ta into table fr
f730: 6f 6d 20 66 69 6c 65 6e 61 6d 65 2c 20 6f 70 74  om filename, opt
f740: 69 6f 6e 61 6c 6c 79 20 75 73 69 6e 67 20 53 45  ionally using SE
f750: 50 41 52 41 54 4f 52 0a 20 20 2a 2a 20 61 73 20  PARATOR.  ** as 
f760: 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72  column separator
f770: 73 2e 20 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20  s.  If a column 
f780: 63 6f 6e 74 61 69 6e 73 20 61 20 6e 75 6c 6c 20  contains a null 
f790: 73 74 72 69 6e 67 2c 20 6f 72 20 74 68 65 0a 20  string, or the. 
f7a0: 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 4e 55 4c   ** value of NUL
f7b0: 4c 49 4e 44 49 43 41 54 4f 52 2c 20 61 20 4e 55  LINDICATOR, a NU
f7c0: 4c 4c 20 69 73 20 69 6e 73 65 72 74 65 64 20 66  LL is inserted f
f7d0: 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 20  or the column.. 
f7e0: 20 2a 2a 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67   ** conflict-alg
f7f0: 6f 72 69 74 68 6d 20 69 73 20 6f 6e 65 20 6f 66  orithm is one of
f800: 20 74 68 65 20 73 71 6c 69 74 65 20 63 6f 6e 66   the sqlite conf
f810: 6c 69 63 74 20 61 6c 67 6f 72 69 74 68 6d 73 3a  lict algorithms:
f820: 0a 20 20 2a 2a 20 20 20 20 72 6f 6c 6c 62 61 63  .  **    rollbac
f830: 6b 2c 20 61 62 6f 72 74 2c 20 66 61 69 6c 2c 20  k, abort, fail, 
f840: 69 67 6e 6f 72 65 2c 20 72 65 70 6c 61 63 65 0a  ignore, replace.
f850: 20 20 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c    ** On success,
f860: 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   return the numb
f870: 65 72 20 6f 66 20 6c 69 6e 65 73 20 70 72 6f 63  er of lines proc
f880: 65 73 73 65 64 2c 20 6e 6f 74 20 6e 65 63 65 73  essed, not neces
f890: 73 61 72 69 6c 79 20 73 61 6d 65 0a 20 20 2a 2a  sarily same.  **
f8a0: 20 61 73 20 27 64 62 20 63 68 61 6e 67 65 73 27   as 'db changes'
f8b0: 20 64 75 65 20 74 6f 20 63 6f 6e 66 6c 69 63 74   due to conflict
f8c0: 2d 61 6c 67 6f 72 69 74 68 6d 20 73 65 6c 65 63  -algorithm selec
f8d0: 74 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ted..  **.  ** T
f8e0: 68 69 73 20 63 6f 64 65 20 69 73 20 62 61 73 69  his code is basi
f8f0: 63 61 6c 6c 79 20 61 6e 20 69 6d 70 6c 65 6d 65  cally an impleme
f900: 6e 74 61 74 69 6f 6e 2f 65 6e 68 61 6e 63 65 6d  ntation/enhancem
f910: 65 6e 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  ent of.  ** the 
f920: 73 71 6c 69 74 65 33 20 73 68 65 6c 6c 2e 63 20  sqlite3 shell.c 
f930: 22 2e 69 6d 70 6f 72 74 22 20 63 6f 6d 6d 61 6e  ".import" comman
f940: 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  d..  **.  ** Thi
f950: 73 20 63 6f 6d 6d 61 6e 64 20 75 73 61 67 65 20  s command usage 
f960: 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
f970: 20 74 68 65 20 73 71 6c 69 74 65 32 2e 78 20 43   the sqlite2.x C
f980: 4f 50 59 20 73 74 61 74 65 6d 65 6e 74 2c 0a 20  OPY statement,. 
f990: 20 2a 2a 20 77 68 69 63 68 20 69 6d 70 6f 72 74   ** which import
f9a0: 73 20 66 69 6c 65 20 64 61 74 61 20 69 6e 74 6f  s file data into
f9b0: 20 61 20 74 61 62 6c 65 20 75 73 69 6e 67 20 74   a table using t
f9c0: 68 65 20 50 6f 73 74 67 72 65 53 51 4c 20 43 4f  he PostgreSQL CO
f9d0: 50 59 20 66 69 6c 65 20 66 6f 72 6d 61 74 3a 0a  PY file format:.
f9e0: 20 20 2a 2a 20 20 20 24 64 62 20 63 6f 70 79 20    **   $db copy 
f9f0: 24 63 6f 6e 66 6c 69 74 5f 61 6c 67 6f 20 24 74  $conflit_algo $t
fa00: 61 62 6c 65 5f 6e 61 6d 65 20 24 66 69 6c 65 6e  able_name $filen
fa10: 61 6d 65 20 5c 74 20 5c 5c 4e 0a 20 20 2a 2f 0a  ame \t \\N.  */.
fa20: 20 20 63 61 73 65 20 44 42 5f 43 4f 50 59 3a 20    case DB_COPY: 
fa30: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62  {.    char *zTab
fa40: 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
fa50: 20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61 74 61    /* Insert data
fa60: 20 69 6e 74 6f 20 74 68 69 73 20 74 61 62 6c 65   into this table
fa70: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 46   */.    char *zF
fa80: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
fa90: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
faa0: 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 65 78  from which to ex
fab0: 74 72 61 63 74 20 64 61 74 61 20 2a 2f 0a 20 20  tract data */.  
fac0: 20 20 63 68 61 72 20 2a 7a 43 6f 6e 66 6c 69 63    char *zConflic
fad0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
fae0: 20 54 68 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c   The conflict al
faf0: 67 6f 72 69 74 68 6d 20 74 6f 20 75 73 65 20 2a  gorithm to use *
fb00: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  /.    sqlite3_st
fb10: 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20  mt *pStmt;      
fb20: 20 20 2f 2a 20 41 20 73 74 61 74 65 6d 65 6e 74    /* A statement
fb30: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c   */.    int nCol
fb40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
fb50: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
fb60: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
fb70: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74  table */.    int
fb80: 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20   nByte;         
fb90: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
fba0: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61  er of bytes in a
fbb0: 6e 20 53 51 4c 20 73 74 72 69 6e 67 20 2a 2f 0a  n SQL string */.
fbc0: 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20      int i, j;   
fbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbe0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
fbf0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 70   */.    int nSep
fc00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
fc10: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
fc20: 20 62 79 74 65 73 20 69 6e 20 7a 53 65 70 5b 5d   bytes in zSep[]
fc30: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4e 75 6c   */.    int nNul
fc40: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
fc50: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
fc60: 20 62 79 74 65 73 20 69 6e 20 7a 4e 75 6c 6c 5b   bytes in zNull[
fc70: 5d 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  ] */.    char *z
fc80: 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sql;            
fc90: 20 20 20 20 20 2f 2a 20 41 6e 20 53 51 4c 20 73       /* An SQL s
fca0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
fcb0: 63 68 61 72 20 2a 7a 4c 69 6e 65 3b 20 20 20 20  char *zLine;    
fcc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
fcd0: 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f 66 20   single line of 
fce0: 69 6e 70 75 74 20 66 72 6f 6d 20 74 68 65 20 66  input from the f
fcf0: 69 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  ile */.    char 
fd00: 2a 2a 61 7a 43 6f 6c 3b 20 20 20 20 20 20 20 20  **azCol;        
fd10: 20 20 20 20 20 20 20 2f 2a 20 7a 4c 69 6e 65 5b         /* zLine[
fd20: 5d 20 62 72 6f 6b 65 6e 20 75 70 20 69 6e 74 6f  ] broken up into
fd30: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20   columns */.    
fd40: 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 20 20  char *zCommit;  
fd50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
fd60: 6f 77 20 74 6f 20 63 6f 6d 6d 69 74 20 63 68 61  ow to commit cha
fd70: 6e 67 65 73 20 2a 2f 0a 20 20 20 20 46 49 4c 45  nges */.    FILE
fd80: 20 2a 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20   *in;           
fd90: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
fda0: 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 20  nput file */.   
fdb0: 20 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20 30 3b   int lineno = 0;
fdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fdd0: 4c 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 69  Line number of i
fde0: 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 20  nput file */.   
fdf0: 20 63 68 61 72 20 7a 4c 69 6e 65 4e 75 6d 5b 38   char zLineNum[8
fe00: 30 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0];          /* 
fe10: 4c 69 6e 65 20 6e 75 6d 62 65 72 20 70 72 69 6e  Line number prin
fe20: 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20  t buffer */.    
fe30: 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74  Tcl_Obj *pResult
fe40: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69  ;           /* i
fe50: 6e 74 65 72 70 20 72 65 73 75 6c 74 20 2a 2f 0a  nterp result */.
fe60: 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 65 70 3b  .    char *zSep;
fe70: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c  .    char *zNull
fe80: 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3c 35  ;.    if( objc<5
fe90: 20 7c 7c 20 6f 62 6a 63 3e 37 20 29 7b 0a 20 20   || objc>7 ){.  
fea0: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
feb0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
fec0: 6f 62 6a 76 2c 20 0a 20 20 20 20 20 20 20 20 20  objv, .         
fed0: 22 43 4f 4e 46 4c 49 43 54 2d 41 4c 47 4f 52 49  "CONFLICT-ALGORI
fee0: 54 48 4d 20 54 41 42 4c 45 20 46 49 4c 45 4e 41  THM TABLE FILENA
fef0: 4d 45 20 3f 53 45 50 41 52 41 54 4f 52 3f 20 3f  ME ?SEPARATOR? ?
ff00: 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f 22 29  NULLINDICATOR?")
ff10: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
ff20: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
ff30: 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 3d 36 20      if( objc>=6 
ff40: 29 7b 0a 20 20 20 20 20 20 7a 53 65 70 20 3d 20  ){.      zSep = 
ff50: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
ff60: 6d 4f 62 6a 28 6f 62 6a 76 5b 35 5d 2c 20 30 29  mObj(objv[5], 0)
ff70: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
ff80: 20 20 20 7a 53 65 70 20 3d 20 22 5c 74 22 3b 0a     zSep = "\t";.
ff90: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62      }.    if( ob
ffa0: 6a 63 3e 3d 37 20 29 7b 0a 20 20 20 20 20 20 7a  jc>=7 ){.      z
ffb0: 4e 75 6c 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74  Null = Tcl_GetSt
ffc0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
ffd0: 5b 36 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  [6], 0);.    }el
ffe0: 73 65 7b 0a 20 20 20 20 20 20 7a 4e 75 6c 6c 20  se{.      zNull 
fff0: 3d 20 22 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = "";.    }.    
10000 7a 43 6f 6e 66 6c 69 63 74 20 3d 20 54 63 6c 5f  zConflict = Tcl_
10010 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
10020 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20  (objv[2], 0);.  
10030 20 20 7a 54 61 62 6c 65 20 3d 20 54 63 6c 5f 47    zTable = Tcl_G
10040 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
10050 6f 62 6a 76 5b 33 5d 2c 20 30 29 3b 0a 20 20 20  objv[3], 0);.   
10060 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74   zFile = Tcl_Get
10070 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
10080 6a 76 5b 34 5d 2c 20 30 29 3b 0a 20 20 20 20 6e  jv[4], 0);.    n
10090 53 65 70 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a  Sep = strlen30(z
100a0 53 65 70 29 3b 0a 20 20 20 20 6e 4e 75 6c 6c 20  Sep);.    nNull 
100b0 3d 20 73 74 72 6c 65 6e 33 30 28 7a 4e 75 6c 6c  = strlen30(zNull
100c0 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 65 70 3d  );.    if( nSep=
100d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =0 ){.      Tcl_
100e0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
100f0 65 72 70 2c 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d  erp,"Error: non-
10100 6e 75 6c 6c 20 73 65 70 61 72 61 74 6f 72 20 72  null separator r
10110 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 70 79  equired for copy
10120 22 2c 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ",0);.      retu
10130 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
10140 20 20 7d 0a 20 20 20 20 69 66 28 73 74 72 63 6d    }.    if(strcm
10150 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 72 6f  p(zConflict, "ro
10160 6c 6c 62 61 63 6b 22 29 20 21 3d 20 30 20 26 26  llback") != 0 &&
10170 0a 20 20 20 20 20 20 20 73 74 72 63 6d 70 28 7a  .       strcmp(z
10180 43 6f 6e 66 6c 69 63 74 2c 20 22 61 62 6f 72 74  Conflict, "abort
10190 22 20 20 20 29 20 21 3d 20 30 20 26 26 0a 20 20  "   ) != 0 &&.  
101a0 20 20 20 20 20 73 74 72 63 6d 70 28 7a 43 6f 6e       strcmp(zCon
101b0 66 6c 69 63 74 2c 20 22 66 61 69 6c 22 20 20 20  flict, "fail"   
101c0 20 29 20 21 3d 20 30 20 26 26 0a 20 20 20 20 20   ) != 0 &&.     
101d0 20 20 73 74 72 63 6d 70 28 7a 43 6f 6e 66 6c 69    strcmp(zConfli
101e0 63 74 2c 20 22 69 67 6e 6f 72 65 22 20 20 29 20  ct, "ignore"  ) 
101f0 21 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20 73  != 0 &&.       s
10200 74 72 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c  trcmp(zConflict,
10210 20 22 72 65 70 6c 61 63 65 22 20 29 20 21 3d 20   "replace" ) != 
10220 30 20 29 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f  0 ) {.      Tcl_
10230 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
10240 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 5c 22 22  erp, "Error: \""
10250 2c 20 7a 43 6f 6e 66 6c 69 63 74 2c 20 0a 20 20  , zConflict, .  
10260 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 63            "\", c
10270 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68  onflict-algorith
10280 6d 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66  m must be one of
10290 3a 20 72 6f 6c 6c 62 61 63 6b 2c 20 22 0a 20 20  : rollback, ".  
102a0 20 20 20 20 20 20 20 20 20 20 22 61 62 6f 72 74            "abort
102b0 2c 20 66 61 69 6c 2c 20 69 67 6e 6f 72 65 2c 20  , fail, ignore, 
102c0 6f 72 20 72 65 70 6c 61 63 65 22 2c 20 30 29 3b  or replace", 0);
102d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
102e0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
102f0 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
10300 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43  3_mprintf("SELEC
10310 54 20 2a 20 46 52 4f 4d 20 27 25 71 27 22 2c 20  T * FROM '%q'", 
10320 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 69 66 28  zTable);.    if(
10330 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   zSql==0 ){.    
10340 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
10350 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f  lt(interp, "Erro
10360 72 3a 20 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  r: no such table
10370 3a 20 22 2c 20 7a 54 61 62 6c 65 2c 20 30 29 3b  : ", zTable, 0);
10380 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
10390 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
103a0 20 20 20 6e 42 79 74 65 20 3d 20 73 74 72 6c 65     nByte = strle
103b0 6e 33 30 28 7a 53 71 6c 29 3b 0a 20 20 20 20 72  n30(zSql);.    r
103c0 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
103d0 61 72 65 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71  are(pDb->db, zSq
103e0 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30  l, -1, &pStmt, 0
103f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
10400 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69  ree(zSql);.    i
10410 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54  f( rc ){.      T
10420 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
10430 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20  interp, "Error: 
10440 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
10450 67 28 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a  g(pDb->db), 0);.
10460 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a        nCol = 0;.
10470 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10480 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f   nCol = sqlite3_
10490 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74  column_count(pSt
104a0 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  mt);.    }.    s
104b0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
104c0 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20  pStmt);.    if( 
104d0 6e 43 6f 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20  nCol==0 ) {.    
104e0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
104f0 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53  OR;.    }.    zS
10500 71 6c 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79  ql = malloc( nBy
10510 74 65 20 2b 20 35 30 20 2b 20 6e 43 6f 6c 2a 32  te + 50 + nCol*2
10520 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c   );.    if( zSql
10530 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20 20 54 63  ==0 ) {.      Tc
10540 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
10550 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 63  nterp, "Error: c
10560 61 6e 27 74 20 6d 61 6c 6c 6f 63 28 29 22 2c 20  an't malloc()", 
10570 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
10580 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
10590 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  }.    sqlite3_sn
105a0 70 72 69 6e 74 66 28 6e 42 79 74 65 2b 35 30 2c  printf(nByte+50,
105b0 20 7a 53 71 6c 2c 20 22 49 4e 53 45 52 54 20 4f   zSql, "INSERT O
105c0 52 20 25 71 20 49 4e 54 4f 20 27 25 71 27 20 56  R %q INTO '%q' V
105d0 41 4c 55 45 53 28 3f 22 2c 0a 20 20 20 20 20 20  ALUES(?",.      
105e0 20 20 20 7a 43 6f 6e 66 6c 69 63 74 2c 20 7a 54     zConflict, zT
105f0 61 62 6c 65 29 3b 0a 20 20 20 20 6a 20 3d 20 73  able);.    j = s
10600 74 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 20  trlen30(zSql);. 
10610 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 43     for(i=1; i<nC
10620 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
10630 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 2c 27 3b  zSql[j++] = ',';
10640 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d  .      zSql[j++]
10650 20 3d 20 27 3f 27 3b 0a 20 20 20 20 7d 0a 20 20   = '?';.    }.  
10660 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 29    zSql[j++] = ')
10670 27 3b 0a 20 20 20 20 7a 53 71 6c 5b 6a 5d 20 3d  ';.    zSql[j] =
10680 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   0;.    rc = sql
10690 69 74 65 33 5f 70 72 65 70 61 72 65 28 70 44 62  ite3_prepare(pDb
106a0 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  ->db, zSql, -1, 
106b0 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  &pStmt, 0);.    
106c0 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20  free(zSql);.    
106d0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
106e0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
106f0 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a  (interp, "Error:
10700 20 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d   ", sqlite3_errm
10710 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b  sg(pDb->db), 0);
10720 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
10730 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
10740 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
10750 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
10760 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 46 69    in = fopen(zFi
10770 6c 65 2c 20 22 72 62 22 29 3b 0a 20 20 20 20 69  le, "rb");.    i
10780 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  f( in==0 ){.    
10790 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
107a0 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f  lt(interp, "Erro
107b0 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66  r: cannot open f
107c0 69 6c 65 3a 20 22 2c 20 7a 46 69 6c 65 2c 20 4e  ile: ", zFile, N
107d0 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ULL);.      sqli
107e0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
107f0 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  mt);.      retur
10800 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
10810 20 7d 0a 20 20 20 20 61 7a 43 6f 6c 20 3d 20 6d   }.    azCol = m
10820 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 61 7a  alloc( sizeof(az
10830 43 6f 6c 5b 30 5d 29 2a 28 6e 43 6f 6c 2b 31 29  Col[0])*(nCol+1)
10840 20 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 43 6f   );.    if( azCo
10850 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20 20 54  l==0 ) {.      T
10860 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
10870 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20  interp, "Error: 
10880 63 61 6e 27 74 20 6d 61 6c 6c 6f 63 28 29 22 2c  can't malloc()",
10890 20 30 29 3b 0a 20 20 20 20 20 20 66 63 6c 6f 73   0);.      fclos
108a0 65 28 69 6e 29 3b 0a 20 20 20 20 20 20 72 65 74  e(in);.      ret
108b0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
108c0 20 20 20 7d 0a 20 20 20 20 28 76 6f 69 64 29 73     }.    (void)s
108d0 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d  qlite3_exec(pDb-
108e0 3e 64 62 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c  >db, "BEGIN", 0,
108f0 20 30 2c 20 30 29 3b 0a 20 20 20 20 7a 43 6f 6d   0, 0);.    zCom
10900 6d 69 74 20 3d 20 22 43 4f 4d 4d 49 54 22 3b 0a  mit = "COMMIT";.
10910 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4c 69 6e      while( (zLin
10920 65 20 3d 20 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e  e = local_getlin
10930 65 28 30 2c 20 69 6e 29 29 21 3d 30 20 29 7b 0a  e(0, in))!=0 ){.
10940 20 20 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20        char *z;. 
10950 20 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20       lineno++;. 
10960 20 20 20 20 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20       azCol[0] = 
10970 7a 4c 69 6e 65 3b 0a 20 20 20 20 20 20 66 6f 72  zLine;.      for
10980 28 69 3d 30 2c 20 7a 3d 7a 4c 69 6e 65 3b 20 2a  (i=0, z=zLine; *
10990 7a 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  z; z++){.       
109a0 20 69 66 28 20 2a 7a 3d 3d 7a 53 65 70 5b 30 5d   if( *z==zSep[0]
109b0 20 26 26 20 73 74 72 6e 63 6d 70 28 7a 2c 20 7a   && strncmp(z, z
109c0 53 65 70 2c 20 6e 53 65 70 29 3d 3d 30 20 29 7b  Sep, nSep)==0 ){
109d0 0a 20 20 20 20 20 20 20 20 20 20 2a 7a 20 3d 20  .          *z = 
109e0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 2b 2b  0;.          i++
109f0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
10a00 69 3c 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  i<nCol ){.      
10a10 20 20 20 20 20 20 61 7a 43 6f 6c 5b 69 5d 20 3d        azCol[i] =
10a20 20 26 7a 5b 6e 53 65 70 5d 3b 0a 20 20 20 20 20   &z[nSep];.     
10a30 20 20 20 20 20 20 20 7a 20 2b 3d 20 6e 53 65 70         z += nSep
10a40 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  -1;.          }.
10a50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10a60 7d 0a 20 20 20 20 20 20 69 66 28 20 69 2b 31 21  }.      if( i+1!
10a70 3d 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  =nCol ){.       
10a80 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20   char *zErr;.   
10a90 20 20 20 20 20 69 6e 74 20 6e 45 72 72 20 3d 20       int nErr = 
10aa0 73 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 20  strlen30(zFile) 
10ab0 2b 20 32 30 30 3b 0a 20 20 20 20 20 20 20 20 7a  + 200;.        z
10ac0 45 72 72 20 3d 20 6d 61 6c 6c 6f 63 28 6e 45 72  Err = malloc(nEr
10ad0 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
10ae0 7a 45 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20  zErr ){.        
10af0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
10b00 74 66 28 6e 45 72 72 2c 20 7a 45 72 72 2c 0a 20  tf(nErr, zErr,. 
10b10 20 20 20 20 20 20 20 20 20 20 20 20 22 45 72 72              "Err
10b20 6f 72 3a 20 25 73 20 6c 69 6e 65 20 25 64 3a 20  or: %s line %d: 
10b30 65 78 70 65 63 74 65 64 20 25 64 20 63 6f 6c 75  expected %d colu
10b40 6d 6e 73 20 6f 66 20 64 61 74 61 20 62 75 74 20  mns of data but 
10b50 66 6f 75 6e 64 20 25 64 22 2c 0a 20 20 20 20 20  found %d",.     
10b60 20 20 20 20 20 20 20 20 7a 46 69 6c 65 2c 20 6c          zFile, l
10b70 69 6e 65 6e 6f 2c 20 6e 43 6f 6c 2c 20 69 2b 31  ineno, nCol, i+1
10b80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  );.          Tcl
10b90 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
10ba0 74 65 72 70 2c 20 7a 45 72 72 2c 20 30 29 3b 0a  terp, zErr, 0);.
10bb0 20 20 20 20 20 20 20 20 20 20 66 72 65 65 28 7a            free(z
10bc0 45 72 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Err);.        }.
10bd0 20 20 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20          zCommit 
10be0 3d 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20  = "ROLLBACK";.  
10bf0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10c00 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
10c10 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
10c20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 68 65  {.        /* che
10c30 63 6b 20 66 6f 72 20 6e 75 6c 6c 20 64 61 74 61  ck for null data
10c40 2c 20 69 66 20 73 6f 2c 20 62 69 6e 64 20 61 73  , if so, bind as
10c50 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20   null */.       
10c60 20 69 66 28 20 28 6e 4e 75 6c 6c 3e 30 20 26 26   if( (nNull>0 &&
10c70 20 73 74 72 63 6d 70 28 61 7a 43 6f 6c 5b 69 5d   strcmp(azCol[i]
10c80 2c 20 7a 4e 75 6c 6c 29 3d 3d 30 29 0a 20 20 20  , zNull)==0).   
10c90 20 20 20 20 20 20 20 7c 7c 20 73 74 72 6c 65 6e         || strlen
10ca0 33 30 28 61 7a 43 6f 6c 5b 69 5d 29 3d 3d 30 20  30(azCol[i])==0 
10cb0 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
10cc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
10cd0 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69  nd_null(pStmt, i
10ce0 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  +1);.        }el
10cf0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  se{.          sq
10d00 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28  lite3_bind_text(
10d10 70 53 74 6d 74 2c 20 69 2b 31 2c 20 61 7a 43 6f  pStmt, i+1, azCo
10d20 6c 5b 69 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45  l[i], -1, SQLITE
10d30 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
10d40 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
10d50 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70    sqlite3_step(p
10d60 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 63 20  Stmt);.      rc 
10d70 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
10d80 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 66 72  pStmt);.      fr
10d90 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20  ee(zLine);.     
10da0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10db0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  OK ){.        Tc
10dc0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
10dd0 6e 74 65 72 70 2c 22 45 72 72 6f 72 3a 20 22 2c  nterp,"Error: ",
10de0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
10df0 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20  pDb->db), 0);.  
10e00 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20        zCommit = 
10e10 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20  "ROLLBACK";.    
10e20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
10e30 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65   }.    }.    fre
10e40 65 28 61 7a 43 6f 6c 29 3b 0a 20 20 20 20 66 63  e(azCol);.    fc
10e50 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 73 71  lose(in);.    sq
10e60 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
10e70 53 74 6d 74 29 3b 0a 20 20 20 20 28 76 6f 69 64  Stmt);.    (void
10e80 29 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44  )sqlite3_exec(pD
10e90 62 2d 3e 64 62 2c 20 7a 43 6f 6d 6d 69 74 2c 20  b->db, zCommit, 
10ea0 30 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 69  0, 0, 0);..    i
10eb0 66 28 20 7a 43 6f 6d 6d 69 74 5b 30 5d 20 3d 3d  f( zCommit[0] ==
10ec0 20 27 43 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a   'C' ){.      /*
10ed0 20 73 75 63 63 65 73 73 2c 20 73 65 74 20 72 65   success, set re
10ee0 73 75 6c 74 20 61 73 20 6e 75 6d 62 65 72 20 6f  sult as number o
10ef0 66 20 6c 69 6e 65 73 20 70 72 6f 63 65 73 73 65  f lines processe
10f00 64 20 2a 2f 0a 20 20 20 20 20 20 70 52 65 73 75  d */.      pResu
10f10 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52  lt = Tcl_GetObjR
10f20 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
10f30 20 20 20 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f       Tcl_SetIntO
10f40 62 6a 28 70 52 65 73 75 6c 74 2c 20 6c 69 6e 65  bj(pResult, line
10f50 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  no);.      rc = 
10f60 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  TCL_OK;.    }els
10f70 65 7b 0a 20 20 20 20 20 20 2f 2a 20 66 61 69 6c  e{.      /* fail
10f80 75 72 65 2c 20 61 70 70 65 6e 64 20 6c 69 6e 65  ure, append line
10f90 6e 6f 20 77 68 65 72 65 20 66 61 69 6c 65 64 20  no where failed 
10fa0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
10fb0 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
10fc0 28 7a 4c 69 6e 65 4e 75 6d 29 2c 20 7a 4c 69 6e  (zLineNum), zLin
10fd0 65 4e 75 6d 2c 22 25 64 22 2c 6c 69 6e 65 6e 6f  eNum,"%d",lineno
10fe0 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  );.      Tcl_App
10ff0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
11000 2c 22 2c 20 66 61 69 6c 65 64 20 77 68 69 6c 65  ,", failed while
11010 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 69 6e 65   processing line
11020 3a 20 22 2c 7a 4c 69 6e 65 4e 75 6d 2c 30 29 3b  : ",zLineNum,0);
11030 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f  .      rc = TCL_
11040 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
11050 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
11060 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 65 6e  *.  **    $db en
11070 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73  able_load_extens
11080 69 6f 6e 20 42 4f 4f 4c 45 41 4e 0a 20 20 2a 2a  ion BOOLEAN.  **
11090 0a 20 20 2a 2a 20 54 75 72 6e 20 74 68 65 20 65  .  ** Turn the e
110a0 78 74 65 6e 73 69 6f 6e 20 6c 6f 61 64 69 6e 67  xtension loading
110b0 20 66 65 61 74 75 72 65 20 6f 6e 20 6f 72 20 6f   feature on or o
110c0 66 66 2e 20 20 49 74 20 69 66 20 6f 66 66 20 62  ff.  It if off b
110d0 79 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74 2e 0a  y.  ** default..
110e0 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 45    */.  case DB_E
110f0 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e  NABLE_LOAD_EXTEN
11100 53 49 4f 4e 3a 20 7b 0a 23 69 66 6e 64 65 66 20  SION: {.#ifndef 
11110 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
11120 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 69  _EXTENSION.    i
11130 6e 74 20 6f 6e 6f 66 66 3b 0a 20 20 20 20 69 66  nt onoff;.    if
11140 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
11150 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
11160 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
11170 62 6a 76 2c 20 22 42 4f 4f 4c 45 41 4e 22 29 3b  bjv, "BOOLEAN");
11180 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
11190 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
111a0 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f     if( Tcl_GetBo
111b0 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
111c0 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6f  erp, objv[2], &o
111d0 6e 6f 66 66 29 20 29 7b 0a 20 20 20 20 20 20 72  noff) ){.      r
111e0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
111f0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
11200 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65  e3_enable_load_e
11210 78 74 65 6e 73 69 6f 6e 28 70 44 62 2d 3e 64 62  xtension(pDb->db
11220 2c 20 6f 6e 6f 66 66 29 3b 0a 20 20 20 20 62 72  , onoff);.    br
11230 65 61 6b 3b 0a 23 65 6c 73 65 0a 20 20 20 20 54  eak;.#else.    T
11240 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
11250 69 6e 74 65 72 70 2c 20 22 65 78 74 65 6e 73 69  interp, "extensi
11260 6f 6e 20 6c 6f 61 64 69 6e 67 20 69 73 20 74 75  on loading is tu
11270 72 6e 65 64 20 6f 66 66 20 61 74 20 63 6f 6d 70  rned off at comp
11280 69 6c 65 2d 74 69 6d 65 22 2c 0a 20 20 20 20 20  ile-time",.     
11290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112a0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
112b0 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6e 64 69 66  CL_ERROR;.#endif
112c0 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
112d0 20 20 20 24 64 62 20 65 72 72 6f 72 63 6f 64 65     $db errorcode
112e0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72  .  **.  ** Retur
112f0 6e 20 74 68 65 20 6e 75 6d 65 72 69 63 20 65 72  n the numeric er
11300 72 6f 72 20 63 6f 64 65 20 74 68 61 74 20 77 61  ror code that wa
11310 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  s returned by th
11320 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 20 20  e most recent.  
11330 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  ** call to sqlit
11340 65 33 5f 65 78 65 63 28 29 2e 0a 20 20 2a 2f 0a  e3_exec()..  */.
11350 20 20 63 61 73 65 20 44 42 5f 45 52 52 4f 52 43    case DB_ERRORC
11360 4f 44 45 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 53  ODE: {.    Tcl_S
11370 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
11380 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
11390 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  j(sqlite3_errcod
113a0 65 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20  e(pDb->db)));.  
113b0 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
113c0 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 65  /*.  **    $db e
113d0 78 69 73 74 73 20 24 73 71 6c 0a 20 20 2a 2a 20  xists $sql.  ** 
113e0 20 20 20 24 64 62 20 6f 6e 65 63 6f 6c 75 6d 6e     $db onecolumn
113f0 20 24 73 71 6c 0a 20 20 2a 2a 0a 20 20 2a 2a 20   $sql.  **.  ** 
11400 54 68 65 20 6f 6e 65 63 6f 6c 75 6d 6e 20 6d 65  The onecolumn me
11410 74 68 6f 64 20 69 73 20 74 68 65 20 65 71 75 69  thod is the equi
11420 76 61 6c 65 6e 74 20 6f 66 3a 0a 20 20 2a 2a 20  valent of:.  ** 
11430 20 20 20 20 6c 69 6e 64 65 78 20 5b 24 64 62 20      lindex [$db 
11440 65 76 61 6c 20 24 73 71 6c 5d 20 30 0a 20 20 2a  eval $sql] 0.  *
11450 2f 0a 20 20 63 61 73 65 20 44 42 5f 45 58 49 53  /.  case DB_EXIS
11460 54 53 3a 20 0a 20 20 63 61 73 65 20 44 42 5f 4f  TS: .  case DB_O
11470 4e 45 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  NECOLUMN: {.    
11480 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 73 45  DbEvalContext sE
11490 76 61 6c 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a  val;.    if( obj
114a0 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=3 ){.      Tc
114b0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
114c0 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
114d0 22 53 51 4c 22 29 3b 0a 20 20 20 20 20 20 72 65  "SQL");.      re
114e0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
114f0 20 20 20 20 7d 0a 0a 20 20 20 20 64 62 45 76 61      }..    dbEva
11500 6c 49 6e 69 74 28 26 73 45 76 61 6c 2c 20 70 44  lInit(&sEval, pD
11510 62 2c 20 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a  b, objv[2], 0);.
11520 20 20 20 20 72 63 20 3d 20 64 62 45 76 61 6c 53      rc = dbEvalS
11530 74 65 70 28 26 73 45 76 61 6c 29 3b 0a 20 20 20  tep(&sEval);.   
11540 20 69 66 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f   if( choice==DB_
11550 4f 4e 45 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  ONECOLUMN ){.   
11560 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 4f     if( rc==TCL_O
11570 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  K ){.        Tcl
11580 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
11590 74 65 72 70 2c 20 64 62 45 76 61 6c 43 6f 6c 75  terp, dbEvalColu
115a0 6d 6e 56 61 6c 75 65 28 26 73 45 76 61 6c 2c 20  mnValue(&sEval, 
115b0 30 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  0));.      }else
115c0 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 42 52 45   if( rc==TCL_BRE
115d0 41 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  AK ){.        Tc
115e0 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e  l_ResetResult(in
115f0 74 65 72 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20  terp);.      }. 
11600 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d     }else if( rc=
11610 3d 54 43 4c 5f 42 52 45 41 4b 20 7c 7c 20 72 63  =TCL_BREAK || rc
11620 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20  ==TCL_OK ){.    
11630 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
11640 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
11650 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72 63 3d  ewBooleanObj(rc=
11660 3d 54 43 4c 5f 4f 4b 29 29 3b 0a 20 20 20 20 7d  =TCL_OK));.    }
11670 0a 20 20 20 20 64 62 45 76 61 6c 46 69 6e 61 6c  .    dbEvalFinal
11680 69 7a 65 28 26 73 45 76 61 6c 29 3b 0a 0a 20 20  ize(&sEval);..  
11690 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 42 52    if( rc==TCL_BR
116a0 45 41 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  EAK ){.      rc 
116b0 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  = TCL_OK;.    }.
116c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
116d0 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20    .  /*.  **    
116e0 24 64 62 20 65 76 61 6c 20 24 73 71 6c 20 3f 61  $db eval $sql ?a
116f0 72 72 61 79 3f 20 3f 7b 20 20 2e 2e 2e 63 6f 64  rray? ?{  ...cod
11700 65 2e 2e 2e 20 7d 3f 0a 20 20 2a 2a 0a 20 20 2a  e... }?.  **.  *
11710 2a 20 54 68 65 20 53 51 4c 20 73 74 61 74 65 6d  * The SQL statem
11720 65 6e 74 20 69 6e 20 24 73 71 6c 20 69 73 20 65  ent in $sql is e
11730 76 61 6c 75 61 74 65 64 2e 20 20 46 6f 72 20 65  valuated.  For e
11740 61 63 68 20 72 6f 77 2c 20 74 68 65 20 76 61 6c  ach row, the val
11750 75 65 73 20 61 72 65 0a 20 20 2a 2a 20 70 6c 61  ues are.  ** pla
11760 63 65 64 20 69 6e 20 65 6c 65 6d 65 6e 74 73 20  ced in elements 
11770 6f 66 20 74 68 65 20 61 72 72 61 79 20 6e 61 6d  of the array nam
11780 65 64 20 22 61 72 72 61 79 22 20 61 6e 64 20 2e  ed "array" and .
11790 2e 2e 63 6f 64 65 2e 2e 2e 20 69 73 20 65 78 65  ..code... is exe
117a0 63 75 74 65 64 2e 0a 20 20 2a 2a 20 49 66 20 22  cuted..  ** If "
117b0 61 72 72 61 79 22 20 61 6e 64 20 22 63 6f 64 65  array" and "code
117c0 22 20 61 72 65 20 6f 6d 69 74 74 65 64 2c 20 74  " are omitted, t
117d0 68 65 6e 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 20  hen no callback 
117e0 69 73 20 65 76 65 72 79 20 69 6e 76 6f 6b 65 64  is every invoked
117f0 2e 0a 20 20 2a 2a 20 49 66 20 22 61 72 72 61 79  ..  ** If "array
11800 22 20 69 73 20 61 6e 20 65 6d 70 74 79 20 73 74  " is an empty st
11810 72 69 6e 67 2c 20 74 68 65 6e 20 74 68 65 20 76  ring, then the v
11820 61 6c 75 65 73 20 61 72 65 20 70 6c 61 63 65 64  alues are placed
11830 20 69 6e 20 76 61 72 69 61 62 6c 65 73 0a 20 20   in variables.  
11840 2a 2a 20 74 68 61 74 20 68 61 76 65 20 74 68 65  ** that have the
11850 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68   same name as th
11860 65 20 66 69 65 6c 64 73 20 65 78 74 72 61 63 74  e fields extract
11870 65 64 20 62 79 20 74 68 65 20 71 75 65 72 79 2e  ed by the query.
11880 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
11890 45 56 41 4c 3a 20 7b 0a 20 20 20 20 69 66 28 20  EVAL: {.    if( 
118a0 6f 62 6a 63 3c 33 20 7c 7c 20 6f 62 6a 63 3e 35  objc<3 || objc>5
118b0 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
118c0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
118d0 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c  p, 2, objv, "SQL
118e0 20 3f 41 52 52 41 59 2d 4e 41 4d 45 3f 20 3f 53   ?ARRAY-NAME? ?S
118f0 43 52 49 50 54 3f 22 29 3b 0a 20 20 20 20 20 20  CRIPT?");.      
11900 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
11910 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
11920 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20   objc==3 ){.    
11930 20 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20    DbEvalContext 
11940 73 45 76 61 6c 3b 0a 20 20 20 20 20 20 54 63 6c  sEval;.      Tcl
11950 5f 4f 62 6a 20 2a 70 52 65 74 20 3d 20 54 63 6c  _Obj *pRet = Tcl
11960 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20 20  _NewObj();.     
11970 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
11980 74 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20 64  t(pRet);.      d
11990 62 45 76 61 6c 49 6e 69 74 28 26 73 45 76 61 6c  bEvalInit(&sEval
119a0 2c 20 70 44 62 2c 20 6f 62 6a 76 5b 32 5d 2c 20  , pDb, objv[2], 
119b0 30 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  0);.      while(
119c0 20 54 43 4c 5f 4f 4b 3d 3d 28 72 63 20 3d 20 64   TCL_OK==(rc = d
119d0 62 45 76 61 6c 53 74 65 70 28 26 73 45 76 61 6c  bEvalStep(&sEval
119e0 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  )) ){.        in
119f0 74 20 69 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  t i;.        int
11a00 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 64   nCol;.        d
11a10 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28 26 73 45  bEvalRowInfo(&sE
11a20 76 61 6c 2c 20 26 6e 43 6f 6c 2c 20 30 29 3b 0a  val, &nCol, 0);.
11a30 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
11a40 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
11a50 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4c 69 73           Tcl_Lis
11a60 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
11a70 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20  t(interp, pRet, 
11a80 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75  dbEvalColumnValu
11a90 65 28 26 73 45 76 61 6c 2c 20 69 29 29 3b 0a 20  e(&sEval, i));. 
11aa0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
11ab0 0a 20 20 20 20 20 20 64 62 45 76 61 6c 46 69 6e  .      dbEvalFin
11ac0 61 6c 69 7a 65 28 26 73 45 76 61 6c 29 3b 0a 20  alize(&sEval);. 
11ad0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c       if( rc==TCL
11ae0 5f 42 52 45 41 4b 20 29 7b 0a 20 20 20 20 20 20  _BREAK ){.      
11af0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
11b00 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29  lt(interp, pRet)
11b10 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 54  ;.        rc = T
11b20 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  CL_OK;.      }. 
11b30 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
11b40 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20  Count(pRet);.   
11b50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 43 6c   }else{.      Cl
11b60 69 65 6e 74 44 61 74 61 20 63 64 5b 32 5d 3b 0a  ientData cd[2];.
11b70 20 20 20 20 20 20 44 62 45 76 61 6c 43 6f 6e 74        DbEvalCont
11b80 65 78 74 20 2a 70 3b 0a 20 20 20 20 20 20 54 63  ext *p;.      Tc
11b90 6c 5f 4f 62 6a 20 2a 70 41 72 72 61 79 20 3d 20  l_Obj *pArray = 
11ba0 30 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a  0;.      Tcl_Obj
11bb0 20 2a 70 53 63 72 69 70 74 3b 0a 0a 20 20 20 20   *pScript;..    
11bc0 20 20 69 66 28 20 6f 62 6a 63 3d 3d 35 20 26 26    if( objc==5 &&
11bd0 20 2a 28 63 68 61 72 20 2a 29 54 63 6c 5f 47 65   *(char *)Tcl_Ge
11be0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29  tString(objv[3])
11bf0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 72 72   ){.        pArr
11c00 61 79 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20  ay = objv[3];.  
11c10 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 63 72      }.      pScr
11c20 69 70 74 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d  ipt = objv[objc-
11c30 31 5d 3b 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e  1];.      Tcl_In
11c40 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69  crRefCount(pScri
11c50 70 74 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20  pt);.      .    
11c60 20 20 70 20 3d 20 28 44 62 45 76 61 6c 43 6f 6e    p = (DbEvalCon
11c70 74 65 78 74 20 2a 29 54 63 6c 5f 41 6c 6c 6f 63  text *)Tcl_Alloc
11c80 28 73 69 7a 65 6f 66 28 44 62 45 76 61 6c 43 6f  (sizeof(DbEvalCo
11c90 6e 74 65 78 74 29 29 3b 0a 20 20 20 20 20 20 64  ntext));.      d
11ca0 62 45 76 61 6c 49 6e 69 74 28 70 2c 20 70 44 62  bEvalInit(p, pDb
11cb0 2c 20 6f 62 6a 76 5b 32 5d 2c 20 70 41 72 72 61  , objv[2], pArra
11cc0 79 29 3b 0a 0a 20 20 20 20 20 20 63 64 5b 30 5d  y);..      cd[0]
11cd0 20 3d 20 28 76 6f 69 64 20 2a 29 70 3b 0a 20 20   = (void *)p;.  
11ce0 20 20 20 20 63 64 5b 31 5d 20 3d 20 28 76 6f 69      cd[1] = (voi
11cf0 64 20 2a 29 70 53 63 72 69 70 74 3b 0a 20 20 20  d *)pScript;.   
11d00 20 20 20 72 63 20 3d 20 44 62 45 76 61 6c 4e 65     rc = DbEvalNe
11d10 78 74 43 6d 64 28 63 64 2c 20 69 6e 74 65 72 70  xtCmd(cd, interp
11d20 2c 20 54 43 4c 5f 4f 4b 29 3b 0a 20 20 20 20 7d  , TCL_OK);.    }
11d30 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
11d40 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24  .  /*.  **     $
11d50 64 62 20 66 75 6e 63 74 69 6f 6e 20 4e 41 4d 45  db function NAME
11d60 20 5b 2d 61 72 67 63 6f 75 6e 74 20 4e 5d 20 53   [-argcount N] S
11d70 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20  CRIPT.  **.  ** 
11d80 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 51 4c  Create a new SQL
11d90 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64   function called
11da0 20 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76 65 72   NAME.  Whenever
11db0 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 69   that function i
11dc0 73 0a 20 20 2a 2a 20 63 61 6c 6c 65 64 2c 20 69  s.  ** called, i
11dd0 6e 76 6f 6b 65 20 53 43 52 49 50 54 20 74 6f 20  nvoke SCRIPT to 
11de0 65 76 61 6c 75 61 74 65 20 74 68 65 20 66 75 6e  evaluate the fun
11df0 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61  ction..  */.  ca
11e00 73 65 20 44 42 5f 46 55 4e 43 54 49 4f 4e 3a 20  se DB_FUNCTION: 
11e10 7b 0a 20 20 20 20 53 71 6c 46 75 6e 63 20 2a 70  {.    SqlFunc *p
11e20 46 75 6e 63 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  Func;.    Tcl_Ob
11e30 6a 20 2a 70 53 63 72 69 70 74 3b 0a 20 20 20 20  j *pScript;.    
11e40 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
11e50 20 69 6e 74 20 6e 41 72 67 20 3d 20 2d 31 3b 0a   int nArg = -1;.
11e60 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 36 20      if( objc==6 
11e70 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
11e80 68 61 72 20 2a 7a 20 3d 20 54 63 6c 5f 47 65 74  har *z = Tcl_Get
11e90 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b  String(objv[3]);
11ea0 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73  .      int n = s
11eb0 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20  trlen30(z);.    
11ec0 20 20 69 66 28 20 6e 3e 32 20 26 26 20 73 74 72    if( n>2 && str
11ed0 6e 63 6d 70 28 7a 2c 20 22 2d 61 72 67 63 6f 75  ncmp(z, "-argcou
11ee0 6e 74 22 2c 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  nt",n)==0 ){.   
11ef0 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74       if( Tcl_Get
11f00 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
11f10 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 6e 41 72  p, objv[4], &nAr
11f20 67 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  g) ) return TCL_
11f30 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 69  ERROR;.        i
11f40 66 28 20 6e 41 72 67 3c 30 20 29 7b 0a 20 20 20  f( nArg<0 ){.   
11f50 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
11f60 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
11f70 22 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d  "number of argum
11f80 65 6e 74 73 20 6d 75 73 74 20 62 65 20 6e 6f 6e  ents must be non
11f90 2d 6e 65 67 61 74 69 76 65 22 2c 0a 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 20 28 63 68 61 72 2a 29 30 29         (char*)0)
11fc0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
11fd0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
11fe0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
11ff0 20 20 20 20 20 20 70 53 63 72 69 70 74 20 3d 20        pScript = 
12000 6f 62 6a 76 5b 35 5d 3b 0a 20 20 20 20 7d 65 6c  objv[5];.    }el
12010 73 65 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29  se if( objc!=4 )
12020 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
12030 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
12040 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20   2, objv, "NAME 
12050 5b 2d 61 72 67 63 6f 75 6e 74 20 4e 5d 20 53 43  [-argcount N] SC
12060 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65  RIPT");.      re
12070 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
12080 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12090 20 70 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b   pScript = objv[
120a0 33 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e  3];.    }.    zN
120b0 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ame = Tcl_GetStr
120c0 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
120d0 32 5d 2c 20 30 29 3b 0a 20 20 20 20 70 46 75 6e  2], 0);.    pFun
120e0 63 20 3d 20 66 69 6e 64 53 71 6c 46 75 6e 63 28  c = findSqlFunc(
120f0 70 44 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  pDb, zName);.   
12100 20 69 66 28 20 70 46 75 6e 63 3d 3d 30 20 29 20   if( pFunc==0 ) 
12110 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
12120 3b 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d  ;.    if( pFunc-
12130 3e 70 53 63 72 69 70 74 20 29 7b 0a 20 20 20 20  >pScript ){.    
12140 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
12150 6e 74 28 70 46 75 6e 63 2d 3e 70 53 63 72 69 70  nt(pFunc->pScrip
12160 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46  t);.    }.    pF
12170 75 6e 63 2d 3e 70 53 63 72 69 70 74 20 3d 20 70  unc->pScript = p
12180 53 63 72 69 70 74 3b 0a 20 20 20 20 54 63 6c 5f  Script;.    Tcl_
12190 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63  IncrRefCount(pSc
121a0 72 69 70 74 29 3b 0a 20 20 20 20 70 46 75 6e 63  ript);.    pFunc
121b0 2d 3e 75 73 65 45 76 61 6c 4f 62 6a 76 20 3d 20  ->useEvalObjv = 
121c0 73 61 66 65 54 6f 55 73 65 45 76 61 6c 4f 62 6a  safeToUseEvalObj
121d0 76 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70  v(interp, pScrip
121e0 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  t);.    rc = sql
121f0 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
12200 74 69 6f 6e 28 70 44 62 2d 3e 64 62 2c 20 7a 4e  tion(pDb->db, zN
12210 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54  ame, nArg, SQLIT
12220 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20 20  E_UTF8,.        
12230 70 46 75 6e 63 2c 20 74 63 6c 53 71 6c 46 75 6e  pFunc, tclSqlFun
12240 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  c, 0, 0);.    if
12250 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
12260 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43  ){.      rc = TC
12270 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 54  L_ERROR;.      T
12280 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
12290 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c  erp, (char *)sql
122a0 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d  ite3_errmsg(pDb-
122b0 3e 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49  >db), TCL_VOLATI
122c0 4c 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  LE);.    }.    b
122d0 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
122e0 20 20 2a 2a 20 20 20 20 20 24 64 62 20 69 6e 63    **     $db inc
122f0 72 62 6c 6f 62 20 3f 2d 72 65 61 64 6f 6e 6c 79  rblob ?-readonly
12300 3f 20 3f 44 42 3f 20 54 41 42 4c 45 20 43 4f 4c  ? ?DB? TABLE COL
12310 55 4d 4e 20 52 4f 57 49 44 0a 20 20 2a 2f 0a 20  UMN ROWID.  */. 
12320 20 63 61 73 65 20 44 42 5f 49 4e 43 52 42 4c 4f   case DB_INCRBLO
12330 42 3a 20 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  B: {.#ifdef SQLI
12340 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
12350 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
12360 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 69  esult(interp, "i
12370 6e 63 72 62 6c 6f 62 20 6e 6f 74 20 61 76 61 69  ncrblob not avai
12380 6c 61 62 6c 65 20 69 6e 20 74 68 69 73 20 62 75  lable in this bu
12390 69 6c 64 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  ild", 0);.    re
123a0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
123b0 23 65 6c 73 65 0a 20 20 20 20 69 6e 74 20 69 73  #else.    int is
123c0 52 65 61 64 6f 6e 6c 79 20 3d 20 30 3b 0a 20 20  Readonly = 0;.  
123d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
123e0 62 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20  b = "main";.    
123f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
12400 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  le;.    const ch
12410 61 72 20 2a 7a 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ar *zColumn;.   
12420 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 69 52 6f   Tcl_WideInt iRo
12430 77 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  w;..    /* Check
12440 20 66 6f 72 20 74 68 65 20 2d 72 65 61 64 6f 6e   for the -readon
12450 6c 79 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  ly option */.   
12460 20 69 66 28 20 6f 62 6a 63 3e 33 20 26 26 20 73   if( objc>3 && s
12470 74 72 63 6d 70 28 54 63 6c 5f 47 65 74 53 74 72  trcmp(Tcl_GetStr
12480 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 22 2d  ing(objv[2]), "-
12490 72 65 61 64 6f 6e 6c 79 22 29 3d 3d 30 20 29 7b  readonly")==0 ){
124a0 0a 20 20 20 20 20 20 69 73 52 65 61 64 6f 6e 6c  .      isReadonl
124b0 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  y = 1;.    }..  
124c0 20 20 69 66 28 20 6f 62 6a 63 21 3d 28 35 2b 69    if( objc!=(5+i
124d0 73 52 65 61 64 6f 6e 6c 79 29 20 26 26 20 6f 62  sReadonly) && ob
124e0 6a 63 21 3d 28 36 2b 69 73 52 65 61 64 6f 6e 6c  jc!=(6+isReadonl
124f0 79 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  y) ){.      Tcl_
12500 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
12510 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f  erp, 2, objv, "?
12520 2d 72 65 61 64 6f 6e 6c 79 3f 20 3f 44 42 3f 20  -readonly? ?DB? 
12530 54 41 42 4c 45 20 43 4f 4c 55 4d 4e 20 52 4f 57  TABLE COLUMN ROW
12540 49 44 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ID");.      retu
12550 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
12560 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a    }..    if( obj
12570 63 3d 3d 28 36 2b 69 73 52 65 61 64 6f 6e 6c 79  c==(6+isReadonly
12580 29 20 29 7b 0a 20 20 20 20 20 20 7a 44 62 20 3d  ) ){.      zDb =
12590 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
125a0 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 7d 0a 20  bjv[2]);.    }. 
125b0 20 20 20 7a 54 61 62 6c 65 20 3d 20 54 63 6c 5f     zTable = Tcl_
125c0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 6f  GetString(objv[o
125d0 62 6a 63 2d 33 5d 29 3b 0a 20 20 20 20 7a 43 6f  bjc-3]);.    zCo
125e0 6c 75 6d 6e 20 3d 20 54 63 6c 5f 47 65 74 53 74  lumn = Tcl_GetSt
125f0 72 69 6e 67 28 6f 62 6a 76 5b 6f 62 6a 63 2d 32  ring(objv[objc-2
12600 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 54 63 6c  ]);.    rc = Tcl
12610 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f  _GetWideIntFromO
12620 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
12630 6f 62 6a 63 2d 31 5d 2c 20 26 69 52 6f 77 29 3b  objc-1], &iRow);
12640 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43  ..    if( rc==TC
12650 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  L_OK ){.      rc
12660 20 3d 20 63 72 65 61 74 65 49 6e 63 72 62 6c 6f   = createIncrblo
12670 62 43 68 61 6e 6e 65 6c 28 0a 20 20 20 20 20 20  bChannel(.      
12680 20 20 20 20 69 6e 74 65 72 70 2c 20 70 44 62 2c      interp, pDb,
12690 20 7a 44 62 2c 20 7a 54 61 62 6c 65 2c 20 7a 43   zDb, zTable, zC
126a0 6f 6c 75 6d 6e 2c 20 69 52 6f 77 2c 20 69 73 52  olumn, iRow, isR
126b0 65 61 64 6f 6e 6c 79 0a 20 20 20 20 20 20 29 3b  eadonly.      );
126c0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
126d0 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
126e0 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20  /*.  **     $db 
126f0 69 6e 74 65 72 72 75 70 74 0a 20 20 2a 2a 0a 20  interrupt.  **. 
12700 20 2a 2a 20 49 6e 74 65 72 72 75 70 74 20 74 68   ** Interrupt th
12710 65 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74  e execution of t
12720 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 53 51  he inner-most SQ
12730 4c 20 69 6e 74 65 72 70 72 65 74 65 72 2e 20 20  L interpreter.  
12740 54 68 69 73 0a 20 20 2a 2a 20 63 61 75 73 65 73  This.  ** causes
12750 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
12760 6e 74 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20  nt to return an 
12770 65 72 72 6f 72 20 6f 66 20 53 51 4c 49 54 45 5f  error of SQLITE_
12780 49 4e 54 45 52 52 55 50 54 2e 0a 20 20 2a 2f 0a  INTERRUPT..  */.
12790 20 20 63 61 73 65 20 44 42 5f 49 4e 54 45 52 52    case DB_INTERR
127a0 55 50 54 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74  UPT: {.    sqlit
127b0 65 33 5f 69 6e 74 65 72 72 75 70 74 28 70 44 62  e3_interrupt(pDb
127c0 2d 3e 64 62 29 3b 0a 20 20 20 20 62 72 65 61 6b  ->db);.    break
127d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
127e0 20 20 20 20 20 24 64 62 20 6e 75 6c 6c 76 61 6c       $db nullval
127f0 75 65 20 3f 53 54 52 49 4e 47 3f 0a 20 20 2a 2a  ue ?STRING?.  **
12800 0a 20 20 2a 2a 20 43 68 61 6e 67 65 20 74 65 78  .  ** Change tex
12810 74 20 75 73 65 64 20 77 68 65 6e 20 61 20 4e 55  t used when a NU
12820 4c 4c 20 63 6f 6d 65 73 20 62 61 63 6b 20 66 72  LL comes back fr
12830 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  om the database.
12840 20 49 66 20 3f 53 54 52 49 4e 47 3f 0a 20 20 2a   If ?STRING?.  *
12850 2a 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74  * is not present
12860 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 72 65  , then the curre
12870 6e 74 20 73 74 72 69 6e 67 20 75 73 65 64 20 66  nt string used f
12880 6f 72 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  or NULL is retur
12890 6e 65 64 2e 0a 20 20 2a 2a 20 49 66 20 53 54 52  ned..  ** If STR
128a0 49 4e 47 20 69 73 20 70 72 65 73 65 6e 74 2c 20  ING is present, 
128b0 74 68 65 6e 20 53 54 52 49 4e 47 20 69 73 20 72  then STRING is r
128c0 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2a 0a 20 20  eturned..  **.  
128d0 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 4e 55 4c  */.  case DB_NUL
128e0 4c 56 41 4c 55 45 3a 20 7b 0a 20 20 20 20 69 66  LVALUE: {.    if
128f0 28 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a  ( objc!=2 && obj
12900 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=3 ){.      Tc
12910 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
12920 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
12930 22 4e 55 4c 4c 56 41 4c 55 45 22 29 3b 0a 20 20  "NULLVALUE");.  
12940 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
12950 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
12960 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20  if( objc==3 ){. 
12970 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20       int len;.  
12980 20 20 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c 20      char *zNull 
12990 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
129a0 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
129b0 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  &len);.      if(
129c0 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 29 7b 0a 20   pDb->zNull ){. 
129d0 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28         Tcl_Free(
129e0 70 44 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 20  pDb->zNull);.   
129f0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a     }.      if( z
12a00 4e 75 6c 6c 20 26 26 20 6c 65 6e 3e 30 20 29 7b  Null && len>0 ){
12a10 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e  .        pDb->zN
12a20 75 6c 6c 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28  ull = Tcl_Alloc(
12a30 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20   len + 1 );.    
12a40 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e      memcpy(pDb->
12a50 7a 4e 75 6c 6c 2c 20 7a 4e 75 6c 6c 2c 20 6c 65  zNull, zNull, le
12a60 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  n);.        pDb-
12a70 3e 7a 4e 75 6c 6c 5b 6c 65 6e 5d 20 3d 20 27 5c  >zNull[len] = '\
12a80 30 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  0';.      }else{
12a90 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e  .        pDb->zN
12aa0 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ull = 0;.      }
12ab0 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 53  .    }.    Tcl_S
12ac0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
12ad0 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  rp, Tcl_NewStrin
12ae0 67 4f 62 6a 28 70 44 62 2d 3e 7a 4e 75 6c 6c 2c  gObj(pDb->zNull,
12af0 20 2d 31 29 29 3b 0a 20 20 20 20 62 72 65 61 6b   -1));.    break
12b00 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
12b10 20 20 20 20 20 24 64 62 20 6c 61 73 74 5f 69 6e       $db last_in
12b20 73 65 72 74 5f 72 6f 77 69 64 20 0a 20 20 2a 2a  sert_rowid .  **
12b30 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20  .  ** Return an 
12b40 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
12b50 20 74 68 65 20 52 4f 57 49 44 20 66 6f 72 20 74   the ROWID for t
12b60 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 69  he most recent i
12b70 6e 73 65 72 74 2e 0a 20 20 2a 2f 0a 20 20 63 61  nsert..  */.  ca
12b80 73 65 20 44 42 5f 4c 41 53 54 5f 49 4e 53 45 52  se DB_LAST_INSER
12b90 54 5f 52 4f 57 49 44 3a 20 7b 0a 20 20 20 20 54  T_ROWID: {.    T
12ba0 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b  cl_Obj *pResult;
12bb0 0a 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74  .    Tcl_WideInt
12bc0 20 72 6f 77 69 64 3b 0a 20 20 20 20 69 66 28 20   rowid;.    if( 
12bd0 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 20  objc!=2 ){.     
12be0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
12bf0 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
12c00 76 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 72 65  v, "");.      re
12c10 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
12c20 20 20 20 20 7d 0a 20 20 20 20 72 6f 77 69 64 20      }.    rowid 
12c30 3d 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69  = sqlite3_last_i
12c40 6e 73 65 72 74 5f 72 6f 77 69 64 28 70 44 62 2d  nsert_rowid(pDb-
12c50 3e 64 62 29 3b 0a 20 20 20 20 70 52 65 73 75 6c  >db);.    pResul
12c60 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65  t = Tcl_GetObjRe
12c70 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
12c80 20 20 54 63 6c 5f 53 65 74 57 69 64 65 49 6e 74    Tcl_SetWideInt
12c90 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 72 6f 77  Obj(pResult, row
12ca0 69 64 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  id);.    break;.
12cb0 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54    }..  /*.  ** T
12cc0 68 65 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 20  he DB_ONECOLUMN 
12cd0 6d 65 74 68 6f 64 20 69 73 20 69 6d 70 6c 65 6d  method is implem
12ce0 65 6e 74 65 64 20 74 6f 67 65 74 68 65 72 20 77  ented together w
12cf0 69 74 68 20 44 42 5f 45 58 49 53 54 53 2e 0a 20  ith DB_EXISTS.. 
12d00 20 2a 2f 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62   */..  /*    $db
12d10 20 70 72 6f 67 72 65 73 73 20 3f 4e 20 43 41 4c   progress ?N CAL
12d20 4c 42 41 43 4b 3f 0a 20 20 2a 2a 20 0a 20 20 2a  LBACK?.  ** .  *
12d30 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76  * Invoke the giv
12d40 65 6e 20 63 61 6c 6c 62 61 63 6b 20 65 76 65 72  en callback ever
12d50 79 20 4e 20 76 69 72 74 75 61 6c 20 6d 61 63 68  y N virtual mach
12d60 69 6e 65 20 6f 70 63 6f 64 65 73 20 77 68 69 6c  ine opcodes whil
12d70 65 20 65 78 65 63 75 74 69 6e 67 0a 20 20 2a 2a  e executing.  **
12d80 20 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20   queries..  */. 
12d90 20 63 61 73 65 20 44 42 5f 50 52 4f 47 52 45 53   case DB_PROGRES
12da0 53 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a  S: {.    if( obj
12db0 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66  c==2 ){.      if
12dc0 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73  ( pDb->zProgress
12dd0 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
12de0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
12df0 65 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f 67 72  erp, pDb->zProgr
12e00 65 73 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ess, 0);.      }
12e10 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
12e20 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20  bjc==4 ){.      
12e30 63 68 61 72 20 2a 7a 50 72 6f 67 72 65 73 73 3b  char *zProgress;
12e40 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  .      int len;.
12e50 20 20 20 20 20 20 69 6e 74 20 4e 3b 0a 20 20 20        int N;.   
12e60 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54     if( TCL_OK!=T
12e70 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
12e80 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
12e90 2c 20 26 4e 29 20 29 7b 0a 20 20 20 20 20 20 20  , &N) ){.       
12ea0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
12eb0 52 3b 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  R;.      };.    
12ec0 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67    if( pDb->zProg
12ed0 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ress ){.        
12ee0 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 50  Tcl_Free(pDb->zP
12ef0 72 6f 67 72 65 73 73 29 3b 0a 20 20 20 20 20 20  rogress);.      
12f00 7d 0a 20 20 20 20 20 20 7a 50 72 6f 67 72 65 73  }.      zProgres
12f10 73 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  s = Tcl_GetStrin
12f20 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d  gFromObj(objv[3]
12f30 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69  , &len);.      i
12f40 66 28 20 7a 50 72 6f 67 72 65 73 73 20 26 26 20  f( zProgress && 
12f50 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  len>0 ){.       
12f60 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20   pDb->zProgress 
12f70 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e  = Tcl_Alloc( len
12f80 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20   + 1 );.        
12f90 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 50 72 6f  memcpy(pDb->zPro
12fa0 67 72 65 73 73 2c 20 7a 50 72 6f 67 72 65 73 73  gress, zProgress
12fb0 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20  , len+1);.      
12fc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
12fd0 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 3d 20  Db->zProgress = 
12fe0 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64  0;.      }.#ifnd
12ff0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
13000 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b  ROGRESS_CALLBACK
13010 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
13020 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20  zProgress ){.   
13030 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70       pDb->interp
13040 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20   = interp;.     
13050 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 67 72     sqlite3_progr
13060 65 73 73 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d  ess_handler(pDb-
13070 3e 64 62 2c 20 4e 2c 20 44 62 50 72 6f 67 72 65  >db, N, DbProgre
13080 73 73 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b  ssHandler, pDb);
13090 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
130a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72        sqlite3_pr
130b0 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 70  ogress_handler(p
130c0 44 62 2d 3e 64 62 2c 20 30 2c 20 30 2c 20 30 29  Db->db, 0, 0, 0)
130d0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
130e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
130f0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
13100 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
13110 6a 76 2c 20 22 4e 20 43 41 4c 4c 42 41 43 4b 22  jv, "N CALLBACK"
13120 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
13130 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
13140 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
13150 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 70 72 6f  .  /*    $db pro
13160 66 69 6c 65 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a  file ?CALLBACK?.
13170 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 61    **.  ** Make a
13180 72 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20 69  rrangements to i
13190 6e 76 6f 6b 65 20 74 68 65 20 43 41 4c 4c 42 41  nvoke the CALLBA
131a0 43 4b 20 72 6f 75 74 69 6e 65 20 61 66 74 65 72  CK routine after
131b0 20 65 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d   each SQL statem
131c0 65 6e 74 0a 20 20 2a 2a 20 74 68 61 74 20 68 61  ent.  ** that ha
131d0 73 20 72 75 6e 2e 20 20 54 68 65 20 74 65 78 74  s run.  The text
131e0 20 6f 66 20 74 68 65 20 53 51 4c 20 61 6e 64 20   of the SQL and 
131f0 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 65 6c  the amount of el
13200 61 70 73 65 20 74 69 6d 65 20 61 72 65 0a 20 20  apse time are.  
13210 2a 2a 20 61 70 70 65 6e 64 65 64 20 74 6f 20 43  ** appended to C
13220 41 4c 4c 42 41 43 4b 20 62 65 66 6f 72 65 20 74  ALLBACK before t
13230 68 65 20 73 63 72 69 70 74 20 69 73 20 72 75 6e  he script is run
13240 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
13250 5f 50 52 4f 46 49 4c 45 3a 20 7b 0a 20 20 20 20  _PROFILE: {.    
13260 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20  if( objc>3 ){.  
13270 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
13280 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
13290 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b  objv, "?CALLBACK
132a0 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ?");.      retur
132b0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
132c0 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d   }else if( objc=
132d0 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =2 ){.      if( 
132e0 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b  pDb->zProfile ){
132f0 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70  .        Tcl_App
13300 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
13310 2c 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c  , pDb->zProfile,
13320 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
13330 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
13340 61 72 20 2a 7a 50 72 6f 66 69 6c 65 3b 0a 20 20  ar *zProfile;.  
13350 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
13360 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f     if( pDb->zPro
13370 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  file ){.        
13380 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 50  Tcl_Free(pDb->zP
13390 72 6f 66 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d  rofile);.      }
133a0 0a 20 20 20 20 20 20 7a 50 72 6f 66 69 6c 65 20  .      zProfile 
133b0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
133c0 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
133d0 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  &len);.      if(
133e0 20 7a 50 72 6f 66 69 6c 65 20 26 26 20 6c 65 6e   zProfile && len
133f0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  >0 ){.        pD
13400 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 3d 20 54 63  b->zProfile = Tc
13410 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31  l_Alloc( len + 1
13420 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   );.        memc
13430 70 79 28 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65  py(pDb->zProfile
13440 2c 20 7a 50 72 6f 66 69 6c 65 2c 20 6c 65 6e 2b  , zProfile, len+
13450 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
13460 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50  .        pDb->zP
13470 72 6f 66 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20  rofile = 0;.    
13480 20 20 7d 0a 23 69 66 20 21 64 65 66 69 6e 65 64    }.#if !defined
13490 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41  (SQLITE_OMIT_TRA
134a0 43 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  CE) && !defined(
134b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
134c0 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20  TING_POINT).    
134d0 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66    if( pDb->zProf
134e0 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ile ){.        p
134f0 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74  Db->interp = int
13500 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  erp;.        sql
13510 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 70 44 62  ite3_profile(pDb
13520 2d 3e 64 62 2c 20 44 62 50 72 6f 66 69 6c 65 48  ->db, DbProfileH
13530 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20  andler, pDb);.  
13540 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13550 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 66 69     sqlite3_profi
13560 6c 65 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30  le(pDb->db, 0, 0
13570 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
13580 66 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  f.    }.    brea
13590 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
135a0 2a 20 20 20 20 20 24 64 62 20 72 65 6b 65 79 20  *     $db rekey 
135b0 4b 45 59 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 68  KEY.  **.  ** Ch
135c0 61 6e 67 65 20 74 68 65 20 65 6e 63 72 79 70 74  ange the encrypt
135d0 69 6f 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 63  ion key on the c
135e0 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 64 61  urrently open da
135f0 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63  tabase..  */.  c
13600 61 73 65 20 44 42 5f 52 45 4b 45 59 3a 20 7b 0a  ase DB_REKEY: {.
13610 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
13620 53 5f 43 4f 44 45 43 0a 20 20 20 20 69 6e 74 20  S_CODEC.    int 
13630 6e 4b 65 79 3b 0a 20 20 20 20 76 6f 69 64 20 2a  nKey;.    void *
13640 70 4b 65 79 3b 0a 23 65 6e 64 69 66 0a 20 20 20  pKey;.#endif.   
13650 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
13660 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
13670 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
13680 2c 20 6f 62 6a 76 2c 20 22 4b 45 59 22 29 3b 0a  , objv, "KEY");.
13690 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
136a0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 69  _ERROR;.    }.#i
136b0 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
136c0 43 4f 44 45 43 0a 20 20 20 20 70 4b 65 79 20 3d  CODEC.    pKey =
136d0 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61   Tcl_GetByteArra
136e0 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  yFromObj(objv[2]
136f0 2c 20 26 6e 4b 65 79 29 3b 0a 20 20 20 20 72 63  , &nKey);.    rc
13700 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 6b 65 79   = sqlite3_rekey
13710 28 70 44 62 2d 3e 64 62 2c 20 70 4b 65 79 2c 20  (pDb->db, pKey, 
13720 6e 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20 72  nKey);.    if( r
13730 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  c ){.      Tcl_A
13740 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
13750 72 70 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 73  rp, sqlite3_errs
13760 74 72 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20  tr(rc), 0);.    
13770 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52    rc = TCL_ERROR
13780 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
13790 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
137a0 20 2f 2a 20 20 20 20 24 64 62 20 72 65 73 74 6f   /*    $db resto
137b0 72 65 20 3f 44 41 54 41 42 41 53 45 3f 20 46 49  re ?DATABASE? FI
137c0 4c 45 4e 41 4d 45 0a 20 20 2a 2a 0a 20 20 2a 2a  LENAME.  **.  **
137d0 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73 65   Open a database
137e0 20 66 69 6c 65 20 6e 61 6d 65 64 20 46 49 4c 45   file named FILE
137f0 4e 41 4d 45 2e 20 20 54 72 61 6e 73 66 65 72 20  NAME.  Transfer 
13800 74 68 65 20 63 6f 6e 74 65 6e 74 20 0a 20 20 2a  the content .  *
13810 2a 20 6f 66 20 46 49 4c 45 4e 41 4d 45 20 69 6e  * of FILENAME in
13820 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 64 61 74  to the local dat
13830 61 62 61 73 65 20 44 41 54 41 42 41 53 45 20 28  abase DATABASE (
13840 64 65 66 61 75 6c 74 3a 20 22 6d 61 69 6e 22 29  default: "main")
13850 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
13860 5f 52 45 53 54 4f 52 45 3a 20 7b 0a 20 20 20 20  _RESTORE: {.    
13870 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 72 63  const char *zSrc
13880 46 69 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  File;.    const 
13890 63 68 61 72 20 2a 7a 44 65 73 74 44 62 3b 0a 20  char *zDestDb;. 
138a0 20 20 20 73 71 6c 69 74 65 33 20 2a 70 53 72 63     sqlite3 *pSrc
138b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61  ;.    sqlite3_ba
138c0 63 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b 0a 20  ckup *pBackup;. 
138d0 20 20 20 69 6e 74 20 6e 54 69 6d 65 6f 75 74 20     int nTimeout 
138e0 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 6f 62  = 0;..    if( ob
138f0 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 7a  jc==3 ){.      z
13900 44 65 73 74 44 62 20 3d 20 22 6d 61 69 6e 22 3b  DestDb = "main";
13910 0a 20 20 20 20 20 20 7a 53 72 63 46 69 6c 65 20  .      zSrcFile 
13920 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
13930 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 7d 65  objv[2]);.    }e
13940 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20  lse if( objc==4 
13950 29 7b 0a 20 20 20 20 20 20 7a 44 65 73 74 44 62  ){.      zDestDb
13960 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
13970 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 20  (objv[2]);.     
13980 20 7a 53 72 63 46 69 6c 65 20 3d 20 54 63 6c 5f   zSrcFile = Tcl_
13990 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33  GetString(objv[3
139a0 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
139b0 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
139c0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
139d0 20 6f 62 6a 76 2c 20 22 3f 44 41 54 41 42 41 53   objv, "?DATABAS
139e0 45 3f 20 46 49 4c 45 4e 41 4d 45 22 29 3b 0a 20  E? FILENAME");. 
139f0 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
13a00 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
13a10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70   rc = sqlite3_op
13a20 65 6e 5f 76 32 28 7a 53 72 63 46 69 6c 65 2c 20  en_v2(zSrcFile, 
13a30 26 70 53 72 63 2c 20 53 51 4c 49 54 45 5f 4f 50  &pSrc, SQLITE_OP
13a40 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c 20 30 29 3b  EN_READONLY, 0);
13a50 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
13a60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
13a70 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
13a80 28 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74  (interp, "cannot
13a90 20 6f 70 65 6e 20 73 6f 75 72 63 65 20 64 61 74   open source dat
13aa0 61 62 61 73 65 3a 20 22 2c 0a 20 20 20 20 20 20  abase: ",.      
13ab0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72       sqlite3_err
13ac0 6d 73 67 28 70 53 72 63 29 2c 20 28 63 68 61 72  msg(pSrc), (char
13ad0 2a 29 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  *)0);.      sqli
13ae0 74 65 33 5f 63 6c 6f 73 65 28 70 53 72 63 29 3b  te3_close(pSrc);
13af0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
13b00 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
13b10 20 20 20 70 42 61 63 6b 75 70 20 3d 20 73 71 6c     pBackup = sql
13b20 69 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69 74  ite3_backup_init
13b30 28 70 44 62 2d 3e 64 62 2c 20 7a 44 65 73 74 44  (pDb->db, zDestD
13b40 62 2c 20 70 53 72 63 2c 20 22 6d 61 69 6e 22 29  b, pSrc, "main")
13b50 3b 0a 20 20 20 20 69 66 28 20 70 42 61 63 6b 75  ;.    if( pBacku
13b60 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63  p==0 ){.      Tc
13b70 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
13b80 6e 74 65 72 70 2c 20 22 72 65 73 74 6f 72 65 20  nterp, "restore 
13b90 66 61 69 6c 65 64 3a 20 22 2c 0a 20 20 20 20 20  failed: ",.     
13ba0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72        sqlite3_er
13bb0 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 28  rmsg(pDb->db), (
13bc0 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
13bd0 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 53  sqlite3_close(pS
13be0 72 63 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  rc);.      retur
13bf0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
13c00 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 28 72   }.    while( (r
13c10 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  c = sqlite3_back
13c20 75 70 5f 73 74 65 70 28 70 42 61 63 6b 75 70 2c  up_step(pBackup,
13c30 31 30 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  100))==SQLITE_OK
13c40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  .              |
13c50 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  | rc==SQLITE_BUS
13c60 59 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72  Y ){.      if( r
13c70 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c==SQLITE_BUSY )
13c80 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 54  {.        if( nT
13c90 69 6d 65 6f 75 74 2b 2b 20 3e 3d 20 33 20 29 20  imeout++ >= 3 ) 
13ca0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 73  break;.        s
13cb0 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 31 30 30  qlite3_sleep(100
13cc0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
13cd0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63  .    sqlite3_bac
13ce0 6b 75 70 5f 66 69 6e 69 73 68 28 70 42 61 63 6b  kup_finish(pBack
13cf0 75 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  up);.    if( rc=
13d00 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
13d10 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f        rc = TCL_O
13d20 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  K;.    }else if(
13d30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
13d40 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4c   || rc==SQLITE_L
13d50 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 20 20 54  OCKED ){.      T
13d60 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
13d70 69 6e 74 65 72 70 2c 20 22 72 65 73 74 6f 72 65  interp, "restore
13d80 20 66 61 69 6c 65 64 3a 20 73 6f 75 72 63 65 20   failed: source 
13d90 64 61 74 61 62 61 73 65 20 62 75 73 79 22 2c 0a  database 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 20 28 63 68 61 72 2a 29 30 29         (char*)0)
13dc0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c  ;.      rc = TCL
13dd0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73  _ERROR;.    }els
13de0 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  e{.      Tcl_App
13df0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
13e00 2c 20 22 72 65 73 74 6f 72 65 20 66 61 69 6c 65  , "restore faile
13e10 64 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d: ",.          
13e20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
13e30 70 44 62 2d 3e 64 62 29 2c 20 28 63 68 61 72 2a  pDb->db), (char*
13e40 29 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  )0);.      rc = 
13e50 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
13e60 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f  .    sqlite3_clo
13e70 73 65 28 70 53 72 63 29 3b 0a 20 20 20 20 62 72  se(pSrc);.    br
13e80 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
13e90 20 2a 2a 20 20 20 20 20 24 64 62 20 73 74 61 74   **     $db stat
13ea0 75 73 20 28 73 74 65 70 7c 73 6f 72 74 7c 61 75  us (step|sort|au
13eb0 74 6f 69 6e 64 65 78 29 0a 20 20 2a 2a 0a 20 20  toindex).  **.  
13ec0 2a 2a 20 44 69 73 70 6c 61 79 20 53 51 4c 49 54  ** Display SQLIT
13ed0 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c  E_STMTSTATUS_FUL
13ee0 4c 53 43 41 4e 5f 53 54 45 50 20 6f 72 20 0a 20  LSCAN_STEP or . 
13ef0 20 2a 2a 20 53 51 4c 49 54 45 5f 53 54 4d 54 53   ** SQLITE_STMTS
13f00 54 41 54 55 53 5f 53 4f 52 54 20 66 6f 72 20 74  TATUS_SORT for t
13f10 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 65  he most recent e
13f20 76 61 6c 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  val..  */.  case
13f30 20 44 42 5f 53 54 41 54 55 53 3a 20 7b 0a 20 20   DB_STATUS: {.  
13f40 20 20 69 6e 74 20 76 3b 0a 20 20 20 20 63 6f 6e    int v;.    con
13f50 73 74 20 63 68 61 72 20 2a 7a 4f 70 3b 0a 20 20  st char *zOp;.  
13f60 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
13f70 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
13f80 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
13f90 32 2c 20 6f 62 6a 76 2c 20 22 28 73 74 65 70 7c  2, objv, "(step|
13fa0 73 6f 72 74 7c 61 75 74 6f 69 6e 64 65 78 29 22  sort|autoindex)"
13fb0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
13fc0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
13fd0 0a 20 20 20 20 7a 4f 70 20 3d 20 54 63 6c 5f 47  .    zOp = Tcl_G
13fe0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
13ff0 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  );.    if( strcm
14000 70 28 7a 4f 70 2c 20 22 73 74 65 70 22 29 3d 3d  p(zOp, "step")==
14010 30 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 70  0 ){.      v = p
14020 44 62 2d 3e 6e 53 74 65 70 3b 0a 20 20 20 20 7d  Db->nStep;.    }
14030 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
14040 7a 4f 70 2c 20 22 73 6f 72 74 22 29 3d 3d 30 20  zOp, "sort")==0 
14050 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 44 62  ){.      v = pDb
14060 2d 3e 6e 53 6f 72 74 3b 0a 20 20 20 20 7d 65 6c  ->nSort;.    }el
14070 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4f  se if( strcmp(zO
14080 70 2c 20 22 61 75 74 6f 69 6e 64 65 78 22 29 3d  p, "autoindex")=
14090 3d 30 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20  =0 ){.      v = 
140a0 70 44 62 2d 3e 6e 49 6e 64 65 78 3b 0a 20 20 20  pDb->nIndex;.   
140b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63   }else{.      Tc
140c0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
140d0 6e 74 65 72 70 2c 20 0a 20 20 20 20 20 20 20 20  nterp, .        
140e0 20 20 20 20 22 62 61 64 20 61 72 67 75 6d 65 6e      "bad argumen
140f0 74 3a 20 73 68 6f 75 6c 64 20 62 65 20 61 75 74  t: should be aut
14100 6f 69 6e 64 65 78 2c 20 73 74 65 70 2c 20 6f 72  oindex, step, or
14110 20 73 6f 72 74 22 2c 20 0a 20 20 20 20 20 20 20   sort", .       
14120 20 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a       (char*)0);.
14130 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
14140 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
14150 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
14160 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
14170 65 77 49 6e 74 4f 62 6a 28 76 29 29 3b 0a 20 20  ewIntObj(v));.  
14180 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 0a    break;.  }.  .
14190 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64    /*.  **     $d
141a0 62 20 74 69 6d 65 6f 75 74 20 4d 49 4c 4c 45 53  b timeout MILLES
141b0 45 43 4f 4e 44 53 0a 20 20 2a 2a 0a 20 20 2a 2a  ECONDS.  **.  **
141c0 20 44 65 6c 61 79 20 66 6f 72 20 74 68 65 20 6e   Delay for the n
141d0 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65  umber of millise
141e0 63 6f 6e 64 73 20 73 70 65 63 69 66 69 65 64 20  conds specified 
141f0 77 68 65 6e 20 61 20 66 69 6c 65 20 69 73 20 6c  when a file is l
14200 6f 63 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61  ocked..  */.  ca
14210 73 65 20 44 42 5f 54 49 4d 45 4f 55 54 3a 20 7b  se DB_TIMEOUT: {
14220 0a 20 20 20 20 69 6e 74 20 6d 73 3b 0a 20 20 20  .    int ms;.   
14230 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
14240 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
14250 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
14260 2c 20 6f 62 6a 76 2c 20 22 4d 49 4c 4c 49 53 45  , objv, "MILLISE
14270 43 4f 4e 44 53 22 29 3b 0a 20 20 20 20 20 20 72  CONDS");.      r
14280 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
14290 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 54  .    }.    if( T
142a0 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
142b0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
142c0 2c 20 26 6d 73 29 20 29 20 72 65 74 75 72 6e 20  , &ms) ) return 
142d0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73  TCL_ERROR;.    s
142e0 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65  qlite3_busy_time
142f0 6f 75 74 28 70 44 62 2d 3e 64 62 2c 20 6d 73 29  out(pDb->db, ms)
14300 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
14310 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20  .  .  /*.  **   
14320 20 20 24 64 62 20 74 6f 74 61 6c 5f 63 68 61 6e    $db total_chan
14330 67 65 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  ges.  **.  ** Re
14340 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
14350 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 65 72  of rows that wer
14360 65 20 6d 6f 64 69 66 69 65 64 2c 20 69 6e 73 65  e modified, inse
14370 72 74 65 64 2c 20 6f 72 20 64 65 6c 65 74 65 64  rted, or deleted
14380 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65   .  ** since the
14390 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
143a0 20 77 61 73 20 63 72 65 61 74 65 64 2e 0a 20 20   was created..  
143b0 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54 4f 54  */.  case DB_TOT
143c0 41 4c 5f 43 48 41 4e 47 45 53 3a 20 7b 0a 20 20  AL_CHANGES: {.  
143d0 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75    Tcl_Obj *pResu
143e0 6c 74 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  lt;.    if( objc
143f0 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=2 ){.      Tcl
14400 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
14410 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
14420 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
14430 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
14440 7d 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20  }.    pResult = 
14450 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_GetObjResult
14460 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63  (interp);.    Tc
14470 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52 65 73  l_SetIntObj(pRes
14480 75 6c 74 2c 20 73 71 6c 69 74 65 33 5f 74 6f 74  ult, sqlite3_tot
14490 61 6c 5f 63 68 61 6e 67 65 73 28 70 44 62 2d 3e  al_changes(pDb->
144a0 64 62 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  db));.    break;
144b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
144c0 62 20 74 72 61 63 65 20 3f 43 41 4c 4c 42 41 43  b trace ?CALLBAC
144d0 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b  K?.  **.  ** Mak
144e0 65 20 61 72 72 61 6e 67 65 6d 65 6e 74 73 20 74  e arrangements t
144f0 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 43 41 4c  o invoke the CAL
14500 4c 42 41 43 4b 20 72 6f 75 74 69 6e 65 20 66 6f  LBACK routine fo
14510 72 20 65 61 63 68 20 53 51 4c 20 73 74 61 74 65  r each SQL state
14520 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 61 74 20 69  ment.  ** that i
14530 73 20 65 78 65 63 75 74 65 64 2e 20 20 54 68 65  s executed.  The
14540 20 74 65 78 74 20 6f 66 20 74 68 65 20 53 51 4c   text of the SQL
14550 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20   is appended to 
14560 43 41 4c 4c 42 41 43 4b 20 62 65 66 6f 72 65 0a  CALLBACK before.
14570 20 20 2a 2a 20 69 74 20 69 73 20 65 78 65 63 75    ** it is execu
14580 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ted..  */.  case
14590 20 44 42 5f 54 52 41 43 45 3a 20 7b 0a 20 20 20   DB_TRACE: {.   
145a0 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20   if( objc>3 ){. 
145b0 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
145c0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
145d0 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43   objv, "?CALLBAC
145e0 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  K?");.      retu
145f0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
14600 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63    }else if( objc
14610 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==2 ){.      if(
14620 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a   pDb->zTrace ){.
14630 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
14640 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
14650 20 70 44 62 2d 3e 7a 54 72 61 63 65 2c 20 30 29   pDb->zTrace, 0)
14660 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
14670 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20  lse{.      char 
14680 2a 7a 54 72 61 63 65 3b 0a 20 20 20 20 20 20 69  *zTrace;.      i
14690 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66  nt len;.      if
146a0 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b  ( pDb->zTrace ){
146b0 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65  .        Tcl_Fre
146c0 65 28 70 44 62 2d 3e 7a 54 72 61 63 65 29 3b 0a  e(pDb->zTrace);.
146d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54        }.      zT
146e0 72 61 63 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  race = Tcl_GetSt
146f0 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
14700 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20  [2], &len);.    
14710 20 20 69 66 28 20 7a 54 72 61 63 65 20 26 26 20    if( zTrace && 
14720 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  len>0 ){.       
14730 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 3d 20 54   pDb->zTrace = T
14740 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20  cl_Alloc( len + 
14750 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  1 );.        mem
14760 63 70 79 28 70 44 62 2d 3e 7a 54 72 61 63 65 2c  cpy(pDb->zTrace,
14770 20 7a 54 72 61 63 65 2c 20 6c 65 6e 2b 31 29 3b   zTrace, len+1);
14780 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
14790 20 20 20 20 20 20 70 44 62 2d 3e 7a 54 72 61 63        pDb->zTrac
147a0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23  e = 0;.      }.#
147b0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
147c0 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26  TE_OMIT_TRACE) &
147d0 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
147e0 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
147f0 50 4f 49 4e 54 29 0a 20 20 20 20 20 20 69 66 28  POINT).      if(
14800 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a   pDb->zTrace ){.
14810 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74          pDb->int
14820 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20  erp = interp;.  
14830 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 72        sqlite3_tr
14840 61 63 65 28 70 44 62 2d 3e 64 62 2c 20 44 62 54  ace(pDb->db, DbT
14850 72 61 63 65 48 61 6e 64 6c 65 72 2c 20 70 44 62  raceHandler, pDb
14860 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
14870 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
14880 74 72 61 63 65 28 70 44 62 2d 3e 64 62 2c 20 30  trace(pDb->db, 0
14890 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  , 0);.      }.#e
148a0 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 62  ndif.    }.    b
148b0 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
148c0 20 20 20 24 64 62 20 74 72 61 6e 73 61 63 74 69     $db transacti
148d0 6f 6e 20 5b 2d 64 65 66 65 72 72 65 64 7c 2d 69  on [-deferred|-i
148e0 6d 6d 65 64 69 61 74 65 7c 2d 65 78 63 6c 75 73  mmediate|-exclus
148f0 69 76 65 5d 20 53 43 52 49 50 54 0a 20 20 2a 2a  ive] SCRIPT.  **
14900 0a 20 20 2a 2a 20 53 74 61 72 74 20 61 20 6e 65  .  ** Start a ne
14910 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69  w transaction (i
14920 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72  f we are not alr
14930 65 61 64 79 20 69 6e 20 74 68 65 20 6d 69 64 73  eady in the mids
14940 74 20 6f 66 20 61 0a 20 20 2a 2a 20 74 72 61 6e  t of a.  ** tran
14950 73 61 63 74 69 6f 6e 29 20 61 6e 64 20 65 78 65  saction) and exe
14960 63 75 74 65 20 74 68 65 20 54 43 4c 20 73 63 72  cute the TCL scr
14970 69 70 74 20 53 43 52 49 50 54 2e 20 20 41 66 74  ipt SCRIPT.  Aft
14980 65 72 20 53 43 52 49 50 54 0a 20 20 2a 2a 20 63  er SCRIPT.  ** c
14990 6f 6d 70 6c 65 74 65 73 2c 20 65 69 74 68 65 72  ompletes, either
149a0 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   commit the tran
149b0 73 61 63 74 69 6f 6e 20 6f 72 20 72 6f 6c 6c 20  saction or roll 
149c0 69 74 20 62 61 63 6b 20 69 66 20 53 43 52 49 50  it back if SCRIP
149d0 54 0a 20 20 2a 2a 20 74 68 72 6f 77 73 20 61 6e  T.  ** throws an
149e0 20 65 78 63 65 70 74 69 6f 6e 2e 20 20 4f 72 20   exception.  Or 
149f0 69 66 20 6e 6f 20 6e 65 77 20 74 72 61 6e 73 61  if no new transa
14a00 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64  tion was started
14a10 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 20 20  , do nothing..  
14a20 2a 2a 20 70 61 73 73 20 74 68 65 20 65 78 63 65  ** pass the exce
14a30 70 74 69 6f 6e 20 6f 6e 20 75 70 20 74 68 65 20  ption on up the 
14a40 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  stack..  **.  **
14a50 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 77 61   This command wa
14a60 73 20 69 6e 73 70 69 72 65 64 20 62 79 20 44 61  s inspired by Da
14a70 76 65 20 54 68 6f 6d 61 73 27 73 20 74 61 6c 6b  ve Thomas's talk
14a80 20 6f 6e 20 52 75 62 79 20 61 74 20 74 68 65 0a   on Ruby at the.
14a90 20 20 2a 2a 20 32 30 30 35 20 4f 27 52 65 69 6c    ** 2005 O'Reil
14aa0 6c 79 20 4f 70 65 6e 20 53 6f 75 72 63 65 20 43  ly Open Source C
14ab0 6f 6e 76 65 6e 74 69 6f 6e 20 28 4f 53 43 4f 4e  onvention (OSCON
14ac0 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  )..  */.  case D
14ad0 42 5f 54 52 41 4e 53 41 43 54 49 4f 4e 3a 20 7b  B_TRANSACTION: {
14ae0 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53  .    Tcl_Obj *pS
14af0 63 72 69 70 74 3b 0a 20 20 20 20 63 6f 6e 73 74  cript;.    const
14b00 20 63 68 61 72 20 2a 7a 42 65 67 69 6e 20 3d 20   char *zBegin = 
14b10 22 53 41 56 45 50 4f 49 4e 54 20 5f 74 63 6c 5f  "SAVEPOINT _tcl_
14b20 74 72 61 6e 73 61 63 74 69 6f 6e 22 3b 0a 20 20  transaction";.  
14b30 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26    if( objc!=3 &&
14b40 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
14b50 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
14b60 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
14b70 6a 76 2c 20 22 5b 54 59 50 45 5d 20 53 43 52 49  jv, "[TYPE] SCRI
14b80 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  PT");.      retu
14b90 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
14ba0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 44 62    }..    if( pDb
14bb0 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  ->nTransaction==
14bc0 30 20 26 26 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a  0 && objc==4 ){.
14bd0 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
14be0 73 74 20 63 68 61 72 20 2a 54 54 59 50 45 5f 73  st char *TTYPE_s
14bf0 74 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  trs[] = {.      
14c00 20 20 22 64 65 66 65 72 72 65 64 22 2c 20 20 20    "deferred",   
14c10 22 65 78 63 6c 75 73 69 76 65 22 2c 20 20 22 69  "exclusive",  "i
14c20 6d 6d 65 64 69 61 74 65 22 2c 20 30 0a 20 20 20  mmediate", 0.   
14c30 20 20 20 7d 3b 0a 20 20 20 20 20 20 65 6e 75 6d     };.      enum
14c40 20 54 54 59 50 45 5f 65 6e 75 6d 20 7b 0a 20 20   TTYPE_enum {.  
14c50 20 20 20 20 20 20 54 54 59 50 45 5f 44 45 46 45        TTYPE_DEFE
14c60 52 52 45 44 2c 20 54 54 59 50 45 5f 45 58 43 4c  RRED, TTYPE_EXCL
14c70 55 53 49 56 45 2c 20 54 54 59 50 45 5f 49 4d 4d  USIVE, TTYPE_IMM
14c80 45 44 49 41 54 45 0a 20 20 20 20 20 20 7d 3b 0a  EDIATE.      };.
14c90 20 20 20 20 20 20 69 6e 74 20 74 74 79 70 65 3b        int ttype;
14ca0 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47  .      if( Tcl_G
14cb0 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69  etIndexFromObj(i
14cc0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
14cd0 54 54 59 50 45 5f 73 74 72 73 2c 20 22 74 72 61  TTYPE_strs, "tra
14ce0 6e 73 61 63 74 69 6f 6e 20 74 79 70 65 22 2c 0a  nsaction 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 20 30 2c                0,
14d10 20 26 74 74 79 70 65 29 20 29 7b 0a 20 20 20 20   &ttype) ){.    
14d20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
14d30 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
14d40 20 20 20 20 73 77 69 74 63 68 28 20 28 65 6e 75      switch( (enu
14d50 6d 20 54 54 59 50 45 5f 65 6e 75 6d 29 74 74 79  m TTYPE_enum)tty
14d60 70 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61  pe ){.        ca
14d70 73 65 20 54 54 59 50 45 5f 44 45 46 45 52 52 45  se TTYPE_DEFERRE
14d80 44 3a 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a  D:    /* no-op *
14d90 2f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /;              
14da0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
14db0 20 20 63 61 73 65 20 54 54 59 50 45 5f 45 58 43    case TTYPE_EXC
14dc0 4c 55 53 49 56 45 3a 20 20 20 7a 42 65 67 69 6e  LUSIVE:   zBegin
14dd0 20 3d 20 22 42 45 47 49 4e 20 45 58 43 4c 55 53   = "BEGIN EXCLUS
14de0 49 56 45 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  IVE";  break;.  
14df0 20 20 20 20 20 20 63 61 73 65 20 54 54 59 50 45        case TTYPE
14e00 5f 49 4d 4d 45 44 49 41 54 45 3a 20 20 20 7a 42  _IMMEDIATE:   zB
14e10 65 67 69 6e 20 3d 20 22 42 45 47 49 4e 20 49 4d  egin = "BEGIN IM
14e20 4d 45 44 49 41 54 45 22 3b 20 20 62 72 65 61 6b  MEDIATE";  break
14e30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14e40 20 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62      pScript = ob
14e50 6a 76 5b 6f 62 6a 63 2d 31 5d 3b 0a 0a 20 20 20  jv[objc-1];..   
14e60 20 2f 2a 20 52 75 6e 20 74 68 65 20 53 51 4c 69   /* Run the SQLi
14e70 74 65 20 42 45 47 49 4e 20 63 6f 6d 6d 61 6e 64  te BEGIN command
14e80 20 74 6f 20 6f 70 65 6e 20 61 20 74 72 61 6e 73   to open a trans
14e90 61 63 74 69 6f 6e 20 6f 72 20 73 61 76 65 70 6f  action or savepo
14ea0 69 6e 74 2e 20 2a 2f 0a 20 20 20 20 70 44 62 2d  int. */.    pDb-
14eb0 3e 64 69 73 61 62 6c 65 41 75 74 68 2b 2b 3b 0a  >disableAuth++;.
14ec0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14ed0 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a  _exec(pDb->db, z
14ee0 42 65 67 69 6e 2c 20 30 2c 20 30 2c 20 30 29 3b  Begin, 0, 0, 0);
14ef0 0a 20 20 20 20 70 44 62 2d 3e 64 69 73 61 62 6c  .    pDb->disabl
14f00 65 41 75 74 68 2d 2d 3b 0a 20 20 20 20 69 66 28  eAuth--;.    if(
14f10 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14f20 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
14f30 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
14f40 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
14f50 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20  pDb->db), 0);.  
14f60 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
14f70 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
14f80 70 44 62 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pDb->nTransactio
14f90 6e 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  n++;..    /* If 
14fa0 75 73 69 6e 67 20 4e 52 45 2c 20 73 63 68 65 64  using NRE, sched
14fb0 75 6c 65 20 61 20 63 61 6c 6c 62 61 63 6b 20 74  ule a callback t
14fc0 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 73 63 72  o invoke the scr
14fd0 69 70 74 20 70 53 63 72 69 70 74 2c 20 74 68 65  ipt pScript, the
14fe0 6e 0a 20 20 20 20 2a 2a 20 61 20 73 65 63 6f 6e  n.    ** a secon
14ff0 64 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 63 6f  d callback to co
15000 6d 6d 69 74 20 28 6f 72 20 72 6f 6c 6c 62 61 63  mmit (or rollbac
15010 6b 29 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  k) the transacti
15020 6f 6e 20 6f 72 20 73 61 76 65 70 6f 69 6e 74 0a  on or savepoint.
15030 20 20 20 20 2a 2a 20 6f 70 65 6e 65 64 20 61 62      ** opened ab
15040 6f 76 65 2e 20 49 66 20 6e 6f 74 20 75 73 69 6e  ove. If not usin
15050 67 20 4e 52 45 2c 20 65 76 61 6c 75 61 74 65 20  g NRE, evaluate 
15060 74 68 65 20 73 63 72 69 70 74 20 64 69 72 65 63  the script direc
15070 74 6c 79 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  tly, then.    **
15080 20 63 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 20 44   call function D
15090 62 54 72 61 6e 73 50 6f 73 74 43 6d 64 28 29 20  bTransPostCmd() 
150a0 74 6f 20 63 6f 6d 6d 69 74 20 28 6f 72 20 72 6f  to commit (or ro
150b0 6c 6c 62 61 63 6b 29 20 74 68 65 20 74 72 61 6e  llback) the tran
150c0 73 61 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20  saction .    ** 
150d0 6f 72 20 73 61 76 65 70 6f 69 6e 74 2e 20 20 2a  or savepoint.  *
150e0 2f 0a 20 20 20 20 69 66 28 20 44 62 55 73 65 4e  /.    if( DbUseN
150f0 72 65 28 29 20 29 7b 0a 20 20 20 20 20 20 54 63  re() ){.      Tc
15100 6c 5f 4e 52 41 64 64 43 61 6c 6c 62 61 63 6b 28  l_NRAddCallback(
15110 69 6e 74 65 72 70 2c 20 44 62 54 72 61 6e 73 50  interp, DbTransP
15120 6f 73 74 43 6d 64 2c 20 63 64 2c 20 30 2c 20 30  ostCmd, cd, 0, 0
15130 2c 20 30 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f  , 0);.      Tcl_
15140 4e 52 45 76 61 6c 4f 62 6a 28 69 6e 74 65 72 70  NREvalObj(interp
15150 2c 20 70 53 63 72 69 70 74 2c 20 30 29 3b 0a 20  , pScript, 0);. 
15160 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15170 72 63 20 3d 20 44 62 54 72 61 6e 73 50 6f 73 74  rc = DbTransPost
15180 43 6d 64 28 26 63 64 2c 20 69 6e 74 65 72 70 2c  Cmd(&cd, interp,
15190 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69   Tcl_EvalObjEx(i
151a0 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20  nterp, pScript, 
151b0 30 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  0));.    }.    b
151c0 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
151d0 20 20 2a 2a 20 20 20 20 24 64 62 20 75 6e 6c 6f    **    $db unlo
151e0 63 6b 5f 6e 6f 74 69 66 79 20 3f 73 63 72 69 70  ck_notify ?scrip
151f0 74 3f 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  t?.  */.  case D
15200 42 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 3a  B_UNLOCK_NOTIFY:
15210 20 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   {.#ifndef SQLIT
15220 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f  E_ENABLE_UNLOCK_
15230 4e 4f 54 49 46 59 0a 20 20 20 20 54 63 6c 5f 41  NOTIFY.    Tcl_A
15240 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
15250 72 70 2c 20 22 75 6e 6c 6f 63 6b 5f 6e 6f 74 69  rp, "unlock_noti
15260 66 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  fy not available
15270 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64 22 2c   in this build",
15280 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 54 43   0);.    rc = TC
15290 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20  L_ERROR;.#else. 
152a0 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26     if( objc!=2 &
152b0 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  & objc!=3 ){.   
152c0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
152d0 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
152e0 62 6a 76 2c 20 22 3f 53 43 52 49 50 54 3f 22 29  bjv, "?SCRIPT?")
152f0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c  ;.      rc = TCL
15300 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73  _ERROR;.    }els
15310 65 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 28 2a  e{.      void (*
15320 78 4e 6f 74 69 66 79 29 28 76 6f 69 64 20 2a 2a  xNotify)(void **
15330 2c 20 69 6e 74 29 20 3d 20 30 3b 0a 20 20 20 20  , int) = 0;.    
15340 20 20 76 6f 69 64 20 2a 70 4e 6f 74 69 66 79 41    void *pNotifyA
15350 72 67 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69  rg = 0;..      i
15360 66 28 20 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e  f( pDb->pUnlockN
15370 6f 74 69 66 79 20 29 7b 0a 20 20 20 20 20 20 20  otify ){.       
15380 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
15390 74 28 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f  t(pDb->pUnlockNo
153a0 74 69 66 79 29 3b 0a 20 20 20 20 20 20 20 20 70  tify);.        p
153b0 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66  Db->pUnlockNotif
153c0 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  y = 0;.      }. 
153d0 20 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63   .      if( objc
153e0 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 78  ==3 ){.        x
153f0 4e 6f 74 69 66 79 20 3d 20 44 62 55 6e 6c 6f 63  Notify = DbUnloc
15400 6b 4e 6f 74 69 66 79 3b 0a 20 20 20 20 20 20 20  kNotify;.       
15410 20 70 4e 6f 74 69 66 79 41 72 67 20 3d 20 28 76   pNotifyArg = (v
15420 6f 69 64 20 2a 29 70 44 62 3b 0a 20 20 20 20 20  oid *)pDb;.     
15430 20 20 20 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e     pDb->pUnlockN
15440 6f 74 69 66 79 20 3d 20 6f 62 6a 76 5b 32 5d 3b  otify = objv[2];
15450 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63  .        Tcl_Inc
15460 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70  rRefCount(pDb->p
15470 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 29 3b 0a 20  UnlockNotify);. 
15480 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
15490 69 66 28 20 73 71 6c 69 74 65 33 5f 75 6e 6c 6f  if( sqlite3_unlo
154a0 63 6b 5f 6e 6f 74 69 66 79 28 70 44 62 2d 3e 64  ck_notify(pDb->d
154b0 62 2c 20 78 4e 6f 74 69 66 79 2c 20 70 4e 6f 74  b, xNotify, pNot
154c0 69 66 79 41 72 67 29 20 29 7b 0a 20 20 20 20 20  ifyArg) ){.     
154d0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
154e0 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69  ult(interp, sqli
154f0 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
15500 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  db), 0);.       
15510 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b   rc = TCL_ERROR;
15520 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
15530 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b  endif.    break;
15540 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
15550 20 20 20 24 64 62 20 77 61 6c 5f 68 6f 6f 6b 20     $db wal_hook 
15560 3f 73 63 72 69 70 74 3f 0a 20 20 2a 2a 20 20 20  ?script?.  **   
15570 20 24 64 62 20 75 70 64 61 74 65 5f 68 6f 6f 6b   $db update_hook
15580 20 3f 73 63 72 69 70 74 3f 0a 20 20 2a 2a 20 20   ?script?.  **  
15590 20 20 24 64 62 20 72 6f 6c 6c 62 61 63 6b 5f 68    $db rollback_h
155a0 6f 6f 6b 20 3f 73 63 72 69 70 74 3f 0a 20 20 2a  ook ?script?.  *
155b0 2f 0a 20 20 63 61 73 65 20 44 42 5f 57 41 4c 5f  /.  case DB_WAL_
155c0 48 4f 4f 4b 3a 20 0a 20 20 63 61 73 65 20 44 42  HOOK: .  case DB
155d0 5f 55 50 44 41 54 45 5f 48 4f 4f 4b 3a 20 0a 20  _UPDATE_HOOK: . 
155e0 20 63 61 73 65 20 44 42 5f 52 4f 4c 4c 42 41 43   case DB_ROLLBAC
155f0 4b 5f 48 4f 4f 4b 3a 20 7b 0a 0a 20 20 20 20 2f  K_HOOK: {..    /
15600 2a 20 73 65 74 20 70 70 48 6f 6f 6b 20 74 6f 20  * set ppHook to 
15610 70 6f 69 6e 74 20 61 74 20 70 55 70 64 61 74 65  point at pUpdate
15620 48 6f 6f 6b 20 6f 72 20 70 52 6f 6c 6c 62 61 63  Hook or pRollbac
15630 6b 48 6f 6f 6b 2c 20 64 65 70 65 6e 64 69 6e 67  kHook, depending
15640 20 6f 6e 20 0a 20 20 20 20 2a 2a 20 77 68 65 74   on .    ** whet
15650 68 65 72 20 5b 24 64 62 20 75 70 64 61 74 65 5f  her [$db update_
15660 68 6f 6f 6b 5d 20 6f 72 20 5b 24 64 62 20 72 6f  hook] or [$db ro
15670 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 5d 20 77 61 73  llback_hook] was
15680 20 69 6e 76 6f 6b 65 64 2e 0a 20 20 20 20 2a 2f   invoked..    */
15690 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 70  .    Tcl_Obj **p
156a0 70 48 6f 6f 6b 3b 20 0a 20 20 20 20 69 66 28 20  pHook; .    if( 
156b0 63 68 6f 69 63 65 3d 3d 44 42 5f 55 50 44 41 54  choice==DB_UPDAT
156c0 45 5f 48 4f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  E_HOOK ){.      
156d0 70 70 48 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e 70  ppHook = &pDb->p
156e0 55 70 64 61 74 65 48 6f 6f 6b 3b 0a 20 20 20 20  UpdateHook;.    
156f0 7d 65 6c 73 65 20 69 66 28 20 63 68 6f 69 63 65  }else if( choice
15700 3d 3d 44 42 5f 57 41 4c 5f 48 4f 4f 4b 20 29 7b  ==DB_WAL_HOOK ){
15710 0a 20 20 20 20 20 20 70 70 48 6f 6f 6b 20 3d 20  .      ppHook = 
15720 26 70 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 3b 0a  &pDb->pWalHook;.
15730 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15740 20 70 70 48 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e   ppHook = &pDb->
15750 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3b 0a 20  pRollbackHook;. 
15760 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62     }..    if( ob
15770 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33  jc!=2 && objc!=3
15780 20 29 7b 0a 20 20 20 20 20 20 20 54 63 6c 5f 57   ){.       Tcl_W
15790 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
157a0 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 53  rp, 2, objv, "?S
157b0 43 52 49 50 54 3f 22 29 3b 0a 20 20 20 20 20 20  CRIPT?");.      
157c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
157d0 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  R;.    }.    if(
157e0 20 2a 70 70 48 6f 6f 6b 20 29 7b 0a 20 20 20 20   *ppHook ){.    
157f0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
15800 6c 74 28 69 6e 74 65 72 70 2c 20 2a 70 70 48 6f  lt(interp, *ppHo
15810 6f 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  ok);.      if( o
15820 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc==3 ){.      
15830 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
15840 6e 74 28 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20  nt(*ppHook);.   
15850 20 20 20 20 20 2a 70 70 48 6f 6f 6b 20 3d 20 30       *ppHook = 0
15860 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
15870 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20      if( objc==3 
15880 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
15890 20 21 28 2a 70 70 48 6f 6f 6b 29 20 29 3b 0a 20   !(*ppHook) );. 
158a0 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74       if( Tcl_Get
158b0 43 68 61 72 4c 65 6e 67 74 68 28 6f 62 6a 76 5b  CharLength(objv[
158c0 32 5d 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  2])>0 ){.       
158d0 20 2a 70 70 48 6f 6f 6b 20 3d 20 6f 62 6a 76 5b   *ppHook = objv[
158e0 32 5d 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  2];.        Tcl_
158f0 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 2a 70 70  IncrRefCount(*pp
15900 48 6f 6f 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Hook);.      }. 
15910 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65     }..    sqlite
15920 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28 70 44  3_update_hook(pD
15930 62 2d 3e 64 62 2c 20 28 70 44 62 2d 3e 70 55 70  b->db, (pDb->pUp
15940 64 61 74 65 48 6f 6f 6b 3f 44 62 55 70 64 61 74  dateHook?DbUpdat
15950 65 48 61 6e 64 6c 65 72 3a 30 29 2c 20 70 44 62  eHandler:0), pDb
15960 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  );.    sqlite3_r
15970 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28 70 44 62  ollback_hook(pDb
15980 2d 3e 64 62 2c 28 70 44 62 2d 3e 70 52 6f 6c 6c  ->db,(pDb->pRoll
15990 62 61 63 6b 48 6f 6f 6b 3f 44 62 52 6f 6c 6c 62  backHook?DbRollb
159a0 61 63 6b 48 61 6e 64 6c 65 72 3a 30 29 2c 70 44  ackHandler:0),pD
159b0 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  b);.    sqlite3_
159c0 77 61 6c 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62  wal_hook(pDb->db
159d0 2c 28 70 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 3f  ,(pDb->pWalHook?
159e0 44 62 57 61 6c 48 61 6e 64 6c 65 72 3a 30 29 2c  DbWalHandler:0),
159f0 70 44 62 29 3b 0a 0a 20 20 20 20 62 72 65 61 6b  pDb);..    break
15a00 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24  ;.  }..  /*    $
15a10 64 62 20 76 65 72 73 69 6f 6e 0a 20 20 2a 2a 0a  db version.  **.
15a20 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20    ** Return the 
15a30 76 65 72 73 69 6f 6e 20 73 74 72 69 6e 67 20 66  version string f
15a40 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65  or this database
15a50 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
15a60 5f 56 45 52 53 49 4f 4e 3a 20 7b 0a 20 20 20 20  _VERSION: {.    
15a70 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
15a80 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71  terp, (char *)sq
15a90 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e  lite3_libversion
15aa0 28 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  (), TCL_STATIC);
15ab0 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
15ac0 0a 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 6f 66 20  ..  } /* End of 
15ad0 74 68 65 20 53 57 49 54 43 48 20 73 74 61 74 65  the SWITCH state
15ae0 6d 65 6e 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e  ment */.  return
15af0 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49   rc;.}..#if SQLI
15b00 54 45 5f 54 43 4c 5f 4e 52 45 0a 2f 2a 0a 2a 2a  TE_TCL_NRE./*.**
15b10 20 41 64 61 70 74 6f 72 20 74 68 61 74 20 70 72   Adaptor that pr
15b20 6f 76 69 64 65 73 20 61 6e 20 6f 62 6a 43 6d 64  ovides an objCmd
15b30 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20 74 68   interface to th
15b40 65 20 4e 52 45 2d 65 6e 61 62 6c 65 64 0a 2a 2a  e NRE-enabled.**
15b50 20 69 6e 74 65 72 66 61 63 65 20 69 6d 70 6c 65   interface imple
15b60 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  mentation..*/.st
15b70 61 74 69 63 20 69 6e 74 20 44 62 4f 62 6a 43 6d  atic int DbObjCm
15b80 64 41 64 61 70 74 6f 72 28 0a 20 20 76 6f 69 64  dAdaptor(.  void
15b90 20 2a 63 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65   *cd,.  Tcl_Inte
15ba0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
15bb0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
15bc0 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 0a 29 7b  j *const*objv.){
15bd0 0a 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 52  .  return Tcl_NR
15be0 43 61 6c 6c 4f 62 6a 50 72 6f 63 28 69 6e 74 65  CallObjProc(inte
15bf0 72 70 2c 20 44 62 4f 62 6a 43 6d 64 2c 20 63 64  rp, DbObjCmd, cd
15c00 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a 7d  , objc, objv);.}
15c10 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
15c20 45 5f 54 43 4c 5f 4e 52 45 20 2a 2f 0a 0a 2f 2a  E_TCL_NRE */../*
15c30 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 20 44 42  .**   sqlite3 DB
15c40 4e 41 4d 45 20 46 49 4c 45 4e 41 4d 45 20 3f 2d  NAME FILENAME ?-
15c50 76 66 73 20 56 46 53 4e 41 4d 45 3f 20 3f 2d 6b  vfs VFSNAME? ?-k
15c60 65 79 20 4b 45 59 3f 20 3f 2d 72 65 61 64 6f 6e  ey KEY? ?-readon
15c70 6c 79 20 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a 20 20  ly 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 20 3f 2d 63 72 65 61 74           ?-creat
15ca0 65 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 6e 6f 6d  e BOOLEAN? ?-nom
15cb0 75 74 65 78 20 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a  utex BOOLEAN?.**
15cc0 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
15cd0 6d 61 69 6e 20 54 63 6c 20 63 6f 6d 6d 61 6e 64  main Tcl command
15ce0 2e 20 20 57 68 65 6e 20 74 68 65 20 22 73 71 6c  .  When the "sql
15cf0 69 74 65 22 20 54 63 6c 20 63 6f 6d 6d 61 6e 64  ite" Tcl command
15d00 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2c 20   is.** invoked, 
15d10 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e  this routine run
15d20 73 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 61  s to process tha
15d30 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  t command..**.**
15d40 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
15d50 65 6e 74 2c 20 44 42 4e 41 4d 45 2c 20 69 73 20  ent, DBNAME, is 
15d60 61 6e 20 61 72 62 69 74 72 61 72 79 20 6e 61 6d  an arbitrary nam
15d70 65 20 66 6f 72 20 61 20 6e 65 77 0a 2a 2a 20 64  e for a new.** d
15d80 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
15d90 6f 6e 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e  on.  This comman
15da0 64 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 20  d creates a new 
15db0 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64 0a 2a 2a  command named.**
15dc0 20 44 42 4e 41 4d 45 20 74 68 61 74 20 69 73 20   DBNAME that is 
15dd0 75 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20  used to control 
15de0 74 68 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  that connection.
15df0 20 20 54 68 65 20 64 61 74 61 62 61 73 65 0a 2a    The database.*
15e00 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  * connection is 
15e10 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65  deleted when the
15e20 20 44 42 4e 41 4d 45 20 63 6f 6d 6d 61 6e 64 20   DBNAME command 
15e30 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a  is deleted..**.*
15e40 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67  * The second arg
15e50 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d  ument is the nam
15e60 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
15e70 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74  e file..**.*/.st
15e80 61 74 69 63 20 69 6e 74 20 44 62 4d 61 69 6e 28  atic int DbMain(
15e90 76 6f 69 64 20 2a 63 64 2c 20 54 63 6c 5f 49 6e  void *cd, Tcl_In
15ea0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
15eb0 74 20 6f 62 6a 63 2c 54 63 6c 5f 4f 62 6a 20 2a  t objc,Tcl_Obj *
15ec0 63 6f 6e 73 74 2a 6f 62 6a 76 29 7b 0a 20 20 53  const*objv){.  S
15ed0 71 6c 69 74 65 44 62 20 2a 70 3b 0a 20 20 63 6f  qliteDb *p;.  co
15ee0 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 3b 0a  nst char *zArg;.
15ef0 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 3b    char *zErrMsg;
15f00 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73  .  int i;.  cons
15f10 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20  t char *zFile;. 
15f20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66   const char *zVf
15f30 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 66 6c 61  s = 0;.  int fla
15f40 67 73 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  gs;.  Tcl_DStrin
15f50 67 20 74 72 61 6e 73 6c 61 74 65 64 46 69 6c 65  g translatedFile
15f60 6e 61 6d 65 3b 0a 23 69 66 64 65 66 20 53 51 4c  name;.#ifdef SQL
15f70 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
15f80 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20 30 3b 0a  void *pKey = 0;.
15f90 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 30 3b 0a    int nKey = 0;.
15fa0 23 65 6e 64 69 66 0a 20 20 69 6e 74 20 72 63 3b  #endif.  int rc;
15fb0 0a 0a 20 20 2f 2a 20 49 6e 20 6e 6f 72 6d 61 6c  ..  /* In normal
15fc0 20 75 73 65 2c 20 65 61 63 68 20 54 43 4c 20 69   use, each TCL i
15fd0 6e 74 65 72 70 72 65 74 65 72 20 72 75 6e 73 20  nterpreter runs 
15fe0 69 6e 20 61 20 73 69 6e 67 6c 65 20 74 68 72 65  in a single thre
15ff0 61 64 2e 20 20 53 6f 0a 20 20 2a 2a 20 62 79 20  ad.  So.  ** by 
16000 64 65 66 61 75 6c 74 2c 20 77 65 20 63 61 6e 20  default, we can 
16010 74 75 72 6e 20 6f 66 20 6d 75 74 65 78 69 6e 67  turn of mutexing
16020 20 6f 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62   on SQLite datab
16030 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e  ase connections.
16040 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 2c 20 66  .  ** However, f
16050 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f  or testing purpo
16060 73 65 73 20 69 74 20 69 73 20 75 73 65 66 75 6c  ses it is useful
16070 20 74 6f 20 68 61 76 65 20 6d 75 74 65 78 65 73   to have mutexes
16080 20 74 75 72 6e 65 64 0a 20 20 2a 2a 20 6f 6e 2e   turned.  ** on.
16090 20 20 53 6f 2c 20 62 79 20 64 65 66 61 75 6c 74    So, by default
160a0 2c 20 6d 75 74 65 78 65 73 20 64 65 66 61 75 6c  , mutexes defaul
160b0 74 20 6f 66 66 2e 20 20 42 75 74 20 69 66 20 63  t off.  But if c
160c0 6f 6d 70 69 6c 65 64 20 77 69 74 68 0a 20 20 2a  ompiled with.  *
160d0 2a 20 53 51 4c 49 54 45 5f 54 43 4c 5f 44 45 46  * SQLITE_TCL_DEF
160e0 41 55 4c 54 5f 46 55 4c 4c 4d 55 54 45 58 20 74  AULT_FULLMUTEX t
160f0 68 65 6e 20 6d 75 74 65 78 65 73 20 64 65 66 61  hen mutexes defa
16100 75 6c 74 20 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66  ult on..  */.#if
16110 64 65 66 20 53 51 4c 49 54 45 5f 54 43 4c 5f 44  def SQLITE_TCL_D
16120 45 46 41 55 4c 54 5f 46 55 4c 4c 4d 55 54 45 58  EFAULT_FULLMUTEX
16130 0a 20 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54  .  flags = SQLIT
16140 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
16150 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
16160 52 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  REATE | SQLITE_O
16170 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a 23  PEN_FULLMUTEX;.#
16180 65 6c 73 65 0a 20 20 66 6c 61 67 73 20 3d 20 53  else.  flags = S
16190 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
161a0 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
161b0 45 4e 5f 43 52 45 41 54 45 20 7c 20 53 51 4c 49  EN_CREATE | SQLI
161c0 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b  TE_OPEN_NOMUTEX;
161d0 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6f  .#endif..  if( o
161e0 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a 41  bjc==2 ){.    zA
161f0 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  rg = Tcl_GetStri
16200 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31  ngFromObj(objv[1
16210 5d 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 73  ], 0);.    if( s
16220 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 76 65 72  trcmp(zArg,"-ver
16230 73 69 6f 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20  sion")==0 ){.   
16240 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
16250 75 6c 74 28 69 6e 74 65 72 70 2c 73 71 6c 69 74  ult(interp,sqlit
16260 65 33 5f 76 65 72 73 69 6f 6e 2c 30 29 3b 0a 20  e3_version,0);. 
16270 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
16280 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OK;.    }.    if
16290 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d  ( strcmp(zArg,"-
162a0 68 61 73 2d 63 6f 64 65 63 22 29 3d 3d 30 20 29  has-codec")==0 )
162b0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
162c0 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 20 20  HAS_CODEC.      
162d0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
162e0 28 69 6e 74 65 72 70 2c 22 31 22 2c 30 29 3b 0a  (interp,"1",0);.
162f0 23 65 6c 73 65 0a 20 20 20 20 20 20 54 63 6c 5f  #else.      Tcl_
16300 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
16310 65 72 70 2c 22 30 22 2c 30 29 3b 0a 23 65 6e 64  erp,"0",0);.#end
16320 69 66 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  if.      return 
16330 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  TCL_OK;.    }.  
16340 7d 0a 20 20 66 6f 72 28 69 3d 33 3b 20 69 2b 31  }.  for(i=3; i+1
16350 3c 6f 62 6a 63 3b 20 69 2b 3d 32 29 7b 0a 20 20  <objc; i+=2){.  
16360 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65 74    zArg = Tcl_Get
16370 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69 5d 29 3b  String(objv[i]);
16380 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
16390 7a 41 72 67 2c 22 2d 6b 65 79 22 29 3d 3d 30 20  zArg,"-key")==0 
163a0 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
163b0 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 20  _HAS_CODEC.     
163c0 20 70 4b 65 79 20 3d 20 54 63 6c 5f 47 65 74 42   pKey = Tcl_GetB
163d0 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28  yteArrayFromObj(
163e0 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 6e 4b 65 79  objv[i+1], &nKey
163f0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65  );.#endif.    }e
16400 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
16410 41 72 67 2c 20 22 2d 76 66 73 22 29 3d 3d 30 20  Arg, "-vfs")==0 
16420 29 7b 0a 20 20 20 20 20 20 7a 56 66 73 20 3d 20  ){.      zVfs = 
16430 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
16440 6a 76 5b 69 2b 31 5d 29 3b 0a 20 20 20 20 7d 65  jv[i+1]);.    }e
16450 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
16460 41 72 67 2c 20 22 2d 72 65 61 64 6f 6e 6c 79 22  Arg, "-readonly"
16470 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
16480 74 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20 54  t b;.      if( T
16490 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
164a0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
164b0 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20 72 65  v[i+1], &b) ) re
164c0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
164d0 20 20 20 20 20 20 69 66 28 20 62 20 29 7b 0a 20        if( b ){. 
164e0 20 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20         flags &= 
164f0 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  ~(SQLITE_OPEN_RE
16500 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
16510 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 20  PEN_CREATE);.   
16520 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51       flags |= SQ
16530 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
16540 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  LY;.      }else{
16550 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 26  .        flags &
16560 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  = ~SQLITE_OPEN_R
16570 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20  EADONLY;.       
16580 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45   flags |= SQLITE
16590 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 3b  _OPEN_READWRITE;
165a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
165b0 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41  se if( strcmp(zA
165c0 72 67 2c 20 22 2d 63 72 65 61 74 65 22 29 3d 3d  rg, "-create")==
165d0 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62  0 ){.      int b
165e0 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f  ;.      if( Tcl_
165f0 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62  GetBooleanFromOb
16600 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69  j(interp, objv[i
16610 2b 31 5d 2c 20 26 62 29 20 29 20 72 65 74 75 72  +1], &b) ) retur
16620 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
16630 20 20 20 69 66 28 20 62 20 26 26 20 28 66 6c 61     if( b && (fla
16640 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
16650 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d 30 20 29 7b  _READONLY)==0 ){
16660 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c  .        flags |
16670 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  = SQLITE_OPEN_CR
16680 45 41 54 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  EATE;.      }els
16690 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  e{.        flags
166a0 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e   &= ~SQLITE_OPEN
166b0 5f 43 52 45 41 54 45 3b 0a 20 20 20 20 20 20 7d  _CREATE;.      }
166c0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
166d0 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d 6e 6f  trcmp(zArg, "-no
166e0 6d 75 74 65 78 22 29 3d 3d 30 20 29 7b 0a 20 20  mutex")==0 ){.  
166f0 20 20 20 20 69 6e 74 20 62 3b 0a 20 20 20 20 20      int b;.     
16700 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c   if( Tcl_GetBool
16710 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
16720 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 62  p, objv[i+1], &b
16730 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
16740 52 52 4f 52 3b 0a 20 20 20 20 20 20 69 66 28 20  RROR;.      if( 
16750 62 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61  b ){.        fla
16760 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
16770 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 20 20 20 20 20  N_NOMUTEX;.     
16780 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c     flags &= ~SQL
16790 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54  ITE_OPEN_FULLMUT
167a0 45 58 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EX;.      }else{
167b0 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 26  .        flags &
167c0 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e  = ~SQLITE_OPEN_N
167d0 4f 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 7d 0a  OMUTEX;.      }.
167e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
167f0 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d 66 75 6c  rcmp(zArg, "-ful
16800 6c 6d 75 74 65 78 22 29 3d 3d 30 20 29 7b 0a 20  lmutex")==0 ){. 
16810 20 20 20 20 20 69 6e 74 20 62 3b 0a 20 20 20 20       int b;.    
16820 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f    if( Tcl_GetBoo
16830 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
16840 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26  rp, objv[i+1], &
16850 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
16860 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 69 66 28  ERROR;.      if(
16870 20 62 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c   b ){.        fl
16880 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50  ags |= SQLITE_OP
16890 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a 20 20  EN_FULLMUTEX;.  
168a0 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e        flags &= ~
168b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55  SQLITE_OPEN_NOMU
168c0 54 45 58 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  TEX;.      }else
168d0 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  {.        flags 
168e0 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  &= ~SQLITE_OPEN_
168f0 46 55 4c 4c 4d 55 54 45 58 3b 0a 20 20 20 20 20  FULLMUTEX;.     
16900 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
16910 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d   strcmp(zArg, "-
16920 75 72 69 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  uri")==0 ){.    
16930 20 20 69 6e 74 20 62 3b 0a 20 20 20 20 20 20 69    int b;.      i
16940 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61  f( Tcl_GetBoolea
16950 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  nFromObj(interp,
16960 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 62 29 20   objv[i+1], &b) 
16970 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
16980 4f 52 3b 0a 20 20 20 20 20 20 69 66 28 20 62 20  OR;.      if( b 
16990 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  ){.        flags
169a0 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   |= SQLITE_OPEN_
169b0 55 52 49 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  URI;.      }else
169c0 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  {.        flags 
169d0 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  &= ~SQLITE_OPEN_
169e0 55 52 49 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  URI;.      }.   
169f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63   }else{.      Tc
16a00 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
16a10 6e 74 65 72 70 2c 20 22 75 6e 6b 6e 6f 77 6e 20  nterp, "unknown 
16a20 6f 70 74 69 6f 6e 3a 20 22 2c 20 7a 41 72 67 2c  option: ", zArg,
16a30 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
16a40 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
16a50 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OR;.    }.  }.  
16a60 69 66 28 20 6f 62 6a 63 3c 33 20 7c 7c 20 28 6f  if( objc<3 || (o
16a70 62 6a 63 26 31 29 21 3d 31 20 29 7b 0a 20 20 20  bjc&1)!=1 ){.   
16a80 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
16a90 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
16aa0 76 2c 20 0a 20 20 20 20 20 20 22 48 41 4e 44 4c  v, .      "HANDL
16ab0 45 20 46 49 4c 45 4e 41 4d 45 20 3f 2d 76 66 73  E FILENAME ?-vfs
16ac0 20 56 46 53 4e 41 4d 45 3f 20 3f 2d 72 65 61 64   VFSNAME? ?-read
16ad0 6f 6e 6c 79 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d  only BOOLEAN? ?-
16ae0 63 72 65 61 74 65 20 42 4f 4f 4c 45 41 4e 3f 22  create BOOLEAN?"
16af0 0a 20 20 20 20 20 20 22 20 3f 2d 6e 6f 6d 75 74  .      " ?-nomut
16b00 65 78 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 66 75  ex BOOLEAN? ?-fu
16b10 6c 6c 6d 75 74 65 78 20 42 4f 4f 4c 45 41 4e 3f  llmutex BOOLEAN?
16b20 20 3f 2d 75 72 69 20 42 4f 4f 4c 45 41 4e 3f 22   ?-uri BOOLEAN?"
16b30 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
16b40 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 20 20 22  AS_CODEC.      "
16b50 20 3f 2d 6b 65 79 20 43 4f 44 45 43 4b 45 59 3f   ?-key CODECKEY?
16b60 22 0a 23 65 6e 64 69 66 0a 20 20 20 20 29 3b 0a  ".#endif.    );.
16b70 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
16b80 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 45 72 72  RROR;.  }.  zErr
16b90 4d 73 67 20 3d 20 30 3b 0a 20 20 70 20 3d 20 28  Msg = 0;.  p = (
16ba0 53 71 6c 69 74 65 44 62 2a 29 54 63 6c 5f 41 6c  SqliteDb*)Tcl_Al
16bb0 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 20  loc( sizeof(*p) 
16bc0 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  );.  if( p==0 ){
16bd0 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
16be0 6c 74 28 69 6e 74 65 72 70 2c 20 22 6d 61 6c 6c  lt(interp, "mall
16bf0 6f 63 20 66 61 69 6c 65 64 22 2c 20 54 43 4c 5f  oc failed", TCL_
16c00 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65 74  STATIC);.    ret
16c10 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
16c20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30   }.  memset(p, 0
16c30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20  , sizeof(*p));. 
16c40 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74   zFile = Tcl_Get
16c50 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
16c60 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 7a 46 69  jv[2], 0);.  zFi
16c70 6c 65 20 3d 20 54 63 6c 5f 54 72 61 6e 73 6c 61  le = Tcl_Transla
16c80 74 65 46 69 6c 65 4e 61 6d 65 28 69 6e 74 65 72  teFileName(inter
16c90 70 2c 20 7a 46 69 6c 65 2c 20 26 74 72 61 6e 73  p, zFile, &trans
16ca0 6c 61 74 65 64 46 69 6c 65 6e 61 6d 65 29 3b 0a  latedFilename);.
16cb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f    rc = sqlite3_o
16cc0 70 65 6e 5f 76 32 28 7a 46 69 6c 65 2c 20 26 70  pen_v2(zFile, &p
16cd0 2d 3e 64 62 2c 20 66 6c 61 67 73 2c 20 7a 56 66  ->db, flags, zVf
16ce0 73 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  s);.  Tcl_DStrin
16cf0 67 46 72 65 65 28 26 74 72 61 6e 73 6c 61 74 65  gFree(&translate
16d00 64 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66  dFilename);.  if
16d10 28 20 70 2d 3e 64 62 20 29 7b 0a 20 20 20 20 69  ( p->db ){.    i
16d20 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
16d30 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70 2d  lite3_errcode(p-
16d40 3e 64 62 29 20 29 7b 0a 20 20 20 20 20 20 7a 45  >db) ){.      zE
16d50 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
16d60 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71  mprintf("%s", sq
16d70 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e  lite3_errmsg(p->
16d80 64 62 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  db));.      sqli
16d90 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 29  te3_close(p->db)
16da0 3b 0a 20 20 20 20 20 20 70 2d 3e 64 62 20 3d 20  ;.      p->db = 
16db0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  0;.    }.  }else
16dc0 7b 0a 20 20 20 20 7a 45 72 72 4d 73 67 20 3d 20  {.    zErrMsg = 
16dd0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
16de0 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  "%s", sqlite3_er
16df0 72 73 74 72 28 72 63 29 29 3b 0a 20 20 7d 0a 23  rstr(rc));.  }.#
16e00 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
16e10 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 70 2d 3e  _CODEC.  if( p->
16e20 64 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  db ){.    sqlite
16e30 33 5f 6b 65 79 28 70 2d 3e 64 62 2c 20 70 4b 65  3_key(p->db, pKe
16e40 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 7d 0a 23 65  y, nKey);.  }.#e
16e50 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 64 62  ndif.  if( p->db
16e60 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53  ==0 ){.    Tcl_S
16e70 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
16e80 20 7a 45 72 72 4d 73 67 2c 20 54 43 4c 5f 56 4f   zErrMsg, TCL_VO
16e90 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 54 63 6c  LATILE);.    Tcl
16ea0 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 29 3b  _Free((char*)p);
16eb0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
16ec0 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  e(zErrMsg);.    
16ed0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
16ee0 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 78 53 74  ;.  }.  p->maxSt
16ef0 6d 74 20 3d 20 4e 55 4d 5f 50 52 45 50 41 52 45  mt = NUM_PREPARE
16f00 44 5f 53 54 4d 54 53 3b 0a 20 20 70 2d 3e 69 6e  D_STMTS;.  p->in
16f10 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20  terp = interp;. 
16f20 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53   zArg = Tcl_GetS
16f30 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
16f40 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 69 66 28 20  v[1], 0);.  if( 
16f50 44 62 55 73 65 4e 72 65 28 29 20 29 7b 0a 20 20  DbUseNre() ){.  
16f60 20 20 54 63 6c 5f 4e 52 43 72 65 61 74 65 43 6f    Tcl_NRCreateCo
16f70 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 7a 41  mmand(interp, zA
16f80 72 67 2c 20 44 62 4f 62 6a 43 6d 64 41 64 61 70  rg, DbObjCmdAdap
16f90 74 6f 72 2c 20 44 62 4f 62 6a 43 6d 64 2c 0a 20  tor, 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 20 28 63 68 61 72 2a 29 70 2c         (char*)p,
16fc0 20 44 62 44 65 6c 65 74 65 43 6d 64 29 3b 0a 20   DbDeleteCmd);. 
16fd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f   }else{.    Tcl_
16fe0 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
16ff0 28 69 6e 74 65 72 70 2c 20 7a 41 72 67 2c 20 44  (interp, zArg, D
17000 62 4f 62 6a 43 6d 64 2c 20 28 63 68 61 72 2a 29  bObjCmd, (char*)
17010 70 2c 20 44 62 44 65 6c 65 74 65 43 6d 64 29 3b  p, DbDeleteCmd);
17020 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
17030 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  L_OK;.}../*.** P
17040 72 6f 76 69 64 65 20 61 20 64 75 6d 6d 79 20 54  rovide a dummy T
17050 63 6c 5f 49 6e 69 74 53 74 75 62 73 20 69 66 20  cl_InitStubs if 
17060 77 65 20 61 72 65 20 75 73 69 6e 67 20 74 68 69  we are using thi
17070 73 20 61 73 20 61 20 73 74 61 74 69 63 0a 2a 2a  s as a static.**
17080 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66   library..*/.#if
17090 6e 64 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55  ndef USE_TCL_STU
170a0 42 53 0a 23 20 75 6e 64 65 66 20 20 54 63 6c 5f  BS.# undef  Tcl_
170b0 49 6e 69 74 53 74 75 62 73 0a 23 20 64 65 66 69  InitStubs.# defi
170c0 6e 65 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73  ne Tcl_InitStubs
170d0 28 61 2c 62 2c 63 29 20 54 43 4c 5f 4f 4b 0a 23  (a,b,c) TCL_OK.#
170e0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  endif../*.** Mak
170f0 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20 61  e sure we have a
17100 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e   PACKAGE_VERSION
17110 20 6d 61 63 72 6f 20 64 65 66 69 6e 65 64 2e 20   macro defined. 
17120 20 54 68 69 73 20 77 69 6c 6c 20 62 65 0a 2a 2a   This will be.**
17130 20 64 65 66 69 6e 65 64 20 61 75 74 6f 6d 61 74   defined automat
17140 69 63 61 6c 6c 79 20 62 79 20 74 68 65 20 54 45  ically by the TE
17150 41 20 6d 61 6b 65 66 69 6c 65 2e 20 20 42 75 74  A makefile.  But
17160 20 6f 74 68 65 72 20 6d 61 6b 65 66 69 6c 65 73   other makefiles
17170 0a 2a 2a 20 64 6f 20 6e 6f 74 20 64 65 66 69 6e  .** do not defin
17180 65 20 69 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  e it..*/.#ifndef
17190 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e   PACKAGE_VERSION
171a0 0a 23 20 64 65 66 69 6e 65 20 50 41 43 4b 41 47  .# define PACKAG
171b0 45 5f 56 45 52 53 49 4f 4e 20 53 51 4c 49 54 45  E_VERSION SQLITE
171c0 5f 56 45 52 53 49 4f 4e 0a 23 65 6e 64 69 66 0a  _VERSION.#endif.
171d0 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
171e0 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a  e this module..*
171f0 2a 0a 2a 2a 20 54 68 69 73 20 54 63 6c 20 6d 6f  *.** This Tcl mo
17200 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  dule contains on
17210 6c 79 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20  ly a single new 
17220 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65  Tcl command name
17230 64 20 22 73 71 6c 69 74 65 22 2e 0a 2a 2a 20 28  d "sqlite"..** (
17240 48 65 6e 63 65 20 74 68 65 72 65 20 69 73 20 6e  Hence there is n
17250 6f 20 6e 61 6d 65 73 70 61 63 65 2e 20 20 54 68  o namespace.  Th
17260 65 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20  ere is no point 
17270 69 6e 20 75 73 69 6e 67 20 61 20 6e 61 6d 65 73  in using a names
17280 70 61 63 65 0a 2a 2a 20 69 66 20 74 68 65 20 65  pace.** if the e
17290 78 74 65 6e 73 69 6f 6e 20 6f 6e 6c 79 20 73 75  xtension only su
172a0 70 70 6c 69 65 73 20 6f 6e 65 20 6e 65 77 20 6e  pplies one new n
172b0 61 6d 65 21 29 20 20 54 68 65 20 22 73 71 6c 69  ame!)  The "sqli
172c0 74 65 22 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a  te" command is.*
172d0 2a 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 61  * used to open a
172e0 20 6e 65 77 20 53 51 4c 69 74 65 20 64 61 74 61   new SQLite data
172f0 62 61 73 65 2e 20 20 53 65 65 20 74 68 65 20 44  base.  See the D
17300 62 4d 61 69 6e 28 29 20 72 6f 75 74 69 6e 65 20  bMain() routine 
17310 61 62 6f 76 65 0a 2a 2a 20 66 6f 72 20 61 64 64  above.** for add
17320 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
17330 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45  ion..**.** The E
17340 58 54 45 52 4e 20 6d 61 63 72 6f 73 20 61 72 65  XTERN macros are
17350 20 72 65 71 75 69 72 65 64 20 62 79 20 54 43 4c   required by TCL
17360 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f 72   in order to wor
17370 6b 20 6f 6e 20 77 69 6e 64 6f 77 73 2e 0a 2a 2f  k on windows..*/
17380 0a 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69  .EXTERN int Sqli
17390 74 65 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  te3_Init(Tcl_Int
173a0 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20  erp *interp){.  
173b0 69 6e 74 20 72 63 20 3d 20 54 63 6c 5f 49 6e 69  int rc = Tcl_Ini
173c0 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c 20 22  tStubs(interp, "
173d0 38 2e 34 22 2c 20 30 29 3b 0a 20 20 69 66 28 20  8.4", 0);.  if( 
173e0 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20  rc==TCL_OK ){.  
173f0 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
17400 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
17410 73 71 6c 69 74 65 33 22 2c 20 28 54 63 6c 5f 4f  sqlite3", (Tcl_O
17420 62 6a 43 6d 64 50 72 6f 63 2a 29 44 62 4d 61 69  bjCmdProc*)DbMai
17430 6e 2c 20 30 2c 20 30 29 3b 0a 23 69 66 6e 64 65  n, 0, 0);.#ifnde
17440 66 20 53 51 4c 49 54 45 5f 33 5f 53 55 46 46 49  f SQLITE_3_SUFFI
17450 58 5f 4f 4e 4c 59 0a 20 20 20 20 2f 2a 20 54 68  X_ONLY.    /* Th
17460 65 20 22 73 71 6c 69 74 65 22 20 61 6c 69 61 73  e "sqlite" alias
17470 20 69 73 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64   is undocumented
17480 2e 20 20 49 74 20 69 73 20 68 65 72 65 20 6f 6e  .  It is here on
17490 6c 79 20 74 6f 20 73 75 70 70 6f 72 74 0a 20 20  ly to support.  
174a0 20 20 2a 2a 20 6c 65 67 61 63 79 20 73 63 72 69    ** legacy scri
174b0 70 74 73 2e 20 20 41 6c 6c 20 6e 65 77 20 73 63  pts.  All new sc
174c0 72 69 70 74 73 20 73 68 6f 75 6c 64 20 75 73 65  ripts should use
174d0 20 6f 6e 6c 79 20 74 68 65 20 22 73 71 6c 69 74   only the "sqlit
174e0 65 33 22 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d 61  e3".    ** comma
174f0 6e 64 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 43  nd. */.    Tcl_C
17500 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
17510 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 22  interp, "sqlite"
17520 2c 20 28 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f  , (Tcl_ObjCmdPro
17530 63 2a 29 44 62 4d 61 69 6e 2c 20 30 2c 20 30 29  c*)DbMain, 0, 0)
17540 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20  ;.#endif.    rc 
17550 3d 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65  = Tcl_PkgProvide
17560 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
17570 33 22 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53  3", PACKAGE_VERS
17580 49 4f 4e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ION);.  }.  retu
17590 72 6e 20 72 63 3b 0a 7d 0a 45 58 54 45 52 4e 20  rn rc;.}.EXTERN 
175a0 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 33 5f 49  int Tclsqlite3_I
175b0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
175c0 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20  interp){ return 
175d0 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74  Sqlite3_Init(int
175e0 65 72 70 29 3b 20 7d 0a 45 58 54 45 52 4e 20 69  erp); }.EXTERN i
175f0 6e 74 20 53 71 6c 69 74 65 33 5f 55 6e 6c 6f 61  nt Sqlite3_Unloa
17600 64 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  d(Tcl_Interp *in
17610 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  terp, int flags)
17620 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b  { return TCL_OK;
17630 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63   }.EXTERN int Tc
17640 6c 73 71 6c 69 74 65 33 5f 55 6e 6c 6f 61 64 28  lsqlite3_Unload(
17650 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
17660 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 20  rp, int flags){ 
17670 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d  return TCL_OK; }
17680 0a 0a 2f 2a 20 42 65 63 61 75 73 65 20 69 74 20  ../* Because it 
17690 61 63 63 65 73 73 65 73 20 74 68 65 20 66 69 6c  accesses the fil
176a0 65 2d 73 79 73 74 65 6d 20 61 6e 64 20 75 73 65  e-system and use
176b0 73 20 70 65 72 73 69 73 74 65 6e 74 20 73 74 61  s persistent sta
176c0 74 65 2c 20 53 51 4c 69 74 65 0a 2a 2a 20 69 73  te, SQLite.** is
176d0 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 20   not considered 
176e0 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
176f0 73 61 66 65 20 69 6e 74 65 72 70 72 65 74 65 72  safe interpreter
17700 73 2e 20 20 48 65 6e 63 65 2c 20 77 65 20 64 65  s.  Hence, we de
17710 6c 69 62 65 72 61 74 65 6c 79 0a 2a 2a 20 6f 6d  liberately.** om
17720 69 74 20 74 68 65 20 5f 53 61 66 65 49 6e 69 74  it the _SafeInit
17730 28 29 20 69 6e 74 65 72 66 61 63 65 73 2e 0a 2a  () interfaces..*
17740 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
17750 45 5f 33 5f 53 55 46 46 49 58 5f 4f 4e 4c 59 0a  E_3_SUFFIX_ONLY.
17760 69 6e 74 20 53 71 6c 69 74 65 5f 49 6e 69 74 28  int Sqlite_Init(
17770 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
17780 72 70 29 7b 20 72 65 74 75 72 6e 20 53 71 6c 69  rp){ return Sqli
17790 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  te3_Init(interp)
177a0 3b 20 7d 0a 69 6e 74 20 54 63 6c 73 71 6c 69 74  ; }.int Tclsqlit
177b0 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  e_Init(Tcl_Inter
177c0 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75  p *interp){ retu
177d0 72 6e 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28  rn Sqlite3_Init(
177e0 69 6e 74 65 72 70 29 3b 20 7d 0a 69 6e 74 20 53  interp); }.int S
177f0 71 6c 69 74 65 5f 55 6e 6c 6f 61 64 28 54 63 6c  qlite_Unload(Tcl
17800 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
17810 20 69 6e 74 20 66 6c 61 67 73 29 7b 20 72 65 74   int flags){ ret
17820 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 69 6e  urn TCL_OK; }.in
17830 74 20 54 63 6c 73 71 6c 69 74 65 5f 55 6e 6c 6f  t Tclsqlite_Unlo
17840 61 64 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  ad(Tcl_Interp *i
17850 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 73  nterp, int flags
17860 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  ){ return TCL_OK
17870 3b 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  ; }.#endif..#ifd
17880 65 66 20 54 43 4c 53 48 0a 2f 2a 2a 2a 2a 2a 2a  ef TCLSH./******
17890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
178a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
178b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
178c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
178d0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f  *******.** All o
178e0 66 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  f the code that 
178f0 66 6f 6c 6c 6f 77 73 20 69 73 20 75 73 65 64 20  follows is used 
17900 74 6f 20 62 75 69 6c 64 20 73 74 61 6e 64 61 6c  to build standal
17910 6f 6e 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  one TCL interpre
17920 74 65 72 73 0a 2a 2a 20 74 68 61 74 20 61 72 65  ters.** that are
17930 20 73 74 61 74 69 63 61 6c 6c 79 20 6c 69 6e 6b   statically link
17940 65 64 20 77 69 74 68 20 53 51 4c 69 74 65 2e 20  ed with SQLite. 
17950 20 45 6e 61 62 6c 65 20 74 68 65 73 65 20 62 79   Enable these by
17960 20 63 6f 6d 70 69 6c 69 6e 67 0a 2a 2a 20 77 69   compiling.** wi
17970 74 68 20 2d 44 54 43 4c 53 48 3d 6e 20 77 68 65  th -DTCLSH=n whe
17980 72 65 20 6e 20 63 61 6e 20 62 65 20 31 20 6f 72  re n can be 1 or
17990 20 32 2e 20 20 41 6e 20 6e 20 6f 66 20 31 20 67   2.  An n of 1 g
179a0 65 6e 65 72 61 74 65 73 20 61 20 73 74 61 6e 64  enerates a stand
179b0 61 72 64 0a 2a 2a 20 74 63 6c 73 68 20 62 75 74  ard.** tclsh but
179c0 20 77 69 74 68 20 53 51 4c 69 74 65 20 62 75 69   with SQLite bui
179d0 6c 74 20 69 6e 2e 20 20 41 6e 20 6e 20 6f 66 20  lt in.  An n of 
179e0 32 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20  2 generates the 
179f0 53 51 4c 69 74 65 20 73 70 61 63 65 0a 2a 2a 20  SQLite space.** 
17a00 61 6e 61 6c 79 73 69 73 20 70 72 6f 67 72 61 6d  analysis program
17a10 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65  ..*/..#if define
17a20 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c  d(SQLITE_TEST) |
17a30 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
17a40 5f 54 43 4c 4d 44 35 29 0a 2f 2a 0a 20 2a 20 54  _TCLMD5)./*. * T
17a50 68 69 73 20 63 6f 64 65 20 69 6d 70 6c 65 6d 65  his code impleme
17a60 6e 74 73 20 74 68 65 20 4d 44 35 20 6d 65 73 73  nts the MD5 mess
17a70 61 67 65 2d 64 69 67 65 73 74 20 61 6c 67 6f 72  age-digest algor
17a80 69 74 68 6d 2e 0a 20 2a 20 54 68 65 20 61 6c 67  ithm.. * The alg
17a90 6f 72 69 74 68 6d 20 69 73 20 64 75 65 20 74 6f  orithm is due to
17aa0 20 52 6f 6e 20 52 69 76 65 73 74 2e 20 20 54 68   Ron Rivest.  Th
17ab0 69 73 20 63 6f 64 65 20 77 61 73 0a 20 2a 20 77  is code was. * w
17ac0 72 69 74 74 65 6e 20 62 79 20 43 6f 6c 69 6e 20  ritten by Colin 
17ad0 50 6c 75 6d 62 20 69 6e 20 31 39 39 33 2c 20 6e  Plumb in 1993, n
17ae0 6f 20 63 6f 70 79 72 69 67 68 74 20 69 73 20 63  o copyright is c
17af0 6c 61 69 6d 65 64 2e 0a 20 2a 20 54 68 69 73 20  laimed.. * This 
17b00 63 6f 64 65 20 69 73 20 69 6e 20 74 68 65 20 70  code is in the p
17b10 75 62 6c 69 63 20 64 6f 6d 61 69 6e 3b 20 64 6f  ublic domain; do
17b20 20 77 69 74 68 20 69 74 20 77 68 61 74 20 79 6f   with it what yo
17b30 75 20 77 69 73 68 2e 0a 20 2a 0a 20 2a 20 45 71  u wish.. *. * Eq
17b40 75 69 76 61 6c 65 6e 74 20 63 6f 64 65 20 69 73  uivalent code is
17b50 20 61 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20   available from 
17b60 52 53 41 20 44 61 74 61 20 53 65 63 75 72 69 74  RSA Data Securit
17b70 79 2c 20 49 6e 63 2e 0a 20 2a 20 54 68 69 73 20  y, Inc.. * This 
17b80 63 6f 64 65 20 68 61 73 20 62 65 65 6e 20 74 65  code has been te
17b90 73 74 65 64 20 61 67 61 69 6e 73 74 20 74 68 61  sted against tha
17ba0 74 2c 20 61 6e 64 20 69 73 20 65 71 75 69 76 61  t, and is equiva
17bb0 6c 65 6e 74 2c 0a 20 2a 20 65 78 63 65 70 74 20  lent,. * except 
17bc0 74 68 61 74 20 79 6f 75 20 64 6f 6e 27 74 20 6e  that you don't n
17bd0 65 65 64 20 74 6f 20 69 6e 63 6c 75 64 65 20 74  eed to include t
17be0 77 6f 20 70 61 67 65 73 20 6f 66 20 6c 65 67 61  wo pages of lega
17bf0 6c 65 73 65 0a 20 2a 20 77 69 74 68 20 65 76 65  lese. * with eve
17c00 72 79 20 63 6f 70 79 2e 0a 20 2a 0a 20 2a 20 54  ry copy.. *. * T
17c10 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6d 65  o compute the me
17c20 73 73 61 67 65 20 64 69 67 65 73 74 20 6f 66 20  ssage digest of 
17c30 61 20 63 68 75 6e 6b 20 6f 66 20 62 79 74 65 73  a chunk of bytes
17c40 2c 20 64 65 63 6c 61 72 65 20 61 6e 0a 20 2a 20  , declare an. * 
17c50 4d 44 35 43 6f 6e 74 65 78 74 20 73 74 72 75 63  MD5Context struc
17c60 74 75 72 65 2c 20 70 61 73 73 20 69 74 20 74 6f  ture, pass it to
17c70 20 4d 44 35 49 6e 69 74 2c 20 63 61 6c 6c 20 4d   MD5Init, call M
17c80 44 35 55 70 64 61 74 65 20 61 73 0a 20 2a 20 6e  D5Update as. * n
17c90 65 65 64 65 64 20 6f 6e 20 62 75 66 66 65 72 73  eeded on buffers
17ca0 20 66 75 6c 6c 20 6f 66 20 62 79 74 65 73 2c 20   full of bytes, 
17cb0 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 4d 44  and then call MD
17cc0 35 46 69 6e 61 6c 2c 20 77 68 69 63 68 0a 20 2a  5Final, which. *
17cd0 20 77 69 6c 6c 20 66 69 6c 6c 20 61 20 73 75 70   will fill a sup
17ce0 70 6c 69 65 64 20 31 36 2d 62 79 74 65 20 61 72  plied 16-byte ar
17cf0 72 61 79 20 77 69 74 68 20 74 68 65 20 64 69 67  ray with the dig
17d00 65 73 74 2e 0a 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20  est.. */../*. * 
17d10 49 66 20 63 6f 6d 70 69 6c 65 64 20 6f 6e 20 61  If compiled on a
17d20 20 6d 61 63 68 69 6e 65 20 74 68 61 74 20 64 6f   machine that do
17d30 65 73 6e 27 74 20 68 61 76 65 20 61 20 33 32 2d  esn't have a 32-
17d40 62 69 74 20 69 6e 74 65 67 65 72 2c 0a 20 2a 20  bit integer,. * 
17d50 79 6f 75 20 6a 75 73 74 20 73 65 74 20 22 75 69  you just set "ui
17d60 6e 74 33 32 22 20 74 6f 20 74 68 65 20 61 70 70  nt32" to the app
17d70 72 6f 70 72 69 61 74 65 20 64 61 74 61 74 79 70  ropriate datatyp
17d80 65 20 66 6f 72 20 61 6e 0a 20 2a 20 75 6e 73 69  e for an. * unsi
17d90 67 6e 65 64 20 33 32 2d 62 69 74 20 69 6e 74 65  gned 32-bit inte
17da0 67 65 72 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  ger.  For exampl
17db0 65 3a 0a 20 2a 0a 20 2a 20 20 20 20 20 20 20 63  e:. *. *       c
17dc0 63 20 2d 44 75 69 6e 74 33 32 3d 27 75 6e 73 69  c -Duint32='unsi
17dd0 67 6e 65 64 20 6c 6f 6e 67 27 20 6d 64 35 2e 63  gned long' md5.c
17de0 0a 20 2a 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20  . *. */.#ifndef 
17df0 75 69 6e 74 33 32 0a 23 20 20 64 65 66 69 6e 65  uint32.#  define
17e00 20 75 69 6e 74 33 32 20 75 6e 73 69 67 6e 65 64   uint32 unsigned
17e10 20 69 6e 74 0a 23 65 6e 64 69 66 0a 0a 73 74 72   int.#endif..str
17e20 75 63 74 20 4d 44 35 43 6f 6e 74 65 78 74 20 7b  uct MD5Context {
17e30 0a 20 20 69 6e 74 20 69 73 49 6e 69 74 3b 0a 20  .  int isInit;. 
17e40 20 75 69 6e 74 33 32 20 62 75 66 5b 34 5d 3b 0a   uint32 buf[4];.
17e50 20 20 75 69 6e 74 33 32 20 62 69 74 73 5b 32 5d    uint32 bits[2]
17e60 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
17e70 72 20 69 6e 5b 36 34 5d 3b 0a 7d 3b 0a 74 79 70  r in[64];.};.typ
17e80 65 64 65 66 20 73 74 72 75 63 74 20 4d 44 35 43  edef struct MD5C
17e90 6f 6e 74 65 78 74 20 4d 44 35 43 6f 6e 74 65 78  ontext MD5Contex
17ea0 74 3b 0a 0a 2f 2a 0a 20 2a 20 4e 6f 74 65 3a 20  t;../*. * Note: 
17eb0 74 68 69 73 20 63 6f 64 65 20 69 73 20 68 61 72  this code is har
17ec0 6d 6c 65 73 73 20 6f 6e 20 6c 69 74 74 6c 65 2d  mless on little-
17ed0 65 6e 64 69 61 6e 20 6d 61 63 68 69 6e 65 73 2e  endian machines.
17ee0 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  . */.static void
17ef0 20 62 79 74 65 52 65 76 65 72 73 65 20 28 75 6e   byteReverse (un
17f00 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66  signed char *buf
17f10 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 73  , unsigned longs
17f20 29 7b 0a 20 20 20 20 20 20 20 20 75 69 6e 74 33  ){.        uint3
17f30 32 20 74 3b 0a 20 20 20 20 20 20 20 20 64 6f 20  2 t;.        do 
17f40 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
17f50 20 20 74 20 3d 20 28 75 69 6e 74 33 32 29 28 28    t = (uint32)((
17f60 75 6e 73 69 67 6e 65 64 29 62 75 66 5b 33 5d 3c  unsigned)buf[3]<
17f70 3c 38 20 7c 20 62 75 66 5b 32 5d 29 20 3c 3c 20  <8 | buf[2]) << 
17f80 31 36 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  16 |.           
17f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fa0 20 28 28 75 6e 73 69 67 6e 65 64 29 62 75 66 5b   ((unsigned)buf[
17fb0 31 5d 3c 3c 38 20 7c 20 62 75 66 5b 30 5d 29 3b  1]<<8 | buf[0]);
17fc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17fd0 20 2a 28 75 69 6e 74 33 32 20 2a 29 62 75 66 20   *(uint32 *)buf 
17fe0 3d 20 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = t;.           
17ff0 20 20 20 20 20 62 75 66 20 2b 3d 20 34 3b 0a 20       buf += 4;. 
18000 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65 20 28         } while (
18010 2d 2d 6c 6f 6e 67 73 29 3b 0a 7d 0a 2f 2a 20 54  --longs);.}./* T
18020 68 65 20 66 6f 75 72 20 63 6f 72 65 20 66 75 6e  he four core fun
18030 63 74 69 6f 6e 73 20 2d 20 46 31 20 69 73 20 6f  ctions - F1 is o
18040 70 74 69 6d 69 7a 65 64 20 73 6f 6d 65 77 68 61  ptimized somewha
18050 74 20 2a 2f 0a 0a 2f 2a 20 23 64 65 66 69 6e 65  t */../* #define
18060 20 46 31 28 78 2c 20 79 2c 20 7a 29 20 28 78 20   F1(x, y, z) (x 
18070 26 20 79 20 7c 20 7e 78 20 26 20 7a 29 20 2a 2f  & y | ~x & z) */
18080 0a 23 64 65 66 69 6e 65 20 46 31 28 78 2c 20 79  .#define F1(x, y
18090 2c 20 7a 29 20 28 7a 20 5e 20 28 78 20 26 20 28  , z) (z ^ (x & (
180a0 79 20 5e 20 7a 29 29 29 0a 23 64 65 66 69 6e 65  y ^ z))).#define
180b0 20 46 32 28 78 2c 20 79 2c 20 7a 29 20 46 31 28   F2(x, y, z) F1(
180c0 7a 2c 20 78 2c 20 79 29 0a 23 64 65 66 69 6e 65  z, x, y).#define
180d0 20 46 33 28 78 2c 20 79 2c 20 7a 29 20 28 78 20   F3(x, y, z) (x 
180e0 5e 20 79 20 5e 20 7a 29 0a 23 64 65 66 69 6e 65  ^ y ^ z).#define
180f0 20 46 34 28 78 2c 20 79 2c 20 7a 29 20 28 79 20   F4(x, y, z) (y 
18100 5e 20 28 78 20 7c 20 7e 7a 29 29 0a 0a 2f 2a 20  ^ (x | ~z))../* 
18110 54 68 69 73 20 69 73 20 74 68 65 20 63 65 6e 74  This is the cent
18120 72 61 6c 20 73 74 65 70 20 69 6e 20 74 68 65 20  ral step in the 
18130 4d 44 35 20 61 6c 67 6f 72 69 74 68 6d 2e 20 2a  MD5 algorithm. *
18140 2f 0a 23 64 65 66 69 6e 65 20 4d 44 35 53 54 45  /.#define MD5STE
18150 50 28 66 2c 20 77 2c 20 78 2c 20 79 2c 20 7a 2c  P(f, w, x, y, z,
18160 20 64 61 74 61 2c 20 73 29 20 5c 0a 20 20 20 20   data, s) \.    
18170 20 20 20 20 28 20 77 20 2b 3d 20 66 28 78 2c 20      ( w += f(x, 
18180 79 2c 20 7a 29 20 2b 20 64 61 74 61 2c 20 20 77  y, z) + data,  w
18190 20 3d 20 77 3c 3c 73 20 7c 20 77 3e 3e 28 33 32   = w<<s | w>>(32
181a0 2d 73 29 2c 20 20 77 20 2b 3d 20 78 20 29 0a 0a  -s),  w += x )..
181b0 2f 2a 0a 20 2a 20 54 68 65 20 63 6f 72 65 20 6f  /*. * The core o
181c0 66 20 74 68 65 20 4d 44 35 20 61 6c 67 6f 72 69  f the MD5 algori
181d0 74 68 6d 2c 20 74 68 69 73 20 61 6c 74 65 72 73  thm, this alters
181e0 20 61 6e 20 65 78 69 73 74 69 6e 67 20 4d 44 35   an existing MD5
181f0 20 68 61 73 68 20 74 6f 0a 20 2a 20 72 65 66 6c   hash to. * refl
18200 65 63 74 20 74 68 65 20 61 64 64 69 74 69 6f 6e  ect the addition
18210 20 6f 66 20 31 36 20 6c 6f 6e 67 77 6f 72 64 73   of 16 longwords
18220 20 6f 66 20 6e 65 77 20 64 61 74 61 2e 20 20 4d   of new data.  M
18230 44 35 55 70 64 61 74 65 20 62 6c 6f 63 6b 73 0a  D5Update blocks.
18240 20 2a 20 74 68 65 20 64 61 74 61 20 61 6e 64 20   * the data and 
18250 63 6f 6e 76 65 72 74 73 20 62 79 74 65 73 20 69  converts bytes i
18260 6e 74 6f 20 6c 6f 6e 67 77 6f 72 64 73 20 66 6f  nto longwords fo
18270 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  r this routine..
18280 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
18290 4d 44 35 54 72 61 6e 73 66 6f 72 6d 28 75 69 6e  MD5Transform(uin
182a0 74 33 32 20 62 75 66 5b 34 5d 2c 20 63 6f 6e 73  t32 buf[4], cons
182b0 74 20 75 69 6e 74 33 32 20 69 6e 5b 31 36 5d 29  t uint32 in[16])
182c0 7b 0a 20 20 20 20 20 20 20 20 72 65 67 69 73 74  {.        regist
182d0 65 72 20 75 69 6e 74 33 32 20 61 2c 20 62 2c 20  er uint32 a, b, 
182e0 63 2c 20 64 3b 0a 0a 20 20 20 20 20 20 20 20 61  c, d;..        a
182f0 20 3d 20 62 75 66 5b 30 5d 3b 0a 20 20 20 20 20   = buf[0];.     
18300 20 20 20 62 20 3d 20 62 75 66 5b 31 5d 3b 0a 20     b = buf[1];. 
18310 20 20 20 20 20 20 20 63 20 3d 20 62 75 66 5b 32         c = buf[2
18320 5d 3b 0a 20 20 20 20 20 20 20 20 64 20 3d 20 62  ];.        d = b
18330 75 66 5b 33 5d 3b 0a 0a 20 20 20 20 20 20 20 20  uf[3];..        
18340 4d 44 35 53 54 45 50 28 46 31 2c 20 61 2c 20 62  MD5STEP(F1, a, b
18350 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 30 5d 2b 30  , c, d, in[ 0]+0
18360 78 64 37 36 61 61 34 37 38 2c 20 20 37 29 3b 0a  xd76aa478,  7);.
18370 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
18380 46 31 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F1, d, a, b, c, 
18390 69 6e 5b 20 31 5d 2b 30 78 65 38 63 37 62 37 35  in[ 1]+0xe8c7b75
183a0 36 2c 20 31 32 29 3b 0a 20 20 20 20 20 20 20 20  6, 12);.        
183b0 4d 44 35 53 54 45 50 28 46 31 2c 20 63 2c 20 64  MD5STEP(F1, c, d
183c0 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 32 5d 2b 30  , a, b, in[ 2]+0
183d0 78 32 34 32 30 37 30 64 62 2c 20 31 37 29 3b 0a  x242070db, 17);.
183e0 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
183f0 46 31 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20  F1, b, c, d, a, 
18400 69 6e 5b 20 33 5d 2b 30 78 63 31 62 64 63 65 65  in[ 3]+0xc1bdcee
18410 65 2c 20 32 32 29 3b 0a 20 20 20 20 20 20 20 20  e, 22);.        
18420 4d 44 35 53 54 45 50 28 46 31 2c 20 61 2c 20 62  MD5STEP(F1, a, b
18430 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 34 5d 2b 30  , c, d, in[ 4]+0
18440 78 66 35 37 63 30 66 61 66 2c 20 20 37 29 3b 0a  xf57c0faf,  7);.
18450 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
18460 46 31 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F1, d, a, b, c, 
18470 69 6e 5b 20 35 5d 2b 30 78 34 37 38 37 63 36 32  in[ 5]+0x4787c62
18480 61 2c 20 31 32 29 3b 0a 20 20 20 20 20 20 20 20  a, 12);.        
18490 4d 44 35 53 54 45 50 28 46 31 2c 20 63 2c 20 64  MD5STEP(F1, c, d
184a0 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 36 5d 2b 30  , a, b, in[ 6]+0
184b0 78 61 38 33 30 34 36 31 33 2c 20 31 37 29 3b 0a  xa8304613, 17);.
184c0 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
184d0 46 31 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20  F1, b, c, d, a, 
184e0 69 6e 5b 20 37 5d 2b 30 78 66 64 34 36 39 35 30  in[ 7]+0xfd46950
184f0 31 2c 20 32 32 29 3b 0a 20 20 20 20 20 20 20 20  1, 22);.        
18500 4d 44 35 53 54 45 50 28 46 31 2c 20 61 2c 20 62  MD5STEP(F1, a, b
18510 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 38 5d 2b 30  , c, d, in[ 8]+0
18520 78 36 39 38 30 39 38 64 38 2c 20 20 37 29 3b 0a  x698098d8,  7);.
18530 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
18540 46 31 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F1, d, a, b, c, 
18550 69 6e 5b 20 39 5d 2b 30 78 38 62 34 34 66 37 61  in[ 9]+0x8b44f7a
18560 66 2c 20 31 32 29 3b 0a 20 20 20 20 20 20 20 20  f, 12);.        
18570 4d 44 35 53 54 45 50 28 46 31 2c 20 63 2c 20 64  MD5STEP(F1, c, d
18580 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 30 5d 2b 30  , a, b, in[10]+0
18590 78 66 66 66 66 35 62 62 31 2c 20 31 37 29 3b 0a  xffff5bb1, 17);.
185a0 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
185b0 46 31 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20  F1, b, c, d, a, 
185c0 69 6e 5b 31 31 5d 2b 30 78 38 39 35 63 64 37 62  in[11]+0x895cd7b
185d0 65 2c 20 32 32 29 3b 0a 20 20 20 20 20 20 20 20  e, 22);.        
185e0 4d 44 35 53 54 45 50 28 46 31 2c 20 61 2c 20 62  MD5STEP(F1, a, b
185f0 2c 20 63 2c 20 64 2c 20 69 6e 5b 31 32 5d 2b 30  , c, d, in[12]+0
18600 78 36 62 39 30 31 31 32 32 2c 20 20 37 29 3b 0a  x6b901122,  7);.
18610 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
18620 46 31 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F1, d, a, b, c, 
18630 69 6e 5b 31 33 5d 2b 30 78 66 64 39 38 37 31 39  in[13]+0xfd98719
18640 33 2c 20 31 32 29 3b 0a 20 20 20 20 20 20 20 20  3, 12);.        
18650 4d 44 35 53 54 45 50 28 46 31 2c 20 63 2c 20 64  MD5STEP(F1, c, d
18660 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 34 5d 2b 30  , a, b, in[14]+0
18670 78 61 36 37 39 34 33 38 65 2c 20 31 37 29 3b 0a  xa679438e, 17);.
18680 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
18690 46 31 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20  F1, b, c, d, a, 
186a0 69 6e 5b 31 35 5d 2b 30 78 34 39 62 34 30 38 32  in[15]+0x49b4082
186b0 31 2c 20 32 32 29 3b 0a 0a 20 20 20 20 20 20 20  1, 22);..       
186c0 20 4d 44 35 53 54 45 50 28 46 32 2c 20 61 2c 20   MD5STEP(F2, a, 
186d0 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 31 5d 2b  b, c, d, in[ 1]+
186e0 30 78 66 36 31 65 32 35 36 32 2c 20 20 35 29 3b  0xf61e2562,  5);
186f0 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
18700 28 46 32 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c  (F2, d, a, b, c,
18710 20 69 6e 5b 20 36 5d 2b 30 78 63 30 34 30 62 33   in[ 6]+0xc040b3
18720 34 30 2c 20 20 39 29 3b 0a 20 20 20 20 20 20 20  40,  9);.       
18730 20 4d 44 35 53 54 45 50 28 46 32 2c 20 63 2c 20   MD5STEP(F2, c, 
18740 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 31 5d 2b  d, a, b, in[11]+
18750 30 78 32 36 35 65 35 61 35 31 2c 20 31 34 29 3b  0x265e5a51, 14);
18760 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
18770 28 46 32 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c  (F2, b, c, d, a,
18780 20 69 6e 5b 20 30 5d 2b 30 78 65 39 62 36 63 37   in[ 0]+0xe9b6c7
18790 61 61 2c 20 32 30 29 3b 0a 20 20 20 20 20 20 20  aa, 20);.       
187a0 20 4d 44 35 53 54 45 50 28 46 32 2c 20 61 2c 20   MD5STEP(F2, a, 
187b0 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 35 5d 2b  b, c, d, in[ 5]+
187c0 30 78 64 36 32 66 31 30 35 64 2c 20 20 35 29 3b  0xd62f105d,  5);
187d0 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
187e0 28 46 32 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c  (F2, d, a, b, c,
187f0 20 69 6e 5b 31 30 5d 2b 30 78 30 32 34 34 31 34   in[10]+0x024414
18800 35 33 2c 20 20 39 29 3b 0a 20 20 20 20 20 20 20  53,  9);.       
18810 20 4d 44 35 53 54 45 50 28 46 32 2c 20 63 2c 20   MD5STEP(F2, c, 
18820 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 35 5d 2b  d, a, b, in[15]+
18830 30 78 64 38 61 31 65 36 38 31 2c 20 31 34 29 3b  0xd8a1e681, 14);
18840 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
18850 28 46 32 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c  (F2, b, c, d, a,
18860 20 69 6e 5b 20 34 5d 2b 30 78 65 37 64 33 66 62   in[ 4]+0xe7d3fb
18870 63 38 2c 20 32 30 29 3b 0a 20 20 20 20 20 20 20  c8, 20);.       
18880 20 4d 44 35 53 54 45 50 28 46 32 2c 20 61 2c 20   MD5STEP(F2, a, 
18890 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 39 5d 2b  b, c, d, in[ 9]+
188a0 30 78 32 31 65 31 63 64 65 36 2c 20 20 35 29 3b  0x21e1cde6,  5);
188b0 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
188c0 28 46 32 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c  (F2, d, a, b, c,
188d0 20 69 6e 5b 31 34 5d 2b 30 78 63 33 33 37 30 37   in[14]+0xc33707
188e0 64 36 2c 20 20 39 29 3b 0a 20 20 20 20 20 20 20  d6,  9);.       
188f0 20 4d 44 35 53 54 45 50 28 46 32 2c 20 63 2c 20   MD5STEP(F2, c, 
18900 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 33 5d 2b  d, a, b, in[ 3]+
18910 30 78 66 34 64 35 30 64 38 37 2c 20 31 34 29 3b  0xf4d50d87, 14);
18920 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
18930 28 46 32 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c  (F2, b, c, d, a,
18940 20 69 6e 5b 20 38 5d 2b 30 78 34 35 35 61 31 34   in[ 8]+0x455a14
18950 65 64 2c 20 32 30 29 3b 0a 20 20 20 20 20 20 20  ed, 20);.       
18960 20 4d 44 35 53 54 45 50 28 46 32 2c 20 61 2c 20   MD5STEP(F2, a, 
18970 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 31 33 5d 2b  b, c, d, in[13]+
18980 30 78 61 39 65 33 65 39 30 35 2c 20 20 35 29 3b  0xa9e3e905,  5);
18990 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
189a0 28 46 32 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c  (F2, d, a, b, c,
189b0 20 69 6e 5b 20 32 5d 2b 30 78 66 63 65 66 61 33   in[ 2]+0xfcefa3
189c0 66 38 2c 20 20 39 29 3b 0a 20 20 20 20 20 20 20  f8,  9);.       
189d0 20 4d 44 35 53 54 45 50 28 46 32 2c 20 63 2c 20   MD5STEP(F2, c, 
189e0 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 37 5d 2b  d, a, b, in[ 7]+
189f0 30 78 36 37 36 66 30 32 64 39 2c 20 31 34 29 3b  0x676f02d9, 14);
18a00 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
18a10 28 46 32 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c  (F2, b, c, d, a,
18a20 20 69 6e 5b 31 32 5d 2b 30 78 38 64 32 61 34 63   in[12]+0x8d2a4c
18a30 38 61 2c 20 32 30 29 3b 0a 0a 20 20 20 20 20 20  8a, 20);..      
18a40 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20 61 2c    MD5STEP(F3, a,
18a50 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 35 5d   b, c, d, in[ 5]
18a60 2b 30 78 66 66 66 61 33 39 34 32 2c 20 20 34 29  +0xfffa3942,  4)
18a70 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
18a80 50 28 46 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63  P(F3, d, a, b, c
18a90 2c 20 69 6e 5b 20 38 5d 2b 30 78 38 37 37 31 66  , in[ 8]+0x8771f
18aa0 36 38 31 2c 20 31 31 29 3b 0a 20 20 20 20 20 20  681, 11);.      
18ab0 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20 63 2c    MD5STEP(F3, c,
18ac0 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 31 5d   d, a, b, in[11]
18ad0 2b 30 78 36 64 39 64 36 31 32 32 2c 20 31 36 29  +0x6d9d6122, 16)
18ae0 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
18af0 50 28 46 33 2c 20 62 2c 20 63 2c 20 64 2c 20 61  P(F3, b, c, d, a
18b00 2c 20 69 6e 5b 31 34 5d 2b 30 78 66 64 65 35 33  , in[14]+0xfde53
18b10 38 30 63 2c 20 32 33 29 3b 0a 20 20 20 20 20 20  80c, 23);.      
18b20 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20 61 2c    MD5STEP(F3, a,
18b30 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 31 5d   b, c, d, in[ 1]
18b40 2b 30 78 61 34 62 65 65 61 34 34 2c 20 20 34 29  +0xa4beea44,  4)
18b50 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
18b60 50 28 46 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63  P(F3, d, a, b, c
18b70 2c 20 69 6e 5b 20 34 5d 2b 30 78 34 62 64 65 63  , in[ 4]+0x4bdec
18b80 66 61 39 2c 20 31 31 29 3b 0a 20 20 20 20 20 20  fa9, 11);.      
18b90 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20 63 2c    MD5STEP(F3, c,
18ba0 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 37 5d   d, a, b, in[ 7]
18bb0 2b 30 78 66 36 62 62 34 62 36 30 2c 20 31 36 29  +0xf6bb4b60, 16)
18bc0 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
18bd0 50 28 46 33 2c 20 62 2c 20 63 2c 20 64 2c 20 61  P(F3, b, c, d, a
18be0 2c 20 69 6e 5b 31 30 5d 2b 30 78 62 65 62 66 62  , in[10]+0xbebfb
18bf0 63 37 30 2c 20 32 33 29 3b 0a 20 20 20 20 20 20  c70, 23);.      
18c00 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20 61 2c    MD5STEP(F3, a,
18c10 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 31 33 5d   b, c, d, in[13]
18c20 2b 30 78 32 38 39 62 37 65 63 36 2c 20 20 34 29  +0x289b7ec6,  4)
18c30 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
18c40 50 28 46 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63  P(F3, d, a, b, c
18c50 2c 20 69 6e 5b 20 30 5d 2b 30 78 65 61 61 31 32  , in[ 0]+0xeaa12
18c60 37 66 61 2c 20 31 31 29 3b 0a 20 20 20 20 20 20  7fa, 11);.      
18c70 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20 63 2c    MD5STEP(F3, c,
18c80 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 33 5d   d, a, b, in[ 3]
18c90 2b 30 78 64 34 65 66 33 30 38 35 2c 20 31 36 29  +0xd4ef3085, 16)
18ca0 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
18cb0 50 28 46 33 2c 20 62 2c 20 63 2c 20 64 2c 20 61  P(F3, b, c, d, a
18cc0 2c 20 69 6e 5b 20 36 5d 2b 30 78 30 34 38 38 31  , in[ 6]+0x04881
18cd0 64 30 35 2c 20 32 33 29 3b 0a 20 20 20 20 20 20  d05, 23);.      
18ce0 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20 61 2c    MD5STEP(F3, a,
18cf0 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 39 5d   b, c, d, in[ 9]
18d00 2b 30 78 64 39 64 34 64 30 33 39 2c 20 20 34 29  +0xd9d4d039,  4)
18d10 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
18d20 50 28 46 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63  P(F3, d, a, b, c
18d30 2c 20 69 6e 5b 31 32 5d 2b 30 78 65 36 64 62 39  , in[12]+0xe6db9
18d40 39 65 35 2c 20 31 31 29 3b 0a 20 20 20 20 20 20  9e5, 11);.      
18d50 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20 63 2c    MD5STEP(F3, c,
18d60 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 35 5d   d, a, b, in[15]
18d70 2b 30 78 31 66 61 32 37 63 66 38 2c 20 31 36 29  +0x1fa27cf8, 16)
18d80 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
18d90 50 28 46 33 2c 20 62 2c 20 63 2c 20 64 2c 20 61  P(F3, b, c, d, a
18da0 2c 20 69 6e 5b 20 32 5d 2b 30 78 63 34 61 63 35  , in[ 2]+0xc4ac5
18db0 36 36 35 2c 20 32 33 29 3b 0a 0a 20 20 20 20 20  665, 23);..     
18dc0 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 61     MD5STEP(F4, a
18dd0 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 30  , b, c, d, in[ 0
18de0 5d 2b 30 78 66 34 32 39 32 32 34 34 2c 20 20 36  ]+0xf4292244,  6
18df0 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
18e00 45 50 28 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20  EP(F4, d, a, b, 
18e10 63 2c 20 69 6e 5b 20 37 5d 2b 30 78 34 33 32 61  c, in[ 7]+0x432a
18e20 66 66 39 37 2c 20 31 30 29 3b 0a 20 20 20 20 20  ff97, 10);.     
18e30 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 63     MD5STEP(F4, c
18e40 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 34  , d, a, b, in[14
18e50 5d 2b 30 78 61 62 39 34 32 33 61 37 2c 20 31 35  ]+0xab9423a7, 15
18e60 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
18e70 45 50 28 46 34 2c 20 62 2c 20 63 2c 20 64 2c 20  EP(F4, b, c, d, 
18e80 61 2c 20 69 6e 5b 20 35 5d 2b 30 78 66 63 39 33  a, in[ 5]+0xfc93
18e90 61 30 33 39 2c 20 32 31 29 3b 0a 20 20 20 20 20  a039, 21);.     
18ea0 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 61     MD5STEP(F4, a
18eb0 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 31 32  , b, c, d, in[12
18ec0 5d 2b 30 78 36 35 35 62 35 39 63 33 2c 20 20 36  ]+0x655b59c3,  6
18ed0 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
18ee0 45 50 28 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20  EP(F4, d, a, b, 
18ef0 63 2c 20 69 6e 5b 20 33 5d 2b 30 78 38 66 30 63  c, in[ 3]+0x8f0c
18f00 63 63 39 32 2c 20 31 30 29 3b 0a 20 20 20 20 20  cc92, 10);.     
18f10 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 63     MD5STEP(F4, c
18f20 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 30  , d, a, b, in[10
18f30 5d 2b 30 78 66 66 65 66 66 34 37 64 2c 20 31 35  ]+0xffeff47d, 15
18f40 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
18f50 45 50 28 46 34 2c 20 62 2c 20 63 2c 20 64 2c 20  EP(F4, b, c, d, 
18f60 61 2c 20 69 6e 5b 20 31 5d 2b 30 78 38 35 38 34  a, in[ 1]+0x8584
18f70 35 64 64 31 2c 20 32 31 29 3b 0a 20 20 20 20 20  5dd1, 21);.     
18f80 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 61     MD5STEP(F4, a
18f90 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 38  , b, c, d, in[ 8
18fa0 5d 2b 30 78 36 66 61 38 37 65 34 66 2c 20 20 36  ]+0x6fa87e4f,  6
18fb0 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
18fc0 45 50 28 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20  EP(F4, d, a, b, 
18fd0 63 2c 20 69 6e 5b 31 35 5d 2b 30 78 66 65 32 63  c, in[15]+0xfe2c
18fe0 65 36 65 30 2c 20 31 30 29 3b 0a 20 20 20 20 20  e6e0, 10);.     
18ff0 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 63     MD5STEP(F4, c
19000 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 36  , d, a, b, in[ 6
19010 5d 2b 30 78 61 33 30 31 34 33 31 34 2c 20 31 35  ]+0xa3014314, 15
19020 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
19030 45 50 28 46 34 2c 20 62 2c 20 63 2c 20 64 2c 20  EP(F4, b, c, d, 
19040 61 2c 20 69 6e 5b 31 33 5d 2b 30 78 34 65 30 38  a, in[13]+0x4e08
19050 31 31 61 31 2c 20 32 31 29 3b 0a 20 20 20 20 20  11a1, 21);.     
19060 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 61     MD5STEP(F4, a
19070 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 34  , b, c, d, in[ 4
19080 5d 2b 30 78 66 37 35 33 37 65 38 32 2c 20 20 36  ]+0xf7537e82,  6
19090 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
190a0 45 50 28 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20  EP(F4, d, a, b, 
190b0 63 2c 20 69 6e 5b 31 31 5d 2b 30 78 62 64 33 61  c, in[11]+0xbd3a
190c0 66 32 33 35 2c 20 31 30 29 3b 0a 20 20 20 20 20  f235, 10);.     
190d0 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 63     MD5STEP(F4, c
190e0 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 32  , d, a, b, in[ 2
190f0 5d 2b 30 78 32 61 64 37 64 32 62 62 2c 20 31 35  ]+0x2ad7d2bb, 15
19100 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
19110 45 50 28 46 34 2c 20 62 2c 20 63 2c 20 64 2c 20  EP(F4, b, c, d, 
19120 61 2c 20 69 6e 5b 20 39 5d 2b 30 78 65 62 38 36  a, in[ 9]+0xeb86
19130 64 33 39 31 2c 20 32 31 29 3b 0a 0a 20 20 20 20  d391, 21);..    
19140 20 20 20 20 62 75 66 5b 30 5d 20 2b 3d 20 61 3b      buf[0] += a;
19150 0a 20 20 20 20 20 20 20 20 62 75 66 5b 31 5d 20  .        buf[1] 
19160 2b 3d 20 62 3b 0a 20 20 20 20 20 20 20 20 62 75  += b;.        bu
19170 66 5b 32 5d 20 2b 3d 20 63 3b 0a 20 20 20 20 20  f[2] += c;.     
19180 20 20 20 62 75 66 5b 33 5d 20 2b 3d 20 64 3b 0a     buf[3] += d;.
19190 7d 0a 0a 2f 2a 0a 20 2a 20 53 74 61 72 74 20 4d  }../*. * Start M
191a0 44 35 20 61 63 63 75 6d 75 6c 61 74 69 6f 6e 2e  D5 accumulation.
191b0 20 20 53 65 74 20 62 69 74 20 63 6f 75 6e 74 20    Set bit count 
191c0 74 6f 20 30 20 61 6e 64 20 62 75 66 66 65 72 20  to 0 and buffer 
191d0 74 6f 20 6d 79 73 74 65 72 69 6f 75 73 0a 20 2a  to mysterious. *
191e0 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
191f0 63 6f 6e 73 74 61 6e 74 73 2e 0a 20 2a 2f 0a 73  constants.. */.s
19200 74 61 74 69 63 20 76 6f 69 64 20 4d 44 35 49 6e  tatic void MD5In
19210 69 74 28 4d 44 35 43 6f 6e 74 65 78 74 20 2a 63  it(MD5Context *c
19220 74 78 29 7b 0a 20 20 20 20 20 20 20 20 63 74 78  tx){.        ctx
19230 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20  ->isInit = 1;.  
19240 20 20 20 20 20 20 63 74 78 2d 3e 62 75 66 5b 30        ctx->buf[0
19250 5d 20 3d 20 30 78 36 37 34 35 32 33 30 31 3b 0a  ] = 0x67452301;.
19260 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62 75 66          ctx->buf
19270 5b 31 5d 20 3d 20 30 78 65 66 63 64 61 62 38 39  [1] = 0xefcdab89
19280 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62  ;.        ctx->b
19290 75 66 5b 32 5d 20 3d 20 30 78 39 38 62 61 64 63  uf[2] = 0x98badc
192a0 66 65 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2d  fe;.        ctx-
192b0 3e 62 75 66 5b 33 5d 20 3d 20 30 78 31 30 33 32  >buf[3] = 0x1032
192c0 35 34 37 36 3b 0a 20 20 20 20 20 20 20 20 63 74  5476;.        ct
192d0 78 2d 3e 62 69 74 73 5b 30 5d 20 3d 20 30 3b 0a  x->bits[0] = 0;.
192e0 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62 69 74          ctx->bit
192f0 73 5b 31 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  s[1] = 0;.}../*.
19300 20 2a 20 55 70 64 61 74 65 20 63 6f 6e 74 65 78   * Update contex
19310 74 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68 65  t to reflect the
19320 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f   concatenation o
19330 66 20 61 6e 6f 74 68 65 72 20 62 75 66 66 65 72  f another buffer
19340 20 66 75 6c 6c 0a 20 2a 20 6f 66 20 62 79 74 65   full. * of byte
19350 73 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 0a 76  s.. */.static .v
19360 6f 69 64 20 4d 44 35 55 70 64 61 74 65 28 4d 44  oid MD5Update(MD
19370 35 43 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20 63  5Context *ctx, c
19380 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
19390 61 72 20 2a 62 75 66 2c 20 75 6e 73 69 67 6e 65  ar *buf, unsigne
193a0 64 20 69 6e 74 20 6c 65 6e 29 7b 0a 20 20 20 20  d int len){.    
193b0 20 20 20 20 75 69 6e 74 33 32 20 74 3b 0a 0a 20      uint32 t;.. 
193c0 20 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65         /* Update
193d0 20 62 69 74 63 6f 75 6e 74 20 2a 2f 0a 0a 20 20   bitcount */..  
193e0 20 20 20 20 20 20 74 20 3d 20 63 74 78 2d 3e 62        t = ctx->b
193f0 69 74 73 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20  its[0];.        
19400 69 66 20 28 28 63 74 78 2d 3e 62 69 74 73 5b 30  if ((ctx->bits[0
19410 5d 20 3d 20 74 20 2b 20 28 28 75 69 6e 74 33 32  ] = t + ((uint32
19420 29 6c 65 6e 20 3c 3c 20 33 29 29 20 3c 20 74 29  )len << 3)) < t)
19430 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19440 20 63 74 78 2d 3e 62 69 74 73 5b 31 5d 2b 2b 3b   ctx->bits[1]++;
19450 20 2f 2a 20 43 61 72 72 79 20 66 72 6f 6d 20 6c   /* Carry from l
19460 6f 77 20 74 6f 20 68 69 67 68 20 2a 2f 0a 20 20  ow to high */.  
19470 20 20 20 20 20 20 63 74 78 2d 3e 62 69 74 73 5b        ctx->bits[
19480 31 5d 20 2b 3d 20 6c 65 6e 20 3e 3e 20 32 39 3b  1] += len >> 29;
19490 0a 0a 20 20 20 20 20 20 20 20 74 20 3d 20 28 74  ..        t = (t
194a0 20 3e 3e 20 33 29 20 26 20 30 78 33 66 3b 20 20   >> 3) & 0x3f;  
194b0 20 20 2f 2a 20 42 79 74 65 73 20 61 6c 72 65 61    /* Bytes alrea
194c0 64 79 20 69 6e 20 73 68 73 49 6e 66 6f 2d 3e 64  dy in shsInfo->d
194d0 61 74 61 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ata */..        
194e0 2f 2a 20 48 61 6e 64 6c 65 20 61 6e 79 20 6c 65  /* Handle any le
194f0 61 64 69 6e 67 20 6f 64 64 2d 73 69 7a 65 64 20  ading odd-sized 
19500 63 68 75 6e 6b 73 20 2a 2f 0a 0a 20 20 20 20 20  chunks */..     
19510 20 20 20 69 66 20 28 20 74 20 29 20 7b 0a 20 20     if ( t ) {.  
19520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75 6e                un
19530 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 20 3d  signed char *p =
19540 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
19550 2a 29 63 74 78 2d 3e 69 6e 20 2b 20 74 3b 0a 0a  *)ctx->in + t;..
19560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19570 74 20 3d 20 36 34 2d 74 3b 0a 20 20 20 20 20 20  t = 64-t;.      
19580 20 20 20 20 20 20 20 20 20 20 69 66 20 28 6c 65            if (le
19590 6e 20 3c 20 74 29 20 7b 0a 20 20 20 20 20 20 20  n < t) {.       
195a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
195b0 20 6d 65 6d 63 70 79 28 70 2c 20 62 75 66 2c 20   memcpy(p, buf, 
195c0 6c 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  len);.          
195d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
195e0 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  turn;.          
195f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
19600 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
19610 2c 20 62 75 66 2c 20 74 29 3b 0a 20 20 20 20 20  , buf, t);.     
19620 20 20 20 20 20 20 20 20 20 20 20 62 79 74 65 52             byteR
19630 65 76 65 72 73 65 28 63 74 78 2d 3e 69 6e 2c 20  everse(ctx->in, 
19640 31 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  16);.           
19650 20 20 20 20 20 4d 44 35 54 72 61 6e 73 66 6f 72       MD5Transfor
19660 6d 28 63 74 78 2d 3e 62 75 66 2c 20 28 75 69 6e  m(ctx->buf, (uin
19670 74 33 32 20 2a 29 63 74 78 2d 3e 69 6e 29 3b 0a  t32 *)ctx->in);.
19680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19690 62 75 66 20 2b 3d 20 74 3b 0a 20 20 20 20 20 20  buf += t;.      
196a0 20 20 20 20 20 20 20 20 20 20 6c 65 6e 20 2d 3d            len -=
196b0 20 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20   t;.        }.. 
196c0 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 63 65 73         /* Proces
196d0 73 20 64 61 74 61 20 69 6e 20 36 34 2d 62 79 74  s data in 64-byt
196e0 65 20 63 68 75 6e 6b 73 20 2a 2f 0a 0a 20 20 20  e chunks */..   
196f0 20 20 20 20 20 77 68 69 6c 65 20 28 6c 65 6e 20       while (len 
19700 3e 3d 20 36 34 29 20 7b 0a 20 20 20 20 20 20 20  >= 64) {.       
19710 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
19720 63 74 78 2d 3e 69 6e 2c 20 62 75 66 2c 20 36 34  ctx->in, buf, 64
19730 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
19740 20 20 20 62 79 74 65 52 65 76 65 72 73 65 28 63     byteReverse(c
19750 74 78 2d 3e 69 6e 2c 20 31 36 29 3b 0a 20 20 20  tx->in, 16);.   
19760 20 20 20 20 20 20 20 20 20 20 20 20 20 4d 44 35               MD5
19770 54 72 61 6e 73 66 6f 72 6d 28 63 74 78 2d 3e 62  Transform(ctx->b
19780 75 66 2c 20 28 75 69 6e 74 33 32 20 2a 29 63 74  uf, (uint32 *)ct
19790 78 2d 3e 69 6e 29 3b 0a 20 20 20 20 20 20 20 20  x->in);.        
197a0 20 20 20 20 20 20 20 20 62 75 66 20 2b 3d 20 36          buf += 6
197b0 34 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  4;.             
197c0 20 20 20 6c 65 6e 20 2d 3d 20 36 34 3b 0a 20 20     len -= 64;.  
197d0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
197e0 20 2f 2a 20 48 61 6e 64 6c 65 20 61 6e 79 20 72   /* Handle any r
197f0 65 6d 61 69 6e 69 6e 67 20 62 79 74 65 73 20 6f  emaining bytes o
19800 66 20 64 61 74 61 2e 20 2a 2f 0a 0a 20 20 20 20  f data. */..    
19810 20 20 20 20 6d 65 6d 63 70 79 28 63 74 78 2d 3e      memcpy(ctx->
19820 69 6e 2c 20 62 75 66 2c 20 6c 65 6e 29 3b 0a 7d  in, buf, len);.}
19830 0a 0a 2f 2a 0a 20 2a 20 46 69 6e 61 6c 20 77 72  ../*. * Final wr
19840 61 70 75 70 20 2d 20 70 61 64 20 74 6f 20 36 34  apup - pad to 64
19850 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79 20 77  -byte boundary w
19860 69 74 68 20 74 68 65 20 62 69 74 20 70 61 74 74  ith the bit patt
19870 65 72 6e 20 0a 20 2a 20 31 20 30 2a 20 28 36 34  ern . * 1 0* (64
19880 2d 62 69 74 20 63 6f 75 6e 74 20 6f 66 20 62 69  -bit count of bi
19890 74 73 20 70 72 6f 63 65 73 73 65 64 2c 20 4d 53  ts processed, MS
198a0 42 2d 66 69 72 73 74 29 0a 20 2a 2f 0a 73 74 61  B-first). */.sta
198b0 74 69 63 20 76 6f 69 64 20 4d 44 35 46 69 6e 61  tic void MD5Fina
198c0 6c 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  l(unsigned char 
198d0 64 69 67 65 73 74 5b 31 36 5d 2c 20 4d 44 35 43  digest[16], MD5C
198e0 6f 6e 74 65 78 74 20 2a 63 74 78 29 7b 0a 20 20  ontext *ctx){.  
198f0 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63        unsigned c
19900 6f 75 6e 74 3b 0a 20 20 20 20 20 20 20 20 75 6e  ount;.        un
19910 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a  signed char *p;.
19920 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70  .        /* Comp
19930 75 74 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  ute number of by
19940 74 65 73 20 6d 6f 64 20 36 34 20 2a 2f 0a 20 20  tes mod 64 */.  
19950 20 20 20 20 20 20 63 6f 75 6e 74 20 3d 20 28 63        count = (c
19960 74 78 2d 3e 62 69 74 73 5b 30 5d 20 3e 3e 20 33  tx->bits[0] >> 3
19970 29 20 26 20 30 78 33 46 3b 0a 0a 20 20 20 20 20  ) & 0x3F;..     
19980 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 66 69     /* Set the fi
19990 72 73 74 20 63 68 61 72 20 6f 66 20 70 61 64 64  rst char of padd
199a0 69 6e 67 20 74 6f 20 30 78 38 30 2e 20 20 54 68  ing to 0x80.  Th
199b0 69 73 20 69 73 20 73 61 66 65 20 73 69 6e 63 65  is is safe since
199c0 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 20 20   there is.      
199d0 20 20 20 20 20 61 6c 77 61 79 73 20 61 74 20 6c       always at l
199e0 65 61 73 74 20 6f 6e 65 20 62 79 74 65 20 66 72  east one byte fr
199f0 65 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 20  ee */.        p 
19a00 3d 20 63 74 78 2d 3e 69 6e 20 2b 20 63 6f 75 6e  = ctx->in + coun
19a10 74 3b 0a 20 20 20 20 20 20 20 20 2a 70 2b 2b 20  t;.        *p++ 
19a20 3d 20 30 78 38 30 3b 0a 0a 20 20 20 20 20 20 20  = 0x80;..       
19a30 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 70 61 64   /* Bytes of pad
19a40 64 69 6e 67 20 6e 65 65 64 65 64 20 74 6f 20 6d  ding needed to m
19a50 61 6b 65 20 36 34 20 62 79 74 65 73 20 2a 2f 0a  ake 64 bytes */.
19a60 20 20 20 20 20 20 20 20 63 6f 75 6e 74 20 3d 20          count = 
19a70 36 34 20 2d 20 31 20 2d 20 63 6f 75 6e 74 3b 0a  64 - 1 - count;.
19a80 0a 20 20 20 20 20 20 20 20 2f 2a 20 50 61 64 20  .        /* Pad 
19a90 6f 75 74 20 74 6f 20 35 36 20 6d 6f 64 20 36 34  out to 56 mod 64
19aa0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 20 28   */.        if (
19ab0 63 6f 75 6e 74 20 3c 20 38 29 20 7b 0a 20 20 20  count < 8) {.   
19ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19ad0 54 77 6f 20 6c 6f 74 73 20 6f 66 20 70 61 64 64  Two lots of padd
19ae0 69 6e 67 3a 20 20 50 61 64 20 74 68 65 20 66 69  ing:  Pad the fi
19af0 72 73 74 20 62 6c 6f 63 6b 20 74 6f 20 36 34 20  rst block to 64 
19b00 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  bytes */.       
19b10 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28           memset(
19b20 70 2c 20 30 2c 20 63 6f 75 6e 74 29 3b 0a 20 20  p, 0, count);.  
19b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 79                by
19b40 74 65 52 65 76 65 72 73 65 28 63 74 78 2d 3e 69  teReverse(ctx->i
19b50 6e 2c 20 31 36 29 3b 0a 20 20 20 20 20 20 20 20  n, 16);.        
19b60 20 20 20 20 20 20 20 20 4d 44 35 54 72 61 6e 73          MD5Trans
19b70 66 6f 72 6d 28 63 74 78 2d 3e 62 75 66 2c 20 28  form(ctx->buf, (
19b80 75 69 6e 74 33 32 20 2a 29 63 74 78 2d 3e 69 6e  uint32 *)ctx->in
19b90 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
19ba0 20 20 20 20 2f 2a 20 4e 6f 77 20 66 69 6c 6c 20      /* Now fill 
19bb0 74 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 77  the next block w
19bc0 69 74 68 20 35 36 20 62 79 74 65 73 20 2a 2f 0a  ith 56 bytes */.
19bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19be0 6d 65 6d 73 65 74 28 63 74 78 2d 3e 69 6e 2c 20  memset(ctx->in, 
19bf0 30 2c 20 35 36 29 3b 0a 20 20 20 20 20 20 20 20  0, 56);.        
19c00 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
19c10 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 64 20           /* Pad 
19c20 62 6c 6f 63 6b 20 74 6f 20 35 36 20 62 79 74 65  block to 56 byte
19c30 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  s */.           
19c40 20 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30       memset(p, 0
19c50 2c 20 63 6f 75 6e 74 2d 38 29 3b 0a 20 20 20 20  , count-8);.    
19c60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 79      }.        by
19c70 74 65 52 65 76 65 72 73 65 28 63 74 78 2d 3e 69  teReverse(ctx->i
19c80 6e 2c 20 31 34 29 3b 0a 0a 20 20 20 20 20 20 20  n, 14);..       
19c90 20 2f 2a 20 41 70 70 65 6e 64 20 6c 65 6e 67 74   /* Append lengt
19ca0 68 20 69 6e 20 62 69 74 73 20 61 6e 64 20 74 72  h in bits and tr
19cb0 61 6e 73 66 6f 72 6d 20 2a 2f 0a 20 20 20 20 20  ansform */.     
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 34 20 5d 20 3d 20 63  x->in)[ 14 ] = c
19ce0 74 78 2d 3e 62 69 74 73 5b 30 5d 3b 0a 20 20 20  tx->bits[0];.   
19cf0 20 20 20 20 20 28 28 75 69 6e 74 33 32 20 2a 29       ((uint32 *)
19d00 63 74 78 2d 3e 69 6e 29 5b 20 31 35 20 5d 20 3d  ctx->in)[ 15 ] =
19d10 20 63 74 78 2d 3e 62 69 74 73 5b 31 5d 3b 0a 0a   ctx->bits[1];..
19d20 20 20 20 20 20 20 20 20 4d 44 35 54 72 61 6e 73          MD5Trans
19d30 66 6f 72 6d 28 63 74 78 2d 3e 62 75 66 2c 20 28  form(ctx->buf, (
19d40 75 69 6e 74 33 32 20 2a 29 63 74 78 2d 3e 69 6e  uint32 *)ctx->in
19d50 29 3b 0a 20 20 20 20 20 20 20 20 62 79 74 65 52  );.        byteR
19d60 65 76 65 72 73 65 28 28 75 6e 73 69 67 6e 65 64  everse((unsigned
19d70 20 63 68 61 72 20 2a 29 63 74 78 2d 3e 62 75 66   char *)ctx->buf
19d80 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  , 4);.        me
19d90 6d 63 70 79 28 64 69 67 65 73 74 2c 20 63 74 78  mcpy(digest, ctx
19da0 2d 3e 62 75 66 2c 20 31 36 29 3b 0a 20 20 20 20  ->buf, 16);.    
19db0 20 20 20 20 6d 65 6d 73 65 74 28 63 74 78 2c 20      memset(ctx, 
19dc0 30 2c 20 73 69 7a 65 6f 66 28 63 74 78 29 29 3b  0, sizeof(ctx));
19dd0 20 20 20 20 2f 2a 20 49 6e 20 63 61 73 65 20 69      /* In case i
19de0 74 20 69 73 20 73 65 6e 73 69 74 69 76 65 20 2a  t is sensitive *
19df0 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  /.}../*.** Conve
19e00 72 74 20 61 20 31 32 38 2d 62 69 74 20 4d 44 35  rt a 128-bit MD5
19e10 20 64 69 67 65 73 74 20 69 6e 74 6f 20 61 20 33   digest into a 3
19e20 32 2d 64 69 67 69 74 20 62 61 73 65 2d 31 36 20  2-digit base-16 
19e30 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  number..*/.stati
19e40 63 20 76 6f 69 64 20 4d 44 35 44 69 67 65 73 74  c void MD5Digest
19e50 54 6f 42 61 73 65 31 36 28 75 6e 73 69 67 6e 65  ToBase16(unsigne
19e60 64 20 63 68 61 72 20 2a 64 69 67 65 73 74 2c 20  d char *digest, 
19e70 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73  char *zBuf){.  s
19e80 74 61 74 69 63 20 63 68 61 72 20 63 6f 6e 73 74  tatic char const
19e90 20 7a 45 6e 63 6f 64 65 5b 5d 20 3d 20 22 30 31   zEncode[] = "01
19ea0 32 33 34 35 36 37 38 39 61 62 63 64 65 66 22 3b  23456789abcdef";
19eb0 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20  .  int i, j;..  
19ec0 66 6f 72 28 6a 3d 69 3d 30 3b 20 69 3c 31 36 3b  for(j=i=0; i<16;
19ed0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 61   i++){.    int a
19ee0 20 3d 20 64 69 67 65 73 74 5b 69 5d 3b 0a 20 20   = digest[i];.  
19ef0 20 20 7a 42 75 66 5b 6a 2b 2b 5d 20 3d 20 7a 45    zBuf[j++] = zE
19f00 6e 63 6f 64 65 5b 28 61 3e 3e 34 29 26 30 78 66  ncode[(a>>4)&0xf
19f10 5d 3b 0a 20 20 20 20 7a 42 75 66 5b 6a 2b 2b 5d  ];.    zBuf[j++]
19f20 20 3d 20 7a 45 6e 63 6f 64 65 5b 61 20 26 20 30   = zEncode[a & 0
19f30 78 66 5d 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b  xf];.  }.  zBuf[
19f40 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  j] = 0;.}.../*.*
19f50 2a 20 43 6f 6e 76 65 72 74 20 61 20 31 32 38 2d  * Convert a 128-
19f60 62 69 74 20 4d 44 35 20 64 69 67 65 73 74 20 69  bit MD5 digest i
19f70 6e 74 6f 20 73 65 71 75 65 6e 63 79 20 6f 66 20  nto sequency of 
19f80 65 69 67 68 74 20 35 2d 64 69 67 69 74 20 69 6e  eight 5-digit in
19f90 74 65 67 65 72 73 0a 2a 2a 20 65 61 63 68 20 72  tegers.** each r
19fa0 65 70 72 65 73 65 6e 74 69 6e 67 20 31 36 20 62  epresenting 16 b
19fb0 69 74 73 20 6f 66 20 74 68 65 20 64 69 67 65 73  its of the diges
19fc0 74 20 61 6e 64 20 73 65 70 61 72 61 74 65 64 20  t and separated 
19fd0 66 72 6f 6d 20 65 61 63 68 0a 2a 2a 20 6f 74 68  from each.** oth
19fe0 65 72 20 62 79 20 61 20 22 2d 22 20 63 68 61 72  er by a "-" char
19ff0 61 63 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  acter..*/.static
1a000 20 76 6f 69 64 20 4d 44 35 44 69 67 65 73 74 54   void MD5DigestT
1a010 6f 42 61 73 65 31 30 78 38 28 75 6e 73 69 67 6e  oBase10x8(unsign
1a020 65 64 20 63 68 61 72 20 64 69 67 65 73 74 5b 31  ed char digest[1
1a030 36 5d 2c 20 63 68 61 72 20 7a 44 69 67 65 73 74  6], char zDigest
1a040 5b 35 30 5d 29 7b 0a 20 20 69 6e 74 20 69 2c 20  [50]){.  int i, 
1a050 6a 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  j;.  unsigned in
1a060 74 20 78 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  t x;.  for(i=j=0
1a070 3b 20 69 3c 31 36 3b 20 69 2b 3d 32 29 7b 0a 20  ; i<16; i+=2){. 
1a080 20 20 20 78 20 3d 20 64 69 67 65 73 74 5b 69 5d     x = digest[i]
1a090 2a 32 35 36 20 2b 20 64 69 67 65 73 74 5b 69 2b  *256 + digest[i+
1a0a0 31 5d 3b 0a 20 20 20 20 69 66 28 20 69 3e 30 20  1];.    if( i>0 
1a0b0 29 20 7a 44 69 67 65 73 74 5b 6a 2b 2b 5d 20 3d  ) zDigest[j++] =
1a0c0 20 27 2d 27 3b 0a 20 20 20 20 73 70 72 69 6e 74   '-';.    sprint
1a0d0 66 28 26 7a 44 69 67 65 73 74 5b 6a 5d 2c 20 22  f(&zDigest[j], "
1a0e0 25 30 35 75 22 2c 20 78 29 3b 0a 20 20 20 20 6a  %05u", x);.    j
1a0f0 20 2b 3d 20 35 3b 0a 20 20 7d 0a 20 20 7a 44 69   += 5;.  }.  zDi
1a100 67 65 73 74 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a  gest[j] = 0;.}..
1a110 2f 2a 0a 2a 2a 20 41 20 54 43 4c 20 63 6f 6d 6d  /*.** A TCL comm
1a120 61 6e 64 20 66 6f 72 20 6d 64 35 2e 20 20 54 68  and for md5.  Th
1a130 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  e argument is th
1a140 65 20 74 65 78 74 20 74 6f 20 62 65 20 68 61 73  e text to be has
1a150 68 65 64 2e 20 20 54 68 65 0a 2a 2a 20 52 65 73  hed.  The.** Res
1a160 75 6c 74 20 69 73 20 74 68 65 20 68 61 73 68 20  ult is the hash 
1a170 69 6e 20 62 61 73 65 36 34 2e 20 20 0a 2a 2f 0a  in base64.  .*/.
1a180 73 74 61 74 69 63 20 69 6e 74 20 6d 64 35 5f 63  static int md5_c
1a190 6d 64 28 76 6f 69 64 2a 63 64 2c 20 54 63 6c 5f  md(void*cd, Tcl_
1a1a0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
1a1b0 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20  int argc, const 
1a1c0 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20  char **argv){.  
1a1d0 4d 44 35 43 6f 6e 74 65 78 74 20 63 74 78 3b 0a  MD5Context ctx;.
1a1e0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1a1f0 64 69 67 65 73 74 5b 31 36 5d 3b 0a 20 20 63 68  digest[16];.  ch
1a200 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 76  ar zBuf[50];.  v
1a210 6f 69 64 20 28 2a 63 6f 6e 76 65 72 74 65 72 29  oid (*converter)
1a220 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 2c  (unsigned char*,
1a230 20 63 68 61 72 2a 29 3b 0a 0a 20 20 69 66 28 20   char*);..  if( 
1a240 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  argc!=2 ){.    T
1a250 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1a260 69 6e 74 65 72 70 2c 22 77 72 6f 6e 67 20 23 20  interp,"wrong # 
1a270 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1a280 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20  \"", argv[0], . 
1a290 20 20 20 20 20 20 20 22 20 54 45 58 54 5c 22 22         " TEXT\""
1a2a0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1a2b0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1a2c0 20 20 4d 44 35 49 6e 69 74 28 26 63 74 78 29 3b    MD5Init(&ctx);
1a2d0 0a 20 20 4d 44 35 55 70 64 61 74 65 28 26 63 74  .  MD5Update(&ct
1a2e0 78 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  x, (unsigned cha
1a2f0 72 2a 29 61 72 67 76 5b 31 5d 2c 20 28 75 6e 73  r*)argv[1], (uns
1a300 69 67 6e 65 64 29 73 74 72 6c 65 6e 28 61 72 67  igned)strlen(arg
1a310 76 5b 31 5d 29 29 3b 0a 20 20 4d 44 35 46 69 6e  v[1]));.  MD5Fin
1a320 61 6c 28 64 69 67 65 73 74 2c 20 26 63 74 78 29  al(digest, &ctx)
1a330 3b 0a 20 20 63 6f 6e 76 65 72 74 65 72 20 3d 20  ;.  converter = 
1a340 28 76 6f 69 64 28 2a 29 28 75 6e 73 69 67 6e 65  (void(*)(unsigne
1a350 64 20 63 68 61 72 2a 2c 63 68 61 72 2a 29 29 63  d char*,char*))c
1a360 64 3b 0a 20 20 63 6f 6e 76 65 72 74 65 72 28 64  d;.  converter(d
1a370 69 67 65 73 74 2c 20 7a 42 75 66 29 3b 0a 20 20  igest, zBuf);.  
1a380 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1a390 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 28  (interp, zBuf, (
1a3a0 63 68 61 72 2a 29 30 29 3b 0a 20 20 72 65 74 75  char*)0);.  retu
1a3b0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1a3c0 0a 2a 2a 20 41 20 54 43 4c 20 63 6f 6d 6d 61 6e  .** A TCL comman
1a3d0 64 20 74 6f 20 74 61 6b 65 20 74 68 65 20 6d 64  d to take the md
1a3e0 35 20 68 61 73 68 20 6f 66 20 61 20 66 69 6c 65  5 hash of a file
1a3f0 2e 20 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  .  The argument 
1a400 69 73 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f  is the.** name o
1a410 66 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73  f the file..*/.s
1a420 74 61 74 69 63 20 69 6e 74 20 6d 64 35 66 69 6c  tatic int md5fil
1a430 65 5f 63 6d 64 28 76 6f 69 64 2a 63 64 2c 20 54  e_cmd(void*cd, T
1a440 63 6c 5f 49 6e 74 65 72 70 2a 69 6e 74 65 72 70  cl_Interp*interp
1a450 2c 20 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73  , int argc, cons
1a460 74 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a  t char **argv){.
1a470 20 20 46 49 4c 45 20 2a 69 6e 3b 0a 20 20 4d 44    FILE *in;.  MD
1a480 35 43 6f 6e 74 65 78 74 20 63 74 78 3b 0a 20 20  5Context ctx;.  
1a490 76 6f 69 64 20 28 2a 63 6f 6e 76 65 72 74 65 72  void (*converter
1a4a0 29 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a  )(unsigned char*
1a4b0 2c 20 63 68 61 72 2a 29 3b 0a 20 20 75 6e 73 69  , char*);.  unsi
1a4c0 67 6e 65 64 20 63 68 61 72 20 64 69 67 65 73 74  gned char digest
1a4d0 5b 31 36 5d 3b 0a 20 20 63 68 61 72 20 7a 42 75  [16];.  char zBu
1a4e0 66 5b 31 30 32 34 30 5d 3b 0a 0a 20 20 69 66 28  f[10240];..  if(
1a4f0 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20   argc!=2 ){.    
1a500 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1a510 28 69 6e 74 65 72 70 2c 22 77 72 6f 6e 67 20 23  (interp,"wrong #
1a520 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1a530 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a   \"", argv[0], .
1a540 20 20 20 20 20 20 20 20 22 20 46 49 4c 45 4e 41          " FILENA
1a550 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  ME\"", 0);.    r
1a560 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1a570 0a 20 20 7d 0a 20 20 69 6e 20 3d 20 66 6f 70 65  .  }.  in = fope
1a580 6e 28 61 72 67 76 5b 31 5d 2c 22 72 62 22 29 3b  n(argv[1],"rb");
1a590 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a  .  if( in==0 ){.
1a5a0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1a5b0 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 75 6e 61  sult(interp,"una
1a5c0 62 6c 65 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65  ble to open file
1a5d0 20 5c 22 22 2c 20 61 72 67 76 5b 31 5d 2c 20 0a   \"", argv[1], .
1a5e0 20 20 20 20 20 20 20 20 20 22 5c 22 20 66 6f 72           "\" for
1a5f0 20 72 65 61 64 69 6e 67 22 2c 20 30 29 3b 0a 20   reading", 0);. 
1a600 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1a610 52 4f 52 3b 0a 20 20 7d 0a 20 20 4d 44 35 49 6e  ROR;.  }.  MD5In
1a620 69 74 28 26 63 74 78 29 3b 0a 20 20 66 6f 72 28  it(&ctx);.  for(
1a630 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  ;;){.    int n;.
1a640 20 20 20 20 6e 20 3d 20 28 69 6e 74 29 66 72 65      n = (int)fre
1a650 61 64 28 7a 42 75 66 2c 20 31 2c 20 73 69 7a 65  ad(zBuf, 1, size
1a660 6f 66 28 7a 42 75 66 29 2c 20 69 6e 29 3b 0a 20  of(zBuf), in);. 
1a670 20 20 20 69 66 28 20 6e 3c 3d 30 20 29 20 62 72     if( n<=0 ) br
1a680 65 61 6b 3b 0a 20 20 20 20 4d 44 35 55 70 64 61  eak;.    MD5Upda
1a690 74 65 28 26 63 74 78 2c 20 28 75 6e 73 69 67 6e  te(&ctx, (unsign
1a6a0 65 64 20 63 68 61 72 2a 29 7a 42 75 66 2c 20 28  ed char*)zBuf, (
1a6b0 75 6e 73 69 67 6e 65 64 29 6e 29 3b 0a 20 20 7d  unsigned)n);.  }
1a6c0 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20  .  fclose(in);. 
1a6d0 20 4d 44 35 46 69 6e 61 6c 28 64 69 67 65 73 74   MD5Final(digest
1a6e0 2c 20 26 63 74 78 29 3b 0a 20 20 63 6f 6e 76 65  , &ctx);.  conve
1a6f0 72 74 65 72 20 3d 20 28 76 6f 69 64 28 2a 29 28  rter = (void(*)(
1a700 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 2c 63  unsigned char*,c
1a710 68 61 72 2a 29 29 63 64 3b 0a 20 20 63 6f 6e 76  har*))cd;.  conv
1a720 65 72 74 65 72 28 64 69 67 65 73 74 2c 20 7a 42  erter(digest, zB
1a730 75 66 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  uf);.  Tcl_Appen
1a740 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1a750 7a 42 75 66 2c 20 28 63 68 61 72 2a 29 30 29 3b  zBuf, (char*)0);
1a760 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1a770 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  ;.}../*.** Regis
1a780 74 65 72 20 74 68 65 20 66 6f 75 72 20 6e 65 77  ter the four new
1a790 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 73 20 66 6f   TCL commands fo
1a7a0 72 20 67 65 6e 65 72 61 74 69 6e 67 20 4d 44 35  r generating MD5
1a7b0 20 63 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 77 69   checksums.** wi
1a7c0 74 68 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72  th the TCL inter
1a7d0 70 72 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 4d  preter..*/.int M
1a7e0 64 35 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  d5_Init(Tcl_Inte
1a7f0 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 54  rp *interp){.  T
1a800 63 6c 5f 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64  cl_CreateCommand
1a810 28 69 6e 74 65 72 70 2c 20 22 6d 64 35 22 2c 20  (interp, "md5", 
1a820 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 6d 64  (Tcl_CmdProc*)md
1a830 35 5f 63 6d 64 2c 0a 20 20 20 20 20 20 20 20 20  5_cmd,.         
1a840 20 20 20 20 20 20 20 20 20 20 20 4d 44 35 44 69             MD5Di
1a850 67 65 73 74 54 6f 42 61 73 65 31 36 2c 20 30 29  gestToBase16, 0)
1a860 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 43 6f  ;.  Tcl_CreateCo
1a870 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 6d  mmand(interp, "m
1a880 64 35 2d 31 30 78 38 22 2c 20 28 54 63 6c 5f 43  d5-10x8", (Tcl_C
1a890 6d 64 50 72 6f 63 2a 29 6d 64 35 5f 63 6d 64 2c  mdProc*)md5_cmd,
1a8a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a8b0 20 20 20 20 20 4d 44 35 44 69 67 65 73 74 54 6f       MD5DigestTo
1a8c0 42 61 73 65 31 30 78 38 2c 20 30 29 3b 0a 20 20  Base10x8, 0);.  
1a8d0 54 63 6c 5f 43 72 65 61 74 65 43 6f 6d 6d 61 6e  Tcl_CreateComman
1a8e0 64 28 69 6e 74 65 72 70 2c 20 22 6d 64 35 66 69  d(interp, "md5fi
1a8f0 6c 65 22 2c 20 28 54 63 6c 5f 43 6d 64 50 72 6f  le", (Tcl_CmdPro
1a900 63 2a 29 6d 64 35 66 69 6c 65 5f 63 6d 64 2c 0a  c*)md5file_cmd,.
1a910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a920 20 20 20 20 4d 44 35 44 69 67 65 73 74 54 6f 42      MD5DigestToB
1a930 61 73 65 31 36 2c 20 30 29 3b 0a 20 20 54 63 6c  ase16, 0);.  Tcl
1a940 5f 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69  _CreateCommand(i
1a950 6e 74 65 72 70 2c 20 22 6d 64 35 66 69 6c 65 2d  nterp, "md5file-
1a960 31 30 78 38 22 2c 20 28 54 63 6c 5f 43 6d 64 50  10x8", (Tcl_CmdP
1a970 72 6f 63 2a 29 6d 64 35 66 69 6c 65 5f 63 6d 64  roc*)md5file_cmd
1a980 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a990 20 20 20 20 20 20 4d 44 35 44 69 67 65 73 74 54        MD5DigestT
1a9a0 6f 42 61 73 65 31 30 78 38 2c 20 30 29 3b 0a 20  oBase10x8, 0);. 
1a9b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1a9c0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  }.#endif /* defi
1a9d0 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
1a9e0 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
1a9f0 54 45 5f 54 43 4c 4d 44 35 29 20 2a 2f 0a 0a 23  TE_TCLMD5) */..#
1aa00 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1aa10 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 44 75  E_TEST)./*.** Du
1aa20 72 69 6e 67 20 74 65 73 74 69 6e 67 2c 20 74 68  ring testing, th
1aa30 65 20 73 70 65 63 69 61 6c 20 6d 64 35 73 75 6d  e special md5sum
1aa40 28 29 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  () aggregate fun
1aa50 63 74 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62  ction is availab
1aa60 6c 65 2e 0a 2a 2a 20 69 6e 73 69 64 65 20 53 51  le..** inside SQ
1aa70 4c 69 74 65 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  Lite.  The follo
1aa80 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 69 6d  wing routines im
1aa90 70 6c 65 6d 65 6e 74 20 74 68 61 74 20 66 75 6e  plement that fun
1aaa0 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
1aab0 20 76 6f 69 64 20 6d 64 35 73 74 65 70 28 73 71   void md5step(sq
1aac0 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
1aad0 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
1aae0 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
1aaf0 2a 2a 61 72 67 76 29 7b 0a 20 20 4d 44 35 43 6f  **argv){.  MD5Co
1ab00 6e 74 65 78 74 20 2a 70 3b 0a 20 20 69 6e 74 20  ntext *p;.  int 
1ab10 69 3b 0a 20 20 69 66 28 20 61 72 67 63 3c 31 20  i;.  if( argc<1 
1ab20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20  ) return;.  p = 
1ab30 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
1ab40 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78  e_context(contex
1ab50 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  t, sizeof(*p));.
1ab60 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
1ab70 75 72 6e 3b 0a 20 20 69 66 28 20 21 70 2d 3e 69  urn;.  if( !p->i
1ab80 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 4d 44 35  sInit ){.    MD5
1ab90 49 6e 69 74 28 70 29 3b 0a 20 20 7d 0a 20 20 66  Init(p);.  }.  f
1aba0 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20  or(i=0; i<argc; 
1abb0 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  i++){.    const 
1abc0 63 68 61 72 20 2a 7a 44 61 74 61 20 3d 20 28 63  char *zData = (c
1abd0 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
1abe0 75 65 5f 74 65 78 74 28 61 72 67 76 5b 69 5d 29  ue_text(argv[i])
1abf0 3b 0a 20 20 20 20 69 66 28 20 7a 44 61 74 61 20  ;.    if( zData 
1ac00 29 7b 0a 20 20 20 20 20 20 4d 44 35 55 70 64 61  ){.      MD5Upda
1ac10 74 65 28 70 2c 20 28 75 6e 73 69 67 6e 65 64 20  te(p, (unsigned 
1ac20 63 68 61 72 2a 29 7a 44 61 74 61 2c 20 28 69 6e  char*)zData, (in
1ac30 74 29 73 74 72 6c 65 6e 28 7a 44 61 74 61 29 29  t)strlen(zData))
1ac40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74  ;.    }.  }.}.st
1ac50 61 74 69 63 20 76 6f 69 64 20 6d 64 35 66 69 6e  atic void md5fin
1ac60 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f  alize(sqlite3_co
1ac70 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b  ntext *context){
1ac80 0a 20 20 4d 44 35 43 6f 6e 74 65 78 74 20 2a 70  .  MD5Context *p
1ac90 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
1aca0 72 20 64 69 67 65 73 74 5b 31 36 5d 3b 0a 20 20  r digest[16];.  
1acb0 63 68 61 72 20 7a 42 75 66 5b 33 33 5d 3b 0a 20  char zBuf[33];. 
1acc0 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67   p = sqlite3_agg
1acd0 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63  regate_context(c
1ace0 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a  ontext, sizeof(*
1acf0 70 29 29 3b 0a 20 20 4d 44 35 46 69 6e 61 6c 28  p));.  MD5Final(
1ad00 64 69 67 65 73 74 2c 70 29 3b 0a 20 20 4d 44 35  digest,p);.  MD5
1ad10 44 69 67 65 73 74 54 6f 42 61 73 65 31 36 28 64  DigestToBase16(d
1ad20 69 67 65 73 74 2c 20 7a 42 75 66 29 3b 0a 20 20  igest, zBuf);.  
1ad30 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
1ad40 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 42 75  ext(context, zBu
1ad50 66 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52  f, -1, SQLITE_TR
1ad60 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a 69 6e 74 20  ANSIENT);.}.int 
1ad70 4d 64 35 5f 52 65 67 69 73 74 65 72 28 73 71 6c  Md5_Register(sql
1ad80 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74  ite3 *db){.  int
1ad90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
1ada0 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
1adb0 2c 20 22 6d 64 35 73 75 6d 22 2c 20 2d 31 2c 20  , "md5sum", -1, 
1adc0 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
1add0 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  0, .            
1ade0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1adf0 20 20 20 20 20 6d 64 35 73 74 65 70 2c 20 6d 64       md5step, md
1ae00 35 66 69 6e 61 6c 69 7a 65 29 3b 0a 20 20 73 71  5finalize);.  sq
1ae10 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66  lite3_overload_f
1ae20 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 6d 64 35  unction(db, "md5
1ae30 73 75 6d 22 2c 20 2d 31 29 3b 20 20 2f 2a 20 54  sum", -1);  /* T
1ae40 6f 20 65 78 65 72 63 69 73 65 20 74 68 69 73 20  o exercise this 
1ae50 41 50 49 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  API */.  return 
1ae60 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
1ae70 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
1ae80 45 53 54 29 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20  EST) */.../*.** 
1ae90 49 66 20 74 68 65 20 6d 61 63 72 6f 20 54 43 4c  If the macro TCL
1aea0 53 48 20 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20  SH is one, then 
1aeb0 70 75 74 20 69 6e 20 63 6f 64 65 20 74 68 69 73  put in code this
1aec0 20 66 6f 72 20 74 68 65 0a 2a 2a 20 22 6d 61 69   for the.** "mai
1aed0 6e 22 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20  n" routine that 
1aee0 77 69 6c 6c 20 69 6e 69 74 69 61 6c 69 7a 65 20  will initialize 
1aef0 54 63 6c 20 61 6e 64 20 74 61 6b 65 20 69 6e 70  Tcl and take inp
1af00 75 74 20 66 72 6f 6d 0a 2a 2a 20 73 74 61 6e 64  ut from.** stand
1af10 61 72 64 20 69 6e 70 75 74 2c 20 6f 72 20 69 66  ard input, or if
1af20 20 61 20 66 69 6c 65 20 69 73 20 6e 61 6d 65 64   a file is named
1af30 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20   on the command 
1af40 6c 69 6e 65 0a 2a 2a 20 74 68 65 20 54 43 4c 20  line.** the TCL 
1af50 69 6e 74 65 72 70 72 65 74 65 72 20 72 65 61 64  interpreter read
1af60 73 20 61 6e 64 20 65 76 61 6c 75 61 74 65 73 20  s and evaluates 
1af70 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2f 0a 23 69  that file..*/.#i
1af80 66 20 54 43 4c 53 48 3d 3d 31 0a 73 74 61 74 69  f TCLSH==1.stati
1af90 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 74 63  c const char *tc
1afa0 6c 73 68 5f 6d 61 69 6e 5f 6c 6f 6f 70 28 76 6f  lsh_main_loop(vo
1afb0 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  id){.  static co
1afc0 6e 73 74 20 63 68 61 72 20 7a 4d 61 69 6e 6c 6f  nst char zMainlo
1afd0 6f 70 5b 5d 20 3d 0a 20 20 20 20 22 73 65 74 20  op[] =.    "set 
1afe0 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20 20 20 22  line {}\n".    "
1aff0 77 68 69 6c 65 20 7b 21 5b 65 6f 66 20 73 74 64  while {![eof std
1b000 69 6e 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20  in]} {\n".      
1b010 22 69 66 20 7b 24 6c 69 6e 65 21 3d 5c 22 5c 22  "if {$line!=\"\"
1b020 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20 22  } {\n".        "
1b030 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20  puts -nonewline 
1b040 5c 22 3e 20 5c 22 5c 6e 22 0a 20 20 20 20 20 20  \"> \"\n".      
1b050 22 7d 20 65 6c 73 65 20 7b 5c 6e 22 0a 20 20 20  "} else {\n".   
1b060 20 20 20 20 20 22 70 75 74 73 20 2d 6e 6f 6e 65       "puts -none
1b070 77 6c 69 6e 65 20 5c 22 25 20 5c 22 5c 6e 22 0a  wline \"% \"\n".
1b080 20 20 20 20 20 20 22 7d 5c 6e 22 0a 20 20 20 20        "}\n".    
1b090 20 20 22 66 6c 75 73 68 20 73 74 64 6f 75 74 5c    "flush stdout\
1b0a0 6e 22 0a 20 20 20 20 20 20 22 61 70 70 65 6e 64  n".      "append
1b0b0 20 6c 69 6e 65 20 5b 67 65 74 73 20 73 74 64 69   line [gets stdi
1b0c0 6e 5d 5c 6e 22 0a 20 20 20 20 20 20 22 69 66 20  n]\n".      "if 
1b0d0 7b 5b 69 6e 66 6f 20 63 6f 6d 70 6c 65 74 65 20  {[info complete 
1b0e0 24 6c 69 6e 65 5d 7d 20 7b 5c 6e 22 0a 20 20 20  $line]} {\n".   
1b0f0 20 20 20 20 20 22 69 66 20 7b 5b 63 61 74 63 68       "if {[catch
1b100 20 7b 75 70 6c 65 76 65 6c 20 23 30 20 24 6c 69   {uplevel #0 $li
1b110 6e 65 7d 20 72 65 73 75 6c 74 5d 7d 20 7b 5c 6e  ne} result]} {\n
1b120 22 0a 20 20 20 20 20 20 20 20 20 20 22 70 75 74  ".          "put
1b130 73 20 73 74 64 65 72 72 20 5c 22 45 72 72 6f 72  s stderr \"Error
1b140 3a 20 24 72 65 73 75 6c 74 5c 22 5c 6e 22 0a 20  : $result\"\n". 
1b150 20 20 20 20 20 20 20 22 7d 20 65 6c 73 65 69 66         "} elseif
1b160 20 7b 24 72 65 73 75 6c 74 21 3d 5c 22 5c 22 7d   {$result!=\"\"}
1b170 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20   {\n".          
1b180 22 70 75 74 73 20 24 72 65 73 75 6c 74 5c 6e 22  "puts $result\n"
1b190 0a 20 20 20 20 20 20 20 20 22 7d 5c 6e 22 0a 20  .        "}\n". 
1b1a0 20 20 20 20 20 20 20 22 73 65 74 20 6c 69 6e 65         "set line
1b1b0 20 7b 7d 5c 6e 22 0a 20 20 20 20 20 20 22 7d 20   {}\n".      "} 
1b1c0 65 6c 73 65 20 7b 5c 6e 22 0a 20 20 20 20 20 20  else {\n".      
1b1d0 20 20 22 61 70 70 65 6e 64 20 6c 69 6e 65 20 5c    "append line \
1b1e0 5c 6e 5c 6e 22 0a 20 20 20 20 20 20 22 7d 5c 6e  \n\n".      "}\n
1b1f0 22 0a 20 20 20 20 22 7d 5c 6e 22 0a 20 20 3b 0a  ".    "}\n".  ;.
1b200 20 20 72 65 74 75 72 6e 20 7a 4d 61 69 6e 6c 6f    return zMainlo
1b210 6f 70 3b 0a 7d 0a 23 65 6e 64 69 66 0a 23 69 66  op;.}.#endif.#if
1b220 20 54 43 4c 53 48 3d 3d 32 0a 73 74 61 74 69 63   TCLSH==2.static
1b230 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 74 63 6c   const char *tcl
1b240 73 68 5f 6d 61 69 6e 5f 6c 6f 6f 70 28 76 6f 69  sh_main_loop(voi
1b250 64 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  d);.#endif..#ifd
1b260 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 73  ef SQLITE_TEST.s
1b270 74 61 74 69 63 20 76 6f 69 64 20 69 6e 69 74 5f  tatic void init_
1b280 61 6c 6c 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  all(Tcl_Interp *
1b290 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  );.static int in
1b2a0 69 74 5f 61 6c 6c 5f 63 6d 64 28 0a 20 20 43 6c  it_all_cmd(.  Cl
1b2b0 69 65 6e 74 44 61 74 61 20 63 64 2c 0a 20 20 54  ientData cd,.  T
1b2c0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1b2d0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1b2e0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1b2f0 6f 62 6a 76 5b 5d 0a 29 7b 0a 0a 20 20 54 63 6c  objv[].){..  Tcl
1b300 5f 49 6e 74 65 72 70 20 2a 73 6c 61 76 65 3b 0a  _Interp *slave;.
1b310 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
1b320 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
1b330 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
1b340 20 6f 62 6a 76 2c 20 22 53 4c 41 56 45 22 29 3b   objv, "SLAVE");
1b350 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1b360 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 73 6c  ERROR;.  }..  sl
1b370 61 76 65 20 3d 20 54 63 6c 5f 47 65 74 53 6c 61  ave = Tcl_GetSla
1b380 76 65 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  ve(interp, Tcl_G
1b390 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1b3a0 29 29 3b 0a 20 20 69 66 28 20 21 73 6c 61 76 65  ));.  if( !slave
1b3b0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
1b3c0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
1b3d0 20 69 6e 69 74 5f 61 6c 6c 28 73 6c 61 76 65 29   init_all(slave)
1b3e0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1b3f0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 63 6c 63  K;.}../*.** Tclc
1b400 6d 64 3a 20 64 62 5f 75 73 65 5f 6c 65 67 61 63  md: db_use_legac
1b410 79 5f 70 72 65 70 61 72 65 20 44 42 20 42 4f 4f  y_prepare DB BOO
1b420 4c 45 41 4e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65  LEAN.**.**   The
1b430 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
1b440 74 6f 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  to this command 
1b450 6d 75 73 74 20 62 65 20 61 20 64 61 74 61 62 61  must be a databa
1b460 73 65 20 63 6f 6d 6d 61 6e 64 20 63 72 65 61 74  se command creat
1b470 65 64 20 62 79 0a 2a 2a 20 20 20 5b 73 71 6c 69  ed by.**   [sqli
1b480 74 65 33 5d 2e 20 49 66 20 74 68 65 20 73 65 63  te3]. If the sec
1b490 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
1b4a0 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 68  true, then the h
1b4b0 61 6e 64 6c 65 20 69 73 20 63 6f 6e 66 69 67 75  andle is configu
1b4c0 72 65 64 0a 2a 2a 20 20 20 74 6f 20 75 73 65 20  red.**   to use 
1b4d0 74 68 65 20 73 71 6c 69 74 65 33 5f 70 72 65 70  the sqlite3_prep
1b4e0 61 72 65 5f 76 32 28 29 20 66 75 6e 63 74 69 6f  are_v2() functio
1b4f0 6e 20 74 6f 20 70 72 65 70 61 72 65 20 73 74 61  n to prepare sta
1b500 74 65 6d 65 6e 74 73 2e 20 49 66 20 69 74 0a 2a  tements. If it.*
1b510 2a 20 20 20 69 73 20 66 61 6c 73 65 2c 20 73 71  *   is false, sq
1b520 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29 2e  lite3_prepare().
1b530 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
1b540 62 5f 75 73 65 5f 6c 65 67 61 63 79 5f 70 72 65  b_use_legacy_pre
1b550 70 61 72 65 5f 63 6d 64 28 0a 20 20 43 6c 69 65  pare_cmd(.  Clie
1b560 6e 74 44 61 74 61 20 63 64 2c 0a 20 20 54 63 6c  ntData cd,.  Tcl
1b570 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1b580 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1b590 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1b5a0 6a 76 5b 5d 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d  jv[].){.  Tcl_Cm
1b5b0 64 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20  dInfo cmdInfo;. 
1b5c0 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 3b 0a   SqliteDb *pDb;.
1b5d0 20 20 69 6e 74 20 62 50 72 65 70 61 72 65 3b 0a    int bPrepare;.
1b5e0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
1b5f0 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
1b600 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
1b610 2c 20 6f 62 6a 76 2c 20 22 44 42 20 42 4f 4f 4c  , objv, "DB BOOL
1b620 45 41 4e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  EAN");.    retur
1b630 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1b640 0a 0a 20 20 69 66 28 20 21 54 63 6c 5f 47 65 74  ..  if( !Tcl_Get
1b650 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65  CommandInfo(inte
1b660 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
1b670 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 63 6d 64  g(objv[1]), &cmd
1b680 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 54 63 6c  Info) ){.    Tcl
1b690 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1b6a0 74 65 72 70 2c 20 22 6e 6f 20 73 75 63 68 20 64  terp, "no such d
1b6b0 62 3a 20 22 2c 20 54 63 6c 5f 47 65 74 53 74 72  b: ", Tcl_GetStr
1b6c0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 28 63  ing(objv[1]), (c
1b6d0 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74  har*)0);.    ret
1b6e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1b6f0 20 7d 0a 20 20 70 44 62 20 3d 20 28 53 71 6c 69   }.  pDb = (Sqli
1b700 74 65 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f 62  teDb*)cmdInfo.ob
1b710 6a 43 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 69  jClientData;.  i
1b720 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61  f( Tcl_GetBoolea
1b730 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  nFromObj(interp,
1b740 20 6f 62 6a 76 5b 32 5d 2c 20 26 62 50 72 65 70   objv[2], &bPrep
1b750 61 72 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  are) ){.    retu
1b760 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1b770 7d 0a 0a 20 20 70 44 62 2d 3e 62 4c 65 67 61 63  }..  pDb->bLegac
1b780 79 50 72 65 70 61 72 65 20 3d 20 62 50 72 65 70  yPrepare = bPrep
1b790 61 72 65 3b 0a 0a 20 20 54 63 6c 5f 52 65 73 65  are;..  Tcl_Rese
1b7a0 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  tResult(interp);
1b7b0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1b7c0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
1b7d0 2a 20 43 6f 6e 66 69 67 75 72 65 20 74 68 65 20  * Configure the 
1b7e0 69 6e 74 65 72 70 72 65 74 65 72 20 70 61 73 73  interpreter pass
1b7f0 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
1b800 61 72 67 75 6d 65 6e 74 20 74 6f 20 68 61 76 65  argument to have
1b810 20 61 63 63 65 73 73 0a 2a 2a 20 74 6f 20 74 68   access.** to th
1b820 65 20 63 6f 6d 6d 61 6e 64 73 20 61 6e 64 20 6c  e commands and l
1b830 69 6e 6b 65 64 20 76 61 72 69 61 62 6c 65 73 20  inked variables 
1b840 74 68 61 74 20 6d 61 6b 65 20 75 70 3a 0a 2a 2a  that make up:.**
1b850 0a 2a 2a 20 20 20 2a 20 74 68 65 20 5b 73 71 6c  .**   * the [sql
1b860 69 74 65 33 5d 20 65 78 74 65 6e 73 69 6f 6e 20  ite3] extension 
1b870 69 74 73 65 6c 66 2c 20 0a 2a 2a 0a 2a 2a 20 20  itself, .**.**  
1b880 20 2a 20 49 66 20 53 51 4c 49 54 45 5f 54 43 4c   * If SQLITE_TCL
1b890 4d 44 35 20 6f 72 20 53 51 4c 49 54 45 5f 54 45  MD5 or SQLITE_TE
1b8a0 53 54 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74  ST is defined, t
1b8b0 68 65 20 4d 64 35 20 63 6f 6d 6d 61 6e 64 73 2c  he Md5 commands,
1b8c0 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49   and.**.**   * I
1b8d0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 20 69 73  f SQLITE_TEST is
1b8e0 20 73 65 74 2c 20 74 68 65 20 76 61 72 69 6f 75   set, the variou
1b8f0 73 20 74 65 73 74 20 69 6e 74 65 72 66 61 63 65  s test interface
1b900 73 20 75 73 65 64 20 62 79 20 74 68 65 20 54 63  s used by the Tc
1b910 6c 0a 2a 2a 20 20 20 20 20 74 65 73 74 20 73 75  l.**     test su
1b920 69 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ite..*/.static v
1b930 6f 69 64 20 69 6e 69 74 5f 61 6c 6c 28 54 63 6c  oid init_all(Tcl
1b940 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
1b950 7b 0a 20 20 53 71 6c 69 74 65 33 5f 49 6e 69 74  {.  Sqlite3_Init
1b960 28 69 6e 74 65 72 70 29 3b 0a 0a 23 69 66 20 64  (interp);..#if d
1b970 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
1b980 53 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  ST) || defined(S
1b990 51 4c 49 54 45 5f 54 43 4c 4d 44 35 29 0a 20 20  QLITE_TCLMD5).  
1b9a0 4d 64 35 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  Md5_Init(interp)
1b9b0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  ;.#endif..  /* I
1b9c0 6e 73 74 61 6c 6c 20 74 68 65 20 5b 72 65 67 69  nstall the [regi
1b9d0 73 74 65 72 5f 64 62 73 74 61 74 5f 76 74 61 62  ster_dbstat_vtab
1b9e0 5d 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 61 63 63  ] command to acc
1b9f0 65 73 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  ess the implemen
1ba00 74 61 74 69 6f 6e 0a 20 20 2a 2a 20 6f 66 20 76  tation.  ** of v
1ba10 69 72 74 75 61 6c 20 74 61 62 6c 65 20 64 62 73  irtual table dbs
1ba20 74 61 74 20 28 73 6f 75 72 63 65 20 66 69 6c 65  tat (source file
1ba30 20 74 65 73 74 5f 73 74 61 74 2e 63 29 2e 20 54   test_stat.c). T
1ba40 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 20  his command is. 
1ba50 20 2a 2a 20 72 65 71 75 69 72 65 64 20 66 6f 72   ** required for
1ba60 20 74 65 73 74 66 69 78 74 75 72 65 20 61 6e 64   testfixture and
1ba70 20 73 71 6c 69 74 65 33 5f 61 6e 61 6c 79 7a 65   sqlite3_analyze
1ba80 72 2c 20 62 75 74 20 6e 6f 74 20 62 79 20 74 68  r, but not by th
1ba90 65 20 70 72 6f 64 75 63 74 69 6f 6e 0a 20 20 2a  e production.  *
1baa0 2a 20 54 63 6c 20 65 78 74 65 6e 73 69 6f 6e 2e  * Tcl extension.
1bab0 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64    */.#if defined
1bac0 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c  (SQLITE_TEST) ||
1bad0 20 54 43 4c 53 48 3d 3d 32 0a 20 20 7b 0a 20 20   TCLSH==2.  {.  
1bae0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1baf0 69 74 65 74 65 73 74 53 74 61 74 5f 49 6e 69 74  itetestStat_Init
1bb00 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1bb10 20 20 20 53 71 6c 69 74 65 74 65 73 74 53 74 61     SqlitetestSta
1bb20 74 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  t_Init(interp);.
1bb30 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64    }.#endif..#ifd
1bb40 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
1bb50 20 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e   {.    extern in
1bb60 74 20 53 71 6c 69 74 65 63 6f 6e 66 69 67 5f 49  t Sqliteconfig_I
1bb70 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1bb80 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1bb90 20 53 71 6c 69 74 65 74 65 73 74 31 5f 49 6e 69   Sqlitetest1_Ini
1bba0 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1bbb0 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1bbc0 71 6c 69 74 65 74 65 73 74 32 5f 49 6e 69 74 28  qlitetest2_Init(
1bbd0 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1bbe0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1bbf0 69 74 65 74 65 73 74 33 5f 49 6e 69 74 28 54 63  itetest3_Init(Tc
1bc00 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1bc10 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1bc20 65 74 65 73 74 34 5f 49 6e 69 74 28 54 63 6c 5f  etest4_Init(Tcl_
1bc30 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
1bc40 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1bc50 65 73 74 35 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  est5_Init(Tcl_In
1bc60 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1bc70 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1bc80 74 36 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  t6_Init(Tcl_Inte
1bc90 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
1bca0 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 37   int Sqlitetest7
1bcb0 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1bcc0 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1bcd0 6e 74 20 53 71 6c 69 74 65 74 65 73 74 38 5f 49  nt Sqlitetest8_I
1bce0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1bcf0 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1bd00 20 53 71 6c 69 74 65 74 65 73 74 39 5f 49 6e 69   Sqlitetest9_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 61 73 79 6e 63 5f 49  qlitetestasync_I
1bd40 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1bd50 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1bd60 20 53 71 6c 69 74 65 74 65 73 74 5f 61 75 74 6f   Sqlitetest_auto
1bd70 65 78 74 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  ext_Init(Tcl_Int
1bd80 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1bd90 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1bda0 5f 64 65 6d 6f 76 66 73 5f 49 6e 69 74 28 54 63  _demovfs_Init(Tc
1bdb0 6c 5f 49 6e 74 65 72 70 20 2a 29 3b 0a 20 20 20  l_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 66 75 6e 63 5f 49 6e 69 74  tetest_func_Init
1bde0 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1bdf0 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1be00 6c 69 74 65 74 65 73 74 5f 68 65 78 69 6f 5f 49  litetest_hexio_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 69 6e 69 74   Sqlitetest_init
1be40 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1be50 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1be60 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f 6d 61  nt Sqlitetest_ma
1be70 6c 6c 6f 63 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  lloc_Init(Tcl_In
1be80 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1be90 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1bea0 74 5f 6d 75 74 65 78 5f 49 6e 69 74 28 54 63 6c  t_mutex_Init(Tcl
1beb0 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1bec0 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1bed0 74 65 73 74 73 63 68 65 6d 61 5f 49 6e 69 74 28  testschema_Init(
1bee0 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1bef0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1bf00 69 74 65 74 65 73 74 73 73 65 5f 49 6e 69 74 28  itetestsse_Init(
1bf10 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1bf20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1bf30 69 74 65 74 65 73 74 74 63 6c 76 61 72 5f 49 6e  itetesttclvar_In
1bf40 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1bf50 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1bf60 53 71 6c 69 74 65 74 65 73 74 66 73 5f 49 6e 69  Sqlitetestfs_Ini
1bf70 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1bf80 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1bf90 71 6c 69 74 65 74 65 73 74 54 68 72 65 61 64 5f  qlitetestThread_
1bfa0 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1bfb0 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1bfc0 74 20 53 71 6c 69 74 65 74 65 73 74 4f 6e 65 66  t SqlitetestOnef
1bfd0 69 6c 65 5f 49 6e 69 74 28 29 3b 0a 20 20 20 20  ile_Init();.    
1bfe0 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1bff0 65 74 65 73 74 4f 73 69 6e 73 74 5f 49 6e 69 74  etestOsinst_Init
1c000 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1c010 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1c020 6c 69 74 65 74 65 73 74 62 61 63 6b 75 70 5f 49  litetestbackup_I
1c030 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1c040 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1c050 20 53 71 6c 69 74 65 74 65 73 74 69 6e 74 61 72   Sqlitetestintar
1c060 72 61 79 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  ray_Init(Tcl_Int
1c070 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1c080 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1c090 76 66 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  vfs_Init(Tcl_Int
1c0a0 65 72 70 20 2a 29 3b 0a 20 20 20 20 65 78 74 65  erp *);.    exte
1c0b0 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1c0c0 74 72 74 72 65 65 5f 49 6e 69 74 28 54 63 6c 5f  trtree_Init(Tcl_
1c0d0 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
1c0e0 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 71  tern int Sqliteq
1c0f0 75 6f 74 61 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  uota_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 6d 75 6c  rn int Sqlitemul
1c120 74 69 70 6c 65 78 5f 49 6e 69 74 28 54 63 6c 5f  tiplex_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 53  tern int SqliteS
1c150 75 70 65 72 6c 6f 63 6b 5f 49 6e 69 74 28 54 63  uperlock_Init(Tc
1c160 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1c170 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1c180 65 74 65 73 74 53 79 73 63 61 6c 6c 5f 49 6e 69  etestSyscall_Ini
1c190 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1c1a0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
1c1b0 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 29  ITE_ENABLE_FTS3)
1c1c0 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
1c1d0 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 34 29 0a  TE_ENABLE_FTS4).
1c1e0 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1c1f0 71 6c 69 74 65 74 65 73 74 66 74 73 33 5f 49 6e  qlitetestfts3_In
1c200 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
1c210 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69 66 0a 0a  nterp);.#endif..
1c220 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1c230 41 42 4c 45 5f 5a 49 50 56 46 53 0a 20 20 20 20  ABLE_ZIPVFS.    
1c240 65 78 74 65 72 6e 20 69 6e 74 20 5a 69 70 76 66  extern int Zipvf
1c250 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  s_Init(Tcl_Inter
1c260 70 2a 29 3b 0a 20 20 20 20 5a 69 70 76 66 73 5f  p*);.    Zipvfs_
1c270 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 23 65  Init(interp);.#e
1c280 6e 64 69 66 0a 0a 20 20 20 20 53 71 6c 69 74 65  ndif..    Sqlite
1c290 63 6f 6e 66 69 67 5f 49 6e 69 74 28 69 6e 74 65  config_Init(inte
1c2a0 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
1c2b0 65 73 74 31 5f 49 6e 69 74 28 69 6e 74 65 72 70  est1_Init(interp
1c2c0 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1c2d0 74 32 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  t2_Init(interp);
1c2e0 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 33  .    Sqlitetest3
1c2f0 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1c300 20 20 20 53 71 6c 69 74 65 74 65 73 74 34 5f 49     Sqlitetest4_I
1c310 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1c320 20 53 71 6c 69 74 65 74 65 73 74 35 5f 49 6e 69   Sqlitetest5_Ini
1c330 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
1c340 71 6c 69 74 65 74 65 73 74 36 5f 49 6e 69 74 28  qlitetest6_Init(
1c350 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
1c360 69 74 65 74 65 73 74 37 5f 49 6e 69 74 28 69 6e  itetest7_Init(in
1c370 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
1c380 65 74 65 73 74 38 5f 49 6e 69 74 28 69 6e 74 65  etest8_Init(inte
1c390 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
1c3a0 65 73 74 39 5f 49 6e 69 74 28 69 6e 74 65 72 70  est9_Init(interp
1c3b0 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1c3c0 74 61 73 79 6e 63 5f 49 6e 69 74 28 69 6e 74 65  tasync_Init(inte
1c3d0 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
1c3e0 65 73 74 5f 61 75 74 6f 65 78 74 5f 49 6e 69 74  est_autoext_Init
1c3f0 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1c400 6c 69 74 65 74 65 73 74 5f 64 65 6d 6f 76 66 73  litetest_demovfs
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 5f 66 75     Sqlitetest_fu
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 68 65 78 69 6f 5f 49 6e 69 74 28 69 6e 74 65 72  hexio_Init(inter
1c460 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
1c470 73 74 5f 69 6e 69 74 5f 49 6e 69 74 28 69 6e 74  st_init_Init(int
1c480 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1c490 74 65 73 74 5f 6d 61 6c 6c 6f 63 5f 49 6e 69 74  test_malloc_Init
1c4a0 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1c4b0 6c 69 74 65 74 65 73 74 5f 6d 75 74 65 78 5f 49  litetest_mutex_I
1c4c0 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1c4d0 20 53 71 6c 69 74 65 74 65 73 74 73 63 68 65 6d   Sqlitetestschem
1c4e0 61 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  a_Init(interp);.
1c4f0 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 74 63      Sqlitetesttc
1c500 6c 76 61 72 5f 49 6e 69 74 28 69 6e 74 65 72 70  lvar_Init(interp
1c510 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1c520 74 66 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  tfs_Init(interp)
1c530 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1c540 54 68 72 65 61 64 5f 49 6e 69 74 28 69 6e 74 65  Thread_Init(inte
1c550 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
1c560 65 73 74 4f 6e 65 66 69 6c 65 5f 49 6e 69 74 28  estOnefile_Init(
1c570 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
1c580 69 74 65 74 65 73 74 4f 73 69 6e 73 74 5f 49 6e  itetestOsinst_In
1c590 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1c5a0 53 71 6c 69 74 65 74 65 73 74 62 61 63 6b 75 70  Sqlitetestbackup
1c5b0 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1c5c0 20 20 20 53 71 6c 69 74 65 74 65 73 74 69 6e 74     Sqlitetestint
1c5d0 61 72 72 61 79 5f 49 6e 69 74 28 69 6e 74 65 72  array_Init(inter
1c5e0 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
1c5f0 73 74 76 66 73 5f 49 6e 69 74 28 69 6e 74 65 72  stvfs_Init(inter
1c600 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
1c610 73 74 72 74 72 65 65 5f 49 6e 69 74 28 69 6e 74  strtree_Init(int
1c620 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1c630 71 75 6f 74 61 5f 49 6e 69 74 28 69 6e 74 65 72  quota_Init(inter
1c640 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 6d 75  p);.    Sqlitemu
1c650 6c 74 69 70 6c 65 78 5f 49 6e 69 74 28 69 6e 74  ltiplex_Init(int
1c660 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1c670 53 75 70 65 72 6c 6f 63 6b 5f 49 6e 69 74 28 69  Superlock_Init(i
1c680 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1c690 74 65 74 65 73 74 53 79 73 63 61 6c 6c 5f 49 6e  tetestSyscall_In
1c6a0 69 74 28 69 6e 74 65 72 70 29 3b 0a 0a 23 69 66  it(interp);..#if
1c6b0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1c6c0 45 4e 41 42 4c 45 5f 46 54 53 33 29 20 7c 7c 20  ENABLE_FTS3) || 
1c6d0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
1c6e0 4e 41 42 4c 45 5f 46 54 53 34 29 0a 20 20 20 20  NABLE_FTS4).    
1c6f0 53 71 6c 69 74 65 74 65 73 74 66 74 73 33 5f 49  Sqlitetestfts3_I
1c700 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 23 65 6e  nit(interp);.#en
1c710 64 69 66 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65  dif..    Tcl_Cre
1c720 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 0a 20  ateObjCommand(. 
1c730 20 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20 22         interp, "
1c740 6c 6f 61 64 5f 74 65 73 74 66 69 78 74 75 72 65  load_testfixture
1c750 5f 65 78 74 65 6e 73 69 6f 6e 73 22 2c 20 69 6e  _extensions", in
1c760 69 74 5f 61 6c 6c 5f 63 6d 64 2c 20 30 2c 20 30  it_all_cmd, 0, 0
1c770 0a 20 20 20 20 29 3b 0a 20 20 20 20 54 63 6c 5f  .    );.    Tcl_
1c780 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
1c790 28 0a 20 20 20 20 20 20 20 20 69 6e 74 65 72 70  (.        interp
1c7a0 2c 20 22 64 62 5f 75 73 65 5f 6c 65 67 61 63 79  , "db_use_legacy
1c7b0 5f 70 72 65 70 61 72 65 22 2c 20 64 62 5f 75 73  _prepare", db_us
1c7c0 65 5f 6c 65 67 61 63 79 5f 70 72 65 70 61 72 65  e_legacy_prepare
1c7d0 5f 63 6d 64 2c 20 30 2c 20 30 0a 20 20 20 20 29  _cmd, 0, 0.    )
1c7e0 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
1c7f0 5f 53 53 45 0a 20 20 20 20 53 71 6c 69 74 65 74  _SSE.    Sqlitet
1c800 65 73 74 73 73 65 5f 49 6e 69 74 28 69 6e 74 65  estsse_Init(inte
1c810 72 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  rp);.#endif.  }.
1c820 23 65 6e 64 69 66 0a 7d 0a 0a 23 64 65 66 69 6e  #endif.}..#defin
1c830 65 20 54 43 4c 53 48 5f 4d 41 49 4e 20 6d 61 69  e TCLSH_MAIN mai
1c840 6e 20 20 20 2f 2a 20 4e 65 65 64 65 64 20 74 6f  n   /* Needed to
1c850 20 66 61 6b 65 20 6f 75 74 20 6d 6b 74 63 6c 61   fake out mktcla
1c860 70 70 20 2a 2f 0a 69 6e 74 20 54 43 4c 53 48 5f  pp */.int TCLSH_
1c870 4d 41 49 4e 28 69 6e 74 20 61 72 67 63 2c 20 63  MAIN(int argc, c
1c880 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 54  har **argv){.  T
1c890 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1c8a0 70 3b 0a 20 20 0a 20 20 2f 2a 20 43 61 6c 6c 20  p;.  .  /* Call 
1c8b0 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e  sqlite3_shutdown
1c8c0 28 29 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 64  () once before d
1c8d0 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c  oing anything el
1c8e0 73 65 2e 20 54 68 69 73 20 69 73 20 74 6f 0a 20  se. This is to. 
1c8f0 20 2a 2a 20 74 65 73 74 20 74 68 61 74 20 73 71   ** test that sq
1c900 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 29  lite3_shutdown()
1c910 20 63 61 6e 20 62 65 20 73 61 66 65 6c 79 20 63   can be safely c
1c920 61 6c 6c 65 64 20 62 79 20 61 20 70 72 6f 63 65  alled by a proce
1c930 73 73 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 73  ss before.  ** s
1c940 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a  qlite3_initializ
1c950 65 28 29 20 69 73 2e 20 2a 2f 0a 20 20 73 71 6c  e() is. */.  sql
1c960 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 29 3b  ite3_shutdown();
1c970 0a 0a 20 20 54 63 6c 5f 46 69 6e 64 45 78 65 63  ..  Tcl_FindExec
1c980 75 74 61 62 6c 65 28 61 72 67 76 5b 30 5d 29 3b  utable(argv[0]);
1c990 0a 20 20 69 6e 74 65 72 70 20 3d 20 54 63 6c 5f  .  interp = Tcl_
1c9a0 43 72 65 61 74 65 49 6e 74 65 72 70 28 29 3b 0a  CreateInterp();.
1c9b0 0a 23 69 66 20 54 43 4c 53 48 3d 3d 32 0a 20 20  .#if TCLSH==2.  
1c9c0 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53  sqlite3_config(S
1c9d0 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 49 4e  QLITE_CONFIG_SIN
1c9e0 47 4c 45 54 48 52 45 41 44 29 3b 0a 23 65 6e 64  GLETHREAD);.#end
1c9f0 69 66 0a 0a 20 20 69 6e 69 74 5f 61 6c 6c 28 69  if..  init_all(i
1ca00 6e 74 65 72 70 29 3b 0a 20 20 69 66 28 20 61 72  nterp);.  if( ar
1ca10 67 63 3e 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74  gc>=2 ){.    int
1ca20 20 69 3b 0a 20 20 20 20 63 68 61 72 20 7a 41 72   i;.    char zAr
1ca30 67 63 5b 33 32 5d 3b 0a 20 20 20 20 73 71 6c 69  gc[32];.    sqli
1ca40 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
1ca50 65 6f 66 28 7a 41 72 67 63 29 2c 20 7a 41 72 67  eof(zArgc), zArg
1ca60 63 2c 20 22 25 64 22 2c 20 61 72 67 63 2d 28 33  c, "%d", argc-(3
1ca70 2d 54 43 4c 53 48 29 29 3b 0a 20 20 20 20 54 63  -TCLSH));.    Tc
1ca80 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c  l_SetVar(interp,
1ca90 22 61 72 67 63 22 2c 20 7a 41 72 67 63 2c 20 54  "argc", zArgc, T
1caa0 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
1cab0 0a 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28  .    Tcl_SetVar(
1cac0 69 6e 74 65 72 70 2c 22 61 72 67 76 30 22 2c 61  interp,"argv0",a
1cad0 72 67 76 5b 31 5d 2c 54 43 4c 5f 47 4c 4f 42 41  rgv[1],TCL_GLOBA
1cae0 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 54 63 6c  L_ONLY);.    Tcl
1caf0 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 22  _SetVar(interp,"
1cb00 61 72 67 76 22 2c 20 22 22 2c 20 54 43 4c 5f 47  argv", "", TCL_G
1cb10 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20  LOBAL_ONLY);.   
1cb20 20 66 6f 72 28 69 3d 33 2d 54 43 4c 53 48 3b 20   for(i=3-TCLSH; 
1cb30 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20  i<argc; i++){.  
1cb40 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69      Tcl_SetVar(i
1cb50 6e 74 65 72 70 2c 20 22 61 72 67 76 22 2c 20 61  nterp, "argv", a
1cb60 72 67 76 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20  rgv[i],.        
1cb70 20 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c    TCL_GLOBAL_ONL
1cb80 59 20 7c 20 54 43 4c 5f 4c 49 53 54 5f 45 4c 45  Y | TCL_LIST_ELE
1cb90 4d 45 4e 54 20 7c 20 54 43 4c 5f 41 50 50 45 4e  MENT | TCL_APPEN
1cba0 44 5f 56 41 4c 55 45 29 3b 0a 20 20 20 20 7d 0a  D_VALUE);.    }.
1cbb0 20 20 20 20 69 66 28 20 54 43 4c 53 48 3d 3d 31      if( TCLSH==1
1cbc0 20 26 26 20 54 63 6c 5f 45 76 61 6c 46 69 6c 65   && Tcl_EvalFile
1cbd0 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
1cbe0 29 21 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20  )!=TCL_OK ){.   
1cbf0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1cc00 49 6e 66 6f 20 3d 20 54 63 6c 5f 47 65 74 56 61  Info = Tcl_GetVa
1cc10 72 28 69 6e 74 65 72 70 2c 20 22 65 72 72 6f 72  r(interp, "error
1cc20 49 6e 66 6f 22 2c 20 54 43 4c 5f 47 4c 4f 42 41  Info", TCL_GLOBA
1cc30 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 20 20 69  L_ONLY);.      i
1cc40 66 28 20 7a 49 6e 66 6f 3d 3d 30 20 29 20 7a 49  f( zInfo==0 ) zI
1cc50 6e 66 6f 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  nfo = Tcl_GetStr
1cc60 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ingResult(interp
1cc70 29 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  );.      fprintf
1cc80 28 73 74 64 65 72 72 2c 22 25 73 3a 20 25 73 5c  (stderr,"%s: %s\
1cc90 6e 22 2c 20 2a 61 72 67 76 2c 20 7a 49 6e 66 6f  n", *argv, zInfo
1cca0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1ccb0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  1;.    }.  }.  i
1ccc0 66 28 20 54 43 4c 53 48 3d 3d 32 20 7c 7c 20 61  f( TCLSH==2 || a
1ccd0 72 67 63 3c 3d 31 20 29 7b 0a 20 20 20 20 54 63  rgc<=1 ){.    Tc
1cce0 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 28 69 6e 74  l_GlobalEval(int
1ccf0 65 72 70 2c 20 74 63 6c 73 68 5f 6d 61 69 6e 5f  erp, tclsh_main_
1cd00 6c 6f 6f 70 28 29 29 3b 0a 20 20 7d 0a 20 20 72  loop());.  }.  r
1cd10 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
1cd20 66 20 2f 2a 20 54 43 4c 53 48 20 2a 2f 0a        f /* TCLSH */.