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

Artifact b8835978e853a89bf58de88acc943a5ca94d752e:


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 56 45 52 53  (a,b,c) TCL_VERS
170e0 49 4f 4e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ION.#endif../*.*
170f0 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68  * Make sure we h
17100 61 76 65 20 61 20 50 41 43 4b 41 47 45 5f 56 45  ave a PACKAGE_VE
17110 52 53 49 4f 4e 20 6d 61 63 72 6f 20 64 65 66 69  RSION macro defi
17120 6e 65 64 2e 20 20 54 68 69 73 20 77 69 6c 6c 20  ned.  This will 
17130 62 65 0a 2a 2a 20 64 65 66 69 6e 65 64 20 61 75  be.** defined au
17140 74 6f 6d 61 74 69 63 61 6c 6c 79 20 62 79 20 74  tomatically by t
17150 68 65 20 54 45 41 20 6d 61 6b 65 66 69 6c 65 2e  he TEA makefile.
17160 20 20 42 75 74 20 6f 74 68 65 72 20 6d 61 6b 65    But other make
17170 66 69 6c 65 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20  files.** do not 
17180 64 65 66 69 6e 65 20 69 74 2e 0a 2a 2f 0a 23 69  define it..*/.#i
17190 66 6e 64 65 66 20 50 41 43 4b 41 47 45 5f 56 45  fndef PACKAGE_VE
171a0 52 53 49 4f 4e 0a 23 20 64 65 66 69 6e 65 20 50  RSION.# define P
171b0 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 20 53  ACKAGE_VERSION S
171c0 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 0a 23 65  QLITE_VERSION.#e
171d0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  ndif../*.** Init
171e0 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64 75  ialize this modu
171f0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54  le..**.** This T
17200 63 6c 20 6d 6f 64 75 6c 65 20 63 6f 6e 74 61 69  cl module contai
17210 6e 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  ns only a single
17220 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d 61 6e 64   new Tcl command
17230 20 6e 61 6d 65 64 20 22 73 71 6c 69 74 65 22 2e   named "sqlite".
17240 0a 2a 2a 20 28 48 65 6e 63 65 20 74 68 65 72 65  .** (Hence there
17250 20 69 73 20 6e 6f 20 6e 61 6d 65 73 70 61 63 65   is no namespace
17260 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 70  .  There is no p
17270 6f 69 6e 74 20 69 6e 20 75 73 69 6e 67 20 61 20  oint in using a 
17280 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69 66 20  namespace.** if 
17290 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 20 6f 6e  the extension on
172a0 6c 79 20 73 75 70 70 6c 69 65 73 20 6f 6e 65 20  ly supplies one 
172b0 6e 65 77 20 6e 61 6d 65 21 29 20 20 54 68 65 20  new name!)  The 
172c0 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d 61 6e 64  "sqlite" command
172d0 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 6f   is.** used to o
172e0 70 65 6e 20 61 20 6e 65 77 20 53 51 4c 69 74 65  pen a new SQLite
172f0 20 64 61 74 61 62 61 73 65 2e 20 20 53 65 65 20   database.  See 
17300 74 68 65 20 44 62 4d 61 69 6e 28 29 20 72 6f 75  the DbMain() rou
17310 74 69 6e 65 20 61 62 6f 76 65 0a 2a 2a 20 66 6f  tine above.** fo
17320 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
17330 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  ormation..**.** 
17340 54 68 65 20 45 58 54 45 52 4e 20 6d 61 63 72 6f  The EXTERN macro
17350 73 20 61 72 65 20 72 65 71 75 69 72 65 64 20 62  s are required b
17360 79 20 54 43 4c 20 69 6e 20 6f 72 64 65 72 20 74  y TCL in order t
17370 6f 20 77 6f 72 6b 20 6f 6e 20 77 69 6e 64 6f 77  o work on window
17380 73 2e 0a 2a 2f 0a 45 58 54 45 52 4e 20 69 6e 74  s..*/.EXTERN int
17390 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 54 63   Sqlite3_Init(Tc
173a0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
173b0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 54 63  ){.  int rc = Tc
173c0 6c 5f 49 6e 69 74 53 74 75 62 73 28 69 6e 74 65  l_InitStubs(inte
173d0 72 70 2c 20 22 38 2e 34 22 2c 20 30 29 3d 3d 30  rp, "8.4", 0)==0
173e0 20 3f 20 54 43 4c 5f 45 52 52 4f 52 20 3a 20 54   ? TCL_ERROR : T
173f0 43 4c 5f 4f 4b 3b 0a 20 20 69 66 28 20 72 63 3d  CL_OK;.  if( rc=
17400 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  =TCL_OK ){.    T
17410 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
17420 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  and(interp, "sql
17430 69 74 65 33 22 2c 20 28 54 63 6c 5f 4f 62 6a 43  ite3", (Tcl_ObjC
17440 6d 64 50 72 6f 63 2a 29 44 62 4d 61 69 6e 2c 20  mdProc*)DbMain, 
17450 30 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53  0, 0);.#ifndef S
17460 51 4c 49 54 45 5f 33 5f 53 55 46 46 49 58 5f 4f  QLITE_3_SUFFIX_O
17470 4e 4c 59 0a 20 20 20 20 2f 2a 20 54 68 65 20 22  NLY.    /* The "
17480 73 71 6c 69 74 65 22 20 61 6c 69 61 73 20 69 73  sqlite" alias is
17490 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64 2e 20 20   undocumented.  
174a0 49 74 20 69 73 20 68 65 72 65 20 6f 6e 6c 79 20  It is here only 
174b0 74 6f 20 73 75 70 70 6f 72 74 0a 20 20 20 20 2a  to support.    *
174c0 2a 20 6c 65 67 61 63 79 20 73 63 72 69 70 74 73  * legacy scripts
174d0 2e 20 20 41 6c 6c 20 6e 65 77 20 73 63 72 69 70  .  All new scrip
174e0 74 73 20 73 68 6f 75 6c 64 20 75 73 65 20 6f 6e  ts should use on
174f0 6c 79 20 74 68 65 20 22 73 71 6c 69 74 65 33 22  ly the "sqlite3"
17500 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e  .    ** command.
17510 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 43 72 65 61   */.    Tcl_Crea
17520 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
17530 65 72 70 2c 20 22 73 71 6c 69 74 65 22 2c 20 28  erp, "sqlite", (
17540 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a 29  Tcl_ObjCmdProc*)
17550 44 62 4d 61 69 6e 2c 20 30 2c 20 30 29 3b 0a 23  DbMain, 0, 0);.#
17560 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20 54  endif.    rc = T
17570 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e  cl_PkgProvide(in
17580 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33 22 2c  terp, "sqlite3",
17590 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e   PACKAGE_VERSION
175a0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
175b0 72 63 3b 0a 7d 0a 45 58 54 45 52 4e 20 69 6e 74  rc;.}.EXTERN int
175c0 20 54 63 6c 73 71 6c 69 74 65 33 5f 49 6e 69 74   Tclsqlite3_Init
175d0 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
175e0 65 72 70 29 7b 20 72 65 74 75 72 6e 20 53 71 6c  erp){ return Sql
175f0 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70  ite3_Init(interp
17600 29 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20  ); }.EXTERN int 
17610 53 71 6c 69 74 65 33 5f 55 6e 6c 6f 61 64 28 54  Sqlite3_Unload(T
17620 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
17630 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 20 72  p, int flags){ r
17640 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a  eturn TCL_OK; }.
17650 45 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73 71  EXTERN int Tclsq
17660 6c 69 74 65 33 5f 55 6e 6c 6f 61 64 28 54 63 6c  lite3_Unload(Tcl
17670 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
17680 20 69 6e 74 20 66 6c 61 67 73 29 7b 20 72 65 74   int flags){ ret
17690 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 0a 2f  urn TCL_OK; }../
176a0 2a 20 42 65 63 61 75 73 65 20 69 74 20 61 63 63  * Because it acc
176b0 65 73 73 65 73 20 74 68 65 20 66 69 6c 65 2d 73  esses the file-s
176c0 79 73 74 65 6d 20 61 6e 64 20 75 73 65 73 20 70  ystem and uses p
176d0 65 72 73 69 73 74 65 6e 74 20 73 74 61 74 65 2c  ersistent state,
176e0 20 53 51 4c 69 74 65 0a 2a 2a 20 69 73 20 6e 6f   SQLite.** is no
176f0 74 20 63 6f 6e 73 69 64 65 72 65 64 20 61 70 70  t considered app
17700 72 6f 70 72 69 61 74 65 20 66 6f 72 20 73 61 66  ropriate for saf
17710 65 20 69 6e 74 65 72 70 72 65 74 65 72 73 2e 20  e interpreters. 
17720 20 48 65 6e 63 65 2c 20 77 65 20 64 65 6c 69 62   Hence, we delib
17730 65 72 61 74 65 6c 79 0a 2a 2a 20 6f 6d 69 74 20  erately.** omit 
17740 74 68 65 20 5f 53 61 66 65 49 6e 69 74 28 29 20  the _SafeInit() 
17750 69 6e 74 65 72 66 61 63 65 73 2e 0a 2a 2f 0a 0a  interfaces..*/..
17760 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 33  #ifndef SQLITE_3
17770 5f 53 55 46 46 49 58 5f 4f 4e 4c 59 0a 69 6e 74  _SUFFIX_ONLY.int
17780 20 53 71 6c 69 74 65 5f 49 6e 69 74 28 54 63 6c   Sqlite_Init(Tcl
17790 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
177a0 7b 20 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33  { return Sqlite3
177b0 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d  _Init(interp); }
177c0 0a 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 5f 49  .int Tclsqlite_I
177d0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
177e0 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20  interp){ return 
177f0 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74  Sqlite3_Init(int
17800 65 72 70 29 3b 20 7d 0a 69 6e 74 20 53 71 6c 69  erp); }.int Sqli
17810 74 65 5f 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e  te_Unload(Tcl_In
17820 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
17830 74 20 66 6c 61 67 73 29 7b 20 72 65 74 75 72 6e  t flags){ return
17840 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 69 6e 74 20 54   TCL_OK; }.int T
17850 63 6c 73 71 6c 69 74 65 5f 55 6e 6c 6f 61 64 28  clsqlite_Unload(
17860 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
17870 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 20  rp, int flags){ 
17880 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d  return TCL_OK; }
17890 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
178a0 54 43 4c 53 48 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  TCLSH./*********
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 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
178e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
178f0 2a 2a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74  ****.** All of t
17900 68 65 20 63 6f 64 65 20 74 68 61 74 20 66 6f 6c  he code that fol
17910 6c 6f 77 73 20 69 73 20 75 73 65 64 20 74 6f 20  lows is used to 
17920 62 75 69 6c 64 20 73 74 61 6e 64 61 6c 6f 6e 65  build standalone
17930 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
17940 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 73 74  s.** that are st
17950 61 74 69 63 61 6c 6c 79 20 6c 69 6e 6b 65 64 20  atically linked 
17960 77 69 74 68 20 53 51 4c 69 74 65 2e 20 20 45 6e  with SQLite.  En
17970 61 62 6c 65 20 74 68 65 73 65 20 62 79 20 63 6f  able these by co
17980 6d 70 69 6c 69 6e 67 0a 2a 2a 20 77 69 74 68 20  mpiling.** with 
17990 2d 44 54 43 4c 53 48 3d 6e 20 77 68 65 72 65 20  -DTCLSH=n where 
179a0 6e 20 63 61 6e 20 62 65 20 31 20 6f 72 20 32 2e  n can be 1 or 2.
179b0 20 20 41 6e 20 6e 20 6f 66 20 31 20 67 65 6e 65    An n of 1 gene
179c0 72 61 74 65 73 20 61 20 73 74 61 6e 64 61 72 64  rates a standard
179d0 0a 2a 2a 20 74 63 6c 73 68 20 62 75 74 20 77 69  .** tclsh but wi
179e0 74 68 20 53 51 4c 69 74 65 20 62 75 69 6c 74 20  th SQLite built 
179f0 69 6e 2e 20 20 41 6e 20 6e 20 6f 66 20 32 20 67  in.  An n of 2 g
17a00 65 6e 65 72 61 74 65 73 20 74 68 65 20 53 51 4c  enerates the SQL
17a10 69 74 65 20 73 70 61 63 65 0a 2a 2a 20 61 6e 61  ite space.** ana
17a20 6c 79 73 69 73 20 70 72 6f 67 72 61 6d 2e 0a 2a  lysis program..*
17a30 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  /..#if defined(S
17a40 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64  QLITE_TEST) || d
17a50 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 43  efined(SQLITE_TC
17a60 4c 4d 44 35 29 0a 2f 2a 0a 20 2a 20 54 68 69 73  LMD5)./*. * This
17a70 20 63 6f 64 65 20 69 6d 70 6c 65 6d 65 6e 74 73   code implements
17a80 20 74 68 65 20 4d 44 35 20 6d 65 73 73 61 67 65   the MD5 message
17a90 2d 64 69 67 65 73 74 20 61 6c 67 6f 72 69 74 68  -digest algorith
17aa0 6d 2e 0a 20 2a 20 54 68 65 20 61 6c 67 6f 72 69  m.. * The algori
17ab0 74 68 6d 20 69 73 20 64 75 65 20 74 6f 20 52 6f  thm is due to Ro
17ac0 6e 20 52 69 76 65 73 74 2e 20 20 54 68 69 73 20  n Rivest.  This 
17ad0 63 6f 64 65 20 77 61 73 0a 20 2a 20 77 72 69 74  code was. * writ
17ae0 74 65 6e 20 62 79 20 43 6f 6c 69 6e 20 50 6c 75  ten by Colin Plu
17af0 6d 62 20 69 6e 20 31 39 39 33 2c 20 6e 6f 20 63  mb in 1993, no c
17b00 6f 70 79 72 69 67 68 74 20 69 73 20 63 6c 61 69  opyright is clai
17b10 6d 65 64 2e 0a 20 2a 20 54 68 69 73 20 63 6f 64  med.. * This cod
17b20 65 20 69 73 20 69 6e 20 74 68 65 20 70 75 62 6c  e is in the publ
17b30 69 63 20 64 6f 6d 61 69 6e 3b 20 64 6f 20 77 69  ic domain; do wi
17b40 74 68 20 69 74 20 77 68 61 74 20 79 6f 75 20 77  th it what you w
17b50 69 73 68 2e 0a 20 2a 0a 20 2a 20 45 71 75 69 76  ish.. *. * Equiv
17b60 61 6c 65 6e 74 20 63 6f 64 65 20 69 73 20 61 76  alent code is av
17b70 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20 52 53 41  ailable from RSA
17b80 20 44 61 74 61 20 53 65 63 75 72 69 74 79 2c 20   Data Security, 
17b90 49 6e 63 2e 0a 20 2a 20 54 68 69 73 20 63 6f 64  Inc.. * This cod
17ba0 65 20 68 61 73 20 62 65 65 6e 20 74 65 73 74 65  e has been teste
17bb0 64 20 61 67 61 69 6e 73 74 20 74 68 61 74 2c 20  d against that, 
17bc0 61 6e 64 20 69 73 20 65 71 75 69 76 61 6c 65 6e  and is equivalen
17bd0 74 2c 0a 20 2a 20 65 78 63 65 70 74 20 74 68 61  t,. * except tha
17be0 74 20 79 6f 75 20 64 6f 6e 27 74 20 6e 65 65 64  t you don't need
17bf0 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 77 6f 20   to include two 
17c00 70 61 67 65 73 20 6f 66 20 6c 65 67 61 6c 65 73  pages of legales
17c10 65 0a 20 2a 20 77 69 74 68 20 65 76 65 72 79 20  e. * with every 
17c20 63 6f 70 79 2e 0a 20 2a 0a 20 2a 20 54 6f 20 63  copy.. *. * To c
17c30 6f 6d 70 75 74 65 20 74 68 65 20 6d 65 73 73 61  ompute the messa
17c40 67 65 20 64 69 67 65 73 74 20 6f 66 20 61 20 63  ge digest of a c
17c50 68 75 6e 6b 20 6f 66 20 62 79 74 65 73 2c 20 64  hunk of bytes, d
17c60 65 63 6c 61 72 65 20 61 6e 0a 20 2a 20 4d 44 35  eclare an. * MD5
17c70 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72  Context structur
17c80 65 2c 20 70 61 73 73 20 69 74 20 74 6f 20 4d 44  e, pass it to MD
17c90 35 49 6e 69 74 2c 20 63 61 6c 6c 20 4d 44 35 55  5Init, call MD5U
17ca0 70 64 61 74 65 20 61 73 0a 20 2a 20 6e 65 65 64  pdate as. * need
17cb0 65 64 20 6f 6e 20 62 75 66 66 65 72 73 20 66 75  ed on buffers fu
17cc0 6c 6c 20 6f 66 20 62 79 74 65 73 2c 20 61 6e 64  ll of bytes, and
17cd0 20 74 68 65 6e 20 63 61 6c 6c 20 4d 44 35 46 69   then call MD5Fi
17ce0 6e 61 6c 2c 20 77 68 69 63 68 0a 20 2a 20 77 69  nal, which. * wi
17cf0 6c 6c 20 66 69 6c 6c 20 61 20 73 75 70 70 6c 69  ll fill a suppli
17d00 65 64 20 31 36 2d 62 79 74 65 20 61 72 72 61 79  ed 16-byte array
17d10 20 77 69 74 68 20 74 68 65 20 64 69 67 65 73 74   with the digest
17d20 2e 0a 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 49 66 20  .. */../*. * If 
17d30 63 6f 6d 70 69 6c 65 64 20 6f 6e 20 61 20 6d 61  compiled on a ma
17d40 63 68 69 6e 65 20 74 68 61 74 20 64 6f 65 73 6e  chine that doesn
17d50 27 74 20 68 61 76 65 20 61 20 33 32 2d 62 69 74  't have a 32-bit
17d60 20 69 6e 74 65 67 65 72 2c 0a 20 2a 20 79 6f 75   integer,. * you
17d70 20 6a 75 73 74 20 73 65 74 20 22 75 69 6e 74 33   just set "uint3
17d80 32 22 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70  2" to the approp
17d90 72 69 61 74 65 20 64 61 74 61 74 79 70 65 20 66  riate datatype f
17da0 6f 72 20 61 6e 0a 20 2a 20 75 6e 73 69 67 6e 65  or an. * unsigne
17db0 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  d 32-bit integer
17dc0 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  .  For example:.
17dd0 20 2a 0a 20 2a 20 20 20 20 20 20 20 63 63 20 2d   *. *       cc -
17de0 44 75 69 6e 74 33 32 3d 27 75 6e 73 69 67 6e 65  Duint32='unsigne
17df0 64 20 6c 6f 6e 67 27 20 6d 64 35 2e 63 0a 20 2a  d long' md5.c. *
17e00 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 75 69 6e  . */.#ifndef uin
17e10 74 33 32 0a 23 20 20 64 65 66 69 6e 65 20 75 69  t32.#  define ui
17e20 6e 74 33 32 20 75 6e 73 69 67 6e 65 64 20 69 6e  nt32 unsigned in
17e30 74 0a 23 65 6e 64 69 66 0a 0a 73 74 72 75 63 74  t.#endif..struct
17e40 20 4d 44 35 43 6f 6e 74 65 78 74 20 7b 0a 20 20   MD5Context {.  
17e50 69 6e 74 20 69 73 49 6e 69 74 3b 0a 20 20 75 69  int isInit;.  ui
17e60 6e 74 33 32 20 62 75 66 5b 34 5d 3b 0a 20 20 75  nt32 buf[4];.  u
17e70 69 6e 74 33 32 20 62 69 74 73 5b 32 5d 3b 0a 20  int32 bits[2];. 
17e80 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69   unsigned char i
17e90 6e 5b 36 34 5d 3b 0a 7d 3b 0a 74 79 70 65 64 65  n[64];.};.typede
17ea0 66 20 73 74 72 75 63 74 20 4d 44 35 43 6f 6e 74  f struct MD5Cont
17eb0 65 78 74 20 4d 44 35 43 6f 6e 74 65 78 74 3b 0a  ext MD5Context;.
17ec0 0a 2f 2a 0a 20 2a 20 4e 6f 74 65 3a 20 74 68 69  ./*. * Note: thi
17ed0 73 20 63 6f 64 65 20 69 73 20 68 61 72 6d 6c 65  s code is harmle
17ee0 73 73 20 6f 6e 20 6c 69 74 74 6c 65 2d 65 6e 64  ss on little-end
17ef0 69 61 6e 20 6d 61 63 68 69 6e 65 73 2e 0a 20 2a  ian machines.. *
17f00 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 79  /.static void by
17f10 74 65 52 65 76 65 72 73 65 20 28 75 6e 73 69 67  teReverse (unsig
17f20 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 75  ned char *buf, u
17f30 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 73 29 7b 0a  nsigned longs){.
17f40 20 20 20 20 20 20 20 20 75 69 6e 74 33 32 20 74          uint32 t
17f50 3b 0a 20 20 20 20 20 20 20 20 64 6f 20 7b 0a 20  ;.        do {. 
17f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
17f70 20 3d 20 28 75 69 6e 74 33 32 29 28 28 75 6e 73   = (uint32)((uns
17f80 69 67 6e 65 64 29 62 75 66 5b 33 5d 3c 3c 38 20  igned)buf[3]<<8 
17f90 7c 20 62 75 66 5b 32 5d 29 20 3c 3c 20 31 36 20  | buf[2]) << 16 
17fa0 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
17fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28                ((
17fc0 75 6e 73 69 67 6e 65 64 29 62 75 66 5b 31 5d 3c  unsigned)buf[1]<
17fd0 3c 38 20 7c 20 62 75 66 5b 30 5d 29 3b 0a 20 20  <8 | buf[0]);.  
17fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 28                *(
17ff0 75 69 6e 74 33 32 20 2a 29 62 75 66 20 3d 20 74  uint32 *)buf = t
18000 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
18010 20 20 62 75 66 20 2b 3d 20 34 3b 0a 20 20 20 20    buf += 4;.    
18020 20 20 20 20 7d 20 77 68 69 6c 65 20 28 2d 2d 6c      } while (--l
18030 6f 6e 67 73 29 3b 0a 7d 0a 2f 2a 20 54 68 65 20  ongs);.}./* The 
18040 66 6f 75 72 20 63 6f 72 65 20 66 75 6e 63 74 69  four core functi
18050 6f 6e 73 20 2d 20 46 31 20 69 73 20 6f 70 74 69  ons - F1 is opti
18060 6d 69 7a 65 64 20 73 6f 6d 65 77 68 61 74 20 2a  mized somewhat *
18070 2f 0a 0a 2f 2a 20 23 64 65 66 69 6e 65 20 46 31  /../* #define F1
18080 28 78 2c 20 79 2c 20 7a 29 20 28 78 20 26 20 79  (x, y, z) (x & y
18090 20 7c 20 7e 78 20 26 20 7a 29 20 2a 2f 0a 23 64   | ~x & z) */.#d
180a0 65 66 69 6e 65 20 46 31 28 78 2c 20 79 2c 20 7a  efine F1(x, y, z
180b0 29 20 28 7a 20 5e 20 28 78 20 26 20 28 79 20 5e  ) (z ^ (x & (y ^
180c0 20 7a 29 29 29 0a 23 64 65 66 69 6e 65 20 46 32   z))).#define F2
180d0 28 78 2c 20 79 2c 20 7a 29 20 46 31 28 7a 2c 20  (x, y, z) F1(z, 
180e0 78 2c 20 79 29 0a 23 64 65 66 69 6e 65 20 46 33  x, y).#define F3
180f0 28 78 2c 20 79 2c 20 7a 29 20 28 78 20 5e 20 79  (x, y, z) (x ^ y
18100 20 5e 20 7a 29 0a 23 64 65 66 69 6e 65 20 46 34   ^ z).#define F4
18110 28 78 2c 20 79 2c 20 7a 29 20 28 79 20 5e 20 28  (x, y, z) (y ^ (
18120 78 20 7c 20 7e 7a 29 29 0a 0a 2f 2a 20 54 68 69  x | ~z))../* Thi
18130 73 20 69 73 20 74 68 65 20 63 65 6e 74 72 61 6c  s is the central
18140 20 73 74 65 70 20 69 6e 20 74 68 65 20 4d 44 35   step in the MD5
18150 20 61 6c 67 6f 72 69 74 68 6d 2e 20 2a 2f 0a 23   algorithm. */.#
18160 64 65 66 69 6e 65 20 4d 44 35 53 54 45 50 28 66  define MD5STEP(f
18170 2c 20 77 2c 20 78 2c 20 79 2c 20 7a 2c 20 64 61  , w, x, y, z, da
18180 74 61 2c 20 73 29 20 5c 0a 20 20 20 20 20 20 20  ta, s) \.       
18190 20 28 20 77 20 2b 3d 20 66 28 78 2c 20 79 2c 20   ( w += f(x, y, 
181a0 7a 29 20 2b 20 64 61 74 61 2c 20 20 77 20 3d 20  z) + data,  w = 
181b0 77 3c 3c 73 20 7c 20 77 3e 3e 28 33 32 2d 73 29  w<<s | w>>(32-s)
181c0 2c 20 20 77 20 2b 3d 20 78 20 29 0a 0a 2f 2a 0a  ,  w += x )../*.
181d0 20 2a 20 54 68 65 20 63 6f 72 65 20 6f 66 20 74   * The core of t
181e0 68 65 20 4d 44 35 20 61 6c 67 6f 72 69 74 68 6d  he MD5 algorithm
181f0 2c 20 74 68 69 73 20 61 6c 74 65 72 73 20 61 6e  , this alters an
18200 20 65 78 69 73 74 69 6e 67 20 4d 44 35 20 68 61   existing MD5 ha
18210 73 68 20 74 6f 0a 20 2a 20 72 65 66 6c 65 63 74  sh to. * reflect
18220 20 74 68 65 20 61 64 64 69 74 69 6f 6e 20 6f 66   the addition of
18230 20 31 36 20 6c 6f 6e 67 77 6f 72 64 73 20 6f 66   16 longwords of
18240 20 6e 65 77 20 64 61 74 61 2e 20 20 4d 44 35 55   new data.  MD5U
18250 70 64 61 74 65 20 62 6c 6f 63 6b 73 0a 20 2a 20  pdate blocks. * 
18260 74 68 65 20 64 61 74 61 20 61 6e 64 20 63 6f 6e  the data and con
18270 76 65 72 74 73 20 62 79 74 65 73 20 69 6e 74 6f  verts bytes into
18280 20 6c 6f 6e 67 77 6f 72 64 73 20 66 6f 72 20 74   longwords for t
18290 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 20 2a 2f  his routine.. */
182a0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 4d 44 35  .static void MD5
182b0 54 72 61 6e 73 66 6f 72 6d 28 75 69 6e 74 33 32  Transform(uint32
182c0 20 62 75 66 5b 34 5d 2c 20 63 6f 6e 73 74 20 75   buf[4], const u
182d0 69 6e 74 33 32 20 69 6e 5b 31 36 5d 29 7b 0a 20  int32 in[16]){. 
182e0 20 20 20 20 20 20 20 72 65 67 69 73 74 65 72 20         register 
182f0 75 69 6e 74 33 32 20 61 2c 20 62 2c 20 63 2c 20  uint32 a, b, c, 
18300 64 3b 0a 0a 20 20 20 20 20 20 20 20 61 20 3d 20  d;..        a = 
18310 62 75 66 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20  buf[0];.        
18320 62 20 3d 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20  b = buf[1];.    
18330 20 20 20 20 63 20 3d 20 62 75 66 5b 32 5d 3b 0a      c = buf[2];.
18340 20 20 20 20 20 20 20 20 64 20 3d 20 62 75 66 5b          d = buf[
18350 33 5d 3b 0a 0a 20 20 20 20 20 20 20 20 4d 44 35  3];..        MD5
18360 53 54 45 50 28 46 31 2c 20 61 2c 20 62 2c 20 63  STEP(F1, a, b, c
18370 2c 20 64 2c 20 69 6e 5b 20 30 5d 2b 30 78 64 37  , d, in[ 0]+0xd7
18380 36 61 61 34 37 38 2c 20 20 37 29 3b 0a 20 20 20  6aa478,  7);.   
18390 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c       MD5STEP(F1,
183a0 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b   d, a, b, c, in[
183b0 20 31 5d 2b 30 78 65 38 63 37 62 37 35 36 2c 20   1]+0xe8c7b756, 
183c0 31 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  12);.        MD5
183d0 53 54 45 50 28 46 31 2c 20 63 2c 20 64 2c 20 61  STEP(F1, c, d, a
183e0 2c 20 62 2c 20 69 6e 5b 20 32 5d 2b 30 78 32 34  , b, in[ 2]+0x24
183f0 32 30 37 30 64 62 2c 20 31 37 29 3b 0a 20 20 20  2070db, 17);.   
18400 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c       MD5STEP(F1,
18410 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
18420 20 33 5d 2b 30 78 63 31 62 64 63 65 65 65 2c 20   3]+0xc1bdceee, 
18430 32 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  22);.        MD5
18440 53 54 45 50 28 46 31 2c 20 61 2c 20 62 2c 20 63  STEP(F1, a, b, c
18450 2c 20 64 2c 20 69 6e 5b 20 34 5d 2b 30 78 66 35  , d, in[ 4]+0xf5
18460 37 63 30 66 61 66 2c 20 20 37 29 3b 0a 20 20 20  7c0faf,  7);.   
18470 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c       MD5STEP(F1,
18480 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b   d, a, b, c, in[
18490 20 35 5d 2b 30 78 34 37 38 37 63 36 32 61 2c 20   5]+0x4787c62a, 
184a0 31 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  12);.        MD5
184b0 53 54 45 50 28 46 31 2c 20 63 2c 20 64 2c 20 61  STEP(F1, c, d, a
184c0 2c 20 62 2c 20 69 6e 5b 20 36 5d 2b 30 78 61 38  , b, in[ 6]+0xa8
184d0 33 30 34 36 31 33 2c 20 31 37 29 3b 0a 20 20 20  304613, 17);.   
184e0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c       MD5STEP(F1,
184f0 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
18500 20 37 5d 2b 30 78 66 64 34 36 39 35 30 31 2c 20   7]+0xfd469501, 
18510 32 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  22);.        MD5
18520 53 54 45 50 28 46 31 2c 20 61 2c 20 62 2c 20 63  STEP(F1, a, b, c
18530 2c 20 64 2c 20 69 6e 5b 20 38 5d 2b 30 78 36 39  , d, in[ 8]+0x69
18540 38 30 39 38 64 38 2c 20 20 37 29 3b 0a 20 20 20  8098d8,  7);.   
18550 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c       MD5STEP(F1,
18560 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b   d, a, b, c, in[
18570 20 39 5d 2b 30 78 38 62 34 34 66 37 61 66 2c 20   9]+0x8b44f7af, 
18580 31 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  12);.        MD5
18590 53 54 45 50 28 46 31 2c 20 63 2c 20 64 2c 20 61  STEP(F1, c, d, a
185a0 2c 20 62 2c 20 69 6e 5b 31 30 5d 2b 30 78 66 66  , b, in[10]+0xff
185b0 66 66 35 62 62 31 2c 20 31 37 29 3b 0a 20 20 20  ff5bb1, 17);.   
185c0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c       MD5STEP(F1,
185d0 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
185e0 31 31 5d 2b 30 78 38 39 35 63 64 37 62 65 2c 20  11]+0x895cd7be, 
185f0 32 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  22);.        MD5
18600 53 54 45 50 28 46 31 2c 20 61 2c 20 62 2c 20 63  STEP(F1, a, b, c
18610 2c 20 64 2c 20 69 6e 5b 31 32 5d 2b 30 78 36 62  , d, in[12]+0x6b
18620 39 30 31 31 32 32 2c 20 20 37 29 3b 0a 20 20 20  901122,  7);.   
18630 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c       MD5STEP(F1,
18640 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b   d, a, b, c, in[
18650 31 33 5d 2b 30 78 66 64 39 38 37 31 39 33 2c 20  13]+0xfd987193, 
18660 31 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  12);.        MD5
18670 53 54 45 50 28 46 31 2c 20 63 2c 20 64 2c 20 61  STEP(F1, c, d, a
18680 2c 20 62 2c 20 69 6e 5b 31 34 5d 2b 30 78 61 36  , b, in[14]+0xa6
18690 37 39 34 33 38 65 2c 20 31 37 29 3b 0a 20 20 20  79438e, 17);.   
186a0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c       MD5STEP(F1,
186b0 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
186c0 31 35 5d 2b 30 78 34 39 62 34 30 38 32 31 2c 20  15]+0x49b40821, 
186d0 32 32 29 3b 0a 0a 20 20 20 20 20 20 20 20 4d 44  22);..        MD
186e0 35 53 54 45 50 28 46 32 2c 20 61 2c 20 62 2c 20  5STEP(F2, a, b, 
186f0 63 2c 20 64 2c 20 69 6e 5b 20 31 5d 2b 30 78 66  c, d, in[ 1]+0xf
18700 36 31 65 32 35 36 32 2c 20 20 35 29 3b 0a 20 20  61e2562,  5);.  
18710 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32        MD5STEP(F2
18720 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
18730 5b 20 36 5d 2b 30 78 63 30 34 30 62 33 34 30 2c  [ 6]+0xc040b340,
18740 20 20 39 29 3b 0a 20 20 20 20 20 20 20 20 4d 44    9);.        MD
18750 35 53 54 45 50 28 46 32 2c 20 63 2c 20 64 2c 20  5STEP(F2, c, d, 
18760 61 2c 20 62 2c 20 69 6e 5b 31 31 5d 2b 30 78 32  a, b, in[11]+0x2
18770 36 35 65 35 61 35 31 2c 20 31 34 29 3b 0a 20 20  65e5a51, 14);.  
18780 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32        MD5STEP(F2
18790 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
187a0 5b 20 30 5d 2b 30 78 65 39 62 36 63 37 61 61 2c  [ 0]+0xe9b6c7aa,
187b0 20 32 30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   20);.        MD
187c0 35 53 54 45 50 28 46 32 2c 20 61 2c 20 62 2c 20  5STEP(F2, a, b, 
187d0 63 2c 20 64 2c 20 69 6e 5b 20 35 5d 2b 30 78 64  c, d, in[ 5]+0xd
187e0 36 32 66 31 30 35 64 2c 20 20 35 29 3b 0a 20 20  62f105d,  5);.  
187f0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32        MD5STEP(F2
18800 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
18810 5b 31 30 5d 2b 30 78 30 32 34 34 31 34 35 33 2c  [10]+0x02441453,
18820 20 20 39 29 3b 0a 20 20 20 20 20 20 20 20 4d 44    9);.        MD
18830 35 53 54 45 50 28 46 32 2c 20 63 2c 20 64 2c 20  5STEP(F2, c, d, 
18840 61 2c 20 62 2c 20 69 6e 5b 31 35 5d 2b 30 78 64  a, b, in[15]+0xd
18850 38 61 31 65 36 38 31 2c 20 31 34 29 3b 0a 20 20  8a1e681, 14);.  
18860 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32        MD5STEP(F2
18870 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
18880 5b 20 34 5d 2b 30 78 65 37 64 33 66 62 63 38 2c  [ 4]+0xe7d3fbc8,
18890 20 32 30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   20);.        MD
188a0 35 53 54 45 50 28 46 32 2c 20 61 2c 20 62 2c 20  5STEP(F2, a, b, 
188b0 63 2c 20 64 2c 20 69 6e 5b 20 39 5d 2b 30 78 32  c, d, in[ 9]+0x2
188c0 31 65 31 63 64 65 36 2c 20 20 35 29 3b 0a 20 20  1e1cde6,  5);.  
188d0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32        MD5STEP(F2
188e0 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
188f0 5b 31 34 5d 2b 30 78 63 33 33 37 30 37 64 36 2c  [14]+0xc33707d6,
18900 20 20 39 29 3b 0a 20 20 20 20 20 20 20 20 4d 44    9);.        MD
18910 35 53 54 45 50 28 46 32 2c 20 63 2c 20 64 2c 20  5STEP(F2, c, d, 
18920 61 2c 20 62 2c 20 69 6e 5b 20 33 5d 2b 30 78 66  a, b, in[ 3]+0xf
18930 34 64 35 30 64 38 37 2c 20 31 34 29 3b 0a 20 20  4d50d87, 14);.  
18940 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32        MD5STEP(F2
18950 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
18960 5b 20 38 5d 2b 30 78 34 35 35 61 31 34 65 64 2c  [ 8]+0x455a14ed,
18970 20 32 30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   20);.        MD
18980 35 53 54 45 50 28 46 32 2c 20 61 2c 20 62 2c 20  5STEP(F2, a, b, 
18990 63 2c 20 64 2c 20 69 6e 5b 31 33 5d 2b 30 78 61  c, d, in[13]+0xa
189a0 39 65 33 65 39 30 35 2c 20 20 35 29 3b 0a 20 20  9e3e905,  5);.  
189b0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32        MD5STEP(F2
189c0 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
189d0 5b 20 32 5d 2b 30 78 66 63 65 66 61 33 66 38 2c  [ 2]+0xfcefa3f8,
189e0 20 20 39 29 3b 0a 20 20 20 20 20 20 20 20 4d 44    9);.        MD
189f0 35 53 54 45 50 28 46 32 2c 20 63 2c 20 64 2c 20  5STEP(F2, c, d, 
18a00 61 2c 20 62 2c 20 69 6e 5b 20 37 5d 2b 30 78 36  a, b, in[ 7]+0x6
18a10 37 36 66 30 32 64 39 2c 20 31 34 29 3b 0a 20 20  76f02d9, 14);.  
18a20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32        MD5STEP(F2
18a30 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
18a40 5b 31 32 5d 2b 30 78 38 64 32 61 34 63 38 61 2c  [12]+0x8d2a4c8a,
18a50 20 32 30 29 3b 0a 0a 20 20 20 20 20 20 20 20 4d   20);..        M
18a60 44 35 53 54 45 50 28 46 33 2c 20 61 2c 20 62 2c  D5STEP(F3, a, b,
18a70 20 63 2c 20 64 2c 20 69 6e 5b 20 35 5d 2b 30 78   c, d, in[ 5]+0x
18a80 66 66 66 61 33 39 34 32 2c 20 20 34 29 3b 0a 20  fffa3942,  4);. 
18a90 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
18aa0 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  3, d, a, b, c, i
18ab0 6e 5b 20 38 5d 2b 30 78 38 37 37 31 66 36 38 31  n[ 8]+0x8771f681
18ac0 2c 20 31 31 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 11);.        M
18ad0 44 35 53 54 45 50 28 46 33 2c 20 63 2c 20 64 2c  D5STEP(F3, c, d,
18ae0 20 61 2c 20 62 2c 20 69 6e 5b 31 31 5d 2b 30 78   a, b, in[11]+0x
18af0 36 64 39 64 36 31 32 32 2c 20 31 36 29 3b 0a 20  6d9d6122, 16);. 
18b00 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
18b10 33 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  3, b, c, d, a, i
18b20 6e 5b 31 34 5d 2b 30 78 66 64 65 35 33 38 30 63  n[14]+0xfde5380c
18b30 2c 20 32 33 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 23);.        M
18b40 44 35 53 54 45 50 28 46 33 2c 20 61 2c 20 62 2c  D5STEP(F3, a, b,
18b50 20 63 2c 20 64 2c 20 69 6e 5b 20 31 5d 2b 30 78   c, d, in[ 1]+0x
18b60 61 34 62 65 65 61 34 34 2c 20 20 34 29 3b 0a 20  a4beea44,  4);. 
18b70 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
18b80 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  3, d, a, b, c, i
18b90 6e 5b 20 34 5d 2b 30 78 34 62 64 65 63 66 61 39  n[ 4]+0x4bdecfa9
18ba0 2c 20 31 31 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 11);.        M
18bb0 44 35 53 54 45 50 28 46 33 2c 20 63 2c 20 64 2c  D5STEP(F3, c, d,
18bc0 20 61 2c 20 62 2c 20 69 6e 5b 20 37 5d 2b 30 78   a, b, in[ 7]+0x
18bd0 66 36 62 62 34 62 36 30 2c 20 31 36 29 3b 0a 20  f6bb4b60, 16);. 
18be0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
18bf0 33 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  3, b, c, d, a, i
18c00 6e 5b 31 30 5d 2b 30 78 62 65 62 66 62 63 37 30  n[10]+0xbebfbc70
18c10 2c 20 32 33 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 23);.        M
18c20 44 35 53 54 45 50 28 46 33 2c 20 61 2c 20 62 2c  D5STEP(F3, a, b,
18c30 20 63 2c 20 64 2c 20 69 6e 5b 31 33 5d 2b 30 78   c, d, in[13]+0x
18c40 32 38 39 62 37 65 63 36 2c 20 20 34 29 3b 0a 20  289b7ec6,  4);. 
18c50 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
18c60 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  3, d, a, b, c, i
18c70 6e 5b 20 30 5d 2b 30 78 65 61 61 31 32 37 66 61  n[ 0]+0xeaa127fa
18c80 2c 20 31 31 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 11);.        M
18c90 44 35 53 54 45 50 28 46 33 2c 20 63 2c 20 64 2c  D5STEP(F3, c, d,
18ca0 20 61 2c 20 62 2c 20 69 6e 5b 20 33 5d 2b 30 78   a, b, in[ 3]+0x
18cb0 64 34 65 66 33 30 38 35 2c 20 31 36 29 3b 0a 20  d4ef3085, 16);. 
18cc0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
18cd0 33 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  3, b, c, d, a, i
18ce0 6e 5b 20 36 5d 2b 30 78 30 34 38 38 31 64 30 35  n[ 6]+0x04881d05
18cf0 2c 20 32 33 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 23);.        M
18d00 44 35 53 54 45 50 28 46 33 2c 20 61 2c 20 62 2c  D5STEP(F3, a, b,
18d10 20 63 2c 20 64 2c 20 69 6e 5b 20 39 5d 2b 30 78   c, d, in[ 9]+0x
18d20 64 39 64 34 64 30 33 39 2c 20 20 34 29 3b 0a 20  d9d4d039,  4);. 
18d30 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
18d40 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  3, d, a, b, c, i
18d50 6e 5b 31 32 5d 2b 30 78 65 36 64 62 39 39 65 35  n[12]+0xe6db99e5
18d60 2c 20 31 31 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 11);.        M
18d70 44 35 53 54 45 50 28 46 33 2c 20 63 2c 20 64 2c  D5STEP(F3, c, d,
18d80 20 61 2c 20 62 2c 20 69 6e 5b 31 35 5d 2b 30 78   a, b, in[15]+0x
18d90 31 66 61 32 37 63 66 38 2c 20 31 36 29 3b 0a 20  1fa27cf8, 16);. 
18da0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
18db0 33 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  3, b, c, d, a, i
18dc0 6e 5b 20 32 5d 2b 30 78 63 34 61 63 35 36 36 35  n[ 2]+0xc4ac5665
18dd0 2c 20 32 33 29 3b 0a 0a 20 20 20 20 20 20 20 20  , 23);..        
18de0 4d 44 35 53 54 45 50 28 46 34 2c 20 61 2c 20 62  MD5STEP(F4, a, b
18df0 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 30 5d 2b 30  , c, d, in[ 0]+0
18e00 78 66 34 32 39 32 32 34 34 2c 20 20 36 29 3b 0a  xf4292244,  6);.
18e10 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
18e20 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F4, d, a, b, c, 
18e30 69 6e 5b 20 37 5d 2b 30 78 34 33 32 61 66 66 39  in[ 7]+0x432aff9
18e40 37 2c 20 31 30 29 3b 0a 20 20 20 20 20 20 20 20  7, 10);.        
18e50 4d 44 35 53 54 45 50 28 46 34 2c 20 63 2c 20 64  MD5STEP(F4, c, d
18e60 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 34 5d 2b 30  , a, b, in[14]+0
18e70 78 61 62 39 34 32 33 61 37 2c 20 31 35 29 3b 0a  xab9423a7, 15);.
18e80 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
18e90 46 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20  F4, b, c, d, a, 
18ea0 69 6e 5b 20 35 5d 2b 30 78 66 63 39 33 61 30 33  in[ 5]+0xfc93a03
18eb0 39 2c 20 32 31 29 3b 0a 20 20 20 20 20 20 20 20  9, 21);.        
18ec0 4d 44 35 53 54 45 50 28 46 34 2c 20 61 2c 20 62  MD5STEP(F4, a, b
18ed0 2c 20 63 2c 20 64 2c 20 69 6e 5b 31 32 5d 2b 30  , c, d, in[12]+0
18ee0 78 36 35 35 62 35 39 63 33 2c 20 20 36 29 3b 0a  x655b59c3,  6);.
18ef0 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
18f00 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F4, d, a, b, c, 
18f10 69 6e 5b 20 33 5d 2b 30 78 38 66 30 63 63 63 39  in[ 3]+0x8f0ccc9
18f20 32 2c 20 31 30 29 3b 0a 20 20 20 20 20 20 20 20  2, 10);.        
18f30 4d 44 35 53 54 45 50 28 46 34 2c 20 63 2c 20 64  MD5STEP(F4, c, d
18f40 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 30 5d 2b 30  , a, b, in[10]+0
18f50 78 66 66 65 66 66 34 37 64 2c 20 31 35 29 3b 0a  xffeff47d, 15);.
18f60 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
18f70 46 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20  F4, b, c, d, a, 
18f80 69 6e 5b 20 31 5d 2b 30 78 38 35 38 34 35 64 64  in[ 1]+0x85845dd
18f90 31 2c 20 32 31 29 3b 0a 20 20 20 20 20 20 20 20  1, 21);.        
18fa0 4d 44 35 53 54 45 50 28 46 34 2c 20 61 2c 20 62  MD5STEP(F4, a, b
18fb0 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 38 5d 2b 30  , c, d, in[ 8]+0
18fc0 78 36 66 61 38 37 65 34 66 2c 20 20 36 29 3b 0a  x6fa87e4f,  6);.
18fd0 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
18fe0 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F4, d, a, b, c, 
18ff0 69 6e 5b 31 35 5d 2b 30 78 66 65 32 63 65 36 65  in[15]+0xfe2ce6e
19000 30 2c 20 31 30 29 3b 0a 20 20 20 20 20 20 20 20  0, 10);.        
19010 4d 44 35 53 54 45 50 28 46 34 2c 20 63 2c 20 64  MD5STEP(F4, c, d
19020 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 36 5d 2b 30  , a, b, in[ 6]+0
19030 78 61 33 30 31 34 33 31 34 2c 20 31 35 29 3b 0a  xa3014314, 15);.
19040 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
19050 46 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20  F4, b, c, d, a, 
19060 69 6e 5b 31 33 5d 2b 30 78 34 65 30 38 31 31 61  in[13]+0x4e0811a
19070 31 2c 20 32 31 29 3b 0a 20 20 20 20 20 20 20 20  1, 21);.        
19080 4d 44 35 53 54 45 50 28 46 34 2c 20 61 2c 20 62  MD5STEP(F4, a, b
19090 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 34 5d 2b 30  , c, d, in[ 4]+0
190a0 78 66 37 35 33 37 65 38 32 2c 20 20 36 29 3b 0a  xf7537e82,  6);.
190b0 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
190c0 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F4, d, a, b, c, 
190d0 69 6e 5b 31 31 5d 2b 30 78 62 64 33 61 66 32 33  in[11]+0xbd3af23
190e0 35 2c 20 31 30 29 3b 0a 20 20 20 20 20 20 20 20  5, 10);.        
190f0 4d 44 35 53 54 45 50 28 46 34 2c 20 63 2c 20 64  MD5STEP(F4, c, d
19100 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 32 5d 2b 30  , a, b, in[ 2]+0
19110 78 32 61 64 37 64 32 62 62 2c 20 31 35 29 3b 0a  x2ad7d2bb, 15);.
19120 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
19130 46 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20  F4, b, c, d, a, 
19140 69 6e 5b 20 39 5d 2b 30 78 65 62 38 36 64 33 39  in[ 9]+0xeb86d39
19150 31 2c 20 32 31 29 3b 0a 0a 20 20 20 20 20 20 20  1, 21);..       
19160 20 62 75 66 5b 30 5d 20 2b 3d 20 61 3b 0a 20 20   buf[0] += a;.  
19170 20 20 20 20 20 20 62 75 66 5b 31 5d 20 2b 3d 20        buf[1] += 
19180 62 3b 0a 20 20 20 20 20 20 20 20 62 75 66 5b 32  b;.        buf[2
19190 5d 20 2b 3d 20 63 3b 0a 20 20 20 20 20 20 20 20  ] += c;.        
191a0 62 75 66 5b 33 5d 20 2b 3d 20 64 3b 0a 7d 0a 0a  buf[3] += d;.}..
191b0 2f 2a 0a 20 2a 20 53 74 61 72 74 20 4d 44 35 20  /*. * Start MD5 
191c0 61 63 63 75 6d 75 6c 61 74 69 6f 6e 2e 20 20 53  accumulation.  S
191d0 65 74 20 62 69 74 20 63 6f 75 6e 74 20 74 6f 20  et bit count to 
191e0 30 20 61 6e 64 20 62 75 66 66 65 72 20 74 6f 20  0 and buffer to 
191f0 6d 79 73 74 65 72 69 6f 75 73 0a 20 2a 20 69 6e  mysterious. * in
19200 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 63 6f 6e  itialization con
19210 73 74 61 6e 74 73 2e 0a 20 2a 2f 0a 73 74 61 74  stants.. */.stat
19220 69 63 20 76 6f 69 64 20 4d 44 35 49 6e 69 74 28  ic void MD5Init(
19230 4d 44 35 43 6f 6e 74 65 78 74 20 2a 63 74 78 29  MD5Context *ctx)
19240 7b 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e 69  {.        ctx->i
19250 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  sInit = 1;.     
19260 20 20 20 63 74 78 2d 3e 62 75 66 5b 30 5d 20 3d     ctx->buf[0] =
19270 20 30 78 36 37 34 35 32 33 30 31 3b 0a 20 20 20   0x67452301;.   
19280 20 20 20 20 20 63 74 78 2d 3e 62 75 66 5b 31 5d       ctx->buf[1]
19290 20 3d 20 30 78 65 66 63 64 61 62 38 39 3b 0a 20   = 0xefcdab89;. 
192a0 20 20 20 20 20 20 20 63 74 78 2d 3e 62 75 66 5b         ctx->buf[
192b0 32 5d 20 3d 20 30 78 39 38 62 61 64 63 66 65 3b  2] = 0x98badcfe;
192c0 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62 75  .        ctx->bu
192d0 66 5b 33 5d 20 3d 20 30 78 31 30 33 32 35 34 37  f[3] = 0x1032547
192e0 36 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e  6;.        ctx->
192f0 62 69 74 73 5b 30 5d 20 3d 20 30 3b 0a 20 20 20  bits[0] = 0;.   
19300 20 20 20 20 20 63 74 78 2d 3e 62 69 74 73 5b 31       ctx->bits[1
19310 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  ] = 0;.}../*. * 
19320 55 70 64 61 74 65 20 63 6f 6e 74 65 78 74 20 74  Update context t
19330 6f 20 72 65 66 6c 65 63 74 20 74 68 65 20 63 6f  o reflect the co
19340 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f 66 20 61  ncatenation of a
19350 6e 6f 74 68 65 72 20 62 75 66 66 65 72 20 66 75  nother buffer fu
19360 6c 6c 0a 20 2a 20 6f 66 20 62 79 74 65 73 2e 0a  ll. * of bytes..
19370 20 2a 2f 0a 73 74 61 74 69 63 20 0a 76 6f 69 64   */.static .void
19380 20 4d 44 35 55 70 64 61 74 65 28 4d 44 35 43 6f   MD5Update(MD5Co
19390 6e 74 65 78 74 20 2a 63 74 78 2c 20 63 6f 6e 73  ntext *ctx, cons
193a0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
193b0 2a 62 75 66 2c 20 75 6e 73 69 67 6e 65 64 20 69  *buf, unsigned i
193c0 6e 74 20 6c 65 6e 29 7b 0a 20 20 20 20 20 20 20  nt len){.       
193d0 20 75 69 6e 74 33 32 20 74 3b 0a 0a 20 20 20 20   uint32 t;..    
193e0 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 62 69      /* Update bi
193f0 74 63 6f 75 6e 74 20 2a 2f 0a 0a 20 20 20 20 20  tcount */..     
19400 20 20 20 74 20 3d 20 63 74 78 2d 3e 62 69 74 73     t = ctx->bits
19410 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 20  [0];.        if 
19420 28 28 63 74 78 2d 3e 62 69 74 73 5b 30 5d 20 3d  ((ctx->bits[0] =
19430 20 74 20 2b 20 28 28 75 69 6e 74 33 32 29 6c 65   t + ((uint32)le
19440 6e 20 3c 3c 20 33 29 29 20 3c 20 74 29 0a 20 20  n << 3)) < t).  
19450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 74                ct
19460 78 2d 3e 62 69 74 73 5b 31 5d 2b 2b 3b 20 2f 2a  x->bits[1]++; /*
19470 20 43 61 72 72 79 20 66 72 6f 6d 20 6c 6f 77 20   Carry from low 
19480 74 6f 20 68 69 67 68 20 2a 2f 0a 20 20 20 20 20  to high */.     
19490 20 20 20 63 74 78 2d 3e 62 69 74 73 5b 31 5d 20     ctx->bits[1] 
194a0 2b 3d 20 6c 65 6e 20 3e 3e 20 32 39 3b 0a 0a 20  += len >> 29;.. 
194b0 20 20 20 20 20 20 20 74 20 3d 20 28 74 20 3e 3e         t = (t >>
194c0 20 33 29 20 26 20 30 78 33 66 3b 20 20 20 20 2f   3) & 0x3f;    /
194d0 2a 20 42 79 74 65 73 20 61 6c 72 65 61 64 79 20  * Bytes already 
194e0 69 6e 20 73 68 73 49 6e 66 6f 2d 3e 64 61 74 61  in shsInfo->data
194f0 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   */..        /* 
19500 48 61 6e 64 6c 65 20 61 6e 79 20 6c 65 61 64 69  Handle any leadi
19510 6e 67 20 6f 64 64 2d 73 69 7a 65 64 20 63 68 75  ng odd-sized chu
19520 6e 6b 73 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  nks */..        
19530 69 66 20 28 20 74 20 29 20 7b 0a 20 20 20 20 20  if ( t ) {.     
19540 20 20 20 20 20 20 20 20 20 20 20 75 6e 73 69 67             unsig
19550 6e 65 64 20 63 68 61 72 20 2a 70 20 3d 20 28 75  ned char *p = (u
19560 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 63  nsigned char *)c
19570 74 78 2d 3e 69 6e 20 2b 20 74 3b 0a 0a 20 20 20  tx->in + t;..   
19580 20 20 20 20 20 20 20 20 20 20 20 20 20 74 20 3d               t =
19590 20 36 34 2d 74 3b 0a 20 20 20 20 20 20 20 20 20   64-t;.         
195a0 20 20 20 20 20 20 20 69 66 20 28 6c 65 6e 20 3c         if (len <
195b0 20 74 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20   t) {.          
195c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65                me
195d0 6d 63 70 79 28 70 2c 20 62 75 66 2c 20 6c 65 6e  mcpy(p, buf, len
195e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
195f0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
19600 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n;.             
19610 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
19620 20 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 62       memcpy(p, b
19630 75 66 2c 20 74 29 3b 0a 20 20 20 20 20 20 20 20  uf, t);.        
19640 20 20 20 20 20 20 20 20 62 79 74 65 52 65 76 65          byteReve
19650 72 73 65 28 63 74 78 2d 3e 69 6e 2c 20 31 36 29  rse(ctx->in, 16)
19660 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
19670 20 20 4d 44 35 54 72 61 6e 73 66 6f 72 6d 28 63    MD5Transform(c
19680 74 78 2d 3e 62 75 66 2c 20 28 75 69 6e 74 33 32  tx->buf, (uint32
19690 20 2a 29 63 74 78 2d 3e 69 6e 29 3b 0a 20 20 20   *)ctx->in);.   
196a0 20 20 20 20 20 20 20 20 20 20 20 20 20 62 75 66               buf
196b0 20 2b 3d 20 74 3b 0a 20 20 20 20 20 20 20 20 20   += t;.         
196c0 20 20 20 20 20 20 20 6c 65 6e 20 2d 3d 20 74 3b         len -= t;
196d0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
196e0 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 64      /* Process d
196f0 61 74 61 20 69 6e 20 36 34 2d 62 79 74 65 20 63  ata in 64-byte c
19700 68 75 6e 6b 73 20 2a 2f 0a 0a 20 20 20 20 20 20  hunks */..      
19710 20 20 77 68 69 6c 65 20 28 6c 65 6e 20 3e 3d 20    while (len >= 
19720 36 34 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  64) {.          
19730 20 20 20 20 20 20 6d 65 6d 63 70 79 28 63 74 78        memcpy(ctx
19740 2d 3e 69 6e 2c 20 62 75 66 2c 20 36 34 29 3b 0a  ->in, buf, 64);.
19750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19760 62 79 74 65 52 65 76 65 72 73 65 28 63 74 78 2d  byteReverse(ctx-
19770 3e 69 6e 2c 20 31 36 29 3b 0a 20 20 20 20 20 20  >in, 16);.      
19780 20 20 20 20 20 20 20 20 20 20 4d 44 35 54 72 61            MD5Tra
19790 6e 73 66 6f 72 6d 28 63 74 78 2d 3e 62 75 66 2c  nsform(ctx->buf,
197a0 20 28 75 69 6e 74 33 32 20 2a 29 63 74 78 2d 3e   (uint32 *)ctx->
197b0 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  in);.           
197c0 20 20 20 20 20 62 75 66 20 2b 3d 20 36 34 3b 0a       buf += 64;.
197d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197e0 6c 65 6e 20 2d 3d 20 36 34 3b 0a 20 20 20 20 20  len -= 64;.     
197f0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
19800 20 48 61 6e 64 6c 65 20 61 6e 79 20 72 65 6d 61   Handle any rema
19810 69 6e 69 6e 67 20 62 79 74 65 73 20 6f 66 20 64  ining bytes of d
19820 61 74 61 2e 20 2a 2f 0a 0a 20 20 20 20 20 20 20  ata. */..       
19830 20 6d 65 6d 63 70 79 28 63 74 78 2d 3e 69 6e 2c   memcpy(ctx->in,
19840 20 62 75 66 2c 20 6c 65 6e 29 3b 0a 7d 0a 0a 2f   buf, len);.}../
19850 2a 0a 20 2a 20 46 69 6e 61 6c 20 77 72 61 70 75  *. * Final wrapu
19860 70 20 2d 20 70 61 64 20 74 6f 20 36 34 2d 62 79  p - pad to 64-by
19870 74 65 20 62 6f 75 6e 64 61 72 79 20 77 69 74 68  te boundary with
19880 20 74 68 65 20 62 69 74 20 70 61 74 74 65 72 6e   the bit pattern
19890 20 0a 20 2a 20 31 20 30 2a 20 28 36 34 2d 62 69   . * 1 0* (64-bi
198a0 74 20 63 6f 75 6e 74 20 6f 66 20 62 69 74 73 20  t count of bits 
198b0 70 72 6f 63 65 73 73 65 64 2c 20 4d 53 42 2d 66  processed, MSB-f
198c0 69 72 73 74 29 0a 20 2a 2f 0a 73 74 61 74 69 63  irst). */.static
198d0 20 76 6f 69 64 20 4d 44 35 46 69 6e 61 6c 28 75   void MD5Final(u
198e0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64 69 67  nsigned char dig
198f0 65 73 74 5b 31 36 5d 2c 20 4d 44 35 43 6f 6e 74  est[16], MD5Cont
19900 65 78 74 20 2a 63 74 78 29 7b 0a 20 20 20 20 20  ext *ctx){.     
19910 20 20 20 75 6e 73 69 67 6e 65 64 20 63 6f 75 6e     unsigned coun
19920 74 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67  t;.        unsig
19930 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a 0a 20 20  ned char *p;..  
19940 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65        /* Compute
19950 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
19960 20 6d 6f 64 20 36 34 20 2a 2f 0a 20 20 20 20 20   mod 64 */.     
19970 20 20 20 63 6f 75 6e 74 20 3d 20 28 63 74 78 2d     count = (ctx-
19980 3e 62 69 74 73 5b 30 5d 20 3e 3e 20 33 29 20 26  >bits[0] >> 3) &
19990 20 30 78 33 46 3b 0a 0a 20 20 20 20 20 20 20 20   0x3F;..        
199a0 2f 2a 20 53 65 74 20 74 68 65 20 66 69 72 73 74  /* Set the first
199b0 20 63 68 61 72 20 6f 66 20 70 61 64 64 69 6e 67   char of padding
199c0 20 74 6f 20 30 78 38 30 2e 20 20 54 68 69 73 20   to 0x80.  This 
199d0 69 73 20 73 61 66 65 20 73 69 6e 63 65 20 74 68  is safe since th
199e0 65 72 65 20 69 73 0a 20 20 20 20 20 20 20 20 20  ere is.         
199f0 20 20 61 6c 77 61 79 73 20 61 74 20 6c 65 61 73    always at leas
19a00 74 20 6f 6e 65 20 62 79 74 65 20 66 72 65 65 20  t one byte free 
19a10 2a 2f 0a 20 20 20 20 20 20 20 20 70 20 3d 20 63  */.        p = c
19a20 74 78 2d 3e 69 6e 20 2b 20 63 6f 75 6e 74 3b 0a  tx->in + count;.
19a30 20 20 20 20 20 20 20 20 2a 70 2b 2b 20 3d 20 30          *p++ = 0
19a40 78 38 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  x80;..        /*
19a50 20 42 79 74 65 73 20 6f 66 20 70 61 64 64 69 6e   Bytes of paddin
19a60 67 20 6e 65 65 64 65 64 20 74 6f 20 6d 61 6b 65  g needed to make
19a70 20 36 34 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   64 bytes */.   
19a80 20 20 20 20 20 63 6f 75 6e 74 20 3d 20 36 34 20       count = 64 
19a90 2d 20 31 20 2d 20 63 6f 75 6e 74 3b 0a 0a 20 20  - 1 - count;..  
19aa0 20 20 20 20 20 20 2f 2a 20 50 61 64 20 6f 75 74        /* Pad out
19ab0 20 74 6f 20 35 36 20 6d 6f 64 20 36 34 20 2a 2f   to 56 mod 64 */
19ac0 0a 20 20 20 20 20 20 20 20 69 66 20 28 63 6f 75  .        if (cou
19ad0 6e 74 20 3c 20 38 29 20 7b 0a 20 20 20 20 20 20  nt < 8) {.      
19ae0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77 6f            /* Two
19af0 20 6c 6f 74 73 20 6f 66 20 70 61 64 64 69 6e 67   lots of padding
19b00 3a 20 20 50 61 64 20 74 68 65 20 66 69 72 73 74  :  Pad the first
19b10 20 62 6c 6f 63 6b 20 74 6f 20 36 34 20 62 79 74   block to 64 byt
19b20 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  es */.          
19b30 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20        memset(p, 
19b40 30 2c 20 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20  0, count);.     
19b50 20 20 20 20 20 20 20 20 20 20 20 62 79 74 65 52             byteR
19b60 65 76 65 72 73 65 28 63 74 78 2d 3e 69 6e 2c 20  everse(ctx->in, 
19b70 31 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  16);.           
19b80 20 20 20 20 20 4d 44 35 54 72 61 6e 73 66 6f 72       MD5Transfor
19b90 6d 28 63 74 78 2d 3e 62 75 66 2c 20 28 75 69 6e  m(ctx->buf, (uin
19ba0 74 33 32 20 2a 29 63 74 78 2d 3e 69 6e 29 3b 0a  t32 *)ctx->in);.
19bb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19bc0 20 2f 2a 20 4e 6f 77 20 66 69 6c 6c 20 74 68 65   /* Now fill the
19bd0 20 6e 65 78 74 20 62 6c 6f 63 6b 20 77 69 74 68   next block with
19be0 20 35 36 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   56 bytes */.   
19bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d               mem
19c00 73 65 74 28 63 74 78 2d 3e 69 6e 2c 20 30 2c 20  set(ctx->in, 0, 
19c10 35 36 29 3b 0a 20 20 20 20 20 20 20 20 7d 20 65  56);.        } e
19c20 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20  lse {.          
19c30 20 20 20 20 20 20 2f 2a 20 50 61 64 20 62 6c 6f        /* Pad blo
19c40 63 6b 20 74 6f 20 35 36 20 62 79 74 65 73 20 2a  ck to 56 bytes *
19c50 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
19c60 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 63    memset(p, 0, c
19c70 6f 75 6e 74 2d 38 29 3b 0a 20 20 20 20 20 20 20  ount-8);.       
19c80 20 7d 0a 20 20 20 20 20 20 20 20 62 79 74 65 52   }.        byteR
19c90 65 76 65 72 73 65 28 63 74 78 2d 3e 69 6e 2c 20  everse(ctx->in, 
19ca0 31 34 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  14);..        /*
19cb0 20 41 70 70 65 6e 64 20 6c 65 6e 67 74 68 20 69   Append length i
19cc0 6e 20 62 69 74 73 20 61 6e 64 20 74 72 61 6e 73  n bits and trans
19cd0 66 6f 72 6d 20 2a 2f 0a 20 20 20 20 20 20 20 20  form */.        
19ce0 28 28 75 69 6e 74 33 32 20 2a 29 63 74 78 2d 3e  ((uint32 *)ctx->
19cf0 69 6e 29 5b 20 31 34 20 5d 20 3d 20 63 74 78 2d  in)[ 14 ] = ctx-
19d00 3e 62 69 74 73 5b 30 5d 3b 0a 20 20 20 20 20 20  >bits[0];.      
19d10 20 20 28 28 75 69 6e 74 33 32 20 2a 29 63 74 78    ((uint32 *)ctx
19d20 2d 3e 69 6e 29 5b 20 31 35 20 5d 20 3d 20 63 74  ->in)[ 15 ] = ct
19d30 78 2d 3e 62 69 74 73 5b 31 5d 3b 0a 0a 20 20 20  x->bits[1];..   
19d40 20 20 20 20 20 4d 44 35 54 72 61 6e 73 66 6f 72       MD5Transfor
19d50 6d 28 63 74 78 2d 3e 62 75 66 2c 20 28 75 69 6e  m(ctx->buf, (uin
19d60 74 33 32 20 2a 29 63 74 78 2d 3e 69 6e 29 3b 0a  t32 *)ctx->in);.
19d70 20 20 20 20 20 20 20 20 62 79 74 65 52 65 76 65          byteReve
19d80 72 73 65 28 28 75 6e 73 69 67 6e 65 64 20 63 68  rse((unsigned ch
19d90 61 72 20 2a 29 63 74 78 2d 3e 62 75 66 2c 20 34  ar *)ctx->buf, 4
19da0 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  );.        memcp
19db0 79 28 64 69 67 65 73 74 2c 20 63 74 78 2d 3e 62  y(digest, ctx->b
19dc0 75 66 2c 20 31 36 29 3b 0a 20 20 20 20 20 20 20  uf, 16);.       
19dd0 20 6d 65 6d 73 65 74 28 63 74 78 2c 20 30 2c 20   memset(ctx, 0, 
19de0 73 69 7a 65 6f 66 28 63 74 78 29 29 3b 20 20 20  sizeof(ctx));   
19df0 20 2f 2a 20 49 6e 20 63 61 73 65 20 69 74 20 69   /* In case it i
19e00 73 20 73 65 6e 73 69 74 69 76 65 20 2a 2f 0a 7d  s sensitive */.}
19e10 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
19e20 61 20 31 32 38 2d 62 69 74 20 4d 44 35 20 64 69  a 128-bit MD5 di
19e30 67 65 73 74 20 69 6e 74 6f 20 61 20 33 32 2d 64  gest into a 32-d
19e40 69 67 69 74 20 62 61 73 65 2d 31 36 20 6e 75 6d  igit base-16 num
19e50 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ber..*/.static v
19e60 6f 69 64 20 4d 44 35 44 69 67 65 73 74 54 6f 42  oid MD5DigestToB
19e70 61 73 65 31 36 28 75 6e 73 69 67 6e 65 64 20 63  ase16(unsigned c
19e80 68 61 72 20 2a 64 69 67 65 73 74 2c 20 63 68 61  har *digest, cha
19e90 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74 61 74  r *zBuf){.  stat
19ea0 69 63 20 63 68 61 72 20 63 6f 6e 73 74 20 7a 45  ic char const zE
19eb0 6e 63 6f 64 65 5b 5d 20 3d 20 22 30 31 32 33 34  ncode[] = "01234
19ec0 35 36 37 38 39 61 62 63 64 65 66 22 3b 0a 20 20  56789abcdef";.  
19ed0 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20 66 6f 72  int i, j;..  for
19ee0 28 6a 3d 69 3d 30 3b 20 69 3c 31 36 3b 20 69 2b  (j=i=0; i<16; i+
19ef0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20  +){.    int a = 
19f00 64 69 67 65 73 74 5b 69 5d 3b 0a 20 20 20 20 7a  digest[i];.    z
19f10 42 75 66 5b 6a 2b 2b 5d 20 3d 20 7a 45 6e 63 6f  Buf[j++] = zEnco
19f20 64 65 5b 28 61 3e 3e 34 29 26 30 78 66 5d 3b 0a  de[(a>>4)&0xf];.
19f30 20 20 20 20 7a 42 75 66 5b 6a 2b 2b 5d 20 3d 20      zBuf[j++] = 
19f40 7a 45 6e 63 6f 64 65 5b 61 20 26 20 30 78 66 5d  zEncode[a & 0xf]
19f50 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20  ;.  }.  zBuf[j] 
19f60 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  = 0;.}.../*.** C
19f70 6f 6e 76 65 72 74 20 61 20 31 32 38 2d 62 69 74  onvert a 128-bit
19f80 20 4d 44 35 20 64 69 67 65 73 74 20 69 6e 74 6f   MD5 digest into
19f90 20 73 65 71 75 65 6e 63 79 20 6f 66 20 65 69 67   sequency of eig
19fa0 68 74 20 35 2d 64 69 67 69 74 20 69 6e 74 65 67  ht 5-digit integ
19fb0 65 72 73 0a 2a 2a 20 65 61 63 68 20 72 65 70 72  ers.** each repr
19fc0 65 73 65 6e 74 69 6e 67 20 31 36 20 62 69 74 73  esenting 16 bits
19fd0 20 6f 66 20 74 68 65 20 64 69 67 65 73 74 20 61   of the digest a
19fe0 6e 64 20 73 65 70 61 72 61 74 65 64 20 66 72 6f  nd separated fro
19ff0 6d 20 65 61 63 68 0a 2a 2a 20 6f 74 68 65 72 20  m each.** other 
1a000 62 79 20 61 20 22 2d 22 20 63 68 61 72 61 63 74  by a "-" charact
1a010 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
1a020 69 64 20 4d 44 35 44 69 67 65 73 74 54 6f 42 61  id MD5DigestToBa
1a030 73 65 31 30 78 38 28 75 6e 73 69 67 6e 65 64 20  se10x8(unsigned 
1a040 63 68 61 72 20 64 69 67 65 73 74 5b 31 36 5d 2c  char digest[16],
1a050 20 63 68 61 72 20 7a 44 69 67 65 73 74 5b 35 30   char zDigest[50
1a060 5d 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  ]){.  int i, j;.
1a070 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 78    unsigned int x
1a080 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69  ;.  for(i=j=0; i
1a090 3c 31 36 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20  <16; i+=2){.    
1a0a0 78 20 3d 20 64 69 67 65 73 74 5b 69 5d 2a 32 35  x = digest[i]*25
1a0b0 36 20 2b 20 64 69 67 65 73 74 5b 69 2b 31 5d 3b  6 + digest[i+1];
1a0c0 0a 20 20 20 20 69 66 28 20 69 3e 30 20 29 20 7a  .    if( i>0 ) z
1a0d0 44 69 67 65 73 74 5b 6a 2b 2b 5d 20 3d 20 27 2d  Digest[j++] = '-
1a0e0 27 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 26  ';.    sprintf(&
1a0f0 7a 44 69 67 65 73 74 5b 6a 5d 2c 20 22 25 30 35  zDigest[j], "%05
1a100 75 22 2c 20 78 29 3b 0a 20 20 20 20 6a 20 2b 3d  u", x);.    j +=
1a110 20 35 3b 0a 20 20 7d 0a 20 20 7a 44 69 67 65 73   5;.  }.  zDiges
1a120 74 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  t[j] = 0;.}../*.
1a130 2a 2a 20 41 20 54 43 4c 20 63 6f 6d 6d 61 6e 64  ** A TCL command
1a140 20 66 6f 72 20 6d 64 35 2e 20 20 54 68 65 20 61   for md5.  The a
1a150 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 74  rgument is the t
1a160 65 78 74 20 74 6f 20 62 65 20 68 61 73 68 65 64  ext to be hashed
1a170 2e 20 20 54 68 65 0a 2a 2a 20 52 65 73 75 6c 74  .  The.** Result
1a180 20 69 73 20 74 68 65 20 68 61 73 68 20 69 6e 20   is the hash in 
1a190 62 61 73 65 36 34 2e 20 20 0a 2a 2f 0a 73 74 61  base64.  .*/.sta
1a1a0 74 69 63 20 69 6e 74 20 6d 64 35 5f 63 6d 64 28  tic int md5_cmd(
1a1b0 76 6f 69 64 2a 63 64 2c 20 54 63 6c 5f 49 6e 74  void*cd, Tcl_Int
1a1c0 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
1a1d0 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61   argc, const cha
1a1e0 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 4d 44 35  r **argv){.  MD5
1a1f0 43 6f 6e 74 65 78 74 20 63 74 78 3b 0a 20 20 75  Context ctx;.  u
1a200 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64 69 67  nsigned char dig
1a210 65 73 74 5b 31 36 5d 3b 0a 20 20 63 68 61 72 20  est[16];.  char 
1a220 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 76 6f 69 64  zBuf[50];.  void
1a230 20 28 2a 63 6f 6e 76 65 72 74 65 72 29 28 75 6e   (*converter)(un
1a240 73 69 67 6e 65 64 20 63 68 61 72 2a 2c 20 63 68  signed char*, ch
1a250 61 72 2a 29 3b 0a 0a 20 20 69 66 28 20 61 72 67  ar*);..  if( arg
1a260 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
1a270 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1a280 65 72 70 2c 22 77 72 6f 6e 67 20 23 20 61 72 67  erp,"wrong # arg
1a290 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1a2a0 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20  , argv[0], .    
1a2b0 20 20 20 20 22 20 54 45 58 54 5c 22 22 2c 20 30      " TEXT\"", 0
1a2c0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1a2d0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 4d  L_ERROR;.  }.  M
1a2e0 44 35 49 6e 69 74 28 26 63 74 78 29 3b 0a 20 20  D5Init(&ctx);.  
1a2f0 4d 44 35 55 70 64 61 74 65 28 26 63 74 78 2c 20  MD5Update(&ctx, 
1a300 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
1a310 61 72 67 76 5b 31 5d 2c 20 28 75 6e 73 69 67 6e  argv[1], (unsign
1a320 65 64 29 73 74 72 6c 65 6e 28 61 72 67 76 5b 31  ed)strlen(argv[1
1a330 5d 29 29 3b 0a 20 20 4d 44 35 46 69 6e 61 6c 28  ]));.  MD5Final(
1a340 64 69 67 65 73 74 2c 20 26 63 74 78 29 3b 0a 20  digest, &ctx);. 
1a350 20 63 6f 6e 76 65 72 74 65 72 20 3d 20 28 76 6f   converter = (vo
1a360 69 64 28 2a 29 28 75 6e 73 69 67 6e 65 64 20 63  id(*)(unsigned c
1a370 68 61 72 2a 2c 63 68 61 72 2a 29 29 63 64 3b 0a  har*,char*))cd;.
1a380 20 20 63 6f 6e 76 65 72 74 65 72 28 64 69 67 65    converter(dige
1a390 73 74 2c 20 7a 42 75 66 29 3b 0a 20 20 54 63 6c  st, zBuf);.  Tcl
1a3a0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1a3b0 74 65 72 70 2c 20 7a 42 75 66 2c 20 28 63 68 61  terp, zBuf, (cha
1a3c0 72 2a 29 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  r*)0);.  return 
1a3d0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1a3e0 20 41 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 74   A TCL command t
1a3f0 6f 20 74 61 6b 65 20 74 68 65 20 6d 64 35 20 68  o take the md5 h
1a400 61 73 68 20 6f 66 20 61 20 66 69 6c 65 2e 20 20  ash of a file.  
1a410 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  The argument is 
1a420 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 74  the.** name of t
1a430 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  he file..*/.stat
1a440 69 63 20 69 6e 74 20 6d 64 35 66 69 6c 65 5f 63  ic int md5file_c
1a450 6d 64 28 76 6f 69 64 2a 63 64 2c 20 54 63 6c 5f  md(void*cd, Tcl_
1a460 49 6e 74 65 72 70 2a 69 6e 74 65 72 70 2c 20 69  Interp*interp, i
1a470 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63  nt argc, const c
1a480 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 46  har **argv){.  F
1a490 49 4c 45 20 2a 69 6e 3b 0a 20 20 4d 44 35 43 6f  ILE *in;.  MD5Co
1a4a0 6e 74 65 78 74 20 63 74 78 3b 0a 20 20 76 6f 69  ntext ctx;.  voi
1a4b0 64 20 28 2a 63 6f 6e 76 65 72 74 65 72 29 28 75  d (*converter)(u
1a4c0 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 2c 20 63  nsigned char*, c
1a4d0 68 61 72 2a 29 3b 0a 20 20 75 6e 73 69 67 6e 65  har*);.  unsigne
1a4e0 64 20 63 68 61 72 20 64 69 67 65 73 74 5b 31 36  d char digest[16
1a4f0 5d 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31  ];.  char zBuf[1
1a500 30 32 34 30 5d 3b 0a 0a 20 20 69 66 28 20 61 72  0240];..  if( ar
1a510 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=2 ){.    Tcl
1a520 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1a530 74 65 72 70 2c 22 77 72 6f 6e 67 20 23 20 61 72  terp,"wrong # ar
1a540 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1a550 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20  ", argv[0], .   
1a560 20 20 20 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c       " FILENAME\
1a570 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  "", 0);.    retu
1a580 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1a590 7d 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 61  }.  in = fopen(a
1a5a0 72 67 76 5b 31 5d 2c 22 72 62 22 29 3b 0a 20 20  rgv[1],"rb");.  
1a5b0 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20  if( in==0 ){.   
1a5c0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1a5d0 74 28 69 6e 74 65 72 70 2c 22 75 6e 61 62 6c 65  t(interp,"unable
1a5e0 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65 20 5c 22   to open file \"
1a5f0 22 2c 20 61 72 67 76 5b 31 5d 2c 20 0a 20 20 20  ", argv[1], .   
1a600 20 20 20 20 20 20 22 5c 22 20 66 6f 72 20 72 65        "\" for re
1a610 61 64 69 6e 67 22 2c 20 30 29 3b 0a 20 20 20 20  ading", 0);.    
1a620 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1a630 3b 0a 20 20 7d 0a 20 20 4d 44 35 49 6e 69 74 28  ;.  }.  MD5Init(
1a640 26 63 74 78 29 3b 0a 20 20 66 6f 72 28 3b 3b 29  &ctx);.  for(;;)
1a650 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  {.    int n;.   
1a660 20 6e 20 3d 20 28 69 6e 74 29 66 72 65 61 64 28   n = (int)fread(
1a670 7a 42 75 66 2c 20 31 2c 20 73 69 7a 65 6f 66 28  zBuf, 1, sizeof(
1a680 7a 42 75 66 29 2c 20 69 6e 29 3b 0a 20 20 20 20  zBuf), in);.    
1a690 69 66 28 20 6e 3c 3d 30 20 29 20 62 72 65 61 6b  if( n<=0 ) break
1a6a0 3b 0a 20 20 20 20 4d 44 35 55 70 64 61 74 65 28  ;.    MD5Update(
1a6b0 26 63 74 78 2c 20 28 75 6e 73 69 67 6e 65 64 20  &ctx, (unsigned 
1a6c0 63 68 61 72 2a 29 7a 42 75 66 2c 20 28 75 6e 73  char*)zBuf, (uns
1a6d0 69 67 6e 65 64 29 6e 29 3b 0a 20 20 7d 0a 20 20  igned)n);.  }.  
1a6e0 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 4d 44  fclose(in);.  MD
1a6f0 35 46 69 6e 61 6c 28 64 69 67 65 73 74 2c 20 26  5Final(digest, &
1a700 63 74 78 29 3b 0a 20 20 63 6f 6e 76 65 72 74 65  ctx);.  converte
1a710 72 20 3d 20 28 76 6f 69 64 28 2a 29 28 75 6e 73  r = (void(*)(uns
1a720 69 67 6e 65 64 20 63 68 61 72 2a 2c 63 68 61 72  igned char*,char
1a730 2a 29 29 63 64 3b 0a 20 20 63 6f 6e 76 65 72 74  *))cd;.  convert
1a740 65 72 28 64 69 67 65 73 74 2c 20 7a 42 75 66 29  er(digest, zBuf)
1a750 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
1a760 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
1a770 66 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  f, (char*)0);.  
1a780 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1a790 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
1a7a0 20 74 68 65 20 66 6f 75 72 20 6e 65 77 20 54 43   the four new TC
1a7b0 4c 20 63 6f 6d 6d 61 6e 64 73 20 66 6f 72 20 67  L commands for g
1a7c0 65 6e 65 72 61 74 69 6e 67 20 4d 44 35 20 63 68  enerating MD5 ch
1a7d0 65 63 6b 73 75 6d 73 0a 2a 2a 20 77 69 74 68 20  ecksums.** with 
1a7e0 74 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  the TCL interpre
1a7f0 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 4d 64 35 5f  ter..*/.int Md5_
1a800 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
1a810 2a 69 6e 74 65 72 70 29 7b 0a 20 20 54 63 6c 5f  *interp){.  Tcl_
1a820 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e  CreateCommand(in
1a830 74 65 72 70 2c 20 22 6d 64 35 22 2c 20 28 54 63  terp, "md5", (Tc
1a840 6c 5f 43 6d 64 50 72 6f 63 2a 29 6d 64 35 5f 63  l_CmdProc*)md5_c
1a850 6d 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  md,.            
1a860 20 20 20 20 20 20 20 20 4d 44 35 44 69 67 65 73          MD5Diges
1a870 74 54 6f 42 61 73 65 31 36 2c 20 30 29 3b 0a 20  tToBase16, 0);. 
1a880 20 54 63 6c 5f 43 72 65 61 74 65 43 6f 6d 6d 61   Tcl_CreateComma
1a890 6e 64 28 69 6e 74 65 72 70 2c 20 22 6d 64 35 2d  nd(interp, "md5-
1a8a0 31 30 78 38 22 2c 20 28 54 63 6c 5f 43 6d 64 50  10x8", (Tcl_CmdP
1a8b0 72 6f 63 2a 29 6d 64 35 5f 63 6d 64 2c 0a 20 20  roc*)md5_cmd,.  
1a8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8d0 20 20 4d 44 35 44 69 67 65 73 74 54 6f 42 61 73    MD5DigestToBas
1a8e0 65 31 30 78 38 2c 20 30 29 3b 0a 20 20 54 63 6c  e10x8, 0);.  Tcl
1a8f0 5f 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69  _CreateCommand(i
1a900 6e 74 65 72 70 2c 20 22 6d 64 35 66 69 6c 65 22  nterp, "md5file"
1a910 2c 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29  , (Tcl_CmdProc*)
1a920 6d 64 35 66 69 6c 65 5f 63 6d 64 2c 0a 20 20 20  md5file_cmd,.   
1a930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a940 20 4d 44 35 44 69 67 65 73 74 54 6f 42 61 73 65   MD5DigestToBase
1a950 31 36 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72  16, 0);.  Tcl_Cr
1a960 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eateCommand(inte
1a970 72 70 2c 20 22 6d 64 35 66 69 6c 65 2d 31 30 78  rp, "md5file-10x
1a980 38 22 2c 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63  8", (Tcl_CmdProc
1a990 2a 29 6d 64 35 66 69 6c 65 5f 63 6d 64 2c 0a 20  *)md5file_cmd,. 
1a9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a9b0 20 20 20 4d 44 35 44 69 67 65 73 74 54 6f 42 61     MD5DigestToBa
1a9c0 73 65 31 30 78 38 2c 20 30 29 3b 0a 20 20 72 65  se10x8, 0);.  re
1a9d0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23  turn TCL_OK;.}.#
1a9e0 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
1a9f0 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c  (SQLITE_TEST) ||
1aa00 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1aa10 54 43 4c 4d 44 35 29 20 2a 2f 0a 0a 23 69 66 20  TCLMD5) */..#if 
1aa20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
1aa30 45 53 54 29 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e  EST)./*.** Durin
1aa40 67 20 74 65 73 74 69 6e 67 2c 20 74 68 65 20 73  g testing, the s
1aa50 70 65 63 69 61 6c 20 6d 64 35 73 75 6d 28 29 20  pecial md5sum() 
1aa60 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
1aa70 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e  on is available.
1aa80 0a 2a 2a 20 69 6e 73 69 64 65 20 53 51 4c 69 74  .** inside SQLit
1aa90 65 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  e.  The followin
1aaa0 67 20 72 6f 75 74 69 6e 65 73 20 69 6d 70 6c 65  g routines imple
1aab0 6d 65 6e 74 20 74 68 61 74 20 66 75 6e 63 74 69  ment that functi
1aac0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
1aad0 69 64 20 6d 64 35 73 74 65 70 28 73 71 6c 69 74  id md5step(sqlit
1aae0 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
1aaf0 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
1ab00 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
1ab10 72 67 76 29 7b 0a 20 20 4d 44 35 43 6f 6e 74 65  rgv){.  MD5Conte
1ab20 78 74 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  xt *p;.  int i;.
1ab30 20 20 69 66 28 20 61 72 67 63 3c 31 20 29 20 72    if( argc<1 ) r
1ab40 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20 73 71 6c  eturn;.  p = sql
1ab50 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
1ab60 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  ontext(context, 
1ab70 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69  sizeof(*p));.  i
1ab80 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
1ab90 3b 0a 20 20 69 66 28 20 21 70 2d 3e 69 73 49 6e  ;.  if( !p->isIn
1aba0 69 74 20 29 7b 0a 20 20 20 20 4d 44 35 49 6e 69  it ){.    MD5Ini
1abb0 74 28 70 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  t(p);.  }.  for(
1abc0 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b  i=0; i<argc; i++
1abd0 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
1abe0 72 20 2a 7a 44 61 74 61 20 3d 20 28 63 68 61 72  r *zData = (char
1abf0 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
1ac00 74 65 78 74 28 61 72 67 76 5b 69 5d 29 3b 0a 20  text(argv[i]);. 
1ac10 20 20 20 69 66 28 20 7a 44 61 74 61 20 29 7b 0a     if( zData ){.
1ac20 20 20 20 20 20 20 4d 44 35 55 70 64 61 74 65 28        MD5Update(
1ac30 70 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  p, (unsigned cha
1ac40 72 2a 29 7a 44 61 74 61 2c 20 28 69 6e 74 29 73  r*)zData, (int)s
1ac50 74 72 6c 65 6e 28 7a 44 61 74 61 29 29 3b 0a 20  trlen(zData));. 
1ac60 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69     }.  }.}.stati
1ac70 63 20 76 6f 69 64 20 6d 64 35 66 69 6e 61 6c 69  c void md5finali
1ac80 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  ze(sqlite3_conte
1ac90 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20  xt *context){.  
1aca0 4d 44 35 43 6f 6e 74 65 78 74 20 2a 70 3b 0a 20  MD5Context *p;. 
1acb0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64   unsigned char d
1acc0 69 67 65 73 74 5b 31 36 5d 3b 0a 20 20 63 68 61  igest[16];.  cha
1acd0 72 20 7a 42 75 66 5b 33 33 5d 3b 0a 20 20 70 20  r zBuf[33];.  p 
1ace0 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  = sqlite3_aggreg
1acf0 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74  ate_context(cont
1ad00 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  ext, sizeof(*p))
1ad10 3b 0a 20 20 4d 44 35 46 69 6e 61 6c 28 64 69 67  ;.  MD5Final(dig
1ad20 65 73 74 2c 70 29 3b 0a 20 20 4d 44 35 44 69 67  est,p);.  MD5Dig
1ad30 65 73 74 54 6f 42 61 73 65 31 36 28 64 69 67 65  estToBase16(dige
1ad40 73 74 2c 20 7a 42 75 66 29 3b 0a 20 20 73 71 6c  st, zBuf);.  sql
1ad50 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
1ad60 28 63 6f 6e 74 65 78 74 2c 20 7a 42 75 66 2c 20  (context, zBuf, 
1ad70 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  -1, SQLITE_TRANS
1ad80 49 45 4e 54 29 3b 0a 7d 0a 69 6e 74 20 4d 64 35  IENT);.}.int Md5
1ad90 5f 52 65 67 69 73 74 65 72 28 73 71 6c 69 74 65  _Register(sqlite
1ada0 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 72 63  3 *db){.  int rc
1adb0 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
1adc0 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22  e_function(db, "
1add0 6d 64 35 73 75 6d 22 2c 20 2d 31 2c 20 53 51 4c  md5sum", -1, SQL
1ade0 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c 20  ITE_UTF8, 0, 0, 
1adf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ae00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae10 20 20 6d 64 35 73 74 65 70 2c 20 6d 64 35 66 69    md5step, md5fi
1ae20 6e 61 6c 69 7a 65 29 3b 0a 20 20 73 71 6c 69 74  nalize);.  sqlit
1ae30 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63  e3_overload_func
1ae40 74 69 6f 6e 28 64 62 2c 20 22 6d 64 35 73 75 6d  tion(db, "md5sum
1ae50 22 2c 20 2d 31 29 3b 20 20 2f 2a 20 54 6f 20 65  ", -1);  /* To e
1ae60 78 65 72 63 69 73 65 20 74 68 69 73 20 41 50 49  xercise this API
1ae70 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   */.  return rc;
1ae80 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  .}.#endif /* def
1ae90 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
1aea0 29 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  ) */.../*.** If 
1aeb0 74 68 65 20 6d 61 63 72 6f 20 54 43 4c 53 48 20  the macro TCLSH 
1aec0 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 70 75 74  is one, then put
1aed0 20 69 6e 20 63 6f 64 65 20 74 68 69 73 20 66 6f   in code this fo
1aee0 72 20 74 68 65 0a 2a 2a 20 22 6d 61 69 6e 22 20  r the.** "main" 
1aef0 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c  routine that wil
1af00 6c 20 69 6e 69 74 69 61 6c 69 7a 65 20 54 63 6c  l initialize Tcl
1af10 20 61 6e 64 20 74 61 6b 65 20 69 6e 70 75 74 20   and take input 
1af20 66 72 6f 6d 0a 2a 2a 20 73 74 61 6e 64 61 72 64  from.** standard
1af30 20 69 6e 70 75 74 2c 20 6f 72 20 69 66 20 61 20   input, or if a 
1af40 66 69 6c 65 20 69 73 20 6e 61 6d 65 64 20 6f 6e  file is named on
1af50 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e   the command lin
1af60 65 0a 2a 2a 20 74 68 65 20 54 43 4c 20 69 6e 74  e.** the TCL int
1af70 65 72 70 72 65 74 65 72 20 72 65 61 64 73 20 61  erpreter reads a
1af80 6e 64 20 65 76 61 6c 75 61 74 65 73 20 74 68 61  nd evaluates tha
1af90 74 20 66 69 6c 65 2e 0a 2a 2f 0a 23 69 66 20 54  t file..*/.#if T
1afa0 43 4c 53 48 3d 3d 31 0a 73 74 61 74 69 63 20 63  CLSH==1.static c
1afb0 6f 6e 73 74 20 63 68 61 72 20 2a 74 63 6c 73 68  onst char *tclsh
1afc0 5f 6d 61 69 6e 5f 6c 6f 6f 70 28 76 6f 69 64 29  _main_loop(void)
1afd0 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
1afe0 20 63 68 61 72 20 7a 4d 61 69 6e 6c 6f 6f 70 5b   char zMainloop[
1aff0 5d 20 3d 0a 20 20 20 20 22 73 65 74 20 6c 69 6e  ] =.    "set lin
1b000 65 20 7b 7d 5c 6e 22 0a 20 20 20 20 22 77 68 69  e {}\n".    "whi
1b010 6c 65 20 7b 21 5b 65 6f 66 20 73 74 64 69 6e 5d  le {![eof stdin]
1b020 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 69 66  } {\n".      "if
1b030 20 7b 24 6c 69 6e 65 21 3d 5c 22 5c 22 7d 20 7b   {$line!=\"\"} {
1b040 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 70 75 74  \n".        "put
1b050 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22 3e  s -nonewline \">
1b060 20 5c 22 5c 6e 22 0a 20 20 20 20 20 20 22 7d 20   \"\n".      "} 
1b070 65 6c 73 65 20 7b 5c 6e 22 0a 20 20 20 20 20 20  else {\n".      
1b080 20 20 22 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69    "puts -nonewli
1b090 6e 65 20 5c 22 25 20 5c 22 5c 6e 22 0a 20 20 20  ne \"% \"\n".   
1b0a0 20 20 20 22 7d 5c 6e 22 0a 20 20 20 20 20 20 22     "}\n".      "
1b0b0 66 6c 75 73 68 20 73 74 64 6f 75 74 5c 6e 22 0a  flush stdout\n".
1b0c0 20 20 20 20 20 20 22 61 70 70 65 6e 64 20 6c 69        "append li
1b0d0 6e 65 20 5b 67 65 74 73 20 73 74 64 69 6e 5d 5c  ne [gets stdin]\
1b0e0 6e 22 0a 20 20 20 20 20 20 22 69 66 20 7b 5b 69  n".      "if {[i
1b0f0 6e 66 6f 20 63 6f 6d 70 6c 65 74 65 20 24 6c 69  nfo complete $li
1b100 6e 65 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20  ne]} {\n".      
1b110 20 20 22 69 66 20 7b 5b 63 61 74 63 68 20 7b 75    "if {[catch {u
1b120 70 6c 65 76 65 6c 20 23 30 20 24 6c 69 6e 65 7d  plevel #0 $line}
1b130 20 72 65 73 75 6c 74 5d 7d 20 7b 5c 6e 22 0a 20   result]} {\n". 
1b140 20 20 20 20 20 20 20 20 20 22 70 75 74 73 20 73           "puts s
1b150 74 64 65 72 72 20 5c 22 45 72 72 6f 72 3a 20 24  tderr \"Error: $
1b160 72 65 73 75 6c 74 5c 22 5c 6e 22 0a 20 20 20 20  result\"\n".    
1b170 20 20 20 20 22 7d 20 65 6c 73 65 69 66 20 7b 24      "} elseif {$
1b180 72 65 73 75 6c 74 21 3d 5c 22 5c 22 7d 20 7b 5c  result!=\"\"} {\
1b190 6e 22 0a 20 20 20 20 20 20 20 20 20 20 22 70 75  n".          "pu
1b1a0 74 73 20 24 72 65 73 75 6c 74 5c 6e 22 0a 20 20  ts $result\n".  
1b1b0 20 20 20 20 20 20 22 7d 5c 6e 22 0a 20 20 20 20        "}\n".    
1b1c0 20 20 20 20 22 73 65 74 20 6c 69 6e 65 20 7b 7d      "set line {}
1b1d0 5c 6e 22 0a 20 20 20 20 20 20 22 7d 20 65 6c 73  \n".      "} els
1b1e0 65 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20 22  e {\n".        "
1b1f0 61 70 70 65 6e 64 20 6c 69 6e 65 20 5c 5c 6e 5c  append line \\n\
1b200 6e 22 0a 20 20 20 20 20 20 22 7d 5c 6e 22 0a 20  n".      "}\n". 
1b210 20 20 20 22 7d 5c 6e 22 0a 20 20 3b 0a 20 20 72     "}\n".  ;.  r
1b220 65 74 75 72 6e 20 7a 4d 61 69 6e 6c 6f 6f 70 3b  eturn zMainloop;
1b230 0a 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 54 43  .}.#endif.#if TC
1b240 4c 53 48 3d 3d 32 0a 73 74 61 74 69 63 20 63 6f  LSH==2.static co
1b250 6e 73 74 20 63 68 61 72 20 2a 74 63 6c 73 68 5f  nst char *tclsh_
1b260 6d 61 69 6e 5f 6c 6f 6f 70 28 76 6f 69 64 29 3b  main_loop(void);
1b270 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
1b280 53 51 4c 49 54 45 5f 54 45 53 54 0a 73 74 61 74  SQLITE_TEST.stat
1b290 69 63 20 76 6f 69 64 20 69 6e 69 74 5f 61 6c 6c  ic void init_all
1b2a0 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29 3b 0a  (Tcl_Interp *);.
1b2b0 73 74 61 74 69 63 20 69 6e 74 20 69 6e 69 74 5f  static int init_
1b2c0 61 6c 6c 5f 63 6d 64 28 0a 20 20 43 6c 69 65 6e  all_cmd(.  Clien
1b2d0 74 44 61 74 61 20 63 64 2c 0a 20 20 54 63 6c 5f  tData cd,.  Tcl_
1b2e0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1b2f0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1b300 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1b310 76 5b 5d 0a 29 7b 0a 0a 20 20 54 63 6c 5f 49 6e  v[].){..  Tcl_In
1b320 74 65 72 70 20 2a 73 6c 61 76 65 3b 0a 20 20 69  terp *slave;.  i
1b330 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
1b340 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
1b350 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
1b360 6a 76 2c 20 22 53 4c 41 56 45 22 29 3b 0a 20 20  jv, "SLAVE");.  
1b370 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1b380 4f 52 3b 0a 20 20 7d 0a 0a 20 20 73 6c 61 76 65  OR;.  }..  slave
1b390 20 3d 20 54 63 6c 5f 47 65 74 53 6c 61 76 65 28   = Tcl_GetSlave(
1b3a0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
1b3b0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 29 3b  tring(objv[1]));
1b3c0 0a 20 20 69 66 28 20 21 73 6c 61 76 65 20 29 7b  .  if( !slave ){
1b3d0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1b3e0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 6e  ERROR;.  }..  in
1b3f0 69 74 5f 61 6c 6c 28 73 6c 61 76 65 29 3b 0a 20  it_all(slave);. 
1b400 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1b410 7d 0a 0a 2f 2a 0a 2a 2a 20 54 63 6c 63 6d 64 3a  }../*.** Tclcmd:
1b420 20 64 62 5f 75 73 65 5f 6c 65 67 61 63 79 5f 70   db_use_legacy_p
1b430 72 65 70 61 72 65 20 44 42 20 42 4f 4f 4c 45 41  repare DB BOOLEA
1b440 4e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66 69  N.**.**   The fi
1b450 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
1b460 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 6d 75 73  this command mus
1b470 74 20 62 65 20 61 20 64 61 74 61 62 61 73 65 20  t be a database 
1b480 63 6f 6d 6d 61 6e 64 20 63 72 65 61 74 65 64 20  command created 
1b490 62 79 0a 2a 2a 20 20 20 5b 73 71 6c 69 74 65 33  by.**   [sqlite3
1b4a0 5d 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  ]. If the second
1b4b0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75   argument is tru
1b4c0 65 2c 20 74 68 65 6e 20 74 68 65 20 68 61 6e 64  e, then the hand
1b4d0 6c 65 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64  le is configured
1b4e0 0a 2a 2a 20 20 20 74 6f 20 75 73 65 20 74 68 65  .**   to use the
1b4f0 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
1b500 5f 76 32 28 29 20 66 75 6e 63 74 69 6f 6e 20 74  _v2() function t
1b510 6f 20 70 72 65 70 61 72 65 20 73 74 61 74 65 6d  o prepare statem
1b520 65 6e 74 73 2e 20 49 66 20 69 74 0a 2a 2a 20 20  ents. If it.**  
1b530 20 69 73 20 66 61 6c 73 65 2c 20 73 71 6c 69 74   is false, sqlit
1b540 65 33 5f 70 72 65 70 61 72 65 28 29 2e 0a 2a 2f  e3_prepare()..*/
1b550 0a 73 74 61 74 69 63 20 69 6e 74 20 64 62 5f 75  .static int db_u
1b560 73 65 5f 6c 65 67 61 63 79 5f 70 72 65 70 61 72  se_legacy_prepar
1b570 65 5f 63 6d 64 28 0a 20 20 43 6c 69 65 6e 74 44  e_cmd(.  ClientD
1b580 61 74 61 20 63 64 2c 0a 20 20 54 63 6c 5f 49 6e  ata cd,.  Tcl_In
1b590 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1b5a0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1b5b0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1b5c0 5d 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e  ].){.  Tcl_CmdIn
1b5d0 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 53 71  fo cmdInfo;.  Sq
1b5e0 6c 69 74 65 44 62 20 2a 70 44 62 3b 0a 20 20 69  liteDb *pDb;.  i
1b5f0 6e 74 20 62 50 72 65 70 61 72 65 3b 0a 0a 20 20  nt bPrepare;..  
1b600 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
1b610 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
1b620 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
1b630 62 6a 76 2c 20 22 44 42 20 42 4f 4f 4c 45 41 4e  bjv, "DB BOOLEAN
1b640 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
1b650 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
1b660 20 69 66 28 20 21 54 63 6c 5f 47 65 74 43 6f 6d   if( !Tcl_GetCom
1b670 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c  mandInfo(interp,
1b680 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1b690 62 6a 76 5b 31 5d 29 2c 20 26 63 6d 64 49 6e 66  bjv[1]), &cmdInf
1b6a0 6f 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  o) ){.    Tcl_Ap
1b6b0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1b6c0 70 2c 20 22 6e 6f 20 73 75 63 68 20 64 62 3a 20  p, "no such db: 
1b6d0 22 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  ", Tcl_GetString
1b6e0 28 6f 62 6a 76 5b 31 5d 29 2c 20 28 63 68 61 72  (objv[1]), (char
1b6f0 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  *)0);.    return
1b700 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1b710 20 20 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44    pDb = (SqliteD
1b720 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c  b*)cmdInfo.objCl
1b730 69 65 6e 74 44 61 74 61 3b 0a 20 20 69 66 28 20  ientData;.  if( 
1b740 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
1b750 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
1b760 6a 76 5b 32 5d 2c 20 26 62 50 72 65 70 61 72 65  jv[2], &bPrepare
1b770 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1b780 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
1b790 20 20 70 44 62 2d 3e 62 4c 65 67 61 63 79 50 72    pDb->bLegacyPr
1b7a0 65 70 61 72 65 20 3d 20 62 50 72 65 70 61 72 65  epare = bPrepare
1b7b0 3b 0a 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65  ;..  Tcl_ResetRe
1b7c0 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
1b7d0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1b7e0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
1b7f0 6f 6e 66 69 67 75 72 65 20 74 68 65 20 69 6e 74  onfigure the int
1b800 65 72 70 72 65 74 65 72 20 70 61 73 73 65 64 20  erpreter passed 
1b810 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
1b820 75 6d 65 6e 74 20 74 6f 20 68 61 76 65 20 61 63  ument to have ac
1b830 63 65 73 73 0a 2a 2a 20 74 6f 20 74 68 65 20 63  cess.** to the c
1b840 6f 6d 6d 61 6e 64 73 20 61 6e 64 20 6c 69 6e 6b  ommands and link
1b850 65 64 20 76 61 72 69 61 62 6c 65 73 20 74 68 61  ed variables tha
1b860 74 20 6d 61 6b 65 20 75 70 3a 0a 2a 2a 0a 2a 2a  t make up:.**.**
1b870 20 20 20 2a 20 74 68 65 20 5b 73 71 6c 69 74 65     * the [sqlite
1b880 33 5d 20 65 78 74 65 6e 73 69 6f 6e 20 69 74 73  3] extension its
1b890 65 6c 66 2c 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  elf, .**.**   * 
1b8a0 49 66 20 53 51 4c 49 54 45 5f 54 43 4c 4d 44 35  If SQLITE_TCLMD5
1b8b0 20 6f 72 20 53 51 4c 49 54 45 5f 54 45 53 54 20   or SQLITE_TEST 
1b8c0 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65 20  is defined, the 
1b8d0 4d 64 35 20 63 6f 6d 6d 61 6e 64 73 2c 20 61 6e  Md5 commands, an
1b8e0 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 53  d.**.**   * If S
1b8f0 51 4c 49 54 45 5f 54 45 53 54 20 69 73 20 73 65  QLITE_TEST is se
1b900 74 2c 20 74 68 65 20 76 61 72 69 6f 75 73 20 74  t, the various t
1b910 65 73 74 20 69 6e 74 65 72 66 61 63 65 73 20 75  est interfaces u
1b920 73 65 64 20 62 79 20 74 68 65 20 54 63 6c 0a 2a  sed by the Tcl.*
1b930 2a 20 20 20 20 20 74 65 73 74 20 73 75 69 74 65  *     test suite
1b940 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1b950 20 69 6e 69 74 5f 61 6c 6c 28 54 63 6c 5f 49 6e   init_all(Tcl_In
1b960 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20  terp *interp){. 
1b970 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e   Sqlite3_Init(in
1b980 74 65 72 70 29 3b 0a 0a 23 69 66 20 64 65 66 69  terp);..#if defi
1b990 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
1b9a0 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
1b9b0 54 45 5f 54 43 4c 4d 44 35 29 0a 20 20 4d 64 35  TE_TCLMD5).  Md5
1b9c0 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 23  _Init(interp);.#
1b9d0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 6e 73 74  endif..  /* Inst
1b9e0 61 6c 6c 20 74 68 65 20 5b 72 65 67 69 73 74 65  all the [registe
1b9f0 72 5f 64 62 73 74 61 74 5f 76 74 61 62 5d 20 63  r_dbstat_vtab] c
1ba00 6f 6d 6d 61 6e 64 20 74 6f 20 61 63 63 65 73 73  ommand to access
1ba10 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
1ba20 69 6f 6e 0a 20 20 2a 2a 20 6f 66 20 76 69 72 74  ion.  ** of virt
1ba30 75 61 6c 20 74 61 62 6c 65 20 64 62 73 74 61 74  ual table dbstat
1ba40 20 28 73 6f 75 72 63 65 20 66 69 6c 65 20 74 65   (source file te
1ba50 73 74 5f 73 74 61 74 2e 63 29 2e 20 54 68 69 73  st_stat.c). This
1ba60 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 20 20 2a 2a   command is.  **
1ba70 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 74 65   required for te
1ba80 73 74 66 69 78 74 75 72 65 20 61 6e 64 20 73 71  stfixture and sq
1ba90 6c 69 74 65 33 5f 61 6e 61 6c 79 7a 65 72 2c 20  lite3_analyzer, 
1baa0 62 75 74 20 6e 6f 74 20 62 79 20 74 68 65 20 70  but not by the p
1bab0 72 6f 64 75 63 74 69 6f 6e 0a 20 20 2a 2a 20 54  roduction.  ** T
1bac0 63 6c 20 65 78 74 65 6e 73 69 6f 6e 2e 20 20 2a  cl extension.  *
1bad0 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
1bae0 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 54 43  LITE_TEST) || TC
1baf0 4c 53 48 3d 3d 32 0a 20 20 7b 0a 20 20 20 20 65  LSH==2.  {.    e
1bb00 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1bb10 74 65 73 74 53 74 61 74 5f 49 6e 69 74 28 54 63  testStat_Init(Tc
1bb20 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1bb30 53 71 6c 69 74 65 74 65 73 74 53 74 61 74 5f 49  SqlitetestStat_I
1bb40 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 7d  nit(interp);.  }
1bb50 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
1bb60 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 7b 0a  SQLITE_TEST.  {.
1bb70 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1bb80 71 6c 69 74 65 63 6f 6e 66 69 67 5f 49 6e 69 74  qliteconfig_Init
1bb90 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1bba0 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1bbb0 6c 69 74 65 74 65 73 74 31 5f 49 6e 69 74 28 54  litetest1_Init(T
1bbc0 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1bbd0 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1bbe0 74 65 74 65 73 74 32 5f 49 6e 69 74 28 54 63 6c  tetest2_Init(Tcl
1bbf0 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1bc00 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1bc10 74 65 73 74 33 5f 49 6e 69 74 28 54 63 6c 5f 49  test3_Init(Tcl_I
1bc20 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1bc30 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1bc40 73 74 34 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  st4_Init(Tcl_Int
1bc50 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1bc60 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1bc70 35 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  5_Init(Tcl_Inter
1bc80 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1bc90 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 36 5f  int Sqlitetest6_
1bca0 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1bcb0 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1bcc0 74 20 53 71 6c 69 74 65 74 65 73 74 37 5f 49 6e  t Sqlitetest7_In
1bcd0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1bce0 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1bcf0 53 71 6c 69 74 65 74 65 73 74 38 5f 49 6e 69 74  Sqlitetest8_Init
1bd00 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1bd10 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1bd20 6c 69 74 65 74 65 73 74 39 5f 49 6e 69 74 28 54  litetest9_Init(T
1bd30 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1bd40 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1bd50 74 65 74 65 73 74 61 73 79 6e 63 5f 49 6e 69 74  tetestasync_Init
1bd60 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1bd70 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1bd80 6c 69 74 65 74 65 73 74 5f 61 75 74 6f 65 78 74  litetest_autoext
1bd90 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1bda0 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1bdb0 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f 64 65  nt Sqlitetest_de
1bdc0 6d 6f 76 66 73 5f 49 6e 69 74 28 54 63 6c 5f 49  movfs_Init(Tcl_I
1bdd0 6e 74 65 72 70 20 2a 29 3b 0a 20 20 20 20 65 78  nterp *);.    ex
1bde0 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1bdf0 65 73 74 5f 66 75 6e 63 5f 49 6e 69 74 28 54 63  est_func_Init(Tc
1be00 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1be10 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1be20 65 74 65 73 74 5f 68 65 78 69 6f 5f 49 6e 69 74  etest_hexio_Init
1be30 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1be40 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1be50 6c 69 74 65 74 65 73 74 5f 69 6e 69 74 5f 49 6e  litetest_init_In
1be60 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1be70 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1be80 53 71 6c 69 74 65 74 65 73 74 5f 6d 61 6c 6c 6f  Sqlitetest_mallo
1be90 63 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  c_Init(Tcl_Inter
1bea0 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1beb0 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f 6d  int Sqlitetest_m
1bec0 75 74 65 78 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  utex_Init(Tcl_In
1bed0 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1bee0 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1bef0 74 73 63 68 65 6d 61 5f 49 6e 69 74 28 54 63 6c  tschema_Init(Tcl
1bf00 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1bf10 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1bf20 74 65 73 74 73 73 65 5f 49 6e 69 74 28 54 63 6c  testsse_Init(Tcl
1bf30 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1bf40 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1bf50 74 65 73 74 74 63 6c 76 61 72 5f 49 6e 69 74 28  testtclvar_Init(
1bf60 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1bf70 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1bf80 69 74 65 74 65 73 74 66 73 5f 49 6e 69 74 28 54  itetestfs_Init(T
1bf90 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1bfa0 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1bfb0 74 65 74 65 73 74 54 68 72 65 61 64 5f 49 6e 69  tetestThread_Ini
1bfc0 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1bfd0 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1bfe0 71 6c 69 74 65 74 65 73 74 4f 6e 65 66 69 6c 65  qlitetestOnefile
1bff0 5f 49 6e 69 74 28 29 3b 0a 20 20 20 20 65 78 74  _Init();.    ext
1c000 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1c010 73 74 4f 73 69 6e 73 74 5f 49 6e 69 74 28 54 63  stOsinst_Init(Tc
1c020 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1c030 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1c040 65 74 65 73 74 62 61 63 6b 75 70 5f 49 6e 69 74  etestbackup_Init
1c050 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1c060 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1c070 6c 69 74 65 74 65 73 74 69 6e 74 61 72 72 61 79  litetestintarray
1c080 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1c090 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1c0a0 6e 74 20 53 71 6c 69 74 65 74 65 73 74 76 66 73  nt Sqlitetestvfs
1c0b0 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1c0c0 20 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20   *);.    extern 
1c0d0 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 72 74  int Sqlitetestrt
1c0e0 72 65 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  ree_Init(Tcl_Int
1c0f0 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1c100 6e 20 69 6e 74 20 53 71 6c 69 74 65 71 75 6f 74  n int Sqlitequot
1c110 61 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  a_Init(Tcl_Inter
1c120 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1c130 69 6e 74 20 53 71 6c 69 74 65 6d 75 6c 74 69 70  int Sqlitemultip
1c140 6c 65 78 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  lex_Init(Tcl_Int
1c150 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1c160 6e 20 69 6e 74 20 53 71 6c 69 74 65 53 75 70 65  n int SqliteSupe
1c170 72 6c 6f 63 6b 5f 49 6e 69 74 28 54 63 6c 5f 49  rlock_Init(Tcl_I
1c180 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1c190 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1c1a0 73 74 53 79 73 63 61 6c 6c 5f 49 6e 69 74 28 54  stSyscall_Init(T
1c1b0 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 0a 23 69  cl_Interp*);..#i
1c1c0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1c1d0 5f 45 4e 41 42 4c 45 5f 46 54 53 33 29 20 7c 7c  _ENABLE_FTS3) ||
1c1e0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1c1f0 45 4e 41 42 4c 45 5f 46 54 53 34 29 0a 20 20 20  ENABLE_FTS4).   
1c200 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1c210 74 65 74 65 73 74 66 74 73 33 5f 49 6e 69 74 28  tetestfts3_Init(
1c220 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1c230 72 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  rp);.#endif..#if
1c240 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1c250 45 5f 5a 49 50 56 46 53 0a 20 20 20 20 65 78 74  E_ZIPVFS.    ext
1c260 65 72 6e 20 69 6e 74 20 5a 69 70 76 66 73 5f 49  ern int Zipvfs_I
1c270 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1c280 3b 0a 20 20 20 20 5a 69 70 76 66 73 5f 49 6e 69  ;.    Zipvfs_Ini
1c290 74 28 69 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69  t(interp);.#endi
1c2a0 66 0a 0a 20 20 20 20 53 71 6c 69 74 65 63 6f 6e  f..    Sqlitecon
1c2b0 66 69 67 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  fig_Init(interp)
1c2c0 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1c2d0 31 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  1_Init(interp);.
1c2e0 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 32 5f      Sqlitetest2_
1c2f0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
1c300 20 20 53 71 6c 69 74 65 74 65 73 74 33 5f 49 6e    Sqlitetest3_In
1c310 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1c320 53 71 6c 69 74 65 74 65 73 74 34 5f 49 6e 69 74  Sqlitetest4_Init
1c330 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1c340 6c 69 74 65 74 65 73 74 35 5f 49 6e 69 74 28 69  litetest5_Init(i
1c350 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1c360 74 65 74 65 73 74 36 5f 49 6e 69 74 28 69 6e 74  tetest6_Init(int
1c370 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1c380 74 65 73 74 37 5f 49 6e 69 74 28 69 6e 74 65 72  test7_Init(inter
1c390 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
1c3a0 73 74 38 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  st8_Init(interp)
1c3b0 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1c3c0 39 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  9_Init(interp);.
1c3d0 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 61 73      Sqlitetestas
1c3e0 79 6e 63 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  ync_Init(interp)
1c3f0 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1c400 5f 61 75 74 6f 65 78 74 5f 49 6e 69 74 28 69 6e  _autoext_Init(in
1c410 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
1c420 65 74 65 73 74 5f 64 65 6d 6f 76 66 73 5f 49 6e  etest_demovfs_In
1c430 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1c440 53 71 6c 69 74 65 74 65 73 74 5f 66 75 6e 63 5f  Sqlitetest_func_
1c450 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
1c460 20 20 53 71 6c 69 74 65 74 65 73 74 5f 68 65 78    Sqlitetest_hex
1c470 69 6f 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  io_Init(interp);
1c480 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f  .    Sqlitetest_
1c490 69 6e 69 74 5f 49 6e 69 74 28 69 6e 74 65 72 70  init_Init(interp
1c4a0 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1c4b0 74 5f 6d 61 6c 6c 6f 63 5f 49 6e 69 74 28 69 6e  t_malloc_Init(in
1c4c0 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
1c4d0 65 74 65 73 74 5f 6d 75 74 65 78 5f 49 6e 69 74  etest_mutex_Init
1c4e0 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1c4f0 6c 69 74 65 74 65 73 74 73 63 68 65 6d 61 5f 49  litetestschema_I
1c500 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1c510 20 53 71 6c 69 74 65 74 65 73 74 74 63 6c 76 61   Sqlitetesttclva
1c520 72 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  r_Init(interp);.
1c530 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 66 73      Sqlitetestfs
1c540 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1c550 20 20 20 53 71 6c 69 74 65 74 65 73 74 54 68 72     SqlitetestThr
1c560 65 61 64 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  ead_Init(interp)
1c570 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1c580 4f 6e 65 66 69 6c 65 5f 49 6e 69 74 28 69 6e 74  Onefile_Init(int
1c590 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1c5a0 74 65 73 74 4f 73 69 6e 73 74 5f 49 6e 69 74 28  testOsinst_Init(
1c5b0 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
1c5c0 69 74 65 74 65 73 74 62 61 63 6b 75 70 5f 49 6e  itetestbackup_In
1c5d0 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1c5e0 53 71 6c 69 74 65 74 65 73 74 69 6e 74 61 72 72  Sqlitetestintarr
1c5f0 61 79 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  ay_Init(interp);
1c600 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 76  .    Sqlitetestv
1c610 66 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  fs_Init(interp);
1c620 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 72  .    Sqlitetestr
1c630 74 72 65 65 5f 49 6e 69 74 28 69 6e 74 65 72 70  tree_Init(interp
1c640 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 71 75 6f  );.    Sqlitequo
1c650 74 61 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  ta_Init(interp);
1c660 0a 20 20 20 20 53 71 6c 69 74 65 6d 75 6c 74 69  .    Sqlitemulti
1c670 70 6c 65 78 5f 49 6e 69 74 28 69 6e 74 65 72 70  plex_Init(interp
1c680 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 53 75 70  );.    SqliteSup
1c690 65 72 6c 6f 63 6b 5f 49 6e 69 74 28 69 6e 74 65  erlock_Init(inte
1c6a0 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
1c6b0 65 73 74 53 79 73 63 61 6c 6c 5f 49 6e 69 74 28  estSyscall_Init(
1c6c0 69 6e 74 65 72 70 29 3b 0a 0a 23 69 66 20 64 65  interp);..#if de
1c6d0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
1c6e0 42 4c 45 5f 46 54 53 33 29 20 7c 7c 20 64 65 66  BLE_FTS3) || def
1c6f0 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
1c700 4c 45 5f 46 54 53 34 29 0a 20 20 20 20 53 71 6c  LE_FTS4).    Sql
1c710 69 74 65 74 65 73 74 66 74 73 33 5f 49 6e 69 74  itetestfts3_Init
1c720 28 69 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69 66  (interp);.#endif
1c730 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ..    Tcl_Create
1c740 4f 62 6a 43 6f 6d 6d 61 6e 64 28 0a 20 20 20 20  ObjCommand(.    
1c750 20 20 20 20 69 6e 74 65 72 70 2c 20 22 6c 6f 61      interp, "loa
1c760 64 5f 74 65 73 74 66 69 78 74 75 72 65 5f 65 78  d_testfixture_ex
1c770 74 65 6e 73 69 6f 6e 73 22 2c 20 69 6e 69 74 5f  tensions", init_
1c780 61 6c 6c 5f 63 6d 64 2c 20 30 2c 20 30 0a 20 20  all_cmd, 0, 0.  
1c790 20 20 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65    );.    Tcl_Cre
1c7a0 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 0a 20  ateObjCommand(. 
1c7b0 20 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20 22         interp, "
1c7c0 64 62 5f 75 73 65 5f 6c 65 67 61 63 79 5f 70 72  db_use_legacy_pr
1c7d0 65 70 61 72 65 22 2c 20 64 62 5f 75 73 65 5f 6c  epare", db_use_l
1c7e0 65 67 61 63 79 5f 70 72 65 70 61 72 65 5f 63 6d  egacy_prepare_cm
1c7f0 64 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 0a  d, 0, 0.    );..
1c800 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 53  #ifdef SQLITE_SS
1c810 45 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  E.    Sqlitetest
1c820 73 73 65 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  sse_Init(interp)
1c830 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e  ;.#endif.  }.#en
1c840 64 69 66 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 54  dif.}..#define T
1c850 43 4c 53 48 5f 4d 41 49 4e 20 6d 61 69 6e 20 20  CLSH_MAIN main  
1c860 20 2f 2a 20 4e 65 65 64 65 64 20 74 6f 20 66 61   /* Needed to fa
1c870 6b 65 20 6f 75 74 20 6d 6b 74 63 6c 61 70 70 20  ke out mktclapp 
1c880 2a 2f 0a 69 6e 74 20 54 43 4c 53 48 5f 4d 41 49  */.int TCLSH_MAI
1c890 4e 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72  N(int argc, char
1c8a0 20 2a 2a 61 72 67 76 29 7b 0a 20 20 54 63 6c 5f   **argv){.  Tcl_
1c8b0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a  Interp *interp;.
1c8c0 20 20 0a 20 20 2f 2a 20 43 61 6c 6c 20 73 71 6c    .  /* Call sql
1c8d0 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 29 20  ite3_shutdown() 
1c8e0 6f 6e 63 65 20 62 65 66 6f 72 65 20 64 6f 69 6e  once before doin
1c8f0 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2e  g anything else.
1c900 20 54 68 69 73 20 69 73 20 74 6f 0a 20 20 2a 2a   This is to.  **
1c910 20 74 65 73 74 20 74 68 61 74 20 73 71 6c 69 74   test that sqlit
1c920 65 33 5f 73 68 75 74 64 6f 77 6e 28 29 20 63 61  e3_shutdown() ca
1c930 6e 20 62 65 20 73 61 66 65 6c 79 20 63 61 6c 6c  n be safely call
1c940 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20  ed by a process 
1c950 62 65 66 6f 72 65 0a 20 20 2a 2a 20 73 71 6c 69  before.  ** sqli
1c960 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
1c970 20 69 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65   is. */.  sqlite
1c980 33 5f 73 68 75 74 64 6f 77 6e 28 29 3b 0a 0a 20  3_shutdown();.. 
1c990 20 54 63 6c 5f 46 69 6e 64 45 78 65 63 75 74 61   Tcl_FindExecuta
1c9a0 62 6c 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ble(argv[0]);.  
1c9b0 69 6e 74 65 72 70 20 3d 20 54 63 6c 5f 43 72 65  interp = Tcl_Cre
1c9c0 61 74 65 49 6e 74 65 72 70 28 29 3b 0a 0a 23 69  ateInterp();..#i
1c9d0 66 20 54 43 4c 53 48 3d 3d 32 0a 20 20 73 71 6c  f TCLSH==2.  sql
1c9e0 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49  ite3_config(SQLI
1c9f0 54 45 5f 43 4f 4e 46 49 47 5f 53 49 4e 47 4c 45  TE_CONFIG_SINGLE
1ca00 54 48 52 45 41 44 29 3b 0a 23 65 6e 64 69 66 0a  THREAD);.#endif.
1ca10 0a 20 20 69 6e 69 74 5f 61 6c 6c 28 69 6e 74 65  .  init_all(inte
1ca20 72 70 29 3b 0a 20 20 69 66 28 20 61 72 67 63 3e  rp);.  if( argc>
1ca30 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  =2 ){.    int i;
1ca40 0a 20 20 20 20 63 68 61 72 20 7a 41 72 67 63 5b  .    char zArgc[
1ca50 33 32 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  32];.    sqlite3
1ca60 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
1ca70 28 7a 41 72 67 63 29 2c 20 7a 41 72 67 63 2c 20  (zArgc), zArgc, 
1ca80 22 25 64 22 2c 20 61 72 67 63 2d 28 33 2d 54 43  "%d", argc-(3-TC
1ca90 4c 53 48 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53  LSH));.    Tcl_S
1caa0 65 74 56 61 72 28 69 6e 74 65 72 70 2c 22 61 72  etVar(interp,"ar
1cab0 67 63 22 2c 20 7a 41 72 67 63 2c 20 54 43 4c 5f  gc", zArgc, TCL_
1cac0 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20  GLOBAL_ONLY);.  
1cad0 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74    Tcl_SetVar(int
1cae0 65 72 70 2c 22 61 72 67 76 30 22 2c 61 72 67 76  erp,"argv0",argv
1caf0 5b 31 5d 2c 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f  [1],TCL_GLOBAL_O
1cb00 4e 4c 59 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  NLY);.    Tcl_Se
1cb10 74 56 61 72 28 69 6e 74 65 72 70 2c 22 61 72 67  tVar(interp,"arg
1cb20 76 22 2c 20 22 22 2c 20 54 43 4c 5f 47 4c 4f 42  v", "", TCL_GLOB
1cb30 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 66 6f  AL_ONLY);.    fo
1cb40 72 28 69 3d 33 2d 54 43 4c 53 48 3b 20 69 3c 61  r(i=3-TCLSH; i<a
1cb50 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rgc; i++){.     
1cb60 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65   Tcl_SetVar(inte
1cb70 72 70 2c 20 22 61 72 67 76 22 2c 20 61 72 67 76  rp, "argv", argv
1cb80 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 54  [i],.          T
1cb90 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 20 7c  CL_GLOBAL_ONLY |
1cba0 20 54 43 4c 5f 4c 49 53 54 5f 45 4c 45 4d 45 4e   TCL_LIST_ELEMEN
1cbb0 54 20 7c 20 54 43 4c 5f 41 50 50 45 4e 44 5f 56  T | TCL_APPEND_V
1cbc0 41 4c 55 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ALUE);.    }.   
1cbd0 20 69 66 28 20 54 43 4c 53 48 3d 3d 31 20 26 26   if( TCLSH==1 &&
1cbe0 20 54 63 6c 5f 45 76 61 6c 46 69 6c 65 28 69 6e   Tcl_EvalFile(in
1cbf0 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 29 21 3d  terp, argv[1])!=
1cc00 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  TCL_OK ){.      
1cc10 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 66  const char *zInf
1cc20 6f 20 3d 20 54 63 6c 5f 47 65 74 56 61 72 28 69  o = Tcl_GetVar(i
1cc30 6e 74 65 72 70 2c 20 22 65 72 72 6f 72 49 6e 66  nterp, "errorInf
1cc40 6f 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f  o", TCL_GLOBAL_O
1cc50 4e 4c 59 29 3b 0a 20 20 20 20 20 20 69 66 28 20  NLY);.      if( 
1cc60 7a 49 6e 66 6f 3d 3d 30 20 29 20 7a 49 6e 66 6f  zInfo==0 ) zInfo
1cc70 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
1cc80 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
1cc90 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
1cca0 64 65 72 72 2c 22 25 73 3a 20 25 73 5c 6e 22 2c  derr,"%s: %s\n",
1ccb0 20 2a 61 72 67 76 2c 20 7a 49 6e 66 6f 29 3b 0a   *argv, zInfo);.
1ccc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1ccd0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
1cce0 54 43 4c 53 48 3d 3d 32 20 7c 7c 20 61 72 67 63  TCLSH==2 || argc
1ccf0 3c 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 47  <=1 ){.    Tcl_G
1cd00 6c 6f 62 61 6c 45 76 61 6c 28 69 6e 74 65 72 70  lobalEval(interp
1cd10 2c 20 74 63 6c 73 68 5f 6d 61 69 6e 5f 6c 6f 6f  , tclsh_main_loo
1cd20 70 28 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  p());.  }.  retu
1cd30 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 0;.}.#endif /
1cd40 2a 20 54 43 4c 53 48 20 2a 2f 0a                 * TCLSH */.