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

Artifact 0faa4b56ab352368b0bffa0874de5cf5c9d89c7e:


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 50 72 65  .  Tcl_Obj *pPre
1240: 55 70 64 61 74 65 48 6f 6f 6b 3b 20 20 20 2f 2a  UpdateHook;   /*
1250: 20 50 72 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b   Pre-update hook
1260: 20 73 63 72 69 70 74 20 28 69 66 20 61 6e 79 29   script (if any)
1270: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70   */.  Tcl_Obj *p
1280: 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3b 20 20 20  RollbackHook;   
1290: 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 68 6f 6f   /* Rollback hoo
12a0: 6b 20 73 63 72 69 70 74 20 28 69 66 20 61 6e 79  k script (if any
12b0: 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  ) */.  Tcl_Obj *
12c0: 70 57 61 6c 48 6f 6f 6b 3b 20 20 20 20 20 20 20  pWalHook;       
12d0: 20 20 2f 2a 20 57 41 4c 20 68 6f 6f 6b 20 73 63    /* WAL hook sc
12e0: 72 69 70 74 20 28 69 66 20 61 6e 79 29 20 2a 2f  ript (if any) */
12f0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 55 6e 6c  .  Tcl_Obj *pUnl
1300: 6f 63 6b 4e 6f 74 69 66 79 3b 20 20 20 20 2f 2a  ockNotify;    /*
1310: 20 55 6e 6c 6f 63 6b 20 6e 6f 74 69 66 79 20 73   Unlock notify s
1320: 63 72 69 70 74 20 28 69 66 20 61 6e 79 29 20 2a  cript (if any) *
1330: 2f 0a 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a  /.  SqlCollate *
1340: 70 43 6f 6c 6c 61 74 65 3b 20 20 20 20 20 20 2f  pCollate;      /
1350: 2a 20 4c 69 73 74 20 6f 66 20 53 51 4c 20 63 6f  * List of SQL co
1360: 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  llation function
1370: 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  s */.  int rc;  
1380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1390: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
13a0: 20 6f 66 20 6d 6f 73 74 20 72 65 63 65 6e 74 20   of most recent 
13b0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 2a  sqlite3_exec() *
13c0: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f  /.  Tcl_Obj *pCo
13d0: 6c 6c 61 74 65 4e 65 65 64 65 64 3b 20 20 20 2f  llateNeeded;   /
13e0: 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65 64  * Collation need
13f0: 65 64 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 53  ed script */.  S
1400: 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a  qlPreparedStmt *
1410: 73 74 6d 74 4c 69 73 74 3b 20 2f 2a 20 4c 69 73  stmtList; /* Lis
1420: 74 20 6f 66 20 70 72 65 70 61 72 65 64 20 73 74  t of prepared st
1430: 61 74 65 6d 65 6e 74 73 2a 2f 0a 20 20 53 71 6c  atements*/.  Sql
1440: 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 73 74  PreparedStmt *st
1450: 6d 74 4c 61 73 74 3b 20 2f 2a 20 4c 61 73 74 20  mtLast; /* Last 
1460: 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65  statement in the
1470: 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6d   list */.  int m
1480: 61 78 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20  axStmt;         
1490: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78        /* The nex
14a0: 74 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  t maximum number
14b0: 20 6f 66 20 73 74 6d 74 4c 69 73 74 20 2a 2f 0a   of stmtList */.
14c0: 20 20 69 6e 74 20 6e 53 74 6d 74 3b 20 20 20 20    int nStmt;    
14d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14e0: 4e 75 6d 62 65 72 20 6f 66 20 73 74 61 74 65 6d  Number of statem
14f0: 65 6e 74 73 20 69 6e 20 73 74 6d 74 4c 69 73 74  ents in stmtList
1500: 20 2a 2f 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68   */.  IncrblobCh
1510: 61 6e 6e 65 6c 20 2a 70 49 6e 63 72 62 6c 6f 62  annel *pIncrblob
1520: 3b 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20  ;/* Linked list 
1530: 6f 66 20 6f 70 65 6e 20 69 6e 63 72 62 6c 6f 62  of open incrblob
1540: 20 63 68 61 6e 6e 65 6c 73 20 2a 2f 0a 20 20 69   channels */.  i
1550: 6e 74 20 6e 53 74 65 70 2c 20 6e 53 6f 72 74 2c  nt nStep, nSort,
1560: 20 6e 49 6e 64 65 78 3b 20 20 2f 2a 20 53 74 61   nIndex;  /* Sta
1570: 74 69 73 74 69 63 73 20 66 6f 72 20 6d 6f 73 74  tistics for most
1580: 20 72 65 63 65 6e 74 20 6f 70 65 72 61 74 69 6f   recent operatio
1590: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 72 61 6e  n */.  int nTran
15a0: 73 61 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20  saction;        
15b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e    /* Number of n
15c0: 65 73 74 65 64 20 5b 74 72 61 6e 73 61 63 74 69  ested [transacti
15d0: 6f 6e 5d 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23  on] methods */.#
15e0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
15f0: 54 0a 20 20 69 6e 74 20 62 4c 65 67 61 63 79 50  T.  int bLegacyP
1600: 72 65 70 61 72 65 3b 20 20 20 20 20 20 20 20 2f  repare;        /
1610: 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 73 71  * True to use sq
1620: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29 20  lite3_prepare() 
1630: 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 73 74  */.#endif.};..st
1640: 72 75 63 74 20 49 6e 63 72 62 6c 6f 62 43 68 61  ruct IncrblobCha
1650: 6e 6e 65 6c 20 7b 0a 20 20 73 71 6c 69 74 65 33  nnel {.  sqlite3
1660: 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 3b 20 20 20  _blob *pBlob;   
1670: 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 20 62 6c     /* sqlite3 bl
1680: 6f 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 53  ob handle */.  S
1690: 71 6c 69 74 65 44 62 20 2a 70 44 62 3b 20 20 20  qliteDb *pDb;   
16a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f           /* Asso
16b0: 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20  ciated database 
16c0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
16d0: 69 6e 74 20 69 53 65 65 6b 3b 20 20 20 20 20 20  int iSeek;      
16e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
16f0: 72 65 6e 74 20 73 65 65 6b 20 6f 66 66 73 65 74  rent seek offset
1700: 20 2a 2f 0a 20 20 54 63 6c 5f 43 68 61 6e 6e 65   */.  Tcl_Channe
1710: 6c 20 63 68 61 6e 6e 65 6c 3b 20 20 20 20 20 20  l channel;      
1720: 2f 2a 20 43 68 61 6e 6e 65 6c 20 69 64 65 6e 74  /* Channel ident
1730: 69 66 69 65 72 20 2a 2f 0a 20 20 49 6e 63 72 62  ifier */.  Incrb
1740: 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 4e 65 78  lobChannel *pNex
1750: 74 3b 20 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c  t;   /* Linked l
1760: 69 73 74 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20  ist of all open 
1770: 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c  incrblob channel
1780: 73 20 2a 2f 0a 20 20 49 6e 63 72 62 6c 6f 62 43  s */.  IncrblobC
1790: 68 61 6e 6e 65 6c 20 2a 70 50 72 65 76 3b 20 20  hannel *pPrev;  
17a0: 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20   /* Linked list 
17b0: 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 69 6e 63 72  of all open incr
17c0: 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 73 20 2a 2f  blob channels */
17d0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  .};../*.** Compu
17e0: 74 65 20 61 20 73 74 72 69 6e 67 20 6c 65 6e 67  te a string leng
17f0: 74 68 20 74 68 61 74 20 69 73 20 6c 69 6d 69 74  th that is limit
1800: 65 64 20 74 6f 20 77 68 61 74 20 63 61 6e 20 62  ed to what can b
1810: 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 6c  e stored in.** l
1820: 6f 77 65 72 20 33 30 20 62 69 74 73 20 6f 66 20  ower 30 bits of 
1830: 61 20 33 32 2d 62 69 74 20 73 69 67 6e 65 64 20  a 32-bit signed 
1840: 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74  integer..*/.stat
1850: 69 63 20 69 6e 74 20 73 74 72 6c 65 6e 33 30 28  ic int strlen30(
1860: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
1870: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32    const char *z2
1880: 20 3d 20 7a 3b 0a 20 20 77 68 69 6c 65 28 20 2a   = z;.  while( *
1890: 7a 32 20 29 7b 20 7a 32 2b 2b 3b 20 7d 0a 20 20  z2 ){ z2++; }.  
18a0: 72 65 74 75 72 6e 20 30 78 33 66 66 66 66 66 66  return 0x3ffffff
18b0: 66 20 26 20 28 69 6e 74 29 28 7a 32 20 2d 20 7a  f & (int)(z2 - z
18c0: 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53  );.}...#ifndef S
18d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
18e0: 4c 4f 42 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  LOB./*.** Close 
18f0: 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 20 63 68 61  all incrblob cha
1900: 6e 6e 65 6c 73 20 6f 70 65 6e 65 64 20 75 73 69  nnels opened usi
1910: 6e 67 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ng database conn
1920: 65 63 74 69 6f 6e 20 70 44 62 2e 0a 2a 2a 20 54  ection pDb..** T
1930: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 77 68  his is called wh
1940: 65 6e 20 73 68 75 74 74 69 6e 67 20 64 6f 77 6e  en shutting down
1950: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
1960: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nnection..*/.sta
1970: 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 49 6e  tic void closeIn
1980: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 73 28 53  crblobChannels(S
1990: 71 6c 69 74 65 44 62 20 2a 70 44 62 29 7b 0a 20  qliteDb *pDb){. 
19a0: 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c   IncrblobChannel
19b0: 20 2a 70 3b 0a 20 20 49 6e 63 72 62 6c 6f 62 43   *p;.  IncrblobC
19c0: 68 61 6e 6e 65 6c 20 2a 70 4e 65 78 74 3b 0a 0a  hannel *pNext;..
19d0: 20 20 66 6f 72 28 70 3d 70 44 62 2d 3e 70 49 6e    for(p=pDb->pIn
19e0: 63 72 62 6c 6f 62 3b 20 70 3b 20 70 3d 70 4e 65  crblob; p; p=pNe
19f0: 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
1a00: 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 20 20   p->pNext;..    
1a10: 2f 2a 20 4e 6f 74 65 3a 20 43 61 6c 6c 69 6e 67  /* Note: Calling
1a20: 20 75 6e 72 65 67 69 73 74 65 72 20 68 65 72 65   unregister here
1a30: 20 63 61 6c 6c 20 54 63 6c 5f 43 6c 6f 73 65 20   call Tcl_Close 
1a40: 6f 6e 20 74 68 65 20 69 6e 63 72 62 6c 6f 62 20  on the incrblob 
1a50: 63 68 61 6e 6e 65 6c 2c 20 0a 20 20 20 20 2a 2a  channel, .    **
1a60: 20 77 68 69 63 68 20 64 65 6c 65 74 65 73 20 74   which deletes t
1a70: 68 65 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  he IncrblobChann
1a80: 65 6c 20 73 74 72 75 63 74 75 72 65 20 61 74 20  el structure at 
1a90: 2a 70 2e 20 53 6f 20 64 6f 20 6e 6f 74 0a 20 20  *p. So do not.  
1aa0: 20 20 2a 2a 20 63 61 6c 6c 20 54 63 6c 5f 46 72    ** call Tcl_Fr
1ab0: 65 65 28 29 20 68 65 72 65 2e 0a 20 20 20 20 2a  ee() here..    *
1ac0: 2f 0a 20 20 20 20 54 63 6c 5f 55 6e 72 65 67 69  /.    Tcl_Unregi
1ad0: 73 74 65 72 43 68 61 6e 6e 65 6c 28 70 44 62 2d  sterChannel(pDb-
1ae0: 3e 69 6e 74 65 72 70 2c 20 70 2d 3e 63 68 61 6e  >interp, p->chan
1af0: 6e 65 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  nel);.  }.}../*.
1b00: 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 69 6e 63 72  ** Close an incr
1b10: 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 68 61  emental blob cha
1b20: 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nnel..*/.static 
1b30: 69 6e 74 20 69 6e 63 72 62 6c 6f 62 43 6c 6f 73  int incrblobClos
1b40: 65 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73  e(ClientData ins
1b50: 74 61 6e 63 65 44 61 74 61 2c 20 54 63 6c 5f 49  tanceData, Tcl_I
1b60: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a  nterp *interp){.
1b70: 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65    IncrblobChanne
1b80: 6c 20 2a 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62  l *p = (Incrblob
1b90: 43 68 61 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e  Channel *)instan
1ba0: 63 65 44 61 74 61 3b 0a 20 20 69 6e 74 20 72 63  ceData;.  int rc
1bb0: 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f   = sqlite3_blob_
1bc0: 63 6c 6f 73 65 28 70 2d 3e 70 42 6c 6f 62 29 3b  close(p->pBlob);
1bd0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1be0: 20 70 2d 3e 70 44 62 2d 3e 64 62 3b 0a 0a 20 20   p->pDb->db;..  
1bf0: 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 63 68  /* Remove the ch
1c00: 61 6e 6e 65 6c 20 66 72 6f 6d 20 74 68 65 20 53  annel from the S
1c10: 71 6c 69 74 65 44 62 2e 70 49 6e 63 72 62 6c 6f  qliteDb.pIncrblo
1c20: 62 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 69 66 28  b list. */.  if(
1c30: 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20   p->pNext ){.   
1c40: 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
1c50: 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d   = p->pPrev;.  }
1c60: 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20  .  if( p->pPrev 
1c70: 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d  ){.    p->pPrev-
1c80: 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78  >pNext = p->pNex
1c90: 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  t;.  }.  if( p->
1ca0: 70 44 62 2d 3e 70 49 6e 63 72 62 6c 6f 62 3d 3d  pDb->pIncrblob==
1cb0: 70 20 29 7b 0a 20 20 20 20 70 2d 3e 70 44 62 2d  p ){.    p->pDb-
1cc0: 3e 70 49 6e 63 72 62 6c 6f 62 20 3d 20 70 2d 3e  >pIncrblob = p->
1cd0: 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pNext;.  }..  /*
1ce0: 20 46 72 65 65 20 74 68 65 20 49 6e 63 72 62 6c   Free the Incrbl
1cf0: 6f 62 43 68 61 6e 6e 65 6c 20 73 74 72 75 63 74  obChannel struct
1d00: 75 72 65 20 2a 2f 0a 20 20 54 63 6c 5f 46 72 65  ure */.  Tcl_Fre
1d10: 65 28 28 63 68 61 72 20 2a 29 70 29 3b 0a 0a 20  e((char *)p);.. 
1d20: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1d30: 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65  OK ){.    Tcl_Se
1d40: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
1d50: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
1d60: 65 72 72 6d 73 67 28 64 62 29 2c 20 54 43 4c 5f  errmsg(db), TCL_
1d70: 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 72  VOLATILE);.    r
1d80: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1d90: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
1da0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  L_OK;.}../*.** R
1db0: 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 6e  ead data from an
1dc0: 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f   incremental blo
1dd0: 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74  b channel..*/.st
1de0: 61 74 69 63 20 69 6e 74 20 69 6e 63 72 62 6c 6f  atic int incrblo
1df0: 62 49 6e 70 75 74 28 0a 20 20 43 6c 69 65 6e 74  bInput(.  Client
1e00: 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74  Data instanceDat
1e10: 61 2c 20 0a 20 20 63 68 61 72 20 2a 62 75 66 2c  a, .  char *buf,
1e20: 20 0a 20 20 69 6e 74 20 62 75 66 53 69 7a 65 2c   .  int bufSize,
1e30: 0a 20 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64  .  int *errorCod
1e40: 65 50 74 72 0a 29 7b 0a 20 20 49 6e 63 72 62 6c  ePtr.){.  Incrbl
1e50: 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28  obChannel *p = (
1e60: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20  IncrblobChannel 
1e70: 2a 29 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a  *)instanceData;.
1e80: 20 20 69 6e 74 20 6e 52 65 61 64 20 3d 20 62 75    int nRead = bu
1e90: 66 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 2f  fSize;         /
1ea0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
1eb0: 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69  s to read */.  i
1ec0: 6e 74 20 6e 42 6c 6f 62 3b 20 20 20 20 20 20 20  nt nBlob;       
1ed0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1ee0: 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65  otal size of the
1ef0: 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 6e 74 20 72   blob */.  int r
1f00: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1f10: 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
1f20: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  e error code */.
1f30: 0a 20 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74  .  nBlob = sqlit
1f40: 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d  e3_blob_bytes(p-
1f50: 3e 70 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20 28  >pBlob);.  if( (
1f60: 70 2d 3e 69 53 65 65 6b 2b 6e 52 65 61 64 29 3e  p->iSeek+nRead)>
1f70: 6e 42 6c 6f 62 20 29 7b 0a 20 20 20 20 6e 52 65  nBlob ){.    nRe
1f80: 61 64 20 3d 20 6e 42 6c 6f 62 2d 70 2d 3e 69 53  ad = nBlob-p->iS
1f90: 65 65 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  eek;.  }.  if( n
1fa0: 52 65 61 64 3c 3d 30 20 29 7b 0a 20 20 20 20 72  Read<=0 ){.    r
1fb0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
1fc0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f  rc = sqlite3_blo
1fd0: 62 5f 72 65 61 64 28 70 2d 3e 70 42 6c 6f 62 2c  b_read(p->pBlob,
1fe0: 20 28 76 6f 69 64 20 2a 29 62 75 66 2c 20 6e 52   (void *)buf, nR
1ff0: 65 61 64 2c 20 70 2d 3e 69 53 65 65 6b 29 3b 0a  ead, p->iSeek);.
2000: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2010: 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 65 72 72 6f  _OK ){.    *erro
2020: 72 43 6f 64 65 50 74 72 20 3d 20 72 63 3b 0a 20  rCodePtr = rc;. 
2030: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
2040: 7d 0a 0a 20 20 70 2d 3e 69 53 65 65 6b 20 2b 3d  }..  p->iSeek +=
2050: 20 6e 52 65 61 64 3b 0a 20 20 72 65 74 75 72 6e   nRead;.  return
2060: 20 6e 52 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   nRead;.}../*.**
2070: 20 57 72 69 74 65 20 64 61 74 61 20 74 6f 20 61   Write data to a
2080: 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c  n incremental bl
2090: 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73  ob channel..*/.s
20a0: 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 62 6c  tatic int incrbl
20b0: 6f 62 4f 75 74 70 75 74 28 0a 20 20 43 6c 69 65  obOutput(.  Clie
20c0: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44  ntData instanceD
20d0: 61 74 61 2c 20 0a 20 20 43 4f 4e 53 54 20 63 68  ata, .  CONST ch
20e0: 61 72 20 2a 62 75 66 2c 20 0a 20 20 69 6e 74 20  ar *buf, .  int 
20f0: 74 6f 57 72 69 74 65 2c 0a 20 20 69 6e 74 20 2a  toWrite,.  int *
2100: 65 72 72 6f 72 43 6f 64 65 50 74 72 0a 29 7b 0a  errorCodePtr.){.
2110: 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65    IncrblobChanne
2120: 6c 20 2a 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62  l *p = (Incrblob
2130: 43 68 61 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e  Channel *)instan
2140: 63 65 44 61 74 61 3b 0a 20 20 69 6e 74 20 6e 57  ceData;.  int nW
2150: 72 69 74 65 20 3d 20 74 6f 57 72 69 74 65 3b 20  rite = toWrite; 
2160: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2170: 20 6f 66 20 62 79 74 65 73 20 74 6f 20 77 72 69   of bytes to wri
2180: 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 6c 6f  te */.  int nBlo
2190: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
21a0: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69       /* Total si
21b0: 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 62 20 2a  ze of the blob *
21c0: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e0: 20 2f 2a 20 73 71 6c 69 74 65 20 65 72 72 6f 72   /* sqlite error
21f0: 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 6e 42 6c 6f   code */..  nBlo
2200: 62 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  b = sqlite3_blob
2210: 5f 62 79 74 65 73 28 70 2d 3e 70 42 6c 6f 62 29  _bytes(p->pBlob)
2220: 3b 0a 20 20 69 66 28 20 28 70 2d 3e 69 53 65 65  ;.  if( (p->iSee
2230: 6b 2b 6e 57 72 69 74 65 29 3e 6e 42 6c 6f 62 20  k+nWrite)>nBlob 
2240: 29 7b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f 64  ){.    *errorCod
2250: 65 50 74 72 20 3d 20 45 49 4e 56 41 4c 3b 0a 20  ePtr = EINVAL;. 
2260: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
2270: 7d 0a 20 20 69 66 28 20 6e 57 72 69 74 65 3c 3d  }.  if( nWrite<=
2280: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
2290: 30 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73  0;.  }..  rc = s
22a0: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74  qlite3_blob_writ
22b0: 65 28 70 2d 3e 70 42 6c 6f 62 2c 20 28 76 6f 69  e(p->pBlob, (voi
22c0: 64 20 2a 29 62 75 66 2c 20 6e 57 72 69 74 65 2c  d *)buf, nWrite,
22d0: 20 70 2d 3e 69 53 65 65 6b 29 3b 0a 20 20 69 66   p->iSeek);.  if
22e0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
22f0: 29 7b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f 64  ){.    *errorCod
2300: 65 50 74 72 20 3d 20 45 49 4f 3b 0a 20 20 20 20  ePtr = EIO;.    
2310: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 0a  return -1;.  }..
2320: 20 20 70 2d 3e 69 53 65 65 6b 20 2b 3d 20 6e 57    p->iSeek += nW
2330: 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 6e  rite;.  return n
2340: 57 72 69 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Write;.}../*.** 
2350: 53 65 65 6b 20 61 6e 20 69 6e 63 72 65 6d 65 6e  Seek an incremen
2360: 74 61 6c 20 62 6c 6f 62 20 63 68 61 6e 6e 65 6c  tal blob channel
2370: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2380: 69 6e 63 72 62 6c 6f 62 53 65 65 6b 28 0a 20 20  incrblobSeek(.  
2390: 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61  ClientData insta
23a0: 6e 63 65 44 61 74 61 2c 20 0a 20 20 6c 6f 6e 67  nceData, .  long
23b0: 20 6f 66 66 73 65 74 2c 0a 20 20 69 6e 74 20 73   offset,.  int s
23c0: 65 65 6b 4d 6f 64 65 2c 0a 20 20 69 6e 74 20 2a  eekMode,.  int *
23d0: 65 72 72 6f 72 43 6f 64 65 50 74 72 0a 29 7b 0a  errorCodePtr.){.
23e0: 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65    IncrblobChanne
23f0: 6c 20 2a 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62  l *p = (Incrblob
2400: 43 68 61 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e  Channel *)instan
2410: 63 65 44 61 74 61 3b 0a 0a 20 20 73 77 69 74 63  ceData;..  switc
2420: 68 28 20 73 65 65 6b 4d 6f 64 65 20 29 7b 0a 20  h( seekMode ){. 
2430: 20 20 20 63 61 73 65 20 53 45 45 4b 5f 53 45 54     case SEEK_SET
2440: 3a 0a 20 20 20 20 20 20 70 2d 3e 69 53 65 65 6b  :.      p->iSeek
2450: 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20   = offset;.     
2460: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
2470: 20 53 45 45 4b 5f 43 55 52 3a 0a 20 20 20 20 20   SEEK_CUR:.     
2480: 20 70 2d 3e 69 53 65 65 6b 20 2b 3d 20 6f 66 66   p->iSeek += off
2490: 73 65 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  set;.      break
24a0: 3b 0a 20 20 20 20 63 61 73 65 20 53 45 45 4b 5f  ;.    case SEEK_
24b0: 45 4e 44 3a 0a 20 20 20 20 20 20 70 2d 3e 69 53  END:.      p->iS
24c0: 65 65 6b 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c  eek = sqlite3_bl
24d0: 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70 42 6c 6f  ob_bytes(p->pBlo
24e0: 62 29 20 2b 20 6f 66 66 73 65 74 3b 0a 20 20 20  b) + offset;.   
24f0: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64     break;..    d
2500: 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28 21  efault: assert(!
2510: 22 42 61 64 20 73 65 65 6b 4d 6f 64 65 22 29 3b  "Bad seekMode");
2520: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
2530: 2d 3e 69 53 65 65 6b 3b 0a 7d 0a 0a 0a 73 74 61  ->iSeek;.}...sta
2540: 74 69 63 20 76 6f 69 64 20 69 6e 63 72 62 6c 6f  tic void incrblo
2550: 62 57 61 74 63 68 28 43 6c 69 65 6e 74 44 61 74  bWatch(ClientDat
2560: 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20  a instanceData, 
2570: 69 6e 74 20 6d 6f 64 65 29 7b 20 0a 20 20 2f 2a  int mode){ .  /*
2580: 20 4e 4f 2d 4f 50 20 2a 2f 20 0a 7d 0a 73 74 61   NO-OP */ .}.sta
2590: 74 69 63 20 69 6e 74 20 69 6e 63 72 62 6c 6f 62  tic int incrblob
25a0: 48 61 6e 64 6c 65 28 43 6c 69 65 6e 74 44 61 74  Handle(ClientDat
25b0: 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20  a instanceData, 
25c0: 69 6e 74 20 64 69 72 2c 20 43 6c 69 65 6e 74 44  int dir, ClientD
25d0: 61 74 61 20 2a 68 50 74 72 29 7b 0a 20 20 72 65  ata *hPtr){.  re
25e0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
25f0: 7d 0a 0a 73 74 61 74 69 63 20 54 63 6c 5f 43 68  }..static Tcl_Ch
2600: 61 6e 6e 65 6c 54 79 70 65 20 49 6e 63 72 62 6c  annelType Incrbl
2610: 6f 62 43 68 61 6e 6e 65 6c 54 79 70 65 20 3d 20  obChannelType = 
2620: 7b 0a 20 20 22 69 6e 63 72 62 6c 6f 62 22 2c 20  {.  "incrblob", 
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2640: 20 20 20 20 20 20 20 2f 2a 20 74 79 70 65 4e 61         /* typeNa
2650: 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  me              
2660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2670: 2f 0a 20 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f  /.  TCL_CHANNEL_
2680: 56 45 52 53 49 4f 4e 5f 32 2c 20 20 20 20 20 20  VERSION_2,      
2690: 20 20 20 20 20 20 20 2f 2a 20 76 65 72 73 69 6f         /* versio
26a0: 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
26b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
26c0: 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 43 6c 6f 73  /.  incrblobClos
26d0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
26e0: 20 20 20 20 20 20 20 2f 2a 20 63 6c 6f 73 65 50         /* closeP
26f0: 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20  roc             
2700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2710: 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 49 6e 70 75  /.  incrblobInpu
2720: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
2730: 20 20 20 20 20 20 20 2f 2a 20 69 6e 70 75 74 50         /* inputP
2740: 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20  roc             
2750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2760: 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 4f 75 74 70  /.  incrblobOutp
2770: 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ut,             
2780: 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 70 75 74         /* output
2790: 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20  Proc            
27a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
27b0: 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 53 65 65 6b  /.  incrblobSeek
27c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
27d0: 20 20 20 20 20 20 20 2f 2a 20 73 65 65 6b 50 72         /* seekPr
27e0: 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  oc              
27f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2800: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
2810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2820: 20 20 20 20 20 20 20 2f 2a 20 73 65 74 4f 70 74         /* setOpt
2830: 69 6f 6e 50 72 6f 63 20 20 20 20 20 20 20 20 20  ionProc         
2840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2850: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
2860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2870: 20 20 20 20 20 20 20 2f 2a 20 67 65 74 4f 70 74         /* getOpt
2880: 69 6f 6e 50 72 6f 63 20 20 20 20 20 20 20 20 20  ionProc         
2890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
28a0: 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 57 61 74 63  /.  incrblobWatc
28b0: 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
28c0: 20 20 20 20 20 20 20 2f 2a 20 77 61 74 63 68 50         /* watchP
28d0: 72 6f 63 20 28 74 68 69 73 20 69 73 20 61 20 6e  roc (this is a n
28e0: 6f 2d 6f 70 29 20 20 20 20 20 20 20 20 20 20 2a  o-op)          *
28f0: 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 48 61 6e 64  /.  incrblobHand
2900: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
2910: 20 20 20 20 20 20 20 2f 2a 20 67 65 74 48 61 6e         /* getHan
2920: 64 6c 65 50 72 6f 63 20 28 61 6c 77 61 79 73 20  dleProc (always 
2930: 72 65 74 75 72 6e 73 20 65 72 72 6f 72 29 20 2a  returns error) *
2940: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
2950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2960: 20 20 20 20 20 20 20 2f 2a 20 63 6c 6f 73 65 32         /* close2
2970: 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20  Proc            
2980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2990: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
29a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b0: 20 20 20 20 20 20 20 2f 2a 20 62 6c 6f 63 6b 4d         /* blockM
29c0: 6f 64 65 50 72 6f 63 20 20 20 20 20 20 20 20 20  odeProc         
29d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
29e0: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a00: 20 20 20 20 20 20 20 2f 2a 20 66 6c 75 73 68 50         /* flushP
2a10: 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20  roc             
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2a30: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
2a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a50: 20 20 20 20 20 20 20 2f 2a 20 68 61 6e 64 6c 65         /* handle
2a60: 72 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20  rProc           
2a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2a80: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
2a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa0: 20 20 20 20 20 20 20 2f 2a 20 77 69 64 65 53 65         /* wideSe
2ab0: 65 6b 50 72 6f 63 20 20 20 20 20 20 20 20 20 20  ekProc          
2ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2ad0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  /.};../*.** Crea
2ae0: 74 65 20 61 20 6e 65 77 20 69 6e 63 72 62 6c 6f  te a new incrblo
2af0: 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74  b channel..*/.st
2b00: 61 74 69 63 20 69 6e 74 20 63 72 65 61 74 65 49  atic int createI
2b10: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 28 0a  ncrblobChannel(.
2b20: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
2b30: 74 65 72 70 2c 20 0a 20 20 53 71 6c 69 74 65 44  terp, .  SqliteD
2b40: 62 20 2a 70 44 62 2c 20 0a 20 20 63 6f 6e 73 74  b *pDb, .  const
2b50: 20 63 68 61 72 20 2a 7a 44 62 2c 0a 20 20 63 6f   char *zDb,.  co
2b60: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65  nst char *zTable
2b70: 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
2b80: 2a 7a 43 6f 6c 75 6d 6e 2c 20 0a 20 20 73 71 6c  *zColumn, .  sql
2b90: 69 74 65 5f 69 6e 74 36 34 20 69 52 6f 77 2c 0a  ite_int64 iRow,.
2ba0: 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79    int isReadonly
2bb0: 0a 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68  .){.  IncrblobCh
2bc0: 61 6e 6e 65 6c 20 2a 70 3b 0a 20 20 73 71 6c 69  annel *p;.  sqli
2bd0: 74 65 33 20 2a 64 62 20 3d 20 70 44 62 2d 3e 64  te3 *db = pDb->d
2be0: 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f  b;.  sqlite3_blo
2bf0: 62 20 2a 70 42 6c 6f 62 3b 0a 20 20 69 6e 74 20  b *pBlob;.  int 
2c00: 72 63 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20  rc;.  int flags 
2c10: 3d 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 7c 28  = TCL_READABLE|(
2c20: 69 73 52 65 61 64 6f 6e 6c 79 20 3f 20 30 20 3a  isReadonly ? 0 :
2c30: 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 3b 0a   TCL_WRITABLE);.
2c40: 0a 20 20 2f 2a 20 54 68 69 73 20 76 61 72 69 61  .  /* This varia
2c50: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6e  ble is used to n
2c60: 61 6d 65 20 74 68 65 20 63 68 61 6e 6e 65 6c 73  ame the channels
2c70: 3a 20 22 69 6e 63 72 62 6c 6f 62 5f 5b 69 6e 63  : "incrblob_[inc
2c80: 72 20 63 6f 75 6e 74 5d 22 20 2a 2f 0a 20 20 73  r count]" */.  s
2c90: 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 20  tatic int count 
2ca0: 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 43 68 61  = 0;.  char zCha
2cb0: 6e 6e 65 6c 5b 36 34 5d 3b 0a 0a 20 20 72 63 20  nnel[64];..  rc 
2cc0: 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f  = sqlite3_blob_o
2cd0: 70 65 6e 28 64 62 2c 20 7a 44 62 2c 20 7a 54 61  pen(db, zDb, zTa
2ce0: 62 6c 65 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 69 52  ble, zColumn, iR
2cf0: 6f 77 2c 20 21 69 73 52 65 61 64 6f 6e 6c 79 2c  ow, !isReadonly,
2d00: 20 26 70 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20   &pBlob);.  if( 
2d10: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2d20: 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
2d30: 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
2d40: 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72 6d 73   *)sqlite3_errms
2d50: 67 28 70 44 62 2d 3e 64 62 29 2c 20 54 43 4c 5f  g(pDb->db), TCL_
2d60: 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 72  VOLATILE);.    r
2d70: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2d80: 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 28 49 6e 63  .  }..  p = (Inc
2d90: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 54  rblobChannel *)T
2da0: 63 6c 5f 41 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  cl_Alloc(sizeof(
2db0: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 29  IncrblobChannel)
2dc0: 29 3b 0a 20 20 70 2d 3e 69 53 65 65 6b 20 3d 20  );.  p->iSeek = 
2dd0: 30 3b 0a 20 20 70 2d 3e 70 42 6c 6f 62 20 3d 20  0;.  p->pBlob = 
2de0: 70 42 6c 6f 62 3b 0a 0a 20 20 73 71 6c 69 74 65  pBlob;..  sqlite
2df0: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
2e00: 66 28 7a 43 68 61 6e 6e 65 6c 29 2c 20 7a 43 68  f(zChannel), zCh
2e10: 61 6e 6e 65 6c 2c 20 22 69 6e 63 72 62 6c 6f 62  annel, "incrblob
2e20: 5f 25 64 22 2c 20 2b 2b 63 6f 75 6e 74 29 3b 0a  _%d", ++count);.
2e30: 20 20 70 2d 3e 63 68 61 6e 6e 65 6c 20 3d 20 54    p->channel = T
2e40: 63 6c 5f 43 72 65 61 74 65 43 68 61 6e 6e 65 6c  cl_CreateChannel
2e50: 28 26 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65  (&IncrblobChanne
2e60: 6c 54 79 70 65 2c 20 7a 43 68 61 6e 6e 65 6c 2c  lType, zChannel,
2e70: 20 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 54 63   p, flags);.  Tc
2e80: 6c 5f 52 65 67 69 73 74 65 72 43 68 61 6e 6e 65  l_RegisterChanne
2e90: 6c 28 69 6e 74 65 72 70 2c 20 70 2d 3e 63 68 61  l(interp, p->cha
2ea0: 6e 6e 65 6c 29 3b 0a 0a 20 20 2f 2a 20 4c 69 6e  nnel);..  /* Lin
2eb0: 6b 20 74 68 65 20 6e 65 77 20 63 68 61 6e 6e 65  k the new channe
2ec0: 6c 20 69 6e 74 6f 20 74 68 65 20 53 71 6c 69 74  l into the Sqlit
2ed0: 65 44 62 2e 70 49 6e 63 72 62 6c 6f 62 20 6c 69  eDb.pIncrblob li
2ee0: 73 74 2e 20 2a 2f 0a 20 20 70 2d 3e 70 4e 65 78  st. */.  p->pNex
2ef0: 74 20 3d 20 70 44 62 2d 3e 70 49 6e 63 72 62 6c  t = pDb->pIncrbl
2f00: 6f 62 3b 0a 20 20 70 2d 3e 70 50 72 65 76 20 3d  ob;.  p->pPrev =
2f10: 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65   0;.  if( p->pNe
2f20: 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65  xt ){.    p->pNe
2f30: 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20  xt->pPrev = p;. 
2f40: 20 7d 0a 20 20 70 44 62 2d 3e 70 49 6e 63 72 62   }.  pDb->pIncrb
2f50: 6c 6f 62 20 3d 20 70 3b 0a 20 20 70 2d 3e 70 44  lob = p;.  p->pD
2f60: 62 20 3d 20 70 44 62 3b 0a 0a 20 20 54 63 6c 5f  b = pDb;..  Tcl_
2f70: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
2f80: 2c 20 28 63 68 61 72 20 2a 29 54 63 6c 5f 47 65  , (char *)Tcl_Ge
2f90: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 70 2d 3e  tChannelName(p->
2fa0: 63 68 61 6e 6e 65 6c 29 2c 20 54 43 4c 5f 56 4f  channel), TCL_VO
2fb0: 4c 41 54 49 4c 45 29 3b 0a 20 20 72 65 74 75 72  LATILE);.  retur
2fc0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6c 73  n TCL_OK;.}.#els
2fd0: 65 20 20 2f 2a 20 65 6c 73 65 20 63 6c 61 75 73  e  /* else claus
2fe0: 65 20 66 6f 72 20 22 23 69 66 6e 64 65 66 20 53  e for "#ifndef S
2ff0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
3000: 4c 4f 42 22 20 2a 2f 0a 20 20 23 64 65 66 69 6e  LOB" */.  #defin
3010: 65 20 63 6c 6f 73 65 49 6e 63 72 62 6c 6f 62 43  e closeIncrblobC
3020: 68 61 6e 6e 65 6c 73 28 70 44 62 29 0a 23 65 6e  hannels(pDb).#en
3030: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20  dif../*.** Look 
3040: 61 74 20 74 68 65 20 73 63 72 69 70 74 20 70 72  at the script pr
3050: 65 66 69 78 20 69 6e 20 70 43 6d 64 2e 20 20 57  efix in pCmd.  W
3060: 65 20 77 69 6c 6c 20 62 65 20 65 78 65 63 75 74  e will be execut
3070: 69 6e 67 20 74 68 69 73 20 73 63 72 69 70 74 0a  ing this script.
3080: 2a 2a 20 61 66 74 65 72 20 66 69 72 73 74 20 61  ** after first a
3090: 70 70 65 6e 64 69 6e 67 20 6f 6e 65 20 6f 72 20  ppending one or 
30a0: 6d 6f 72 65 20 61 72 67 75 6d 65 6e 74 73 2e 20  more arguments. 
30b0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e   This routine an
30c0: 61 6c 79 7a 65 73 0a 2a 2a 20 74 68 65 20 73 63  alyzes.** the sc
30d0: 72 69 70 74 20 74 6f 20 73 65 65 20 69 66 20 69  ript to see if i
30e0: 74 20 69 73 20 73 61 66 65 20 74 6f 20 75 73 65  t is safe to use
30f0: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20   Tcl_EvalObjv() 
3100: 6f 6e 20 74 68 65 20 73 63 72 69 70 74 0a 2a 2a  on the script.**
3110: 20 72 61 74 68 65 72 20 74 68 61 6e 20 74 68 65   rather than the
3120: 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20 54 63   more general Tc
3130: 6c 5f 45 76 61 6c 45 78 28 29 2e 20 20 54 63 6c  l_EvalEx().  Tcl
3140: 5f 45 76 61 6c 4f 62 6a 76 28 29 20 69 73 20 6d  _EvalObjv() is m
3150: 75 63 68 0a 2a 2a 20 66 61 73 74 65 72 2e 0a 2a  uch.** faster..*
3160: 2a 0a 2a 2a 20 53 63 72 69 70 74 73 20 74 68 61  *.** Scripts tha
3170: 74 20 61 72 65 20 73 61 66 65 20 74 6f 20 75 73  t are safe to us
3180: 65 20 77 69 74 68 20 54 63 6c 5f 45 76 61 6c 4f  e with Tcl_EvalO
3190: 62 6a 76 28 29 20 63 6f 6e 73 69 73 74 73 20 6f  bjv() consists o
31a0: 66 20 61 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 20 6e  f a.** command n
31b0: 61 6d 65 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20  ame followed by 
31c0: 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 61 72 67  zero or more arg
31d0: 75 6d 65 6e 74 73 20 77 69 74 68 20 6e 6f 20 5b  uments with no [
31e0: 2e 2e 2e 5d 20 6f 72 20 24 0a 2a 2a 20 6f 72 20  ...] or $.** or 
31f0: 7b 2e 2e 2e 7d 20 6f 72 20 3b 20 74 6f 20 62 65  {...} or ; to be
3200: 20 73 65 65 6e 20 61 6e 79 77 68 65 72 65 2e 20   seen anywhere. 
3210: 20 4d 6f 73 74 20 63 61 6c 6c 62 61 63 6b 20 73   Most callback s
3220: 63 72 69 70 74 73 20 63 6f 6e 73 69 73 74 0a 2a  cripts consist.*
3230: 2a 20 6f 66 20 6a 75 73 74 20 61 20 73 69 6e 67  * of just a sing
3240: 6c 65 20 70 72 6f 63 65 64 75 72 65 20 6e 61 6d  le procedure nam
3250: 65 20 61 6e 64 20 74 68 65 79 20 6d 65 65 74 20  e and they meet 
3260: 74 68 69 73 20 72 65 71 75 69 72 65 6d 65 6e 74  this requirement
3270: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3280: 73 61 66 65 54 6f 55 73 65 45 76 61 6c 4f 62 6a  safeToUseEvalObj
3290: 76 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  v(Tcl_Interp *in
32a0: 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a 70  terp, Tcl_Obj *p
32b0: 43 6d 64 29 7b 0a 20 20 2f 2a 20 57 65 20 63 6f  Cmd){.  /* We co
32c0: 75 6c 64 20 74 72 79 20 74 6f 20 64 6f 20 73 6f  uld try to do so
32d0: 6d 65 74 68 69 6e 67 20 77 69 74 68 20 54 63 6c  mething with Tcl
32e0: 5f 50 61 72 73 65 28 29 2e 20 20 42 75 74 20 77  _Parse().  But w
32f0: 65 20 77 69 6c 6c 20 69 6e 73 74 65 61 64 0a 20  e will instead. 
3300: 20 2a 2a 20 6a 75 73 74 20 64 6f 20 61 20 73 65   ** just do a se
3310: 61 72 63 68 20 66 6f 72 20 66 6f 72 62 69 64 64  arch for forbidd
3320: 65 6e 20 63 68 61 72 61 63 74 65 72 73 2e 20 20  en characters.  
3330: 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  If any of the fo
3340: 72 62 69 64 64 65 6e 0a 20 20 2a 2a 20 63 68 61  rbidden.  ** cha
3350: 72 61 63 74 65 72 73 20 61 70 70 65 61 72 20 69  racters appear i
3360: 6e 20 70 43 6d 64 2c 20 77 65 20 77 69 6c 6c 20  n pCmd, we will 
3370: 72 65 70 6f 72 74 20 74 68 65 20 73 74 72 69 6e  report the strin
3380: 67 20 61 73 20 75 6e 73 61 66 65 2e 0a 20 20 2a  g as unsafe..  *
3390: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
33a0: 7a 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 7a 20  z;.  int n;.  z 
33b0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
33c0: 72 6f 6d 4f 62 6a 28 70 43 6d 64 2c 20 26 6e 29  romObj(pCmd, &n)
33d0: 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e  ;.  while( n-- >
33e0: 20 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 20   0 ){.    int c 
33f0: 3d 20 2a 28 7a 2b 2b 29 3b 0a 20 20 20 20 69 66  = *(z++);.    if
3400: 28 20 63 3d 3d 27 24 27 20 7c 7c 20 63 3d 3d 27  ( c=='$' || c=='
3410: 5b 27 20 7c 7c 20 63 3d 3d 27 3b 27 20 29 20 72  [' || c==';' ) r
3420: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
3430: 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 1;.}../*.*
3440: 2a 20 46 69 6e 64 20 61 6e 20 53 71 6c 46 75 6e  * Find an SqlFun
3450: 63 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68  c structure with
3460: 20 74 68 65 20 67 69 76 65 6e 20 6e 61 6d 65 2e   the given name.
3470: 20 20 4f 72 20 63 72 65 61 74 65 20 61 20 6e 65    Or create a ne
3480: 77 0a 2a 2a 20 6f 6e 65 20 69 66 20 61 6e 20 65  w.** one if an e
3490: 78 69 73 74 69 6e 67 20 6f 6e 65 20 63 61 6e 6e  xisting one cann
34a0: 6f 74 20 62 65 20 66 6f 75 6e 64 2e 20 20 52 65  ot be found.  Re
34b0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
34c0: 6f 20 74 68 65 0a 2a 2a 20 73 74 72 75 63 74 75  o the.** structu
34d0: 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 71  re..*/.static Sq
34e0: 6c 46 75 6e 63 20 2a 66 69 6e 64 53 71 6c 46 75  lFunc *findSqlFu
34f0: 6e 63 28 53 71 6c 69 74 65 44 62 20 2a 70 44 62  nc(SqliteDb *pDb
3500: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
3510: 61 6d 65 29 7b 0a 20 20 53 71 6c 46 75 6e 63 20  ame){.  SqlFunc 
3520: 2a 70 2c 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74  *p, *pNew;.  int
3530: 20 69 3b 0a 20 20 70 4e 65 77 20 3d 20 28 53 71   i;.  pNew = (Sq
3540: 6c 46 75 6e 63 2a 29 54 63 6c 5f 41 6c 6c 6f 63  lFunc*)Tcl_Alloc
3550: 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20  ( sizeof(*pNew) 
3560: 2b 20 73 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65  + strlen30(zName
3570: 29 20 2b 20 31 20 29 3b 0a 20 20 70 4e 65 77 2d  ) + 1 );.  pNew-
3580: 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  >zName = (char*)
3590: 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 66 6f 72 28  &pNew[1];.  for(
35a0: 69 3d 30 3b 20 7a 4e 61 6d 65 5b 69 5d 3b 20 69  i=0; zName[i]; i
35b0: 2b 2b 29 7b 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65  ++){ pNew->zName
35c0: 5b 69 5d 20 3d 20 74 6f 6c 6f 77 65 72 28 7a 4e  [i] = tolower(zN
35d0: 61 6d 65 5b 69 5d 29 3b 20 7d 0a 20 20 70 4e 65  ame[i]); }.  pNe
35e0: 77 2d 3e 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b  w->zName[i] = 0;
35f0: 0a 20 20 66 6f 72 28 70 3d 70 44 62 2d 3e 70 46  .  for(p=pDb->pF
3600: 75 6e 63 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  unc; p; p=p->pNe
3610: 78 74 29 7b 20 0a 20 20 20 20 69 66 28 20 73 74  xt){ .    if( st
3620: 72 63 6d 70 28 70 2d 3e 7a 4e 61 6d 65 2c 20 70  rcmp(p->zName, p
3630: 4e 65 77 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29  New->zName)==0 )
3640: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65  {.      Tcl_Free
3650: 28 28 63 68 61 72 2a 29 70 4e 65 77 29 3b 0a 20  ((char*)pNew);. 
3660: 20 20 20 20 20 72 65 74 75 72 6e 20 70 3b 0a 20       return p;. 
3670: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e 65 77 2d     }.  }.  pNew-
3680: 3e 69 6e 74 65 72 70 20 3d 20 70 44 62 2d 3e 69  >interp = pDb->i
3690: 6e 74 65 72 70 3b 0a 20 20 70 4e 65 77 2d 3e 70  nterp;.  pNew->p
36a0: 44 62 20 3d 20 70 44 62 3b 0a 20 20 70 4e 65 77  Db = pDb;.  pNew
36b0: 2d 3e 70 53 63 72 69 70 74 20 3d 20 30 3b 0a 20  ->pScript = 0;. 
36c0: 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70   pNew->pNext = p
36d0: 44 62 2d 3e 70 46 75 6e 63 3b 0a 20 20 70 44 62  Db->pFunc;.  pDb
36e0: 2d 3e 70 46 75 6e 63 20 3d 20 70 4e 65 77 3b 0a  ->pFunc = pNew;.
36f0: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
3700: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 73  ../*.** Free a s
3710: 69 6e 67 6c 65 20 53 71 6c 50 72 65 70 61 72 65  ingle SqlPrepare
3720: 64 53 74 6d 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f  dStmt object..*/
3730: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 62 46  .static void dbF
3740: 72 65 65 53 74 6d 74 28 53 71 6c 50 72 65 70 61  reeStmt(SqlPrepa
3750: 72 65 64 53 74 6d 74 20 2a 70 53 74 6d 74 29 7b  redStmt *pStmt){
3760: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
3770: 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65  EST.  if( sqlite
3780: 33 5f 73 71 6c 28 70 53 74 6d 74 2d 3e 70 53 74  3_sql(pStmt->pSt
3790: 6d 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63  mt)==0 ){.    Tc
37a0: 6c 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 70  l_Free((char *)p
37b0: 53 74 6d 74 2d 3e 7a 53 71 6c 29 3b 0a 20 20 7d  Stmt->zSql);.  }
37c0: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
37d0: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
37e0: 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 54 63 6c 5f  ->pStmt);.  Tcl_
37f0: 46 72 65 65 28 28 63 68 61 72 20 2a 29 70 53 74  Free((char *)pSt
3800: 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  mt);.}../*.** Fi
3810: 6e 61 6c 69 7a 65 20 61 6e 64 20 66 72 65 65 20  nalize and free 
3820: 61 20 6c 69 73 74 20 6f 66 20 70 72 65 70 61 72  a list of prepar
3830: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2f  ed statements.*/
3840: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 6c 75  .static void flu
3850: 73 68 53 74 6d 74 43 61 63 68 65 28 53 71 6c 69  shStmtCache(Sqli
3860: 74 65 44 62 20 2a 70 44 62 29 7b 0a 20 20 53 71  teDb *pDb){.  Sq
3870: 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70  lPreparedStmt *p
3880: 50 72 65 53 74 6d 74 3b 0a 20 20 53 71 6c 50 72  PreStmt;.  SqlPr
3890: 65 70 61 72 65 64 53 74 6d 74 20 2a 70 4e 65 78  eparedStmt *pNex
38a0: 74 3b 0a 0a 20 20 66 6f 72 28 70 50 72 65 53 74  t;..  for(pPreSt
38b0: 6d 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69  mt = pDb->stmtLi
38c0: 73 74 3b 20 70 50 72 65 53 74 6d 74 3b 20 70 50  st; pPreStmt; pP
38d0: 72 65 53 74 6d 74 3d 70 4e 65 78 74 29 7b 0a 20  reStmt=pNext){. 
38e0: 20 20 20 70 4e 65 78 74 20 3d 20 70 50 72 65 53     pNext = pPreS
38f0: 74 6d 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  tmt->pNext;.    
3900: 64 62 46 72 65 65 53 74 6d 74 28 70 50 72 65 53  dbFreeStmt(pPreS
3910: 74 6d 74 29 3b 0a 20 20 7d 0a 20 20 70 44 62 2d  tmt);.  }.  pDb-
3920: 3e 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 44  >nStmt = 0;.  pD
3930: 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20 30 3b  b->stmtLast = 0;
3940: 0a 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74  .  pDb->stmtList
3950: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   = 0;.}../*.** T
3960: 43 4c 20 63 61 6c 6c 73 20 74 68 69 73 20 70 72  CL calls this pr
3970: 6f 63 65 64 75 72 65 20 77 68 65 6e 20 61 6e 20  ocedure when an 
3980: 73 71 6c 69 74 65 33 20 64 61 74 61 62 61 73 65  sqlite3 database
3990: 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 64   command is.** d
39a0: 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  eleted..*/.stati
39b0: 63 20 76 6f 69 64 20 44 62 44 65 6c 65 74 65 43  c void DbDeleteC
39c0: 6d 64 28 76 6f 69 64 20 2a 64 62 29 7b 0a 20 20  md(void *db){.  
39d0: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
39e0: 28 53 71 6c 69 74 65 44 62 2a 29 64 62 3b 0a 20  (SqliteDb*)db;. 
39f0: 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28   flushStmtCache(
3a00: 70 44 62 29 3b 0a 20 20 63 6c 6f 73 65 49 6e 63  pDb);.  closeInc
3a10: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 73 28 70 44  rblobChannels(pD
3a20: 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c  b);.  sqlite3_cl
3a30: 6f 73 65 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20  ose(pDb->db);.  
3a40: 77 68 69 6c 65 28 20 70 44 62 2d 3e 70 46 75 6e  while( pDb->pFun
3a50: 63 20 29 7b 0a 20 20 20 20 53 71 6c 46 75 6e 63  c ){.    SqlFunc
3a60: 20 2a 70 46 75 6e 63 20 3d 20 70 44 62 2d 3e 70   *pFunc = pDb->p
3a70: 46 75 6e 63 3b 0a 20 20 20 20 70 44 62 2d 3e 70  Func;.    pDb->p
3a80: 46 75 6e 63 20 3d 20 70 46 75 6e 63 2d 3e 70 4e  Func = pFunc->pN
3a90: 65 78 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ext;.    assert(
3aa0: 20 70 46 75 6e 63 2d 3e 70 44 62 3d 3d 70 44 62   pFunc->pDb==pDb
3ab0: 20 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72   );.    Tcl_Decr
3ac0: 52 65 66 43 6f 75 6e 74 28 70 46 75 6e 63 2d 3e  RefCount(pFunc->
3ad0: 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20 54 63  pScript);.    Tc
3ae0: 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 46  l_Free((char*)pF
3af0: 75 6e 63 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  unc);.  }.  whil
3b00: 65 28 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65  e( pDb->pCollate
3b10: 20 29 7b 0a 20 20 20 20 53 71 6c 43 6f 6c 6c 61   ){.    SqlColla
3b20: 74 65 20 2a 70 43 6f 6c 6c 61 74 65 20 3d 20 70  te *pCollate = p
3b30: 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 3b 0a 20 20  Db->pCollate;.  
3b40: 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20    pDb->pCollate 
3b50: 3d 20 70 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78  = pCollate->pNex
3b60: 74 3b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28  t;.    Tcl_Free(
3b70: 28 63 68 61 72 2a 29 70 43 6f 6c 6c 61 74 65 29  (char*)pCollate)
3b80: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d  ;.  }.  if( pDb-
3b90: 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 54 63  >zBusy ){.    Tc
3ba0: 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 42 75 73  l_Free(pDb->zBus
3bb0: 79 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44  y);.  }.  if( pD
3bc0: 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20 20  b->zTrace ){.   
3bd0: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
3be0: 54 72 61 63 65 29 3b 0a 20 20 7d 0a 20 20 69 66  Trace);.  }.  if
3bf0: 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20  ( pDb->zProfile 
3c00: 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28  ){.    Tcl_Free(
3c10: 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 29 3b 0a  pDb->zProfile);.
3c20: 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a    }.  if( pDb->z
3c30: 41 75 74 68 20 29 7b 0a 20 20 20 20 54 63 6c 5f  Auth ){.    Tcl_
3c40: 46 72 65 65 28 70 44 62 2d 3e 7a 41 75 74 68 29  Free(pDb->zAuth)
3c50: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d  ;.  }.  if( pDb-
3c60: 3e 7a 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 54 63  >zNull ){.    Tc
3c70: 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 4e 75 6c  l_Free(pDb->zNul
3c80: 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44  l);.  }.  if( pD
3c90: 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 20 29  b->pUpdateHook )
3ca0: 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  {.    Tcl_DecrRe
3cb0: 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 55 70 64  fCount(pDb->pUpd
3cc0: 61 74 65 48 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20  ateHook);.  }.  
3cd0: 69 66 28 20 70 44 62 2d 3e 70 50 72 65 55 70 64  if( pDb->pPreUpd
3ce0: 61 74 65 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 54  ateHook ){.    T
3cf0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
3d00: 70 44 62 2d 3e 70 50 72 65 55 70 64 61 74 65 48  pDb->pPreUpdateH
3d10: 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ook);.  }.  if( 
3d20: 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f  pDb->pRollbackHo
3d30: 6f 6b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65  ok ){.    Tcl_De
3d40: 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e  crRefCount(pDb->
3d50: 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 29 3b 0a  pRollbackHook);.
3d60: 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 70    }.  if( pDb->p
3d70: 57 61 6c 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 54  WalHook ){.    T
3d80: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
3d90: 70 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 29 3b 0a  pDb->pWalHook);.
3da0: 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 70    }.  if( pDb->p
3db0: 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 20 29 7b  CollateNeeded ){
3dc0: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
3dd0: 43 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c  Count(pDb->pColl
3de0: 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 7d 0a  ateNeeded);.  }.
3df0: 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72    Tcl_Free((char
3e00: 2a 29 70 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  *)pDb);.}../*.**
3e10: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
3e20: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 64   called when a d
3e30: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
3e40: 6c 6f 63 6b 65 64 20 77 68 69 6c 65 20 74 72 79  locked while try
3e50: 69 6e 67 0a 2a 2a 20 74 6f 20 65 78 65 63 75 74  ing.** to execut
3e60: 65 20 53 51 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63  e SQL..*/.static
3e70: 20 69 6e 74 20 44 62 42 75 73 79 48 61 6e 64 6c   int DbBusyHandl
3e80: 65 72 28 76 6f 69 64 20 2a 63 64 2c 20 69 6e 74  er(void *cd, int
3e90: 20 6e 54 72 69 65 73 29 7b 0a 20 20 53 71 6c 69   nTries){.  Sqli
3ea0: 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c  teDb *pDb = (Sql
3eb0: 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e 74  iteDb*)cd;.  int
3ec0: 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 56 61 6c   rc;.  char zVal
3ed0: 5b 33 30 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33  [30];..  sqlite3
3ee0: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
3ef0: 28 7a 56 61 6c 29 2c 20 7a 56 61 6c 2c 20 22 25  (zVal), zVal, "%
3f00: 64 22 2c 20 6e 54 72 69 65 73 29 3b 0a 20 20 72  d", nTries);.  r
3f10: 63 20 3d 20 54 63 6c 5f 56 61 72 45 76 61 6c 28  c = Tcl_VarEval(
3f20: 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62  pDb->interp, pDb
3f30: 2d 3e 7a 42 75 73 79 2c 20 22 20 22 2c 20 7a 56  ->zBusy, " ", zV
3f40: 61 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  al, (char*)0);. 
3f50: 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20   if( rc!=TCL_OK 
3f60: 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65 74 53  || atoi(Tcl_GetS
3f70: 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62 2d  tringResult(pDb-
3f80: 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a 20 20 20  >interp)) ){.   
3f90: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
3fa0: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 23 69   return 1;.}..#i
3fb0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
3fc0: 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42  T_PROGRESS_CALLB
3fd0: 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  ACK./*.** This r
3fe0: 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65  outine is invoke
3ff0: 64 20 61 73 20 74 68 65 20 27 70 72 6f 67 72 65  d as the 'progre
4000: 73 73 20 63 61 6c 6c 62 61 63 6b 27 20 66 6f 72  ss callback' for
4010: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
4020: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 50  /.static int DbP
4030: 72 6f 67 72 65 73 73 48 61 6e 64 6c 65 72 28 76  rogressHandler(v
4040: 6f 69 64 20 2a 63 64 29 7b 0a 20 20 53 71 6c 69  oid *cd){.  Sqli
4050: 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c  teDb *pDb = (Sql
4060: 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e 74  iteDb*)cd;.  int
4070: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
4080: 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29  pDb->zProgress )
4090: 3b 0a 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61  ;.  rc = Tcl_Eva
40a0: 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70  l(pDb->interp, p
40b0: 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 29 3b 0a  Db->zProgress);.
40c0: 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b    if( rc!=TCL_OK
40d0: 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65 74   || atoi(Tcl_Get
40e0: 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62  StringResult(pDb
40f0: 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a 20 20  ->interp)) ){.  
4100: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
4110: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
4120: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
4130: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a  LITE_OMIT_TRACE.
4140: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
4150: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
4160: 74 68 65 20 53 51 4c 69 74 65 20 74 72 61 63 65  the SQLite trace
4170: 20 68 61 6e 64 6c 65 72 20 77 68 65 6e 65 76 65   handler wheneve
4180: 72 20 61 20 6e 65 77 0a 2a 2a 20 62 6c 6f 63 6b  r a new.** block
4190: 20 6f 66 20 53 51 4c 20 69 73 20 65 78 65 63 75   of SQL is execu
41a0: 74 65 64 2e 20 20 54 68 65 20 54 43 4c 20 73 63  ted.  The TCL sc
41b0: 72 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a 54 72  ript in pDb->zTr
41c0: 61 63 65 20 69 73 20 65 78 65 63 75 74 65 64 2e  ace is executed.
41d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
41e0: 44 62 54 72 61 63 65 48 61 6e 64 6c 65 72 28 76  DbTraceHandler(v
41f0: 6f 69 64 20 2a 63 64 2c 20 63 6f 6e 73 74 20 63  oid *cd, const c
4200: 68 61 72 20 2a 7a 53 71 6c 29 7b 0a 20 20 53 71  har *zSql){.  Sq
4210: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
4220: 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 54  qliteDb*)cd;.  T
4230: 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a  cl_DString str;.
4240: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e  .  Tcl_DStringIn
4250: 69 74 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f  it(&str);.  Tcl_
4260: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 73  DStringAppend(&s
4270: 74 72 2c 20 70 44 62 2d 3e 7a 54 72 61 63 65 2c  tr, pDb->zTrace,
4280: 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72   -1);.  Tcl_DStr
4290: 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ingAppendElement
42a0: 28 26 73 74 72 2c 20 7a 53 71 6c 29 3b 0a 20 20  (&str, zSql);.  
42b0: 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e  Tcl_Eval(pDb->in
42c0: 74 65 72 70 2c 20 54 63 6c 5f 44 53 74 72 69 6e  terp, Tcl_DStrin
42d0: 67 56 61 6c 75 65 28 26 73 74 72 29 29 3b 0a 20  gValue(&str));. 
42e0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
42f0: 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f 52 65  (&str);.  Tcl_Re
4300: 73 65 74 52 65 73 75 6c 74 28 70 44 62 2d 3e 69  setResult(pDb->i
4310: 6e 74 65 72 70 29 3b 0a 7d 0a 23 65 6e 64 69 66  nterp);.}.#endif
4320: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
4330: 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a  _OMIT_TRACE./*.*
4340: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
4350: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
4360: 53 51 4c 69 74 65 20 70 72 6f 66 69 6c 65 20 68  SQLite profile h
4370: 61 6e 64 6c 65 72 20 61 66 74 65 72 20 61 20 73  andler after a s
4380: 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 53 51 4c 20  tatement.** SQL 
4390: 68 61 73 20 65 78 65 63 75 74 65 64 2e 20 20 54  has executed.  T
43a0: 68 65 20 54 43 4c 20 73 63 72 69 70 74 20 69 6e  he TCL script in
43b0: 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 69   pDb->zProfile i
43c0: 73 20 65 76 61 6c 75 61 74 65 64 2e 0a 2a 2f 0a  s evaluated..*/.
43d0: 73 74 61 74 69 63 20 76 6f 69 64 20 44 62 50 72  static void DbPr
43e0: 6f 66 69 6c 65 48 61 6e 64 6c 65 72 28 76 6f 69  ofileHandler(voi
43f0: 64 20 2a 63 64 2c 20 63 6f 6e 73 74 20 63 68 61  d *cd, const cha
4400: 72 20 2a 7a 53 71 6c 2c 20 73 71 6c 69 74 65 5f  r *zSql, sqlite_
4410: 75 69 6e 74 36 34 20 74 6d 29 7b 0a 20 20 53 71  uint64 tm){.  Sq
4420: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
4430: 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 54  qliteDb*)cd;.  T
4440: 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a  cl_DString str;.
4450: 20 20 63 68 61 72 20 7a 54 6d 5b 31 30 30 5d 3b    char zTm[100];
4460: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ..  sqlite3_snpr
4470: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 54 6d 29  intf(sizeof(zTm)
4480: 2d 31 2c 20 7a 54 6d 2c 20 22 25 6c 6c 64 22 2c  -1, zTm, "%lld",
4490: 20 74 6d 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72   tm);.  Tcl_DStr
44a0: 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20  ingInit(&str);. 
44b0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
44c0: 6e 64 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a 50  nd(&str, pDb->zP
44d0: 72 6f 66 69 6c 65 2c 20 2d 31 29 3b 0a 20 20 54  rofile, -1);.  T
44e0: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
44f0: 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 53  Element(&str, zS
4500: 71 6c 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  ql);.  Tcl_DStri
4510: 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  ngAppendElement(
4520: 26 73 74 72 2c 20 7a 54 6d 29 3b 0a 20 20 54 63  &str, zTm);.  Tc
4530: 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65  l_Eval(pDb->inte
4540: 72 70 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56  rp, Tcl_DStringV
4550: 61 6c 75 65 28 26 73 74 72 29 29 3b 0a 20 20 54  alue(&str));.  T
4560: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
4570: 73 74 72 29 3b 0a 20 20 54 63 6c 5f 52 65 73 65  str);.  Tcl_Rese
4580: 74 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74  tResult(pDb->int
4590: 65 72 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  erp);.}.#endif..
45a0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
45b0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
45c0: 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  n a transaction 
45d0: 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 54  is committed.  T
45e0: 68 65 0a 2a 2a 20 54 43 4c 20 73 63 72 69 70 74  he.** TCL script
45f0: 20 69 6e 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74   in pDb->zCommit
4600: 20 69 73 20 65 78 65 63 75 74 65 64 2e 20 20 49   is executed.  I
4610: 66 20 69 74 20 72 65 74 75 72 6e 73 20 6e 6f 6e  f it returns non
4620: 2d 7a 65 72 6f 20 6f 72 0a 2a 2a 20 69 66 20 69  -zero or.** if i
4630: 74 20 74 68 72 6f 77 73 20 61 6e 20 65 78 63 65  t throws an exce
4640: 70 74 69 6f 6e 2c 20 74 68 65 20 74 72 61 6e 73  ption, the trans
4650: 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
4660: 20 62 61 63 6b 20 69 6e 73 74 65 61 64 0a 2a 2a   back instead.**
4670: 20 6f 66 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74   of being commit
4680: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
4690: 6e 74 20 44 62 43 6f 6d 6d 69 74 48 61 6e 64 6c  nt DbCommitHandl
46a0: 65 72 28 76 6f 69 64 20 2a 63 64 29 7b 0a 20 20  er(void *cd){.  
46b0: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
46c0: 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20  (SqliteDb*)cd;. 
46d0: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d   int rc;..  rc =
46e0: 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69   Tcl_Eval(pDb->i
46f0: 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 43 6f 6d  nterp, pDb->zCom
4700: 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  mit);.  if( rc!=
4710: 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28 54  TCL_OK || atoi(T
4720: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
4730: 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 29  lt(pDb->interp))
4740: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
4750: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
4760: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
4770: 20 44 62 52 6f 6c 6c 62 61 63 6b 48 61 6e 64 6c   DbRollbackHandl
4780: 65 72 28 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44  er(void *clientD
4790: 61 74 61 29 7b 0a 20 20 53 71 6c 69 74 65 44 62  ata){.  SqliteDb
47a0: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
47b0: 62 2a 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20  b*)clientData;. 
47c0: 20 61 73 73 65 72 74 28 70 44 62 2d 3e 70 52 6f   assert(pDb->pRo
47d0: 6c 6c 62 61 63 6b 48 6f 6f 6b 29 3b 0a 20 20 69  llbackHook);.  i
47e0: 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 45  f( TCL_OK!=Tcl_E
47f0: 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69 6e  valObjEx(pDb->in
4800: 74 65 72 70 2c 20 70 44 62 2d 3e 70 52 6f 6c 6c  terp, pDb->pRoll
4810: 62 61 63 6b 48 6f 6f 6b 2c 20 30 29 20 29 7b 0a  backHook, 0) ){.
4820: 20 20 20 20 54 63 6c 5f 42 61 63 6b 67 72 6f 75      Tcl_Backgrou
4830: 6e 64 45 72 72 6f 72 28 70 44 62 2d 3e 69 6e 74  ndError(pDb->int
4840: 65 72 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  erp);.  }.}../*.
4850: 2a 2a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72  ** This procedur
4860: 65 20 68 61 6e 64 6c 65 73 20 77 61 6c 5f 68 6f  e handles wal_ho
4870: 6f 6b 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 2a 2f  ok callbacks..*/
4880: 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 57 61  .static int DbWa
4890: 6c 48 61 6e 64 6c 65 72 28 0a 20 20 76 6f 69 64  lHandler(.  void
48a0: 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c 20 0a 20   *clientData, . 
48b0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20   sqlite3 *db, . 
48c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
48d0: 2c 20 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79 0a  , .  int nEntry.
48e0: 29 7b 0a 20 20 69 6e 74 20 72 65 74 20 3d 20 53  ){.  int ret = S
48f0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 54 63 6c 5f  QLITE_OK;.  Tcl_
4900: 4f 62 6a 20 2a 70 3b 0a 20 20 53 71 6c 69 74 65  Obj *p;.  Sqlite
4910: 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74  Db *pDb = (Sqlit
4920: 65 44 62 2a 29 63 6c 69 65 6e 74 44 61 74 61 3b  eDb*)clientData;
4930: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
4940: 6e 74 65 72 70 20 3d 20 70 44 62 2d 3e 69 6e 74  nterp = pDb->int
4950: 65 72 70 3b 0a 20 20 61 73 73 65 72 74 28 70 44  erp;.  assert(pD
4960: 62 2d 3e 70 57 61 6c 48 6f 6f 6b 29 3b 0a 0a 20  b->pWalHook);.. 
4970: 20 70 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61   p = Tcl_Duplica
4980: 74 65 4f 62 6a 28 70 44 62 2d 3e 70 57 61 6c 48  teObj(pDb->pWalH
4990: 6f 6f 6b 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72  ook);.  Tcl_Incr
49a0: 52 65 66 43 6f 75 6e 74 28 70 29 3b 0a 20 20 54  RefCount(p);.  T
49b0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
49c0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
49d0: 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  p, Tcl_NewString
49e0: 4f 62 6a 28 7a 44 62 2c 20 2d 31 29 29 3b 0a 20  Obj(zDb, -1));. 
49f0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
4a00: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
4a10: 2c 20 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  , p, Tcl_NewIntO
4a20: 62 6a 28 6e 45 6e 74 72 79 29 29 3b 0a 20 20 69  bj(nEntry));.  i
4a30: 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 45  f( TCL_OK!=Tcl_E
4a40: 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c  valObjEx(interp,
4a50: 20 70 2c 20 30 29 20 0a 20 20 20 7c 7c 20 54 43   p, 0) .   || TC
4a60: 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74  L_OK!=Tcl_GetInt
4a70: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
4a80: 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_GetObjResult
4a90: 28 69 6e 74 65 72 70 29 2c 20 26 72 65 74 29 0a  (interp), &ret).
4aa0: 20 20 29 7b 0a 20 20 20 20 54 63 6c 5f 42 61 63    ){.    Tcl_Bac
4ab0: 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74  kgroundError(int
4ac0: 65 72 70 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  erp);.  }.  Tcl_
4ad0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 29 3b  DecrRefCount(p);
4ae0: 0a 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a  ..  return ret;.
4af0: 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  }..#if defined(S
4b00: 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20 64  QLITE_TEST) && d
4b10: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
4b20: 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49  ABLE_UNLOCK_NOTI
4b30: 46 59 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  FY).static void 
4b40: 73 65 74 54 65 73 74 55 6e 6c 6f 63 6b 4e 6f 74  setTestUnlockNot
4b50: 69 66 79 56 61 72 73 28 54 63 6c 5f 49 6e 74 65  ifyVars(Tcl_Inte
4b60: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
4b70: 69 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 29 7b  iArg, int nArg){
4b80: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 36 34 5d  .  char zBuf[64]
4b90: 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66  ;.  sprintf(zBuf
4ba0: 2c 20 22 25 64 22 2c 20 69 41 72 67 29 3b 0a 20  , "%d", iArg);. 
4bb0: 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65   Tcl_SetVar(inte
4bc0: 72 70 2c 20 22 73 71 6c 69 74 65 5f 75 6e 6c 6f  rp, "sqlite_unlo
4bd0: 63 6b 5f 6e 6f 74 69 66 79 5f 61 72 67 22 2c 20  ck_notify_arg", 
4be0: 7a 42 75 66 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c  zBuf, TCL_GLOBAL
4bf0: 5f 4f 4e 4c 59 29 3b 0a 20 20 73 70 72 69 6e 74  _ONLY);.  sprint
4c00: 66 28 7a 42 75 66 2c 20 22 25 64 22 2c 20 6e 41  f(zBuf, "%d", nA
4c10: 72 67 29 3b 0a 20 20 54 63 6c 5f 53 65 74 56 61  rg);.  Tcl_SetVa
4c20: 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
4c30: 65 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 5f  e_unlock_notify_
4c40: 61 72 67 63 6f 75 6e 74 22 2c 20 7a 42 75 66 2c  argcount", zBuf,
4c50: 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59   TCL_GLOBAL_ONLY
4c60: 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
4c70: 69 6e 65 20 73 65 74 54 65 73 74 55 6e 6c 6f 63  ine setTestUnloc
4c80: 6b 4e 6f 74 69 66 79 56 61 72 73 28 78 2c 79 2c  kNotifyVars(x,y,
4c90: 7a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  z).#endif..#ifde
4ca0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
4cb0: 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0a 73 74  UNLOCK_NOTIFY.st
4cc0: 61 74 69 63 20 76 6f 69 64 20 44 62 55 6e 6c 6f  atic void DbUnlo
4cd0: 63 6b 4e 6f 74 69 66 79 28 76 6f 69 64 20 2a 2a  ckNotify(void **
4ce0: 61 70 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 29  apArg, int nArg)
4cf0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
4d00: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
4d10: 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e  +){.    const in
4d20: 74 20 66 6c 61 67 73 20 3d 20 28 54 43 4c 5f 45  t flags = (TCL_E
4d30: 56 41 4c 5f 47 4c 4f 42 41 4c 7c 54 43 4c 5f 45  VAL_GLOBAL|TCL_E
4d40: 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20 20  VAL_DIRECT);.   
4d50: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
4d60: 20 28 53 71 6c 69 74 65 44 62 20 2a 29 61 70 41   (SqliteDb *)apA
4d70: 72 67 5b 69 5d 3b 0a 20 20 20 20 73 65 74 54 65  rg[i];.    setTe
4d80: 73 74 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 56 61  stUnlockNotifyVa
4d90: 72 73 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  rs(pDb->interp, 
4da0: 69 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 61 73  i, nArg);.    as
4db0: 73 65 72 74 28 20 70 44 62 2d 3e 70 55 6e 6c 6f  sert( pDb->pUnlo
4dc0: 63 6b 4e 6f 74 69 66 79 29 3b 0a 20 20 20 20 54  ckNotify);.    T
4dd0: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62  cl_EvalObjEx(pDb
4de0: 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 70  ->interp, pDb->p
4df0: 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 2c 20 66 6c  UnlockNotify, fl
4e00: 61 67 73 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65  ags);.    Tcl_De
4e10: 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e  crRefCount(pDb->
4e20: 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 29 3b 0a  pUnlockNotify);.
4e30: 20 20 20 20 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b      pDb->pUnlock
4e40: 4e 6f 74 69 66 79 20 3d 20 30 3b 0a 20 20 7d 0a  Notify = 0;.  }.
4e50: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
4e60: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50   SQLITE_ENABLE_P
4e70: 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 2f 2a  REUPDATE_HOOK./*
4e80: 0a 2a 2a 20 50 72 65 2d 75 70 64 61 74 65 20 68  .** Pre-update h
4e90: 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f  ook callback..*/
4ea0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44 62 50  .static void DbP
4eb0: 72 65 55 70 64 61 74 65 48 61 6e 64 6c 65 72 28  reUpdateHandler(
4ec0: 0a 20 20 76 6f 69 64 20 2a 70 2c 20 0a 20 20 73  .  void *p, .  s
4ed0: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 69 6e  qlite3 *db,.  in
4ee0: 74 20 6f 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68  t op,.  const ch
4ef0: 61 72 20 2a 7a 44 62 2c 20 0a 20 20 63 6f 6e 73  ar *zDb, .  cons
4f00: 74 20 63 68 61 72 20 2a 7a 54 62 6c 2c 20 0a 20  t char *zTbl, . 
4f10: 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69 4b   sqlite_int64 iK
4f20: 65 79 31 2c 0a 20 20 73 71 6c 69 74 65 5f 69 6e  ey1,.  sqlite_in
4f30: 74 36 34 20 69 4b 65 79 32 0a 29 7b 0a 20 20 53  t64 iKey2.){.  S
4f40: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
4f50: 53 71 6c 69 74 65 44 62 20 2a 29 70 3b 0a 20 20  SqliteDb *)p;.  
4f60: 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 20  Tcl_Obj *pCmd;. 
4f70: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
4f80: 61 72 20 2a 61 7a 53 74 72 5b 5d 20 3d 20 7b 22  ar *azStr[] = {"
4f90: 44 45 4c 45 54 45 22 2c 20 22 49 4e 53 45 52 54  DELETE", "INSERT
4fa0: 22 2c 20 22 55 50 44 41 54 45 22 7d 3b 0a 0a 20  ", "UPDATE"};.. 
4fb0: 20 61 73 73 65 72 74 28 20 28 53 51 4c 49 54 45   assert( (SQLITE
4fc0: 5f 44 45 4c 45 54 45 2d 31 29 2f 39 20 3d 3d 20  _DELETE-1)/9 == 
4fd0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  0 );.  assert( (
4fe0: 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2d 31 29  SQLITE_INSERT-1)
4ff0: 2f 39 20 3d 3d 20 31 20 29 3b 0a 20 20 61 73 73  /9 == 1 );.  ass
5000: 65 72 74 28 20 28 53 51 4c 49 54 45 5f 55 50 44  ert( (SQLITE_UPD
5010: 41 54 45 2d 31 29 2f 39 20 3d 3d 20 32 20 29 3b  ATE-1)/9 == 2 );
5020: 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e  .  assert( pDb->
5030: 70 50 72 65 55 70 64 61 74 65 48 6f 6f 6b 20 29  pPreUpdateHook )
5040: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 3d 3d  ;.  assert( db==
5050: 70 44 62 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73  pDb->db );.  ass
5060: 65 72 74 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f  ert( op==SQLITE_
5070: 49 4e 53 45 52 54 20 7c 7c 20 6f 70 3d 3d 53 51  INSERT || op==SQ
5080: 4c 49 54 45 5f 55 50 44 41 54 45 20 7c 7c 20 6f  LITE_UPDATE || o
5090: 70 3d 3d 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  p==SQLITE_DELETE
50a0: 20 29 3b 0a 0a 20 20 70 43 6d 64 20 3d 20 54 63   );..  pCmd = Tc
50b0: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 70  l_DuplicateObj(p
50c0: 44 62 2d 3e 70 50 72 65 55 70 64 61 74 65 48 6f  Db->pPreUpdateHo
50d0: 6f 6b 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52  ok);.  Tcl_IncrR
50e0: 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20  efCount(pCmd);. 
50f0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
5100: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d  ndElement(0, pCm
5110: 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  d, Tcl_NewString
5120: 4f 62 6a 28 61 7a 53 74 72 5b 28 6f 70 2d 31 29  Obj(azStr[(op-1)
5130: 2f 39 5d 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  /9], -1));.  Tcl
5140: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
5150: 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54  ement(0, pCmd, T
5160: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
5170: 7a 44 62 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  zDb, -1));.  Tcl
5180: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
5190: 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54  ement(0, pCmd, T
51a0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
51b0: 7a 54 62 6c 2c 20 2d 31 29 29 3b 0a 20 20 54 63  zTbl, -1));.  Tc
51c0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
51d0: 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20  lement(0, pCmd, 
51e0: 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62  Tcl_NewWideIntOb
51f0: 6a 28 69 4b 65 79 31 29 29 3b 0a 20 20 54 63 6c  j(iKey1));.  Tcl
5200: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
5210: 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54  ement(0, pCmd, T
5220: 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a  cl_NewWideIntObj
5230: 28 69 4b 65 79 32 29 29 3b 0a 20 20 54 63 6c 5f  (iKey2));.  Tcl_
5240: 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69  EvalObjEx(pDb->i
5250: 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c  nterp, pCmd, TCL
5260: 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20  _EVAL_DIRECT);. 
5270: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
5280: 74 28 70 43 6d 64 29 3b 0a 7d 0a 23 65 6e 64 69  t(pCmd);.}.#endi
5290: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
52a0: 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f  LE_PREUPDATE_HOO
52b0: 4b 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69  K */..static voi
52c0: 64 20 44 62 55 70 64 61 74 65 48 61 6e 64 6c 65  d DbUpdateHandle
52d0: 72 28 0a 20 20 76 6f 69 64 20 2a 70 2c 20 0a 20  r(.  void *p, . 
52e0: 20 69 6e 74 20 6f 70 2c 0a 20 20 63 6f 6e 73 74   int op,.  const
52f0: 20 63 68 61 72 20 2a 7a 44 62 2c 20 0a 20 20 63   char *zDb, .  c
5300: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62 6c 2c  onst char *zTbl,
5310: 20 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34   .  sqlite_int64
5320: 20 72 6f 77 69 64 0a 29 7b 0a 20 20 53 71 6c 69   rowid.){.  Sqli
5330: 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c  teDb *pDb = (Sql
5340: 69 74 65 44 62 20 2a 29 70 3b 0a 20 20 54 63 6c  iteDb *)p;.  Tcl
5350: 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 20 20 73 74  _Obj *pCmd;.  st
5360: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
5370: 2a 61 7a 53 74 72 5b 5d 20 3d 20 7b 22 44 45 4c  *azStr[] = {"DEL
5380: 45 54 45 22 2c 20 22 49 4e 53 45 52 54 22 2c 20  ETE", "INSERT", 
5390: 22 55 50 44 41 54 45 22 7d 3b 0a 0a 20 20 61 73  "UPDATE"};..  as
53a0: 73 65 72 74 28 20 28 53 51 4c 49 54 45 5f 44 45  sert( (SQLITE_DE
53b0: 4c 45 54 45 2d 31 29 2f 39 20 3d 3d 20 30 20 29  LETE-1)/9 == 0 )
53c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 53 51 4c  ;.  assert( (SQL
53d0: 49 54 45 5f 49 4e 53 45 52 54 2d 31 29 2f 39 20  ITE_INSERT-1)/9 
53e0: 3d 3d 20 31 20 29 3b 0a 20 20 61 73 73 65 72 74  == 1 );.  assert
53f0: 28 20 28 53 51 4c 49 54 45 5f 55 50 44 41 54 45  ( (SQLITE_UPDATE
5400: 2d 31 29 2f 39 20 3d 3d 20 32 20 29 3b 0a 0a 20  -1)/9 == 2 );.. 
5410: 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 70 55   assert( pDb->pU
5420: 70 64 61 74 65 48 6f 6f 6b 20 29 3b 0a 20 20 61  pdateHook );.  a
5430: 73 73 65 72 74 28 20 6f 70 3d 3d 53 51 4c 49 54  ssert( op==SQLIT
5440: 45 5f 49 4e 53 45 52 54 20 7c 7c 20 6f 70 3d 3d  E_INSERT || op==
5450: 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20 7c 7c  SQLITE_UPDATE ||
5460: 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 44 45 4c 45   op==SQLITE_DELE
5470: 54 45 20 29 3b 0a 0a 20 20 70 43 6d 64 20 3d 20  TE );..  pCmd = 
5480: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
5490: 28 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f  (pDb->pUpdateHoo
54a0: 6b 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65  k);.  Tcl_IncrRe
54b0: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
54c0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
54d0: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64  dElement(0, pCmd
54e0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
54f0: 62 6a 28 61 7a 53 74 72 5b 28 6f 70 2d 31 29 2f  bj(azStr[(op-1)/
5500: 39 5d 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  9], -1));.  Tcl_
5510: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
5520: 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63  ment(0, pCmd, Tc
5530: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
5540: 44 62 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  Db, -1));.  Tcl_
5550: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
5560: 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63  ment(0, pCmd, Tc
5570: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
5580: 54 62 6c 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  Tbl, -1));.  Tcl
5590: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
55a0: 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54  ement(0, pCmd, T
55b0: 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a  cl_NewWideIntObj
55c0: 28 72 6f 77 69 64 29 29 3b 0a 20 20 54 63 6c 5f  (rowid));.  Tcl_
55d0: 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69  EvalObjEx(pDb->i
55e0: 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c  nterp, pCmd, TCL
55f0: 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20  _EVAL_DIRECT);. 
5600: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
5610: 74 28 70 43 6d 64 29 3b 0a 7d 0a 0a 73 74 61 74  t(pCmd);.}..stat
5620: 69 63 20 76 6f 69 64 20 74 63 6c 43 6f 6c 6c 61  ic void tclColla
5630: 74 65 4e 65 65 64 65 64 28 0a 20 20 76 6f 69 64  teNeeded(.  void
5640: 20 2a 70 43 74 78 2c 0a 20 20 73 71 6c 69 74 65   *pCtx,.  sqlite
5650: 33 20 2a 64 62 2c 0a 20 20 69 6e 74 20 65 6e 63  3 *db,.  int enc
5660: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
5670: 7a 4e 61 6d 65 0a 29 7b 0a 20 20 53 71 6c 69 74  zName.){.  Sqlit
5680: 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69  eDb *pDb = (Sqli
5690: 74 65 44 62 20 2a 29 70 43 74 78 3b 0a 20 20 54  teDb *)pCtx;.  T
56a0: 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 20  cl_Obj *pScript 
56b0: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
56c0: 62 6a 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65  bj(pDb->pCollate
56d0: 4e 65 65 64 65 64 29 3b 0a 20 20 54 63 6c 5f 49  Needed);.  Tcl_I
56e0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72  ncrRefCount(pScr
56f0: 69 70 74 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  ipt);.  Tcl_List
5700: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
5710: 28 30 2c 20 70 53 63 72 69 70 74 2c 20 54 63 6c  (0, pScript, Tcl
5720: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 4e  _NewStringObj(zN
5730: 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  ame, -1));.  Tcl
5740: 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e  _EvalObjEx(pDb->
5750: 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c  interp, pScript,
5760: 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52   0);.  Tcl_DecrR
5770: 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29  efCount(pScript)
5780: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
5790: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
57a0: 64 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e  d to evaluate an
57b0: 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   SQL collation f
57c0: 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e  unction implemen
57d0: 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20 54 43 4c  ted.** using TCL
57e0: 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 73 74 61 74   script..*/.stat
57f0: 69 63 20 69 6e 74 20 74 63 6c 53 71 6c 43 6f 6c  ic int tclSqlCol
5800: 6c 61 74 65 28 0a 20 20 76 6f 69 64 20 2a 70 43  late(.  void *pC
5810: 74 78 2c 0a 20 20 69 6e 74 20 6e 41 2c 0a 20 20  tx,.  int nA,.  
5820: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 41 2c 0a  const void *zA,.
5830: 20 20 69 6e 74 20 6e 42 2c 0a 20 20 63 6f 6e 73    int nB,.  cons
5840: 74 20 76 6f 69 64 20 2a 7a 42 0a 29 7b 0a 20 20  t void *zB.){.  
5850: 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 20 3d 20  SqlCollate *p = 
5860: 28 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 29 70 43  (SqlCollate *)pC
5870: 74 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  tx;.  Tcl_Obj *p
5880: 43 6d 64 3b 0a 0a 20 20 70 43 6d 64 20 3d 20 54  Cmd;..  pCmd = T
5890: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
58a0: 70 2d 3e 7a 53 63 72 69 70 74 2c 20 2d 31 29 3b  p->zScript, -1);
58b0: 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  .  Tcl_IncrRefCo
58c0: 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 54 63 6c  unt(pCmd);.  Tcl
58d0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
58e0: 65 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c  ement(p->interp,
58f0: 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74   pCmd, Tcl_NewSt
5900: 72 69 6e 67 4f 62 6a 28 7a 41 2c 20 6e 41 29 29  ringObj(zA, nA))
5910: 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
5920: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d 3e  ppendElement(p->
5930: 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 63  interp, pCmd, Tc
5940: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
5950: 42 2c 20 6e 42 29 29 3b 0a 20 20 54 63 6c 5f 45  B, nB));.  Tcl_E
5960: 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65  valObjEx(p->inte
5970: 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c 5f 45 56  rp, pCmd, TCL_EV
5980: 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20 54 63  AL_DIRECT);.  Tc
5990: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
59a0: 43 6d 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  Cmd);.  return (
59b0: 61 74 6f 69 28 54 63 6c 5f 47 65 74 53 74 72 69  atoi(Tcl_GetStri
59c0: 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65  ngResult(p->inte
59d0: 72 70 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rp)));.}../*.** 
59e0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
59f0: 63 61 6c 6c 65 64 20 74 6f 20 65 76 61 6c 75 61  called to evalua
5a00: 74 65 20 61 6e 20 53 51 4c 20 66 75 6e 63 74 69  te an SQL functi
5a10: 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a  on implemented.*
5a20: 2a 20 75 73 69 6e 67 20 54 43 4c 20 73 63 72 69  * using TCL scri
5a30: 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  pt..*/.static vo
5a40: 69 64 20 74 63 6c 53 71 6c 46 75 6e 63 28 73 71  id tclSqlFunc(sq
5a50: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
5a60: 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
5a70: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  , sqlite3_value*
5a80: 2a 61 72 67 76 29 7b 0a 20 20 53 71 6c 46 75 6e  *argv){.  SqlFun
5a90: 63 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 5f 75  c *p = sqlite3_u
5aa0: 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74  ser_data(context
5ab0: 29 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43  );.  Tcl_Obj *pC
5ac0: 6d 64 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  md;.  int i;.  i
5ad0: 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 61 72  nt rc;..  if( ar
5ae0: 67 63 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  gc==0 ){.    /* 
5af0: 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
5b00: 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65  arguments to the
5b10: 20 66 75 6e 63 74 69 6f 6e 2c 20 63 61 6c 6c 20   function, call 
5b20: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 20 6f 6e  Tcl_EvalObjEx on
5b30: 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 63 72 69   the.    ** scri
5b40: 70 74 20 6f 62 6a 65 63 74 20 64 69 72 65 63 74  pt object direct
5b50: 6c 79 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77 73  ly.  This allows
5b60: 20 74 68 65 20 54 43 4c 20 63 6f 6d 70 69 6c 65   the TCL compile
5b70: 72 20 74 6f 20 67 65 6e 65 72 61 74 65 0a 20 20  r to generate.  
5b80: 20 20 2a 2a 20 62 79 74 65 63 6f 64 65 20 66 6f    ** bytecode fo
5b90: 72 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6f 6e  r the command on
5ba0: 20 74 68 65 20 66 69 72 73 74 20 69 6e 76 6f 63   the first invoc
5bb0: 61 74 69 6f 6e 20 61 6e 64 20 74 68 75 73 20 6d  ation and thus m
5bc0: 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 62 73 65  ake.    ** subse
5bd0: 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e  quent invocation
5be0: 73 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20 2a  s much faster. *
5bf0: 2f 0a 20 20 20 20 70 43 6d 64 20 3d 20 70 2d 3e  /.    pCmd = p->
5c00: 70 53 63 72 69 70 74 3b 0a 20 20 20 20 54 63 6c  pScript;.    Tcl
5c10: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43  _IncrRefCount(pC
5c20: 6d 64 29 3b 0a 20 20 20 20 72 63 20 3d 20 54 63  md);.    rc = Tc
5c30: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69  l_EvalObjEx(p->i
5c40: 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 30 29 3b  nterp, pCmd, 0);
5c50: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
5c60: 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 7d  Count(pCmd);.  }
5c70: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
5c80: 74 68 65 72 65 20 61 72 65 20 61 72 67 75 6d 65  there are argume
5c90: 6e 74 73 20 74 6f 20 74 68 65 20 66 75 6e 63 74  nts to the funct
5ca0: 69 6f 6e 2c 20 6d 61 6b 65 20 61 20 73 68 61 6c  ion, make a shal
5cb0: 6c 6f 77 20 63 6f 70 79 20 6f 66 20 74 68 65 0a  low copy of the.
5cc0: 20 20 20 20 2a 2a 20 73 63 72 69 70 74 20 6f 62      ** script ob
5cd0: 6a 65 63 74 2c 20 6c 61 70 70 65 6e 64 20 74 68  ject, lappend th
5ce0: 65 20 61 72 67 75 6d 65 6e 74 73 2c 20 74 68 65  e arguments, the
5cf0: 6e 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 63  n evaluate the c
5d00: 6f 70 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  opy..    **.    
5d10: 2a 2a 20 42 79 20 22 73 68 61 6c 6c 6f 77 22 20  ** By "shallow" 
5d20: 63 6f 70 79 2c 20 77 65 20 6d 65 61 6e 20 61 20  copy, we mean a 
5d30: 6f 6e 6c 79 20 74 68 65 20 6f 75 74 65 72 20 6c  only the outer l
5d40: 69 73 74 20 54 63 6c 5f 4f 62 6a 20 69 73 20 64  ist Tcl_Obj is d
5d50: 75 70 6c 69 63 61 74 65 64 2e 0a 20 20 20 20 2a  uplicated..    *
5d60: 2a 20 54 68 65 20 6e 65 77 20 54 63 6c 5f 4f 62  * The new Tcl_Ob
5d70: 6a 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74  j contains point
5d80: 65 72 73 20 74 6f 20 74 68 65 20 6f 72 69 67 69  ers to the origi
5d90: 6e 61 6c 20 6c 69 73 74 20 65 6c 65 6d 65 6e 74  nal list element
5da0: 73 2e 20 0a 20 20 20 20 2a 2a 20 54 68 61 74 20  s. .    ** That 
5db0: 77 61 79 2c 20 77 68 65 6e 20 54 63 6c 5f 45 76  way, when Tcl_Ev
5dc0: 61 6c 4f 62 6a 76 28 29 20 69 73 20 72 75 6e 20  alObjv() is run 
5dd0: 61 6e 64 20 73 68 69 6d 6d 65 72 73 20 74 68 65  and shimmers the
5de0: 20 66 69 72 73 74 20 65 6c 65 6d 65 6e 74 0a 20   first element. 
5df0: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6c 69 73     ** of the lis
5e00: 74 20 74 6f 20 74 63 6c 43 6d 64 4e 61 6d 65 54  t to tclCmdNameT
5e10: 79 70 65 2c 20 74 68 61 74 20 61 6c 74 65 72 6e  ype, that altern
5e20: 61 74 65 20 72 65 70 72 65 73 65 6e 74 61 74 69  ate representati
5e30: 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62  on will.    ** b
5e40: 65 20 70 72 65 73 65 72 76 65 64 20 61 6e 64 20  e preserved and 
5e50: 72 65 75 73 65 64 20 6f 6e 20 74 68 65 20 6e 65  reused on the ne
5e60: 78 74 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 20  xt invocation.. 
5e70: 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62     */.    Tcl_Ob
5e80: 6a 20 2a 2a 61 41 72 67 3b 0a 20 20 20 20 69 6e  j **aArg;.    in
5e90: 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 66 28 20  t nArg;.    if( 
5ea0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c  Tcl_ListObjGetEl
5eb0: 65 6d 65 6e 74 73 28 70 2d 3e 69 6e 74 65 72 70  ements(p->interp
5ec0: 2c 20 70 2d 3e 70 53 63 72 69 70 74 2c 20 26 6e  , p->pScript, &n
5ed0: 41 72 67 2c 20 26 61 41 72 67 29 20 29 7b 0a 20  Arg, &aArg) ){. 
5ee0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
5ef0: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
5f00: 74 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  t, Tcl_GetString
5f10: 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70  Result(p->interp
5f20: 29 2c 20 2d 31 29 3b 20 0a 20 20 20 20 20 20 72  ), -1); .      r
5f30: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 20 20 20 20  eturn;.    }    
5f40: 20 0a 20 20 20 20 70 43 6d 64 20 3d 20 54 63 6c   .    pCmd = Tcl
5f50: 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 6e 41 72 67  _NewListObj(nArg
5f60: 2c 20 61 41 72 67 29 3b 0a 20 20 20 20 54 63 6c  , aArg);.    Tcl
5f70: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43  _IncrRefCount(pC
5f80: 6d 64 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  md);.    for(i=0
5f90: 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a  ; i<argc; i++){.
5fa0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61        sqlite3_va
5fb0: 6c 75 65 20 2a 70 49 6e 20 3d 20 61 72 67 76 5b  lue *pIn = argv[
5fc0: 69 5d 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62  i];.      Tcl_Ob
5fd0: 6a 20 2a 70 56 61 6c 3b 0a 20 20 20 20 20 20 20  j *pVal;.       
5fe0: 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 53       .      /* S
5ff0: 65 74 20 70 56 61 6c 20 74 6f 20 63 6f 6e 74 61  et pVal to conta
6000: 69 6e 20 74 68 65 20 69 27 74 68 20 63 6f 6c 75  in the i'th colu
6010: 6d 6e 20 6f 66 20 74 68 69 73 20 72 6f 77 2e 20  mn of this row. 
6020: 2a 2f 0a 20 20 20 20 20 20 73 77 69 74 63 68 28  */.      switch(
6030: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
6040: 79 70 65 28 70 49 6e 29 20 29 7b 0a 20 20 20 20  ype(pIn) ){.    
6050: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
6060: 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 20 20  BLOB: {.        
6070: 20 20 69 6e 74 20 62 79 74 65 73 20 3d 20 73 71    int bytes = sq
6080: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
6090: 73 28 70 49 6e 29 3b 0a 20 20 20 20 20 20 20 20  s(pIn);.        
60a0: 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77    pVal = Tcl_New
60b0: 42 79 74 65 41 72 72 61 79 4f 62 6a 28 73 71 6c  ByteArrayObj(sql
60c0: 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28  ite3_value_blob(
60d0: 70 49 6e 29 2c 20 62 79 74 65 73 29 3b 0a 20 20  pIn), bytes);.  
60e0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
60f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6100: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54   case SQLITE_INT
6110: 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 20 20  EGER: {.        
6120: 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 76    sqlite_int64 v
6130: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
6140: 5f 69 6e 74 36 34 28 70 49 6e 29 3b 0a 20 20 20  _int64(pIn);.   
6150: 20 20 20 20 20 20 20 69 66 28 20 76 3e 3d 2d 32         if( v>=-2
6160: 31 34 37 34 38 33 36 34 37 20 26 26 20 76 3c 3d  147483647 && v<=
6170: 32 31 34 37 34 38 33 36 34 37 20 29 7b 0a 20 20  2147483647 ){.  
6180: 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d            pVal =
6190: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 28   Tcl_NewIntObj((
61a0: 69 6e 74 29 76 29 3b 0a 20 20 20 20 20 20 20 20  int)v);.        
61b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
61c0: 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f       pVal = Tcl_
61d0: 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 76 29  NewWideIntObj(v)
61e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
61f0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
6200: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6210: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f   case SQLITE_FLO
6220: 41 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  AT: {.          
6230: 64 6f 75 62 6c 65 20 72 20 3d 20 73 71 6c 69 74  double r = sqlit
6240: 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28  e3_value_double(
6250: 70 49 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pIn);.          
6260: 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 44 6f  pVal = Tcl_NewDo
6270: 75 62 6c 65 4f 62 6a 28 72 29 3b 0a 20 20 20 20  ubleObj(r);.    
6280: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6290: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63       }.        c
62a0: 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a  ase SQLITE_NULL:
62b0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 70 56 61   {.          pVa
62c0: 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  l = Tcl_NewStrin
62d0: 67 4f 62 6a 28 70 2d 3e 70 44 62 2d 3e 7a 4e 75  gObj(p->pDb->zNu
62e0: 6c 6c 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20  ll, -1);.       
62f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
6300: 20 20 7d 0a 20 20 20 20 20 20 20 20 64 65 66 61    }.        defa
6310: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  ult: {.         
6320: 20 69 6e 74 20 62 79 74 65 73 20 3d 20 73 71 6c   int bytes = sql
6330: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
6340: 28 70 49 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  (pIn);.         
6350: 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53   pVal = Tcl_NewS
6360: 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a  tringObj((char *
6370: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
6380: 65 78 74 28 70 49 6e 29 2c 20 62 79 74 65 73 29  ext(pIn), bytes)
6390: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
63a0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
63b0: 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
63c0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
63d0: 64 45 6c 65 6d 65 6e 74 28 70 2d 3e 69 6e 74 65  dElement(p->inte
63e0: 72 70 2c 20 70 43 6d 64 2c 20 70 56 61 6c 29 3b  rp, pCmd, pVal);
63f0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
6400: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63  .        Tcl_Dec
6410: 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b  rRefCount(pCmd);
6420: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6430: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
6440: 6e 74 65 78 74 2c 20 54 63 6c 5f 47 65 74 53 74  ntext, Tcl_GetSt
6450: 72 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e  ringResult(p->in
6460: 74 65 72 70 29 2c 20 2d 31 29 3b 20 0a 20 20 20  terp), -1); .   
6470: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
6480: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
6490: 66 28 20 21 70 2d 3e 75 73 65 45 76 61 6c 4f 62  f( !p->useEvalOb
64a0: 6a 76 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  jv ){.      /* T
64b0: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 29 20 77  cl_EvalObjEx() w
64c0: 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ill automaticall
64d0: 79 20 63 61 6c 6c 20 54 63 6c 5f 45 76 61 6c 4f  y call Tcl_EvalO
64e0: 62 6a 76 28 29 20 69 66 20 70 43 6d 64 0a 20 20  bjv() if pCmd.  
64f0: 20 20 20 20 2a 2a 20 69 73 20 61 20 6c 69 73 74      ** is a list
6500: 20 77 69 74 68 6f 75 74 20 61 20 73 74 72 69 6e   without a strin
6510: 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  g representation
6520: 2e 20 20 54 6f 20 70 72 65 76 65 6e 74 20 74 68  .  To prevent th
6530: 69 73 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a  is from.      **
6540: 20 68 61 70 70 65 6e 69 6e 67 2c 20 6d 61 6b 65   happening, make
6550: 20 73 75 72 65 20 70 43 6d 64 20 68 61 73 20 61   sure pCmd has a
6560: 20 76 61 6c 69 64 20 73 74 72 69 6e 67 20 72 65   valid string re
6570: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a  presentation */.
6580: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
6590: 69 6e 67 28 70 43 6d 64 29 3b 0a 20 20 20 20 7d  ing(pCmd);.    }
65a0: 0a 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 45 76  .    rc = Tcl_Ev
65b0: 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72  alObjEx(p->inter
65c0: 70 2c 20 70 43 6d 64 2c 20 54 43 4c 5f 45 56 41  p, pCmd, TCL_EVA
65d0: 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20 20 20 54  L_DIRECT);.    T
65e0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
65f0: 70 43 6d 64 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  pCmd);.  }..  if
6600: 28 20 72 63 20 26 26 20 72 63 21 3d 54 43 4c 5f  ( rc && rc!=TCL_
6610: 52 45 54 55 52 4e 20 29 7b 0a 20 20 20 20 73 71  RETURN ){.    sq
6620: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
6630: 6f 72 28 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f  or(context, Tcl_
6640: 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
6650: 70 2d 3e 69 6e 74 65 72 70 29 2c 20 2d 31 29 3b  p->interp), -1);
6660: 20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54   .  }else{.    T
6670: 63 6c 5f 4f 62 6a 20 2a 70 56 61 72 20 3d 20 54  cl_Obj *pVar = T
6680: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_GetObjResult(
6690: 70 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  p->interp);.    
66a0: 69 6e 74 20 6e 3b 0a 20 20 20 20 75 38 20 2a 64  int n;.    u8 *d
66b0: 61 74 61 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ata;.    const c
66c0: 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 28 70 56  har *zType = (pV
66d0: 61 72 2d 3e 74 79 70 65 50 74 72 20 3f 20 70 56  ar->typePtr ? pV
66e0: 61 72 2d 3e 74 79 70 65 50 74 72 2d 3e 6e 61 6d  ar->typePtr->nam
66f0: 65 20 3a 20 22 22 29 3b 0a 20 20 20 20 63 68 61  e : "");.    cha
6700: 72 20 63 20 3d 20 7a 54 79 70 65 5b 30 5d 3b 0a  r c = zType[0];.
6710: 20 20 20 20 69 66 28 20 63 3d 3d 27 62 27 20 26      if( c=='b' &
6720: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
6730: 62 79 74 65 61 72 72 61 79 22 29 3d 3d 30 20 26  bytearray")==0 &
6740: 26 20 70 56 61 72 2d 3e 62 79 74 65 73 3d 3d 30  & pVar->bytes==0
6750: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 6c   ){.      /* Onl
6760: 79 20 72 65 74 75 72 6e 20 61 20 42 4c 4f 42 20  y return a BLOB 
6770: 74 79 70 65 20 69 66 20 74 68 65 20 54 63 6c 20  type if the Tcl 
6780: 76 61 72 69 61 62 6c 65 20 69 73 20 61 20 62 79  variable is a by
6790: 74 65 61 72 72 61 79 20 61 6e 64 0a 20 20 20 20  tearray and.    
67a0: 20 20 2a 2a 20 68 61 73 20 6e 6f 20 73 74 72 69    ** has no stri
67b0: 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ng representatio
67c0: 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 64 61 74 61  n. */.      data
67d0: 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72   = Tcl_GetByteAr
67e0: 72 61 79 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c  rayFromObj(pVar,
67f0: 20 26 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   &n);.      sqli
6800: 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 28  te3_result_blob(
6810: 63 6f 6e 74 65 78 74 2c 20 64 61 74 61 2c 20 6e  context, data, n
6820: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
6830: 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  NT);.    }else i
6840: 66 28 20 63 3d 3d 27 62 27 20 26 26 20 73 74 72  f( c=='b' && str
6850: 63 6d 70 28 7a 54 79 70 65 2c 22 62 6f 6f 6c 65  cmp(zType,"boole
6860: 61 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  an")==0 ){.     
6870: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
6880: 62 6a 28 30 2c 20 70 56 61 72 2c 20 26 6e 29 3b  bj(0, pVar, &n);
6890: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
68a0: 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78  esult_int(contex
68b0: 74 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t, n);.    }else
68c0: 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20 73   if( c=='d' && s
68d0: 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 64 6f 75  trcmp(zType,"dou
68e0: 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ble")==0 ){.    
68f0: 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20    double r;.    
6900: 20 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46    Tcl_GetDoubleF
6910: 72 6f 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c 20  romObj(0, pVar, 
6920: 26 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  &r);.      sqlit
6930: 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65  e3_result_double
6940: 28 63 6f 6e 74 65 78 74 2c 20 72 29 3b 0a 20 20  (context, r);.  
6950: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63 3d 3d    }else if( (c==
6960: 27 77 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54  'w' && strcmp(zT
6970: 79 70 65 2c 22 77 69 64 65 49 6e 74 22 29 3d 3d  ype,"wideInt")==
6980: 30 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  0) ||.          
6990: 28 63 3d 3d 27 69 27 20 26 26 20 73 74 72 63 6d  (c=='i' && strcm
69a0: 70 28 7a 54 79 70 65 2c 22 69 6e 74 22 29 3d 3d  p(zType,"int")==
69b0: 30 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  0) ){.      Tcl_
69c0: 57 69 64 65 49 6e 74 20 76 3b 0a 20 20 20 20 20  WideInt v;.     
69d0: 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46   Tcl_GetWideIntF
69e0: 72 6f 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c 20  romObj(0, pVar, 
69f0: 26 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  &v);.      sqlit
6a00: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28  e3_result_int64(
6a10: 63 6f 6e 74 65 78 74 2c 20 76 29 3b 0a 20 20 20  context, v);.   
6a20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 61   }else{.      da
6a30: 74 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  ta = (unsigned c
6a40: 68 61 72 20 2a 29 54 63 6c 5f 47 65 74 53 74 72  har *)Tcl_GetStr
6a50: 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c  ingFromObj(pVar,
6a60: 20 26 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   &n);.      sqli
6a70: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
6a80: 63 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 20 2a  context, (char *
6a90: 29 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45  )data, n, SQLITE
6aa0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
6ab0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65   }.  }.}..#ifnde
6ac0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
6ad0: 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a  THORIZATION./*.*
6ae0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 61 75  * This is the au
6af0: 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 66 75 6e  thentication fun
6b00: 63 74 69 6f 6e 2e 20 20 49 74 20 61 70 70 65 6e  ction.  It appen
6b10: 64 73 20 74 68 65 20 61 75 74 68 65 6e 74 69 63  ds the authentic
6b20: 61 74 69 6f 6e 0a 2a 2a 20 74 79 70 65 20 63 6f  ation.** type co
6b30: 64 65 20 61 6e 64 20 74 68 65 20 74 77 6f 20 61  de and the two a
6b40: 72 67 75 6d 65 6e 74 73 20 74 6f 20 7a 43 6d 64  rguments to zCmd
6b50: 5b 5d 20 74 68 65 6e 20 69 6e 76 6f 6b 65 73 20  [] then invokes 
6b60: 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 6f 6e  the result.** on
6b70: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
6b80: 2e 20 20 54 68 65 20 72 65 70 6c 79 20 69 73 20  .  The reply is 
6b90: 65 78 61 6d 69 6e 65 64 20 74 6f 20 64 65 74 65  examined to dete
6ba0: 72 6d 69 6e 65 20 69 66 20 74 68 65 0a 2a 2a 20  rmine if the.** 
6bb0: 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 66  authentication f
6bc0: 61 69 6c 73 20 6f 72 20 73 75 63 63 65 65 64 73  ails or succeeds
6bd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6be0: 61 75 74 68 5f 63 61 6c 6c 62 61 63 6b 28 0a 20  auth_callback(. 
6bf0: 20 76 6f 69 64 20 2a 70 41 72 67 2c 0a 20 20 69   void *pArg,.  i
6c00: 6e 74 20 63 6f 64 65 2c 0a 20 20 63 6f 6e 73 74  nt code,.  const
6c10: 20 63 68 61 72 20 2a 7a 41 72 67 31 2c 0a 20 20   char *zArg1,.  
6c20: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
6c30: 32 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  2,.  const char 
6c40: 2a 7a 41 72 67 33 2c 0a 20 20 63 6f 6e 73 74 20  *zArg3,.  const 
6c50: 63 68 61 72 20 2a 7a 41 72 67 34 0a 29 7b 0a 20  char *zArg4.){. 
6c60: 20 63 68 61 72 20 2a 7a 43 6f 64 65 3b 0a 20 20   char *zCode;.  
6c70: 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b  Tcl_DString str;
6c80: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e  .  int rc;.  con
6c90: 73 74 20 63 68 61 72 20 2a 7a 52 65 70 6c 79 3b  st char *zReply;
6ca0: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
6cb0: 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 70 41   = (SqliteDb*)pA
6cc0: 72 67 3b 0a 20 20 69 66 28 20 70 44 62 2d 3e 64  rg;.  if( pDb->d
6cd0: 69 73 61 62 6c 65 41 75 74 68 20 29 20 72 65 74  isableAuth ) ret
6ce0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
6cf0: 20 20 73 77 69 74 63 68 28 20 63 6f 64 65 20 29    switch( code )
6d00: 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
6d10: 45 5f 43 4f 50 59 20 20 20 20 20 20 20 20 20 20  E_COPY          
6d20: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
6d30: 49 54 45 5f 43 4f 50 59 22 3b 20 62 72 65 61 6b  ITE_COPY"; break
6d40: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
6d50: 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 20 20  E_CREATE_INDEX  
6d60: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
6d70: 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58  ITE_CREATE_INDEX
6d80: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
6d90: 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45  se SQLITE_CREATE
6da0: 5f 54 41 42 4c 45 20 20 20 20 20 20 3a 20 7a 43  _TABLE      : zC
6db0: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41  ode="SQLITE_CREA
6dc0: 54 45 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b  TE_TABLE"; break
6dd0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
6de0: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e  E_CREATE_TEMP_IN
6df0: 44 45 58 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c  DEX : zCode="SQL
6e00: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
6e10: 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20  INDEX"; break;. 
6e20: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
6e30: 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45  REATE_TEMP_TABLE
6e40: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
6e50: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42  _CREATE_TEMP_TAB
6e60: 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  LE"; break;.    
6e70: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41  case SQLITE_CREA
6e80: 54 45 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 3a  TE_TEMP_TRIGGER:
6e90: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43   zCode="SQLITE_C
6ea0: 52 45 41 54 45 5f 54 45 4d 50 5f 54 52 49 47 47  REATE_TEMP_TRIGG
6eb0: 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  ER"; break;.    
6ec0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41  case SQLITE_CREA
6ed0: 54 45 5f 54 45 4d 50 5f 56 49 45 57 20 20 3a 20  TE_TEMP_VIEW  : 
6ee0: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52  zCode="SQLITE_CR
6ef0: 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 22 3b  EATE_TEMP_VIEW";
6f00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
6f10: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
6f20: 52 49 47 47 45 52 20 20 20 20 3a 20 7a 43 6f 64  RIGGER    : zCod
6f30: 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45  e="SQLITE_CREATE
6f40: 5f 54 52 49 47 47 45 52 22 3b 20 62 72 65 61 6b  _TRIGGER"; break
6f50: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
6f60: 45 5f 43 52 45 41 54 45 5f 56 49 45 57 20 20 20  E_CREATE_VIEW   
6f70: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
6f80: 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57 22  ITE_CREATE_VIEW"
6f90: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
6fa0: 65 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 20  e SQLITE_DELETE 
6fb0: 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f             : zCo
6fc0: 64 65 3d 22 53 51 4c 49 54 45 5f 44 45 4c 45 54  de="SQLITE_DELET
6fd0: 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  E"; break;.    c
6fe0: 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  ase SQLITE_DROP_
6ff0: 49 4e 44 45 58 20 20 20 20 20 20 20 20 3a 20 7a  INDEX        : z
7000: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f  Code="SQLITE_DRO
7010: 50 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b  P_INDEX"; break;
7020: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
7030: 5f 44 52 4f 50 5f 54 41 42 4c 45 20 20 20 20 20  _DROP_TABLE     
7040: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
7050: 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 22 3b 20  TE_DROP_TABLE"; 
7060: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
7070: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
7080: 5f 49 4e 44 45 58 20 20 20 3a 20 7a 43 6f 64 65  _INDEX   : zCode
7090: 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  ="SQLITE_DROP_TE
70a0: 4d 50 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b  MP_INDEX"; break
70b0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
70c0: 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c  E_DROP_TEMP_TABL
70d0: 45 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c  E   : zCode="SQL
70e0: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41  ITE_DROP_TEMP_TA
70f0: 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  BLE"; break;.   
7100: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f   case SQLITE_DRO
7110: 50 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 20 3a  P_TEMP_TRIGGER :
7120: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44   zCode="SQLITE_D
7130: 52 4f 50 5f 54 45 4d 50 5f 54 52 49 47 47 45 52  ROP_TEMP_TRIGGER
7140: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
7150: 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54  se SQLITE_DROP_T
7160: 45 4d 50 5f 56 49 45 57 20 20 20 20 3a 20 7a 43  EMP_VIEW    : zC
7170: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50  ode="SQLITE_DROP
7180: 5f 54 45 4d 50 5f 56 49 45 57 22 3b 20 62 72 65  _TEMP_VIEW"; bre
7190: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
71a0: 49 54 45 5f 44 52 4f 50 5f 54 52 49 47 47 45 52  ITE_DROP_TRIGGER
71b0: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
71c0: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 52 49 47 47  QLITE_DROP_TRIGG
71d0: 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  ER"; break;.    
71e0: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50  case SQLITE_DROP
71f0: 5f 56 49 45 57 20 20 20 20 20 20 20 20 20 3a 20  _VIEW         : 
7200: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52  zCode="SQLITE_DR
7210: 4f 50 5f 56 49 45 57 22 3b 20 62 72 65 61 6b 3b  OP_VIEW"; break;
7220: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
7230: 5f 49 4e 53 45 52 54 20 20 20 20 20 20 20 20 20  _INSERT         
7240: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
7250: 54 45 5f 49 4e 53 45 52 54 22 3b 20 62 72 65 61  TE_INSERT"; brea
7260: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
7270: 54 45 5f 50 52 41 47 4d 41 20 20 20 20 20 20 20  TE_PRAGMA       
7280: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
7290: 4c 49 54 45 5f 50 52 41 47 4d 41 22 3b 20 62 72  LITE_PRAGMA"; br
72a0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
72b0: 4c 49 54 45 5f 52 45 41 44 20 20 20 20 20 20 20  LITE_READ       
72c0: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
72d0: 53 51 4c 49 54 45 5f 52 45 41 44 22 3b 20 62 72  SQLITE_READ"; br
72e0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
72f0: 4c 49 54 45 5f 53 45 4c 45 43 54 20 20 20 20 20  LITE_SELECT     
7300: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
7310: 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 22 3b 20  SQLITE_SELECT"; 
7320: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
7330: 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49  SQLITE_TRANSACTI
7340: 4f 4e 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65  ON       : zCode
7350: 3d 22 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43  ="SQLITE_TRANSAC
7360: 54 49 4f 4e 22 3b 20 62 72 65 61 6b 3b 0a 20 20  TION"; break;.  
7370: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55 50    case SQLITE_UP
7380: 44 41 54 45 20 20 20 20 20 20 20 20 20 20 20 20  DATE            
7390: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
73a0: 55 50 44 41 54 45 22 3b 20 62 72 65 61 6b 3b 0a  UPDATE"; break;.
73b0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
73c0: 41 54 54 41 43 48 20 20 20 20 20 20 20 20 20 20  ATTACH          
73d0: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
73e0: 45 5f 41 54 54 41 43 48 22 3b 20 62 72 65 61 6b  E_ATTACH"; break
73f0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
7400: 45 5f 44 45 54 41 43 48 20 20 20 20 20 20 20 20  E_DETACH        
7410: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
7420: 49 54 45 5f 44 45 54 41 43 48 22 3b 20 62 72 65  ITE_DETACH"; bre
7430: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
7440: 49 54 45 5f 41 4c 54 45 52 5f 54 41 42 4c 45 20  ITE_ALTER_TABLE 
7450: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
7460: 51 4c 49 54 45 5f 41 4c 54 45 52 5f 54 41 42 4c  QLITE_ALTER_TABL
7470: 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  E"; break;.    c
7480: 61 73 65 20 53 51 4c 49 54 45 5f 52 45 49 4e 44  ase SQLITE_REIND
7490: 45 58 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a  EX           : z
74a0: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 52 45 49  Code="SQLITE_REI
74b0: 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20  NDEX"; break;.  
74c0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 4e    case SQLITE_AN
74d0: 41 4c 59 5a 45 20 20 20 20 20 20 20 20 20 20 20  ALYZE           
74e0: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
74f0: 41 4e 41 4c 59 5a 45 22 3b 20 62 72 65 61 6b 3b  ANALYZE"; break;
7500: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
7510: 5f 43 52 45 41 54 45 5f 56 54 41 42 4c 45 20 20  _CREATE_VTABLE  
7520: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
7530: 54 45 5f 43 52 45 41 54 45 5f 56 54 41 42 4c 45  TE_CREATE_VTABLE
7540: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
7550: 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56  se SQLITE_DROP_V
7560: 54 41 42 4c 45 20 20 20 20 20 20 20 3a 20 7a 43  TABLE       : zC
7570: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50  ode="SQLITE_DROP
7580: 5f 56 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b  _VTABLE"; break;
7590: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
75a0: 5f 46 55 4e 43 54 49 4f 4e 20 20 20 20 20 20 20  _FUNCTION       
75b0: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
75c0: 54 45 5f 46 55 4e 43 54 49 4f 4e 22 3b 20 62 72  TE_FUNCTION"; br
75d0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
75e0: 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e 54 20 20  LITE_SAVEPOINT  
75f0: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
7600: 53 51 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e 54  SQLITE_SAVEPOINT
7610: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65  "; break;.    de
7620: 66 61 75 6c 74 20 20 20 20 20 20 20 20 20 20 20  fault           
7630: 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43              : zC
7640: 6f 64 65 3d 22 3f 3f 3f 3f 22 3b 20 62 72 65 61  ode="????"; brea
7650: 6b 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 44 53 74  k;.  }.  Tcl_DSt
7660: 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a  ringInit(&str);.
7670: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
7680: 65 6e 64 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a  end(&str, pDb->z
7690: 41 75 74 68 2c 20 2d 31 29 3b 0a 20 20 54 63 6c  Auth, -1);.  Tcl
76a0: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c  _DStringAppendEl
76b0: 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 43 6f 64  ement(&str, zCod
76c0: 65 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  e);.  Tcl_DStrin
76d0: 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26  gAppendElement(&
76e0: 73 74 72 2c 20 7a 41 72 67 31 20 3f 20 7a 41 72  str, zArg1 ? zAr
76f0: 67 31 20 3a 20 22 22 29 3b 0a 20 20 54 63 6c 5f  g1 : "");.  Tcl_
7700: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65  DStringAppendEle
7710: 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41 72 67 32  ment(&str, zArg2
7720: 20 3f 20 7a 41 72 67 32 20 3a 20 22 22 29 3b 0a   ? zArg2 : "");.
7730: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
7740: 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c  endElement(&str,
7750: 20 7a 41 72 67 33 20 3f 20 7a 41 72 67 33 20 3a   zArg3 ? zArg3 :
7760: 20 22 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72   "");.  Tcl_DStr
7770: 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ingAppendElement
7780: 28 26 73 74 72 2c 20 7a 41 72 67 34 20 3f 20 7a  (&str, zArg4 ? z
7790: 41 72 67 34 20 3a 20 22 22 29 3b 0a 20 20 72 63  Arg4 : "");.  rc
77a0: 20 3d 20 54 63 6c 5f 47 6c 6f 62 61 6c 45 76 61   = Tcl_GlobalEva
77b0: 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 54  l(pDb->interp, T
77c0: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28  cl_DStringValue(
77d0: 26 73 74 72 29 29 3b 0a 20 20 54 63 6c 5f 44 53  &str));.  Tcl_DS
77e0: 74 72 69 6e 67 46 72 65 65 28 26 73 74 72 29 3b  tringFree(&str);
77f0: 0a 20 20 7a 52 65 70 6c 79 20 3d 20 72 63 3d 3d  .  zReply = rc==
7800: 54 43 4c 5f 4f 4b 20 3f 20 54 63 6c 5f 47 65 74  TCL_OK ? Tcl_Get
7810: 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62  StringResult(pDb
7820: 2d 3e 69 6e 74 65 72 70 29 20 3a 20 22 53 51 4c  ->interp) : "SQL
7830: 49 54 45 5f 44 45 4e 59 22 3b 0a 20 20 69 66 28  ITE_DENY";.  if(
7840: 20 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22   strcmp(zReply,"
7850: 53 51 4c 49 54 45 5f 4f 4b 22 29 3d 3d 30 20 29  SQLITE_OK")==0 )
7860: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
7870: 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  E_OK;.  }else if
7880: 28 20 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c  ( strcmp(zReply,
7890: 22 53 51 4c 49 54 45 5f 44 45 4e 59 22 29 3d 3d  "SQLITE_DENY")==
78a0: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
78b0: 4c 49 54 45 5f 44 45 4e 59 3b 0a 20 20 7d 65 6c  LITE_DENY;.  }el
78c0: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 52  se if( strcmp(zR
78d0: 65 70 6c 79 2c 22 53 51 4c 49 54 45 5f 49 47 4e  eply,"SQLITE_IGN
78e0: 4f 52 45 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ORE")==0 ){.    
78f0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 47 4e 4f  rc = SQLITE_IGNO
7900: 52 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  RE;.  }else{.   
7910: 20 72 63 20 3d 20 39 39 39 3b 0a 20 20 7d 0a 20   rc = 999;.  }. 
7920: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
7930: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
7940: 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
7950: 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  N */../*.** This
7960: 20 72 6f 75 74 69 6e 65 20 72 65 61 64 73 20 61   routine reads a
7970: 20 6c 69 6e 65 20 6f 66 20 74 65 78 74 20 66 72   line of text fr
7980: 6f 6d 20 46 49 4c 45 20 69 6e 2c 20 73 74 6f 72  om FILE in, stor
7990: 65 73 0a 2a 2a 20 74 68 65 20 74 65 78 74 20 69  es.** the text i
79a0: 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  n memory obtaine
79b0: 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20  d from malloc() 
79c0: 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 70 6f  and returns a po
79d0: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
79e0: 74 65 78 74 2e 20 20 4e 55 4c 4c 20 69 73 20 72  text.  NULL is r
79f0: 65 74 75 72 6e 65 64 20 61 74 20 65 6e 64 20 6f  eturned at end o
7a00: 66 20 66 69 6c 65 2c 20 6f 72 20 69 66 20 6d 61  f file, or if ma
7a10: 6c 6c 6f 63 28 29 0a 2a 2a 20 66 61 69 6c 73 2e  lloc().** fails.
7a20: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72  .**.** The inter
7a30: 66 61 63 65 20 69 73 20 6c 69 6b 65 20 22 72 65  face is like "re
7a40: 61 64 6c 69 6e 65 22 20 62 75 74 20 6e 6f 20 63  adline" but no c
7a50: 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 65 64 69 74  ommand-line edit
7a60: 69 6e 67 0a 2a 2a 20 69 73 20 64 6f 6e 65 2e 0a  ing.** is done..
7a70: 2a 2a 0a 2a 2a 20 63 6f 70 69 65 64 20 66 72 6f  **.** copied fro
7a80: 6d 20 73 68 65 6c 6c 2e 63 20 66 72 6f 6d 20 27  m shell.c from '
7a90: 2e 69 6d 70 6f 72 74 27 20 63 6f 6d 6d 61 6e 64  .import' command
7aa0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
7ab0: 2a 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 63  *local_getline(c
7ac0: 68 61 72 20 2a 7a 50 72 6f 6d 70 74 2c 20 46 49  har *zPrompt, FI
7ad0: 4c 45 20 2a 69 6e 29 7b 0a 20 20 63 68 61 72 20  LE *in){.  char 
7ae0: 2a 7a 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 4c  *zLine;.  int nL
7af0: 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20  ine;.  int n;.. 
7b00: 20 6e 4c 69 6e 65 20 3d 20 31 30 30 3b 0a 20 20   nLine = 100;.  
7b10: 7a 4c 69 6e 65 20 3d 20 6d 61 6c 6c 6f 63 28 20  zLine = malloc( 
7b20: 6e 4c 69 6e 65 20 29 3b 0a 20 20 69 66 28 20 7a  nLine );.  if( z
7b30: 4c 69 6e 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Line==0 ) return
7b40: 20 30 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 77   0;.  n = 0;.  w
7b50: 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69  hile( 1 ){.    i
7b60: 66 28 20 6e 2b 31 30 30 3e 6e 4c 69 6e 65 20 29  f( n+100>nLine )
7b70: 7b 0a 20 20 20 20 20 20 6e 4c 69 6e 65 20 3d 20  {.      nLine = 
7b80: 6e 4c 69 6e 65 2a 32 20 2b 20 31 30 30 3b 0a 20  nLine*2 + 100;. 
7b90: 20 20 20 20 20 7a 4c 69 6e 65 20 3d 20 72 65 61       zLine = rea
7ba0: 6c 6c 6f 63 28 7a 4c 69 6e 65 2c 20 6e 4c 69 6e  lloc(zLine, nLin
7bb0: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4c  e);.      if( zL
7bc0: 69 6e 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ine==0 ) return 
7bd0: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
7be0: 20 66 67 65 74 73 28 26 7a 4c 69 6e 65 5b 6e 5d   fgets(&zLine[n]
7bf0: 2c 20 6e 4c 69 6e 65 20 2d 20 6e 2c 20 69 6e 29  , nLine - n, in)
7c00: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
7c10: 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   n==0 ){.       
7c20: 20 66 72 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20   free(zLine);.  
7c30: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
7c40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4c        }.      zL
7c50: 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20  ine[n] = 0;.    
7c60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
7c70: 20 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b     while( zLine[
7c80: 6e 5d 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 20  n] ){ n++; }.   
7c90: 20 69 66 28 20 6e 3e 30 20 26 26 20 7a 4c 69 6e   if( n>0 && zLin
7ca0: 65 5b 6e 2d 31 5d 3d 3d 27 5c 6e 27 20 29 7b 0a  e[n-1]=='\n' ){.
7cb0: 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20        n--;.     
7cc0: 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20   zLine[n] = 0;. 
7cd0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7ce0: 7d 0a 20 20 7d 0a 20 20 7a 4c 69 6e 65 20 3d 20  }.  }.  zLine = 
7cf0: 72 65 61 6c 6c 6f 63 28 20 7a 4c 69 6e 65 2c 20  realloc( zLine, 
7d00: 6e 2b 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  n+1 );.  return 
7d10: 7a 4c 69 6e 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  zLine;.}.../*.**
7d20: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
7d30: 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6d  s part of the im
7d40: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
7d50: 74 68 65 20 63 6f 6d 6d 61 6e 64 3a 0a 2a 2a 0a  the command:.**.
7d60: 2a 2a 20 20 20 24 64 62 20 74 72 61 6e 73 61 63  **   $db transac
7d70: 74 69 6f 6e 20 5b 2d 64 65 66 65 72 72 65 64 7c  tion [-deferred|
7d80: 2d 69 6d 6d 65 64 69 61 74 65 7c 2d 65 78 63 6c  -immediate|-excl
7d90: 75 73 69 76 65 5d 20 53 43 52 49 50 54 0a 2a 2a  usive] SCRIPT.**
7da0: 0a 2a 2a 20 49 74 20 69 73 20 69 6e 76 6f 6b 65  .** It is invoke
7db0: 64 20 61 66 74 65 72 20 65 76 61 6c 75 61 74 69  d after evaluati
7dc0: 6e 67 20 74 68 65 20 73 63 72 69 70 74 20 53 43  ng the script SC
7dd0: 52 49 50 54 20 74 6f 20 63 6f 6d 6d 69 74 20 6f  RIPT to commit o
7de0: 72 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 74 68  r rollback.** th
7df0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72  e transaction or
7e00: 20 73 61 76 65 70 6f 69 6e 74 20 6f 70 65 6e 65   savepoint opene
7e10: 64 20 62 79 20 74 68 65 20 5b 74 72 61 6e 73 61  d by the [transa
7e20: 63 74 69 6f 6e 5d 20 63 6f 6d 6d 61 6e 64 2e 0a  ction] command..
7e30: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62  */.static int Db
7e40: 54 72 61 6e 73 50 6f 73 74 43 6d 64 28 0a 20 20  TransPostCmd(.  
7e50: 43 6c 69 65 6e 74 44 61 74 61 20 64 61 74 61 5b  ClientData data[
7e60: 5d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ],              
7e70: 20 20 20 20 20 2f 2a 20 64 61 74 61 5b 30 5d 20       /* data[0] 
7e80: 69 73 20 74 68 65 20 53 71 6c 69 74 65 33 44 62  is the Sqlite3Db
7e90: 2a 20 66 6f 72 20 24 64 62 20 2a 2f 0a 20 20 54  * for $db */.  T
7ea0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
7eb0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
7ec0: 20 20 20 20 2f 2a 20 54 63 6c 20 69 6e 74 65 72      /* Tcl inter
7ed0: 70 72 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  preter */.  int 
7ee0: 72 65 73 75 6c 74 20 20 20 20 20 20 20 20 20 20  result          
7ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f00: 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 65 76   /* Result of ev
7f10: 61 6c 75 61 74 69 6e 67 20 53 43 52 49 50 54 20  aluating SCRIPT 
7f20: 2a 2f 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 63  */.){.  static c
7f30: 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 45 6e 64  onst char *azEnd
7f40: 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 52 45 4c 45  [] = {.    "RELE
7f50: 41 53 45 20 5f 74 63 6c 5f 74 72 61 6e 73 61 63  ASE _tcl_transac
7f60: 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 2f 2a  tion",        /*
7f70: 20 72 63 3d 3d 54 43 4c 5f 45 52 52 4f 52 2c 20   rc==TCL_ERROR, 
7f80: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d 30 20  nTransaction!=0 
7f90: 2a 2f 0a 20 20 20 20 22 43 4f 4d 4d 49 54 22 2c  */.    "COMMIT",
7fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 63 21            /* rc!
7fc0: 3d 54 43 4c 5f 45 52 52 4f 52 2c 20 6e 54 72 61  =TCL_ERROR, nTra
7fd0: 6e 73 61 63 74 69 6f 6e 3d 3d 30 20 2a 2f 0a 20  nsaction==0 */. 
7fe0: 20 20 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20     "ROLLBACK TO 
7ff0: 5f 74 63 6c 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _tcl_transaction
8000: 20 3b 20 52 45 4c 45 41 53 45 20 5f 74 63 6c 5f   ; RELEASE _tcl_
8010: 74 72 61 6e 73 61 63 74 69 6f 6e 22 2c 0a 20 20  transaction",.  
8020: 20 20 22 52 4f 4c 4c 42 41 43 4b 22 20 20 20 20    "ROLLBACK"    
8030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8040: 20 20 20 20 20 2f 2a 20 72 63 3d 3d 54 43 4c 5f       /* rc==TCL_
8050: 45 52 52 4f 52 2c 20 6e 54 72 61 6e 73 61 63 74  ERROR, nTransact
8060: 69 6f 6e 3d 3d 30 20 2a 2f 0a 20 20 7d 3b 0a 20  ion==0 */.  };. 
8070: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
8080: 20 28 53 71 6c 69 74 65 44 62 2a 29 64 61 74 61   (SqliteDb*)data
8090: 5b 30 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  [0];.  int rc = 
80a0: 72 65 73 75 6c 74 3b 0a 20 20 63 6f 6e 73 74 20  result;.  const 
80b0: 63 68 61 72 20 2a 7a 45 6e 64 3b 0a 0a 20 20 70  char *zEnd;..  p
80c0: 44 62 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Db->nTransaction
80d0: 2d 2d 3b 0a 20 20 7a 45 6e 64 20 3d 20 61 7a 45  --;.  zEnd = azE
80e0: 6e 64 5b 28 72 63 3d 3d 54 43 4c 5f 45 52 52 4f  nd[(rc==TCL_ERRO
80f0: 52 29 2a 32 20 2b 20 28 70 44 62 2d 3e 6e 54 72  R)*2 + (pDb->nTr
8100: 61 6e 73 61 63 74 69 6f 6e 3d 3d 30 29 5d 3b 0a  ansaction==0)];.
8110: 0a 20 20 70 44 62 2d 3e 64 69 73 61 62 6c 65 41  .  pDb->disableA
8120: 75 74 68 2b 2b 3b 0a 20 20 69 66 28 20 73 71 6c  uth++;.  if( sql
8130: 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64  ite3_exec(pDb->d
8140: 62 2c 20 7a 45 6e 64 2c 20 30 2c 20 30 2c 20 30  b, zEnd, 0, 0, 0
8150: 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  ) ){.      /* Th
8160: 69 73 20 69 73 20 61 20 74 72 69 63 6b 79 20 73  is is a tricky s
8170: 63 65 6e 61 72 69 6f 20 74 6f 20 68 61 6e 64 6c  cenario to handl
8180: 65 2e 20 54 68 65 20 6d 6f 73 74 20 6c 69 6b 65  e. The most like
8190: 6c 79 20 63 61 75 73 65 20 6f 66 20 61 6e 0a 20  ly cause of an. 
81a0: 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 69 73       ** error is
81b0: 20 74 68 61 74 20 74 68 65 20 65 78 65 63 28 29   that the exec()
81c0: 20 61 62 6f 76 65 20 77 61 73 20 61 6e 20 61 74   above was an at
81d0: 74 65 6d 70 74 20 74 6f 20 63 6f 6d 6d 69 74 20  tempt to commit 
81e0: 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f  the .      ** to
81f0: 70 2d 6c 65 76 65 6c 20 74 72 61 6e 73 61 63 74  p-level transact
8200: 69 6f 6e 20 74 68 61 74 20 72 65 74 75 72 6e 65  ion that returne
8210: 64 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 4f  d SQLITE_BUSY. O
8220: 72 2c 20 6c 65 73 73 20 6c 69 6b 65 6c 79 2c 0a  r, less likely,.
8230: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 61 6e        ** that an
8240: 20 49 4f 2d 65 72 72 6f 72 20 68 61 73 20 6f 63   IO-error has oc
8250: 63 75 72 65 64 2e 20 49 6e 20 65 69 74 68 65 72  cured. In either
8260: 20 63 61 73 65 2c 20 74 68 72 6f 77 20 61 20 54   case, throw a T
8270: 63 6c 20 65 78 63 65 70 74 69 6f 6e 0a 20 20 20  cl exception.   
8280: 20 20 20 2a 2a 20 61 6e 64 20 74 72 79 20 74 6f     ** and try to
8290: 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72   rollback the tr
82a0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20  ansaction..     
82b0: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 42 75 74   **.      ** But
82c0: 20 69 74 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62   it could also b
82d0: 65 20 74 68 61 74 20 74 68 65 20 75 73 65 72 20  e that the user 
82e0: 65 78 65 63 75 74 65 64 20 6f 6e 65 20 6f 72 20  executed one or 
82f0: 6d 6f 72 65 20 42 45 47 49 4e 2c 20 0a 20 20 20  more BEGIN, .   
8300: 20 20 20 2a 2a 20 43 4f 4d 4d 49 54 2c 20 53 41     ** COMMIT, SA
8310: 56 45 50 4f 49 4e 54 2c 20 52 45 4c 45 41 53 45  VEPOINT, RELEASE
8320: 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 63 6f 6d   or ROLLBACK com
8330: 6d 61 6e 64 73 20 74 68 61 74 20 61 72 65 20 63  mands that are c
8340: 6f 6e 66 75 73 69 6e 67 0a 20 20 20 20 20 20 2a  onfusing.      *
8350: 2a 20 74 68 69 73 20 6d 65 74 68 6f 64 27 73 20  * this method's 
8360: 6c 6f 67 69 63 2e 20 4e 6f 74 20 63 6c 65 61 72  logic. Not clear
8370: 20 68 6f 77 20 74 68 69 73 20 77 6f 75 6c 64 20   how this would 
8380: 62 65 20 62 65 73 74 20 68 61 6e 64 6c 65 64 2e  be best handled.
8390: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  .      */.    if
83a0: 28 20 72 63 21 3d 54 43 4c 5f 45 52 52 4f 52 20  ( rc!=TCL_ERROR 
83b0: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
83c0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
83d0: 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
83e0: 28 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20  (pDb->db), 0);. 
83f0: 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52       rc = TCL_ER
8400: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ROR;.    }.    s
8410: 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d  qlite3_exec(pDb-
8420: 3e 64 62 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c  >db, "ROLLBACK",
8430: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20   0, 0, 0);.  }. 
8440: 20 70 44 62 2d 3e 64 69 73 61 62 6c 65 41 75 74   pDb->disableAut
8450: 68 2d 2d 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  h--;..  return r
8460: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65  c;.}../*.** Unle
8470: 73 73 20 53 51 4c 49 54 45 5f 54 45 53 54 20 69  ss SQLITE_TEST i
8480: 73 20 64 65 66 69 6e 65 64 2c 20 74 68 69 73 20  s defined, this 
8490: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 73 69  function is a si
84a0: 6d 70 6c 65 20 77 72 61 70 70 65 72 20 61 72 6f  mple wrapper aro
84b0: 75 6e 64 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 70  und.** sqlite3_p
84c0: 72 65 70 61 72 65 5f 76 32 28 29 2e 20 49 66 20  repare_v2(). If 
84d0: 53 51 4c 49 54 45 5f 54 45 53 54 20 69 73 20 64  SQLITE_TEST is d
84e0: 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 69 74 20  efined, then it 
84f0: 75 73 65 73 20 65 69 74 68 65 72 0a 2a 2a 20 73  uses either.** s
8500: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
8510: 32 28 29 20 6f 72 20 6c 65 67 61 63 79 20 69 6e  2() or legacy in
8520: 74 65 72 66 61 63 65 20 73 71 6c 69 74 65 33 5f  terface sqlite3_
8530: 70 72 65 70 61 72 65 28 29 2c 20 64 65 70 65 6e  prepare(), depen
8540: 64 69 6e 67 0a 2a 2a 20 6f 6e 20 77 68 65 74 68  ding.** on wheth
8550: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 5b 64  er or not the [d
8560: 62 5f 75 73 65 5f 6c 65 67 61 63 79 5f 70 72 65  b_use_legacy_pre
8570: 70 61 72 65 5d 20 63 6f 6d 6d 61 6e 64 20 68 61  pare] command ha
8580: 73 20 62 65 65 6e 20 75 73 65 64 20 74 6f 20 0a  s been used to .
8590: 2a 2a 20 63 6f 6e 66 69 67 75 72 65 20 74 68 65  ** configure the
85a0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
85b0: 73 74 61 74 69 63 20 69 6e 74 20 64 62 50 72 65  static int dbPre
85c0: 70 61 72 65 28 0a 20 20 53 71 6c 69 74 65 44 62  pare(.  SqliteDb
85d0: 20 2a 70 44 62 2c 20 20 20 20 20 20 20 20 20 20   *pDb,          
85e0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
85f0: 61 73 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ase object */.  
8600: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
8610: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
8620: 2f 2a 20 53 51 4c 20 74 6f 20 63 6f 6d 70 69 6c  /* SQL to compil
8630: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  e */.  sqlite3_s
8640: 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 20 20 20  tmt **ppStmt,   
8650: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50         /* OUT: P
8660: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
8670: 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
8680: 72 20 2a 2a 70 7a 4f 75 74 20 20 20 20 20 20 20  r **pzOut       
8690: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50         /* OUT: P
86a0: 6f 69 6e 74 65 72 20 74 6f 20 6e 65 78 74 20 53  ointer to next S
86b0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  QL statement */.
86c0: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
86d0: 5f 54 45 53 54 0a 20 20 69 66 28 20 70 44 62 2d  _TEST.  if( pDb-
86e0: 3e 62 4c 65 67 61 63 79 50 72 65 70 61 72 65 20  >bLegacyPrepare 
86f0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  ){.    return sq
8700: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 70 44  lite3_prepare(pD
8710: 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  b->db, zSql, -1,
8720: 20 70 70 53 74 6d 74 2c 20 70 7a 4f 75 74 29 3b   ppStmt, pzOut);
8730: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
8740: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 70 72 65  turn sqlite3_pre
8750: 70 61 72 65 5f 76 32 28 70 44 62 2d 3e 64 62 2c  pare_v2(pDb->db,
8760: 20 7a 53 71 6c 2c 20 2d 31 2c 20 70 70 53 74 6d   zSql, -1, ppStm
8770: 74 2c 20 70 7a 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a  t, pzOut);.}../*
8780: 0a 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20 63  .** Search the c
8790: 61 63 68 65 20 66 6f 72 20 61 20 70 72 65 70 61  ache for a prepa
87a0: 72 65 64 2d 73 74 61 74 65 6d 65 6e 74 20 6f 62  red-statement ob
87b0: 6a 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d  ject that implem
87c0: 65 6e 74 73 20 74 68 65 0a 2a 2a 20 66 69 72 73  ents the.** firs
87d0: 74 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  t SQL statement 
87e0: 69 6e 20 74 68 65 20 62 75 66 66 65 72 20 70 6f  in the buffer po
87f0: 69 6e 74 65 64 20 74 6f 20 62 79 20 70 61 72 61  inted to by para
8800: 6d 65 74 65 72 20 7a 49 6e 2e 20 49 66 0a 2a 2a  meter zIn. If.**
8810: 20 6e 6f 20 73 75 63 68 20 70 72 65 70 61 72 65   no such prepare
8820: 64 2d 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 20  d-statement can 
8830: 62 65 20 66 6f 75 6e 64 2c 20 61 6c 6c 6f 63 61  be found, alloca
8840: 74 65 20 61 6e 64 20 70 72 65 70 61 72 65 20 61  te and prepare a
8850: 20 6e 65 77 0a 2a 2a 20 6f 6e 65 2e 20 49 6e 20   new.** one. In 
8860: 65 69 74 68 65 72 20 63 61 73 65 2c 20 62 69 6e  either case, bin
8870: 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  d the current va
8880: 6c 75 65 73 20 6f 66 20 74 68 65 20 72 65 6c 65  lues of the rele
8890: 76 61 6e 74 20 54 63 6c 0a 2a 2a 20 76 61 72 69  vant Tcl.** vari
88a0: 61 62 6c 65 73 20 74 6f 20 61 6e 79 20 24 76 61  ables to any $va
88b0: 72 2c 20 3a 76 61 72 20 6f 72 20 40 76 61 72 20  r, :var or @var 
88c0: 76 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68 65  variables in the
88d0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 42 65 66 6f   statement. Befo
88e0: 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2c  re.** returning,
88f0: 20 73 65 74 20 2a 70 70 50 72 65 53 74 6d 74 20   set *ppPreStmt 
8900: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
8910: 70 72 65 70 61 72 65 64 2d 73 74 61 74 65 6d 65  prepared-stateme
8920: 6e 74 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a  nt object..**.**
8930: 20 4f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65   Output paramete
8940: 72 20 2a 70 7a 4f 75 74 20 69 73 20 73 65 74 20  r *pzOut is set 
8950: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
8960: 6e 65 78 74 20 53 51 4c 20 73 74 61 74 65 6d 65  next SQL stateme
8970: 6e 74 20 69 6e 0a 2a 2a 20 62 75 66 66 65 72 20  nt in.** buffer 
8980: 7a 49 6e 2c 20 6f 72 20 74 6f 20 74 68 65 20 27  zIn, or to the '
8990: 5c 30 27 20 62 79 74 65 20 61 74 20 74 68 65 20  \0' byte at the 
89a0: 65 6e 64 20 6f 66 20 7a 49 6e 20 69 66 20 74 68  end of zIn if th
89b0: 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 6e 65 78  ere is no.** nex
89c0: 74 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  t statement..**.
89d0: 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
89e0: 2c 20 54 43 4c 5f 4f 4b 20 69 73 20 72 65 74 75  , TCL_OK is retu
89f0: 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
8a00: 20 54 43 4c 5f 45 52 52 4f 52 20 69 73 20 72 65   TCL_ERROR is re
8a10: 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 61 6e  turned.** and an
8a20: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6c   error message l
8a30: 6f 61 64 65 64 20 69 6e 74 6f 20 69 6e 74 65 72  oaded into inter
8a40: 70 72 65 74 65 72 20 70 44 62 2d 3e 69 6e 74 65  preter pDb->inte
8a50: 72 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rp..*/.static in
8a60: 74 20 64 62 50 72 65 70 61 72 65 41 6e 64 42 69  t dbPrepareAndBi
8a70: 6e 64 28 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  nd(.  SqliteDb *
8a80: 70 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  pDb,            
8a90: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
8aa0: 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68  e object */.  ch
8ab0: 61 72 20 63 6f 6e 73 74 20 2a 7a 49 6e 2c 20 20  ar const *zIn,  
8ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8ad0: 20 53 51 4c 20 74 6f 20 63 6f 6d 70 69 6c 65 20   SQL to compile 
8ae0: 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  */.  char const 
8af0: 2a 2a 70 7a 4f 75 74 2c 20 20 20 20 20 20 20 20  **pzOut,        
8b00: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 69       /* OUT: Poi
8b10: 6e 74 65 72 20 74 6f 20 6e 65 78 74 20 53 51 4c  nter to next SQL
8b20: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
8b30: 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20  SqlPreparedStmt 
8b40: 2a 2a 70 70 50 72 65 53 74 6d 74 20 20 20 20 20  **ppPreStmt     
8b50: 2f 2a 20 4f 55 54 3a 20 4f 62 6a 65 63 74 20 75  /* OUT: Object u
8b60: 73 65 64 20 74 6f 20 63 61 63 68 65 20 73 74 61  sed to cache sta
8b70: 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63  tement */.){.  c
8b80: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20  onst char *zSql 
8b90: 3d 20 7a 49 6e 3b 20 20 20 20 20 20 20 20 20 2f  = zIn;         /
8ba0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 66 69 72  * Pointer to fir
8bb0: 73 74 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  st SQL statement
8bc0: 20 69 6e 20 7a 49 6e 20 2a 2f 0a 20 20 73 71 6c   in zIn */.  sql
8bd0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
8be0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
8bf0: 50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  Prepared stateme
8c00: 6e 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 53  nt object */.  S
8c10: 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a  qlPreparedStmt *
8c20: 70 50 72 65 53 74 6d 74 3b 20 20 20 20 20 20 2f  pPreStmt;      /
8c30: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 61 63  * Pointer to cac
8c40: 68 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  hed statement */
8c50: 0a 20 20 69 6e 74 20 6e 53 71 6c 3b 20 20 20 20  .  int nSql;    
8c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c70: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
8c80: 7a 53 71 6c 20 69 6e 20 62 79 74 65 73 20 2a 2f  zSql in bytes */
8c90: 0a 20 20 69 6e 74 20 6e 56 61 72 3b 20 20 20 20  .  int nVar;    
8ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8cb0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8cc0: 76 61 72 69 61 62 6c 65 73 20 69 6e 20 73 74 61  variables in sta
8cd0: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
8ce0: 69 50 61 72 6d 20 3d 20 30 3b 20 20 20 20 20 20  iParm = 0;      
8cf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
8d00: 65 78 74 20 66 72 65 65 20 65 6e 74 72 79 20 69  ext free entry i
8d10: 6e 20 61 70 50 61 72 6d 20 2a 2f 0a 20 20 69 6e  n apParm */.  in
8d20: 74 20 69 3b 0a 20 20 54 63 6c 5f 49 6e 74 65 72  t i;.  Tcl_Inter
8d30: 70 20 2a 69 6e 74 65 72 70 20 3d 20 70 44 62 2d  p *interp = pDb-
8d40: 3e 69 6e 74 65 72 70 3b 0a 0a 20 20 2a 70 70 50  >interp;..  *ppP
8d50: 72 65 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 2f  reStmt = 0;..  /
8d60: 2a 20 54 72 69 6d 20 73 70 61 63 65 73 20 66 72  * Trim spaces fr
8d70: 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  om the start of 
8d80: 7a 53 71 6c 20 61 6e 64 20 63 61 6c 63 75 6c 61  zSql and calcula
8d90: 74 65 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67  te the remaining
8da0: 20 6c 65 6e 67 74 68 2e 20 2a 2f 0a 20 20 77 68   length. */.  wh
8db0: 69 6c 65 28 20 69 73 73 70 61 63 65 28 7a 53 71  ile( isspace(zSq
8dc0: 6c 5b 30 5d 29 20 29 7b 20 7a 53 71 6c 2b 2b 3b  l[0]) ){ zSql++;
8dd0: 20 7d 0a 20 20 6e 53 71 6c 20 3d 20 73 74 72 6c   }.  nSql = strl
8de0: 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 0a 20 20 66  en30(zSql);..  f
8df0: 6f 72 28 70 50 72 65 53 74 6d 74 20 3d 20 70 44  or(pPreStmt = pD
8e00: 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 20 70 50 72  b->stmtList; pPr
8e10: 65 53 74 6d 74 3b 20 70 50 72 65 53 74 6d 74 3d  eStmt; pPreStmt=
8e20: 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 29  pPreStmt->pNext)
8e30: 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 50  {.    int n = pP
8e40: 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 3b 0a 20 20  reStmt->nSql;.  
8e50: 20 20 69 66 28 20 6e 53 71 6c 3e 3d 6e 20 0a 20    if( nSql>=n . 
8e60: 20 20 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70         && memcmp
8e70: 28 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c  (pPreStmt->zSql,
8e80: 20 7a 53 71 6c 2c 20 6e 29 3d 3d 30 0a 20 20 20   zSql, n)==0.   
8e90: 20 20 20 20 20 26 26 20 28 7a 53 71 6c 5b 6e 5d       && (zSql[n]
8ea0: 3d 3d 30 20 7c 7c 20 7a 53 71 6c 5b 6e 2d 31 5d  ==0 || zSql[n-1]
8eb0: 3d 3d 27 3b 27 29 0a 20 20 20 20 29 7b 0a 20 20  ==';').    ){.  
8ec0: 20 20 20 20 70 53 74 6d 74 20 3d 20 70 50 72 65      pStmt = pPre
8ed0: 53 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a 20 20 20  Stmt->pStmt;.   
8ee0: 20 20 20 2a 70 7a 4f 75 74 20 3d 20 26 7a 53 71     *pzOut = &zSq
8ef0: 6c 5b 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c  l[pPreStmt->nSql
8f00: 5d 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65  ];..      /* Whe
8f10: 6e 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61  n a prepared sta
8f20: 74 65 6d 65 6e 74 20 69 73 20 66 6f 75 6e 64 2c  tement is found,
8f30: 20 75 6e 6c 69 6e 6b 20 69 74 20 66 72 6f 6d 20   unlink it from 
8f40: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 63  the.      ** cac
8f50: 68 65 20 6c 69 73 74 2e 20 20 49 74 20 77 69 6c  he list.  It wil
8f60: 6c 20 6c 61 74 65 72 20 62 65 20 61 64 64 65 64  l later be added
8f70: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65 67   back to the beg
8f80: 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  inning.      ** 
8f90: 6f 66 20 74 68 65 20 63 61 63 68 65 20 6c 69 73  of the cache lis
8fa0: 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6d  t in order to im
8fb0: 70 6c 65 6d 65 6e 74 20 4c 52 55 20 72 65 70 6c  plement LRU repl
8fc0: 61 63 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a  acement..      *
8fd0: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65  /.      if( pPre
8fe0: 53 74 6d 74 2d 3e 70 50 72 65 76 20 29 7b 0a 20  Stmt->pPrev ){. 
8ff0: 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d         pPreStmt-
9000: 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
9010: 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 3b  pPreStmt->pNext;
9020: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
9030: 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c        pDb->stmtL
9040: 69 73 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e  ist = pPreStmt->
9050: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
9060: 20 20 20 20 20 69 66 28 20 70 50 72 65 53 74 6d       if( pPreStm
9070: 74 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  t->pNext ){.    
9080: 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e      pPreStmt->pN
9090: 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 50 72  ext->pPrev = pPr
90a0: 65 53 74 6d 74 2d 3e 70 50 72 65 76 3b 0a 20 20  eStmt->pPrev;.  
90b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
90c0: 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74     pDb->stmtLast
90d0: 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72   = pPreStmt->pPr
90e0: 65 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ev;.      }.    
90f0: 20 20 70 44 62 2d 3e 6e 53 74 6d 74 2d 2d 3b 0a    pDb->nStmt--;.
9100: 20 20 20 20 20 20 6e 56 61 72 20 3d 20 73 71 6c        nVar = sql
9110: 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65  ite3_bind_parame
9120: 74 65 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29  ter_count(pStmt)
9130: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
9140: 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a     }.  }.  .  /*
9150: 20 49 66 20 6e 6f 20 70 72 65 70 61 72 65 64 20   If no prepared 
9160: 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 66 6f  statement was fo
9170: 75 6e 64 2e 20 43 6f 6d 70 69 6c 65 20 74 68 65  und. Compile the
9180: 20 53 51 4c 20 74 65 78 74 2e 20 41 6c 73 6f 20   SQL text. Also 
9190: 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 61 20  allocate.  ** a 
91a0: 6e 65 77 20 53 71 6c 50 72 65 70 61 72 65 64 53  new SqlPreparedS
91b0: 74 6d 74 20 73 74 72 75 63 74 75 72 65 2e 20 20  tmt structure.  
91c0: 2a 2f 0a 20 20 69 66 28 20 70 50 72 65 53 74 6d  */.  if( pPreStm
91d0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  t==0 ){.    int 
91e0: 6e 42 79 74 65 3b 0a 0a 20 20 20 20 69 66 28 20  nByte;..    if( 
91f0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 64 62 50 72 65  SQLITE_OK!=dbPre
9200: 70 61 72 65 28 70 44 62 2c 20 7a 53 71 6c 2c 20  pare(pDb, zSql, 
9210: 26 70 53 74 6d 74 2c 20 70 7a 4f 75 74 29 20 29  &pStmt, pzOut) )
9220: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f  {.      Tcl_SetO
9230: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
9240: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
9250: 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  j(sqlite3_errmsg
9260: 28 70 44 62 2d 3e 64 62 29 2c 20 2d 31 29 29 3b  (pDb->db), -1));
9270: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
9280: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
9290: 20 20 20 69 66 28 20 70 53 74 6d 74 3d 3d 30 20     if( pStmt==0 
92a0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  ){.      if( SQL
92b0: 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f  ITE_OK!=sqlite3_
92c0: 65 72 72 63 6f 64 65 28 70 44 62 2d 3e 64 62 29  errcode(pDb->db)
92d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   ){.        /* A
92e0: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 65 72   compile-time er
92f0: 72 6f 72 20 69 6e 20 74 68 65 20 73 74 61 74 65  ror in the state
9300: 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ment. */.       
9310: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
9320: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
9330: 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74  wStringObj(sqlit
9340: 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64  e3_errmsg(pDb->d
9350: 62 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 20 20  b), -1));.      
9360: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
9370: 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  OR;.      }else{
9380: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
9390: 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 61 20  statement was a 
93a0: 6e 6f 2d 6f 70 2e 20 20 43 6f 6e 74 69 6e 75 65  no-op.  Continue
93b0: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 74 61   to the next sta
93c0: 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 20 20 2a  tement.        *
93d0: 2a 20 69 6e 20 74 68 65 20 53 51 4c 20 73 74 72  * in the SQL str
93e0: 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ing..        */.
93f0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
9400: 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  CL_OK;.      }. 
9410: 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
9420: 28 20 70 50 72 65 53 74 6d 74 3d 3d 30 20 29 3b  ( pPreStmt==0 );
9430: 0a 20 20 20 20 6e 56 61 72 20 3d 20 73 71 6c 69  .    nVar = sqli
9440: 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
9450: 65 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b  er_count(pStmt);
9460: 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73 69 7a  .    nByte = siz
9470: 65 6f 66 28 53 71 6c 50 72 65 70 61 72 65 64 53  eof(SqlPreparedS
9480: 74 6d 74 29 20 2b 20 6e 56 61 72 2a 73 69 7a 65  tmt) + nVar*size
9490: 6f 66 28 54 63 6c 5f 4f 62 6a 20 2a 29 3b 0a 20  of(Tcl_Obj *);. 
94a0: 20 20 20 70 50 72 65 53 74 6d 74 20 3d 20 28 53     pPreStmt = (S
94b0: 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 2a 29  qlPreparedStmt*)
94c0: 54 63 6c 5f 41 6c 6c 6f 63 28 6e 42 79 74 65 29  Tcl_Alloc(nByte)
94d0: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 72  ;.    memset(pPr
94e0: 65 53 74 6d 74 2c 20 30 2c 20 6e 42 79 74 65 29  eStmt, 0, nByte)
94f0: 3b 0a 0a 20 20 20 20 70 50 72 65 53 74 6d 74 2d  ;..    pPreStmt-
9500: 3e 70 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a  >pStmt = pStmt;.
9510: 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53      pPreStmt->nS
9520: 71 6c 20 3d 20 28 69 6e 74 29 28 2a 70 7a 4f 75  ql = (int)(*pzOu
9530: 74 20 2d 20 7a 53 71 6c 29 3b 0a 20 20 20 20 70  t - zSql);.    p
9540: 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 20 3d 20  PreStmt->zSql = 
9550: 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d  sqlite3_sql(pStm
9560: 74 29 3b 0a 20 20 20 20 70 50 72 65 53 74 6d 74  t);.    pPreStmt
9570: 2d 3e 61 70 50 61 72 6d 20 3d 20 28 54 63 6c 5f  ->apParm = (Tcl_
9580: 4f 62 6a 20 2a 2a 29 26 70 50 72 65 53 74 6d 74  Obj **)&pPreStmt
9590: 5b 31 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  [1];.#ifdef SQLI
95a0: 54 45 5f 54 45 53 54 0a 20 20 20 20 69 66 28 20  TE_TEST.    if( 
95b0: 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 3d 3d  pPreStmt->zSql==
95c0: 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  0 ){.      char 
95d0: 2a 7a 43 6f 70 79 20 3d 20 54 63 6c 5f 41 6c 6c  *zCopy = Tcl_All
95e0: 6f 63 28 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71  oc(pPreStmt->nSq
95f0: 6c 20 2b 20 31 29 3b 0a 20 20 20 20 20 20 6d 65  l + 1);.      me
9600: 6d 63 70 79 28 7a 43 6f 70 79 2c 20 7a 53 71 6c  mcpy(zCopy, zSql
9610: 2c 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c  , pPreStmt->nSql
9620: 29 3b 0a 20 20 20 20 20 20 7a 43 6f 70 79 5b 70  );.      zCopy[p
9630: 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 5d 20 3d  PreStmt->nSql] =
9640: 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 70 50 72   '\0';.      pPr
9650: 65 53 74 6d 74 2d 3e 7a 53 71 6c 20 3d 20 7a 43  eStmt->zSql = zC
9660: 6f 70 79 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  opy;.    }.#endi
9670: 66 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  f.  }.  assert( 
9680: 70 50 72 65 53 74 6d 74 20 29 3b 0a 20 20 61 73  pPreStmt );.  as
9690: 73 65 72 74 28 20 73 74 72 6c 65 6e 33 30 28 70  sert( strlen30(p
96a0: 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 29 3d 3d  PreStmt->zSql)==
96b0: 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 20 29  pPreStmt->nSql )
96c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 6d  ;.  assert( 0==m
96d0: 65 6d 63 6d 70 28 70 50 72 65 53 74 6d 74 2d 3e  emcmp(pPreStmt->
96e0: 7a 53 71 6c 2c 20 7a 53 71 6c 2c 20 70 50 72 65  zSql, zSql, pPre
96f0: 53 74 6d 74 2d 3e 6e 53 71 6c 29 20 29 3b 0a 0a  Stmt->nSql) );..
9700: 20 20 2f 2a 20 42 69 6e 64 20 76 61 6c 75 65 73    /* Bind values
9710: 20 74 6f 20 70 61 72 61 6d 65 74 65 72 73 20 74   to parameters t
9720: 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 24  hat begin with $
9730: 20 6f 72 20 3a 20 2a 2f 20 20 0a 20 20 66 6f 72   or : */  .  for
9740: 28 69 3d 31 3b 20 69 3c 3d 6e 56 61 72 3b 20 69  (i=1; i<=nVar; i
9750: 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ++){.    const c
9760: 68 61 72 20 2a 7a 56 61 72 20 3d 20 73 71 6c 69  har *zVar = sqli
9770: 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
9780: 65 72 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20 69  er_name(pStmt, i
9790: 29 3b 0a 20 20 20 20 69 66 28 20 7a 56 61 72 21  );.    if( zVar!
97a0: 3d 30 20 26 26 20 28 7a 56 61 72 5b 30 5d 3d 3d  =0 && (zVar[0]==
97b0: 27 24 27 20 7c 7c 20 7a 56 61 72 5b 30 5d 3d 3d  '$' || zVar[0]==
97c0: 27 3a 27 20 7c 7c 20 7a 56 61 72 5b 30 5d 3d 3d  ':' || zVar[0]==
97d0: 27 40 27 29 20 29 7b 0a 20 20 20 20 20 20 54 63  '@') ){.      Tc
97e0: 6c 5f 4f 62 6a 20 2a 70 56 61 72 20 3d 20 54 63  l_Obj *pVar = Tc
97f0: 6c 5f 47 65 74 56 61 72 32 45 78 28 69 6e 74 65  l_GetVar2Ex(inte
9800: 72 70 2c 20 26 7a 56 61 72 5b 31 5d 2c 20 30 2c  rp, &zVar[1], 0,
9810: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
9820: 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Var ){.        i
9830: 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 75 38  nt n;.        u8
9840: 20 2a 64 61 74 61 3b 0a 20 20 20 20 20 20 20 20   *data;.        
9850: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
9860: 65 20 3d 20 28 70 56 61 72 2d 3e 74 79 70 65 50  e = (pVar->typeP
9870: 74 72 20 3f 20 70 56 61 72 2d 3e 74 79 70 65 50  tr ? pVar->typeP
9880: 74 72 2d 3e 6e 61 6d 65 20 3a 20 22 22 29 3b 0a  tr->name : "");.
9890: 20 20 20 20 20 20 20 20 63 68 61 72 20 63 20 3d          char c =
98a0: 20 7a 54 79 70 65 5b 30 5d 3b 0a 20 20 20 20 20   zType[0];.     
98b0: 20 20 20 69 66 28 20 7a 56 61 72 5b 30 5d 3d 3d     if( zVar[0]==
98c0: 27 40 27 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  '@' ||.         
98d0: 20 20 28 63 3d 3d 27 62 27 20 26 26 20 73 74 72    (c=='b' && str
98e0: 63 6d 70 28 7a 54 79 70 65 2c 22 62 79 74 65 61  cmp(zType,"bytea
98f0: 72 72 61 79 22 29 3d 3d 30 20 26 26 20 70 56 61  rray")==0 && pVa
9900: 72 2d 3e 62 79 74 65 73 3d 3d 30 29 20 29 7b 0a  r->bytes==0) ){.
9910: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 61            /* Loa
9920: 64 20 61 20 42 4c 4f 42 20 74 79 70 65 20 69 66  d a BLOB type if
9930: 20 74 68 65 20 54 63 6c 20 76 61 72 69 61 62 6c   the Tcl variabl
9940: 65 20 69 73 20 61 20 62 79 74 65 61 72 72 61 79  e is a bytearray
9950: 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a   and.          *
9960: 2a 20 69 74 20 68 61 73 20 6e 6f 20 73 74 72 69  * it has no stri
9970: 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ng representatio
9980: 6e 20 6f 72 20 74 68 65 20 68 6f 73 74 0a 20 20  n or the host.  
9990: 20 20 20 20 20 20 20 20 2a 2a 20 70 61 72 61 6d          ** param
99a0: 65 74 65 72 20 6e 61 6d 65 20 62 65 67 69 6e 73  eter name begins
99b0: 20 77 69 74 68 20 22 40 22 2e 20 2a 2f 0a 20 20   with "@". */.  
99c0: 20 20 20 20 20 20 20 20 64 61 74 61 20 3d 20 54          data = T
99d0: 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46  cl_GetByteArrayF
99e0: 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29  romObj(pVar, &n)
99f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
9a00: 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53  te3_bind_blob(pS
9a10: 74 6d 74 2c 20 69 2c 20 64 61 74 61 2c 20 6e 2c  tmt, i, data, n,
9a20: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
9a30: 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49  .          Tcl_I
9a40: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 56 61 72  ncrRefCount(pVar
9a50: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 72  );.          pPr
9a60: 65 53 74 6d 74 2d 3e 61 70 50 61 72 6d 5b 69 50  eStmt->apParm[iP
9a70: 61 72 6d 2b 2b 5d 20 3d 20 70 56 61 72 3b 0a 20  arm++] = pVar;. 
9a80: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
9a90: 20 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d   c=='b' && strcm
9aa0: 70 28 7a 54 79 70 65 2c 22 62 6f 6f 6c 65 61 6e  p(zType,"boolean
9ab0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
9ac0: 20 20 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f     Tcl_GetIntFro
9ad0: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 56 61  mObj(interp, pVa
9ae0: 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20  r, &n);.        
9af0: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
9b00: 6e 74 28 70 53 74 6d 74 2c 20 69 2c 20 6e 29 3b  nt(pStmt, i, n);
9b10: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
9b20: 66 28 20 63 3d 3d 27 64 27 20 26 26 20 73 74 72  f( c=='d' && str
9b30: 63 6d 70 28 7a 54 79 70 65 2c 22 64 6f 75 62 6c  cmp(zType,"doubl
9b40: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
9b50: 20 20 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20      double r;.  
9b60: 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 44          Tcl_GetD
9b70: 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e 74  oubleFromObj(int
9b80: 65 72 70 2c 20 70 56 61 72 2c 20 26 72 29 3b 0a  erp, pVar, &r);.
9b90: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
9ba0: 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28 70 53  3_bind_double(pS
9bb0: 74 6d 74 2c 20 69 2c 20 72 29 3b 0a 20 20 20 20  tmt, i, r);.    
9bc0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63      }else if( (c
9bd0: 3d 3d 27 77 27 20 26 26 20 73 74 72 63 6d 70 28  =='w' && strcmp(
9be0: 7a 54 79 70 65 2c 22 77 69 64 65 49 6e 74 22 29  zType,"wideInt")
9bf0: 3d 3d 30 29 20 7c 7c 0a 20 20 20 20 20 20 20 20  ==0) ||.        
9c00: 20 20 20 20 20 20 28 63 3d 3d 27 69 27 20 26 26        (c=='i' &&
9c10: 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 69   strcmp(zType,"i
9c20: 6e 74 22 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20  nt")==0) ){.    
9c30: 20 20 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e        Tcl_WideIn
9c40: 74 20 76 3b 0a 20 20 20 20 20 20 20 20 20 20 54  t v;.          T
9c50: 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f  cl_GetWideIntFro
9c60: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 56 61  mObj(interp, pVa
9c70: 72 2c 20 26 76 29 3b 0a 20 20 20 20 20 20 20 20  r, &v);.        
9c80: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
9c90: 6e 74 36 34 28 70 53 74 6d 74 2c 20 69 2c 20 76  nt64(pStmt, i, v
9ca0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
9cb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 64 61 74 61  {.          data
9cc0: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
9cd0: 72 20 2a 29 54 63 6c 5f 47 65 74 53 74 72 69 6e  r *)Tcl_GetStrin
9ce0: 67 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26  gFromObj(pVar, &
9cf0: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  n);.          sq
9d00: 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28  lite3_bind_text(
9d10: 70 53 74 6d 74 2c 20 69 2c 20 28 63 68 61 72 20  pStmt, i, (char 
9d20: 2a 29 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54  *)data, n, SQLIT
9d30: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  E_STATIC);.     
9d40: 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66       Tcl_IncrRef
9d50: 43 6f 75 6e 74 28 70 56 61 72 29 3b 0a 20 20 20  Count(pVar);.   
9d60: 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d         pPreStmt-
9d70: 3e 61 70 50 61 72 6d 5b 69 50 61 72 6d 2b 2b 5d  >apParm[iParm++]
9d80: 20 3d 20 70 56 61 72 3b 0a 20 20 20 20 20 20 20   = pVar;.       
9d90: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
9da0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
9db0: 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c  bind_null(pStmt,
9dc0: 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   i);.      }.   
9dd0: 20 7d 0a 20 20 7d 0a 20 20 70 50 72 65 53 74 6d   }.  }.  pPreStm
9de0: 74 2d 3e 6e 50 61 72 6d 20 3d 20 69 50 61 72 6d  t->nParm = iParm
9df0: 3b 0a 20 20 2a 70 70 50 72 65 53 74 6d 74 20 3d  ;.  *ppPreStmt =
9e00: 20 70 50 72 65 53 74 6d 74 3b 0a 0a 20 20 72 65   pPreStmt;..  re
9e10: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
9e20: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
9e30: 73 74 61 74 65 6d 65 6e 74 20 72 65 66 65 72 65  statement refere
9e40: 6e 63 65 20 6f 62 74 61 69 6e 65 64 20 62 79 20  nce obtained by 
9e50: 63 61 6c 6c 69 6e 67 20 64 62 50 72 65 70 61 72  calling dbPrepar
9e60: 65 41 6e 64 42 69 6e 64 28 29 2e 0a 2a 2a 20 54  eAndBind()..** T
9e70: 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 65  here should be e
9e80: 78 61 63 74 6c 79 20 6f 6e 65 20 63 61 6c 6c 20  xactly one call 
9e90: 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
9ea0: 20 66 6f 72 20 65 61 63 68 20 63 61 6c 6c 20 74   for each call t
9eb0: 6f 0a 2a 2a 20 64 62 50 72 65 70 61 72 65 41 6e  o.** dbPrepareAn
9ec0: 64 42 69 6e 64 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  dBind()..**.** I
9ed0: 66 20 74 68 65 20 64 69 73 63 61 72 64 20 70 61  f the discard pa
9ee0: 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a  rameter is non-z
9ef0: 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 73 74  ero, then the st
9f00: 61 74 65 6d 65 6e 74 20 69 73 20 64 65 6c 65 74  atement is delet
9f10: 65 64 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  ed.** immediatel
9f20: 79 2e 20 4f 74 68 65 72 77 69 73 65 20 69 74 20  y. Otherwise it 
9f30: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
9f40: 4c 52 55 20 6c 69 73 74 20 61 6e 64 20 6d 61 79  LRU list and may
9f50: 20 62 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   be returned.** 
9f60: 62 79 20 61 20 73 75 62 73 65 71 75 65 6e 74 20  by a subsequent 
9f70: 63 61 6c 6c 20 74 6f 20 64 62 50 72 65 70 61 72  call to dbPrepar
9f80: 65 41 6e 64 42 69 6e 64 28 29 2e 0a 2a 2f 0a 73  eAndBind()..*/.s
9f90: 74 61 74 69 63 20 76 6f 69 64 20 64 62 52 65 6c  tatic void dbRel
9fa0: 65 61 73 65 53 74 6d 74 28 0a 20 20 53 71 6c 69  easeStmt(.  Sqli
9fb0: 74 65 44 62 20 2a 70 44 62 2c 20 20 20 20 20 20  teDb *pDb,      
9fc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
9fd0: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
9fe0: 2f 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64 53  /.  SqlPreparedS
9ff0: 74 6d 74 20 2a 70 50 72 65 53 74 6d 74 2c 20 20  tmt *pPreStmt,  
a000: 20 20 20 20 2f 2a 20 50 72 65 70 61 72 65 64 20      /* Prepared 
a010: 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65  statement handle
a020: 20 74 6f 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20   to release */. 
a030: 20 69 6e 74 20 64 69 73 63 61 72 64 20 20 20 20   int discard    
a040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a050: 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 65 6c 65   /* True to dele
a060: 74 65 20 28 6e 6f 74 20 63 61 63 68 65 29 20 74  te (not cache) t
a070: 68 65 20 70 50 72 65 53 74 6d 74 20 2a 2f 0a 29  he pPreStmt */.)
a080: 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a  {.  int i;..  /*
a090: 20 46 72 65 65 20 74 68 65 20 62 6f 75 6e 64 20   Free the bound 
a0a0: 73 74 72 69 6e 67 20 61 6e 64 20 62 6c 6f 62 20  string and blob 
a0b0: 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20  parameters */.  
a0c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 72 65 53  for(i=0; i<pPreS
a0d0: 74 6d 74 2d 3e 6e 50 61 72 6d 3b 20 69 2b 2b 29  tmt->nParm; i++)
a0e0: 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  {.    Tcl_DecrRe
a0f0: 66 43 6f 75 6e 74 28 70 50 72 65 53 74 6d 74 2d  fCount(pPreStmt-
a100: 3e 61 70 50 61 72 6d 5b 69 5d 29 3b 0a 20 20 7d  >apParm[i]);.  }
a110: 0a 20 20 70 50 72 65 53 74 6d 74 2d 3e 6e 50 61  .  pPreStmt->nPa
a120: 72 6d 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  rm = 0;..  if( p
a130: 44 62 2d 3e 6d 61 78 53 74 6d 74 3c 3d 30 20 7c  Db->maxStmt<=0 |
a140: 7c 20 64 69 73 63 61 72 64 20 29 7b 0a 20 20 20  | discard ){.   
a150: 20 2f 2a 20 49 66 20 74 68 65 20 63 61 63 68 65   /* If the cache
a160: 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66 2c 20   is turned off, 
a170: 64 65 61 6c 6c 6f 63 61 74 65 64 20 74 68 65 20  deallocated the 
a180: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
a190: 20 64 62 46 72 65 65 53 74 6d 74 28 70 50 72 65   dbFreeStmt(pPre
a1a0: 53 74 6d 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Stmt);.  }else{.
a1b0: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 70      /* Add the p
a1c0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
a1d0: 74 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  t to the beginni
a1e0: 6e 67 20 6f 66 20 74 68 65 20 63 61 63 68 65 20  ng of the cache 
a1f0: 6c 69 73 74 2e 20 2a 2f 0a 20 20 20 20 70 50 72  list. */.    pPr
a200: 65 53 74 6d 74 2d 3e 70 4e 65 78 74 20 3d 20 70  eStmt->pNext = p
a210: 44 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 0a 20 20  Db->stmtList;.  
a220: 20 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65    pPreStmt->pPre
a230: 76 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  v = 0;.    if( p
a240: 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 29 7b 0a  Db->stmtList ){.
a250: 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69       pDb->stmtLi
a260: 73 74 2d 3e 70 50 72 65 76 20 3d 20 70 50 72 65  st->pPrev = pPre
a270: 53 74 6d 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Stmt;.    }.    
a280: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20  pDb->stmtList = 
a290: 70 50 72 65 53 74 6d 74 3b 0a 20 20 20 20 69 66  pPreStmt;.    if
a2a0: 28 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 3d  ( pDb->stmtLast=
a2b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
a2c0: 72 74 28 20 70 44 62 2d 3e 6e 53 74 6d 74 3d 3d  rt( pDb->nStmt==
a2d0: 30 20 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e  0 );.      pDb->
a2e0: 73 74 6d 74 4c 61 73 74 20 3d 20 70 50 72 65 53  stmtLast = pPreS
a2f0: 74 6d 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  tmt;.    }else{.
a300: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44        assert( pD
a310: 62 2d 3e 6e 53 74 6d 74 3e 30 20 29 3b 0a 20 20  b->nStmt>0 );.  
a320: 20 20 7d 0a 20 20 20 20 70 44 62 2d 3e 6e 53 74    }.    pDb->nSt
a330: 6d 74 2b 2b 3b 0a 20 20 20 0a 20 20 20 20 2f 2a  mt++;.   .    /*
a340: 20 49 66 20 77 65 20 68 61 76 65 20 74 6f 6f 20   If we have too 
a350: 6d 61 6e 79 20 73 74 61 74 65 6d 65 6e 74 20 69  many statement i
a360: 6e 20 63 61 63 68 65 2c 20 72 65 6d 6f 76 65 20  n cache, remove 
a370: 74 68 65 20 73 75 72 70 6c 75 73 20 66 72 6f 6d  the surplus from
a380: 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 64   .    ** the end
a390: 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 6c 69   of the cache li
a3a0: 73 74 2e 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c  st.  */.    whil
a3b0: 65 28 20 70 44 62 2d 3e 6e 53 74 6d 74 3e 70 44  e( pDb->nStmt>pD
a3c0: 62 2d 3e 6d 61 78 53 74 6d 74 20 29 7b 0a 20 20  b->maxStmt ){.  
a3d0: 20 20 20 20 53 71 6c 50 72 65 70 61 72 65 64 53      SqlPreparedS
a3e0: 74 6d 74 20 2a 70 4c 61 73 74 20 3d 20 70 44 62  tmt *pLast = pDb
a3f0: 2d 3e 73 74 6d 74 4c 61 73 74 3b 0a 20 20 20 20  ->stmtLast;.    
a400: 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20    pDb->stmtLast 
a410: 3d 20 70 4c 61 73 74 2d 3e 70 50 72 65 76 3b 0a  = pLast->pPrev;.
a420: 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c        pDb->stmtL
a430: 61 73 74 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a  ast->pNext = 0;.
a440: 20 20 20 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74        pDb->nStmt
a450: 2d 2d 3b 0a 20 20 20 20 20 20 64 62 46 72 65 65  --;.      dbFree
a460: 53 74 6d 74 28 70 4c 61 73 74 29 3b 0a 20 20 20  Stmt(pLast);.   
a470: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
a480: 53 74 72 75 63 74 75 72 65 20 75 73 65 64 20 77  Structure used w
a490: 69 74 68 20 64 62 45 76 61 6c 58 58 58 28 29 20  ith dbEvalXXX() 
a4a0: 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a  functions:.**.**
a4b0: 20 20 20 64 62 45 76 61 6c 49 6e 69 74 28 29 0a     dbEvalInit().
a4c0: 2a 2a 20 20 20 64 62 45 76 61 6c 53 74 65 70 28  **   dbEvalStep(
a4d0: 29 0a 2a 2a 20 20 20 64 62 45 76 61 6c 46 69 6e  ).**   dbEvalFin
a4e0: 61 6c 69 7a 65 28 29 0a 2a 2a 20 20 20 64 62 45  alize().**   dbE
a4f0: 76 61 6c 52 6f 77 49 6e 66 6f 28 29 0a 2a 2a 20  valRowInfo().** 
a500: 20 20 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56 61    dbEvalColumnVa
a510: 6c 75 65 28 29 0a 2a 2f 0a 74 79 70 65 64 65 66  lue().*/.typedef
a520: 20 73 74 72 75 63 74 20 44 62 45 76 61 6c 43 6f   struct DbEvalCo
a530: 6e 74 65 78 74 20 44 62 45 76 61 6c 43 6f 6e 74  ntext DbEvalCont
a540: 65 78 74 3b 0a 73 74 72 75 63 74 20 44 62 45 76  ext;.struct DbEv
a550: 61 6c 43 6f 6e 74 65 78 74 20 7b 0a 20 20 53 71  alContext {.  Sq
a560: 6c 69 74 65 44 62 20 2a 70 44 62 3b 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 3b 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: 68 6f 6c 64 69 6e 67 20 73 74 72 69 6e 67 20 7a  holding string z
a5d0: 53 71 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  Sql */.  const c
a5e0: 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20  har *zSql;      
a5f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 61           /* Rema
a600: 69 6e 69 6e 67 20 53 51 4c 20 74 6f 20 65 78 65  ining SQL to exe
a610: 63 75 74 65 20 2a 2f 0a 20 20 53 71 6c 50 72 65  cute */.  SqlPre
a620: 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65 53  paredStmt *pPreS
a630: 74 6d 74 3b 20 20 20 20 20 20 2f 2a 20 43 75 72  tmt;      /* Cur
a640: 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 2a  rent statement *
a650: 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20  /.  int nCol;   
a660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a670: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
a680: 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65   columns returne
a690: 64 20 62 79 20 70 53 74 6d 74 20 2a 2f 0a 20 20  d by pStmt */.  
a6a0: 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 72 61 79 3b  Tcl_Obj *pArray;
a6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6c0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 72 72 61 79  /* Name of array
a6d0: 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 54   variable */.  T
a6e0: 63 6c 5f 4f 62 6a 20 2a 2a 61 70 43 6f 6c 4e 61  cl_Obj **apColNa
a6f0: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  me;            /
a700: 2a 20 41 72 72 61 79 20 6f 66 20 63 6f 6c 75 6d  * Array of colum
a710: 6e 20 6e 61 6d 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f  n names */.};../
a720: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e 79  *.** Release any
a730: 20 63 61 63 68 65 20 6f 66 20 63 6f 6c 75 6d 6e   cache of column
a740: 20 6e 61 6d 65 73 20 63 75 72 72 65 6e 74 6c 79   names currently
a750: 20 68 65 6c 64 20 61 73 20 70 61 72 74 20 6f 66   held as part of
a760: 0a 2a 2a 20 74 68 65 20 44 62 45 76 61 6c 43 6f  .** the DbEvalCo
a770: 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65 20  ntext structure 
a780: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
a790: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  rst argument..*/
a7a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 62 52  .static void dbR
a7b0: 65 6c 65 61 73 65 43 6f 6c 75 6d 6e 4e 61 6d 65  eleaseColumnName
a7c0: 73 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20  s(DbEvalContext 
a7d0: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61 70  *p){.  if( p->ap
a7e0: 43 6f 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 69  ColName ){.    i
a7f0: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
a800: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b  0; i<p->nCol; i+
a810: 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44 65  +){.      Tcl_De
a820: 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 61 70  crRefCount(p->ap
a830: 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20  ColName[i]);.   
a840: 20 7d 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28   }.    Tcl_Free(
a850: 28 63 68 61 72 20 2a 29 70 2d 3e 61 70 43 6f 6c  (char *)p->apCol
a860: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 61 70  Name);.    p->ap
a870: 43 6f 6c 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d  ColName = 0;.  }
a880: 0a 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  .  p->nCol = 0;.
a890: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
a8a0: 69 7a 65 20 61 20 44 62 45 76 61 6c 43 6f 6e 74  ize a DbEvalCont
a8b0: 65 78 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ext structure..*
a8c0: 2a 0a 2a 2a 20 49 66 20 70 41 72 72 61 79 20 69  *.** If pArray i
a8d0: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
a8e0: 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65   it contains the
a8f0: 20 6e 61 6d 65 20 6f 66 20 61 20 54 63 6c 20 61   name of a Tcl a
a900: 72 72 61 79 0a 2a 2a 20 76 61 72 69 61 62 6c 65  rray.** variable
a910: 2e 20 54 68 65 20 22 2a 22 20 6d 65 6d 62 65 72  . The "*" member
a920: 20 6f 66 20 74 68 69 73 20 61 72 72 61 79 20 69   of this array i
a930: 73 20 73 65 74 20 74 6f 20 61 20 6c 69 73 74 20  s set to a list 
a940: 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 74 68  containing.** th
a950: 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63  e names of the c
a960: 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20  olumns returned 
a970: 62 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  by the statement
a980: 20 61 73 20 70 61 72 74 20 6f 66 20 65 61 63 68   as part of each
a990: 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 64 62 45 76  .** call to dbEv
a9a0: 61 6c 53 74 65 70 28 29 2c 20 69 6e 20 6f 72 64  alStep(), in ord
a9b0: 65 72 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20  er from left to 
a9c0: 72 69 67 68 74 2e 20 65 2e 67 2e 20 69 66 20 74  right. e.g. if t
a9d0: 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20  he names .** of 
a9e0: 74 68 65 20 72 65 74 75 72 6e 65 64 20 63 6f 6c  the returned col
a9f0: 75 6d 6e 73 20 61 72 65 20 61 2c 20 62 20 61 6e  umns are a, b an
aa00: 64 20 63 2c 20 69 74 20 64 6f 65 73 20 74 68 65  d c, it does the
aa10: 20 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 20 74   equivalent of t
aa20: 68 65 20 0a 2a 2a 20 74 63 6c 20 63 6f 6d 6d 61  he .** tcl comma
aa30: 6e 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 65  nd:.**.**     se
aa40: 74 20 24 7b 70 41 72 72 61 79 7d 28 2a 29 20 7b  t ${pArray}(*) {
aa50: 61 20 62 20 63 7d 0a 2a 2f 0a 73 74 61 74 69 63  a b c}.*/.static
aa60: 20 76 6f 69 64 20 64 62 45 76 61 6c 49 6e 69 74   void dbEvalInit
aa70: 28 0a 20 20 44 62 45 76 61 6c 43 6f 6e 74 65 78  (.  DbEvalContex
aa80: 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
aa90: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
aaa0: 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69  o structure to i
aab0: 6e 69 74 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 53  nitialize */.  S
aac0: 71 6c 69 74 65 44 62 20 2a 70 44 62 2c 20 20 20  qliteDb *pDb,   
aad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
aae0: 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
aaf0: 65 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  e */.  Tcl_Obj *
ab00: 70 53 71 6c 2c 20 20 20 20 20 20 20 20 20 20 20  pSql,           
ab10: 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74         /* Object
ab20: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 53 51 4c 20   containing SQL 
ab30: 73 63 72 69 70 74 20 2a 2f 0a 20 20 54 63 6c 5f  script */.  Tcl_
ab40: 4f 62 6a 20 2a 70 41 72 72 61 79 20 20 20 20 20  Obj *pArray     
ab50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
ab60: 61 6d 65 20 6f 66 20 54 63 6c 20 61 72 72 61 79  ame of Tcl array
ab70: 20 74 6f 20 73 65 74 20 28 2a 29 20 65 6c 65 6d   to set (*) elem
ab80: 65 6e 74 20 6f 66 20 2a 2f 0a 29 7b 0a 20 20 6d  ent of */.){.  m
ab90: 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65  emset(p, 0, size
aba0: 6f 66 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74  of(DbEvalContext
abb0: 29 29 3b 0a 20 20 70 2d 3e 70 44 62 20 3d 20 70  ));.  p->pDb = p
abc0: 44 62 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20 3d 20  Db;.  p->zSql = 
abd0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 70 53  Tcl_GetString(pS
abe0: 71 6c 29 3b 0a 20 20 70 2d 3e 70 53 71 6c 20 3d  ql);.  p->pSql =
abf0: 20 70 53 71 6c 3b 0a 20 20 54 63 6c 5f 49 6e 63   pSql;.  Tcl_Inc
ac00: 72 52 65 66 43 6f 75 6e 74 28 70 53 71 6c 29 3b  rRefCount(pSql);
ac10: 0a 20 20 69 66 28 20 70 41 72 72 61 79 20 29 7b  .  if( pArray ){
ac20: 0a 20 20 20 20 70 2d 3e 70 41 72 72 61 79 20 3d  .    p->pArray =
ac30: 20 70 41 72 72 61 79 3b 0a 20 20 20 20 54 63 6c   pArray;.    Tcl
ac40: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 41  _IncrRefCount(pA
ac50: 72 72 61 79 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  rray);.  }.}../*
ac60: 0a 2a 2a 20 4f 62 74 61 69 6e 20 69 6e 66 6f 72  .** Obtain infor
ac70: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
ac80: 20 72 6f 77 20 74 68 61 74 20 74 68 65 20 44 62   row that the Db
ac90: 45 76 61 6c 43 6f 6e 74 65 78 74 20 70 61 73 73  EvalContext pass
aca0: 65 64 20 61 73 20 74 68 65 0a 2a 2a 20 66 69 72  ed as the.** fir
acb0: 73 74 20 61 72 67 75 6d 65 6e 74 20 63 75 72 72  st argument curr
acc0: 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e  ently points to.
acd0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ace0: 64 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28 0a 20  dbEvalRowInfo(. 
acf0: 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a   DbEvalContext *
ad00: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
ad10: 20 2f 2a 20 45 76 61 6c 75 61 74 69 6f 6e 20 63   /* Evaluation c
ad20: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
ad30: 2a 70 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20  *pnCol,         
ad40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
ad50: 55 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f  UT: Number of co
ad60: 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20  lumn names */.  
ad70: 54 63 6c 5f 4f 62 6a 20 2a 2a 2a 70 61 70 43 6f  Tcl_Obj ***papCo
ad80: 6c 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20  lName           
ad90: 2f 2a 20 4f 55 54 3a 20 41 72 72 61 79 20 6f 66  /* OUT: Array of
ada0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   column names */
adb0: 0a 29 7b 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65  .){.  /* Compute
adc0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   column names */
add0: 0a 20 20 69 66 28 20 30 3d 3d 70 2d 3e 61 70 43  .  if( 0==p->apC
ade0: 6f 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 71  olName ){.    sq
adf0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
ae00: 74 20 3d 20 70 2d 3e 70 50 72 65 53 74 6d 74 2d  t = p->pPreStmt-
ae10: 3e 70 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20  >pStmt;.    int 
ae20: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
ae30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
ae40: 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a  rator variable *
ae50: 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20  /.    int nCol; 
ae60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae70: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
ae80: 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65   columns returne
ae90: 64 20 62 79 20 70 53 74 6d 74 20 2a 2f 0a 20 20  d by pStmt */.  
aea0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 43 6f    Tcl_Obj **apCo
aeb0: 6c 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20  lName = 0;      
aec0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 6f 6c 75  /* Array of colu
aed0: 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 0a 20 20 20  mn names */..   
aee0: 20 70 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 20   p->nCol = nCol 
aef0: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
af00: 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20  _count(pStmt);. 
af10: 20 20 20 69 66 28 20 6e 43 6f 6c 3e 30 20 26 26     if( nCol>0 &&
af20: 20 28 70 61 70 43 6f 6c 4e 61 6d 65 20 7c 7c 20   (papColName || 
af30: 70 2d 3e 70 41 72 72 61 79 29 20 29 7b 0a 20 20  p->pArray) ){.  
af40: 20 20 20 20 61 70 43 6f 6c 4e 61 6d 65 20 3d 20      apColName = 
af50: 28 54 63 6c 5f 4f 62 6a 2a 2a 29 54 63 6c 5f 41  (Tcl_Obj**)Tcl_A
af60: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54 63 6c  lloc( sizeof(Tcl
af70: 5f 4f 62 6a 2a 29 2a 6e 43 6f 6c 20 29 3b 0a 20  _Obj*)*nCol );. 
af80: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
af90: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
afa0: 20 20 20 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d      apColName[i]
afb0: 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
afc0: 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75  Obj(sqlite3_colu
afd0: 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29  mn_name(pStmt,i)
afe0: 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 54  , -1);.        T
aff0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
b000: 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20  apColName[i]);. 
b010: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
b020: 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 61 70 43 6f  apColName = apCo
b030: 6c 4e 61 6d 65 3b 0a 20 20 20 20 7d 0a 0a 20 20  lName;.    }..  
b040: 20 20 2f 2a 20 49 66 20 72 65 73 75 6c 74 73 20    /* If results 
b050: 61 72 65 20 62 65 69 6e 67 20 73 74 6f 72 65 64  are being stored
b060: 20 69 6e 20 61 6e 20 61 72 72 61 79 20 76 61 72   in an array var
b070: 69 61 62 6c 65 2c 20 74 68 65 6e 20 63 72 65 61  iable, then crea
b080: 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 61 72  te.    ** the ar
b090: 72 61 79 28 2a 29 20 65 6e 74 72 79 20 66 6f 72  ray(*) entry for
b0a0: 20 74 68 61 74 20 61 72 72 61 79 0a 20 20 20 20   that array.    
b0b0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 41  */.    if( p->pA
b0c0: 72 72 61 79 20 29 7b 0a 20 20 20 20 20 20 54 63  rray ){.      Tc
b0d0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
b0e0: 20 3d 20 70 2d 3e 70 44 62 2d 3e 69 6e 74 65 72   = p->pDb->inter
b0f0: 70 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a  p;.      Tcl_Obj
b100: 20 2a 70 43 6f 6c 4c 69 73 74 20 3d 20 54 63 6c   *pColList = Tcl
b110: 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20 20  _NewObj();.     
b120: 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 74 61 72 20   Tcl_Obj *pStar 
b130: 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
b140: 62 6a 28 22 2a 22 2c 20 2d 31 29 3b 0a 0a 20 20  bj("*", -1);..  
b150: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
b160: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
b170: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
b180: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
b190: 72 70 2c 20 70 43 6f 6c 4c 69 73 74 2c 20 61 70  rp, pColList, ap
b1a0: 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20  ColName[i]);.   
b1b0: 20 20 20 7d 0a 20 20 20 20 20 20 54 63 6c 5f 49     }.      Tcl_I
b1c0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 53 74 61  ncrRefCount(pSta
b1d0: 72 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62  r);.      Tcl_Ob
b1e0: 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c  jSetVar2(interp,
b1f0: 20 70 2d 3e 70 41 72 72 61 79 2c 20 70 53 74 61   p->pArray, pSta
b200: 72 2c 20 70 43 6f 6c 4c 69 73 74 2c 20 30 29 3b  r, pColList, 0);
b210: 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52  .      Tcl_DecrR
b220: 65 66 43 6f 75 6e 74 28 70 53 74 61 72 29 3b 0a  efCount(pStar);.
b230: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
b240: 20 70 61 70 43 6f 6c 4e 61 6d 65 20 29 7b 0a 20   papColName ){. 
b250: 20 20 20 2a 70 61 70 43 6f 6c 4e 61 6d 65 20 3d     *papColName =
b260: 20 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 3b 0a 20   p->apColName;. 
b270: 20 7d 0a 20 20 69 66 28 20 70 6e 43 6f 6c 20 29   }.  if( pnCol )
b280: 7b 0a 20 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 70  {.    *pnCol = p
b290: 2d 3e 6e 43 6f 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ->nCol;.  }.}../
b2a0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6f 6e 65 20  *.** Return one 
b2b0: 6f 66 20 54 43 4c 5f 4f 4b 2c 20 54 43 4c 5f 42  of TCL_OK, TCL_B
b2c0: 52 45 41 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f  REAK or TCL_ERRO
b2d0: 52 2e 20 49 66 20 54 43 4c 5f 45 52 52 4f 52 20  R. If TCL_ERROR 
b2e0: 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2c 20  is.** returned, 
b2f0: 74 68 65 6e 20 61 6e 20 65 72 72 6f 72 20 6d 65  then an error me
b300: 73 73 61 67 65 20 69 73 20 73 74 6f 72 65 64 20  ssage is stored 
b310: 69 6e 20 74 68 65 20 69 6e 74 65 72 70 72 65 74  in the interpret
b320: 65 72 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74  er before.** ret
b330: 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 20  urning..**.** A 
b340: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
b350: 54 43 4c 5f 4f 4b 20 6d 65 61 6e 73 20 74 68 65  TCL_OK means the
b360: 72 65 20 69 73 20 61 20 72 6f 77 20 6f 66 20 64  re is a row of d
b370: 61 74 61 20 61 76 61 69 6c 61 62 6c 65 2e 20 54  ata available. T
b380: 68 65 0a 2a 2a 20 64 61 74 61 20 6d 61 79 20 62  he.** data may b
b390: 65 20 61 63 63 65 73 73 65 64 20 75 73 69 6e 67  e accessed using
b3a0: 20 64 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28 29   dbEvalRowInfo()
b3b0: 20 61 6e 64 20 64 62 45 76 61 6c 43 6f 6c 75 6d   and dbEvalColum
b3c0: 6e 56 61 6c 75 65 28 29 2e 20 54 68 69 73 0a 2a  nValue(). This.*
b3d0: 2a 20 69 73 20 61 6e 61 6c 6f 67 6f 75 73 20 74  * is analogous t
b3e0: 6f 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51  o a return of SQ
b3f0: 4c 49 54 45 5f 52 4f 57 20 66 72 6f 6d 20 73 71  LITE_ROW from sq
b400: 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20 49 66  lite3_step(). If
b410: 20 54 43 4c 5f 42 52 45 41 4b 0a 2a 2a 20 69 73   TCL_BREAK.** is
b420: 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20   returned, then 
b430: 74 68 65 20 53 51 4c 20 73 63 72 69 70 74 20 68  the SQL script h
b440: 61 73 20 66 69 6e 69 73 68 65 64 20 65 78 65 63  as finished exec
b450: 75 74 69 6e 67 20 61 6e 64 20 74 68 65 72 65 20  uting and there 
b460: 61 72 65 0a 2a 2a 20 6e 6f 20 66 75 72 74 68 65  are.** no furthe
b470: 72 20 72 6f 77 73 20 61 76 61 69 6c 61 62 6c 65  r rows available
b480: 2e 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61  . This is simila
b490: 72 20 74 6f 20 53 51 4c 49 54 45 5f 44 4f 4e 45  r to SQLITE_DONE
b4a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b4b0: 64 62 45 76 61 6c 53 74 65 70 28 44 62 45 76 61  dbEvalStep(DbEva
b4c0: 6c 43 6f 6e 74 65 78 74 20 2a 70 29 7b 0a 20 20  lContext *p){.  
b4d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 72 65  const char *zPre
b4e0: 76 53 71 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  vSql = 0;       
b4f0: 2f 2a 20 50 72 65 76 69 6f 75 73 20 76 61 6c 75  /* Previous valu
b500: 65 20 6f 66 20 70 2d 3e 7a 53 71 6c 20 2a 2f 0a  e of p->zSql */.
b510: 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 7a 53 71  .  while( p->zSq
b520: 6c 5b 30 5d 20 7c 7c 20 70 2d 3e 70 50 72 65 53  l[0] || p->pPreS
b530: 74 6d 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  tmt ){.    int r
b540: 63 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 50  c;.    if( p->pP
b550: 72 65 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20  reStmt==0 ){.   
b560: 20 20 20 7a 50 72 65 76 53 71 6c 20 3d 20 28 70     zPrevSql = (p
b570: 2d 3e 7a 53 71 6c 3d 3d 7a 50 72 65 76 53 71 6c  ->zSql==zPrevSql
b580: 20 3f 20 30 20 3a 20 70 2d 3e 7a 53 71 6c 29 3b   ? 0 : p->zSql);
b590: 0a 20 20 20 20 20 20 72 63 20 3d 20 64 62 50 72  .      rc = dbPr
b5a0: 65 70 61 72 65 41 6e 64 42 69 6e 64 28 70 2d 3e  epareAndBind(p->
b5b0: 70 44 62 2c 20 70 2d 3e 7a 53 71 6c 2c 20 26 70  pDb, p->zSql, &p
b5c0: 2d 3e 7a 53 71 6c 2c 20 26 70 2d 3e 70 50 72 65  ->zSql, &p->pPre
b5d0: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28  Stmt);.      if(
b5e0: 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 20 72 65   rc!=TCL_OK ) re
b5f0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 65 6c  turn rc;.    }el
b600: 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63  se{.      int rc
b610: 73 3b 0a 20 20 20 20 20 20 53 71 6c 69 74 65 44  s;.      SqliteD
b620: 62 20 2a 70 44 62 20 3d 20 70 2d 3e 70 44 62 3b  b *pDb = p->pDb;
b630: 0a 20 20 20 20 20 20 53 71 6c 50 72 65 70 61 72  .      SqlPrepar
b640: 65 64 53 74 6d 74 20 2a 70 50 72 65 53 74 6d 74  edStmt *pPreStmt
b650: 20 3d 20 70 2d 3e 70 50 72 65 53 74 6d 74 3b 0a   = p->pPreStmt;.
b660: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
b670: 6d 74 20 2a 70 53 74 6d 74 20 3d 20 70 50 72 65  mt *pStmt = pPre
b680: 53 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a 0a 20 20  Stmt->pStmt;..  
b690: 20 20 20 20 72 63 73 20 3d 20 73 71 6c 69 74 65      rcs = sqlite
b6a0: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20  3_step(pStmt);. 
b6b0: 20 20 20 20 20 69 66 28 20 72 63 73 3d 3d 53 51       if( rcs==SQ
b6c0: 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
b6d0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
b6e0: 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
b6f0: 20 69 66 28 20 70 2d 3e 70 41 72 72 61 79 20 29   if( p->pArray )
b700: 7b 0a 20 20 20 20 20 20 20 20 64 62 45 76 61 6c  {.        dbEval
b710: 52 6f 77 49 6e 66 6f 28 70 2c 20 30 2c 20 30 29  RowInfo(p, 0, 0)
b720: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b730: 72 63 73 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  rcs = sqlite3_re
b740: 73 65 74 28 70 53 74 6d 74 29 3b 0a 0a 20 20 20  set(pStmt);..   
b750: 20 20 20 70 44 62 2d 3e 6e 53 74 65 70 20 3d 20     pDb->nStep = 
b760: 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61  sqlite3_stmt_sta
b770: 74 75 73 28 70 53 74 6d 74 2c 53 51 4c 49 54 45  tus(pStmt,SQLITE
b780: 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c  _STMTSTATUS_FULL
b790: 53 43 41 4e 5f 53 54 45 50 2c 31 29 3b 0a 20 20  SCAN_STEP,1);.  
b7a0: 20 20 20 20 70 44 62 2d 3e 6e 53 6f 72 74 20 3d      pDb->nSort =
b7b0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74   sqlite3_stmt_st
b7c0: 61 74 75 73 28 70 53 74 6d 74 2c 53 51 4c 49 54  atus(pStmt,SQLIT
b7d0: 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 53 4f 52  E_STMTSTATUS_SOR
b7e0: 54 2c 31 29 3b 0a 20 20 20 20 20 20 70 44 62 2d  T,1);.      pDb-
b7f0: 3e 6e 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65  >nIndex = sqlite
b800: 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 53  3_stmt_status(pS
b810: 74 6d 74 2c 53 51 4c 49 54 45 5f 53 54 4d 54 53  tmt,SQLITE_STMTS
b820: 54 41 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 2c  TATUS_AUTOINDEX,
b830: 31 29 3b 0a 20 20 20 20 20 20 64 62 52 65 6c 65  1);.      dbRele
b840: 61 73 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  aseColumnNames(p
b850: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 65  );.      p->pPre
b860: 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20  Stmt = 0;..     
b870: 20 69 66 28 20 72 63 73 21 3d 53 51 4c 49 54 45   if( rcs!=SQLITE
b880: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  _OK ){.        /
b890: 2a 20 49 66 20 61 20 72 75 6e 2d 74 69 6d 65 20  * If a run-time 
b8a0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
b8b0: 70 6f 72 74 20 74 68 65 20 65 72 72 6f 72 20 61  port the error a
b8c0: 6e 64 20 73 74 6f 70 20 72 65 61 64 69 6e 67 0a  nd stop reading.
b8d0: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53          ** the S
b8e0: 51 4c 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  QL.  */.        
b8f0: 64 62 52 65 6c 65 61 73 65 53 74 6d 74 28 70 44  dbReleaseStmt(pD
b900: 62 2c 20 70 50 72 65 53 74 6d 74 2c 20 31 29 3b  b, pPreStmt, 1);
b910: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 53 54  .#if SQLITE_TEST
b920: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
b930: 70 44 62 2d 3e 62 4c 65 67 61 63 79 50 72 65 70  pDb->bLegacyPrep
b940: 61 72 65 20 26 26 20 72 63 73 3d 3d 53 51 4c 49  are && rcs==SQLI
b950: 54 45 5f 53 43 48 45 4d 41 20 26 26 20 7a 50 72  TE_SCHEMA && zPr
b960: 65 76 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 20  evSql ){.       
b970: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 75 6e     /* If the run
b980: 74 69 6d 65 20 65 72 72 6f 72 20 77 61 73 20 61  time error was a
b990: 6e 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 2c  n SQLITE_SCHEMA,
b9a0: 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
b9b0: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68  e.          ** h
b9c0: 61 6e 64 6c 65 20 69 73 20 63 6f 6e 66 69 67 75  andle is configu
b9d0: 72 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 6c  red to use the l
b9e0: 65 67 61 63 79 20 73 71 6c 69 74 65 33 5f 70 72  egacy sqlite3_pr
b9f0: 65 70 61 72 65 28 29 20 0a 20 20 20 20 20 20 20  epare() .       
ba00: 20 20 20 2a 2a 20 69 6e 74 65 72 66 61 63 65 2c     ** interface,
ba10: 20 72 65 74 72 79 20 70 72 65 70 61 72 65 28 29   retry prepare()
ba20: 2f 73 74 65 70 28 29 20 6f 6e 20 74 68 65 20 73  /step() on the s
ba30: 61 6d 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ame SQL statemen
ba40: 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  t..          ** 
ba50: 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e  This only happen
ba60: 73 20 6f 6e 63 65 2e 20 49 66 20 74 68 65 72 65  s once. If there
ba70: 20 69 73 20 61 20 73 65 63 6f 6e 64 20 53 51 4c   is a second SQL
ba80: 49 54 45 5f 53 43 48 45 4d 41 0a 20 20 20 20 20  ITE_SCHEMA.     
ba90: 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74       ** error, t
baa0: 68 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62 65  he error will be
bab0: 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
bac0: 20 63 61 6c 6c 65 72 2e 20 2a 2f 0a 20 20 20 20   caller. */.    
bad0: 20 20 20 20 20 20 70 2d 3e 7a 53 71 6c 20 3d 20        p->zSql = 
bae0: 7a 50 72 65 76 53 71 6c 3b 0a 20 20 20 20 20 20  zPrevSql;.      
baf0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
bb00: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
bb10: 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62         Tcl_SetOb
bb20: 6a 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74  jResult(pDb->int
bb30: 65 72 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20  erp,.           
bb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
bb50: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73  l_NewStringObj(s
bb60: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44  qlite3_errmsg(pD
bb70: 62 2d 3e 64 62 29 2c 20 2d 31 29 29 3b 0a 20 20  b->db), -1));.  
bb80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
bb90: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65  _ERROR;.      }e
bba0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 64 62 52  lse{.        dbR
bbb0: 65 6c 65 61 73 65 53 74 6d 74 28 70 44 62 2c 20  eleaseStmt(pDb, 
bbc0: 70 50 72 65 53 74 6d 74 2c 20 30 29 3b 0a 20 20  pPreStmt, 0);.  
bbd0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
bbe0: 0a 20 20 2f 2a 20 46 69 6e 69 73 68 65 64 20 2a  .  /* Finished *
bbf0: 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 42  /.  return TCL_B
bc00: 52 45 41 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  REAK;.}../*.** F
bc10: 72 65 65 20 61 6c 6c 20 72 65 73 6f 75 72 63 65  ree all resource
bc20: 73 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64  s currently held
bc30: 20 62 79 20 74 68 65 20 44 62 45 76 61 6c 43 6f   by the DbEvalCo
bc40: 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65 20  ntext structure 
bc50: 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65  passed.** as the
bc60: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
bc70: 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65   There should be
bc80: 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 63 61 6c   exactly one cal
bc90: 6c 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  l to this functi
bca0: 6f 6e 0a 2a 2a 20 66 6f 72 20 65 61 63 68 20 63  on.** for each c
bcb0: 61 6c 6c 20 74 6f 20 64 62 45 76 61 6c 49 6e 69  all to dbEvalIni
bcc0: 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  t()..*/.static v
bcd0: 6f 69 64 20 64 62 45 76 61 6c 46 69 6e 61 6c 69  oid dbEvalFinali
bce0: 7a 65 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74  ze(DbEvalContext
bcf0: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70   *p){.  if( p->p
bd00: 50 72 65 53 74 6d 74 20 29 7b 0a 20 20 20 20 73  PreStmt ){.    s
bd10: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e  qlite3_reset(p->
bd20: 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 29  pPreStmt->pStmt)
bd30: 3b 0a 20 20 20 20 64 62 52 65 6c 65 61 73 65 53  ;.    dbReleaseS
bd40: 74 6d 74 28 70 2d 3e 70 44 62 2c 20 70 2d 3e 70  tmt(p->pDb, p->p
bd50: 50 72 65 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20  PreStmt, 0);.   
bd60: 20 70 2d 3e 70 50 72 65 53 74 6d 74 20 3d 20 30   p->pPreStmt = 0
bd70: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
bd80: 41 72 72 61 79 20 29 7b 0a 20 20 20 20 54 63 6c  Array ){.    Tcl
bd90: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 2d  _DecrRefCount(p-
bda0: 3e 70 41 72 72 61 79 29 3b 0a 20 20 20 20 70 2d  >pArray);.    p-
bdb0: 3e 70 41 72 72 61 79 20 3d 20 30 3b 0a 20 20 7d  >pArray = 0;.  }
bdc0: 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  .  Tcl_DecrRefCo
bdd0: 75 6e 74 28 70 2d 3e 70 53 71 6c 29 3b 0a 20 20  unt(p->pSql);.  
bde0: 64 62 52 65 6c 65 61 73 65 43 6f 6c 75 6d 6e 4e  dbReleaseColumnN
bdf0: 61 6d 65 73 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ames(p);.}../*.*
be00: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
be10: 65 72 20 74 6f 20 61 20 54 63 6c 5f 4f 62 6a 20  er to a Tcl_Obj 
be20: 73 74 72 75 63 74 75 72 65 20 77 69 74 68 20 72  structure with r
be30: 65 66 2d 63 6f 75 6e 74 20 30 20 74 68 61 74 20  ef-count 0 that 
be40: 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20  contains.** the 
be50: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 69 43  value for the iC
be60: 6f 6c 27 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20  ol'th column of 
be70: 74 68 65 20 72 6f 77 20 63 75 72 72 65 6e 74 6c  the row currentl
be80: 79 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 0a  y pointed to by.
be90: 2a 2a 20 74 68 65 20 44 62 45 76 61 6c 43 6f 6e  ** the DbEvalCon
bea0: 74 65 78 74 20 73 74 72 75 63 74 75 72 65 20 70  text structure p
beb0: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
bec0: 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  st argument..*/.
bed0: 73 74 61 74 69 63 20 54 63 6c 5f 4f 62 6a 20 2a  static Tcl_Obj *
bee0: 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75  dbEvalColumnValu
bef0: 65 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20  e(DbEvalContext 
bf00: 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20  *p, int iCol){. 
bf10: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
bf20: 53 74 6d 74 20 3d 20 70 2d 3e 70 50 72 65 53 74  Stmt = p->pPreSt
bf30: 6d 74 2d 3e 70 53 74 6d 74 3b 0a 20 20 73 77 69  mt->pStmt;.  swi
bf40: 74 63 68 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c  tch( sqlite3_col
bf50: 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c 20  umn_type(pStmt, 
bf60: 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 63 61 73  iCol) ){.    cas
bf70: 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b  e SQLITE_BLOB: {
bf80: 0a 20 20 20 20 20 20 69 6e 74 20 62 79 74 65 73  .      int bytes
bf90: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
bfa0: 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20 69  n_bytes(pStmt, i
bfb0: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73  Col);.      cons
bfc0: 74 20 63 68 61 72 20 2a 7a 42 6c 6f 62 20 3d 20  t char *zBlob = 
bfd0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
bfe0: 6c 6f 62 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29  lob(pStmt, iCol)
bff0: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 42 6c  ;.      if( !zBl
c000: 6f 62 20 29 20 62 79 74 65 73 20 3d 20 30 3b 0a  ob ) bytes = 0;.
c010: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c        return Tcl
c020: 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a  _NewByteArrayObj
c030: 28 28 75 38 2a 29 7a 42 6c 6f 62 2c 20 62 79 74  ((u8*)zBlob, byt
c040: 65 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  es);.    }.    c
c050: 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  ase SQLITE_INTEG
c060: 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ER: {.      sqli
c070: 74 65 5f 69 6e 74 36 34 20 76 20 3d 20 73 71 6c  te_int64 v = sql
c080: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  ite3_column_int6
c090: 34 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a  4(pStmt, iCol);.
c0a0: 20 20 20 20 20 20 69 66 28 20 76 3e 3d 2d 32 31        if( v>=-21
c0b0: 34 37 34 38 33 36 34 37 20 26 26 20 76 3c 3d 32  47483647 && v<=2
c0c0: 31 34 37 34 38 33 36 34 37 20 29 7b 0a 20 20 20  147483647 ){.   
c0d0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f       return Tcl_
c0e0: 4e 65 77 49 6e 74 4f 62 6a 28 28 69 6e 74 29 76  NewIntObj((int)v
c0f0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
c100: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
c110: 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a  cl_NewWideIntObj
c120: 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (v);.      }.   
c130: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
c140: 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20  TE_FLOAT: {.    
c150: 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 65 77    return Tcl_New
c160: 44 6f 75 62 6c 65 4f 62 6a 28 73 71 6c 69 74 65  DoubleObj(sqlite
c170: 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28  3_column_double(
c180: 70 53 74 6d 74 2c 20 69 43 6f 6c 29 29 3b 0a 20  pStmt, iCol));. 
c190: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
c1a0: 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20  LITE_NULL: {.   
c1b0: 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 65     return Tcl_Ne
c1c0: 77 53 74 72 69 6e 67 4f 62 6a 28 70 2d 3e 70 44  wStringObj(p->pD
c1d0: 62 2d 3e 7a 4e 75 6c 6c 2c 20 2d 31 29 3b 0a 20  b->zNull, -1);. 
c1e0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
c1f0: 72 6e 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  rn Tcl_NewString
c200: 4f 62 6a 28 28 63 68 61 72 2a 29 73 71 6c 69 74  Obj((char*)sqlit
c210: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
c220: 53 74 6d 74 2c 20 69 43 6f 6c 29 2c 20 2d 31 29  Stmt, iCol), -1)
c230: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 75 73  ;.}../*.** If us
c240: 69 6e 67 20 54 63 6c 20 76 65 72 73 69 6f 6e 20  ing Tcl version 
c250: 38 2e 36 20 6f 72 20 67 72 65 61 74 65 72 2c 20  8.6 or greater, 
c260: 75 73 65 20 74 68 65 20 4e 52 20 66 75 6e 63 74  use the NR funct
c270: 69 6f 6e 73 20 74 6f 20 61 76 6f 69 64 0a 2a 2a  ions to avoid.**
c280: 20 72 65 63 75 72 73 69 76 65 20 65 76 61 6c 75   recursive evalu
c290: 74 69 6f 6e 20 6f 66 20 73 63 72 69 70 74 73 20  tion of scripts 
c2a0: 62 79 20 74 68 65 20 5b 64 62 20 65 76 61 6c 5d  by the [db eval]
c2b0: 20 61 6e 64 20 5b 64 62 20 74 72 61 6e 73 5d 0a   and [db trans].
c2c0: 2a 2a 20 63 6f 6d 6d 61 6e 64 73 2e 20 45 76 65  ** commands. Eve
c2d0: 6e 20 69 66 20 74 68 65 20 68 65 61 64 65 72 73  n if the headers
c2e0: 20 75 73 65 64 20 77 68 69 6c 65 20 63 6f 6d 70   used while comp
c2f0: 69 6c 69 6e 67 20 74 68 65 20 65 78 74 65 6e 73  iling the extens
c300: 69 6f 6e 0a 2a 2a 20 61 72 65 20 38 2e 36 20 6f  ion.** are 8.6 o
c310: 72 20 6e 65 77 65 72 2c 20 74 68 65 20 63 6f 64  r newer, the cod
c320: 65 20 73 74 69 6c 6c 20 74 65 73 74 73 20 74 68  e still tests th
c330: 65 20 54 63 6c 20 76 65 72 73 69 6f 6e 20 61 74  e Tcl version at
c340: 20 72 75 6e 74 69 6d 65 2e 0a 2a 2a 20 54 68 69   runtime..** Thi
c350: 73 20 61 6c 6c 6f 77 73 20 73 74 75 62 73 2d 65  s allows stubs-e
c360: 6e 61 62 6c 65 64 20 62 75 69 6c 64 73 20 74 6f  nabled builds to
c370: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 6f 6c   be used with ol
c380: 64 65 72 20 54 63 6c 20 6c 69 62 72 61 72 69 65  der Tcl librarie
c390: 73 2e 0a 2a 2f 0a 23 69 66 20 54 43 4c 5f 4d 41  s..*/.#if TCL_MA
c3a0: 4a 4f 52 5f 56 45 52 53 49 4f 4e 3e 38 20 7c 7c  JOR_VERSION>8 ||
c3b0: 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53   (TCL_MAJOR_VERS
c3c0: 49 4f 4e 3d 3d 38 20 26 26 20 54 43 4c 5f 4d 49  ION==8 && TCL_MI
c3d0: 4e 4f 52 5f 56 45 52 53 49 4f 4e 3e 3d 36 29 0a  NOR_VERSION>=6).
c3e0: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
c3f0: 54 43 4c 5f 4e 52 45 20 31 0a 73 74 61 74 69 63  TCL_NRE 1.static
c400: 20 69 6e 74 20 44 62 55 73 65 4e 72 65 28 76 6f   int DbUseNre(vo
c410: 69 64 29 7b 0a 20 20 69 6e 74 20 6d 61 6a 6f 72  id){.  int major
c420: 2c 20 6d 69 6e 6f 72 3b 0a 20 20 54 63 6c 5f 47  , minor;.  Tcl_G
c430: 65 74 56 65 72 73 69 6f 6e 28 26 6d 61 6a 6f 72  etVersion(&major
c440: 2c 20 26 6d 69 6e 6f 72 2c 20 30 2c 20 30 29 3b  , &minor, 0, 0);
c450: 0a 20 20 72 65 74 75 72 6e 28 20 28 6d 61 6a 6f  .  return( (majo
c460: 72 3d 3d 38 20 26 26 20 6d 69 6e 6f 72 3e 3d 36  r==8 && minor>=6
c470: 29 20 7c 7c 20 6d 61 6a 6f 72 3e 38 20 29 3b 0a  ) || major>8 );.
c480: 7d 0a 23 65 6c 73 65 0a 2f 2a 20 0a 2a 2a 20 43  }.#else./* .** C
c490: 6f 6d 70 69 6c 69 6e 67 20 75 73 69 6e 67 20 68  ompiling using h
c4a0: 65 61 64 65 72 73 20 65 61 72 6c 69 65 72 20 74  eaders earlier t
c4b0: 68 61 6e 20 38 2e 36 2e 20 49 6e 20 74 68 69 73  han 8.6. In this
c4c0: 20 63 61 73 65 20 4e 52 20 63 61 6e 6e 6f 74 20   case NR cannot 
c4d0: 62 65 0a 2a 2a 20 75 73 65 64 2c 20 73 6f 20 44  be.** used, so D
c4e0: 62 55 73 65 4e 72 65 28 29 20 74 6f 20 61 6c 77  bUseNre() to alw
c4f0: 61 79 73 20 72 65 74 75 72 6e 20 7a 65 72 6f 2e  ays return zero.
c500: 20 41 64 64 20 23 64 65 66 69 6e 65 73 20 66 6f   Add #defines fo
c510: 72 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 54  r the other.** T
c520: 63 6c 5f 4e 52 78 78 78 28 29 20 66 75 6e 63 74  cl_NRxxx() funct
c530: 69 6f 6e 73 20 74 6f 20 70 72 65 76 65 6e 74 20  ions to prevent 
c540: 74 68 65 6d 20 66 72 6f 6d 20 63 61 75 73 69 6e  them from causin
c550: 67 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 65 72  g compilation er
c560: 72 6f 72 73 2c 0a 2a 2a 20 65 76 65 6e 20 74 68  rors,.** even th
c570: 6f 75 67 68 20 74 68 65 20 6f 6e 6c 79 20 69 6e  ough the only in
c580: 76 6f 63 61 74 69 6f 6e 73 20 6f 66 20 74 68 65  vocations of the
c590: 6d 20 61 72 65 20 77 69 74 68 69 6e 20 63 6f 6e  m are within con
c5a0: 64 69 74 69 6f 6e 61 6c 20 62 6c 6f 63 6b 73 20  ditional blocks 
c5b0: 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  .** of the form:
c5c0: 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 44 62 55  .**.**   if( DbU
c5d0: 73 65 4e 72 65 28 29 20 29 20 7b 20 2e 2e 2e 20  seNre() ) { ... 
c5e0: 7d 0a 2a 2f 0a 23 20 64 65 66 69 6e 65 20 53 51  }.*/.# define SQ
c5f0: 4c 49 54 45 5f 54 43 4c 5f 4e 52 45 20 30 0a 23  LITE_TCL_NRE 0.#
c600: 20 64 65 66 69 6e 65 20 44 62 55 73 65 4e 72 65   define DbUseNre
c610: 28 29 20 30 0a 23 20 64 65 66 69 6e 65 20 54 63  () 0.# define Tc
c620: 6c 5f 4e 52 41 64 64 43 61 6c 6c 62 61 63 6b 28  l_NRAddCallback(
c630: 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 30 0a 23  a,b,c,d,e,f) 0.#
c640: 20 64 65 66 69 6e 65 20 54 63 6c 5f 4e 52 45 76   define Tcl_NREv
c650: 61 6c 4f 62 6a 28 61 2c 62 2c 63 29 20 30 0a 23  alObj(a,b,c) 0.#
c660: 20 64 65 66 69 6e 65 20 54 63 6c 5f 4e 52 43 72   define Tcl_NRCr
c670: 65 61 74 65 43 6f 6d 6d 61 6e 64 28 61 2c 62 2c  eateCommand(a,b,
c680: 63 2c 64 2c 65 2c 66 29 20 30 0a 23 65 6e 64 69  c,d,e,f) 0.#endi
c690: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  f../*.** This fu
c6a0: 6e 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20 6f  nction is part o
c6b0: 66 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  f the implementa
c6c0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6d 6d  tion of the comm
c6d0: 61 6e 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 24 64 62  and:.**.**   $db
c6e0: 20 65 76 61 6c 20 53 51 4c 20 3f 41 52 52 41 59   eval SQL ?ARRAY
c6f0: 4e 41 4d 45 3f 20 53 43 52 49 50 54 0a 2a 2f 0a  NAME? SCRIPT.*/.
c700: 73 74 61 74 69 63 20 69 6e 74 20 44 62 45 76 61  static int DbEva
c710: 6c 4e 65 78 74 43 6d 64 28 0a 20 20 43 6c 69 65  lNextCmd(.  Clie
c720: 6e 74 44 61 74 61 20 64 61 74 61 5b 5d 2c 20 20  ntData data[],  
c730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c740: 20 2f 2a 20 64 61 74 61 5b 30 5d 20 69 73 20 74   /* data[0] is t
c750: 68 65 20 28 44 62 45 76 61 6c 43 6f 6e 74 65 78  he (DbEvalContex
c760: 74 2a 29 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  t*) */.  Tcl_Int
c770: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
c780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c790: 20 54 63 6c 20 69 6e 74 65 72 70 72 65 74 65 72   Tcl interpreter
c7a0: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 75 6c 74   */.  int result
c7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
c7d0: 73 75 6c 74 20 73 6f 20 66 61 72 20 2a 2f 0a 29  sult so far */.)
c7e0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 72 65 73  {.  int rc = res
c7f0: 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ult;            
c800: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
c810: 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a  rn code */..  /*
c820: 20 54 68 65 20 66 69 72 73 74 20 65 6c 65 6d 65   The first eleme
c830: 6e 74 20 6f 66 20 74 68 65 20 64 61 74 61 5b 5d  nt of the data[]
c840: 20 61 72 72 61 79 20 69 73 20 61 20 70 6f 69 6e   array is a poin
c850: 74 65 72 20 74 6f 20 61 20 44 62 45 76 61 6c 43  ter to a DbEvalC
c860: 6f 6e 74 65 78 74 0a 20 20 2a 2a 20 73 74 72 75  ontext.  ** stru
c870: 63 74 75 72 65 20 61 6c 6c 6f 63 61 74 65 64 20  cture allocated 
c880: 75 73 69 6e 67 20 54 63 6c 5f 41 6c 6c 6f 63 28  using Tcl_Alloc(
c890: 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 65 6c  ). The second el
c8a0: 65 6d 65 6e 74 20 6f 66 20 64 61 74 61 5b 5d 0a  ement of data[].
c8b0: 20 20 2a 2a 20 69 73 20 61 20 70 6f 69 6e 74 65    ** is a pointe
c8c0: 72 20 74 6f 20 61 20 54 63 6c 5f 4f 62 6a 20 63  r to a Tcl_Obj c
c8d0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 63  ontaining the sc
c8e0: 72 69 70 74 20 74 6f 20 72 75 6e 20 66 6f 72 20  ript to run for 
c8f0: 65 61 63 68 20 72 6f 77 0a 20 20 2a 2a 20 72 65  each row.  ** re
c900: 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 71 75  turned by the qu
c910: 65 72 69 65 73 20 65 6e 63 61 70 73 75 6c 61 74  eries encapsulat
c920: 65 64 20 69 6e 20 64 61 74 61 5b 30 5d 2e 20 2a  ed in data[0]. *
c930: 2f 0a 20 20 44 62 45 76 61 6c 43 6f 6e 74 65 78  /.  DbEvalContex
c940: 74 20 2a 70 20 3d 20 28 44 62 45 76 61 6c 43 6f  t *p = (DbEvalCo
c950: 6e 74 65 78 74 20 2a 29 64 61 74 61 5b 30 5d 3b  ntext *)data[0];
c960: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72  .  Tcl_Obj *pScr
c970: 69 70 74 20 3d 20 28 54 63 6c 5f 4f 62 6a 20 2a  ipt = (Tcl_Obj *
c980: 29 64 61 74 61 5b 31 5d 3b 0a 20 20 54 63 6c 5f  )data[1];.  Tcl_
c990: 4f 62 6a 20 2a 70 41 72 72 61 79 20 3d 20 70 2d  Obj *pArray = p-
c9a0: 3e 70 41 72 72 61 79 3b 0a 0a 20 20 77 68 69 6c  >pArray;..  whil
c9b0: 65 28 20 28 72 63 3d 3d 54 43 4c 5f 4f 4b 20 7c  e( (rc==TCL_OK |
c9c0: 7c 20 72 63 3d 3d 54 43 4c 5f 43 4f 4e 54 49 4e  | rc==TCL_CONTIN
c9d0: 55 45 29 20 26 26 20 54 43 4c 5f 4f 4b 3d 3d 28  UE) && TCL_OK==(
c9e0: 72 63 20 3d 20 64 62 45 76 61 6c 53 74 65 70 28  rc = dbEvalStep(
c9f0: 70 29 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  p)) ){.    int i
ca00: 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a  ;.    int nCol;.
ca10: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70      Tcl_Obj **ap
ca20: 43 6f 6c 4e 61 6d 65 3b 0a 20 20 20 20 64 62 45  ColName;.    dbE
ca30: 76 61 6c 52 6f 77 49 6e 66 6f 28 70 2c 20 26 6e  valRowInfo(p, &n
ca40: 43 6f 6c 2c 20 26 61 70 43 6f 6c 4e 61 6d 65 29  Col, &apColName)
ca50: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
ca60: 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
ca70: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c     Tcl_Obj *pVal
ca80: 20 3d 20 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56   = dbEvalColumnV
ca90: 61 6c 75 65 28 70 2c 20 69 29 3b 0a 20 20 20 20  alue(p, i);.    
caa0: 20 20 69 66 28 20 70 41 72 72 61 79 3d 3d 30 20    if( pArray==0 
cab0: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4f  ){.        Tcl_O
cac0: 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70  bjSetVar2(interp
cad0: 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20  , apColName[i], 
cae0: 30 2c 20 70 56 61 6c 2c 20 30 29 3b 0a 20 20 20  0, pVal, 0);.   
caf0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
cb00: 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32    Tcl_ObjSetVar2
cb10: 28 69 6e 74 65 72 70 2c 20 70 41 72 72 61 79 2c  (interp, pArray,
cb20: 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 70   apColName[i], p
cb30: 56 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  Val, 0);.      }
cb40: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
cb50: 68 65 20 72 65 71 75 69 72 65 64 20 69 6e 74 65  he required inte
cb60: 72 70 72 65 74 65 72 20 76 61 72 69 61 62 6c 65  rpreter variable
cb70: 73 20 61 72 65 20 6e 6f 77 20 70 6f 70 75 6c 61  s are now popula
cb80: 74 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74  ted with the dat
cb90: 61 20 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74  a .    ** from t
cba0: 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2e 20  he current row. 
cbb0: 49 66 20 75 73 69 6e 67 20 4e 52 45 2c 20 73 63  If using NRE, sc
cbc0: 68 65 64 75 6c 65 20 63 61 6c 6c 62 61 63 6b 73  hedule callbacks
cbd0: 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 20 20 20   to evaluate.   
cbe0: 20 2a 2a 20 73 63 72 69 70 74 20 70 53 63 72 69   ** script pScri
cbf0: 70 74 2c 20 74 68 65 6e 20 74 6f 20 69 6e 76 6f  pt, then to invo
cc00: 6b 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ke this function
cc10: 20 61 67 61 69 6e 20 74 6f 20 66 65 74 63 68 20   again to fetch 
cc20: 74 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20  the next.    ** 
cc30: 72 6f 77 20 28 6f 72 20 63 6c 65 61 6e 20 75 70  row (or clean up
cc40: 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
cc50: 6e 65 78 74 20 72 6f 77 20 6f 72 20 74 68 65 20  next row or the 
cc60: 73 63 72 69 70 74 20 74 68 72 6f 77 73 20 61 6e  script throws an
cc70: 0a 20 20 20 20 2a 2a 20 65 78 63 65 70 74 69 6f  .    ** exceptio
cc80: 6e 29 2e 20 41 66 74 65 72 20 73 63 68 65 64 75  n). After schedu
cc90: 6c 69 6e 67 20 74 68 65 20 63 61 6c 6c 62 61 63  ling the callbac
cca0: 6b 73 2c 20 72 65 74 75 72 6e 20 63 6f 6e 74 72  ks, return contr
ccb0: 6f 6c 20 74 6f 20 74 68 65 20 0a 20 20 20 20 2a  ol to the .    *
ccc0: 2a 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 2a 2a  * caller..    **
ccd0: 0a 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 20 75  .    ** If not u
cce0: 73 69 6e 67 20 4e 52 45 2c 20 65 76 61 6c 75 61  sing NRE, evalua
ccf0: 74 65 20 70 53 63 72 69 70 74 20 64 69 72 65 63  te pScript direc
cd00: 74 6c 79 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65  tly and continue
cd10: 20 77 69 74 68 20 74 68 65 0a 20 20 20 20 2a 2a   with the.    **
cd20: 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20   next iteration 
cd30: 6f 66 20 74 68 69 73 20 77 68 69 6c 65 28 2e 2e  of this while(..
cd40: 2e 29 20 6c 6f 6f 70 2e 20 20 2a 2f 0a 20 20 20  .) loop.  */.   
cd50: 20 69 66 28 20 44 62 55 73 65 4e 72 65 28 29 20   if( DbUseNre() 
cd60: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 4e 52 41  ){.      Tcl_NRA
cd70: 64 64 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72  ddCallback(inter
cd80: 70 2c 20 44 62 45 76 61 6c 4e 65 78 74 43 6d 64  p, DbEvalNextCmd
cd90: 2c 20 28 76 6f 69 64 2a 29 70 2c 20 28 76 6f 69  , (void*)p, (voi
cda0: 64 2a 29 70 53 63 72 69 70 74 2c 20 30 2c 20 30  d*)pScript, 0, 0
cdb0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
cdc0: 54 63 6c 5f 4e 52 45 76 61 6c 4f 62 6a 28 69 6e  Tcl_NREvalObj(in
cdd0: 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20 30  terp, pScript, 0
cde0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
cdf0: 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61      rc = Tcl_Eva
ce00: 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 70  lObjEx(interp, p
ce10: 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20 20 20  Script, 0);.    
ce20: 7d 0a 20 20 7d 0a 0a 20 20 54 63 6c 5f 44 65 63  }.  }..  Tcl_Dec
ce30: 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70  rRefCount(pScrip
ce40: 74 29 3b 0a 20 20 64 62 45 76 61 6c 46 69 6e 61  t);.  dbEvalFina
ce50: 6c 69 7a 65 28 70 29 3b 0a 20 20 54 63 6c 5f 46  lize(p);.  Tcl_F
ce60: 72 65 65 28 28 63 68 61 72 20 2a 29 70 29 3b 0a  ree((char *)p);.
ce70: 0a 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 4f  .  if( rc==TCL_O
ce80: 4b 20 7c 7c 20 72 63 3d 3d 54 43 4c 5f 42 52 45  K || rc==TCL_BRE
ce90: 41 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 52 65  AK ){.    Tcl_Re
cea0: 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  setResult(interp
ceb0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 54 43 4c 5f  );.    rc = TCL_
cec0: 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OK;.  }.  return
ced0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
cee0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
cef0: 73 65 64 20 62 79 20 74 68 65 20 69 6d 70 6c 65  sed by the imple
cf00: 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68  mentations of th
cf10: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 61 74 61  e following data
cf20: 62 61 73 65 20 0a 2a 2a 20 68 61 6e 64 6c 65 20  base .** handle 
cf30: 73 75 62 2d 63 6f 6d 6d 61 6e 64 73 3a 0a 2a 2a  sub-commands:.**
cf40: 0a 2a 2a 20 20 20 24 64 62 20 75 70 64 61 74 65  .**   $db update
cf50: 5f 68 6f 6f 6b 20 3f 53 43 52 49 50 54 3f 0a 2a  _hook ?SCRIPT?.*
cf60: 2a 20 20 20 24 64 62 20 77 61 6c 5f 68 6f 6f 6b  *   $db wal_hook
cf70: 20 3f 53 43 52 49 50 54 3f 0a 2a 2a 20 20 20 24   ?SCRIPT?.**   $
cf80: 64 62 20 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 20 3f  db commit_hook ?
cf90: 53 43 52 49 50 54 3f 0a 2a 2a 20 20 20 24 64 62  SCRIPT?.**   $db
cfa0: 20 70 72 65 75 70 64 61 74 65 20 68 6f 6f 6b 20   preupdate hook 
cfb0: 3f 53 43 52 49 50 54 3f 0a 2a 2f 0a 73 74 61 74  ?SCRIPT?.*/.stat
cfc0: 69 63 20 76 6f 69 64 20 44 62 48 6f 6f 6b 43 6d  ic void DbHookCm
cfd0: 64 28 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d(.  Tcl_Interp 
cfe0: 2a 69 6e 74 65 72 70 2c 20 20 20 20 20 20 20 20  *interp,        
cff0: 20 20 20 20 20 2f 2a 20 54 63 6c 20 69 6e 74 65       /* Tcl inte
d000: 72 70 72 65 74 65 72 20 2a 2f 0a 20 20 53 71 6c  rpreter */.  Sql
d010: 69 74 65 44 62 20 2a 70 44 62 2c 20 20 20 20 20  iteDb *pDb,     
d020: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d030: 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  Database handle 
d040: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 41  */.  Tcl_Obj *pA
d050: 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rg,             
d060: 20 20 20 20 20 2f 2a 20 53 43 52 49 50 54 20 61       /* SCRIPT a
d070: 72 67 75 6d 65 6e 74 20 28 6f 72 20 4e 55 4c 4c  rgument (or NULL
d080: 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  ) */.  Tcl_Obj *
d090: 2a 70 70 48 6f 6f 6b 20 20 20 20 20 20 20 20 20  *ppHook         
d0a0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
d0b0: 72 20 74 6f 20 6d 65 6d 62 65 72 20 6f 66 20 53  r to member of S
d0c0: 71 6c 69 74 65 44 62 20 2a 2f 0a 29 7b 0a 20 20  qliteDb */.){.  
d0d0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 44  sqlite3 *db = pD
d0e0: 62 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 2a 70  b->db;..  if( *p
d0f0: 70 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 54 63 6c  pHook ){.    Tcl
d100: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
d110: 74 65 72 70 2c 20 2a 70 70 48 6f 6f 6b 29 3b 0a  terp, *ppHook);.
d120: 20 20 20 20 69 66 28 20 70 41 72 67 20 29 7b 0a      if( pArg ){.
d130: 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65        Tcl_DecrRe
d140: 66 43 6f 75 6e 74 28 2a 70 70 48 6f 6f 6b 29 3b  fCount(*ppHook);
d150: 0a 20 20 20 20 20 20 2a 70 70 48 6f 6f 6b 20 3d  .      *ppHook =
d160: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
d170: 69 66 28 20 70 41 72 67 20 29 7b 0a 20 20 20 20  if( pArg ){.    
d180: 61 73 73 65 72 74 28 20 21 28 2a 70 70 48 6f 6f  assert( !(*ppHoo
d190: 6b 29 20 29 3b 0a 20 20 20 20 69 66 28 20 54 63  k) );.    if( Tc
d1a0: 6c 5f 47 65 74 43 68 61 72 4c 65 6e 67 74 68 28  l_GetCharLength(
d1b0: 70 41 72 67 29 3e 30 20 29 7b 0a 20 20 20 20 20  pArg)>0 ){.     
d1c0: 20 2a 70 70 48 6f 6f 6b 20 3d 20 70 41 72 67 3b   *ppHook = pArg;
d1d0: 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  .      Tcl_IncrR
d1e0: 65 66 43 6f 75 6e 74 28 2a 70 70 48 6f 6f 6b 29  efCount(*ppHook)
d1f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66  ;.    }.  }..#if
d200: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
d210: 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b  E_PREUPDATE_HOOK
d220: 0a 20 20 73 71 6c 69 74 65 33 5f 70 72 65 75 70  .  sqlite3_preup
d230: 64 61 74 65 5f 68 6f 6f 6b 28 64 62 2c 20 28 70  date_hook(db, (p
d240: 44 62 2d 3e 70 50 72 65 55 70 64 61 74 65 48 6f  Db->pPreUpdateHo
d250: 6f 6b 3f 44 62 50 72 65 55 70 64 61 74 65 48 61  ok?DbPreUpdateHa
d260: 6e 64 6c 65 72 3a 30 29 2c 20 70 44 62 29 3b 0a  ndler:0), pDb);.
d270: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
d280: 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28 64 62 2c  _update_hook(db,
d290: 20 28 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f   (pDb->pUpdateHo
d2a0: 6f 6b 3f 44 62 55 70 64 61 74 65 48 61 6e 64 6c  ok?DbUpdateHandl
d2b0: 65 72 3a 30 29 2c 20 70 44 62 29 3b 0a 20 20 73  er:0), pDb);.  s
d2c0: 71 6c 69 74 65 33 5f 72 6f 6c 6c 62 61 63 6b 5f  qlite3_rollback_
d2d0: 68 6f 6f 6b 28 64 62 2c 20 28 70 44 62 2d 3e 70  hook(db, (pDb->p
d2e0: 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3f 44 62 52  RollbackHook?DbR
d2f0: 6f 6c 6c 62 61 63 6b 48 61 6e 64 6c 65 72 3a 30  ollbackHandler:0
d300: 29 2c 20 70 44 62 29 3b 0a 20 20 73 71 6c 69 74  ), pDb);.  sqlit
d310: 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20  e3_wal_hook(db, 
d320: 28 70 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 3f 44  (pDb->pWalHook?D
d330: 62 57 61 6c 48 61 6e 64 6c 65 72 3a 30 29 2c 20  bWalHandler:0), 
d340: 70 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  pDb);.}../*.** T
d350: 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d  he "sqlite" comm
d360: 61 6e 64 20 62 65 6c 6f 77 20 63 72 65 61 74 65  and below create
d370: 73 20 61 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d  s a new Tcl comm
d380: 61 6e 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20  and for each.** 
d390: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 74 20 6f 70  connection it op
d3a0: 65 6e 73 20 74 6f 20 61 6e 20 53 51 4c 69 74 65  ens to an SQLite
d3b0: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
d3c0: 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f   routine is invo
d3d0: 6b 65 64 0a 2a 2a 20 77 68 65 6e 65 76 65 72 20  ked.** whenever 
d3e0: 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e  one of those con
d3f0: 6e 65 63 74 69 6f 6e 2d 73 70 65 63 69 66 69 63  nection-specific
d400: 20 63 6f 6d 6d 61 6e 64 73 20 69 73 20 65 78 65   commands is exe
d410: 63 75 74 65 64 0a 2a 2a 20 69 6e 20 54 63 6c 2e  cuted.** in Tcl.
d420: 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69    For example, i
d430: 66 20 79 6f 75 20 72 75 6e 20 54 63 6c 20 63 6f  f you run Tcl co
d440: 64 65 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  de like this:.**
d450: 0a 2a 2a 20 20 20 20 20 20 20 73 71 6c 69 74 65  .**       sqlite
d460: 33 20 64 62 31 20 20 22 6d 79 5f 64 61 74 61 62  3 db1  "my_datab
d470: 61 73 65 22 0a 2a 2a 20 20 20 20 20 20 20 64 62  ase".**       db
d480: 31 20 63 6c 6f 73 65 0a 2a 2a 0a 2a 2a 20 54 68  1 close.**.** Th
d490: 65 20 66 69 72 73 74 20 63 6f 6d 6d 61 6e 64 20  e first command 
d4a0: 6f 70 65 6e 73 20 61 20 63 6f 6e 6e 65 63 74 69  opens a connecti
d4b0: 6f 6e 20 74 6f 20 74 68 65 20 22 6d 79 5f 64 61  on to the "my_da
d4c0: 74 61 62 61 73 65 22 20 64 61 74 61 62 61 73 65  tabase" database
d4d0: 0a 2a 2a 20 61 6e 64 20 63 61 6c 6c 73 20 74 68  .** and calls th
d4e0: 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 22 64  at connection "d
d4f0: 62 31 22 2e 20 20 54 68 65 20 73 65 63 6f 6e 64  b1".  The second
d500: 20 63 6f 6d 6d 61 6e 64 20 63 61 75 73 65 73 20   command causes 
d510: 74 68 69 73 0a 2a 2a 20 73 75 62 72 6f 75 74 69  this.** subrouti
d520: 6e 65 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  ne to be invoked
d530: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d540: 44 62 4f 62 6a 43 6d 64 28 76 6f 69 64 20 2a 63  DbObjCmd(void *c
d550: 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  d, Tcl_Interp *i
d560: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
d570: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f  Tcl_Obj *const*o
d580: 62 6a 76 29 7b 0a 20 20 53 71 6c 69 74 65 44 62  bjv){.  SqliteDb
d590: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
d5a0: 62 2a 29 63 64 3b 0a 20 20 69 6e 74 20 63 68 6f  b*)cd;.  int cho
d5b0: 69 63 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ice;.  int rc = 
d5c0: 54 43 4c 5f 4f 4b 3b 0a 20 20 73 74 61 74 69 63  TCL_OK;.  static
d5d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 44 42 5f   const char *DB_
d5e0: 73 74 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 22  strs[] = {.    "
d5f0: 61 75 74 68 6f 72 69 7a 65 72 22 2c 20 20 20 20  authorizer",    
d600: 20 20 20 20 20 22 62 61 63 6b 75 70 22 2c 20 20       "backup",  
d610: 20 20 20 20 20 20 20 20 20 20 22 62 75 73 79 22            "busy"
d620: 2c 0a 20 20 20 20 22 63 61 63 68 65 22 2c 20 20  ,.    "cache",  
d630: 20 20 20 20 20 20 20 20 20 20 20 20 22 63 68 61              "cha
d640: 6e 67 65 73 22 2c 20 20 20 20 20 20 20 20 20 20  nges",          
d650: 20 22 63 6c 6f 73 65 22 2c 0a 20 20 20 20 22 63   "close",.    "c
d660: 6f 6c 6c 61 74 65 22 2c 20 20 20 20 20 20 20 20  ollate",        
d670: 20 20 20 20 22 63 6f 6c 6c 61 74 69 6f 6e 5f 6e      "collation_n
d680: 65 65 64 65 64 22 2c 20 20 22 63 6f 6d 6d 69 74  eeded",  "commit
d690: 5f 68 6f 6f 6b 22 2c 0a 20 20 20 20 22 63 6f 6d  _hook",.    "com
d6a0: 70 6c 65 74 65 22 2c 20 20 20 20 20 20 20 20 20  plete",         
d6b0: 20 20 22 63 6f 70 79 22 2c 20 20 20 20 20 20 20    "copy",       
d6c0: 20 20 20 20 20 20 20 22 65 6e 61 62 6c 65 5f 6c         "enable_l
d6d0: 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 22 2c 0a  oad_extension",.
d6e0: 20 20 20 20 22 65 72 72 6f 72 63 6f 64 65 22 2c      "errorcode",
d6f0: 20 20 20 20 20 20 20 20 20 20 22 65 76 61 6c 22            "eval"
d700: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,              "
d710: 65 78 69 73 74 73 22 2c 0a 20 20 20 20 22 66 75  exists",.    "fu
d720: 6e 63 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 20  nction",        
d730: 20 20 20 22 69 6e 63 72 62 6c 6f 62 22 2c 20 20     "incrblob",  
d740: 20 20 20 20 20 20 20 20 22 69 6e 74 65 72 72 75          "interru
d750: 70 74 22 2c 0a 20 20 20 20 22 6c 61 73 74 5f 69  pt",.    "last_i
d760: 6e 73 65 72 74 5f 72 6f 77 69 64 22 2c 20 20 22  nsert_rowid",  "
d770: 6e 75 6c 6c 76 61 6c 75 65 22 2c 20 20 20 20 20  nullvalue",     
d780: 20 20 20 20 22 6f 6e 65 63 6f 6c 75 6d 6e 22 2c      "onecolumn",
d790: 0a 20 20 20 20 22 70 72 65 75 70 64 61 74 65 22  .    "preupdate"
d7a0: 2c 20 20 20 20 20 20 20 20 20 20 22 70 72 6f 66  ,          "prof
d7b0: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ile",           
d7c0: 22 70 72 6f 67 72 65 73 73 22 2c 0a 20 20 20 20  "progress",.    
d7d0: 22 72 65 6b 65 79 22 2c 20 20 20 20 20 20 20 20  "rekey",        
d7e0: 20 20 20 20 20 20 22 72 65 73 74 6f 72 65 22 2c        "restore",
d7f0: 20 20 20 20 20 20 20 20 20 20 20 22 72 6f 6c 6c             "roll
d800: 62 61 63 6b 5f 68 6f 6f 6b 22 2c 0a 20 20 20 20  back_hook",.    
d810: 22 73 74 61 74 75 73 22 2c 20 20 20 20 20 20 20  "status",       
d820: 20 20 20 20 20 20 22 74 69 6d 65 6f 75 74 22 2c        "timeout",
d830: 20 20 20 20 20 20 20 20 20 20 20 22 74 6f 74 61             "tota
d840: 6c 5f 63 68 61 6e 67 65 73 22 2c 0a 20 20 20 20  l_changes",.    
d850: 22 74 72 61 63 65 22 2c 20 20 20 20 20 20 20 20  "trace",        
d860: 20 20 20 20 20 20 22 74 72 61 6e 73 61 63 74 69        "transacti
d870: 6f 6e 22 2c 20 20 20 20 20 20 20 22 75 6e 6c 6f  on",       "unlo
d880: 63 6b 5f 6e 6f 74 69 66 79 22 2c 0a 20 20 20 20  ck_notify",.    
d890: 22 75 70 64 61 74 65 5f 68 6f 6f 6b 22 2c 20 20  "update_hook",  
d8a0: 20 20 20 20 20 20 22 76 65 72 73 69 6f 6e 22 2c        "version",
d8b0: 20 20 20 20 20 20 20 20 20 20 20 22 77 61 6c 5f             "wal_
d8c0: 68 6f 6f 6b 22 2c 0a 20 20 20 20 30 20 20 20 20  hook",.    0    
d8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8e0: 0a 20 20 7d 3b 0a 20 20 65 6e 75 6d 20 44 42 5f  .  };.  enum DB_
d8f0: 65 6e 75 6d 20 7b 0a 20 20 20 20 44 42 5f 41 55  enum {.    DB_AU
d900: 54 48 4f 52 49 5a 45 52 2c 20 20 20 20 20 20 20  THORIZER,       
d910: 20 44 42 5f 42 41 43 4b 55 50 2c 20 20 20 20 20   DB_BACKUP,     
d920: 20 20 20 20 20 20 44 42 5f 42 55 53 59 2c 0a 20        DB_BUSY,. 
d930: 20 20 20 44 42 5f 43 41 43 48 45 2c 20 20 20 20     DB_CACHE,    
d940: 20 20 20 20 20 20 20 20 20 44 42 5f 43 48 41 4e           DB_CHAN
d950: 47 45 53 2c 20 20 20 20 20 20 20 20 20 20 44 42  GES,          DB
d960: 5f 43 4c 4f 53 45 2c 0a 20 20 20 20 44 42 5f 43  _CLOSE,.    DB_C
d970: 4f 4c 4c 41 54 45 2c 20 20 20 20 20 20 20 20 20  OLLATE,         
d980: 20 20 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e    DB_COLLATION_N
d990: 45 45 44 45 44 2c 20 44 42 5f 43 4f 4d 4d 49 54  EEDED, DB_COMMIT
d9a0: 5f 48 4f 4f 4b 2c 0a 20 20 20 20 44 42 5f 43 4f  _HOOK,.    DB_CO
d9b0: 4d 50 4c 45 54 45 2c 20 20 20 20 20 20 20 20 20  MPLETE,         
d9c0: 20 44 42 5f 43 4f 50 59 2c 20 20 20 20 20 20 20   DB_COPY,       
d9d0: 20 20 20 20 20 20 44 42 5f 45 4e 41 42 4c 45 5f        DB_ENABLE_
d9e0: 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 2c 0a  LOAD_EXTENSION,.
d9f0: 20 20 20 20 44 42 5f 45 52 52 4f 52 43 4f 44 45      DB_ERRORCODE
da00: 2c 20 20 20 20 20 20 20 20 20 44 42 5f 45 56 41  ,         DB_EVA
da10: 4c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 44  L,             D
da20: 42 5f 45 58 49 53 54 53 2c 0a 20 20 20 20 44 42  B_EXISTS,.    DB
da30: 5f 46 55 4e 43 54 49 4f 4e 2c 20 20 20 20 20 20  _FUNCTION,      
da40: 20 20 20 20 44 42 5f 49 4e 43 52 42 4c 4f 42 2c      DB_INCRBLOB,
da50: 20 20 20 20 20 20 20 20 20 44 42 5f 49 4e 54 45           DB_INTE
da60: 52 52 55 50 54 2c 0a 20 20 20 20 44 42 5f 4c 41  RRUPT,.    DB_LA
da70: 53 54 5f 49 4e 53 45 52 54 5f 52 4f 57 49 44 2c  ST_INSERT_ROWID,
da80: 20 44 42 5f 4e 55 4c 4c 56 41 4c 55 45 2c 20 20   DB_NULLVALUE,  
da90: 20 20 20 20 20 20 44 42 5f 4f 4e 45 43 4f 4c 55        DB_ONECOLU
daa0: 4d 4e 2c 0a 20 20 20 20 44 42 5f 50 52 45 55 50  MN,.    DB_PREUP
dab0: 44 41 54 45 2c 20 20 20 20 20 20 20 20 20 44 42  DATE,         DB
dac0: 5f 50 52 4f 46 49 4c 45 2c 20 20 20 20 20 20 20  _PROFILE,       
dad0: 20 20 20 44 42 5f 50 52 4f 47 52 45 53 53 2c 0a     DB_PROGRESS,.
dae0: 20 20 20 20 44 42 5f 52 45 4b 45 59 2c 20 20 20      DB_REKEY,   
daf0: 20 20 20 20 20 20 20 20 20 20 44 42 5f 52 45 53            DB_RES
db00: 54 4f 52 45 2c 20 20 20 20 20 20 20 20 20 20 44  TORE,          D
db10: 42 5f 52 4f 4c 4c 42 41 43 4b 5f 48 4f 4f 4b 2c  B_ROLLBACK_HOOK,
db20: 0a 20 20 20 20 44 42 5f 53 54 41 54 55 53 2c 20  .    DB_STATUS, 
db30: 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 54 49             DB_TI
db40: 4d 45 4f 55 54 2c 20 20 20 20 20 20 20 20 20 20  MEOUT,          
db50: 44 42 5f 54 4f 54 41 4c 5f 43 48 41 4e 47 45 53  DB_TOTAL_CHANGES
db60: 2c 0a 20 20 20 20 44 42 5f 54 52 41 43 45 2c 20  ,.    DB_TRACE, 
db70: 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 54              DB_T
db80: 52 41 4e 53 41 43 54 49 4f 4e 2c 20 20 20 20 20  RANSACTION,     
db90: 20 44 42 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46   DB_UNLOCK_NOTIF
dba0: 59 2c 0a 20 20 20 20 44 42 5f 55 50 44 41 54 45  Y,.    DB_UPDATE
dbb0: 5f 48 4f 4f 4b 2c 20 20 20 20 20 20 20 44 42 5f  _HOOK,       DB_
dbc0: 56 45 52 53 49 4f 4e 2c 20 20 20 20 20 20 20 20  VERSION,        
dbd0: 20 20 44 42 5f 57 41 4c 5f 48 4f 4f 4b 2c 0a 20    DB_WAL_HOOK,. 
dbe0: 20 7d 3b 0a 20 20 2f 2a 20 64 6f 6e 27 74 20 6c   };.  /* don't l
dbf0: 65 61 76 65 20 74 72 61 69 6c 69 6e 67 20 63 6f  eave trailing co
dc00: 6d 6d 61 73 20 6f 6e 20 44 42 5f 65 6e 75 6d 2c  mmas on DB_enum,
dc10: 20 69 74 20 63 6f 6e 66 75 73 65 73 20 74 68 65   it confuses the
dc20: 20 41 49 58 20 78 6c 63 20 63 6f 6d 70 69 6c 65   AIX xlc compile
dc30: 72 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63  r */..  if( objc
dc40: 3c 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  <2 ){.    Tcl_Wr
dc50: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
dc60: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 55 42  p, 1, objv, "SUB
dc70: 43 4f 4d 4d 41 4e 44 20 2e 2e 2e 22 29 3b 0a 20  COMMAND ...");. 
dc80: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
dc90: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54  ROR;.  }.  if( T
dca0: 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f  cl_GetIndexFromO
dcb0: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
dcc0: 31 5d 2c 20 44 42 5f 73 74 72 73 2c 20 22 6f 70  1], DB_strs, "op
dcd0: 74 69 6f 6e 22 2c 20 30 2c 20 26 63 68 6f 69 63  tion", 0, &choic
dce0: 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
dcf0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
dd00: 0a 20 20 73 77 69 74 63 68 28 20 28 65 6e 75 6d  .  switch( (enum
dd10: 20 44 42 5f 65 6e 75 6d 29 63 68 6f 69 63 65 20   DB_enum)choice 
dd20: 29 7b 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20  ){..  /*    $db 
dd30: 61 75 74 68 6f 72 69 7a 65 72 20 3f 43 41 4c 4c  authorizer ?CALL
dd40: 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20  BACK?.  **.  ** 
dd50: 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e  Invoke the given
dd60: 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61 75 74   callback to aut
dd70: 68 6f 72 69 7a 65 20 65 61 63 68 20 53 51 4c 20  horize each SQL 
dd80: 6f 70 65 72 61 74 69 6f 6e 20 61 73 20 69 74 20  operation as it 
dd90: 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64  is.  ** compiled
dda0: 2e 20 20 35 20 61 72 67 75 6d 65 6e 74 73 20 61  .  5 arguments a
ddb0: 72 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  re appended to t
ddc0: 68 65 20 63 61 6c 6c 62 61 63 6b 20 62 65 66 6f  he callback befo
ddd0: 72 65 20 69 74 20 69 73 0a 20 20 2a 2a 20 69 6e  re it is.  ** in
dde0: 76 6f 6b 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  voked:.  **.  **
ddf0: 20 20 20 28 31 29 20 54 68 65 20 61 75 74 68 6f     (1) The autho
de00: 72 69 7a 61 74 69 6f 6e 20 74 79 70 65 20 28 65  rization type (e
de10: 78 3a 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45  x: SQLITE_CREATE
de20: 5f 54 41 42 4c 45 2c 20 53 51 4c 49 54 45 5f 49  _TABLE, SQLITE_I
de30: 4e 53 45 52 54 2c 20 2e 2e 2e 29 0a 20 20 2a 2a  NSERT, ...).  **
de40: 20 20 20 28 32 29 20 46 69 72 73 74 20 64 65 73     (2) First des
de50: 63 72 69 70 74 69 76 65 20 6e 61 6d 65 20 28 64  criptive name (d
de60: 65 70 65 6e 64 73 20 6f 6e 20 61 75 74 68 6f 72  epends on author
de70: 69 7a 61 74 69 6f 6e 20 74 79 70 65 29 0a 20 20  ization type).  
de80: 2a 2a 20 20 20 28 33 29 20 53 65 63 6f 6e 64 20  **   (3) Second 
de90: 64 65 73 63 72 69 70 74 69 76 65 20 6e 61 6d 65  descriptive name
dea0: 0a 20 20 2a 2a 20 20 20 28 34 29 20 4e 61 6d 65  .  **   (4) Name
deb0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
dec0: 20 28 65 78 3a 20 22 6d 61 69 6e 22 2c 20 22 74   (ex: "main", "t
ded0: 65 6d 70 22 29 0a 20 20 2a 2a 20 20 20 28 35 29  emp").  **   (5)
dee0: 20 4e 61 6d 65 20 6f 66 20 74 72 69 67 67 65 72   Name of trigger
def0: 20 74 68 61 74 20 69 73 20 64 6f 69 6e 67 20 74   that is doing t
df00: 68 65 20 61 63 63 65 73 73 0a 20 20 2a 2a 0a 20  he access.  **. 
df10: 20 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61 63 6b   ** The callback
df20: 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 6f   should return o
df30: 6e 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  n of the followi
df40: 6e 67 20 73 74 72 69 6e 67 73 3a 20 53 51 4c 49  ng strings: SQLI
df50: 54 45 5f 4f 4b 2c 0a 20 20 2a 2a 20 53 51 4c 49  TE_OK,.  ** SQLI
df60: 54 45 5f 49 47 4e 4f 52 45 2c 20 6f 72 20 53 51  TE_IGNORE, or SQ
df70: 4c 49 54 45 5f 44 45 4e 59 2e 20 20 41 6e 79 20  LITE_DENY.  Any 
df80: 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c  other return val
df90: 75 65 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 0a  ue is an error..
dfa0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69    **.  ** If thi
dfb0: 73 20 6d 65 74 68 6f 64 20 69 73 20 69 6e 76 6f  s method is invo
dfc0: 6b 65 64 20 77 69 74 68 20 6e 6f 20 61 72 67 75  ked with no argu
dfd0: 6d 65 6e 74 73 2c 20 74 68 65 20 63 75 72 72 65  ments, the curre
dfe0: 6e 74 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  nt authorization
dff0: 0a 20 20 2a 2a 20 63 61 6c 6c 62 61 63 6b 20 73  .  ** callback s
e000: 74 72 69 6e 67 20 69 73 20 72 65 74 75 72 6e 65  tring is returne
e010: 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  d..  */.  case D
e020: 42 5f 41 55 54 48 4f 52 49 5a 45 52 3a 20 7b 0a  B_AUTHORIZER: {.
e030: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
e040: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
e050: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
e060: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 61  esult(interp, "a
e070: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 6e 6f 74  uthorization not
e080: 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68   available in th
e090: 69 73 20 62 75 69 6c 64 22 2c 20 30 29 3b 0a 20  is build", 0);. 
e0a0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
e0b0: 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69  ROR;.#else.    i
e0c0: 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20  f( objc>3 ){.   
e0d0: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
e0e0: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
e0f0: 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f  bjv, "?CALLBACK?
e100: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
e110: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
e120: 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d  }else if( objc==
e130: 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  2 ){.      if( p
e140: 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20  Db->zAuth ){.   
e150: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
e160: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44  esult(interp, pD
e170: 62 2d 3e 7a 41 75 74 68 2c 20 30 29 3b 0a 20 20  b->zAuth, 0);.  
e180: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
e190: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 41 75  .      char *zAu
e1a0: 74 68 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65  th;.      int le
e1b0: 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  n;.      if( pDb
e1c0: 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 20  ->zAuth ){.     
e1d0: 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d     Tcl_Free(pDb-
e1e0: 3e 7a 41 75 74 68 29 3b 0a 20 20 20 20 20 20 7d  >zAuth);.      }
e1f0: 0a 20 20 20 20 20 20 7a 41 75 74 68 20 3d 20 54  .      zAuth = T
e200: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
e210: 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65  Obj(objv[2], &le
e220: 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41  n);.      if( zA
e230: 75 74 68 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a  uth && len>0 ){.
e240: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 41 75          pDb->zAu
e250: 74 68 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20  th = Tcl_Alloc( 
e260: 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20  len + 1 );.     
e270: 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a     memcpy(pDb->z
e280: 41 75 74 68 2c 20 7a 41 75 74 68 2c 20 6c 65 6e  Auth, zAuth, len
e290: 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  +1);.      }else
e2a0: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
e2b0: 41 75 74 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  Auth = 0;.      
e2c0: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  }.      if( pDb-
e2d0: 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 20 20  >zAuth ){.      
e2e0: 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20    pDb->interp = 
e2f0: 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20  interp;.        
e300: 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68  sqlite3_set_auth
e310: 6f 72 69 7a 65 72 28 70 44 62 2d 3e 64 62 2c 20  orizer(pDb->db, 
e320: 61 75 74 68 5f 63 61 6c 6c 62 61 63 6b 2c 20 70  auth_callback, p
e330: 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Db);.      }else
e340: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
e350: 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72  3_set_authorizer
e360: 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b  (pDb->db, 0, 0);
e370: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
e380: 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b  endif.    break;
e390: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
e3a0: 62 20 62 61 63 6b 75 70 20 3f 44 41 54 41 42 41  b backup ?DATABA
e3b0: 53 45 3f 20 46 49 4c 45 4e 41 4d 45 0a 20 20 2a  SE? FILENAME.  *
e3c0: 2a 0a 20 20 2a 2a 20 4f 70 65 6e 20 6f 72 20 63  *.  ** Open or c
e3d0: 72 65 61 74 65 20 61 20 64 61 74 61 62 61 73 65  reate a database
e3e0: 20 66 69 6c 65 20 6e 61 6d 65 64 20 46 49 4c 45   file named FILE
e3f0: 4e 41 4d 45 2e 20 20 54 72 61 6e 73 66 65 72 20  NAME.  Transfer 
e400: 74 68 65 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e 74  the.  ** content
e410: 20 6f 66 20 6c 6f 63 61 6c 20 64 61 74 61 62 61   of local databa
e420: 73 65 20 44 41 54 41 42 41 53 45 20 28 64 65 66  se DATABASE (def
e430: 61 75 6c 74 3a 20 22 6d 61 69 6e 22 29 20 69 6e  ault: "main") in
e440: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 46 49 4c 45  to the.  ** FILE
e450: 4e 41 4d 45 20 64 61 74 61 62 61 73 65 2e 0a 20  NAME database.. 
e460: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 42 41   */.  case DB_BA
e470: 43 4b 55 50 3a 20 7b 0a 20 20 20 20 63 6f 6e 73  CKUP: {.    cons
e480: 74 20 63 68 61 72 20 2a 7a 44 65 73 74 46 69 6c  t char *zDestFil
e490: 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
e4a0: 72 20 2a 7a 53 72 63 44 62 3b 0a 20 20 20 20 73  r *zSrcDb;.    s
e4b0: 71 6c 69 74 65 33 20 2a 70 44 65 73 74 3b 0a 20  qlite3 *pDest;. 
e4c0: 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75     sqlite3_backu
e4d0: 70 20 2a 70 42 61 63 6b 75 70 3b 0a 0a 20 20 20  p *pBackup;..   
e4e0: 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a   if( objc==3 ){.
e4f0: 20 20 20 20 20 20 7a 53 72 63 44 62 20 3d 20 22        zSrcDb = "
e500: 6d 61 69 6e 22 3b 0a 20 20 20 20 20 20 7a 44 65  main";.      zDe
e510: 73 74 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74  stFile = Tcl_Get
e520: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
e530: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
e540: 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20  bjc==4 ){.      
e550: 7a 53 72 63 44 62 20 3d 20 54 63 6c 5f 47 65 74  zSrcDb = Tcl_Get
e560: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
e570: 0a 20 20 20 20 20 20 7a 44 65 73 74 46 69 6c 65  .      zDestFile
e580: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
e590: 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 20 20 7d  (objv[3]);.    }
e5a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f  else{.      Tcl_
e5b0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
e5c0: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f  erp, 2, objv, "?
e5d0: 44 41 54 41 42 41 53 45 3f 20 46 49 4c 45 4e 41  DATABASE? FILENA
e5e0: 4d 45 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ME");.      retu
e5f0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
e600: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
e610: 69 74 65 33 5f 6f 70 65 6e 28 7a 44 65 73 74 46  ite3_open(zDestF
e620: 69 6c 65 2c 20 26 70 44 65 73 74 29 3b 0a 20 20  ile, &pDest);.  
e630: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
e640: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  _OK ){.      Tcl
e650: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
e660: 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74 20 6f 70  terp, "cannot op
e670: 65 6e 20 74 61 72 67 65 74 20 64 61 74 61 62 61  en target databa
e680: 73 65 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20  se: ",.         
e690: 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67    sqlite3_errmsg
e6a0: 28 70 44 65 73 74 29 2c 20 28 63 68 61 72 2a 29  (pDest), (char*)
e6b0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
e6c0: 33 5f 63 6c 6f 73 65 28 70 44 65 73 74 29 3b 0a  3_close(pDest);.
e6d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
e6e0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
e6f0: 20 20 70 42 61 63 6b 75 70 20 3d 20 73 71 6c 69    pBackup = sqli
e700: 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69 74 28  te3_backup_init(
e710: 70 44 65 73 74 2c 20 22 6d 61 69 6e 22 2c 20 70  pDest, "main", p
e720: 44 62 2d 3e 64 62 2c 20 7a 53 72 63 44 62 29 3b  Db->db, zSrcDb);
e730: 0a 20 20 20 20 69 66 28 20 70 42 61 63 6b 75 70  .    if( pBackup
e740: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  ==0 ){.      Tcl
e750: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
e760: 74 65 72 70 2c 20 22 62 61 63 6b 75 70 20 66 61  terp, "backup fa
e770: 69 6c 65 64 3a 20 22 2c 0a 20 20 20 20 20 20 20  iled: ",.       
e780: 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d      sqlite3_errm
e790: 73 67 28 70 44 65 73 74 29 2c 20 28 63 68 61 72  sg(pDest), (char
e7a0: 2a 29 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  *)0);.      sqli
e7b0: 74 65 33 5f 63 6c 6f 73 65 28 70 44 65 73 74 29  te3_close(pDest)
e7c0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
e7d0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
e7e0: 20 20 20 20 77 68 69 6c 65 28 20 20 28 72 63 20      while(  (rc 
e7f0: 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  = sqlite3_backup
e800: 5f 73 74 65 70 28 70 42 61 63 6b 75 70 2c 31 30  _step(pBackup,10
e810: 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  0))==SQLITE_OK )
e820: 7b 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  {}.    sqlite3_b
e830: 61 63 6b 75 70 5f 66 69 6e 69 73 68 28 70 42 61  ackup_finish(pBa
e840: 63 6b 75 70 29 3b 0a 20 20 20 20 69 66 28 20 72  ckup);.    if( r
e850: 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
e860: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c  {.      rc = TCL
e870: 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  _OK;.    }else{.
e880: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
e890: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
e8a0: 62 61 63 6b 75 70 20 66 61 69 6c 65 64 3a 20 22  backup failed: "
e8b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  ,.           sql
e8c0: 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 65 73  ite3_errmsg(pDes
e8d0: 74 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  t), (char*)0);. 
e8e0: 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52       rc = TCL_ER
e8f0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ROR;.    }.    s
e900: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 44 65  qlite3_close(pDe
e910: 73 74 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  st);.    break;.
e920: 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62    }..  /*    $db
e930: 20 62 75 73 79 20 3f 43 41 4c 4c 42 41 43 4b 3f   busy ?CALLBACK?
e940: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b  .  **.  ** Invok
e950: 65 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c  e the given call
e960: 62 61 63 6b 20 69 66 20 61 6e 20 53 51 4c 20 73  back if an SQL s
e970: 74 61 74 65 6d 65 6e 74 20 61 74 74 65 6d 70 74  tatement attempt
e980: 73 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61  s to open.  ** a
e990: 20 6c 6f 63 6b 65 64 20 64 61 74 61 62 61 73 65   locked database
e9a0: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 63 61   file..  */.  ca
e9b0: 73 65 20 44 42 5f 42 55 53 59 3a 20 7b 0a 20 20  se DB_BUSY: {.  
e9c0: 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a    if( objc>3 ){.
e9d0: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
e9e0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
e9f0: 2c 20 6f 62 6a 76 2c 20 22 43 41 4c 4c 42 41 43  , objv, "CALLBAC
ea00: 4b 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  K");.      retur
ea10: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
ea20: 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d   }else if( objc=
ea30: 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =2 ){.      if( 
ea40: 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20  pDb->zBusy ){.  
ea50: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
ea60: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
ea70: 44 62 2d 3e 7a 42 75 73 79 2c 20 30 29 3b 0a 20  Db->zBusy, 0);. 
ea80: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
ea90: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42  {.      char *zB
eaa0: 75 73 79 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c  usy;.      int l
eab0: 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44  en;.      if( pD
eac0: 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20  b->zBusy ){.    
ead0: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
eae0: 2d 3e 7a 42 75 73 79 29 3b 0a 20 20 20 20 20 20  ->zBusy);.      
eaf0: 7d 0a 20 20 20 20 20 20 7a 42 75 73 79 20 3d 20  }.      zBusy = 
eb00: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
eb10: 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c  mObj(objv[2], &l
eb20: 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  en);.      if( z
eb30: 42 75 73 79 20 26 26 20 6c 65 6e 3e 30 20 29 7b  Busy && len>0 ){
eb40: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 42  .        pDb->zB
eb50: 75 73 79 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28  usy = Tcl_Alloc(
eb60: 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20   len + 1 );.    
eb70: 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e      memcpy(pDb->
eb80: 7a 42 75 73 79 2c 20 7a 42 75 73 79 2c 20 6c 65  zBusy, zBusy, le
eb90: 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  n+1);.      }els
eba0: 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  e{.        pDb->
ebb0: 7a 42 75 73 79 20 3d 20 30 3b 0a 20 20 20 20 20  zBusy = 0;.     
ebc0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44 62   }.      if( pDb
ebd0: 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 20  ->zBusy ){.     
ebe0: 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d     pDb->interp =
ebf0: 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20   interp;.       
ec00: 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61   sqlite3_busy_ha
ec10: 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20 44  ndler(pDb->db, D
ec20: 62 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 44  bBusyHandler, pD
ec30: 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  b);.      }else{
ec40: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ec50: 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 70 44  _busy_handler(pD
ec60: 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  b->db, 0, 0);.  
ec70: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
ec80: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
ec90: 20 20 20 20 20 24 64 62 20 63 61 63 68 65 20 66       $db cache f
eca0: 6c 75 73 68 0a 20 20 2a 2a 20 20 20 20 20 24 64  lush.  **     $d
ecb0: 62 20 63 61 63 68 65 20 73 69 7a 65 20 6e 0a 20  b cache size n. 
ecc0: 20 2a 2a 0a 20 20 2a 2a 20 46 6c 75 73 68 20 74   **.  ** Flush t
ecd0: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
ece0: 65 6d 65 6e 74 20 63 61 63 68 65 2c 20 6f 72 20  ement cache, or 
ecf0: 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  set the maximum 
ed00: 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 63  number of.  ** c
ed10: 61 63 68 65 64 20 73 74 61 74 65 6d 65 6e 74 73  ached statements
ed20: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
ed30: 5f 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 63 68  _CACHE: {.    ch
ed40: 61 72 20 2a 73 75 62 43 6d 64 3b 0a 20 20 20 20  ar *subCmd;.    
ed50: 69 6e 74 20 6e 3b 0a 0a 20 20 20 20 69 66 28 20  int n;..    if( 
ed60: 6f 62 6a 63 3c 3d 32 20 29 7b 0a 20 20 20 20 20  objc<=2 ){.     
ed70: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
ed80: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
ed90: 76 2c 20 22 63 61 63 68 65 20 6f 70 74 69 6f 6e  v, "cache option
eda0: 20 3f 61 72 67 3f 22 29 3b 0a 20 20 20 20 20 20   ?arg?");.      
edb0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
edc0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 75 62 43  ;.    }.    subC
edd0: 6d 64 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  md = Tcl_GetStri
ede0: 6e 67 46 72 6f 6d 4f 62 6a 28 20 6f 62 6a 76 5b  ngFromObj( objv[
edf0: 32 5d 2c 20 30 20 29 3b 0a 20 20 20 20 69 66 28  2], 0 );.    if(
ee00: 20 2a 73 75 62 43 6d 64 3d 3d 27 66 27 20 26 26   *subCmd=='f' &&
ee10: 20 73 74 72 63 6d 70 28 73 75 62 43 6d 64 2c 22   strcmp(subCmd,"
ee20: 66 6c 75 73 68 22 29 3d 3d 30 20 29 7b 0a 20 20  flush")==0 ){.  
ee30: 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20      if( objc!=3 
ee40: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57  ){.        Tcl_W
ee50: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
ee60: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 66 6c  rp, 2, objv, "fl
ee70: 75 73 68 22 29 3b 0a 20 20 20 20 20 20 20 20 72  ush");.        r
ee80: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
ee90: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
eea0: 20 20 20 20 20 20 66 6c 75 73 68 53 74 6d 74 43        flushStmtC
eeb0: 61 63 68 65 28 20 70 44 62 20 29 3b 0a 20 20 20  ache( pDb );.   
eec0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
eed0: 66 28 20 2a 73 75 62 43 6d 64 3d 3d 27 73 27 20  f( *subCmd=='s' 
eee0: 26 26 20 73 74 72 63 6d 70 28 73 75 62 43 6d 64  && strcmp(subCmd
eef0: 2c 22 73 69 7a 65 22 29 3d 3d 30 20 29 7b 0a 20  ,"size")==0 ){. 
ef00: 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 34       if( objc!=4
ef10: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
ef20: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
ef30: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 73  erp, 2, objv, "s
ef40: 69 7a 65 20 6e 22 29 3b 0a 20 20 20 20 20 20 20  ize n");.       
ef50: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
ef60: 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  R;.      }else{.
ef70: 20 20 20 20 20 20 20 20 69 66 28 20 54 43 4c 5f          if( TCL_
ef80: 45 52 52 4f 52 3d 3d 54 63 6c 5f 47 65 74 49 6e  ERROR==Tcl_GetIn
ef90: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
efa0: 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 29 20 29 7b   objv[3], &n) ){
efb0: 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 41  .          Tcl_A
efc0: 70 70 65 6e 64 52 65 73 75 6c 74 28 20 69 6e 74  ppendResult( int
efd0: 65 72 70 2c 20 22 63 61 6e 6e 6f 74 20 63 6f 6e  erp, "cannot con
efe0: 76 65 72 74 20 5c 22 22 2c 20 0a 20 20 20 20 20  vert \"", .     
eff0: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65            Tcl_Ge
f000: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
f010: 62 6a 76 5b 33 5d 2c 30 29 2c 20 22 5c 22 20 74  bjv[3],0), "\" t
f020: 6f 20 69 6e 74 65 67 65 72 22 2c 20 30 29 3b 0a  o integer", 0);.
f030: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
f040: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
f050: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f060: 20 20 20 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a       if( n<0 ){.
f070: 20 20 20 20 20 20 20 20 20 20 20 20 66 6c 75 73              flus
f080: 68 53 74 6d 74 43 61 63 68 65 28 20 70 44 62 20  hStmtCache( pDb 
f090: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  );.            n
f0a0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
f0b0: 7d 65 6c 73 65 20 69 66 28 20 6e 3e 4d 41 58 5f  }else if( n>MAX_
f0c0: 50 52 45 50 41 52 45 44 5f 53 54 4d 54 53 20 29  PREPARED_STMTS )
f0d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 20  {.            n 
f0e0: 3d 20 4d 41 58 5f 50 52 45 50 41 52 45 44 5f 53  = MAX_PREPARED_S
f0f0: 54 4d 54 53 3b 0a 20 20 20 20 20 20 20 20 20 20  TMTS;.          
f100: 7d 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d  }.          pDb-
f110: 3e 6d 61 78 53 74 6d 74 20 3d 20 6e 3b 0a 20 20  >maxStmt = n;.  
f120: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
f130: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f140: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
f150: 74 28 20 69 6e 74 65 72 70 2c 20 22 62 61 64 20  t( interp, "bad 
f160: 6f 70 74 69 6f 6e 20 5c 22 22 2c 20 0a 20 20 20  option \"", .   
f170: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
f180: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
f190: 5b 32 5d 2c 30 29 2c 20 22 5c 22 3a 20 6d 75 73  [2],0), "\": mus
f1a0: 74 20 62 65 20 66 6c 75 73 68 20 6f 72 20 73 69  t be flush or si
f1b0: 7a 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  ze", 0);.      r
f1c0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
f1d0: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
f1e0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 20  ;.  }..  /*     
f1f0: 24 64 62 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a  $db changes.  **
f200: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  .  ** Return the
f210: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
f220: 74 68 61 74 20 77 65 72 65 20 6d 6f 64 69 66 69  that were modifi
f230: 65 64 2c 20 69 6e 73 65 72 74 65 64 2c 20 6f 72  ed, inserted, or
f240: 20 64 65 6c 65 74 65 64 20 62 79 0a 20 20 2a 2a   deleted by.  **
f250: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
f260: 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20   INSERT, UPDATE 
f270: 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d  or DELETE statem
f280: 65 6e 74 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69  ent, not includi
f290: 6e 67 20 0a 20 20 2a 2a 20 61 6e 79 20 63 68 61  ng .  ** any cha
f2a0: 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 72 69  nges made by tri
f2b0: 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 0a 20  gger programs.. 
f2c0: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 48   */.  case DB_CH
f2d0: 41 4e 47 45 53 3a 20 7b 0a 20 20 20 20 54 63 6c  ANGES: {.    Tcl
f2e0: 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20  _Obj *pResult;. 
f2f0: 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29     if( objc!=2 )
f300: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
f310: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
f320: 20 32 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20   2, objv, "");. 
f330: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
f340: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
f350: 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47   pResult = Tcl_G
f360: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
f370: 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  rp);.    Tcl_Set
f380: 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20  IntObj(pResult, 
f390: 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28  sqlite3_changes(
f3a0: 70 44 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20 62  pDb->db));.    b
f3b0: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
f3c0: 20 20 20 24 64 62 20 63 6c 6f 73 65 0a 20 20 2a     $db close.  *
f3d0: 2a 0a 20 20 2a 2a 20 53 68 75 74 64 6f 77 6e 20  *.  ** Shutdown 
f3e0: 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a  the database.  *
f3f0: 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4c 4f 53  /.  case DB_CLOS
f400: 45 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 44 65 6c  E: {.    Tcl_Del
f410: 65 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  eteCommand(inter
f420: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
f430: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
f440: 20 30 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b   0));.    break;
f450: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
f460: 20 20 20 20 24 64 62 20 63 6f 6c 6c 61 74 65 20      $db collate 
f470: 4e 41 4d 45 20 53 43 52 49 50 54 0a 20 20 2a 2a  NAME SCRIPT.  **
f480: 0a 20 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  .  ** Create a n
f490: 65 77 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e  ew SQL collation
f4a0: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64   function called
f4b0: 20 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76 65 72   NAME.  Whenever
f4c0: 0a 20 20 2a 2a 20 74 68 61 74 20 66 75 6e 63 74  .  ** that funct
f4d0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
f4e0: 6e 76 6f 6b 65 20 53 43 52 49 50 54 20 74 6f 20  nvoke SCRIPT to 
f4f0: 65 76 61 6c 75 61 74 65 20 74 68 65 20 66 75 6e  evaluate the fun
f500: 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61  ction..  */.  ca
f510: 73 65 20 44 42 5f 43 4f 4c 4c 41 54 45 3a 20 7b  se DB_COLLATE: {
f520: 0a 20 20 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20  .    SqlCollate 
f530: 2a 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 63  *pCollate;.    c
f540: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20  har *zName;.    
f550: 63 68 61 72 20 2a 7a 53 63 72 69 70 74 3b 0a 20  char *zScript;. 
f560: 20 20 20 69 6e 74 20 6e 53 63 72 69 70 74 3b 0a     int nScript;.
f570: 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20      if( objc!=4 
f580: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
f590: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
f5a0: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d 45  , 2, objv, "NAME
f5b0: 20 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20   SCRIPT");.     
f5c0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
f5d0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61  R;.    }.    zNa
f5e0: 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  me = Tcl_GetStri
f5f0: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
f600: 5d 2c 20 30 29 3b 0a 20 20 20 20 7a 53 63 72 69  ], 0);.    zScri
f610: 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  pt = Tcl_GetStri
f620: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33  ngFromObj(objv[3
f630: 5d 2c 20 26 6e 53 63 72 69 70 74 29 3b 0a 20 20  ], &nScript);.  
f640: 20 20 70 43 6f 6c 6c 61 74 65 20 3d 20 28 53 71    pCollate = (Sq
f650: 6c 43 6f 6c 6c 61 74 65 2a 29 54 63 6c 5f 41 6c  lCollate*)Tcl_Al
f660: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 6f  loc( sizeof(*pCo
f670: 6c 6c 61 74 65 29 20 2b 20 6e 53 63 72 69 70 74  llate) + nScript
f680: 20 2b 20 31 20 29 3b 0a 20 20 20 20 69 66 28 20   + 1 );.    if( 
f690: 70 43 6f 6c 6c 61 74 65 3d 3d 30 20 29 20 72 65  pCollate==0 ) re
f6a0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
f6b0: 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 69 6e      pCollate->in
f6c0: 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20  terp = interp;. 
f6d0: 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65     pCollate->pNe
f6e0: 78 74 20 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c 61  xt = pDb->pColla
f6f0: 74 65 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65  te;.    pCollate
f700: 2d 3e 7a 53 63 72 69 70 74 20 3d 20 28 63 68 61  ->zScript = (cha
f710: 72 2a 29 26 70 43 6f 6c 6c 61 74 65 5b 31 5d 3b  r*)&pCollate[1];
f720: 0a 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61  .    pDb->pColla
f730: 74 65 20 3d 20 70 43 6f 6c 6c 61 74 65 3b 0a 20  te = pCollate;. 
f740: 20 20 20 6d 65 6d 63 70 79 28 70 43 6f 6c 6c 61     memcpy(pColla
f750: 74 65 2d 3e 7a 53 63 72 69 70 74 2c 20 7a 53 63  te->zScript, zSc
f760: 72 69 70 74 2c 20 6e 53 63 72 69 70 74 2b 31 29  ript, nScript+1)
f770: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
f780: 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
f790: 6f 6e 28 70 44 62 2d 3e 64 62 2c 20 7a 4e 61 6d  on(pDb->db, zNam
f7a0: 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  e, SQLITE_UTF8, 
f7b0: 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 61 74  .        pCollat
f7c0: 65 2c 20 74 63 6c 53 71 6c 43 6f 6c 6c 61 74 65  e, tclSqlCollate
f7d0: 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53  ) ){.      Tcl_S
f7e0: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
f7f0: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
f800: 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29  _errmsg(pDb->db)
f810: 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b  , TCL_VOLATILE);
f820: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
f830: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
f840: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
f850: 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62   /*.  **     $db
f860: 20 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65   collation_neede
f870: 64 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20  d SCRIPT.  **.  
f880: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
f890: 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75  SQL collation fu
f8a0: 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41  nction called NA
f8b0: 4d 45 2e 20 20 57 68 65 6e 65 76 65 72 0a 20 20  ME.  Whenever.  
f8c0: 2a 2a 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e  ** that function
f8d0: 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f   is called, invo
f8e0: 6b 65 20 53 43 52 49 50 54 20 74 6f 20 65 76 61  ke SCRIPT to eva
f8f0: 6c 75 61 74 65 20 74 68 65 20 66 75 6e 63 74 69  luate the functi
f900: 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  on..  */.  case 
f910: 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e 45 45  DB_COLLATION_NEE
f920: 44 45 44 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f  DED: {.    if( o
f930: 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc!=3 ){.      
f940: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
f950: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
f960: 2c 20 22 53 43 52 49 50 54 22 29 3b 0a 20 20 20  , "SCRIPT");.   
f970: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
f980: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
f990: 66 28 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65  f( pDb->pCollate
f9a0: 4e 65 65 64 65 64 20 29 7b 0a 20 20 20 20 20 20  Needed ){.      
f9b0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
f9c0: 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65  (pDb->pCollateNe
f9d0: 65 64 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  eded);.    }.   
f9e0: 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65   pDb->pCollateNe
f9f0: 65 64 65 64 20 3d 20 54 63 6c 5f 44 75 70 6c 69  eded = Tcl_Dupli
fa00: 63 61 74 65 4f 62 6a 28 6f 62 6a 76 5b 32 5d 29  cateObj(objv[2])
fa10: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ;.    Tcl_IncrRe
fa20: 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c  fCount(pDb->pCol
fa30: 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 20  lateNeeded);.   
fa40: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69   sqlite3_collati
fa50: 6f 6e 5f 6e 65 65 64 65 64 28 70 44 62 2d 3e 64  on_needed(pDb->d
fa60: 62 2c 20 70 44 62 2c 20 74 63 6c 43 6f 6c 6c 61  b, pDb, tclColla
fa70: 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 62  teNeeded);.    b
fa80: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
fa90: 20 20 20 24 64 62 20 63 6f 6d 6d 69 74 5f 68 6f     $db commit_ho
faa0: 6f 6b 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20  ok ?CALLBACK?.  
fab0: 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74  **.  ** Invoke t
fac0: 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63  he given callbac
fad0: 6b 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63 6f  k just before co
fae0: 6d 6d 69 74 74 69 6e 67 20 65 76 65 72 79 20 53  mmitting every S
faf0: 51 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  QL transaction..
fb00: 20 20 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c    ** If the call
fb10: 62 61 63 6b 20 74 68 72 6f 77 73 20 61 6e 20 65  back throws an e
fb20: 78 63 65 70 74 69 6f 6e 20 6f 72 20 72 65 74 75  xception or retu
fb30: 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68  rns non-zero, th
fb40: 65 6e 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e  en the.  ** tran
fb50: 73 61 63 74 69 6f 6e 20 69 73 20 61 62 6f 72 74  saction is abort
fb60: 65 64 2e 20 20 49 66 20 43 41 4c 4c 42 41 43 4b  ed.  If CALLBACK
fb70: 20 69 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72   is an empty str
fb80: 69 6e 67 2c 20 74 68 65 20 63 61 6c 6c 62 61 63  ing, the callbac
fb90: 6b 0a 20 20 2a 2a 20 69 73 20 64 69 73 61 62 6c  k.  ** is disabl
fba0: 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ed..  */.  case 
fbb0: 44 42 5f 43 4f 4d 4d 49 54 5f 48 4f 4f 4b 3a 20  DB_COMMIT_HOOK: 
fbc0: 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33  {.    if( objc>3
fbd0: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
fbe0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
fbf0: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41  p, 2, objv, "?CA
fc00: 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20  LLBACK?");.     
fc10: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
fc20: 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  R;.    }else if(
fc30: 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20   objc==2 ){.    
fc40: 20 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d    if( pDb->zComm
fc50: 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  it ){.        Tc
fc60: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
fc70: 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 43 6f 6d  nterp, pDb->zCom
fc80: 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  mit, 0);.      }
fc90: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
fca0: 20 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b    char *zCommit;
fcb0: 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  .      int len;.
fcc0: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
fcd0: 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  Commit ){.      
fce0: 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e    Tcl_Free(pDb->
fcf0: 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20  zCommit);.      
fd00: 7d 0a 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20  }.      zCommit 
fd10: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
fd20: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
fd30: 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  &len);.      if(
fd40: 20 7a 43 6f 6d 6d 69 74 20 26 26 20 6c 65 6e 3e   zCommit && len>
fd50: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  0 ){.        pDb
fd60: 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20 54 63 6c 5f  ->zCommit = Tcl_
fd70: 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29  Alloc( len + 1 )
fd80: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
fd90: 28 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 2c 20 7a  (pDb->zCommit, z
fda0: 43 6f 6d 6d 69 74 2c 20 6c 65 6e 2b 31 29 3b 0a  Commit, len+1);.
fdb0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
fdc0: 20 20 20 20 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69       pDb->zCommi
fdd0: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 0;.      }. 
fde0: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 43       if( pDb->zC
fdf0: 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  ommit ){.       
fe00: 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69   pDb->interp = i
fe10: 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73  nterp;.        s
fe20: 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f  qlite3_commit_ho
fe30: 6f 6b 28 70 44 62 2d 3e 64 62 2c 20 44 62 43 6f  ok(pDb->db, DbCo
fe40: 6d 6d 69 74 48 61 6e 64 6c 65 72 2c 20 70 44 62  mmitHandler, pDb
fe50: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
fe60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
fe70: 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 70 44 62 2d  commit_hook(pDb-
fe80: 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  >db, 0, 0);.    
fe90: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72    }.    }.    br
fea0: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
feb0: 20 20 24 64 62 20 63 6f 6d 70 6c 65 74 65 20 53    $db complete S
fec0: 51 4c 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74  QL.  **.  ** Ret
fed0: 75 72 6e 20 54 52 55 45 20 69 66 20 53 51 4c 20  urn TRUE if SQL 
fee0: 69 73 20 61 20 63 6f 6d 70 6c 65 74 65 20 53 51  is a complete SQ
fef0: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 52 65  L statement.  Re
ff00: 74 75 72 6e 20 46 41 4c 53 45 20 69 66 0a 20 20  turn FALSE if.  
ff10: 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 69  ** additional li
ff20: 6e 65 73 20 6f 66 20 69 6e 70 75 74 20 61 72 65  nes of input are
ff30: 20 6e 65 65 64 65 64 2e 20 20 54 68 69 73 20 69   needed.  This i
ff40: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65  s similar to the
ff50: 0a 20 20 2a 2a 20 62 75 69 6c 74 2d 69 6e 20 22  .  ** built-in "
ff60: 69 6e 66 6f 20 63 6f 6d 70 6c 65 74 65 22 20 63  info complete" c
ff70: 6f 6d 6d 61 6e 64 20 6f 66 20 54 63 6c 2e 0a 20  ommand of Tcl.. 
ff80: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f   */.  case DB_CO
ff90: 4d 50 4c 45 54 45 3a 20 7b 0a 23 69 66 6e 64 65  MPLETE: {.#ifnde
ffa0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
ffb0: 4d 50 4c 45 54 45 0a 20 20 20 20 54 63 6c 5f 4f  MPLETE.    Tcl_O
ffc0: 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20  bj *pResult;.   
ffd0: 20 69 6e 74 20 69 73 43 6f 6d 70 6c 65 74 65 3b   int isComplete;
ffe0: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  .    if( objc!=3
fff0: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
10000 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
10010 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c  p, 2, objv, "SQL
10020 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
10030 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
10040 7d 0a 20 20 20 20 69 73 43 6f 6d 70 6c 65 74 65  }.    isComplete
10050 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c   = sqlite3_compl
10060 65 74 65 28 20 54 63 6c 5f 47 65 74 53 74 72 69  ete( Tcl_GetStri
10070 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
10080 5d 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 52 65  ], 0) );.    pRe
10090 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62  sult = Tcl_GetOb
100a0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  jResult(interp);
100b0 0a 20 20 20 20 54 63 6c 5f 53 65 74 42 6f 6f 6c  .    Tcl_SetBool
100c0 65 61 6e 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20  eanObj(pResult, 
100d0 69 73 43 6f 6d 70 6c 65 74 65 29 3b 0a 23 65 6e  isComplete);.#en
100e0 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  dif.    break;. 
100f0 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20   }..  /*    $db 
10100 63 6f 70 79 20 63 6f 6e 66 6c 69 63 74 2d 61 6c  copy conflict-al
10110 67 6f 72 69 74 68 6d 20 74 61 62 6c 65 20 66 69  gorithm table fi
10120 6c 65 6e 61 6d 65 20 3f 53 45 50 41 52 41 54 4f  lename ?SEPARATO
10130 52 3f 20 3f 4e 55 4c 4c 49 4e 44 49 43 41 54 4f  R? ?NULLINDICATO
10140 52 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 70  R?.  **.  ** Cop
10150 79 20 64 61 74 61 20 69 6e 74 6f 20 74 61 62 6c  y data into tabl
10160 65 20 66 72 6f 6d 20 66 69 6c 65 6e 61 6d 65 2c  e from filename,
10170 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 75 73 69 6e   optionally usin
10180 67 20 53 45 50 41 52 41 54 4f 52 0a 20 20 2a 2a  g SEPARATOR.  **
10190 20 61 73 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72   as column separ
101a0 61 74 6f 72 73 2e 20 20 49 66 20 61 20 63 6f 6c  ators.  If a col
101b0 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 20 6e  umn contains a n
101c0 75 6c 6c 20 73 74 72 69 6e 67 2c 20 6f 72 20 74  ull string, or t
101d0 68 65 0a 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66  he.  ** value of
101e0 20 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52 2c 20   NULLINDICATOR, 
101f0 61 20 4e 55 4c 4c 20 69 73 20 69 6e 73 65 72 74  a NULL is insert
10200 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  ed for the colum
10210 6e 2e 0a 20 20 2a 2a 20 63 6f 6e 66 6c 69 63 74  n..  ** conflict
10220 2d 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 6f 6e  -algorithm is on
10230 65 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 20  e of the sqlite 
10240 63 6f 6e 66 6c 69 63 74 20 61 6c 67 6f 72 69 74  conflict algorit
10250 68 6d 73 3a 0a 20 20 2a 2a 20 20 20 20 72 6f 6c  hms:.  **    rol
10260 6c 62 61 63 6b 2c 20 61 62 6f 72 74 2c 20 66 61  lback, abort, fa
10270 69 6c 2c 20 69 67 6e 6f 72 65 2c 20 72 65 70 6c  il, ignore, repl
10280 61 63 65 0a 20 20 2a 2a 20 4f 6e 20 73 75 63 63  ace.  ** On succ
10290 65 73 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20  ess, return the 
102a0 6e 75 6d 62 65 72 20 6f 66 20 6c 69 6e 65 73 20  number of lines 
102b0 70 72 6f 63 65 73 73 65 64 2c 20 6e 6f 74 20 6e  processed, not n
102c0 65 63 65 73 73 61 72 69 6c 79 20 73 61 6d 65 0a  ecessarily same.
102d0 20 20 2a 2a 20 61 73 20 27 64 62 20 63 68 61 6e    ** as 'db chan
102e0 67 65 73 27 20 64 75 65 20 74 6f 20 63 6f 6e 66  ges' due to conf
102f0 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20 73  lict-algorithm s
10300 65 6c 65 63 74 65 64 2e 0a 20 20 2a 2a 0a 20 20  elected..  **.  
10310 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 69 73 20  ** This code is 
10320 62 61 73 69 63 61 6c 6c 79 20 61 6e 20 69 6d 70  basically an imp
10330 6c 65 6d 65 6e 74 61 74 69 6f 6e 2f 65 6e 68 61  lementation/enha
10340 6e 63 65 6d 65 6e 74 20 6f 66 0a 20 20 2a 2a 20  ncement of.  ** 
10350 74 68 65 20 73 71 6c 69 74 65 33 20 73 68 65 6c  the sqlite3 shel
10360 6c 2e 63 20 22 2e 69 6d 70 6f 72 74 22 20 63 6f  l.c ".import" co
10370 6d 6d 61 6e 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  mmand..  **.  **
10380 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 75 73   This command us
10390 61 67 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e  age is equivalen
103a0 74 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 32  t to the sqlite2
103b0 2e 78 20 43 4f 50 59 20 73 74 61 74 65 6d 65 6e  .x COPY statemen
103c0 74 2c 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 6d  t,.  ** which im
103d0 70 6f 72 74 73 20 66 69 6c 65 20 64 61 74 61 20  ports file data 
103e0 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 75 73 69  into a table usi
103f0 6e 67 20 74 68 65 20 50 6f 73 74 67 72 65 53 51  ng the PostgreSQ
10400 4c 20 43 4f 50 59 20 66 69 6c 65 20 66 6f 72 6d  L COPY file form
10410 61 74 3a 0a 20 20 2a 2a 20 20 20 24 64 62 20 63  at:.  **   $db c
10420 6f 70 79 20 24 63 6f 6e 66 6c 69 74 5f 61 6c 67  opy $conflit_alg
10430 6f 20 24 74 61 62 6c 65 5f 6e 61 6d 65 20 24 66  o $table_name $f
10440 69 6c 65 6e 61 6d 65 20 5c 74 20 5c 5c 4e 0a 20  ilename \t \\N. 
10450 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f   */.  case DB_CO
10460 50 59 3a 20 7b 0a 20 20 20 20 63 68 61 72 20 2a  PY: {.    char *
10470 7a 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20  zTable;         
10480 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20        /* Insert 
10490 64 61 74 61 20 69 6e 74 6f 20 74 68 69 73 20 74  data into this t
104a0 61 62 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72  able */.    char
104b0 20 2a 7a 46 69 6c 65 3b 20 20 20 20 20 20 20 20   *zFile;        
104c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
104d0 69 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74  ile from which t
104e0 6f 20 65 78 74 72 61 63 74 20 64 61 74 61 20 2a  o extract data *
104f0 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6e  /.    char *zCon
10500 66 6c 69 63 74 3b 20 20 20 20 20 20 20 20 20 20  flict;          
10510 20 20 2f 2a 20 54 68 65 20 63 6f 6e 66 6c 69 63    /* The conflic
10520 74 20 61 6c 67 6f 72 69 74 68 6d 20 74 6f 20 75  t algorithm to u
10530 73 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  se */.    sqlite
10540 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20  3_stmt *pStmt;  
10550 20 20 20 20 20 20 2f 2a 20 41 20 73 74 61 74 65        /* A state
10560 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ment */.    int 
10570 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nCol;           
10580 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
10590 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
105a0 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  the table */.   
105b0 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20   int nByte;     
105c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
105d0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
105e0 69 6e 20 61 6e 20 53 51 4c 20 73 74 72 69 6e 67  in an SQL string
105f0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a   */.    int i, j
10600 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10610 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
10620 74 65 72 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ters */.    int 
10630 6e 53 65 70 3b 20 20 20 20 20 20 20 20 20 20 20  nSep;           
10640 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
10650 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 53  r of bytes in zS
10660 65 70 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ep[] */.    int 
10670 6e 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  nNull;          
10680 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
10690 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 4e  r of bytes in zN
106a0 75 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 63 68 61  ull[] */.    cha
106b0 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20 20  r *zSql;        
106c0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 53           /* An S
106d0 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  QL statement */.
106e0 20 20 20 20 63 68 61 72 20 2a 7a 4c 69 6e 65 3b      char *zLine;
106f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10700 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 69 6e 65  /* A single line
10710 20 6f 66 20 69 6e 70 75 74 20 66 72 6f 6d 20 74   of input from t
10720 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 63  he file */.    c
10730 68 61 72 20 2a 2a 61 7a 43 6f 6c 3b 20 20 20 20  har **azCol;    
10740 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4c             /* zL
10750 69 6e 65 5b 5d 20 62 72 6f 6b 65 6e 20 75 70 20  ine[] broken up 
10760 69 6e 74 6f 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  into columns */.
10770 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69      char *zCommi
10780 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
10790 2f 2a 20 48 6f 77 20 74 6f 20 63 6f 6d 6d 69 74  /* How to commit
107a0 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 20 20   changes */.    
107b0 46 49 4c 45 20 2a 69 6e 3b 20 20 20 20 20 20 20  FILE *in;       
107c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
107d0 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f  he input file */
107e0 0a 20 20 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 20  .    int lineno 
107f0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
10800 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20   /* Line number 
10810 6f 66 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f  of input file */
10820 0a 20 20 20 20 63 68 61 72 20 7a 4c 69 6e 65 4e  .    char zLineN
10830 75 6d 5b 38 30 5d 3b 20 20 20 20 20 20 20 20 20  um[80];         
10840 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20   /* Line number 
10850 70 72 69 6e 74 20 62 75 66 66 65 72 20 2a 2f 0a  print buffer */.
10860 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65      Tcl_Obj *pRe
10870 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20  sult;           
10880 2f 2a 20 69 6e 74 65 72 70 20 72 65 73 75 6c 74  /* interp result
10890 20 2a 2f 0a 0a 20 20 20 20 63 68 61 72 20 2a 7a   */..    char *z
108a0 53 65 70 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  Sep;.    char *z
108b0 4e 75 6c 6c 3b 0a 20 20 20 20 69 66 28 20 6f 62  Null;.    if( ob
108c0 6a 63 3c 35 20 7c 7c 20 6f 62 6a 63 3e 37 20 29  jc<5 || objc>7 )
108d0 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
108e0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
108f0 20 32 2c 20 6f 62 6a 76 2c 20 0a 20 20 20 20 20   2, objv, .     
10900 20 20 20 20 22 43 4f 4e 46 4c 49 43 54 2d 41 4c      "CONFLICT-AL
10910 47 4f 52 49 54 48 4d 20 54 41 42 4c 45 20 46 49  GORITHM TABLE FI
10920 4c 45 4e 41 4d 45 20 3f 53 45 50 41 52 41 54 4f  LENAME ?SEPARATO
10930 52 3f 20 3f 4e 55 4c 4c 49 4e 44 49 43 41 54 4f  R? ?NULLINDICATO
10940 52 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  R?");.      retu
10950 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
10960 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63    }.    if( objc
10970 3e 3d 36 20 29 7b 0a 20 20 20 20 20 20 7a 53 65  >=6 ){.      zSe
10980 70 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  p = Tcl_GetStrin
10990 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 35 5d  gFromObj(objv[5]
109a0 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
109b0 0a 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22 5c  .      zSep = "\
109c0 74 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  t";.    }.    if
109d0 28 20 6f 62 6a 63 3e 3d 37 20 29 7b 0a 20 20 20  ( objc>=7 ){.   
109e0 20 20 20 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 47     zNull = Tcl_G
109f0 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
10a00 6f 62 6a 76 5b 36 5d 2c 20 30 29 3b 0a 20 20 20  objv[6], 0);.   
10a10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4e   }else{.      zN
10a20 75 6c 6c 20 3d 20 22 22 3b 0a 20 20 20 20 7d 0a  ull = "";.    }.
10a30 20 20 20 20 7a 43 6f 6e 66 6c 69 63 74 20 3d 20      zConflict = 
10a40 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
10a50 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29  mObj(objv[2], 0)
10a60 3b 0a 20 20 20 20 7a 54 61 62 6c 65 20 3d 20 54  ;.    zTable = T
10a70 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
10a80 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 30 29 3b  Obj(objv[3], 0);
10a90 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c  .    zFile = Tcl
10aa0 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
10ab0 6a 28 6f 62 6a 76 5b 34 5d 2c 20 30 29 3b 0a 20  j(objv[4], 0);. 
10ac0 20 20 20 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e     nSep = strlen
10ad0 33 30 28 7a 53 65 70 29 3b 0a 20 20 20 20 6e 4e  30(zSep);.    nN
10ae0 75 6c 6c 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a  ull = strlen30(z
10af0 4e 75 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 6e  Null);.    if( n
10b00 53 65 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Sep==0 ){.      
10b10 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
10b20 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 3a 20  (interp,"Error: 
10b30 6e 6f 6e 2d 6e 75 6c 6c 20 73 65 70 61 72 61 74  non-null separat
10b40 6f 72 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  or required for 
10b50 63 6f 70 79 22 2c 30 29 3b 0a 20 20 20 20 20 20  copy",0);.      
10b60 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
10b70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 73  ;.    }.    if(s
10b80 74 72 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c  trcmp(zConflict,
10b90 20 22 72 6f 6c 6c 62 61 63 6b 22 29 20 21 3d 20   "rollback") != 
10ba0 30 20 26 26 0a 20 20 20 20 20 20 20 73 74 72 63  0 &&.       strc
10bb0 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 61  mp(zConflict, "a
10bc0 62 6f 72 74 22 20 20 20 29 20 21 3d 20 30 20 26  bort"   ) != 0 &
10bd0 26 0a 20 20 20 20 20 20 20 73 74 72 63 6d 70 28  &.       strcmp(
10be0 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 66 61 69 6c  zConflict, "fail
10bf0 22 20 20 20 20 29 20 21 3d 20 30 20 26 26 0a 20  "    ) != 0 &&. 
10c00 20 20 20 20 20 20 73 74 72 63 6d 70 28 7a 43 6f        strcmp(zCo
10c10 6e 66 6c 69 63 74 2c 20 22 69 67 6e 6f 72 65 22  nflict, "ignore"
10c20 20 20 29 20 21 3d 20 30 20 26 26 0a 20 20 20 20    ) != 0 &&.    
10c30 20 20 20 73 74 72 63 6d 70 28 7a 43 6f 6e 66 6c     strcmp(zConfl
10c40 69 63 74 2c 20 22 72 65 70 6c 61 63 65 22 20 29  ict, "replace" )
10c50 20 21 3d 20 30 20 29 20 7b 0a 20 20 20 20 20 20   != 0 ) {.      
10c60 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
10c70 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a  (interp, "Error:
10c80 20 5c 22 22 2c 20 7a 43 6f 6e 66 6c 69 63 74 2c   \"", zConflict,
10c90 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 5c   .            "\
10ca0 22 2c 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f  ", conflict-algo
10cb0 72 69 74 68 6d 20 6d 75 73 74 20 62 65 20 6f 6e  rithm must be on
10cc0 65 20 6f 66 3a 20 72 6f 6c 6c 62 61 63 6b 2c 20  e of: rollback, 
10cd0 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 61  ".            "a
10ce0 62 6f 72 74 2c 20 66 61 69 6c 2c 20 69 67 6e 6f  bort, fail, igno
10cf0 72 65 2c 20 6f 72 20 72 65 70 6c 61 63 65 22 2c  re, or replace",
10d00 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   0);.      retur
10d10 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
10d20 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71   }.    zSql = sq
10d30 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53  lite3_mprintf("S
10d40 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 27 25 71  ELECT * FROM '%q
10d50 27 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20  '", zTable);.   
10d60 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a   if( zSql==0 ){.
10d70 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
10d80 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
10d90 45 72 72 6f 72 3a 20 6e 6f 20 73 75 63 68 20 74  Error: no such t
10da0 61 62 6c 65 3a 20 22 2c 20 7a 54 61 62 6c 65 2c  able: ", zTable,
10db0 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   0);.      retur
10dc0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
10dd0 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73   }.    nByte = s
10de0 74 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 20  trlen30(zSql);. 
10df0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
10e00 70 72 65 70 61 72 65 28 70 44 62 2d 3e 64 62 2c  prepare(pDb->db,
10e10 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
10e20 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  t, 0);.    sqlit
10e30 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
10e40 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
10e50 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
10e60 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72  ult(interp, "Err
10e70 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f 65  or: ", sqlite3_e
10e80 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20  rrmsg(pDb->db), 
10e90 30 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d  0);.      nCol =
10ea0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
10eb0 20 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69       nCol = sqli
10ec0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  te3_column_count
10ed0 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20  (pStmt);.    }. 
10ee0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
10ef0 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
10f00 69 66 28 20 6e 43 6f 6c 3d 3d 30 20 29 20 7b 0a  if( nCol==0 ) {.
10f10 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
10f20 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
10f30 20 20 7a 53 71 6c 20 3d 20 6d 61 6c 6c 6f 63 28    zSql = malloc(
10f40 20 6e 42 79 74 65 20 2b 20 35 30 20 2b 20 6e 43   nByte + 50 + nC
10f50 6f 6c 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20  ol*2 );.    if( 
10f60 7a 53 71 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20  zSql==0 ) {.    
10f70 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
10f80 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f  lt(interp, "Erro
10f90 72 3a 20 63 61 6e 27 74 20 6d 61 6c 6c 6f 63 28  r: can't malloc(
10fa0 29 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65  )", 0);.      re
10fb0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
10fc0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
10fd0 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 79 74 65  3_snprintf(nByte
10fe0 2b 35 30 2c 20 7a 53 71 6c 2c 20 22 49 4e 53 45  +50, zSql, "INSE
10ff0 52 54 20 4f 52 20 25 71 20 49 4e 54 4f 20 27 25  RT OR %q INTO '%
11000 71 27 20 56 41 4c 55 45 53 28 3f 22 2c 0a 20 20  q' VALUES(?",.  
11010 20 20 20 20 20 20 20 7a 43 6f 6e 66 6c 69 63 74         zConflict
11020 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 6a  , zTable);.    j
11030 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c   = strlen30(zSql
11040 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  );.    for(i=1; 
11050 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
11060 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20      zSql[j++] = 
11070 27 2c 27 3b 0a 20 20 20 20 20 20 7a 53 71 6c 5b  ',';.      zSql[
11080 6a 2b 2b 5d 20 3d 20 27 3f 27 3b 0a 20 20 20 20  j++] = '?';.    
11090 7d 0a 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20  }.    zSql[j++] 
110a0 3d 20 27 29 27 3b 0a 20 20 20 20 7a 53 71 6c 5b  = ')';.    zSql[
110b0 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  j] = 0;.    rc =
110c0 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
110d0 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  (pDb->db, zSql, 
110e0 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
110f0 20 20 20 20 66 72 65 65 28 7a 53 71 6c 29 3b 0a      free(zSql);.
11100 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
11110 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
11120 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72  sult(interp, "Er
11130 72 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f  ror: ", sqlite3_
11140 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c  errmsg(pDb->db),
11150 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
11160 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
11170 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
11180 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
11190 7d 0a 20 20 20 20 69 6e 20 3d 20 66 6f 70 65 6e  }.    in = fopen
111a0 28 7a 46 69 6c 65 2c 20 22 72 62 22 29 3b 0a 20  (zFile, "rb");. 
111b0 20 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a     if( in==0 ){.
111c0 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
111d0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
111e0 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70  Error: cannot op
111f0 65 6e 20 66 69 6c 65 3a 20 22 2c 20 7a 46 69 6c  en file: ", zFil
11200 65 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  e, NULL);.      
11210 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
11220 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72  (pStmt);.      r
11230 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
11240 0a 20 20 20 20 7d 0a 20 20 20 20 61 7a 43 6f 6c  .    }.    azCol
11250 20 3d 20 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f   = malloc( sizeo
11260 66 28 61 7a 43 6f 6c 5b 30 5d 29 2a 28 6e 43 6f  f(azCol[0])*(nCo
11270 6c 2b 31 29 20 29 3b 0a 20 20 20 20 69 66 28 20  l+1) );.    if( 
11280 61 7a 43 6f 6c 3d 3d 30 20 29 20 7b 0a 20 20 20  azCol==0 ) {.   
11290 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
112a0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72  ult(interp, "Err
112b0 6f 72 3a 20 63 61 6e 27 74 20 6d 61 6c 6c 6f 63  or: can't malloc
112c0 28 29 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 66  ()", 0);.      f
112d0 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 20  close(in);.     
112e0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
112f0 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 76 6f  R;.    }.    (vo
11300 69 64 29 73 71 6c 69 74 65 33 5f 65 78 65 63 28  id)sqlite3_exec(
11310 70 44 62 2d 3e 64 62 2c 20 22 42 45 47 49 4e 22  pDb->db, "BEGIN"
11320 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
11330 7a 43 6f 6d 6d 69 74 20 3d 20 22 43 4f 4d 4d 49  zCommit = "COMMI
11340 54 22 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  T";.    while( (
11350 7a 4c 69 6e 65 20 3d 20 6c 6f 63 61 6c 5f 67 65  zLine = local_ge
11360 74 6c 69 6e 65 28 30 2c 20 69 6e 29 29 21 3d 30  tline(0, in))!=0
11370 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
11380 7a 3b 0a 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2b  z;.      lineno+
11390 2b 3b 0a 20 20 20 20 20 20 61 7a 43 6f 6c 5b 30  +;.      azCol[0
113a0 5d 20 3d 20 7a 4c 69 6e 65 3b 0a 20 20 20 20 20  ] = zLine;.     
113b0 20 66 6f 72 28 69 3d 30 2c 20 7a 3d 7a 4c 69 6e   for(i=0, z=zLin
113c0 65 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20 20 20  e; *z; z++){.   
113d0 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d 7a 53 65       if( *z==zSe
113e0 70 5b 30 5d 20 26 26 20 73 74 72 6e 63 6d 70 28  p[0] && strncmp(
113f0 7a 2c 20 7a 53 65 70 2c 20 6e 53 65 70 29 3d 3d  z, zSep, nSep)==
11400 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a  0 ){.          *
11410 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  z = 0;.         
11420 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20   i++;.          
11430 69 66 28 20 69 3c 6e 43 6f 6c 20 29 7b 0a 20 20  if( i<nCol ){.  
11440 20 20 20 20 20 20 20 20 20 20 61 7a 43 6f 6c 5b            azCol[
11450 69 5d 20 3d 20 26 7a 5b 6e 53 65 70 5d 3b 0a 20  i] = &z[nSep];. 
11460 20 20 20 20 20 20 20 20 20 20 20 7a 20 2b 3d 20             z += 
11470 6e 53 65 70 2d 31 3b 0a 20 20 20 20 20 20 20 20  nSep-1;.        
11480 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
11490 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
114a0 69 2b 31 21 3d 6e 43 6f 6c 20 29 7b 0a 20 20 20  i+1!=nCol ){.   
114b0 20 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 3b       char *zErr;
114c0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 45 72  .        int nEr
114d0 72 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 46 69  r = strlen30(zFi
114e0 6c 65 29 20 2b 20 32 30 30 3b 0a 20 20 20 20 20  le) + 200;.     
114f0 20 20 20 7a 45 72 72 20 3d 20 6d 61 6c 6c 6f 63     zErr = malloc
11500 28 6e 45 72 72 29 3b 0a 20 20 20 20 20 20 20 20  (nErr);.        
11510 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20  if( zErr ){.    
11520 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
11530 70 72 69 6e 74 66 28 6e 45 72 72 2c 20 7a 45 72  printf(nErr, zEr
11540 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
11550 22 45 72 72 6f 72 3a 20 25 73 20 6c 69 6e 65 20  "Error: %s line 
11560 25 64 3a 20 65 78 70 65 63 74 65 64 20 25 64 20  %d: expected %d 
11570 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20  columns of data 
11580 62 75 74 20 66 6f 75 6e 64 20 25 64 22 2c 0a 20  but found %d",. 
11590 20 20 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c              zFil
115a0 65 2c 20 6c 69 6e 65 6e 6f 2c 20 6e 43 6f 6c 2c  e, lineno, nCol,
115b0 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20   i+1);.         
115c0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
115d0 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72 2c 20  t(interp, zErr, 
115e0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 72  0);.          fr
115f0 65 65 28 7a 45 72 72 29 3b 0a 20 20 20 20 20 20  ee(zErr);.      
11600 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 43 6f 6d    }.        zCom
11610 6d 69 74 20 3d 20 22 52 4f 4c 4c 42 41 43 4b 22  mit = "ROLLBACK"
11620 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
11630 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
11640 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
11650 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  i++){.        /*
11660 20 63 68 65 63 6b 20 66 6f 72 20 6e 75 6c 6c 20   check for null 
11670 64 61 74 61 2c 20 69 66 20 73 6f 2c 20 62 69 6e  data, if so, bin
11680 64 20 61 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20  d as null */.   
11690 20 20 20 20 20 69 66 28 20 28 6e 4e 75 6c 6c 3e       if( (nNull>
116a0 30 20 26 26 20 73 74 72 63 6d 70 28 61 7a 43 6f  0 && strcmp(azCo
116b0 6c 5b 69 5d 2c 20 7a 4e 75 6c 6c 29 3d 3d 30 29  l[i], zNull)==0)
116c0 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 74  .          || st
116d0 72 6c 65 6e 33 30 28 61 7a 43 6f 6c 5b 69 5d 29  rlen30(azCol[i])
116e0 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 29 7b 0a  ==0 .        ){.
116f0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
11700 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d  3_bind_null(pStm
11710 74 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20  t, i+1);.       
11720 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11730 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74    sqlite3_bind_t
11740 65 78 74 28 70 53 74 6d 74 2c 20 69 2b 31 2c 20  ext(pStmt, i+1, 
11750 61 7a 43 6f 6c 5b 69 5d 2c 20 2d 31 2c 20 53 51  azCol[i], -1, SQ
11760 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
11770 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
11780 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
11790 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ep(pStmt);.     
117a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
117b0 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  set(pStmt);.    
117c0 20 20 66 72 65 65 28 7a 4c 69 6e 65 29 3b 0a 20    free(zLine);. 
117d0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
117e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
117f0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
11800 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72  lt(interp,"Error
11810 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  : ", sqlite3_err
11820 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30 29  msg(pDb->db), 0)
11830 3b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6d 6d 69  ;.        zCommi
11840 74 20 3d 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a  t = "ROLLBACK";.
11850 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
11860 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
11870 20 66 72 65 65 28 61 7a 43 6f 6c 29 3b 0a 20 20   free(azCol);.  
11880 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20    fclose(in);.  
11890 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
118a0 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 28  ze(pStmt);.    (
118b0 76 6f 69 64 29 73 71 6c 69 74 65 33 5f 65 78 65  void)sqlite3_exe
118c0 63 28 70 44 62 2d 3e 64 62 2c 20 7a 43 6f 6d 6d  c(pDb->db, zComm
118d0 69 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 0a 20  it, 0, 0, 0);.. 
118e0 20 20 20 69 66 28 20 7a 43 6f 6d 6d 69 74 5b 30     if( zCommit[0
118f0 5d 20 3d 3d 20 27 43 27 20 29 7b 0a 20 20 20 20  ] == 'C' ){.    
11900 20 20 2f 2a 20 73 75 63 63 65 73 73 2c 20 73 65    /* success, se
11910 74 20 72 65 73 75 6c 74 20 61 73 20 6e 75 6d 62  t result as numb
11920 65 72 20 6f 66 20 6c 69 6e 65 73 20 70 72 6f 63  er of lines proc
11930 65 73 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 70  essed */.      p
11940 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74  Result = Tcl_Get
11950 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
11960 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  );.      Tcl_Set
11970 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20  IntObj(pResult, 
11980 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20 72  lineno);.      r
11990 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20  c = TCL_OK;.    
119a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
119b0 66 61 69 6c 75 72 65 2c 20 61 70 70 65 6e 64 20  failure, append 
119c0 6c 69 6e 65 6e 6f 20 77 68 65 72 65 20 66 61 69  lineno where fai
119d0 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  led */.      sql
119e0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
119f0 7a 65 6f 66 28 7a 4c 69 6e 65 4e 75 6d 29 2c 20  zeof(zLineNum), 
11a00 7a 4c 69 6e 65 4e 75 6d 2c 22 25 64 22 2c 6c 69  zLineNum,"%d",li
11a10 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20 54 63 6c  neno);.      Tcl
11a20 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
11a30 74 65 72 70 2c 22 2c 20 66 61 69 6c 65 64 20 77  terp,", failed w
11a40 68 69 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 20  hile processing 
11a50 6c 69 6e 65 3a 20 22 2c 7a 4c 69 6e 65 4e 75 6d  line: ",zLineNum
11a60 2c 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ,0);.      rc = 
11a70 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
11a80 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
11a90 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64  .  /*.  **    $d
11aa0 62 20 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78  b enable_load_ex
11ab0 74 65 6e 73 69 6f 6e 20 42 4f 4f 4c 45 41 4e 0a  tension BOOLEAN.
11ac0 20 20 2a 2a 0a 20 20 2a 2a 20 54 75 72 6e 20 74    **.  ** Turn t
11ad0 68 65 20 65 78 74 65 6e 73 69 6f 6e 20 6c 6f 61  he extension loa
11ae0 64 69 6e 67 20 66 65 61 74 75 72 65 20 6f 6e 20  ding feature on 
11af0 6f 72 20 6f 66 66 2e 20 20 49 74 20 69 66 20 6f  or off.  It if o
11b00 66 66 20 62 79 0a 20 20 2a 2a 20 64 65 66 61 75  ff by.  ** defau
11b10 6c 74 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  lt..  */.  case 
11b20 44 42 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45  DB_ENABLE_LOAD_E
11b30 58 54 45 4e 53 49 4f 4e 3a 20 7b 0a 23 69 66 6e  XTENSION: {.#ifn
11b40 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11b50 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20  LOAD_EXTENSION. 
11b60 20 20 20 69 6e 74 20 6f 6e 6f 66 66 3b 0a 20 20     int onoff;.  
11b70 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
11b80 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
11b90 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
11ba0 32 2c 20 6f 62 6a 76 2c 20 22 42 4f 4f 4c 45 41  2, objv, "BOOLEA
11bb0 4e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  N");.      retur
11bc0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
11bd0 20 7d 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47   }.    if( Tcl_G
11be0 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
11bf0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
11c00 2c 20 26 6f 6e 6f 66 66 29 20 29 7b 0a 20 20 20  , &onoff) ){.   
11c10 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
11c20 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ROR;.    }.    s
11c30 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f  qlite3_enable_lo
11c40 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 70 44 62  ad_extension(pDb
11c50 2d 3e 64 62 2c 20 6f 6e 6f 66 66 29 3b 0a 20 20  ->db, onoff);.  
11c60 20 20 62 72 65 61 6b 3b 0a 23 65 6c 73 65 0a 20    break;.#else. 
11c70 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
11c80 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 65 78 74  ult(interp, "ext
11c90 65 6e 73 69 6f 6e 20 6c 6f 61 64 69 6e 67 20 69  ension loading i
11ca0 73 20 74 75 72 6e 65 64 20 6f 66 66 20 61 74 20  s turned off at 
11cb0 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 22 2c 0a 20  compile-time",. 
11cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cd0 20 20 20 20 30 29 3b 0a 20 20 20 20 72 65 74 75      0);.    retu
11ce0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65  rn TCL_ERROR;.#e
11cf0 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  ndif.  }..  /*. 
11d00 20 2a 2a 20 20 20 20 24 64 62 20 65 72 72 6f 72   **    $db error
11d10 63 6f 64 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52  code.  **.  ** R
11d20 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 65 72 69  eturn the numeri
11d30 63 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61  c error code tha
11d40 74 20 77 61 73 20 72 65 74 75 72 6e 65 64 20 62  t was returned b
11d50 79 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  y the most recen
11d60 74 0a 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73  t.  ** call to s
11d70 71 6c 69 74 65 33 5f 65 78 65 63 28 29 2e 0a 20  qlite3_exec().. 
11d80 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 45 52   */.  case DB_ER
11d90 52 4f 52 43 4f 44 45 3a 20 7b 0a 20 20 20 20 54  RORCODE: {.    T
11da0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
11db0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
11dc0 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 72  ntObj(sqlite3_er
11dd0 72 63 6f 64 65 28 70 44 62 2d 3e 64 62 29 29 29  rcode(pDb->db)))
11de0 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
11df0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24  ..  /*.  **    $
11e00 64 62 20 65 78 69 73 74 73 20 24 73 71 6c 0a 20  db exists $sql. 
11e10 20 2a 2a 20 20 20 20 24 64 62 20 6f 6e 65 63 6f   **    $db oneco
11e20 6c 75 6d 6e 20 24 73 71 6c 0a 20 20 2a 2a 0a 20  lumn $sql.  **. 
11e30 20 2a 2a 20 54 68 65 20 6f 6e 65 63 6f 6c 75 6d   ** The onecolum
11e40 6e 20 6d 65 74 68 6f 64 20 69 73 20 74 68 65 20  n method is the 
11e50 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 3a 0a 20  equivalent of:. 
11e60 20 2a 2a 20 20 20 20 20 6c 69 6e 64 65 78 20 5b   **     lindex [
11e70 24 64 62 20 65 76 61 6c 20 24 73 71 6c 5d 20 30  $db eval $sql] 0
11e80 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
11e90 45 58 49 53 54 53 3a 20 0a 20 20 63 61 73 65 20  EXISTS: .  case 
11ea0 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 3a 20 7b 0a  DB_ONECOLUMN: {.
11eb0 20 20 20 20 44 62 45 76 61 6c 43 6f 6e 74 65 78      DbEvalContex
11ec0 74 20 73 45 76 61 6c 3b 0a 20 20 20 20 69 66 28  t sEval;.    if(
11ed0 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
11ee0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
11ef0 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
11f00 6a 76 2c 20 22 53 51 4c 22 29 3b 0a 20 20 20 20  jv, "SQL");.    
11f10 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
11f20 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64  OR;.    }..    d
11f30 62 45 76 61 6c 49 6e 69 74 28 26 73 45 76 61 6c  bEvalInit(&sEval
11f40 2c 20 70 44 62 2c 20 6f 62 6a 76 5b 32 5d 2c 20  , pDb, objv[2], 
11f50 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 62 45  0);.    rc = dbE
11f60 76 61 6c 53 74 65 70 28 26 73 45 76 61 6c 29 3b  valStep(&sEval);
11f70 0a 20 20 20 20 69 66 28 20 63 68 6f 69 63 65 3d  .    if( choice=
11f80 3d 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 20 29 7b  =DB_ONECOLUMN ){
11f90 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 54  .      if( rc==T
11fa0 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  CL_OK ){.       
11fb0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
11fc0 74 28 69 6e 74 65 72 70 2c 20 64 62 45 76 61 6c  t(interp, dbEval
11fd0 43 6f 6c 75 6d 6e 56 61 6c 75 65 28 26 73 45 76  ColumnValue(&sEv
11fe0 61 6c 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 7d  al, 0));.      }
11ff0 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 54 43 4c  else if( rc==TCL
12000 5f 42 52 45 41 4b 20 29 7b 0a 20 20 20 20 20 20  _BREAK ){.      
12010 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c    Tcl_ResetResul
12020 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 20  t(interp);.     
12030 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
12040 20 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20 7c   rc==TCL_BREAK |
12050 7c 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a  | rc==TCL_OK ){.
12060 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a        Tcl_SetObj
12070 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
12080 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a  cl_NewBooleanObj
12090 28 72 63 3d 3d 54 43 4c 5f 4f 4b 29 29 3b 0a 20  (rc==TCL_OK));. 
120a0 20 20 20 7d 0a 20 20 20 20 64 62 45 76 61 6c 46     }.    dbEvalF
120b0 69 6e 61 6c 69 7a 65 28 26 73 45 76 61 6c 29 3b  inalize(&sEval);
120c0 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43  ..    if( rc==TC
120d0 4c 5f 42 52 45 41 4b 20 29 7b 0a 20 20 20 20 20  L_BREAK ){.     
120e0 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20   rc = TCL_OK;.  
120f0 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
12100 20 7d 0a 20 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a   }.   .  /*.  **
12110 20 20 20 20 24 64 62 20 65 76 61 6c 20 24 73 71      $db eval $sq
12120 6c 20 3f 61 72 72 61 79 3f 20 3f 7b 20 20 2e 2e  l ?array? ?{  ..
12130 2e 63 6f 64 65 2e 2e 2e 20 7d 3f 0a 20 20 2a 2a  .code... }?.  **
12140 0a 20 20 2a 2a 20 54 68 65 20 53 51 4c 20 73 74  .  ** The SQL st
12150 61 74 65 6d 65 6e 74 20 69 6e 20 24 73 71 6c 20  atement in $sql 
12160 69 73 20 65 76 61 6c 75 61 74 65 64 2e 20 20 46  is evaluated.  F
12170 6f 72 20 65 61 63 68 20 72 6f 77 2c 20 74 68 65  or each row, the
12180 20 76 61 6c 75 65 73 20 61 72 65 0a 20 20 2a 2a   values are.  **
12190 20 70 6c 61 63 65 64 20 69 6e 20 65 6c 65 6d 65   placed in eleme
121a0 6e 74 73 20 6f 66 20 74 68 65 20 61 72 72 61 79  nts of the array
121b0 20 6e 61 6d 65 64 20 22 61 72 72 61 79 22 20 61   named "array" a
121c0 6e 64 20 2e 2e 2e 63 6f 64 65 2e 2e 2e 20 69 73  nd ...code... is
121d0 20 65 78 65 63 75 74 65 64 2e 0a 20 20 2a 2a 20   executed..  ** 
121e0 49 66 20 22 61 72 72 61 79 22 20 61 6e 64 20 22  If "array" and "
121f0 63 6f 64 65 22 20 61 72 65 20 6f 6d 69 74 74 65  code" are omitte
12200 64 2c 20 74 68 65 6e 20 6e 6f 20 63 61 6c 6c 62  d, then no callb
12210 61 63 6b 20 69 73 20 65 76 65 72 79 20 69 6e 76  ack is every inv
12220 6f 6b 65 64 2e 0a 20 20 2a 2a 20 49 66 20 22 61  oked..  ** If "a
12230 72 72 61 79 22 20 69 73 20 61 6e 20 65 6d 70 74  rray" is an empt
12240 79 20 73 74 72 69 6e 67 2c 20 74 68 65 6e 20 74  y string, then t
12250 68 65 20 76 61 6c 75 65 73 20 61 72 65 20 70 6c  he values are pl
12260 61 63 65 64 20 69 6e 20 76 61 72 69 61 62 6c 65  aced in variable
12270 73 0a 20 20 2a 2a 20 74 68 61 74 20 68 61 76 65  s.  ** that have
12280 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61   the same name a
12290 73 20 74 68 65 20 66 69 65 6c 64 73 20 65 78 74  s the fields ext
122a0 72 61 63 74 65 64 20 62 79 20 74 68 65 20 71 75  racted by the qu
122b0 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ery..  */.  case
122c0 20 44 42 5f 45 56 41 4c 3a 20 7b 0a 20 20 20 20   DB_EVAL: {.    
122d0 69 66 28 20 6f 62 6a 63 3c 33 20 7c 7c 20 6f 62  if( objc<3 || ob
122e0 6a 63 3e 35 20 29 7b 0a 20 20 20 20 20 20 54 63  jc>5 ){.      Tc
122f0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
12300 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
12310 22 53 51 4c 20 3f 41 52 52 41 59 2d 4e 41 4d 45  "SQL ?ARRAY-NAME
12320 3f 20 3f 53 43 52 49 50 54 3f 22 29 3b 0a 20 20  ? ?SCRIPT?");.  
12330 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
12340 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
12350 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a   if( objc==3 ){.
12360 20 20 20 20 20 20 44 62 45 76 61 6c 43 6f 6e 74        DbEvalCont
12370 65 78 74 20 73 45 76 61 6c 3b 0a 20 20 20 20 20  ext sEval;.     
12380 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 20 3d   Tcl_Obj *pRet =
12390 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20   Tcl_NewObj();. 
123a0 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66       Tcl_IncrRef
123b0 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20  Count(pRet);.   
123c0 20 20 20 64 62 45 76 61 6c 49 6e 69 74 28 26 73     dbEvalInit(&s
123d0 45 76 61 6c 2c 20 70 44 62 2c 20 6f 62 6a 76 5b  Eval, pDb, objv[
123e0 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 77 68  2], 0);.      wh
123f0 69 6c 65 28 20 54 43 4c 5f 4f 4b 3d 3d 28 72 63  ile( TCL_OK==(rc
12400 20 3d 20 64 62 45 76 61 6c 53 74 65 70 28 26 73   = dbEvalStep(&s
12410 45 76 61 6c 29 29 20 29 7b 0a 20 20 20 20 20 20  Eval)) ){.      
12420 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
12430 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20   int nCol;.     
12440 20 20 20 64 62 45 76 61 6c 52 6f 77 49 6e 66 6f     dbEvalRowInfo
12450 28 26 73 45 76 61 6c 2c 20 26 6e 43 6f 6c 2c 20  (&sEval, &nCol, 
12460 30 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  0);.        for(
12470 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
12480 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  ){.          Tcl
12490 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
124a0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52  ement(interp, pR
124b0 65 74 2c 20 64 62 45 76 61 6c 43 6f 6c 75 6d 6e  et, dbEvalColumn
124c0 56 61 6c 75 65 28 26 73 45 76 61 6c 2c 20 69 29  Value(&sEval, i)
124d0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
124e0 20 20 20 7d 0a 20 20 20 20 20 20 64 62 45 76 61     }.      dbEva
124f0 6c 46 69 6e 61 6c 69 7a 65 28 26 73 45 76 61 6c  lFinalize(&sEval
12500 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
12510 3d 54 43 4c 5f 42 52 45 41 4b 20 29 7b 0a 20 20  =TCL_BREAK ){.  
12520 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a        Tcl_SetObj
12530 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
12540 52 65 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63  Ret);.        rc
12550 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20   = TCL_OK;.     
12560 20 7d 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63   }.      Tcl_Dec
12570 72 52 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b  rRefCount(pRet);
12580 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
12590 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 64 5b    ClientData cd[
125a0 32 5d 3b 0a 20 20 20 20 20 20 44 62 45 76 61 6c  2];.      DbEval
125b0 43 6f 6e 74 65 78 74 20 2a 70 3b 0a 20 20 20 20  Context *p;.    
125c0 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 72 61    Tcl_Obj *pArra
125d0 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 63 6c  y = 0;.      Tcl
125e0 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 0a 0a  _Obj *pScript;..
125f0 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d        if( objc==
12600 35 20 26 26 20 2a 28 63 68 61 72 20 2a 29 54 63  5 && *(char *)Tc
12610 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
12620 5b 33 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [3]) ){.        
12630 70 41 72 72 61 79 20 3d 20 6f 62 6a 76 5b 33 5d  pArray = objv[3]
12640 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12650 70 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 6f  pScript = objv[o
12660 62 6a 63 2d 31 5d 3b 0a 20 20 20 20 20 20 54 63  bjc-1];.      Tc
12670 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
12680 53 63 72 69 70 74 29 3b 0a 20 20 20 20 20 20 0a  Script);.      .
12690 20 20 20 20 20 20 70 20 3d 20 28 44 62 45 76 61        p = (DbEva
126a0 6c 43 6f 6e 74 65 78 74 20 2a 29 54 63 6c 5f 41  lContext *)Tcl_A
126b0 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 44 62 45 76  lloc(sizeof(DbEv
126c0 61 6c 43 6f 6e 74 65 78 74 29 29 3b 0a 20 20 20  alContext));.   
126d0 20 20 20 64 62 45 76 61 6c 49 6e 69 74 28 70 2c     dbEvalInit(p,
126e0 20 70 44 62 2c 20 6f 62 6a 76 5b 32 5d 2c 20 70   pDb, objv[2], p
126f0 41 72 72 61 79 29 3b 0a 0a 20 20 20 20 20 20 63  Array);..      c
12700 64 5b 30 5d 20 3d 20 28 76 6f 69 64 20 2a 29 70  d[0] = (void *)p
12710 3b 0a 20 20 20 20 20 20 63 64 5b 31 5d 20 3d 20  ;.      cd[1] = 
12720 28 76 6f 69 64 20 2a 29 70 53 63 72 69 70 74 3b  (void *)pScript;
12730 0a 20 20 20 20 20 20 72 63 20 3d 20 44 62 45 76  .      rc = DbEv
12740 61 6c 4e 65 78 74 43 6d 64 28 63 64 2c 20 69 6e  alNextCmd(cd, in
12750 74 65 72 70 2c 20 54 43 4c 5f 4f 4b 29 3b 0a 20  terp, TCL_OK);. 
12760 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
12770 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
12780 20 20 20 24 64 62 20 66 75 6e 63 74 69 6f 6e 20     $db function 
12790 4e 41 4d 45 20 5b 2d 61 72 67 63 6f 75 6e 74 20  NAME [-argcount 
127a0 4e 5d 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20  N] SCRIPT.  **. 
127b0 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77   ** Create a new
127c0 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 63 61   SQL function ca
127d0 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 57 68 65 6e  lled NAME.  When
127e0 65 76 65 72 20 74 68 61 74 20 66 75 6e 63 74 69  ever that functi
127f0 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 61 6c 6c 65  on is.  ** calle
12800 64 2c 20 69 6e 76 6f 6b 65 20 53 43 52 49 50 54  d, invoke SCRIPT
12810 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65   to evaluate the
12820 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a   function..  */.
12830 20 20 63 61 73 65 20 44 42 5f 46 55 4e 43 54 49    case DB_FUNCTI
12840 4f 4e 3a 20 7b 0a 20 20 20 20 53 71 6c 46 75 6e  ON: {.    SqlFun
12850 63 20 2a 70 46 75 6e 63 3b 0a 20 20 20 20 54 63  c *pFunc;.    Tc
12860 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 0a  l_Obj *pScript;.
12870 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b      char *zName;
12880 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 20 3d 20  .    int nArg = 
12890 2d 31 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  -1;.    if( objc
128a0 3d 3d 36 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  ==6 ){.      con
128b0 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 54 63 6c  st char *z = Tcl
128c0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
128d0 33 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  3]);.      int n
128e0 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 29 3b 0a   = strlen30(z);.
128f0 20 20 20 20 20 20 69 66 28 20 6e 3e 32 20 26 26        if( n>2 &&
12900 20 73 74 72 6e 63 6d 70 28 7a 2c 20 22 2d 61 72   strncmp(z, "-ar
12910 67 63 6f 75 6e 74 22 2c 6e 29 3d 3d 30 20 29 7b  gcount",n)==0 ){
12920 0a 20 20 20 20 20 20 20 20 69 66 28 20 54 63 6c  .        if( Tcl
12930 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
12940 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20  nterp, objv[4], 
12950 26 6e 41 72 67 29 20 29 20 72 65 74 75 72 6e 20  &nArg) ) return 
12960 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
12970 20 20 20 69 66 28 20 6e 41 72 67 3c 30 20 29 7b     if( nArg<0 ){
12980 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 41  .          Tcl_A
12990 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
129a0 72 70 2c 20 22 6e 75 6d 62 65 72 20 6f 66 20 61  rp, "number of a
129b0 72 67 75 6d 65 6e 74 73 20 6d 75 73 74 20 62 65  rguments must be
129c0 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 22 2c 0a   non-negative",.
129d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
129e0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
129f0 2a 29 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  *)0);.          
12a00 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
12a10 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
12a20 20 20 7d 0a 20 20 20 20 20 20 70 53 63 72 69 70    }.      pScrip
12a30 74 20 3d 20 6f 62 6a 76 5b 35 5d 3b 0a 20 20 20  t = objv[5];.   
12a40 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 21   }else if( objc!
12a50 3d 34 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =4 ){.      Tcl_
12a60 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
12a70 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e  erp, 2, objv, "N
12a80 41 4d 45 20 5b 2d 61 72 67 63 6f 75 6e 74 20 4e  AME [-argcount N
12a90 5d 20 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20  ] SCRIPT");.    
12aa0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
12ab0 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OR;.    }else{. 
12ac0 20 20 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f       pScript = o
12ad0 62 6a 76 5b 33 5d 3b 0a 20 20 20 20 7d 0a 20 20  bjv[3];.    }.  
12ae0 20 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65    zName = Tcl_Ge
12af0 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
12b00 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20  bjv[2], 0);.    
12b10 70 46 75 6e 63 20 3d 20 66 69 6e 64 53 71 6c 46  pFunc = findSqlF
12b20 75 6e 63 28 70 44 62 2c 20 7a 4e 61 6d 65 29 3b  unc(pDb, zName);
12b30 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 3d 3d  .    if( pFunc==
12b40 30 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  0 ) return TCL_E
12b50 52 52 4f 52 3b 0a 20 20 20 20 69 66 28 20 70 46  RROR;.    if( pF
12b60 75 6e 63 2d 3e 70 53 63 72 69 70 74 20 29 7b 0a  unc->pScript ){.
12b70 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65        Tcl_DecrRe
12b80 66 43 6f 75 6e 74 28 70 46 75 6e 63 2d 3e 70 53  fCount(pFunc->pS
12b90 63 72 69 70 74 29 3b 0a 20 20 20 20 7d 0a 20 20  cript);.    }.  
12ba0 20 20 70 46 75 6e 63 2d 3e 70 53 63 72 69 70 74    pFunc->pScript
12bb0 20 3d 20 70 53 63 72 69 70 74 3b 0a 20 20 20 20   = pScript;.    
12bc0 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
12bd0 28 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20 70  (pScript);.    p
12be0 46 75 6e 63 2d 3e 75 73 65 45 76 61 6c 4f 62 6a  Func->useEvalObj
12bf0 76 20 3d 20 73 61 66 65 54 6f 55 73 65 45 76 61  v = safeToUseEva
12c00 6c 4f 62 6a 76 28 69 6e 74 65 72 70 2c 20 70 53  lObjv(interp, pS
12c10 63 72 69 70 74 29 3b 0a 20 20 20 20 72 63 20 3d  cript);.    rc =
12c20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
12c30 66 75 6e 63 74 69 6f 6e 28 70 44 62 2d 3e 64 62  function(pDb->db
12c40 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53  , zName, nArg, S
12c50 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20 20 20  QLITE_UTF8,.    
12c60 20 20 20 20 70 46 75 6e 63 2c 20 74 63 6c 53 71      pFunc, tclSq
12c70 6c 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20  lFunc, 0, 0);.  
12c80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
12c90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
12ca0 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  = TCL_ERROR;.   
12cb0 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
12cc0 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
12cd0 29 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28  )sqlite3_errmsg(
12ce0 70 44 62 2d 3e 64 62 29 2c 20 54 43 4c 5f 56 4f  pDb->db), TCL_VO
12cf0 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 7d 0a 20  LATILE);.    }. 
12d00 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
12d10 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62   /*.  **     $db
12d20 20 69 6e 63 72 62 6c 6f 62 20 3f 2d 72 65 61 64   incrblob ?-read
12d30 6f 6e 6c 79 3f 20 3f 44 42 3f 20 54 41 42 4c 45  only? ?DB? TABLE
12d40 20 43 4f 4c 55 4d 4e 20 52 4f 57 49 44 0a 20 20   COLUMN ROWID.  
12d50 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 49 4e 43  */.  case DB_INC
12d60 52 42 4c 4f 42 3a 20 7b 0a 23 69 66 64 65 66 20  RBLOB: {.#ifdef 
12d70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
12d80 42 4c 4f 42 0a 20 20 20 20 54 63 6c 5f 41 70 70  BLOB.    Tcl_App
12d90 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
12da0 2c 20 22 69 6e 63 72 62 6c 6f 62 20 6e 6f 74 20  , "incrblob not 
12db0 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 69  available in thi
12dc0 73 20 62 75 69 6c 64 22 2c 20 30 29 3b 0a 20 20  s build", 0);.  
12dd0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
12de0 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 6e  OR;.#else.    in
12df0 74 20 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20 30  t isReadonly = 0
12e00 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
12e10 20 2a 7a 44 62 20 3d 20 22 6d 61 69 6e 22 3b 0a   *zDb = "main";.
12e20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
12e30 7a 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73  zTable;.    cons
12e40 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 3b  t char *zColumn;
12e50 0a 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74  .    Tcl_WideInt
12e60 20 69 52 6f 77 3b 0a 0a 20 20 20 20 2f 2a 20 43   iRow;..    /* C
12e70 68 65 63 6b 20 66 6f 72 20 74 68 65 20 2d 72 65  heck for the -re
12e80 61 64 6f 6e 6c 79 20 6f 70 74 69 6f 6e 20 2a 2f  adonly option */
12e90 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20  .    if( objc>3 
12ea0 26 26 20 73 74 72 63 6d 70 28 54 63 6c 5f 47 65  && strcmp(Tcl_Ge
12eb0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
12ec0 2c 20 22 2d 72 65 61 64 6f 6e 6c 79 22 29 3d 3d  , "-readonly")==
12ed0 30 20 29 7b 0a 20 20 20 20 20 20 69 73 52 65 61  0 ){.      isRea
12ee0 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 7d  donly = 1;.    }
12ef0 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ..    if( objc!=
12f00 28 35 2b 69 73 52 65 61 64 6f 6e 6c 79 29 20 26  (5+isReadonly) &
12f10 26 20 6f 62 6a 63 21 3d 28 36 2b 69 73 52 65 61  & objc!=(6+isRea
12f20 64 6f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20  donly) ){.      
12f30 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
12f40 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
12f50 2c 20 22 3f 2d 72 65 61 64 6f 6e 6c 79 3f 20 3f  , "?-readonly? ?
12f60 44 42 3f 20 54 41 42 4c 45 20 43 4f 4c 55 4d 4e  DB? TABLE COLUMN
12f70 20 52 4f 57 49 44 22 29 3b 0a 20 20 20 20 20 20   ROWID");.      
12f80 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
12f90 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
12fa0 20 6f 62 6a 63 3d 3d 28 36 2b 69 73 52 65 61 64   objc==(6+isRead
12fb0 6f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 7a  only) ){.      z
12fc0 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  Db = Tcl_GetStri
12fd0 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20  ng(objv[2]);.   
12fe0 20 7d 0a 20 20 20 20 7a 54 61 62 6c 65 20 3d 20   }.    zTable = 
12ff0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
13000 6a 76 5b 6f 62 6a 63 2d 33 5d 29 3b 0a 20 20 20  jv[objc-3]);.   
13010 20 7a 43 6f 6c 75 6d 6e 20 3d 20 54 63 6c 5f 47   zColumn = Tcl_G
13020 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 6f 62  etString(objv[ob
13030 6a 63 2d 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d  jc-2]);.    rc =
13040 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46   Tcl_GetWideIntF
13050 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
13060 62 6a 76 5b 6f 62 6a 63 2d 31 5d 2c 20 26 69 52  bjv[objc-1], &iR
13070 6f 77 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  ow);..    if( rc
13080 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20  ==TCL_OK ){.    
13090 20 20 72 63 20 3d 20 63 72 65 61 74 65 49 6e 63    rc = createInc
130a0 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 28 0a 20 20  rblobChannel(.  
130b0 20 20 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20          interp, 
130c0 70 44 62 2c 20 7a 44 62 2c 20 7a 54 61 62 6c 65  pDb, zDb, zTable
130d0 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 69 52 6f 77 2c  , zColumn, iRow,
130e0 20 69 73 52 65 61 64 6f 6e 6c 79 0a 20 20 20 20   isReadonly.    
130f0 20 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69    );.    }.#endi
13100 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  f.    break;.  }
13110 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  /*.  **     
13120 24 64 62 20 69 6e 74 65 72 72 75 70 74 0a 20 20  $db interrupt.  
13130 2a 2a 0a 20 20 2a 2a 20 49 6e 74 65 72 72 75 70  **.  ** Interrup
13140 74 20 74 68 65 20 65 78 65 63 75 74 69 6f 6e 20  t the execution 
13150 6f 66 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73  of the inner-mos
13160 74 20 53 51 4c 20 69 6e 74 65 72 70 72 65 74 65  t SQL interprete
13170 72 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 63 61  r.  This.  ** ca
13180 75 73 65 73 20 74 68 65 20 53 51 4c 20 73 74 61  uses the SQL sta
13190 74 65 6d 65 6e 74 20 74 6f 20 72 65 74 75 72 6e  tement to return
131a0 20 61 6e 20 65 72 72 6f 72 20 6f 66 20 53 51 4c   an error of SQL
131b0 49 54 45 5f 49 4e 54 45 52 52 55 50 54 2e 0a 20  ITE_INTERRUPT.. 
131c0 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 49 4e   */.  case DB_IN
131d0 54 45 52 52 55 50 54 3a 20 7b 0a 20 20 20 20 73  TERRUPT: {.    s
131e0 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74  qlite3_interrupt
131f0 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20 62  (pDb->db);.    b
13200 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
13210 20 20 2a 2a 20 20 20 20 20 24 64 62 20 6e 75 6c    **     $db nul
13220 6c 76 61 6c 75 65 20 3f 53 54 52 49 4e 47 3f 0a  lvalue ?STRING?.
13230 20 20 2a 2a 0a 20 20 2a 2a 20 43 68 61 6e 67 65    **.  ** Change
13240 20 74 65 78 74 20 75 73 65 64 20 77 68 65 6e 20   text used when 
13250 61 20 4e 55 4c 4c 20 63 6f 6d 65 73 20 62 61 63  a NULL comes bac
13260 6b 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  k from the datab
13270 61 73 65 2e 20 49 66 20 3f 53 54 52 49 4e 47 3f  ase. If ?STRING?
13280 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 72 65  .  ** is not pre
13290 73 65 6e 74 2c 20 74 68 65 6e 20 74 68 65 20 63  sent, then the c
132a0 75 72 72 65 6e 74 20 73 74 72 69 6e 67 20 75 73  urrent string us
132b0 65 64 20 66 6f 72 20 4e 55 4c 4c 20 69 73 20 72  ed for NULL is r
132c0 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2a 20 49 66  eturned..  ** If
132d0 20 53 54 52 49 4e 47 20 69 73 20 70 72 65 73 65   STRING is prese
132e0 6e 74 2c 20 74 68 65 6e 20 53 54 52 49 4e 47 20  nt, then STRING 
132f0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a  is returned..  *
13300 2a 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  *.  */.  case DB
13310 5f 4e 55 4c 4c 56 41 4c 55 45 3a 20 7b 0a 20 20  _NULLVALUE: {.  
13320 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26 26    if( objc!=2 &&
13330 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
13340 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
13350 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
13360 6a 76 2c 20 22 4e 55 4c 4c 56 41 4c 55 45 22 29  jv, "NULLVALUE")
13370 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
13380 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
13390 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20      if( objc==3 
133a0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  ){.      int len
133b0 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e  ;.      char *zN
133c0 75 6c 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ull = Tcl_GetStr
133d0 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
133e0 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20  2], &len);.     
133f0 20 69 66 28 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20   if( pDb->zNull 
13400 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46  ){.        Tcl_F
13410 72 65 65 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29 3b  ree(pDb->zNull);
13420 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
13430 66 28 20 7a 4e 75 6c 6c 20 26 26 20 6c 65 6e 3e  f( zNull && len>
13440 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  0 ){.        pDb
13450 2d 3e 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 41 6c  ->zNull = Tcl_Al
13460 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a  loc( len + 1 );.
13470 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
13480 44 62 2d 3e 7a 4e 75 6c 6c 2c 20 7a 4e 75 6c 6c  Db->zNull, zNull
13490 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  , len);.        
134a0 70 44 62 2d 3e 7a 4e 75 6c 6c 5b 6c 65 6e 5d 20  pDb->zNull[len] 
134b0 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 7d 65  = '\0';.      }e
134c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62  lse{.        pDb
134d0 2d 3e 7a 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20  ->zNull = 0;.   
134e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 54     }.    }.    T
134f0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
13500 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53  interp, Tcl_NewS
13510 74 72 69 6e 67 4f 62 6a 28 70 44 62 2d 3e 7a 4e  tringObj(pDb->zN
13520 75 6c 6c 2c 20 2d 31 29 29 3b 0a 20 20 20 20 62  ull, -1));.    b
13530 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
13540 20 20 2a 2a 20 20 20 20 20 24 64 62 20 6c 61 73    **     $db las
13550 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 20 0a  t_insert_rowid .
13560 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e    **.  ** Return
13570 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63   an integer whic
13580 68 20 69 73 20 74 68 65 20 52 4f 57 49 44 20 66  h is the ROWID f
13590 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  or the most rece
135a0 6e 74 20 69 6e 73 65 72 74 2e 0a 20 20 2a 2f 0a  nt insert..  */.
135b0 20 20 63 61 73 65 20 44 42 5f 4c 41 53 54 5f 49    case DB_LAST_I
135c0 4e 53 45 52 54 5f 52 4f 57 49 44 3a 20 7b 0a 20  NSERT_ROWID: {. 
135d0 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73     Tcl_Obj *pRes
135e0 75 6c 74 3b 0a 20 20 20 20 54 63 6c 5f 57 69 64  ult;.    Tcl_Wid
135f0 65 49 6e 74 20 72 6f 77 69 64 3b 0a 20 20 20 20  eInt rowid;.    
13600 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
13610 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
13620 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
13630 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20   objv, "");.    
13640 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
13650 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 6f  OR;.    }.    ro
13660 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 6c 61  wid = sqlite3_la
13670 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28  st_insert_rowid(
13680 70 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20 70 52  pDb->db);.    pR
13690 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f  esult = Tcl_GetO
136a0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  bjResult(interp)
136b0 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 57 69 64  ;.    Tcl_SetWid
136c0 65 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c  eIntObj(pResult,
136d0 20 72 6f 77 69 64 29 3b 0a 20 20 20 20 62 72 65   rowid);.    bre
136e0 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
136f0 2a 2a 20 54 68 65 20 44 42 5f 4f 4e 45 43 4f 4c  ** The DB_ONECOL
13700 55 4d 4e 20 6d 65 74 68 6f 64 20 69 73 20 69 6d  UMN method is im
13710 70 6c 65 6d 65 6e 74 65 64 20 74 6f 67 65 74 68  plemented togeth
13720 65 72 20 77 69 74 68 20 44 42 5f 45 58 49 53 54  er with DB_EXIST
13730 53 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 20 20  S..  */..  /*   
13740 20 24 64 62 20 70 72 6f 67 72 65 73 73 20 3f 4e   $db progress ?N
13750 20 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 20   CALLBACK?.  ** 
13760 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  .  ** Invoke the
13770 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20   given callback 
13780 65 76 65 72 79 20 4e 20 76 69 72 74 75 61 6c 20  every N virtual 
13790 6d 61 63 68 69 6e 65 20 6f 70 63 6f 64 65 73 20  machine opcodes 
137a0 77 68 69 6c 65 20 65 78 65 63 75 74 69 6e 67 0a  while executing.
137b0 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20    ** queries..  
137c0 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 50 52 4f  */.  case DB_PRO
137d0 47 52 45 53 53 3a 20 7b 0a 20 20 20 20 69 66 28  GRESS: {.    if(
137e0 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20   objc==2 ){.    
137f0 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67    if( pDb->zProg
13800 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ress ){.        
13810 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
13820 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 50  (interp, pDb->zP
13830 72 6f 67 72 65 73 73 2c 20 30 29 3b 0a 20 20 20  rogress, 0);.   
13840 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
13850 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20  f( objc==4 ){.  
13860 20 20 20 20 63 68 61 72 20 2a 7a 50 72 6f 67 72      char *zProgr
13870 65 73 73 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c  ess;.      int l
13880 65 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 4e 3b  en;.      int N;
13890 0a 20 20 20 20 20 20 69 66 28 20 54 43 4c 5f 4f  .      if( TCL_O
138a0 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  K!=Tcl_GetIntFro
138b0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
138c0 76 5b 32 5d 2c 20 26 4e 29 20 29 7b 0a 20 20 20  v[2], &N) ){.   
138d0 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
138e0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 3b 0a  ERROR;.      };.
138f0 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
13900 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20  Progress ){.    
13910 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
13920 2d 3e 7a 50 72 6f 67 72 65 73 73 29 3b 0a 20 20  ->zProgress);.  
13930 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 50 72 6f      }.      zPro
13940 67 72 65 73 73 20 3d 20 54 63 6c 5f 47 65 74 53  gress = Tcl_GetS
13950 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
13960 76 5b 33 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20  v[3], &len);.   
13970 20 20 20 69 66 28 20 7a 50 72 6f 67 72 65 73 73     if( zProgress
13980 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20   && len>0 ){.   
13990 20 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f 67 72       pDb->zProgr
139a0 65 73 73 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28  ess = Tcl_Alloc(
139b0 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20   len + 1 );.    
139c0 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e      memcpy(pDb->
139d0 7a 50 72 6f 67 72 65 73 73 2c 20 7a 50 72 6f 67  zProgress, zProg
139e0 72 65 73 73 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20  ress, len+1);.  
139f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13a00 20 20 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73     pDb->zProgres
13a10 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23  s = 0;.      }.#
13a20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13a30 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c  IT_PROGRESS_CALL
13a40 42 41 43 4b 0a 20 20 20 20 20 20 69 66 28 20 70  BACK.      if( p
13a50 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29 7b  Db->zProgress ){
13a60 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e  .        pDb->in
13a70 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20  terp = interp;. 
13a80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70         sqlite3_p
13a90 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28  rogress_handler(
13aa0 70 44 62 2d 3e 64 62 2c 20 4e 2c 20 44 62 50 72  pDb->db, N, DbPr
13ab0 6f 67 72 65 73 73 48 61 6e 64 6c 65 72 2c 20 70  ogressHandler, p
13ac0 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Db);.      }else
13ad0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
13ae0 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c  3_progress_handl
13af0 65 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30  er(pDb->db, 0, 0
13b00 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  , 0);.      }.#e
13b10 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ndif.    }else{.
13b20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
13b30 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
13b40 2c 20 6f 62 6a 76 2c 20 22 4e 20 43 41 4c 4c 42  , objv, "N CALLB
13b50 41 43 4b 22 29 3b 0a 20 20 20 20 20 20 72 65 74  ACK");.      ret
13b60 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
13b70 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
13b80 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62    }..  /*    $db
13b90 20 70 72 6f 66 69 6c 65 20 3f 43 41 4c 4c 42 41   profile ?CALLBA
13ba0 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61  CK?.  **.  ** Ma
13bb0 6b 65 20 61 72 72 61 6e 67 65 6d 65 6e 74 73 20  ke arrangements 
13bc0 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 43 41  to invoke the CA
13bd0 4c 4c 42 41 43 4b 20 72 6f 75 74 69 6e 65 20 61  LLBACK routine a
13be0 66 74 65 72 20 65 61 63 68 20 53 51 4c 20 73 74  fter each SQL st
13bf0 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 61  atement.  ** tha
13c00 74 20 68 61 73 20 72 75 6e 2e 20 20 54 68 65 20  t has run.  The 
13c10 74 65 78 74 20 6f 66 20 74 68 65 20 53 51 4c 20  text of the SQL 
13c20 61 6e 64 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  and the amount o
13c30 66 20 65 6c 61 70 73 65 20 74 69 6d 65 20 61 72  f elapse time ar
13c40 65 0a 20 20 2a 2a 20 61 70 70 65 6e 64 65 64 20  e.  ** appended 
13c50 74 6f 20 43 41 4c 4c 42 41 43 4b 20 62 65 66 6f  to CALLBACK befo
13c60 72 65 20 74 68 65 20 73 63 72 69 70 74 20 69 73  re the script is
13c70 20 72 75 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73   run..  */.  cas
13c80 65 20 44 42 5f 50 52 4f 46 49 4c 45 3a 20 7b 0a  e DB_PROFILE: {.
13c90 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29      if( objc>3 )
13ca0 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
13cb0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
13cc0 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c   2, objv, "?CALL
13cd0 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72  BACK?");.      r
13ce0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13cf0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
13d00 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  bjc==2 ){.      
13d10 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c  if( pDb->zProfil
13d20 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  e ){.        Tcl
13d30 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
13d40 74 65 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f 66  terp, pDb->zProf
13d50 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ile, 0);.      }
13d60 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
13d70 20 20 63 68 61 72 20 2a 7a 50 72 6f 66 69 6c 65    char *zProfile
13d80 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b  ;.      int len;
13d90 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
13da0 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20  zProfile ){.    
13db0 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
13dc0 2d 3e 7a 50 72 6f 66 69 6c 65 29 3b 0a 20 20 20  ->zProfile);.   
13dd0 20 20 20 7d 0a 20 20 20 20 20 20 7a 50 72 6f 66     }.      zProf
13de0 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ile = Tcl_GetStr
13df0 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
13e00 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20  2], &len);.     
13e10 20 69 66 28 20 7a 50 72 6f 66 69 6c 65 20 26 26   if( zProfile &&
13e20 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20   len>0 ){.      
13e30 20 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20    pDb->zProfile 
13e40 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e  = Tcl_Alloc( len
13e50 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20   + 1 );.        
13e60 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 50 72 6f  memcpy(pDb->zPro
13e70 66 69 6c 65 2c 20 7a 50 72 6f 66 69 6c 65 2c 20  file, zProfile, 
13e80 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65  len+1);.      }e
13e90 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62  lse{.        pDb
13ea0 2d 3e 7a 50 72 6f 66 69 6c 65 20 3d 20 30 3b 0a  ->zProfile = 0;.
13eb0 20 20 20 20 20 20 7d 0a 23 69 66 20 21 64 65 66        }.#if !def
13ec0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
13ed0 5f 54 52 41 43 45 29 20 26 26 20 21 64 65 66 69  _TRACE) && !defi
13ee0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
13ef0 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a  FLOATING_POINT).
13f00 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
13f10 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 20  Profile ){.     
13f20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d     pDb->interp =
13f30 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20   interp;.       
13f40 20 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65   sqlite3_profile
13f50 28 70 44 62 2d 3e 64 62 2c 20 44 62 50 72 6f 66  (pDb->db, DbProf
13f60 69 6c 65 48 61 6e 64 6c 65 72 2c 20 70 44 62 29  ileHandler, pDb)
13f70 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
13f80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70         sqlite3_p
13f90 72 6f 66 69 6c 65 28 70 44 62 2d 3e 64 62 2c 20  rofile(pDb->db, 
13fa0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23  0, 0);.      }.#
13fb0 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
13fc0 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
13fd0 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 72 65  .  **     $db re
13fe0 6b 65 79 20 4b 45 59 0a 20 20 2a 2a 0a 20 20 2a  key KEY.  **.  *
13ff0 2a 20 43 68 61 6e 67 65 20 74 68 65 20 65 6e 63  * Change the enc
14000 72 79 70 74 69 6f 6e 20 6b 65 79 20 6f 6e 20 74  ryption key on t
14010 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65  he currently ope
14020 6e 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  n database..  */
14030 0a 20 20 63 61 73 65 20 44 42 5f 52 45 4b 45 59  .  case DB_REKEY
14040 3a 20 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  : {.#ifdef SQLIT
14050 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20  E_HAS_CODEC.    
14060 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 76 6f  int nKey;.    vo
14070 69 64 20 2a 70 4b 65 79 3b 0a 23 65 6e 64 69 66  id *pKey;.#endif
14080 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  .    if( objc!=3
14090 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
140a0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
140b0 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4b 45 59  p, 2, objv, "KEY
140c0 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
140d0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
140e0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
140f0 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 70 4b  HAS_CODEC.    pK
14100 65 79 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65  ey = Tcl_GetByte
14110 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a  ArrayFromObj(obj
14120 76 5b 32 5d 2c 20 26 6e 4b 65 79 29 3b 0a 20 20  v[2], &nKey);.  
14130 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
14140 65 6b 65 79 28 70 44 62 2d 3e 64 62 2c 20 70 4b  ekey(pDb->db, pK
14150 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20 69  ey, nKey);.    i
14160 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54  f( rc ){.      T
14170 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
14180 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 5f  interp, sqlite3_
14190 65 72 72 73 74 72 28 72 63 29 2c 20 30 29 3b 0a  errstr(rc), 0);.
141a0 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45        rc = TCL_E
141b0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  RROR;.    }.#end
141c0 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  if.    break;.  
141d0 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 72  }..  /*    $db r
141e0 65 73 74 6f 72 65 20 3f 44 41 54 41 42 41 53 45  estore ?DATABASE
141f0 3f 20 46 49 4c 45 4e 41 4d 45 0a 20 20 2a 2a 0a  ? FILENAME.  **.
14200 20 20 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61    ** Open a data
14210 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 64 20  base file named 
14220 46 49 4c 45 4e 41 4d 45 2e 20 20 54 72 61 6e 73  FILENAME.  Trans
14230 66 65 72 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  fer the content 
14240 0a 20 20 2a 2a 20 6f 66 20 46 49 4c 45 4e 41 4d  .  ** of FILENAM
14250 45 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c  E into the local
14260 20 64 61 74 61 62 61 73 65 20 44 41 54 41 42 41   database DATABA
14270 53 45 20 28 64 65 66 61 75 6c 74 3a 20 22 6d 61  SE (default: "ma
14280 69 6e 22 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  in")..  */.  cas
14290 65 20 44 42 5f 52 45 53 54 4f 52 45 3a 20 7b 0a  e DB_RESTORE: {.
142a0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
142b0 7a 53 72 63 46 69 6c 65 3b 0a 20 20 20 20 63 6f  zSrcFile;.    co
142c0 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 73 74 44  nst char *zDestD
142d0 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  b;.    sqlite3 *
142e0 70 53 72 63 3b 0a 20 20 20 20 73 71 6c 69 74 65  pSrc;.    sqlite
142f0 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75  3_backup *pBacku
14300 70 3b 0a 20 20 20 20 69 6e 74 20 6e 54 69 6d 65  p;.    int nTime
14310 6f 75 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  out = 0;..    if
14320 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20  ( objc==3 ){.   
14330 20 20 20 7a 44 65 73 74 44 62 20 3d 20 22 6d 61     zDestDb = "ma
14340 69 6e 22 3b 0a 20 20 20 20 20 20 7a 53 72 63 46  in";.      zSrcF
14350 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ile = Tcl_GetStr
14360 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
14370 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63    }else if( objc
14380 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 7a 44 65  ==4 ){.      zDe
14390 73 74 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74  stDb = Tcl_GetSt
143a0 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
143b0 20 20 20 20 20 7a 53 72 63 46 69 6c 65 20 3d 20       zSrcFile = 
143c0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
143d0 6a 76 5b 33 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  jv[3]);.    }els
143e0 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  e{.      Tcl_Wro
143f0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
14400 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 44 41 54  , 2, objv, "?DAT
14410 41 42 41 53 45 3f 20 46 49 4c 45 4e 41 4d 45 22  ABASE? FILENAME"
14420 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
14430 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
14440 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
14450 33 5f 6f 70 65 6e 5f 76 32 28 7a 53 72 63 46 69  3_open_v2(zSrcFi
14460 6c 65 2c 20 26 70 53 72 63 2c 20 53 51 4c 49 54  le, &pSrc, SQLIT
14470 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c  E_OPEN_READONLY,
14480 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
14490 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
144a0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
144b0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 61  sult(interp, "ca
144c0 6e 6e 6f 74 20 6f 70 65 6e 20 73 6f 75 72 63 65  nnot open source
144d0 20 64 61 74 61 62 61 73 65 3a 20 22 2c 0a 20 20   database: ",.  
144e0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
144f0 5f 65 72 72 6d 73 67 28 70 53 72 63 29 2c 20 28  _errmsg(pSrc), (
14500 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
14510 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 53  sqlite3_close(pS
14520 72 63 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  rc);.      retur
14530 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
14540 20 7d 0a 20 20 20 20 70 42 61 63 6b 75 70 20 3d   }.    pBackup =
14550 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f   sqlite3_backup_
14560 69 6e 69 74 28 70 44 62 2d 3e 64 62 2c 20 7a 44  init(pDb->db, zD
14570 65 73 74 44 62 2c 20 70 53 72 63 2c 20 22 6d 61  estDb, pSrc, "ma
14580 69 6e 22 29 3b 0a 20 20 20 20 69 66 28 20 70 42  in");.    if( pB
14590 61 63 6b 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20  ackup==0 ){.    
145a0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
145b0 6c 74 28 69 6e 74 65 72 70 2c 20 22 72 65 73 74  lt(interp, "rest
145c0 6f 72 65 20 66 61 69 6c 65 64 3a 20 22 2c 0a 20  ore failed: ",. 
145d0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
145e0 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
145f0 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ), (char*)0);.  
14600 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
14610 65 28 70 53 72 63 29 3b 0a 20 20 20 20 20 20 72  e(pSrc);.      r
14620 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
14630 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65  .    }.    while
14640 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  ( (rc = sqlite3_
14650 62 61 63 6b 75 70 5f 73 74 65 70 28 70 42 61 63  backup_step(pBac
14660 6b 75 70 2c 31 30 30 29 29 3d 3d 53 51 4c 49 54  kup,100))==SQLIT
14670 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 20  E_OK.           
14680 20 20 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45     || rc==SQLITE
14690 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 69  _BUSY ){.      i
146a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
146b0 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  SY ){.        if
146c0 28 20 6e 54 69 6d 65 6f 75 74 2b 2b 20 3e 3d 20  ( nTimeout++ >= 
146d0 33 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  3 ) break;.     
146e0 20 20 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70     sqlite3_sleep
146f0 28 31 30 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (100);.      }. 
14700 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
14710 5f 62 61 63 6b 75 70 5f 66 69 6e 69 73 68 28 70  _backup_finish(p
14720 42 61 63 6b 75 70 29 3b 0a 20 20 20 20 69 66 28  Backup);.    if(
14730 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
14740 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 54   ){.      rc = T
14750 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  CL_OK;.    }else
14760 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
14770 42 55 53 59 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  BUSY || rc==SQLI
14780 54 45 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20  TE_LOCKED ){.   
14790 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
147a0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 72 65 73  ult(interp, "res
147b0 74 6f 72 65 20 66 61 69 6c 65 64 3a 20 73 6f 75  tore failed: sou
147c0 72 63 65 20 64 61 74 61 62 61 73 65 20 62 75 73  rce database bus
147d0 79 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  y",.            
147e0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
147f0 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  *)0);.      rc =
14800 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
14810 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c  }else{.      Tcl
14820 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
14830 74 65 72 70 2c 20 22 72 65 73 74 6f 72 65 20 66  terp, "restore f
14840 61 69 6c 65 64 3a 20 22 2c 0a 20 20 20 20 20 20  ailed: ",.      
14850 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72       sqlite3_err
14860 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 28 63  msg(pDb->db), (c
14870 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72  har*)0);.      r
14880 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  c = TCL_ERROR;. 
14890 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
148a0 5f 63 6c 6f 73 65 28 70 53 72 63 29 3b 0a 20 20  _close(pSrc);.  
148b0 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
148c0 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20  /*.  **     $db 
148d0 73 74 61 74 75 73 20 28 73 74 65 70 7c 73 6f 72  status (step|sor
148e0 74 7c 61 75 74 6f 69 6e 64 65 78 29 0a 20 20 2a  t|autoindex).  *
148f0 2a 0a 20 20 2a 2a 20 44 69 73 70 6c 61 79 20 53  *.  ** Display S
14900 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
14910 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 20 6f  _FULLSCAN_STEP o
14920 72 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 53  r .  ** SQLITE_S
14930 54 4d 54 53 54 41 54 55 53 5f 53 4f 52 54 20 66  TMTSTATUS_SORT f
14940 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  or the most rece
14950 6e 74 20 65 76 61 6c 2e 0a 20 20 2a 2f 0a 20 20  nt eval..  */.  
14960 63 61 73 65 20 44 42 5f 53 54 41 54 55 53 3a 20  case DB_STATUS: 
14970 7b 0a 20 20 20 20 69 6e 74 20 76 3b 0a 20 20 20  {.    int v;.   
14980 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70   const char *zOp
14990 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
149a0 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
149b0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
149c0 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 28 73  rp, 2, objv, "(s
149d0 74 65 70 7c 73 6f 72 74 7c 61 75 74 6f 69 6e 64  tep|sort|autoind
149e0 65 78 29 22 29 3b 0a 20 20 20 20 20 20 72 65 74  ex)");.      ret
149f0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
14a00 20 20 20 7d 0a 20 20 20 20 7a 4f 70 20 3d 20 54     }.    zOp = T
14a10 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
14a20 76 5b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 73  v[2]);.    if( s
14a30 74 72 63 6d 70 28 7a 4f 70 2c 20 22 73 74 65 70  trcmp(zOp, "step
14a40 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 76  ")==0 ){.      v
14a50 20 3d 20 70 44 62 2d 3e 6e 53 74 65 70 3b 0a 20   = pDb->nStep;. 
14a60 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
14a70 63 6d 70 28 7a 4f 70 2c 20 22 73 6f 72 74 22 29  cmp(zOp, "sort")
14a80 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 76 20 3d  ==0 ){.      v =
14a90 20 70 44 62 2d 3e 6e 53 6f 72 74 3b 0a 20 20 20   pDb->nSort;.   
14aa0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
14ab0 70 28 7a 4f 70 2c 20 22 61 75 74 6f 69 6e 64 65  p(zOp, "autoinde
14ac0 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  x")==0 ){.      
14ad0 76 20 3d 20 70 44 62 2d 3e 6e 49 6e 64 65 78 3b  v = pDb->nIndex;
14ae0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14af0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
14b00 6c 74 28 69 6e 74 65 72 70 2c 20 0a 20 20 20 20  lt(interp, .    
14b10 20 20 20 20 20 20 20 20 22 62 61 64 20 61 72 67          "bad arg
14b20 75 6d 65 6e 74 3a 20 73 68 6f 75 6c 64 20 62 65  ument: should be
14b30 20 61 75 74 6f 69 6e 64 65 78 2c 20 73 74 65 70   autoindex, step
14b40 2c 20 6f 72 20 73 6f 72 74 22 2c 20 0a 20 20 20  , or sort", .   
14b50 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
14b60 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
14b70 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
14b80 7d 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  }.    Tcl_SetObj
14b90 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
14ba0 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 76 29 29  cl_NewIntObj(v))
14bb0 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
14bc0 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20  .  .  /*.  **   
14bd0 20 20 24 64 62 20 74 69 6d 65 6f 75 74 20 4d 49    $db timeout MI
14be0 4c 4c 45 53 45 43 4f 4e 44 53 0a 20 20 2a 2a 0a  LLESECONDS.  **.
14bf0 20 20 2a 2a 20 44 65 6c 61 79 20 66 6f 72 20 74    ** Delay for t
14c00 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c  he number of mil
14c10 6c 69 73 65 63 6f 6e 64 73 20 73 70 65 63 69 66  liseconds specif
14c20 69 65 64 20 77 68 65 6e 20 61 20 66 69 6c 65 20  ied when a file 
14c30 69 73 20 6c 6f 63 6b 65 64 2e 0a 20 20 2a 2f 0a  is locked..  */.
14c40 20 20 63 61 73 65 20 44 42 5f 54 49 4d 45 4f 55    case DB_TIMEOU
14c50 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20 6d 73 3b  T: {.    int ms;
14c60 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  .    if( objc!=3
14c70 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
14c80 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
14c90 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4d 49 4c  p, 2, objv, "MIL
14ca0 4c 49 53 45 43 4f 4e 44 53 22 29 3b 0a 20 20 20  LISECONDS");.   
14cb0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
14cc0 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
14cd0 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
14ce0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
14cf0 76 5b 32 5d 2c 20 26 6d 73 29 20 29 20 72 65 74  v[2], &ms) ) ret
14d00 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
14d10 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f     sqlite3_busy_
14d20 74 69 6d 65 6f 75 74 28 70 44 62 2d 3e 64 62 2c  timeout(pDb->db,
14d30 20 6d 73 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b   ms);.    break;
14d40 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a  .  }.  .  /*.  *
14d50 2a 20 20 20 20 20 24 64 62 20 74 6f 74 61 6c 5f  *     $db total_
14d60 63 68 61 6e 67 65 73 0a 20 20 2a 2a 0a 20 20 2a  changes.  **.  *
14d70 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
14d80 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
14d90 20 77 65 72 65 20 6d 6f 64 69 66 69 65 64 2c 20   were modified, 
14da0 69 6e 73 65 72 74 65 64 2c 20 6f 72 20 64 65 6c  inserted, or del
14db0 65 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65  eted .  ** since
14dc0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
14dd0 6e 64 6c 65 20 77 61 73 20 63 72 65 61 74 65 64  ndle was created
14de0 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
14df0 5f 54 4f 54 41 4c 5f 43 48 41 4e 47 45 53 3a 20  _TOTAL_CHANGES: 
14e00 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  {.    Tcl_Obj *p
14e10 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 66 28 20  Result;.    if( 
14e20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 20  objc!=2 ){.     
14e30 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
14e40 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
14e50 76 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 72 65  v, "");.      re
14e60 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
14e70 20 20 20 20 7d 0a 20 20 20 20 70 52 65 73 75 6c      }.    pResul
14e80 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65  t = Tcl_GetObjRe
14e90 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
14ea0 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28    Tcl_SetIntObj(
14eb0 70 52 65 73 75 6c 74 2c 20 73 71 6c 69 74 65 33  pResult, sqlite3
14ec0 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 70  _total_changes(p
14ed0 44 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20 62 72  Db->db));.    br
14ee0 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
14ef0 20 20 24 64 62 20 74 72 61 63 65 20 3f 43 41 4c    $db trace ?CAL
14f00 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a  LBACK?.  **.  **
14f10 20 4d 61 6b 65 20 61 72 72 61 6e 67 65 6d 65 6e   Make arrangemen
14f20 74 73 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65  ts to invoke the
14f30 20 43 41 4c 4c 42 41 43 4b 20 72 6f 75 74 69 6e   CALLBACK routin
14f40 65 20 66 6f 72 20 65 61 63 68 20 53 51 4c 20 73  e for each SQL s
14f50 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68  tatement.  ** th
14f60 61 74 20 69 73 20 65 78 65 63 75 74 65 64 2e 20  at is executed. 
14f70 20 54 68 65 20 74 65 78 74 20 6f 66 20 74 68 65   The text of the
14f80 20 53 51 4c 20 69 73 20 61 70 70 65 6e 64 65 64   SQL is appended
14f90 20 74 6f 20 43 41 4c 4c 42 41 43 4b 20 62 65 66   to CALLBACK bef
14fa0 6f 72 65 0a 20 20 2a 2a 20 69 74 20 69 73 20 65  ore.  ** it is e
14fb0 78 65 63 75 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  xecuted..  */.  
14fc0 63 61 73 65 20 44 42 5f 54 52 41 43 45 3a 20 7b  case DB_TRACE: {
14fd0 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20  .    if( objc>3 
14fe0 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
14ff0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
15000 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c  , 2, objv, "?CAL
15010 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20  LBACK?");.      
15020 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
15030 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
15040 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20  objc==2 ){.     
15050 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65   if( pDb->zTrace
15060 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
15070 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
15080 65 72 70 2c 20 70 44 62 2d 3e 7a 54 72 61 63 65  erp, pDb->zTrace
15090 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
150a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
150b0 68 61 72 20 2a 7a 54 72 61 63 65 3b 0a 20 20 20  har *zTrace;.   
150c0 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
150d0 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63    if( pDb->zTrac
150e0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  e ){.        Tcl
150f0 5f 46 72 65 65 28 70 44 62 2d 3e 7a 54 72 61 63  _Free(pDb->zTrac
15100 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
15110 20 20 7a 54 72 61 63 65 20 3d 20 54 63 6c 5f 47    zTrace = Tcl_G
15120 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
15130 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a  objv[2], &len);.
15140 20 20 20 20 20 20 69 66 28 20 7a 54 72 61 63 65        if( zTrace
15150 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20   && len>0 ){.   
15160 20 20 20 20 20 70 44 62 2d 3e 7a 54 72 61 63 65       pDb->zTrace
15170 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65   = Tcl_Alloc( le
15180 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20  n + 1 );.       
15190 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 54 72   memcpy(pDb->zTr
151a0 61 63 65 2c 20 7a 54 72 61 63 65 2c 20 6c 65 6e  ace, zTrace, len
151b0 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  +1);.      }else
151c0 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
151d0 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 20  Trace = 0;.     
151e0 20 7d 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28   }.#if !defined(
151f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
15200 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
15210 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
15220 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20 20  ING_POINT).     
15230 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65   if( pDb->zTrace
15240 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
15250 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
15260 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
15270 33 5f 74 72 61 63 65 28 70 44 62 2d 3e 64 62 2c  3_trace(pDb->db,
15280 20 44 62 54 72 61 63 65 48 61 6e 64 6c 65 72 2c   DbTraceHandler,
15290 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c   pDb);.      }el
152a0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
152b0 74 65 33 5f 74 72 61 63 65 28 70 44 62 2d 3e 64  te3_trace(pDb->d
152c0 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  b, 0, 0);.      
152d0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
152e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
152f0 20 2f 2a 20 20 20 20 24 64 62 20 74 72 61 6e 73   /*    $db trans
15300 61 63 74 69 6f 6e 20 5b 2d 64 65 66 65 72 72 65  action [-deferre
15310 64 7c 2d 69 6d 6d 65 64 69 61 74 65 7c 2d 65 78  d|-immediate|-ex
15320 63 6c 75 73 69 76 65 5d 20 53 43 52 49 50 54 0a  clusive] SCRIPT.
15330 20 20 2a 2a 0a 20 20 2a 2a 20 53 74 61 72 74 20    **.  ** Start 
15340 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  a new transactio
15350 6e 20 28 69 66 20 77 65 20 61 72 65 20 6e 6f 74  n (if we are not
15360 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
15370 6d 69 64 73 74 20 6f 66 20 61 0a 20 20 2a 2a 20  midst of a.  ** 
15380 74 72 61 6e 73 61 63 74 69 6f 6e 29 20 61 6e 64  transaction) and
15390 20 65 78 65 63 75 74 65 20 74 68 65 20 54 43 4c   execute the TCL
153a0 20 73 63 72 69 70 74 20 53 43 52 49 50 54 2e 20   script SCRIPT. 
153b0 20 41 66 74 65 72 20 53 43 52 49 50 54 0a 20 20   After SCRIPT.  
153c0 2a 2a 20 63 6f 6d 70 6c 65 74 65 73 2c 20 65 69  ** completes, ei
153d0 74 68 65 72 20 63 6f 6d 6d 69 74 20 74 68 65 20  ther commit the 
153e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 72  transaction or r
153f0 6f 6c 6c 20 69 74 20 62 61 63 6b 20 69 66 20 53  oll it back if S
15400 43 52 49 50 54 0a 20 20 2a 2a 20 74 68 72 6f 77  CRIPT.  ** throw
15410 73 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 2e 20  s an exception. 
15420 20 4f 72 20 69 66 20 6e 6f 20 6e 65 77 20 74 72   Or if no new tr
15430 61 6e 73 61 74 69 6f 6e 20 77 61 73 20 73 74 61  ansation was sta
15440 72 74 65 64 2c 20 64 6f 20 6e 6f 74 68 69 6e 67  rted, do nothing
15450 2e 0a 20 20 2a 2a 20 70 61 73 73 20 74 68 65 20  ..  ** pass the 
15460 65 78 63 65 70 74 69 6f 6e 20 6f 6e 20 75 70 20  exception on up 
15470 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a  the stack..  **.
15480 20 20 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e    ** This comman
15490 64 20 77 61 73 20 69 6e 73 70 69 72 65 64 20 62  d was inspired b
154a0 79 20 44 61 76 65 20 54 68 6f 6d 61 73 27 73 20  y Dave Thomas's 
154b0 74 61 6c 6b 20 6f 6e 20 52 75 62 79 20 61 74 20  talk on Ruby at 
154c0 74 68 65 0a 20 20 2a 2a 20 32 30 30 35 20 4f 27  the.  ** 2005 O'
154d0 52 65 69 6c 6c 79 20 4f 70 65 6e 20 53 6f 75 72  Reilly Open Sour
154e0 63 65 20 43 6f 6e 76 65 6e 74 69 6f 6e 20 28 4f  ce Convention (O
154f0 53 43 4f 4e 29 2e 0a 20 20 2a 2f 0a 20 20 63 61  SCON)..  */.  ca
15500 73 65 20 44 42 5f 54 52 41 4e 53 41 43 54 49 4f  se DB_TRANSACTIO
15510 4e 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  N: {.    Tcl_Obj
15520 20 2a 70 53 63 72 69 70 74 3b 0a 20 20 20 20 63   *pScript;.    c
15530 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 65 67 69  onst char *zBegi
15540 6e 20 3d 20 22 53 41 56 45 50 4f 49 4e 54 20 5f  n = "SAVEPOINT _
15550 74 63 6c 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22  tcl_transaction"
15560 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
15570 33 20 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a  3 && objc!=4 ){.
15580 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
15590 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
155a0 2c 20 6f 62 6a 76 2c 20 22 5b 54 59 50 45 5d 20  , objv, "[TYPE] 
155b0 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20  SCRIPT");.      
155c0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
155d0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
155e0 20 70 44 62 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pDb->nTransacti
155f0 6f 6e 3d 3d 30 20 26 26 20 6f 62 6a 63 3d 3d 34  on==0 && objc==4
15600 20 29 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63   ){.      static
15610 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 54 54 59   const char *TTY
15620 50 45 5f 73 74 72 73 5b 5d 20 3d 20 7b 0a 20 20  PE_strs[] = {.  
15630 20 20 20 20 20 20 22 64 65 66 65 72 72 65 64 22        "deferred"
15640 2c 20 20 20 22 65 78 63 6c 75 73 69 76 65 22 2c  ,   "exclusive",
15650 20 20 22 69 6d 6d 65 64 69 61 74 65 22 2c 20 30    "immediate", 0
15660 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  .      };.      
15670 65 6e 75 6d 20 54 54 59 50 45 5f 65 6e 75 6d 20  enum TTYPE_enum 
15680 7b 0a 20 20 20 20 20 20 20 20 54 54 59 50 45 5f  {.        TTYPE_
15690 44 45 46 45 52 52 45 44 2c 20 54 54 59 50 45 5f  DEFERRED, TTYPE_
156a0 45 58 43 4c 55 53 49 56 45 2c 20 54 54 59 50 45  EXCLUSIVE, TTYPE
156b0 5f 49 4d 4d 45 44 49 41 54 45 0a 20 20 20 20 20  _IMMEDIATE.     
156c0 20 7d 3b 0a 20 20 20 20 20 20 69 6e 74 20 74 74   };.      int tt
156d0 79 70 65 3b 0a 20 20 20 20 20 20 69 66 28 20 54  ype;.      if( T
156e0 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f  cl_GetIndexFromO
156f0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
15700 32 5d 2c 20 54 54 59 50 45 5f 73 74 72 73 2c 20  2], TTYPE_strs, 
15710 22 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 79 70  "transaction typ
15720 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e",.            
15730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15740 20 20 30 2c 20 26 74 74 79 70 65 29 20 29 7b 0a    0, &ttype) ){.
15750 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
15760 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
15770 7d 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20  }.      switch( 
15780 28 65 6e 75 6d 20 54 54 59 50 45 5f 65 6e 75 6d  (enum TTYPE_enum
15790 29 74 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20  )ttype ){.      
157a0 20 20 63 61 73 65 20 54 54 59 50 45 5f 44 45 46    case TTYPE_DEF
157b0 45 52 52 45 44 3a 20 20 20 20 2f 2a 20 6e 6f 2d  ERRED:    /* no-
157c0 6f 70 20 2a 2f 3b 20 20 20 20 20 20 20 20 20 20  op */;          
157d0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
157e0 20 20 20 20 20 20 63 61 73 65 20 54 54 59 50 45        case TTYPE
157f0 5f 45 58 43 4c 55 53 49 56 45 3a 20 20 20 7a 42  _EXCLUSIVE:   zB
15800 65 67 69 6e 20 3d 20 22 42 45 47 49 4e 20 45 58  egin = "BEGIN EX
15810 43 4c 55 53 49 56 45 22 3b 20 20 62 72 65 61 6b  CLUSIVE";  break
15820 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 54  ;.        case T
15830 54 59 50 45 5f 49 4d 4d 45 44 49 41 54 45 3a 20  TYPE_IMMEDIATE: 
15840 20 20 7a 42 65 67 69 6e 20 3d 20 22 42 45 47 49    zBegin = "BEGI
15850 4e 20 49 4d 4d 45 44 49 41 54 45 22 3b 20 20 62  N IMMEDIATE";  b
15860 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
15870 20 20 7d 0a 20 20 20 20 70 53 63 72 69 70 74 20    }.    pScript 
15880 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 3b 0a  = objv[objc-1];.
15890 0a 20 20 20 20 2f 2a 20 52 75 6e 20 74 68 65 20  .    /* Run the 
158a0 53 51 4c 69 74 65 20 42 45 47 49 4e 20 63 6f 6d  SQLite BEGIN com
158b0 6d 61 6e 64 20 74 6f 20 6f 70 65 6e 20 61 20 74  mand to open a t
158c0 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 73 61  ransaction or sa
158d0 76 65 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20 20 20  vepoint. */.    
158e0 70 44 62 2d 3e 64 69 73 61 62 6c 65 41 75 74 68  pDb->disableAuth
158f0 2b 2b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ++;.    rc = sql
15900 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64  ite3_exec(pDb->d
15910 62 2c 20 7a 42 65 67 69 6e 2c 20 30 2c 20 30 2c  b, zBegin, 0, 0,
15920 20 30 29 3b 0a 20 20 20 20 70 44 62 2d 3e 64 69   0);.    pDb->di
15930 73 61 62 6c 65 41 75 74 68 2d 2d 3b 0a 20 20 20  sableAuth--;.   
15940 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15950 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  OK ){.      Tcl_
15960 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
15970 65 72 70 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  erp, sqlite3_err
15980 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30 29  msg(pDb->db), 0)
15990 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
159a0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
159b0 20 20 20 20 70 44 62 2d 3e 6e 54 72 61 6e 73 61      pDb->nTransa
159c0 63 74 69 6f 6e 2b 2b 3b 0a 0a 20 20 20 20 2f 2a  ction++;..    /*
159d0 20 49 66 20 75 73 69 6e 67 20 4e 52 45 2c 20 73   If using NRE, s
159e0 63 68 65 64 75 6c 65 20 61 20 63 61 6c 6c 62 61  chedule a callba
159f0 63 6b 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65  ck to invoke the
15a00 20 73 63 72 69 70 74 20 70 53 63 72 69 70 74 2c   script pScript,
15a10 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61 20 73   then.    ** a s
15a20 65 63 6f 6e 64 20 63 61 6c 6c 62 61 63 6b 20 74  econd callback t
15a30 6f 20 63 6f 6d 6d 69 74 20 28 6f 72 20 72 6f 6c  o commit (or rol
15a40 6c 62 61 63 6b 29 20 74 68 65 20 74 72 61 6e 73  lback) the trans
15a50 61 63 74 69 6f 6e 20 6f 72 20 73 61 76 65 70 6f  action or savepo
15a60 69 6e 74 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 65  int.    ** opene
15a70 64 20 61 62 6f 76 65 2e 20 49 66 20 6e 6f 74 20  d above. If not 
15a80 75 73 69 6e 67 20 4e 52 45 2c 20 65 76 61 6c 75  using NRE, evalu
15a90 61 74 65 20 74 68 65 20 73 63 72 69 70 74 20 64  ate the script d
15aa0 69 72 65 63 74 6c 79 2c 20 74 68 65 6e 0a 20 20  irectly, then.  
15ab0 20 20 2a 2a 20 63 61 6c 6c 20 66 75 6e 63 74 69    ** call functi
15ac0 6f 6e 20 44 62 54 72 61 6e 73 50 6f 73 74 43 6d  on DbTransPostCm
15ad0 64 28 29 20 74 6f 20 63 6f 6d 6d 69 74 20 28 6f  d() to commit (o
15ae0 72 20 72 6f 6c 6c 62 61 63 6b 29 20 74 68 65 20  r rollback) the 
15af0 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20  transaction .   
15b00 20 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69 6e 74   ** or savepoint
15b10 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 44 62  .  */.    if( Db
15b20 55 73 65 4e 72 65 28 29 20 29 7b 0a 20 20 20 20  UseNre() ){.    
15b30 20 20 54 63 6c 5f 4e 52 41 64 64 43 61 6c 6c 62    Tcl_NRAddCallb
15b40 61 63 6b 28 69 6e 74 65 72 70 2c 20 44 62 54 72  ack(interp, DbTr
15b50 61 6e 73 50 6f 73 74 43 6d 64 2c 20 63 64 2c 20  ansPostCmd, cd, 
15b60 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
15b70 54 63 6c 5f 4e 52 45 76 61 6c 4f 62 6a 28 69 6e  Tcl_NREvalObj(in
15b80 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20 30  terp, pScript, 0
15b90 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
15ba0 20 20 20 20 72 63 20 3d 20 44 62 54 72 61 6e 73      rc = DbTrans
15bb0 50 6f 73 74 43 6d 64 28 26 63 64 2c 20 69 6e 74  PostCmd(&cd, int
15bc0 65 72 70 2c 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  erp, Tcl_EvalObj
15bd0 45 78 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69  Ex(interp, pScri
15be0 70 74 2c 20 30 29 29 3b 0a 20 20 20 20 7d 0a 20  pt, 0));.    }. 
15bf0 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
15c00 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20   /*.  **    $db 
15c10 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 20 3f 73  unlock_notify ?s
15c20 63 72 69 70 74 3f 0a 20 20 2a 2f 0a 20 20 63 61  cript?.  */.  ca
15c30 73 65 20 44 42 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54  se DB_UNLOCK_NOT
15c40 49 46 59 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53  IFY: {.#ifndef S
15c50 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c  QLITE_ENABLE_UNL
15c60 4f 43 4b 5f 4e 4f 54 49 46 59 0a 20 20 20 20 54  OCK_NOTIFY.    T
15c70 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
15c80 69 6e 74 65 72 70 2c 20 22 75 6e 6c 6f 63 6b 5f  interp, "unlock_
15c90 6e 6f 74 69 66 79 20 6e 6f 74 20 61 76 61 69 6c  notify not avail
15ca0 61 62 6c 65 20 69 6e 20 74 68 69 73 20 62 75 69  able in this bui
15cb0 6c 64 22 2c 20 30 29 3b 0a 20 20 20 20 72 63 20  ld", 0);.    rc 
15cc0 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c  = TCL_ERROR;.#el
15cd0 73 65 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  se.    if( objc!
15ce0 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b  =2 && objc!=3 ){
15cf0 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
15d00 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
15d10 32 2c 20 6f 62 6a 76 2c 20 22 3f 53 43 52 49 50  2, objv, "?SCRIP
15d20 54 3f 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  T?");.      rc =
15d30 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
15d40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 6f 69  }else{.      voi
15d50 64 20 28 2a 78 4e 6f 74 69 66 79 29 28 76 6f 69  d (*xNotify)(voi
15d60 64 20 2a 2a 2c 20 69 6e 74 29 20 3d 20 30 3b 0a  d **, int) = 0;.
15d70 20 20 20 20 20 20 76 6f 69 64 20 2a 70 4e 6f 74        void *pNot
15d80 69 66 79 41 72 67 20 3d 20 30 3b 0a 0a 20 20 20  ifyArg = 0;..   
15d90 20 20 20 69 66 28 20 70 44 62 2d 3e 70 55 6e 6c     if( pDb->pUnl
15da0 6f 63 6b 4e 6f 74 69 66 79 20 29 7b 0a 20 20 20  ockNotify ){.   
15db0 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
15dc0 43 6f 75 6e 74 28 70 44 62 2d 3e 70 55 6e 6c 6f  Count(pDb->pUnlo
15dd0 63 6b 4e 6f 74 69 66 79 29 3b 0a 20 20 20 20 20  ckNotify);.     
15de0 20 20 20 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e     pDb->pUnlockN
15df0 6f 74 69 66 79 20 3d 20 30 3b 0a 20 20 20 20 20  otify = 0;.     
15e00 20 7d 0a 20 20 0a 20 20 20 20 20 20 69 66 28 20   }.  .      if( 
15e10 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20  objc==3 ){.     
15e20 20 20 20 78 4e 6f 74 69 66 79 20 3d 20 44 62 55     xNotify = DbU
15e30 6e 6c 6f 63 6b 4e 6f 74 69 66 79 3b 0a 20 20 20  nlockNotify;.   
15e40 20 20 20 20 20 70 4e 6f 74 69 66 79 41 72 67 20       pNotifyArg 
15e50 3d 20 28 76 6f 69 64 20 2a 29 70 44 62 3b 0a 20  = (void *)pDb;. 
15e60 20 20 20 20 20 20 20 70 44 62 2d 3e 70 55 6e 6c         pDb->pUnl
15e70 6f 63 6b 4e 6f 74 69 66 79 20 3d 20 6f 62 6a 76  ockNotify = objv
15e80 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20 54 63 6c  [2];.        Tcl
15e90 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 44  _IncrRefCount(pD
15ea0 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79  b->pUnlockNotify
15eb0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  );.      }.  .  
15ec0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
15ed0 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 28 70 44  unlock_notify(pD
15ee0 62 2d 3e 64 62 2c 20 78 4e 6f 74 69 66 79 2c 20  b->db, xNotify, 
15ef0 70 4e 6f 74 69 66 79 41 72 67 29 20 29 7b 0a 20  pNotifyArg) ){. 
15f00 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
15f10 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
15f20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
15f30 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20  Db->db), 0);.   
15f40 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52       rc = TCL_ER
15f50 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
15f60 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72   }.#endif.    br
15f70 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
15f80 20 2a 2a 20 20 20 20 24 64 62 20 70 72 65 75 70   **    $db preup
15f90 64 61 74 65 5f 68 6f 6f 6b 20 63 6f 75 6e 74 0a  date_hook count.
15fa0 20 20 2a 2a 20 20 20 20 24 64 62 20 70 72 65 75    **    $db preu
15fb0 70 64 61 74 65 5f 68 6f 6f 6b 20 68 6f 6f 6b 20  pdate_hook hook 
15fc0 3f 53 43 52 49 50 54 3f 0a 20 20 2a 2a 20 20 20  ?SCRIPT?.  **   
15fd0 20 24 64 62 20 70 72 65 75 70 64 61 74 65 5f 68   $db preupdate_h
15fe0 6f 6f 6b 20 6e 65 77 20 49 4e 44 45 58 0a 20 20  ook new INDEX.  
15ff0 2a 2a 20 20 20 20 24 64 62 20 70 72 65 75 70 64  **    $db preupd
16000 61 74 65 5f 68 6f 6f 6b 20 6f 6c 64 20 49 4e 44  ate_hook old IND
16010 45 58 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  EX.  */.  case D
16020 42 5f 50 52 45 55 50 44 41 54 45 3a 20 7b 0a 23  B_PREUPDATE: {.#
16030 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  ifndef SQLITE_EN
16040 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48  ABLE_PREUPDATE_H
16050 4f 4f 4b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65  OOK.    Tcl_Appe
16060 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
16070 20 22 70 72 65 75 70 64 61 74 65 5f 68 6f 6f 6b   "preupdate_hook
16080 20 77 61 73 20 6f 6d 69 74 74 65 64 20 61 74 20   was omitted at 
16090 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 22 29 3b 0a  compile-time");.
160a0 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52      rc = TCL_ERR
160b0 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73 74  OR;.#else.    st
160c0 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
160d0 2a 61 7a 53 75 62 5b 5d 20 3d 20 7b 22 63 6f 75  *azSub[] = {"cou
160e0 6e 74 22 2c 20 22 64 65 70 74 68 22 2c 20 22 68  nt", "depth", "h
160f0 6f 6f 6b 22 2c 20 22 6e 65 77 22 2c 20 22 6f 6c  ook", "new", "ol
16100 64 22 2c 20 30 7d 3b 0a 20 20 20 20 65 6e 75 6d  d", 0};.    enum
16110 20 44 62 50 72 65 75 70 64 61 74 65 53 75 62 43   DbPreupdateSubC
16120 6d 64 20 7b 0a 20 20 20 20 20 20 50 52 45 5f 43  md {.      PRE_C
16130 4f 55 4e 54 2c 20 50 52 45 5f 44 45 50 54 48 2c  OUNT, PRE_DEPTH,
16140 20 50 52 45 5f 48 4f 4f 4b 2c 20 50 52 45 5f 4e   PRE_HOOK, PRE_N
16150 45 57 2c 20 50 52 45 5f 4f 4c 44 0a 20 20 20 20  EW, PRE_OLD.    
16160 7d 3b 0a 20 20 20 20 69 6e 74 20 69 53 75 62 3b  };.    int iSub;
16170 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3c 33  ..    if( objc<3
16180 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
16190 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
161a0 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 55 42  p, 2, objv, "SUB
161b0 2d 43 4f 4d 4d 41 4e 44 20 3f 41 52 47 53 3f 22  -COMMAND ?ARGS?"
161c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
161d0 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f   Tcl_GetIndexFro
161e0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
161f0 76 5b 32 5d 2c 20 61 7a 53 75 62 2c 20 22 73 75  v[2], azSub, "su
16200 62 2d 63 6f 6d 6d 61 6e 64 22 2c 20 30 2c 20 26  b-command", 0, &
16210 69 53 75 62 29 20 29 7b 0a 20 20 20 20 20 20 72  iSub) ){.      r
16220 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
16230 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74  .    }..    swit
16240 63 68 28 20 28 65 6e 75 6d 20 44 62 50 72 65 75  ch( (enum DbPreu
16250 70 64 61 74 65 53 75 62 43 6d 64 29 69 53 75 62  pdateSubCmd)iSub
16260 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 50   ){.      case P
16270 52 45 5f 43 4f 55 4e 54 3a 20 7b 0a 20 20 20 20  RE_COUNT: {.    
16280 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 73      int nCol = s
16290 71 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74 65  qlite3_preupdate
162a0 5f 63 6f 75 6e 74 28 70 44 62 2d 3e 64 62 29 3b  _count(pDb->db);
162b0 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74  .        Tcl_Set
162c0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
162d0 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
162e0 6e 43 6f 6c 29 29 3b 0a 20 20 20 20 20 20 20 20  nCol));.        
162f0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
16300 20 20 20 20 20 20 63 61 73 65 20 50 52 45 5f 48        case PRE_H
16310 4f 4f 4b 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  OOK: {.        i
16320 66 28 20 6f 62 6a 63 3e 34 20 29 7b 0a 20 20 20  f( objc>4 ){.   
16330 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67         Tcl_Wrong
16340 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
16350 32 2c 20 6f 62 6a 76 2c 20 22 68 6f 6f 6b 20 3f  2, objv, "hook ?
16360 53 43 52 49 50 54 3f 22 29 3b 0a 20 20 20 20 20  SCRIPT?");.     
16370 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
16380 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d  ERROR;.        }
16390 0a 20 20 20 20 20 20 20 20 44 62 48 6f 6f 6b 43  .        DbHookC
163a0 6d 64 28 69 6e 74 65 72 70 2c 20 70 44 62 2c 20  md(interp, pDb, 
163b0 28 6f 62 6a 63 3d 3d 34 20 3f 20 6f 62 6a 76 5b  (objc==4 ? objv[
163c0 33 5d 20 3a 20 30 29 2c 20 26 70 44 62 2d 3e 70  3] : 0), &pDb->p
163d0 50 72 65 55 70 64 61 74 65 48 6f 6f 6b 29 3b 0a  PreUpdateHook);.
163e0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
163f0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 61       }..      ca
16400 73 65 20 50 52 45 5f 44 45 50 54 48 3a 20 7b 0a  se PRE_DEPTH: {.
16410 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20          Tcl_Obj 
16420 2a 70 52 65 74 3b 0a 20 20 20 20 20 20 20 20 69  *pRet;.        i
16430 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
16440 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e          Tcl_Wron
16450 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
16460 20 33 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20   3, objv, "");. 
16470 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
16480 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
16490 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 52 65     }.        pRe
164a0 74 20 3d 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  t = Tcl_NewIntOb
164b0 6a 28 73 71 6c 69 74 65 33 5f 70 72 65 75 70 64  j(sqlite3_preupd
164c0 61 74 65 5f 64 65 70 74 68 28 70 44 62 2d 3e 64  ate_depth(pDb->d
164d0 62 29 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c  b));.        Tcl
164e0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
164f0 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20 20 20  terp, pRet);.   
16500 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
16510 20 20 7d 0a 0a 20 20 20 20 20 20 63 61 73 65 20    }..      case 
16520 50 52 45 5f 4e 45 57 3a 0a 20 20 20 20 20 20 63  PRE_NEW:.      c
16530 61 73 65 20 50 52 45 5f 4f 4c 44 3a 20 7b 0a 20  ase PRE_OLD: {. 
16540 20 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 3b         int iIdx;
16550 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
16560 5f 76 61 6c 75 65 20 2a 70 56 61 6c 75 65 3b 0a  _value *pValue;.
16570 20 20 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63          if( objc
16580 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=4 ){.         
16590 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
165a0 73 28 69 6e 74 65 72 70 2c 20 33 2c 20 6f 62 6a  s(interp, 3, obj
165b0 76 2c 20 22 49 4e 44 45 58 22 29 3b 0a 20 20 20  v, "INDEX");.   
165c0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
165d0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  L_ERROR;.       
165e0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 54   }.        if( T
165f0 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
16600 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
16610 2c 20 26 69 49 64 78 29 20 29 7b 0a 20 20 20 20  , &iIdx) ){.    
16620 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
16630 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
16640 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  }..        if( i
16650 53 75 62 3d 3d 50 52 45 5f 4f 4c 44 20 29 7b 0a  Sub==PRE_OLD ){.
16660 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
16670 71 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74 65  qlite3_preupdate
16680 5f 6f 6c 64 28 70 44 62 2d 3e 64 62 2c 20 69 49  _old(pDb->db, iI
16690 64 78 2c 20 26 70 56 61 6c 75 65 29 3b 0a 20 20  dx, &pValue);.  
166a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
166b0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
166c0 53 75 62 3d 3d 50 52 45 5f 4e 45 57 20 29 3b 0a  Sub==PRE_NEW );.
166d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
166e0 71 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74 65  qlite3_preupdate
166f0 5f 6e 65 77 28 70 44 62 2d 3e 64 62 2c 20 69 49  _new(pDb->db, iI
16700 64 78 2c 20 26 70 56 61 6c 75 65 29 3b 0a 20 20  dx, &pValue);.  
16710 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
16720 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
16730 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
16740 54 63 6c 5f 4f 62 6a 20 2a 70 4f 62 6a 3b 0a 20  Tcl_Obj *pObj;. 
16750 20 20 20 20 20 20 20 20 20 70 4f 62 6a 20 3d 20           pObj = 
16760 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
16770 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  ((char*)sqlite3_
16780 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 75  value_text(pValu
16790 65 29 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20  e), -1);.       
167a0 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
167b0 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 4f 62 6a  ult(interp, pObj
167c0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
167d0 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  {.          Tcl_
167e0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
167f0 65 72 70 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  erp, sqlite3_err
16800 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30 29  msg(pDb->db), 0)
16810 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
16820 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
16830 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
16840 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
16850 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52  SQLITE_ENABLE_PR
16860 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a  EUPDATE_HOOK */.
16870 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
16880 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62    /*.  **    $db
16890 20 77 61 6c 5f 68 6f 6f 6b 20 3f 73 63 72 69 70   wal_hook ?scrip
168a0 74 3f 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 75  t?.  **    $db u
168b0 70 64 61 74 65 5f 68 6f 6f 6b 20 3f 73 63 72 69  pdate_hook ?scri
168c0 70 74 3f 0a 20 20 2a 2a 20 20 20 20 24 64 62 20  pt?.  **    $db 
168d0 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 20 3f 73  rollback_hook ?s
168e0 63 72 69 70 74 3f 0a 20 20 2a 2f 0a 20 20 63 61  cript?.  */.  ca
168f0 73 65 20 44 42 5f 57 41 4c 5f 48 4f 4f 4b 3a 20  se DB_WAL_HOOK: 
16900 0a 20 20 63 61 73 65 20 44 42 5f 55 50 44 41 54  .  case DB_UPDAT
16910 45 5f 48 4f 4f 4b 3a 20 0a 20 20 63 61 73 65 20  E_HOOK: .  case 
16920 44 42 5f 52 4f 4c 4c 42 41 43 4b 5f 48 4f 4f 4b  DB_ROLLBACK_HOOK
16930 3a 20 7b 0a 20 20 20 20 2f 2a 20 73 65 74 20 70  : {.    /* set p
16940 70 48 6f 6f 6b 20 74 6f 20 70 6f 69 6e 74 20 61  pHook to point a
16950 74 20 70 55 70 64 61 74 65 48 6f 6f 6b 20 6f 72  t pUpdateHook or
16960 20 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 2c 20   pRollbackHook, 
16970 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 0a 20 20  depending on .  
16980 20 20 2a 2a 20 77 68 65 74 68 65 72 20 5b 24 64    ** whether [$d
16990 62 20 75 70 64 61 74 65 5f 68 6f 6f 6b 5d 20 6f  b update_hook] o
169a0 72 20 5b 24 64 62 20 72 6f 6c 6c 62 61 63 6b 5f  r [$db rollback_
169b0 68 6f 6f 6b 5d 20 77 61 73 20 69 6e 76 6f 6b 65  hook] was invoke
169c0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 54 63  d..    */.    Tc
169d0 6c 5f 4f 62 6a 20 2a 2a 70 70 48 6f 6f 6b 3b 20  l_Obj **ppHook; 
169e0 0a 20 20 20 20 69 66 28 20 63 68 6f 69 63 65 3d  .    if( choice=
169f0 3d 44 42 5f 57 41 4c 5f 48 4f 4f 4b 20 29 20 70  =DB_WAL_HOOK ) p
16a00 70 48 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e 70 57  pHook = &pDb->pW
16a10 61 6c 48 6f 6f 6b 3b 0a 20 20 20 20 69 66 28 20  alHook;.    if( 
16a20 63 68 6f 69 63 65 3d 3d 44 42 5f 55 50 44 41 54  choice==DB_UPDAT
16a30 45 5f 48 4f 4f 4b 20 29 20 70 70 48 6f 6f 6b 20  E_HOOK ) ppHook 
16a40 3d 20 26 70 44 62 2d 3e 70 55 70 64 61 74 65 48  = &pDb->pUpdateH
16a50 6f 6f 6b 3b 0a 20 20 20 20 69 66 28 20 63 68 6f  ook;.    if( cho
16a60 69 63 65 3d 3d 44 42 5f 52 4f 4c 4c 42 41 43 4b  ice==DB_ROLLBACK
16a70 5f 48 4f 4f 4b 20 29 20 70 70 48 6f 6f 6b 20 3d  _HOOK ) ppHook =
16a80 20 26 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b   &pDb->pRollback
16a90 48 6f 6f 6b 3b 0a 20 20 20 20 69 66 28 20 6f 62  Hook;.    if( ob
16aa0 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 20 54  jc>3 ){.       T
16ab0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
16ac0 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
16ad0 20 22 3f 53 43 52 49 50 54 3f 22 29 3b 0a 20 20   "?SCRIPT?");.  
16ae0 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
16af0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
16b00 20 20 44 62 48 6f 6f 6b 43 6d 64 28 69 6e 74 65    DbHookCmd(inte
16b10 72 70 2c 20 70 44 62 2c 20 28 6f 62 6a 63 3d 3d  rp, pDb, (objc==
16b20 33 20 3f 20 6f 62 6a 76 5b 32 5d 20 3a 20 30 29  3 ? objv[2] : 0)
16b30 2c 20 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20 62  , ppHook);.    b
16b40 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
16b50 20 20 20 24 64 62 20 76 65 72 73 69 6f 6e 0a 20     $db version. 
16b60 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
16b70 74 68 65 20 76 65 72 73 69 6f 6e 20 73 74 72 69  the version stri
16b80 6e 67 20 66 6f 72 20 74 68 69 73 20 64 61 74 61  ng for this data
16b90 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  base..  */.  cas
16ba0 65 20 44 42 5f 56 45 52 53 49 4f 4e 3a 20 7b 0a  e DB_VERSION: {.
16bb0 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
16bc0 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
16bd0 2a 29 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72  *)sqlite3_libver
16be0 73 69 6f 6e 28 29 2c 20 54 43 4c 5f 53 54 41 54  sion(), TCL_STAT
16bf0 49 43 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  IC);.    break;.
16c00 20 20 7d 0a 0a 0a 20 20 7d 20 2f 2a 20 45 6e 64    }...  } /* End
16c10 20 6f 66 20 74 68 65 20 53 57 49 54 43 48 20 73   of the SWITCH s
16c20 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 72 65  tatement */.  re
16c30 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20  turn rc;.}..#if 
16c40 53 51 4c 49 54 45 5f 54 43 4c 5f 4e 52 45 0a 2f  SQLITE_TCL_NRE./
16c50 2a 0a 2a 2a 20 41 64 61 70 74 6f 72 20 74 68 61  *.** Adaptor tha
16c60 74 20 70 72 6f 76 69 64 65 73 20 61 6e 20 6f 62  t provides an ob
16c70 6a 43 6d 64 20 69 6e 74 65 72 66 61 63 65 20 74  jCmd interface t
16c80 6f 20 74 68 65 20 4e 52 45 2d 65 6e 61 62 6c 65  o the NRE-enable
16c90 64 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 20 69  d.** interface i
16ca0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a  mplementation..*
16cb0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 4f  /.static int DbO
16cc0 62 6a 43 6d 64 41 64 61 70 74 6f 72 28 0a 20 20  bjCmdAdaptor(.  
16cd0 76 6f 69 64 20 2a 63 64 2c 0a 20 20 54 63 6c 5f  void *cd,.  Tcl_
16ce0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
16cf0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
16d00 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a  l_Obj *const*obj
16d10 76 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 54 63  v.){.  return Tc
16d20 6c 5f 4e 52 43 61 6c 6c 4f 62 6a 50 72 6f 63 28  l_NRCallObjProc(
16d30 69 6e 74 65 72 70 2c 20 44 62 4f 62 6a 43 6d 64  interp, DbObjCmd
16d40 2c 20 63 64 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76  , cd, objc, objv
16d50 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
16d60 51 4c 49 54 45 5f 54 43 4c 5f 4e 52 45 20 2a 2f  QLITE_TCL_NRE */
16d70 0a 0a 2f 2a 0a 2a 2a 20 20 20 73 71 6c 69 74 65  ../*.**   sqlite
16d80 33 20 44 42 4e 41 4d 45 20 46 49 4c 45 4e 41 4d  3 DBNAME FILENAM
16d90 45 20 3f 2d 76 66 73 20 56 46 53 4e 41 4d 45 3f  E ?-vfs VFSNAME?
16da0 20 3f 2d 6b 65 79 20 4b 45 59 3f 20 3f 2d 72 65   ?-key KEY? ?-re
16db0 61 64 6f 6e 6c 79 20 42 4f 4f 4c 45 41 4e 3f 0a  adonly BOOLEAN?.
16dc0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
16dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 3f 2d 63               ?-c
16de0 72 65 61 74 65 20 42 4f 4f 4c 45 41 4e 3f 20 3f  reate BOOLEAN? ?
16df0 2d 6e 6f 6d 75 74 65 78 20 42 4f 4f 4c 45 41 4e  -nomutex BOOLEAN
16e00 3f 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ?.**.** This is 
16e10 74 68 65 20 6d 61 69 6e 20 54 63 6c 20 63 6f 6d  the main Tcl com
16e20 6d 61 6e 64 2e 20 20 57 68 65 6e 20 74 68 65 20  mand.  When the 
16e30 22 73 71 6c 69 74 65 22 20 54 63 6c 20 63 6f 6d  "sqlite" Tcl com
16e40 6d 61 6e 64 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b  mand is.** invok
16e50 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ed, this routine
16e60 20 72 75 6e 73 20 74 6f 20 70 72 6f 63 65 73 73   runs to process
16e70 20 74 68 61 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a   that command..*
16e80 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61  *.** The first a
16e90 72 67 75 6d 65 6e 74 2c 20 44 42 4e 41 4d 45 2c  rgument, DBNAME,
16ea0 20 69 73 20 61 6e 20 61 72 62 69 74 72 61 72 79   is an arbitrary
16eb0 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 0a   name for a new.
16ec0 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ** database conn
16ed0 65 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 63 6f  ection.  This co
16ee0 6d 6d 61 6e 64 20 63 72 65 61 74 65 73 20 61 20  mmand creates a 
16ef0 6e 65 77 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65  new command name
16f00 64 0a 2a 2a 20 44 42 4e 41 4d 45 20 74 68 61 74  d.** DBNAME that
16f10 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6e 74   is used to cont
16f20 72 6f 6c 20 74 68 61 74 20 63 6f 6e 6e 65 63 74  rol that connect
16f30 69 6f 6e 2e 20 20 54 68 65 20 64 61 74 61 62 61  ion.  The databa
16f40 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  se.** connection
16f50 20 69 73 20 64 65 6c 65 74 65 64 20 77 68 65 6e   is deleted when
16f60 20 74 68 65 20 44 42 4e 41 4d 45 20 63 6f 6d 6d   the DBNAME comm
16f70 61 6e 64 20 69 73 20 64 65 6c 65 74 65 64 2e 0a  and is deleted..
16f80 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  **.** The second
16f90 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
16fa0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
16fb0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
16fc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 4d  /.static int DbM
16fd0 61 69 6e 28 76 6f 69 64 20 2a 63 64 2c 20 54 63  ain(void *cd, Tc
16fe0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
16ff0 2c 20 69 6e 74 20 6f 62 6a 63 2c 54 63 6c 5f 4f  , int objc,Tcl_O
17000 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 29 7b  bj *const*objv){
17010 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 3b 0a  .  SqliteDb *p;.
17020 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
17030 72 67 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  rg;.  char *zErr
17040 4d 73 67 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  Msg;.  int i;.  
17050 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
17060 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e;.  const char 
17070 2a 7a 56 66 73 20 3d 20 30 3b 0a 20 20 69 6e 74  *zVfs = 0;.  int
17080 20 66 6c 61 67 73 3b 0a 20 20 54 63 6c 5f 44 53   flags;.  Tcl_DS
17090 74 72 69 6e 67 20 74 72 61 6e 73 6c 61 74 65 64  tring translated
170a0 46 69 6c 65 6e 61 6d 65 3b 0a 23 69 66 64 65 66  Filename;.#ifdef
170b0 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
170c0 43 0a 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d  C.  void *pKey =
170d0 20 30 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 20 3d   0;.  int nKey =
170e0 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74   0;.#endif.  int
170f0 20 72 63 3b 0a 0a 20 20 2f 2a 20 49 6e 20 6e 6f   rc;..  /* In no
17100 72 6d 61 6c 20 75 73 65 2c 20 65 61 63 68 20 54  rmal use, each T
17110 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 72  CL interpreter r
17120 75 6e 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20  uns in a single 
17130 74 68 72 65 61 64 2e 20 20 53 6f 0a 20 20 2a 2a  thread.  So.  **
17140 20 62 79 20 64 65 66 61 75 6c 74 2c 20 77 65 20   by default, we 
17150 63 61 6e 20 74 75 72 6e 20 6f 66 20 6d 75 74 65  can turn of mute
17160 78 69 6e 67 20 6f 6e 20 53 51 4c 69 74 65 20 64  xing on SQLite d
17170 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
17180 6f 6e 73 2e 0a 20 20 2a 2a 20 48 6f 77 65 76 65  ons..  ** Howeve
17190 72 2c 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70  r, for testing p
171a0 75 72 70 6f 73 65 73 20 69 74 20 69 73 20 75 73  urposes it is us
171b0 65 66 75 6c 20 74 6f 20 68 61 76 65 20 6d 75 74  eful to have mut
171c0 65 78 65 73 20 74 75 72 6e 65 64 0a 20 20 2a 2a  exes turned.  **
171d0 20 6f 6e 2e 20 20 53 6f 2c 20 62 79 20 64 65 66   on.  So, by def
171e0 61 75 6c 74 2c 20 6d 75 74 65 78 65 73 20 64 65  ault, mutexes de
171f0 66 61 75 6c 74 20 6f 66 66 2e 20 20 42 75 74 20  fault off.  But 
17200 69 66 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68  if compiled with
17210 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54 43 4c  .  ** SQLITE_TCL
17220 5f 44 45 46 41 55 4c 54 5f 46 55 4c 4c 4d 55 54  _DEFAULT_FULLMUT
17230 45 58 20 74 68 65 6e 20 6d 75 74 65 78 65 73 20  EX then mutexes 
17240 64 65 66 61 75 6c 74 20 6f 6e 2e 0a 20 20 2a 2f  default on..  */
17250 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
17260 43 4c 5f 44 45 46 41 55 4c 54 5f 46 55 4c 4c 4d  CL_DEFAULT_FULLM
17270 55 54 45 58 0a 20 20 66 6c 61 67 73 20 3d 20 53  UTEX.  flags = S
17280 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
17290 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
172a0 45 4e 5f 43 52 45 41 54 45 20 7c 20 53 51 4c 49  EN_CREATE | SQLI
172b0 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45  TE_OPEN_FULLMUTE
172c0 58 3b 0a 23 65 6c 73 65 0a 20 20 66 6c 61 67 73  X;.#else.  flags
172d0 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
172e0 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54  EADWRITE | SQLIT
172f0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 20  E_OPEN_CREATE | 
17300 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55  SQLITE_OPEN_NOMU
17310 54 45 58 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69  TEX;.#endif..  i
17320 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20  f( objc==2 ){.  
17330 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65 74    zArg = Tcl_Get
17340 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
17350 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 20 20 69  jv[1], 0);.    i
17360 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22  f( strcmp(zArg,"
17370 2d 76 65 72 73 69 6f 6e 22 29 3d 3d 30 20 29 7b  -version")==0 ){
17380 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
17390 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 73  dResult(interp,s
173a0 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 2c 30  qlite3_version,0
173b0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
173c0 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  TCL_OK;.    }.  
173d0 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72    if( strcmp(zAr
173e0 67 2c 22 2d 68 61 73 2d 63 6f 64 65 63 22 29 3d  g,"-has-codec")=
173f0 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  =0 ){.#ifdef SQL
17400 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
17410 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
17420 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 31 22 2c  sult(interp,"1",
17430 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  0);.#else.      
17440 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
17450 28 69 6e 74 65 72 70 2c 22 30 22 2c 30 29 3b 0a  (interp,"0",0);.
17460 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 65 74  #endif.      ret
17470 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20  urn TCL_OK;.    
17480 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 33 3b  }.  }.  for(i=3;
17490 20 69 2b 31 3c 6f 62 6a 63 3b 20 69 2b 3d 32 29   i+1<objc; i+=2)
174a0 7b 0a 20 20 20 20 7a 41 72 67 20 3d 20 54 63 6c  {.    zArg = Tcl
174b0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
174c0 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72  i]);.    if( str
174d0 63 6d 70 28 7a 41 72 67 2c 22 2d 6b 65 79 22 29  cmp(zArg,"-key")
174e0 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51  ==0 ){.#ifdef SQ
174f0 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
17500 20 20 20 20 20 70 4b 65 79 20 3d 20 54 63 6c 5f       pKey = Tcl_
17510 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d  GetByteArrayFrom
17520 4f 62 6a 28 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26  Obj(objv[i+1], &
17530 6e 4b 65 79 29 3b 0a 23 65 6e 64 69 66 0a 20 20  nKey);.#endif.  
17540 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
17550 6d 70 28 7a 41 72 67 2c 20 22 2d 76 66 73 22 29  mp(zArg, "-vfs")
17560 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 56 66  ==0 ){.      zVf
17570 73 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  s = Tcl_GetStrin
17580 67 28 6f 62 6a 76 5b 69 2b 31 5d 29 3b 0a 20 20  g(objv[i+1]);.  
17590 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
175a0 6d 70 28 7a 41 72 67 2c 20 22 2d 72 65 61 64 6f  mp(zArg, "-reado
175b0 6e 6c 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  nly")==0 ){.    
175c0 20 20 69 6e 74 20 62 3b 0a 20 20 20 20 20 20 69    int b;.      i
175d0 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61  f( Tcl_GetBoolea
175e0 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  nFromObj(interp,
175f0 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 62 29 20   objv[i+1], &b) 
17600 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
17610 4f 52 3b 0a 20 20 20 20 20 20 69 66 28 20 62 20  OR;.      if( b 
17620 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  ){.        flags
17630 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45   &= ~(SQLITE_OPE
17640 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
17650 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b  TE_OPEN_CREATE);
17660 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c  .        flags |
17670 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
17680 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65  ADONLY;.      }e
17690 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 61  lse{.        fla
176a0 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50  gs &= ~SQLITE_OP
176b0 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  EN_READONLY;.   
176c0 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51       flags |= SQ
176d0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
176e0 49 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ITE;.      }.   
176f0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
17700 70 28 7a 41 72 67 2c 20 22 2d 63 72 65 61 74 65  p(zArg, "-create
17710 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
17720 6e 74 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20  nt b;.      if( 
17730 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
17740 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
17750 6a 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20 72  jv[i+1], &b) ) r
17760 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
17770 0a 20 20 20 20 20 20 69 66 28 20 62 20 26 26 20  .      if( b && 
17780 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
17790 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d  OPEN_READONLY)==
177a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61  0 ){.        fla
177b0 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
177c0 4e 5f 43 52 45 41 54 45 3b 0a 20 20 20 20 20 20  N_CREATE;.      
177d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
177e0 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
177f0 4f 50 45 4e 5f 43 52 45 41 54 45 3b 0a 20 20 20  OPEN_CREATE;.   
17800 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
17810 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20  f( strcmp(zArg, 
17820 22 2d 6e 6f 6d 75 74 65 78 22 29 3d 3d 30 20 29  "-nomutex")==0 )
17830 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 3b 0a 20  {.      int b;. 
17840 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74       if( Tcl_Get
17850 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
17860 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d  nterp, objv[i+1]
17870 2c 20 26 62 29 20 29 20 72 65 74 75 72 6e 20 54  , &b) ) return T
17880 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
17890 69 66 28 20 62 20 29 7b 0a 20 20 20 20 20 20 20  if( b ){.       
178a0 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45   flags |= SQLITE
178b0 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 20  _OPEN_NOMUTEX;. 
178c0 20 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20         flags &= 
178d0 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c  ~SQLITE_OPEN_FUL
178e0 4c 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 7d 65  LMUTEX;.      }e
178f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 61  lse{.        fla
17900 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50  gs &= ~SQLITE_OP
17910 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 20 20 20 20  EN_NOMUTEX;.    
17920 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
17930 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22  ( strcmp(zArg, "
17940 2d 66 75 6c 6c 6d 75 74 65 78 22 29 3d 3d 30 20  -fullmutex")==0 
17950 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 3b 0a  ){.      int b;.
17960 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65        if( Tcl_Ge
17970 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
17980 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 2b 31  interp, objv[i+1
17990 5d 2c 20 26 62 29 20 29 20 72 65 74 75 72 6e 20  ], &b) ) return 
179a0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
179b0 20 69 66 28 20 62 20 29 7b 0a 20 20 20 20 20 20   if( b ){.      
179c0 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54    flags |= SQLIT
179d0 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58  E_OPEN_FULLMUTEX
179e0 3b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  ;.        flags 
179f0 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  &= ~SQLITE_OPEN_
17a00 4e 4f 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 7d  NOMUTEX;.      }
17a10 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6c  else{.        fl
17a20 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f  ags &= ~SQLITE_O
17a30 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a 20  PEN_FULLMUTEX;. 
17a40 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
17a50 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67   if( strcmp(zArg
17a60 2c 20 22 2d 75 72 69 22 29 3d 3d 30 20 29 7b 0a  , "-uri")==0 ){.
17a70 20 20 20 20 20 20 69 6e 74 20 62 3b 0a 20 20 20        int b;.   
17a80 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f     if( Tcl_GetBo
17a90 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
17aa0 65 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20  erp, objv[i+1], 
17ab0 26 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  &b) ) return TCL
17ac0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 69 66  _ERROR;.      if
17ad0 28 20 62 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ( b ){.        f
17ae0 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
17af0 50 45 4e 5f 55 52 49 3b 0a 20 20 20 20 20 20 7d  PEN_URI;.      }
17b00 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6c  else{.        fl
17b10 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f  ags &= ~SQLITE_O
17b20 50 45 4e 5f 55 52 49 3b 0a 20 20 20 20 20 20 7d  PEN_URI;.      }
17b30 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
17b40 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
17b50 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 6b 6e  lt(interp, "unkn
17b60 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 22 2c 20 7a  own option: ", z
17b70 41 72 67 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  Arg, (char*)0);.
17b80 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
17b90 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
17ba0 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3c 33 20 7c  }.  if( objc<3 |
17bb0 7c 20 28 6f 62 6a 63 26 31 29 21 3d 31 20 29 7b  | (objc&1)!=1 ){
17bc0 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
17bd0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
17be0 20 6f 62 6a 76 2c 20 0a 20 20 20 20 20 20 22 48   objv, .      "H
17bf0 41 4e 44 4c 45 20 46 49 4c 45 4e 41 4d 45 20 3f  ANDLE FILENAME ?
17c00 2d 76 66 73 20 56 46 53 4e 41 4d 45 3f 20 3f 2d  -vfs VFSNAME? ?-
17c10 72 65 61 64 6f 6e 6c 79 20 42 4f 4f 4c 45 41 4e  readonly BOOLEAN
17c20 3f 20 3f 2d 63 72 65 61 74 65 20 42 4f 4f 4c 45  ? ?-create BOOLE
17c30 41 4e 3f 22 0a 20 20 20 20 20 20 22 20 3f 2d 6e  AN?".      " ?-n
17c40 6f 6d 75 74 65 78 20 42 4f 4f 4c 45 41 4e 3f 20  omutex BOOLEAN? 
17c50 3f 2d 66 75 6c 6c 6d 75 74 65 78 20 42 4f 4f 4c  ?-fullmutex BOOL
17c60 45 41 4e 3f 20 3f 2d 75 72 69 20 42 4f 4f 4c 45  EAN? ?-uri BOOLE
17c70 41 4e 3f 22 0a 23 69 66 64 65 66 20 53 51 4c 49  AN?".#ifdef SQLI
17c80 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20  TE_HAS_CODEC.   
17c90 20 20 20 22 20 3f 2d 6b 65 79 20 43 4f 44 45 43     " ?-key CODEC
17ca0 4b 45 59 3f 22 0a 23 65 6e 64 69 66 0a 20 20 20  KEY?".#endif.   
17cb0 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   );.    return T
17cc0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
17cd0 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70  zErrMsg = 0;.  p
17ce0 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 54 63   = (SqliteDb*)Tc
17cf0 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  l_Alloc( sizeof(
17d00 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  *p) );.  if( p==
17d10 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  0 ){.    Tcl_Set
17d20 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
17d30 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 22 2c 20  malloc failed", 
17d40 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  TCL_STATIC);.   
17d50 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
17d60 52 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  R;.  }.  memset(
17d70 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29  p, 0, sizeof(*p)
17d80 29 3b 0a 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c  );.  zFile = Tcl
17d90 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
17da0 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20  j(objv[2], 0);. 
17db0 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 54 72 61   zFile = Tcl_Tra
17dc0 6e 73 6c 61 74 65 46 69 6c 65 4e 61 6d 65 28 69  nslateFileName(i
17dd0 6e 74 65 72 70 2c 20 7a 46 69 6c 65 2c 20 26 74  nterp, zFile, &t
17de0 72 61 6e 73 6c 61 74 65 64 46 69 6c 65 6e 61 6d  ranslatedFilenam
17df0 65 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  e);.  rc = sqlit
17e00 65 33 5f 6f 70 65 6e 5f 76 32 28 7a 46 69 6c 65  e3_open_v2(zFile
17e10 2c 20 26 70 2d 3e 64 62 2c 20 66 6c 61 67 73 2c  , &p->db, flags,
17e20 20 7a 56 66 73 29 3b 0a 20 20 54 63 6c 5f 44 53   zVfs);.  Tcl_DS
17e30 74 72 69 6e 67 46 72 65 65 28 26 74 72 61 6e 73  tringFree(&trans
17e40 6c 61 74 65 64 46 69 6c 65 6e 61 6d 65 29 3b 0a  latedFilename);.
17e50 20 20 69 66 28 20 70 2d 3e 64 62 20 29 7b 0a 20    if( p->db ){. 
17e60 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
17e70 21 3d 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  !=sqlite3_errcod
17e80 65 28 70 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20  e(p->db) ){.    
17e90 20 20 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69    zErrMsg = sqli
17ea0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
17eb0 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
17ec0 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20  (p->db));.      
17ed0 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d  sqlite3_close(p-
17ee0 3e 64 62 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64  >db);.      p->d
17ef0 62 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  b = 0;.    }.  }
17f00 65 6c 73 65 7b 0a 20 20 20 20 7a 45 72 72 4d 73  else{.    zErrMs
17f10 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
17f20 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65  ntf("%s", sqlite
17f30 33 5f 65 72 72 73 74 72 28 72 63 29 29 3b 0a 20  3_errstr(rc));. 
17f40 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
17f50 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28  _HAS_CODEC.  if(
17f60 20 70 2d 3e 64 62 20 29 7b 0a 20 20 20 20 73 71   p->db ){.    sq
17f70 6c 69 74 65 33 5f 6b 65 79 28 70 2d 3e 64 62 2c  lite3_key(p->db,
17f80 20 70 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20   pKey, nKey);.  
17f90 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
17fa0 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20 54  ->db==0 ){.    T
17fb0 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
17fc0 65 72 70 2c 20 7a 45 72 72 4d 73 67 2c 20 54 43  erp, zErrMsg, TC
17fd0 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20  L_VOLATILE);.   
17fe0 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a   Tcl_Free((char*
17ff0 29 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  )p);.    sqlite3
18000 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a  _free(zErrMsg);.
18010 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
18020 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d  RROR;.  }.  p->m
18030 61 78 53 74 6d 74 20 3d 20 4e 55 4d 5f 50 52 45  axStmt = NUM_PRE
18040 50 41 52 45 44 5f 53 54 4d 54 53 3b 0a 20 20 70  PARED_STMTS;.  p
18050 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  ->interp = inter
18060 70 3b 0a 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f  p;.  zArg = Tcl_
18070 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
18080 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20  (objv[1], 0);.  
18090 69 66 28 20 44 62 55 73 65 4e 72 65 28 29 20 29  if( DbUseNre() )
180a0 7b 0a 20 20 20 20 54 63 6c 5f 4e 52 43 72 65 61  {.    Tcl_NRCrea
180b0 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  teCommand(interp
180c0 2c 20 7a 41 72 67 2c 20 44 62 4f 62 6a 43 6d 64  , zArg, DbObjCmd
180d0 41 64 61 70 74 6f 72 2c 20 44 62 4f 62 6a 43 6d  Adaptor, DbObjCm
180e0 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
180f0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
18100 2a 29 70 2c 20 44 62 44 65 6c 65 74 65 43 6d 64  *)p, DbDeleteCmd
18110 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
18120 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
18130 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 7a 41 72  mand(interp, zAr
18140 67 2c 20 44 62 4f 62 6a 43 6d 64 2c 20 28 63 68  g, DbObjCmd, (ch
18150 61 72 2a 29 70 2c 20 44 62 44 65 6c 65 74 65 43  ar*)p, DbDeleteC
18160 6d 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  md);.  }.  retur
18170 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
18180 2a 2a 20 50 72 6f 76 69 64 65 20 61 20 64 75 6d  ** Provide a dum
18190 6d 79 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73  my Tcl_InitStubs
181a0 20 69 66 20 77 65 20 61 72 65 20 75 73 69 6e 67   if we are using
181b0 20 74 68 69 73 20 61 73 20 61 20 73 74 61 74 69   this as a stati
181c0 63 0a 2a 2a 20 6c 69 62 72 61 72 79 2e 0a 2a 2f  c.** library..*/
181d0 0a 23 69 66 6e 64 65 66 20 55 53 45 5f 54 43 4c  .#ifndef USE_TCL
181e0 5f 53 54 55 42 53 0a 23 20 75 6e 64 65 66 20 20  _STUBS.# undef  
181f0 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 0a 23 20  Tcl_InitStubs.# 
18200 64 65 66 69 6e 65 20 54 63 6c 5f 49 6e 69 74 53  define Tcl_InitS
18210 74 75 62 73 28 61 2c 62 2c 63 29 0a 23 65 6e 64  tubs(a,b,c).#end
18220 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  if../*.** Make s
18230 75 72 65 20 77 65 20 68 61 76 65 20 61 20 50 41  ure we have a PA
18240 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 20 6d 61  CKAGE_VERSION ma
18250 63 72 6f 20 64 65 66 69 6e 65 64 2e 20 20 54 68  cro defined.  Th
18260 69 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65  is will be.** de
18270 66 69 6e 65 64 20 61 75 74 6f 6d 61 74 69 63 61  fined automatica
18280 6c 6c 79 20 62 79 20 74 68 65 20 54 45 41 20 6d  lly by the TEA m
18290 61 6b 65 66 69 6c 65 2e 20 20 42 75 74 20 6f 74  akefile.  But ot
182a0 68 65 72 20 6d 61 6b 65 66 69 6c 65 73 0a 2a 2a  her makefiles.**
182b0 20 64 6f 20 6e 6f 74 20 64 65 66 69 6e 65 20 69   do not define i
182c0 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 50 41  t..*/.#ifndef PA
182d0 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 0a 23 20  CKAGE_VERSION.# 
182e0 64 65 66 69 6e 65 20 50 41 43 4b 41 47 45 5f 56  define PACKAGE_V
182f0 45 52 53 49 4f 4e 20 53 51 4c 49 54 45 5f 56 45  ERSION SQLITE_VE
18300 52 53 49 4f 4e 0a 23 65 6e 64 69 66 0a 0a 2f 2a  RSION.#endif../*
18310 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
18320 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2a 0a 2a  his module..**.*
18330 2a 20 54 68 69 73 20 54 63 6c 20 6d 6f 64 75 6c  * This Tcl modul
18340 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20  e contains only 
18350 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 54 63 6c  a single new Tcl
18360 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64 20 22   command named "
18370 73 71 6c 69 74 65 22 2e 0a 2a 2a 20 28 48 65 6e  sqlite"..** (Hen
18380 63 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  ce there is no n
18390 61 6d 65 73 70 61 63 65 2e 20 20 54 68 65 72 65  amespace.  There
183a0 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20   is no point in 
183b0 75 73 69 6e 67 20 61 20 6e 61 6d 65 73 70 61 63  using a namespac
183c0 65 0a 2a 2a 20 69 66 20 74 68 65 20 65 78 74 65  e.** if the exte
183d0 6e 73 69 6f 6e 20 6f 6e 6c 79 20 73 75 70 70 6c  nsion only suppl
183e0 69 65 73 20 6f 6e 65 20 6e 65 77 20 6e 61 6d 65  ies one new name
183f0 21 29 20 20 54 68 65 20 22 73 71 6c 69 74 65 22  !)  The "sqlite"
18400 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 75   command is.** u
18410 73 65 64 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65  sed to open a ne
18420 77 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  w SQLite databas
18430 65 2e 20 20 53 65 65 20 74 68 65 20 44 62 4d 61  e.  See the DbMa
18440 69 6e 28 29 20 72 6f 75 74 69 6e 65 20 61 62 6f  in() routine abo
18450 76 65 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69  ve.** for additi
18460 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
18470 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 58 54 45  ..**.** The EXTE
18480 52 4e 20 6d 61 63 72 6f 73 20 61 72 65 20 72 65  RN macros are re
18490 71 75 69 72 65 64 20 62 79 20 54 43 4c 20 69 6e  quired by TCL in
184a0 20 6f 72 64 65 72 20 74 6f 20 77 6f 72 6b 20 6f   order to work o
184b0 6e 20 77 69 6e 64 6f 77 73 2e 0a 2a 2f 0a 45 58  n windows..*/.EX
184c0 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65 33  TERN int Sqlite3
184d0 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
184e0 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 54 63 6c   *interp){.  Tcl
184f0 5f 49 6e 69 74 53 74 75 62 73 28 69 6e 74 65 72  _InitStubs(inter
18500 70 2c 20 22 38 2e 34 22 2c 20 30 29 3b 0a 20 20  p, "8.4", 0);.  
18510 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
18520 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 73 71  mand(interp, "sq
18530 6c 69 74 65 33 22 2c 20 28 54 63 6c 5f 4f 62 6a  lite3", (Tcl_Obj
18540 43 6d 64 50 72 6f 63 2a 29 44 62 4d 61 69 6e 2c  CmdProc*)DbMain,
18550 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 50 6b   0, 0);.  Tcl_Pk
18560 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70 2c  gProvide(interp,
18570 20 22 73 71 6c 69 74 65 33 22 2c 20 50 41 43 4b   "sqlite3", PACK
18580 41 47 45 5f 56 45 52 53 49 4f 4e 29 3b 0a 0a 23  AGE_VERSION);..#
18590 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 33 5f  ifndef SQLITE_3_
185a0 53 55 46 46 49 58 5f 4f 4e 4c 59 0a 20 20 2f 2a  SUFFIX_ONLY.  /*
185b0 20 54 68 65 20 22 73 71 6c 69 74 65 22 20 61 6c   The "sqlite" al
185c0 69 61 73 20 69 73 20 75 6e 64 6f 63 75 6d 65 6e  ias is undocumen
185d0 74 65 64 2e 20 20 49 74 20 69 73 20 68 65 72 65  ted.  It is here
185e0 20 6f 6e 6c 79 20 74 6f 20 73 75 70 70 6f 72 74   only to support
185f0 0a 20 20 2a 2a 20 6c 65 67 61 63 79 20 73 63 72  .  ** legacy scr
18600 69 70 74 73 2e 20 20 41 6c 6c 20 6e 65 77 20 73  ipts.  All new s
18610 63 72 69 70 74 73 20 73 68 6f 75 6c 64 20 75 73  cripts should us
18620 65 20 6f 6e 6c 79 20 74 68 65 20 22 73 71 6c 69  e only the "sqli
18630 74 65 33 22 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e  te3".  ** comman
18640 64 2e 0a 20 20 2a 2f 0a 20 20 54 63 6c 5f 43 72  d..  */.  Tcl_Cr
18650 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
18660 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 22 2c  nterp, "sqlite",
18670 20 28 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63   (Tcl_ObjCmdProc
18680 2a 29 44 62 4d 61 69 6e 2c 20 30 2c 20 30 29 3b  *)DbMain, 0, 0);
18690 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
186a0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 45 58 54 45  n TCL_OK;.}.EXTE
186b0 52 4e 20 69 6e 74 20 54 63 6c 73 71 6c 69 74 65  RN int Tclsqlite
186c0 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  3_Init(Tcl_Inter
186d0 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75  p *interp){ retu
186e0 72 6e 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28  rn Sqlite3_Init(
186f0 69 6e 74 65 72 70 29 3b 20 7d 0a 45 58 54 45 52  interp); }.EXTER
18700 4e 20 69 6e 74 20 53 71 6c 69 74 65 33 5f 55 6e  N int Sqlite3_Un
18710 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72 70 20  load(Tcl_Interp 
18720 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c 61  *interp, int fla
18730 67 73 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f  gs){ return TCL_
18740 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74  OK; }.EXTERN int
18750 20 54 63 6c 73 71 6c 69 74 65 33 5f 55 6e 6c 6f   Tclsqlite3_Unlo
18760 61 64 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  ad(Tcl_Interp *i
18770 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 73  nterp, int flags
18780 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  ){ return TCL_OK
18790 3b 20 7d 0a 0a 2f 2a 20 42 65 63 61 75 73 65 20  ; }../* Because 
187a0 69 74 20 61 63 63 65 73 73 65 73 20 74 68 65 20  it accesses the 
187b0 66 69 6c 65 2d 73 79 73 74 65 6d 20 61 6e 64 20  file-system and 
187c0 75 73 65 73 20 70 65 72 73 69 73 74 65 6e 74 20  uses persistent 
187d0 73 74 61 74 65 2c 20 53 51 4c 69 74 65 0a 2a 2a  state, SQLite.**
187e0 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72   is not consider
187f0 65 64 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  ed appropriate f
18800 6f 72 20 73 61 66 65 20 69 6e 74 65 72 70 72 65  or safe interpre
18810 74 65 72 73 2e 20 20 48 65 6e 63 65 2c 20 77 65  ters.  Hence, we
18820 20 64 65 6c 69 62 65 72 61 74 65 6c 79 0a 2a 2a   deliberately.**
18830 20 6f 6d 69 74 20 74 68 65 20 5f 53 61 66 65 49   omit the _SafeI
18840 6e 69 74 28 29 20 69 6e 74 65 72 66 61 63 65 73  nit() interfaces
18850 2e 0a 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  ..*/..#ifndef SQ
18860 4c 49 54 45 5f 33 5f 53 55 46 46 49 58 5f 4f 4e  LITE_3_SUFFIX_ON
18870 4c 59 0a 69 6e 74 20 53 71 6c 69 74 65 5f 49 6e  LY.int Sqlite_In
18880 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
18890 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 53  nterp){ return S
188a0 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65  qlite3_Init(inte
188b0 72 70 29 3b 20 7d 0a 69 6e 74 20 54 63 6c 73 71  rp); }.int Tclsq
188c0 6c 69 74 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  lite_Init(Tcl_In
188d0 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72  terp *interp){ r
188e0 65 74 75 72 6e 20 53 71 6c 69 74 65 33 5f 49 6e  eturn Sqlite3_In
188f0 69 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a 69 6e  it(interp); }.in
18900 74 20 53 71 6c 69 74 65 5f 55 6e 6c 6f 61 64 28  t Sqlite_Unload(
18910 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
18920 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 20  rp, int flags){ 
18930 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d  return TCL_OK; }
18940 0a 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 5f 55  .int Tclsqlite_U
18950 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72 70  nload(Tcl_Interp
18960 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c   *interp, int fl
18970 61 67 73 29 7b 20 72 65 74 75 72 6e 20 54 43 4c  ags){ return TCL
18980 5f 4f 4b 3b 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  _OK; }.#endif..#
18990 69 66 64 65 66 20 54 43 4c 53 48 0a 2f 2a 2a 2a  ifdef TCLSH./***
189a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
189b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
189c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
189d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
189e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 41 6c  **********.** Al
189f0 6c 20 6f 66 20 74 68 65 20 63 6f 64 65 20 74 68  l of the code th
18a00 61 74 20 66 6f 6c 6c 6f 77 73 20 69 73 20 75 73  at follows is us
18a10 65 64 20 74 6f 20 62 75 69 6c 64 20 73 74 61 6e  ed to build stan
18a20 64 61 6c 6f 6e 65 20 54 43 4c 20 69 6e 74 65 72  dalone TCL inter
18a30 70 72 65 74 65 72 73 0a 2a 2a 20 74 68 61 74 20  preters.** that 
18a40 61 72 65 20 73 74 61 74 69 63 61 6c 6c 79 20 6c  are statically l
18a50 69 6e 6b 65 64 20 77 69 74 68 20 53 51 4c 69 74  inked with SQLit
18a60 65 2e 20 20 45 6e 61 62 6c 65 20 74 68 65 73 65  e.  Enable these
18a70 20 62 79 20 63 6f 6d 70 69 6c 69 6e 67 0a 2a 2a   by compiling.**
18a80 20 77 69 74 68 20 2d 44 54 43 4c 53 48 3d 6e 20   with -DTCLSH=n 
18a90 77 68 65 72 65 20 6e 20 63 61 6e 20 62 65 20 31  where n can be 1
18aa0 20 6f 72 20 32 2e 20 20 41 6e 20 6e 20 6f 66 20   or 2.  An n of 
18ab0 31 20 67 65 6e 65 72 61 74 65 73 20 61 20 73 74  1 generates a st
18ac0 61 6e 64 61 72 64 0a 2a 2a 20 74 63 6c 73 68 20  andard.** tclsh 
18ad0 62 75 74 20 77 69 74 68 20 53 51 4c 69 74 65 20  but with SQLite 
18ae0 62 75 69 6c 74 20 69 6e 2e 20 20 41 6e 20 6e 20  built in.  An n 
18af0 6f 66 20 32 20 67 65 6e 65 72 61 74 65 73 20 74  of 2 generates t
18b00 68 65 20 53 51 4c 69 74 65 20 73 70 61 63 65 0a  he SQLite space.
18b10 2a 2a 20 61 6e 61 6c 79 73 69 73 20 70 72 6f 67  ** analysis prog
18b20 72 61 6d 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65 66  ram..*/..#if def
18b30 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
18b40 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
18b50 49 54 45 5f 54 43 4c 4d 44 35 29 0a 2f 2a 0a 20  ITE_TCLMD5)./*. 
18b60 2a 20 54 68 69 73 20 63 6f 64 65 20 69 6d 70 6c  * This code impl
18b70 65 6d 65 6e 74 73 20 74 68 65 20 4d 44 35 20 6d  ements the MD5 m
18b80 65 73 73 61 67 65 2d 64 69 67 65 73 74 20 61 6c  essage-digest al
18b90 67 6f 72 69 74 68 6d 2e 0a 20 2a 20 54 68 65 20  gorithm.. * The 
18ba0 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 64 75 65  algorithm is due
18bb0 20 74 6f 20 52 6f 6e 20 52 69 76 65 73 74 2e 20   to Ron Rivest. 
18bc0 20 54 68 69 73 20 63 6f 64 65 20 77 61 73 0a 20   This code was. 
18bd0 2a 20 77 72 69 74 74 65 6e 20 62 79 20 43 6f 6c  * written by Col
18be0 69 6e 20 50 6c 75 6d 62 20 69 6e 20 31 39 39 33  in Plumb in 1993
18bf0 2c 20 6e 6f 20 63 6f 70 79 72 69 67 68 74 20 69  , no copyright i
18c00 73 20 63 6c 61 69 6d 65 64 2e 0a 20 2a 20 54 68  s claimed.. * Th
18c10 69 73 20 63 6f 64 65 20 69 73 20 69 6e 20 74 68  is code is in th
18c20 65 20 70 75 62 6c 69 63 20 64 6f 6d 61 69 6e 3b  e public domain;
18c30 20 64 6f 20 77 69 74 68 20 69 74 20 77 68 61 74   do with it what
18c40 20 79 6f 75 20 77 69 73 68 2e 0a 20 2a 0a 20 2a   you wish.. *. *
18c50 20 45 71 75 69 76 61 6c 65 6e 74 20 63 6f 64 65   Equivalent code
18c60 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 66 72   is available fr
18c70 6f 6d 20 52 53 41 20 44 61 74 61 20 53 65 63 75  om RSA Data Secu
18c80 72 69 74 79 2c 20 49 6e 63 2e 0a 20 2a 20 54 68  rity, Inc.. * Th
18c90 69 73 20 63 6f 64 65 20 68 61 73 20 62 65 65 6e  is code has been
18ca0 20 74 65 73 74 65 64 20 61 67 61 69 6e 73 74 20   tested against 
18cb0 74 68 61 74 2c 20 61 6e 64 20 69 73 20 65 71 75  that, and is equ
18cc0 69 76 61 6c 65 6e 74 2c 0a 20 2a 20 65 78 63 65  ivalent,. * exce
18cd0 70 74 20 74 68 61 74 20 79 6f 75 20 64 6f 6e 27  pt that you don'
18ce0 74 20 6e 65 65 64 20 74 6f 20 69 6e 63 6c 75 64  t need to includ
18cf0 65 20 74 77 6f 20 70 61 67 65 73 20 6f 66 20 6c  e two pages of l
18d00 65 67 61 6c 65 73 65 0a 20 2a 20 77 69 74 68 20  egalese. * with 
18d10 65 76 65 72 79 20 63 6f 70 79 2e 0a 20 2a 0a 20  every copy.. *. 
18d20 2a 20 54 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  * To compute the
18d30 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20   message digest 
18d40 6f 66 20 61 20 63 68 75 6e 6b 20 6f 66 20 62 79  of a chunk of by
18d50 74 65 73 2c 20 64 65 63 6c 61 72 65 20 61 6e 0a  tes, declare an.
18d60 20 2a 20 4d 44 35 43 6f 6e 74 65 78 74 20 73 74   * MD5Context st
18d70 72 75 63 74 75 72 65 2c 20 70 61 73 73 20 69 74  ructure, pass it
18d80 20 74 6f 20 4d 44 35 49 6e 69 74 2c 20 63 61 6c   to MD5Init, cal
18d90 6c 20 4d 44 35 55 70 64 61 74 65 20 61 73 0a 20  l MD5Update as. 
18da0 2a 20 6e 65 65 64 65 64 20 6f 6e 20 62 75 66 66  * needed on buff
18db0 65 72 73 20 66 75 6c 6c 20 6f 66 20 62 79 74 65  ers full of byte
18dc0 73 2c 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c  s, and then call
18dd0 20 4d 44 35 46 69 6e 61 6c 2c 20 77 68 69 63 68   MD5Final, which
18de0 0a 20 2a 20 77 69 6c 6c 20 66 69 6c 6c 20 61 20  . * will fill a 
18df0 73 75 70 70 6c 69 65 64 20 31 36 2d 62 79 74 65  supplied 16-byte
18e00 20 61 72 72 61 79 20 77 69 74 68 20 74 68 65 20   array with the 
18e10 64 69 67 65 73 74 2e 0a 20 2a 2f 0a 0a 2f 2a 0a  digest.. */../*.
18e20 20 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64 20 6f   * If compiled o
18e30 6e 20 61 20 6d 61 63 68 69 6e 65 20 74 68 61 74  n a machine that
18e40 20 64 6f 65 73 6e 27 74 20 68 61 76 65 20 61 20   doesn't have a 
18e50 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 0a  32-bit integer,.
18e60 20 2a 20 79 6f 75 20 6a 75 73 74 20 73 65 74 20   * you just set 
18e70 22 75 69 6e 74 33 32 22 20 74 6f 20 74 68 65 20  "uint32" to the 
18e80 61 70 70 72 6f 70 72 69 61 74 65 20 64 61 74 61  appropriate data
18e90 74 79 70 65 20 66 6f 72 20 61 6e 0a 20 2a 20 75  type for an. * u
18ea0 6e 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20 69  nsigned 32-bit i
18eb0 6e 74 65 67 65 72 2e 20 20 46 6f 72 20 65 78 61  nteger.  For exa
18ec0 6d 70 6c 65 3a 0a 20 2a 0a 20 2a 20 20 20 20 20  mple:. *. *     
18ed0 20 20 63 63 20 2d 44 75 69 6e 74 33 32 3d 27 75    cc -Duint32='u
18ee0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 27 20 6d 64  nsigned long' md
18ef0 35 2e 63 0a 20 2a 0a 20 2a 2f 0a 23 69 66 6e 64  5.c. *. */.#ifnd
18f00 65 66 20 75 69 6e 74 33 32 0a 23 20 20 64 65 66  ef uint32.#  def
18f10 69 6e 65 20 75 69 6e 74 33 32 20 75 6e 73 69 67  ine uint32 unsig
18f20 6e 65 64 20 69 6e 74 0a 23 65 6e 64 69 66 0a 0a  ned int.#endif..
18f30 73 74 72 75 63 74 20 4d 44 35 43 6f 6e 74 65 78  struct MD5Contex
18f40 74 20 7b 0a 20 20 69 6e 74 20 69 73 49 6e 69 74  t {.  int isInit
18f50 3b 0a 20 20 75 69 6e 74 33 32 20 62 75 66 5b 34  ;.  uint32 buf[4
18f60 5d 3b 0a 20 20 75 69 6e 74 33 32 20 62 69 74 73  ];.  uint32 bits
18f70 5b 32 5d 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  [2];.  unsigned 
18f80 63 68 61 72 20 69 6e 5b 36 34 5d 3b 0a 7d 3b 0a  char in[64];.};.
18f90 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 4d  typedef struct M
18fa0 44 35 43 6f 6e 74 65 78 74 20 4d 44 35 43 6f 6e  D5Context MD5Con
18fb0 74 65 78 74 3b 0a 0a 2f 2a 0a 20 2a 20 4e 6f 74  text;../*. * Not
18fc0 65 3a 20 74 68 69 73 20 63 6f 64 65 20 69 73 20  e: this code is 
18fd0 68 61 72 6d 6c 65 73 73 20 6f 6e 20 6c 69 74 74  harmless on litt
18fe0 6c 65 2d 65 6e 64 69 61 6e 20 6d 61 63 68 69 6e  le-endian machin
18ff0 65 73 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76  es.. */.static v
19000 6f 69 64 20 62 79 74 65 52 65 76 65 72 73 65 20  oid byteReverse 
19010 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
19020 62 75 66 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f  buf, unsigned lo
19030 6e 67 73 29 7b 0a 20 20 20 20 20 20 20 20 75 69  ngs){.        ui
19040 6e 74 33 32 20 74 3b 0a 20 20 20 20 20 20 20 20  nt32 t;.        
19050 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  do {.           
19060 20 20 20 20 20 74 20 3d 20 28 75 69 6e 74 33 32       t = (uint32
19070 29 28 28 75 6e 73 69 67 6e 65 64 29 62 75 66 5b  )((unsigned)buf[
19080 33 5d 3c 3c 38 20 7c 20 62 75 66 5b 32 5d 29 20  3]<<8 | buf[2]) 
19090 3c 3c 20 31 36 20 7c 0a 20 20 20 20 20 20 20 20  << 16 |.        
190a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190b0 20 20 20 20 28 28 75 6e 73 69 67 6e 65 64 29 62      ((unsigned)b
190c0 75 66 5b 31 5d 3c 3c 38 20 7c 20 62 75 66 5b 30  uf[1]<<8 | buf[0
190d0 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]);.            
190e0 20 20 20 20 2a 28 75 69 6e 74 33 32 20 2a 29 62      *(uint32 *)b
190f0 75 66 20 3d 20 74 3b 0a 20 20 20 20 20 20 20 20  uf = t;.        
19100 20 20 20 20 20 20 20 20 62 75 66 20 2b 3d 20 34          buf += 4
19110 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c  ;.        } whil
19120 65 20 28 2d 2d 6c 6f 6e 67 73 29 3b 0a 7d 0a 2f  e (--longs);.}./
19130 2a 20 54 68 65 20 66 6f 75 72 20 63 6f 72 65 20  * The four core 
19140 66 75 6e 63 74 69 6f 6e 73 20 2d 20 46 31 20 69  functions - F1 i
19150 73 20 6f 70 74 69 6d 69 7a 65 64 20 73 6f 6d 65  s optimized some
19160 77 68 61 74 20 2a 2f 0a 0a 2f 2a 20 23 64 65 66  what */../* #def
19170 69 6e 65 20 46 31 28 78 2c 20 79 2c 20 7a 29 20  ine F1(x, y, z) 
19180 28 78 20 26 20 79 20 7c 20 7e 78 20 26 20 7a 29  (x & y | ~x & z)
19190 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 31 28 78   */.#define F1(x
191a0 2c 20 79 2c 20 7a 29 20 28 7a 20 5e 20 28 78 20  , y, z) (z ^ (x 
191b0 26 20 28 79 20 5e 20 7a 29 29 29 0a 23 64 65 66  & (y ^ z))).#def
191c0 69 6e 65 20 46 32 28 78 2c 20 79 2c 20 7a 29 20  ine F2(x, y, z) 
191d0 46 31 28 7a 2c 20 78 2c 20 79 29 0a 23 64 65 66  F1(z, x, y).#def
191e0 69 6e 65 20 46 33 28 78 2c 20 79 2c 20 7a 29 20  ine F3(x, y, z) 
191f0 28 78 20 5e 20 79 20 5e 20 7a 29 0a 23 64 65 66  (x ^ y ^ z).#def
19200 69 6e 65 20 46 34 28 78 2c 20 79 2c 20 7a 29 20  ine F4(x, y, z) 
19210 28 79 20 5e 20 28 78 20 7c 20 7e 7a 29 29 0a 0a  (y ^ (x | ~z))..
19220 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 63  /* This is the c
19230 65 6e 74 72 61 6c 20 73 74 65 70 20 69 6e 20 74  entral step in t
19240 68 65 20 4d 44 35 20 61 6c 67 6f 72 69 74 68 6d  he MD5 algorithm
19250 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 44 35  . */.#define MD5
19260 53 54 45 50 28 66 2c 20 77 2c 20 78 2c 20 79 2c  STEP(f, w, x, y,
19270 20 7a 2c 20 64 61 74 61 2c 20 73 29 20 5c 0a 20   z, data, s) \. 
19280 20 20 20 20 20 20 20 28 20 77 20 2b 3d 20 66 28         ( w += f(
19290 78 2c 20 79 2c 20 7a 29 20 2b 20 64 61 74 61 2c  x, y, z) + data,
192a0 20 20 77 20 3d 20 77 3c 3c 73 20 7c 20 77 3e 3e    w = w<<s | w>>
192b0 28 33 32 2d 73 29 2c 20 20 77 20 2b 3d 20 78 20  (32-s),  w += x 
192c0 29 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 63 6f 72  )../*. * The cor
192d0 65 20 6f 66 20 74 68 65 20 4d 44 35 20 61 6c 67  e of the MD5 alg
192e0 6f 72 69 74 68 6d 2c 20 74 68 69 73 20 61 6c 74  orithm, this alt
192f0 65 72 73 20 61 6e 20 65 78 69 73 74 69 6e 67 20  ers an existing 
19300 4d 44 35 20 68 61 73 68 20 74 6f 0a 20 2a 20 72  MD5 hash to. * r
19310 65 66 6c 65 63 74 20 74 68 65 20 61 64 64 69 74  eflect the addit
19320 69 6f 6e 20 6f 66 20 31 36 20 6c 6f 6e 67 77 6f  ion of 16 longwo
19330 72 64 73 20 6f 66 20 6e 65 77 20 64 61 74 61 2e  rds of new data.
19340 20 20 4d 44 35 55 70 64 61 74 65 20 62 6c 6f 63    MD5Update bloc
19350 6b 73 0a 20 2a 20 74 68 65 20 64 61 74 61 20 61  ks. * the data a
19360 6e 64 20 63 6f 6e 76 65 72 74 73 20 62 79 74 65  nd converts byte
19370 73 20 69 6e 74 6f 20 6c 6f 6e 67 77 6f 72 64 73  s into longwords
19380 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e   for this routin
19390 65 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  e.. */.static vo
193a0 69 64 20 4d 44 35 54 72 61 6e 73 66 6f 72 6d 28  id MD5Transform(
193b0 75 69 6e 74 33 32 20 62 75 66 5b 34 5d 2c 20 63  uint32 buf[4], c
193c0 6f 6e 73 74 20 75 69 6e 74 33 32 20 69 6e 5b 31  onst uint32 in[1
193d0 36 5d 29 7b 0a 20 20 20 20 20 20 20 20 72 65 67  6]){.        reg
193e0 69 73 74 65 72 20 75 69 6e 74 33 32 20 61 2c 20  ister uint32 a, 
193f0 62 2c 20 63 2c 20 64 3b 0a 0a 20 20 20 20 20 20  b, c, d;..      
19400 20 20 61 20 3d 20 62 75 66 5b 30 5d 3b 0a 20 20    a = buf[0];.  
19410 20 20 20 20 20 20 62 20 3d 20 62 75 66 5b 31 5d        b = buf[1]
19420 3b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 62 75  ;.        c = bu
19430 66 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20 64 20  f[2];.        d 
19440 3d 20 62 75 66 5b 33 5d 3b 0a 0a 20 20 20 20 20  = buf[3];..     
19450 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 61     MD5STEP(F1, a
19460 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 30  , b, c, d, in[ 0
19470 5d 2b 30 78 64 37 36 61 61 34 37 38 2c 20 20 37  ]+0xd76aa478,  7
19480 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
19490 45 50 28 46 31 2c 20 64 2c 20 61 2c 20 62 2c 20  EP(F1, d, a, b, 
194a0 63 2c 20 69 6e 5b 20 31 5d 2b 30 78 65 38 63 37  c, in[ 1]+0xe8c7
194b0 62 37 35 36 2c 20 31 32 29 3b 0a 20 20 20 20 20  b756, 12);.     
194c0 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 63     MD5STEP(F1, c
194d0 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 32  , d, a, b, in[ 2
194e0 5d 2b 30 78 32 34 32 30 37 30 64 62 2c 20 31 37  ]+0x242070db, 17
194f0 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
19500 45 50 28 46 31 2c 20 62 2c 20 63 2c 20 64 2c 20  EP(F1, b, c, d, 
19510 61 2c 20 69 6e 5b 20 33 5d 2b 30 78 63 31 62 64  a, in[ 3]+0xc1bd
19520 63 65 65 65 2c 20 32 32 29 3b 0a 20 20 20 20 20  ceee, 22);.     
19530 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 61     MD5STEP(F1, a
19540 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 34  , b, c, d, in[ 4
19550 5d 2b 30 78 66 35 37 63 30 66 61 66 2c 20 20 37  ]+0xf57c0faf,  7
19560 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
19570 45 50 28 46 31 2c 20 64 2c 20 61 2c 20 62 2c 20  EP(F1, d, a, b, 
19580 63 2c 20 69 6e 5b 20 35 5d 2b 30 78 34 37 38 37  c, in[ 5]+0x4787
19590 63 36 32 61 2c 20 31 32 29 3b 0a 20 20 20 20 20  c62a, 12);.     
195a0 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 63     MD5STEP(F1, c
195b0 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 36  , d, a, b, in[ 6
195c0 5d 2b 30 78 61 38 33 30 34 36 31 33 2c 20 31 37  ]+0xa8304613, 17
195d0 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
195e0 45 50 28 46 31 2c 20 62 2c 20 63 2c 20 64 2c 20  EP(F1, b, c, d, 
195f0 61 2c 20 69 6e 5b 20 37 5d 2b 30 78 66 64 34 36  a, in[ 7]+0xfd46
19600 39 35 30 31 2c 20 32 32 29 3b 0a 20 20 20 20 20  9501, 22);.     
19610 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 61     MD5STEP(F1, a
19620 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 38  , b, c, d, in[ 8
19630 5d 2b 30 78 36 39 38 30 39 38 64 38 2c 20 20 37  ]+0x698098d8,  7
19640 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
19650 45 50 28 46 31 2c 20 64 2c 20 61 2c 20 62 2c 20  EP(F1, d, a, b, 
19660 63 2c 20 69 6e 5b 20 39 5d 2b 30 78 38 62 34 34  c, in[ 9]+0x8b44
19670 66 37 61 66 2c 20 31 32 29 3b 0a 20 20 20 20 20  f7af, 12);.     
19680 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 63     MD5STEP(F1, c
19690 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 30  , d, a, b, in[10
196a0 5d 2b 30 78 66 66 66 66 35 62 62 31 2c 20 31 37  ]+0xffff5bb1, 17
196b0 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
196c0 45 50 28 46 31 2c 20 62 2c 20 63 2c 20 64 2c 20  EP(F1, b, c, d, 
196d0 61 2c 20 69 6e 5b 31 31 5d 2b 30 78 38 39 35 63  a, in[11]+0x895c
196e0 64 37 62 65 2c 20 32 32 29 3b 0a 20 20 20 20 20  d7be, 22);.     
196f0 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 61     MD5STEP(F1, a
19700 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 31 32  , b, c, d, in[12
19710 5d 2b 30 78 36 62 39 30 31 31 32 32 2c 20 20 37  ]+0x6b901122,  7
19720 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
19730 45 50 28 46 31 2c 20 64 2c 20 61 2c 20 62 2c 20  EP(F1, d, a, b, 
19740 63 2c 20 69 6e 5b 31 33 5d 2b 30 78 66 64 39 38  c, in[13]+0xfd98
19750 37 31 39 33 2c 20 31 32 29 3b 0a 20 20 20 20 20  7193, 12);.     
19760 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 63     MD5STEP(F1, c
19770 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 34  , d, a, b, in[14
19780 5d 2b 30 78 61 36 37 39 34 33 38 65 2c 20 31 37  ]+0xa679438e, 17
19790 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
197a0 45 50 28 46 31 2c 20 62 2c 20 63 2c 20 64 2c 20  EP(F1, b, c, d, 
197b0 61 2c 20 69 6e 5b 31 35 5d 2b 30 78 34 39 62 34  a, in[15]+0x49b4
197c0 30 38 32 31 2c 20 32 32 29 3b 0a 0a 20 20 20 20  0821, 22);..    
197d0 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20      MD5STEP(F2, 
197e0 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20  a, b, c, d, in[ 
197f0 31 5d 2b 30 78 66 36 31 65 32 35 36 32 2c 20 20  1]+0xf61e2562,  
19800 35 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  5);.        MD5S
19810 54 45 50 28 46 32 2c 20 64 2c 20 61 2c 20 62 2c  TEP(F2, d, a, b,
19820 20 63 2c 20 69 6e 5b 20 36 5d 2b 30 78 63 30 34   c, in[ 6]+0xc04
19830 30 62 33 34 30 2c 20 20 39 29 3b 0a 20 20 20 20  0b340,  9);.    
19840 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20      MD5STEP(F2, 
19850 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31  c, d, a, b, in[1
19860 31 5d 2b 30 78 32 36 35 65 35 61 35 31 2c 20 31  1]+0x265e5a51, 1
19870 34 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  4);.        MD5S
19880 54 45 50 28 46 32 2c 20 62 2c 20 63 2c 20 64 2c  TEP(F2, b, c, d,
19890 20 61 2c 20 69 6e 5b 20 30 5d 2b 30 78 65 39 62   a, in[ 0]+0xe9b
198a0 36 63 37 61 61 2c 20 32 30 29 3b 0a 20 20 20 20  6c7aa, 20);.    
198b0 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20      MD5STEP(F2, 
198c0 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20  a, b, c, d, in[ 
198d0 35 5d 2b 30 78 64 36 32 66 31 30 35 64 2c 20 20  5]+0xd62f105d,  
198e0 35 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  5);.        MD5S
198f0 54 45 50 28 46 32 2c 20 64 2c 20 61 2c 20 62 2c  TEP(F2, d, a, b,
19900 20 63 2c 20 69 6e 5b 31 30 5d 2b 30 78 30 32 34   c, in[10]+0x024
19910 34 31 34 35 33 2c 20 20 39 29 3b 0a 20 20 20 20  41453,  9);.    
19920 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20      MD5STEP(F2, 
19930 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31  c, d, a, b, in[1
19940 35 5d 2b 30 78 64 38 61 31 65 36 38 31 2c 20 31  5]+0xd8a1e681, 1
19950 34 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  4);.        MD5S
19960 54 45 50 28 46 32 2c 20 62 2c 20 63 2c 20 64 2c  TEP(F2, b, c, d,
19970 20 61 2c 20 69 6e 5b 20 34 5d 2b 30 78 65 37 64   a, in[ 4]+0xe7d
19980 33 66 62 63 38 2c 20 32 30 29 3b 0a 20 20 20 20  3fbc8, 20);.    
19990 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20      MD5STEP(F2, 
199a0 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20  a, b, c, d, in[ 
199b0 39 5d 2b 30 78 32 31 65 31 63 64 65 36 2c 20 20  9]+0x21e1cde6,  
199c0 35 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  5);.        MD5S
199d0 54 45 50 28 46 32 2c 20 64 2c 20 61 2c 20 62 2c  TEP(F2, d, a, b,
199e0 20 63 2c 20 69 6e 5b 31 34 5d 2b 30 78 63 33 33   c, in[14]+0xc33
199f0 37 30 37 64 36 2c 20 20 39 29 3b 0a 20 20 20 20  707d6,  9);.    
19a00 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20      MD5STEP(F2, 
19a10 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20  c, d, a, b, in[ 
19a20 33 5d 2b 30 78 66 34 64 35 30 64 38 37 2c 20 31  3]+0xf4d50d87, 1
19a30 34 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  4);.        MD5S
19a40 54 45 50 28 46 32 2c 20 62 2c 20 63 2c 20 64 2c  TEP(F2, b, c, d,
19a50 20 61 2c 20 69 6e 5b 20 38 5d 2b 30 78 34 35 35   a, in[ 8]+0x455
19a60 61 31 34 65 64 2c 20 32 30 29 3b 0a 20 20 20 20  a14ed, 20);.    
19a70 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20      MD5STEP(F2, 
19a80 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 31  a, b, c, d, in[1
19a90 33 5d 2b 30 78 61 39 65 33 65 39 30 35 2c 20 20  3]+0xa9e3e905,  
19aa0 35 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  5);.        MD5S
19ab0 54 45 50 28 46 32 2c 20 64 2c 20 61 2c 20 62 2c  TEP(F2, d, a, b,
19ac0 20 63 2c 20 69 6e 5b 20 32 5d 2b 30 78 66 63 65   c, in[ 2]+0xfce
19ad0 66 61 33 66 38 2c 20 20 39 29 3b 0a 20 20 20 20  fa3f8,  9);.    
19ae0 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20      MD5STEP(F2, 
19af0 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20  c, d, a, b, in[ 
19b00 37 5d 2b 30 78 36 37 36 66 30 32 64 39 2c 20 31  7]+0x676f02d9, 1
19b10 34 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  4);.        MD5S
19b20 54 45 50 28 46 32 2c 20 62 2c 20 63 2c 20 64 2c  TEP(F2, b, c, d,
19b30 20 61 2c 20 69 6e 5b 31 32 5d 2b 30 78 38 64 32   a, in[12]+0x8d2
19b40 61 34 63 38 61 2c 20 32 30 29 3b 0a 0a 20 20 20  a4c8a, 20);..   
19b50 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c       MD5STEP(F3,
19b60 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b   a, b, c, d, in[
19b70 20 35 5d 2b 30 78 66 66 66 61 33 39 34 32 2c 20   5]+0xfffa3942, 
19b80 20 34 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35   4);.        MD5
19b90 53 54 45 50 28 46 33 2c 20 64 2c 20 61 2c 20 62  STEP(F3, d, a, b
19ba0 2c 20 63 2c 20 69 6e 5b 20 38 5d 2b 30 78 38 37  , c, in[ 8]+0x87
19bb0 37 31 66 36 38 31 2c 20 31 31 29 3b 0a 20 20 20  71f681, 11);.   
19bc0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c       MD5STEP(F3,
19bd0 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b   c, d, a, b, in[
19be0 31 31 5d 2b 30 78 36 64 39 64 36 31 32 32 2c 20  11]+0x6d9d6122, 
19bf0 31 36 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  16);.        MD5
19c00 53 54 45 50 28 46 33 2c 20 62 2c 20 63 2c 20 64  STEP(F3, b, c, d
19c10 2c 20 61 2c 20 69 6e 5b 31 34 5d 2b 30 78 66 64  , a, in[14]+0xfd
19c20 65 35 33 38 30 63 2c 20 32 33 29 3b 0a 20 20 20  e5380c, 23);.   
19c30 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c       MD5STEP(F3,
19c40 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b   a, b, c, d, in[
19c50 20 31 5d 2b 30 78 61 34 62 65 65 61 34 34 2c 20   1]+0xa4beea44, 
19c60 20 34 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35   4);.        MD5
19c70 53 54 45 50 28 46 33 2c 20 64 2c 20 61 2c 20 62  STEP(F3, d, a, b
19c80 2c 20 63 2c 20 69 6e 5b 20 34 5d 2b 30 78 34 62  , c, in[ 4]+0x4b
19c90 64 65 63 66 61 39 2c 20 31 31 29 3b 0a 20 20 20  decfa9, 11);.   
19ca0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c       MD5STEP(F3,
19cb0 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b   c, d, a, b, in[
19cc0 20 37 5d 2b 30 78 66 36 62 62 34 62 36 30 2c 20   7]+0xf6bb4b60, 
19cd0 31 36 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  16);.        MD5
19ce0 53 54 45 50 28 46 33 2c 20 62 2c 20 63 2c 20 64  STEP(F3, b, c, d
19cf0 2c 20 61 2c 20 69 6e 5b 31 30 5d 2b 30 78 62 65  , a, in[10]+0xbe
19d00 62 66 62 63 37 30 2c 20 32 33 29 3b 0a 20 20 20  bfbc70, 23);.   
19d10 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c       MD5STEP(F3,
19d20 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b   a, b, c, d, in[
19d30 31 33 5d 2b 30 78 32 38 39 62 37 65 63 36 2c 20  13]+0x289b7ec6, 
19d40 20 34 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35   4);.        MD5
19d50 53 54 45 50 28 46 33 2c 20 64 2c 20 61 2c 20 62  STEP(F3, d, a, b
19d60 2c 20 63 2c 20 69 6e 5b 20 30 5d 2b 30 78 65 61  , c, in[ 0]+0xea
19d70 61 31 32 37 66 61 2c 20 31 31 29 3b 0a 20 20 20  a127fa, 11);.   
19d80 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c       MD5STEP(F3,
19d90 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b   c, d, a, b, in[
19da0 20 33 5d 2b 30 78 64 34 65 66 33 30 38 35 2c 20   3]+0xd4ef3085, 
19db0 31 36 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  16);.        MD5
19dc0 53 54 45 50 28 46 33 2c 20 62 2c 20 63 2c 20 64  STEP(F3, b, c, d
19dd0 2c 20 61 2c 20 69 6e 5b 20 36 5d 2b 30 78 30 34  , a, in[ 6]+0x04
19de0 38 38 31 64 30 35 2c 20 32 33 29 3b 0a 20 20 20  881d05, 23);.   
19df0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c       MD5STEP(F3,
19e00 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b   a, b, c, d, in[
19e10 20 39 5d 2b 30 78 64 39 64 34 64 30 33 39 2c 20   9]+0xd9d4d039, 
19e20 20 34 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35   4);.        MD5
19e30 53 54 45 50 28 46 33 2c 20 64 2c 20 61 2c 20 62  STEP(F3, d, a, b
19e40 2c 20 63 2c 20 69 6e 5b 31 32 5d 2b 30 78 65 36  , c, in[12]+0xe6
19e50 64 62 39 39 65 35 2c 20 31 31 29 3b 0a 20 20 20  db99e5, 11);.   
19e60 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c       MD5STEP(F3,
19e70 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b   c, d, a, b, in[
19e80 31 35 5d 2b 30 78 31 66 61 32 37 63 66 38 2c 20  15]+0x1fa27cf8, 
19e90 31 36 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  16);.        MD5
19ea0 53 54 45 50 28 46 33 2c 20 62 2c 20 63 2c 20 64  STEP(F3, b, c, d
19eb0 2c 20 61 2c 20 69 6e 5b 20 32 5d 2b 30 78 63 34  , a, in[ 2]+0xc4
19ec0 61 63 35 36 36 35 2c 20 32 33 29 3b 0a 0a 20 20  ac5665, 23);..  
19ed0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34        MD5STEP(F4
19ee0 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e  , a, b, c, d, in
19ef0 5b 20 30 5d 2b 30 78 66 34 32 39 32 32 34 34 2c  [ 0]+0xf4292244,
19f00 20 20 36 29 3b 0a 20 20 20 20 20 20 20 20 4d 44    6);.        MD
19f10 35 53 54 45 50 28 46 34 2c 20 64 2c 20 61 2c 20  5STEP(F4, d, a, 
19f20 62 2c 20 63 2c 20 69 6e 5b 20 37 5d 2b 30 78 34  b, c, in[ 7]+0x4
19f30 33 32 61 66 66 39 37 2c 20 31 30 29 3b 0a 20 20  32aff97, 10);.  
19f40 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34        MD5STEP(F4
19f50 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e  , c, d, a, b, in
19f60 5b 31 34 5d 2b 30 78 61 62 39 34 32 33 61 37 2c  [14]+0xab9423a7,
19f70 20 31 35 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   15);.        MD
19f80 35 53 54 45 50 28 46 34 2c 20 62 2c 20 63 2c 20  5STEP(F4, b, c, 
19f90 64 2c 20 61 2c 20 69 6e 5b 20 35 5d 2b 30 78 66  d, a, in[ 5]+0xf
19fa0 63 39 33 61 30 33 39 2c 20 32 31 29 3b 0a 20 20  c93a039, 21);.  
19fb0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34        MD5STEP(F4
19fc0 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e  , a, b, c, d, in
19fd0 5b 31 32 5d 2b 30 78 36 35 35 62 35 39 63 33 2c  [12]+0x655b59c3,
19fe0 20 20 36 29 3b 0a 20 20 20 20 20 20 20 20 4d 44    6);.        MD
19ff0 35 53 54 45 50 28 46 34 2c 20 64 2c 20 61 2c 20  5STEP(F4, d, a, 
1a000 62 2c 20 63 2c 20 69 6e 5b 20 33 5d 2b 30 78 38  b, c, in[ 3]+0x8
1a010 66 30 63 63 63 39 32 2c 20 31 30 29 3b 0a 20 20  f0ccc92, 10);.  
1a020 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34        MD5STEP(F4
1a030 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e  , c, d, a, b, in
1a040 5b 31 30 5d 2b 30 78 66 66 65 66 66 34 37 64 2c  [10]+0xffeff47d,
1a050 20 31 35 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   15);.        MD
1a060 35 53 54 45 50 28 46 34 2c 20 62 2c 20 63 2c 20  5STEP(F4, b, c, 
1a070 64 2c 20 61 2c 20 69 6e 5b 20 31 5d 2b 30 78 38  d, a, in[ 1]+0x8
1a080 35 38 34 35 64 64 31 2c 20 32 31 29 3b 0a 20 20  5845dd1, 21);.  
1a090 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34        MD5STEP(F4
1a0a0 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e  , a, b, c, d, in
1a0b0 5b 20 38 5d 2b 30 78 36 66 61 38 37 65 34 66 2c  [ 8]+0x6fa87e4f,
1a0c0 20 20 36 29 3b 0a 20 20 20 20 20 20 20 20 4d 44    6);.        MD
1a0d0 35 53 54 45 50 28 46 34 2c 20 64 2c 20 61 2c 20  5STEP(F4, d, a, 
1a0e0 62 2c 20 63 2c 20 69 6e 5b 31 35 5d 2b 30 78 66  b, c, in[15]+0xf
1a0f0 65 32 63 65 36 65 30 2c 20 31 30 29 3b 0a 20 20  e2ce6e0, 10);.  
1a100 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34        MD5STEP(F4
1a110 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e  , c, d, a, b, in
1a120 5b 20 36 5d 2b 30 78 61 33 30 31 34 33 31 34 2c  [ 6]+0xa3014314,
1a130 20 31 35 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   15);.        MD
1a140 35 53 54 45 50 28 46 34 2c 20 62 2c 20 63 2c 20  5STEP(F4, b, c, 
1a150 64 2c 20 61 2c 20 69 6e 5b 31 33 5d 2b 30 78 34  d, a, in[13]+0x4
1a160 65 30 38 31 31 61 31 2c 20 32 31 29 3b 0a 20 20  e0811a1, 21);.  
1a170 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34        MD5STEP(F4
1a180 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e  , a, b, c, d, in
1a190 5b 20 34 5d 2b 30 78 66 37 35 33 37 65 38 32 2c  [ 4]+0xf7537e82,
1a1a0 20 20 36 29 3b 0a 20 20 20 20 20 20 20 20 4d 44    6);.        MD
1a1b0 35 53 54 45 50 28 46 34 2c 20 64 2c 20 61 2c 20  5STEP(F4, d, a, 
1a1c0 62 2c 20 63 2c 20 69 6e 5b 31 31 5d 2b 30 78 62  b, c, in[11]+0xb
1a1d0 64 33 61 66 32 33 35 2c 20 31 30 29 3b 0a 20 20  d3af235, 10);.  
1a1e0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34        MD5STEP(F4
1a1f0 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e  , c, d, a, b, in
1a200 5b 20 32 5d 2b 30 78 32 61 64 37 64 32 62 62 2c  [ 2]+0x2ad7d2bb,
1a210 20 31 35 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   15);.        MD
1a220 35 53 54 45 50 28 46 34 2c 20 62 2c 20 63 2c 20  5STEP(F4, b, c, 
1a230 64 2c 20 61 2c 20 69 6e 5b 20 39 5d 2b 30 78 65  d, a, in[ 9]+0xe
1a240 62 38 36 64 33 39 31 2c 20 32 31 29 3b 0a 0a 20  b86d391, 21);.. 
1a250 20 20 20 20 20 20 20 62 75 66 5b 30 5d 20 2b 3d         buf[0] +=
1a260 20 61 3b 0a 20 20 20 20 20 20 20 20 62 75 66 5b   a;.        buf[
1a270 31 5d 20 2b 3d 20 62 3b 0a 20 20 20 20 20 20 20  1] += b;.       
1a280 20 62 75 66 5b 32 5d 20 2b 3d 20 63 3b 0a 20 20   buf[2] += c;.  
1a290 20 20 20 20 20 20 62 75 66 5b 33 5d 20 2b 3d 20        buf[3] += 
1a2a0 64 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 74 61 72  d;.}../*. * Star
1a2b0 74 20 4d 44 35 20 61 63 63 75 6d 75 6c 61 74 69  t MD5 accumulati
1a2c0 6f 6e 2e 20 20 53 65 74 20 62 69 74 20 63 6f 75  on.  Set bit cou
1a2d0 6e 74 20 74 6f 20 30 20 61 6e 64 20 62 75 66 66  nt to 0 and buff
1a2e0 65 72 20 74 6f 20 6d 79 73 74 65 72 69 6f 75 73  er to mysterious
1a2f0 0a 20 2a 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  . * initializati
1a300 6f 6e 20 63 6f 6e 73 74 61 6e 74 73 2e 0a 20 2a  on constants.. *
1a310 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 4d 44  /.static void MD
1a320 35 49 6e 69 74 28 4d 44 35 43 6f 6e 74 65 78 74  5Init(MD5Context
1a330 20 2a 63 74 78 29 7b 0a 20 20 20 20 20 20 20 20   *ctx){.        
1a340 63 74 78 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b  ctx->isInit = 1;
1a350 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62 75  .        ctx->bu
1a360 66 5b 30 5d 20 3d 20 30 78 36 37 34 35 32 33 30  f[0] = 0x6745230
1a370 31 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e  1;.        ctx->
1a380 62 75 66 5b 31 5d 20 3d 20 30 78 65 66 63 64 61  buf[1] = 0xefcda
1a390 62 38 39 3b 0a 20 20 20 20 20 20 20 20 63 74 78  b89;.        ctx
1a3a0 2d 3e 62 75 66 5b 32 5d 20 3d 20 30 78 39 38 62  ->buf[2] = 0x98b
1a3b0 61 64 63 66 65 3b 0a 20 20 20 20 20 20 20 20 63  adcfe;.        c
1a3c0 74 78 2d 3e 62 75 66 5b 33 5d 20 3d 20 30 78 31  tx->buf[3] = 0x1
1a3d0 30 33 32 35 34 37 36 3b 0a 20 20 20 20 20 20 20  0325476;.       
1a3e0 20 63 74 78 2d 3e 62 69 74 73 5b 30 5d 20 3d 20   ctx->bits[0] = 
1a3f0 30 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e  0;.        ctx->
1a400 62 69 74 73 5b 31 5d 20 3d 20 30 3b 0a 7d 0a 0a  bits[1] = 0;.}..
1a410 2f 2a 0a 20 2a 20 55 70 64 61 74 65 20 63 6f 6e  /*. * Update con
1a420 74 65 78 74 20 74 6f 20 72 65 66 6c 65 63 74 20  text to reflect 
1a430 74 68 65 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f  the concatenatio
1a440 6e 20 6f 66 20 61 6e 6f 74 68 65 72 20 62 75 66  n of another buf
1a450 66 65 72 20 66 75 6c 6c 0a 20 2a 20 6f 66 20 62  fer full. * of b
1a460 79 74 65 73 2e 0a 20 2a 2f 0a 73 74 61 74 69 63  ytes.. */.static
1a470 20 0a 76 6f 69 64 20 4d 44 35 55 70 64 61 74 65   .void MD5Update
1a480 28 4d 44 35 43 6f 6e 74 65 78 74 20 2a 63 74 78  (MD5Context *ctx
1a490 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  , const unsigned
1a4a0 20 63 68 61 72 20 2a 62 75 66 2c 20 75 6e 73 69   char *buf, unsi
1a4b0 67 6e 65 64 20 69 6e 74 20 6c 65 6e 29 7b 0a 20  gned int len){. 
1a4c0 20 20 20 20 20 20 20 75 69 6e 74 33 32 20 74 3b         uint32 t;
1a4d0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 70 64  ..        /* Upd
1a4e0 61 74 65 20 62 69 74 63 6f 75 6e 74 20 2a 2f 0a  ate bitcount */.
1a4f0 0a 20 20 20 20 20 20 20 20 74 20 3d 20 63 74 78  .        t = ctx
1a500 2d 3e 62 69 74 73 5b 30 5d 3b 0a 20 20 20 20 20  ->bits[0];.     
1a510 20 20 20 69 66 20 28 28 63 74 78 2d 3e 62 69 74     if ((ctx->bit
1a520 73 5b 30 5d 20 3d 20 74 20 2b 20 28 28 75 69 6e  s[0] = t + ((uin
1a530 74 33 32 29 6c 65 6e 20 3c 3c 20 33 29 29 20 3c  t32)len << 3)) <
1a540 20 74 29 0a 20 20 20 20 20 20 20 20 20 20 20 20   t).            
1a550 20 20 20 20 63 74 78 2d 3e 62 69 74 73 5b 31 5d      ctx->bits[1]
1a560 2b 2b 3b 20 2f 2a 20 43 61 72 72 79 20 66 72 6f  ++; /* Carry fro
1a570 6d 20 6c 6f 77 20 74 6f 20 68 69 67 68 20 2a 2f  m low to high */
1a580 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62 69  .        ctx->bi
1a590 74 73 5b 31 5d 20 2b 3d 20 6c 65 6e 20 3e 3e 20  ts[1] += len >> 
1a5a0 32 39 3b 0a 0a 20 20 20 20 20 20 20 20 74 20 3d  29;..        t =
1a5b0 20 28 74 20 3e 3e 20 33 29 20 26 20 30 78 33 66   (t >> 3) & 0x3f
1a5c0 3b 20 20 20 20 2f 2a 20 42 79 74 65 73 20 61 6c  ;    /* Bytes al
1a5d0 72 65 61 64 79 20 69 6e 20 73 68 73 49 6e 66 6f  ready in shsInfo
1a5e0 2d 3e 64 61 74 61 20 2a 2f 0a 0a 20 20 20 20 20  ->data */..     
1a5f0 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 61 6e 79     /* Handle any
1a600 20 6c 65 61 64 69 6e 67 20 6f 64 64 2d 73 69 7a   leading odd-siz
1a610 65 64 20 63 68 75 6e 6b 73 20 2a 2f 0a 0a 20 20  ed chunks */..  
1a620 20 20 20 20 20 20 69 66 20 28 20 74 20 29 20 7b        if ( t ) {
1a630 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a640 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1a650 70 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  p = (unsigned ch
1a660 61 72 20 2a 29 63 74 78 2d 3e 69 6e 20 2b 20 74  ar *)ctx->in + t
1a670 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
1a680 20 20 20 74 20 3d 20 36 34 2d 74 3b 0a 20 20 20     t = 64-t;.   
1a690 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
1a6a0 28 6c 65 6e 20 3c 20 74 29 20 7b 0a 20 20 20 20  (len < t) {.    
1a6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6c0 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 62 75      memcpy(p, bu
1a6d0 66 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 20 20 20  f, len);.       
1a6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6f0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
1a700 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1a710 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
1a720 79 28 70 2c 20 62 75 66 2c 20 74 29 3b 0a 20 20  y(p, buf, t);.  
1a730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 79                by
1a740 74 65 52 65 76 65 72 73 65 28 63 74 78 2d 3e 69  teReverse(ctx->i
1a750 6e 2c 20 31 36 29 3b 0a 20 20 20 20 20 20 20 20  n, 16);.        
1a760 20 20 20 20 20 20 20 20 4d 44 35 54 72 61 6e 73          MD5Trans
1a770 66 6f 72 6d 28 63 74 78 2d 3e 62 75 66 2c 20 28  form(ctx->buf, (
1a780 75 69 6e 74 33 32 20 2a 29 63 74 78 2d 3e 69 6e  uint32 *)ctx->in
1a790 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1a7a0 20 20 20 62 75 66 20 2b 3d 20 74 3b 0a 20 20 20     buf += t;.   
1a7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 6e               len
1a7c0 20 2d 3d 20 74 3b 0a 20 20 20 20 20 20 20 20 7d   -= t;.        }
1a7d0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f  ..        /* Pro
1a7e0 63 65 73 73 20 64 61 74 61 20 69 6e 20 36 34 2d  cess data in 64-
1a7f0 62 79 74 65 20 63 68 75 6e 6b 73 20 2a 2f 0a 0a  byte chunks */..
1a800 20 20 20 20 20 20 20 20 77 68 69 6c 65 20 28 6c          while (l
1a810 65 6e 20 3e 3d 20 36 34 29 20 7b 0a 20 20 20 20  en >= 64) {.    
1a820 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
1a830 70 79 28 63 74 78 2d 3e 69 6e 2c 20 62 75 66 2c  py(ctx->in, buf,
1a840 20 36 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20   64);.          
1a850 20 20 20 20 20 20 62 79 74 65 52 65 76 65 72 73        byteRevers
1a860 65 28 63 74 78 2d 3e 69 6e 2c 20 31 36 29 3b 0a  e(ctx->in, 16);.
1a870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a880 4d 44 35 54 72 61 6e 73 66 6f 72 6d 28 63 74 78  MD5Transform(ctx
1a890 2d 3e 62 75 66 2c 20 28 75 69 6e 74 33 32 20 2a  ->buf, (uint32 *
1a8a0 29 63 74 78 2d 3e 69 6e 29 3b 0a 20 20 20 20 20  )ctx->in);.     
1a8b0 20 20 20 20 20 20 20 20 20 20 20 62 75 66 20 2b             buf +
1a8c0 3d 20 36 34 3b 0a 20 20 20 20 20 20 20 20 20 20  = 64;.          
1a8d0 20 20 20 20 20 20 6c 65 6e 20 2d 3d 20 36 34 3b        len -= 64;
1a8e0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
1a8f0 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 61 6e      /* Handle an
1a900 79 20 72 65 6d 61 69 6e 69 6e 67 20 62 79 74 65  y remaining byte
1a910 73 20 6f 66 20 64 61 74 61 2e 20 2a 2f 0a 0a 20  s of data. */.. 
1a920 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 63 74         memcpy(ct
1a930 78 2d 3e 69 6e 2c 20 62 75 66 2c 20 6c 65 6e 29  x->in, buf, len)
1a940 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 46 69 6e 61 6c  ;.}../*. * Final
1a950 20 77 72 61 70 75 70 20 2d 20 70 61 64 20 74 6f   wrapup - pad to
1a960 20 36 34 2d 62 79 74 65 20 62 6f 75 6e 64 61 72   64-byte boundar
1a970 79 20 77 69 74 68 20 74 68 65 20 62 69 74 20 70  y with the bit p
1a980 61 74 74 65 72 6e 20 0a 20 2a 20 31 20 30 2a 20  attern . * 1 0* 
1a990 28 36 34 2d 62 69 74 20 63 6f 75 6e 74 20 6f 66  (64-bit count of
1a9a0 20 62 69 74 73 20 70 72 6f 63 65 73 73 65 64 2c   bits processed,
1a9b0 20 4d 53 42 2d 66 69 72 73 74 29 0a 20 2a 2f 0a   MSB-first). */.
1a9c0 73 74 61 74 69 63 20 76 6f 69 64 20 4d 44 35 46  static void MD5F
1a9d0 69 6e 61 6c 28 75 6e 73 69 67 6e 65 64 20 63 68  inal(unsigned ch
1a9e0 61 72 20 64 69 67 65 73 74 5b 31 36 5d 2c 20 4d  ar digest[16], M
1a9f0 44 35 43 6f 6e 74 65 78 74 20 2a 63 74 78 29 7b  D5Context *ctx){
1aa00 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65  .        unsigne
1aa10 64 20 63 6f 75 6e 74 3b 0a 20 20 20 20 20 20 20  d count;.       
1aa20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1aa30 70 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43  p;..        /* C
1aa40 6f 6d 70 75 74 65 20 6e 75 6d 62 65 72 20 6f 66  ompute number of
1aa50 20 62 79 74 65 73 20 6d 6f 64 20 36 34 20 2a 2f   bytes mod 64 */
1aa60 0a 20 20 20 20 20 20 20 20 63 6f 75 6e 74 20 3d  .        count =
1aa70 20 28 63 74 78 2d 3e 62 69 74 73 5b 30 5d 20 3e   (ctx->bits[0] >
1aa80 3e 20 33 29 20 26 20 30 78 33 46 3b 0a 0a 20 20  > 3) & 0x3F;..  
1aa90 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65        /* Set the
1aaa0 20 66 69 72 73 74 20 63 68 61 72 20 6f 66 20 70   first char of p
1aab0 61 64 64 69 6e 67 20 74 6f 20 30 78 38 30 2e 20  adding to 0x80. 
1aac0 20 54 68 69 73 20 69 73 20 73 61 66 65 20 73 69   This is safe si
1aad0 6e 63 65 20 74 68 65 72 65 20 69 73 0a 20 20 20  nce there is.   
1aae0 20 20 20 20 20 20 20 20 61 6c 77 61 79 73 20 61          always a
1aaf0 74 20 6c 65 61 73 74 20 6f 6e 65 20 62 79 74 65  t least one byte
1ab00 20 66 72 65 65 20 2a 2f 0a 20 20 20 20 20 20 20   free */.       
1ab10 20 70 20 3d 20 63 74 78 2d 3e 69 6e 20 2b 20 63   p = ctx->in + c
1ab20 6f 75 6e 74 3b 0a 20 20 20 20 20 20 20 20 2a 70  ount;.        *p
1ab30 2b 2b 20 3d 20 30 78 38 30 3b 0a 0a 20 20 20 20  ++ = 0x80;..    
1ab40 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
1ab50 70 61 64 64 69 6e 67 20 6e 65 65 64 65 64 20 74  padding needed t
1ab60 6f 20 6d 61 6b 65 20 36 34 20 62 79 74 65 73 20  o make 64 bytes 
1ab70 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 75 6e 74  */.        count
1ab80 20 3d 20 36 34 20 2d 20 31 20 2d 20 63 6f 75 6e   = 64 - 1 - coun
1ab90 74 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 50  t;..        /* P
1aba0 61 64 20 6f 75 74 20 74 6f 20 35 36 20 6d 6f 64  ad out to 56 mod
1abb0 20 36 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 69   64 */.        i
1abc0 66 20 28 63 6f 75 6e 74 20 3c 20 38 29 20 7b 0a  f (count < 8) {.
1abd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1abe0 2f 2a 20 54 77 6f 20 6c 6f 74 73 20 6f 66 20 70  /* Two lots of p
1abf0 61 64 64 69 6e 67 3a 20 20 50 61 64 20 74 68 65  adding:  Pad the
1ac00 20 66 69 72 73 74 20 62 6c 6f 63 6b 20 74 6f 20   first block to 
1ac10 36 34 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  64 bytes */.    
1ac20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73              mems
1ac30 65 74 28 70 2c 20 30 2c 20 63 6f 75 6e 74 29 3b  et(p, 0, count);
1ac40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ac50 20 62 79 74 65 52 65 76 65 72 73 65 28 63 74 78   byteReverse(ctx
1ac60 2d 3e 69 6e 2c 20 31 36 29 3b 0a 20 20 20 20 20  ->in, 16);.     
1ac70 20 20 20 20 20 20 20 20 20 20 20 4d 44 35 54 72             MD5Tr
1ac80 61 6e 73 66 6f 72 6d 28 63 74 78 2d 3e 62 75 66  ansform(ctx->buf
1ac90 2c 20 28 75 69 6e 74 33 32 20 2a 29 63 74 78 2d  , (uint32 *)ctx-
1aca0 3e 69 6e 29 3b 0a 0a 20 20 20 20 20 20 20 20 20  >in);..         
1acb0 20 20 20 20 20 20 20 2f 2a 20 4e 6f 77 20 66 69         /* Now fi
1acc0 6c 6c 20 74 68 65 20 6e 65 78 74 20 62 6c 6f 63  ll the next bloc
1acd0 6b 20 77 69 74 68 20 35 36 20 62 79 74 65 73 20  k with 56 bytes 
1ace0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
1acf0 20 20 20 6d 65 6d 73 65 74 28 63 74 78 2d 3e 69     memset(ctx->i
1ad00 6e 2c 20 30 2c 20 35 36 29 3b 0a 20 20 20 20 20  n, 0, 56);.     
1ad10 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
1ad20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1ad30 61 64 20 62 6c 6f 63 6b 20 74 6f 20 35 36 20 62  ad block to 56 b
1ad40 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ytes */.        
1ad50 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70          memset(p
1ad60 2c 20 30 2c 20 63 6f 75 6e 74 2d 38 29 3b 0a 20  , 0, count-8);. 
1ad70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1ad80 20 62 79 74 65 52 65 76 65 72 73 65 28 63 74 78   byteReverse(ctx
1ad90 2d 3e 69 6e 2c 20 31 34 29 3b 0a 0a 20 20 20 20  ->in, 14);..    
1ada0 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 6c 65      /* Append le
1adb0 6e 67 74 68 20 69 6e 20 62 69 74 73 20 61 6e 64  ngth in bits and
1adc0 20 74 72 61 6e 73 66 6f 72 6d 20 2a 2f 0a 20 20   transform */.  
1add0 20 20 20 20 20 20 28 28 75 69 6e 74 33 32 20 2a        ((uint32 *
1ade0 29 63 74 78 2d 3e 69 6e 29 5b 20 31 34 20 5d 20  )ctx->in)[ 14 ] 
1adf0 3d 20 63 74 78 2d 3e 62 69 74 73 5b 30 5d 3b 0a  = ctx->bits[0];.
1ae00 20 20 20 20 20 20 20 20 28 28 75 69 6e 74 33 32          ((uint32
1ae10 20 2a 29 63 74 78 2d 3e 69 6e 29 5b 20 31 35 20   *)ctx->in)[ 15 
1ae20 5d 20 3d 20 63 74 78 2d 3e 62 69 74 73 5b 31 5d  ] = ctx->bits[1]
1ae30 3b 0a 0a 20 20 20 20 20 20 20 20 4d 44 35 54 72  ;..        MD5Tr
1ae40 61 6e 73 66 6f 72 6d 28 63 74 78 2d 3e 62 75 66  ansform(ctx->buf
1ae50 2c 20 28 75 69 6e 74 33 32 20 2a 29 63 74 78 2d  , (uint32 *)ctx-
1ae60 3e 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 62 79  >in);.        by
1ae70 74 65 52 65 76 65 72 73 65 28 28 75 6e 73 69 67  teReverse((unsig
1ae80 6e 65 64 20 63 68 61 72 20 2a 29 63 74 78 2d 3e  ned char *)ctx->
1ae90 62 75 66 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  buf, 4);.       
1aea0 20 6d 65 6d 63 70 79 28 64 69 67 65 73 74 2c 20   memcpy(digest, 
1aeb0 63 74 78 2d 3e 62 75 66 2c 20 31 36 29 3b 0a 20  ctx->buf, 16);. 
1aec0 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 63 74         memset(ct
1aed0 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 63 74 78  x, 0, sizeof(ctx
1aee0 29 29 3b 20 20 20 20 2f 2a 20 49 6e 20 63 61 73  ));    /* In cas
1aef0 65 20 69 74 20 69 73 20 73 65 6e 73 69 74 69 76  e it is sensitiv
1af00 65 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  e */.}../*.** Co
1af10 6e 76 65 72 74 20 61 20 31 32 38 2d 62 69 74 20  nvert a 128-bit 
1af20 4d 44 35 20 64 69 67 65 73 74 20 69 6e 74 6f 20  MD5 digest into 
1af30 61 20 33 32 2d 64 69 67 69 74 20 62 61 73 65 2d  a 32-digit base-
1af40 31 36 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74  16 number..*/.st
1af50 61 74 69 63 20 76 6f 69 64 20 4d 44 35 44 69 67  atic void MD5Dig
1af60 65 73 74 54 6f 42 61 73 65 31 36 28 75 6e 73 69  estToBase16(unsi
1af70 67 6e 65 64 20 63 68 61 72 20 2a 64 69 67 65 73  gned char *diges
1af80 74 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  t, char *zBuf){.
1af90 20 20 73 74 61 74 69 63 20 63 68 61 72 20 63 6f    static char co
1afa0 6e 73 74 20 7a 45 6e 63 6f 64 65 5b 5d 20 3d 20  nst zEncode[] = 
1afb0 22 30 31 32 33 34 35 36 37 38 39 61 62 63 64 65  "0123456789abcde
1afc0 66 22 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  f";.  int i, j;.
1afd0 0a 20 20 66 6f 72 28 6a 3d 69 3d 30 3b 20 69 3c  .  for(j=i=0; i<
1afe0 31 36 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  16; i++){.    in
1aff0 74 20 61 20 3d 20 64 69 67 65 73 74 5b 69 5d 3b  t a = digest[i];
1b000 0a 20 20 20 20 7a 42 75 66 5b 6a 2b 2b 5d 20 3d  .    zBuf[j++] =
1b010 20 7a 45 6e 63 6f 64 65 5b 28 61 3e 3e 34 29 26   zEncode[(a>>4)&
1b020 30 78 66 5d 3b 0a 20 20 20 20 7a 42 75 66 5b 6a  0xf];.    zBuf[j
1b030 2b 2b 5d 20 3d 20 7a 45 6e 63 6f 64 65 5b 61 20  ++] = zEncode[a 
1b040 26 20 30 78 66 5d 3b 0a 20 20 7d 0a 20 20 7a 42  & 0xf];.  }.  zB
1b050 75 66 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f  uf[j] = 0;.}.../
1b060 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 31  *.** Convert a 1
1b070 32 38 2d 62 69 74 20 4d 44 35 20 64 69 67 65 73  28-bit MD5 diges
1b080 74 20 69 6e 74 6f 20 73 65 71 75 65 6e 63 79 20  t into sequency 
1b090 6f 66 20 65 69 67 68 74 20 35 2d 64 69 67 69 74  of eight 5-digit
1b0a0 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20 65 61 63   integers.** eac
1b0b0 68 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 31  h representing 1
1b0c0 36 20 62 69 74 73 20 6f 66 20 74 68 65 20 64 69  6 bits of the di
1b0d0 67 65 73 74 20 61 6e 64 20 73 65 70 61 72 61 74  gest and separat
1b0e0 65 64 20 66 72 6f 6d 20 65 61 63 68 0a 2a 2a 20  ed from each.** 
1b0f0 6f 74 68 65 72 20 62 79 20 61 20 22 2d 22 20 63  other by a "-" c
1b100 68 61 72 61 63 74 65 72 2e 0a 2a 2f 0a 73 74 61  haracter..*/.sta
1b110 74 69 63 20 76 6f 69 64 20 4d 44 35 44 69 67 65  tic void MD5Dige
1b120 73 74 54 6f 42 61 73 65 31 30 78 38 28 75 6e 73  stToBase10x8(uns
1b130 69 67 6e 65 64 20 63 68 61 72 20 64 69 67 65 73  igned char diges
1b140 74 5b 31 36 5d 2c 20 63 68 61 72 20 7a 44 69 67  t[16], char zDig
1b150 65 73 74 5b 35 30 5d 29 7b 0a 20 20 69 6e 74 20  est[50]){.  int 
1b160 69 2c 20 6a 3b 0a 20 20 75 6e 73 69 67 6e 65 64  i, j;.  unsigned
1b170 20 69 6e 74 20 78 3b 0a 20 20 66 6f 72 28 69 3d   int x;.  for(i=
1b180 6a 3d 30 3b 20 69 3c 31 36 3b 20 69 2b 3d 32 29  j=0; i<16; i+=2)
1b190 7b 0a 20 20 20 20 78 20 3d 20 64 69 67 65 73 74  {.    x = digest
1b1a0 5b 69 5d 2a 32 35 36 20 2b 20 64 69 67 65 73 74  [i]*256 + digest
1b1b0 5b 69 2b 31 5d 3b 0a 20 20 20 20 69 66 28 20 69  [i+1];.    if( i
1b1c0 3e 30 20 29 20 7a 44 69 67 65 73 74 5b 6a 2b 2b  >0 ) zDigest[j++
1b1d0 5d 20 3d 20 27 2d 27 3b 0a 20 20 20 20 73 70 72  ] = '-';.    spr
1b1e0 69 6e 74 66 28 26 7a 44 69 67 65 73 74 5b 6a 5d  intf(&zDigest[j]
1b1f0 2c 20 22 25 30 35 75 22 2c 20 78 29 3b 0a 20 20  , "%05u", x);.  
1b200 20 20 6a 20 2b 3d 20 35 3b 0a 20 20 7d 0a 20 20    j += 5;.  }.  
1b210 7a 44 69 67 65 73 74 5b 6a 5d 20 3d 20 30 3b 0a  zDigest[j] = 0;.
1b220 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 54 43 4c 20 63  }../*.** A TCL c
1b230 6f 6d 6d 61 6e 64 20 66 6f 72 20 6d 64 35 2e 20  ommand for md5. 
1b240 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73   The argument is
1b250 20 74 68 65 20 74 65 78 74 20 74 6f 20 62 65 20   the text to be 
1b260 68 61 73 68 65 64 2e 20 20 54 68 65 0a 2a 2a 20  hashed.  The.** 
1b270 52 65 73 75 6c 74 20 69 73 20 74 68 65 20 68 61  Result is the ha
1b280 73 68 20 69 6e 20 62 61 73 65 36 34 2e 20 20 0a  sh in base64.  .
1b290 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 64  */.static int md
1b2a0 35 5f 63 6d 64 28 76 6f 69 64 2a 63 64 2c 20 54  5_cmd(void*cd, T
1b2b0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1b2c0 70 2c 20 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e  p, int argc, con
1b2d0 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b  st char **argv){
1b2e0 0a 20 20 4d 44 35 43 6f 6e 74 65 78 74 20 63 74  .  MD5Context ct
1b2f0 78 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  x;.  unsigned ch
1b300 61 72 20 64 69 67 65 73 74 5b 31 36 5d 3b 0a 20  ar digest[16];. 
1b310 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a   char zBuf[50];.
1b320 20 20 76 6f 69 64 20 28 2a 63 6f 6e 76 65 72 74    void (*convert
1b330 65 72 29 28 75 6e 73 69 67 6e 65 64 20 63 68 61  er)(unsigned cha
1b340 72 2a 2c 20 63 68 61 72 2a 29 3b 0a 0a 20 20 69  r*, char*);..  i
1b350 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20  f( argc!=2 ){.  
1b360 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1b370 6c 74 28 69 6e 74 65 72 70 2c 22 77 72 6f 6e 67  lt(interp,"wrong
1b380 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1b390 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
1b3a0 20 0a 20 20 20 20 20 20 20 20 22 20 54 45 58 54   .        " TEXT
1b3b0 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
1b3c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1b3d0 20 7d 0a 20 20 4d 44 35 49 6e 69 74 28 26 63 74   }.  MD5Init(&ct
1b3e0 78 29 3b 0a 20 20 4d 44 35 55 70 64 61 74 65 28  x);.  MD5Update(
1b3f0 26 63 74 78 2c 20 28 75 6e 73 69 67 6e 65 64 20  &ctx, (unsigned 
1b400 63 68 61 72 2a 29 61 72 67 76 5b 31 5d 2c 20 28  char*)argv[1], (
1b410 75 6e 73 69 67 6e 65 64 29 73 74 72 6c 65 6e 28  unsigned)strlen(
1b420 61 72 67 76 5b 31 5d 29 29 3b 0a 20 20 4d 44 35  argv[1]));.  MD5
1b430 46 69 6e 61 6c 28 64 69 67 65 73 74 2c 20 26 63  Final(digest, &c
1b440 74 78 29 3b 0a 20 20 63 6f 6e 76 65 72 74 65 72  tx);.  converter
1b450 20 3d 20 28 76 6f 69 64 28 2a 29 28 75 6e 73 69   = (void(*)(unsi
1b460 67 6e 65 64 20 63 68 61 72 2a 2c 63 68 61 72 2a  gned char*,char*
1b470 29 29 63 64 3b 0a 20 20 63 6f 6e 76 65 72 74 65  ))cd;.  converte
1b480 72 28 64 69 67 65 73 74 2c 20 7a 42 75 66 29 3b  r(digest, zBuf);
1b490 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
1b4a0 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
1b4b0 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 72  , (char*)0);.  r
1b4c0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1b4d0 0a 2f 2a 0a 2a 2a 20 41 20 54 43 4c 20 63 6f 6d  ./*.** A TCL com
1b4e0 6d 61 6e 64 20 74 6f 20 74 61 6b 65 20 74 68 65  mand to take the
1b4f0 20 6d 64 35 20 68 61 73 68 20 6f 66 20 61 20 66   md5 hash of a f
1b500 69 6c 65 2e 20 20 54 68 65 20 61 72 67 75 6d 65  ile.  The argume
1b510 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 6e 61 6d  nt is the.** nam
1b520 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 2a  e of the file..*
1b530 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 64 35  /.static int md5
1b540 66 69 6c 65 5f 63 6d 64 28 76 6f 69 64 2a 63 64  file_cmd(void*cd
1b550 2c 20 54 63 6c 5f 49 6e 74 65 72 70 2a 69 6e 74  , Tcl_Interp*int
1b560 65 72 70 2c 20 69 6e 74 20 61 72 67 63 2c 20 63  erp, int argc, c
1b570 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76  onst char **argv
1b580 29 7b 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 0a 20  ){.  FILE *in;. 
1b590 20 4d 44 35 43 6f 6e 74 65 78 74 20 63 74 78 3b   MD5Context ctx;
1b5a0 0a 20 20 76 6f 69 64 20 28 2a 63 6f 6e 76 65 72  .  void (*conver
1b5b0 74 65 72 29 28 75 6e 73 69 67 6e 65 64 20 63 68  ter)(unsigned ch
1b5c0 61 72 2a 2c 20 63 68 61 72 2a 29 3b 0a 20 20 75  ar*, char*);.  u
1b5d0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64 69 67  nsigned char dig
1b5e0 65 73 74 5b 31 36 5d 3b 0a 20 20 63 68 61 72 20  est[16];.  char 
1b5f0 7a 42 75 66 5b 31 30 32 34 30 5d 3b 0a 0a 20 20  zBuf[10240];..  
1b600 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20  if( argc!=2 ){. 
1b610 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1b620 75 6c 74 28 69 6e 74 65 72 70 2c 22 77 72 6f 6e  ult(interp,"wron
1b630 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1b640 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
1b650 2c 20 0a 20 20 20 20 20 20 20 20 22 20 46 49 4c  , .        " FIL
1b660 45 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20  ENAME\"", 0);.  
1b670 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1b680 4f 52 3b 0a 20 20 7d 0a 20 20 69 6e 20 3d 20 66  OR;.  }.  in = f
1b690 6f 70 65 6e 28 61 72 67 76 5b 31 5d 2c 22 72 62  open(argv[1],"rb
1b6a0 22 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20  ");.  if( in==0 
1b6b0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1b6c0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22  dResult(interp,"
1b6d0 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 66  unable to open f
1b6e0 69 6c 65 20 5c 22 22 2c 20 61 72 67 76 5b 31 5d  ile \"", argv[1]
1b6f0 2c 20 0a 20 20 20 20 20 20 20 20 20 22 5c 22 20  , .         "\" 
1b700 66 6f 72 20 72 65 61 64 69 6e 67 22 2c 20 30 29  for reading", 0)
1b710 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1b720 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 4d 44  _ERROR;.  }.  MD
1b730 35 49 6e 69 74 28 26 63 74 78 29 3b 0a 20 20 66  5Init(&ctx);.  f
1b740 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20  or(;;){.    int 
1b750 6e 3b 0a 20 20 20 20 6e 20 3d 20 28 69 6e 74 29  n;.    n = (int)
1b760 66 72 65 61 64 28 7a 42 75 66 2c 20 31 2c 20 73  fread(zBuf, 1, s
1b770 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 69 6e 29  izeof(zBuf), in)
1b780 3b 0a 20 20 20 20 69 66 28 20 6e 3c 3d 30 20 29  ;.    if( n<=0 )
1b790 20 62 72 65 61 6b 3b 0a 20 20 20 20 4d 44 35 55   break;.    MD5U
1b7a0 70 64 61 74 65 28 26 63 74 78 2c 20 28 75 6e 73  pdate(&ctx, (uns
1b7b0 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 42 75 66  igned char*)zBuf
1b7c0 2c 20 28 75 6e 73 69 67 6e 65 64 29 6e 29 3b 0a  , (unsigned)n);.
1b7d0 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29    }.  fclose(in)
1b7e0 3b 0a 20 20 4d 44 35 46 69 6e 61 6c 28 64 69 67  ;.  MD5Final(dig
1b7f0 65 73 74 2c 20 26 63 74 78 29 3b 0a 20 20 63 6f  est, &ctx);.  co
1b800 6e 76 65 72 74 65 72 20 3d 20 28 76 6f 69 64 28  nverter = (void(
1b810 2a 29 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  *)(unsigned char
1b820 2a 2c 63 68 61 72 2a 29 29 63 64 3b 0a 20 20 63  *,char*))cd;.  c
1b830 6f 6e 76 65 72 74 65 72 28 64 69 67 65 73 74 2c  onverter(digest,
1b840 20 7a 42 75 66 29 3b 0a 20 20 54 63 6c 5f 41 70   zBuf);.  Tcl_Ap
1b850 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1b860 70 2c 20 7a 42 75 66 2c 20 28 63 68 61 72 2a 29  p, zBuf, (char*)
1b870 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
1b880 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
1b890 67 69 73 74 65 72 20 74 68 65 20 66 6f 75 72 20  gister the four 
1b8a0 6e 65 77 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 73  new TCL commands
1b8b0 20 66 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20   for generating 
1b8c0 4d 44 35 20 63 68 65 63 6b 73 75 6d 73 0a 2a 2a  MD5 checksums.**
1b8d0 20 77 69 74 68 20 74 68 65 20 54 43 4c 20 69 6e   with the TCL in
1b8e0 74 65 72 70 72 65 74 65 72 2e 0a 2a 2f 0a 69 6e  terpreter..*/.in
1b8f0 74 20 4d 64 35 5f 49 6e 69 74 28 54 63 6c 5f 49  t Md5_Init(Tcl_I
1b900 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a  nterp *interp){.
1b910 20 20 54 63 6c 5f 43 72 65 61 74 65 43 6f 6d 6d    Tcl_CreateComm
1b920 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 6d 64 35  and(interp, "md5
1b930 22 2c 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a  ", (Tcl_CmdProc*
1b940 29 6d 64 35 5f 63 6d 64 2c 0a 20 20 20 20 20 20  )md5_cmd,.      
1b950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4d 44                MD
1b960 35 44 69 67 65 73 74 54 6f 42 61 73 65 31 36 2c  5DigestToBase16,
1b970 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74   0);.  Tcl_Creat
1b980 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  eCommand(interp,
1b990 20 22 6d 64 35 2d 31 30 78 38 22 2c 20 28 54 63   "md5-10x8", (Tc
1b9a0 6c 5f 43 6d 64 50 72 6f 63 2a 29 6d 64 35 5f 63  l_CmdProc*)md5_c
1b9b0 6d 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  md,.            
1b9c0 20 20 20 20 20 20 20 20 4d 44 35 44 69 67 65 73          MD5Diges
1b9d0 74 54 6f 42 61 73 65 31 30 78 38 2c 20 30 29 3b  tToBase10x8, 0);
1b9e0 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 43 6f 6d  .  Tcl_CreateCom
1b9f0 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 6d 64  mand(interp, "md
1ba00 35 66 69 6c 65 22 2c 20 28 54 63 6c 5f 43 6d 64  5file", (Tcl_Cmd
1ba10 50 72 6f 63 2a 29 6d 64 35 66 69 6c 65 5f 63 6d  Proc*)md5file_cm
1ba20 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
1ba30 20 20 20 20 20 20 20 4d 44 35 44 69 67 65 73 74         MD5Digest
1ba40 54 6f 42 61 73 65 31 36 2c 20 30 29 3b 0a 20 20  ToBase16, 0);.  
1ba50 54 63 6c 5f 43 72 65 61 74 65 43 6f 6d 6d 61 6e  Tcl_CreateComman
1ba60 64 28 69 6e 74 65 72 70 2c 20 22 6d 64 35 66 69  d(interp, "md5fi
1ba70 6c 65 2d 31 30 78 38 22 2c 20 28 54 63 6c 5f 43  le-10x8", (Tcl_C
1ba80 6d 64 50 72 6f 63 2a 29 6d 64 35 66 69 6c 65 5f  mdProc*)md5file_
1ba90 63 6d 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  cmd,.           
1baa0 20 20 20 20 20 20 20 20 20 4d 44 35 44 69 67 65           MD5Dige
1bab0 73 74 54 6f 42 61 73 65 31 30 78 38 2c 20 30 29  stToBase10x8, 0)
1bac0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1bad0 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64  K;.}.#endif /* d
1bae0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
1baf0 53 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  ST) || defined(S
1bb00 51 4c 49 54 45 5f 54 43 4c 4d 44 35 29 20 2a 2f  QLITE_TCLMD5) */
1bb10 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
1bb20 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a  LITE_TEST)./*.**
1bb30 20 44 75 72 69 6e 67 20 74 65 73 74 69 6e 67 2c   During testing,
1bb40 20 74 68 65 20 73 70 65 63 69 61 6c 20 6d 64 35   the special md5
1bb50 73 75 6d 28 29 20 61 67 67 72 65 67 61 74 65 20  sum() aggregate 
1bb60 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 76 61 69  function is avai
1bb70 6c 61 62 6c 65 2e 0a 2a 2a 20 69 6e 73 69 64 65  lable..** inside
1bb80 20 53 51 4c 69 74 65 2e 20 20 54 68 65 20 66 6f   SQLite.  The fo
1bb90 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73  llowing routines
1bba0 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74 20   implement that 
1bbb0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
1bbc0 74 69 63 20 76 6f 69 64 20 6d 64 35 73 74 65 70  tic void md5step
1bbd0 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
1bbe0 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61   *context, int a
1bbf0 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  rgc, sqlite3_val
1bc00 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 4d 44  ue **argv){.  MD
1bc10 35 43 6f 6e 74 65 78 74 20 2a 70 3b 0a 20 20 69  5Context *p;.  i
1bc20 6e 74 20 69 3b 0a 20 20 69 66 28 20 61 72 67 63  nt i;.  if( argc
1bc30 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  <1 ) return;.  p
1bc40 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65   = sqlite3_aggre
1bc50 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e  gate_context(con
1bc60 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29  text, sizeof(*p)
1bc70 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
1bc80 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 70  return;.  if( !p
1bc90 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20  ->isInit ){.    
1bca0 4d 44 35 49 6e 69 74 28 70 29 3b 0a 20 20 7d 0a  MD5Init(p);.  }.
1bcb0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67    for(i=0; i<arg
1bcc0 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e  c; i++){.    con
1bcd0 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61 20 3d  st char *zData =
1bce0 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f   (char*)sqlite3_
1bcf0 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
1bd00 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 7a 44 61  i]);.    if( zDa
1bd10 74 61 20 29 7b 0a 20 20 20 20 20 20 4d 44 35 55  ta ){.      MD5U
1bd20 70 64 61 74 65 28 70 2c 20 28 75 6e 73 69 67 6e  pdate(p, (unsign
1bd30 65 64 20 63 68 61 72 2a 29 7a 44 61 74 61 2c 20  ed char*)zData, 
1bd40 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 44 61 74  (int)strlen(zDat
1bd50 61 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  a));.    }.  }.}
1bd60 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 64 35  .static void md5
1bd70 66 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33  finalize(sqlite3
1bd80 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
1bd90 74 29 7b 0a 20 20 4d 44 35 43 6f 6e 74 65 78 74  t){.  MD5Context
1bda0 20 2a 70 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20   *p;.  unsigned 
1bdb0 63 68 61 72 20 64 69 67 65 73 74 5b 31 36 5d 3b  char digest[16];
1bdc0 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33 33 5d  .  char zBuf[33]
1bdd0 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  p = sqlite3_
1bde0 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
1bdf0 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f  t(context, sizeo
1be00 66 28 2a 70 29 29 3b 0a 20 20 4d 44 35 46 69 6e  f(*p));.  MD5Fin
1be10 61 6c 28 64 69 67 65 73 74 2c 70 29 3b 0a 20 20  al(digest,p);.  
1be20 4d 44 35 44 69 67 65 73 74 54 6f 42 61 73 65 31  MD5DigestToBase1
1be30 36 28 64 69 67 65 73 74 2c 20 7a 42 75 66 29 3b  6(digest, zBuf);
1be40 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
1be50 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
1be60 7a 42 75 66 2c 20 2d 31 2c 20 53 51 4c 49 54 45  zBuf, -1, SQLITE
1be70 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a 69  _TRANSIENT);.}.i
1be80 6e 74 20 4d 64 35 5f 52 65 67 69 73 74 65 72 28  nt Md5_Register(
1be90 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
1bea0 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
1beb0 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
1bec0 28 64 62 2c 20 22 6d 64 35 73 75 6d 22 2c 20 2d  (db, "md5sum", -
1bed0 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
1bee0 30 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  0, 0, .         
1bef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf00 20 20 20 20 20 20 20 20 6d 64 35 73 74 65 70 2c          md5step,
1bf10 20 6d 64 35 66 69 6e 61 6c 69 7a 65 29 3b 0a 20   md5finalize);. 
1bf20 20 73 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61   sqlite3_overloa
1bf30 64 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22  d_function(db, "
1bf40 6d 64 35 73 75 6d 22 2c 20 2d 31 29 3b 20 20 2f  md5sum", -1);  /
1bf50 2a 20 54 6f 20 65 78 65 72 63 69 73 65 20 74 68  * To exercise th
1bf60 69 73 20 41 50 49 20 2a 2f 0a 20 20 72 65 74 75  is API */.  retu
1bf70 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
1bf80 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  /* defined(SQLIT
1bf90 45 5f 54 45 53 54 29 20 2a 2f 0a 0a 0a 2f 2a 0a  E_TEST) */.../*.
1bfa0 2a 2a 20 49 66 20 74 68 65 20 6d 61 63 72 6f 20  ** If the macro 
1bfb0 54 43 4c 53 48 20 69 73 20 6f 6e 65 2c 20 74 68  TCLSH is one, th
1bfc0 65 6e 20 70 75 74 20 69 6e 20 63 6f 64 65 20 74  en put in code t
1bfd0 68 69 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 22  his for the.** "
1bfe0 6d 61 69 6e 22 20 72 6f 75 74 69 6e 65 20 74 68  main" routine th
1bff0 61 74 20 77 69 6c 6c 20 69 6e 69 74 69 61 6c 69  at will initiali
1c000 7a 65 20 54 63 6c 20 61 6e 64 20 74 61 6b 65 20  ze Tcl and take 
1c010 69 6e 70 75 74 20 66 72 6f 6d 0a 2a 2a 20 73 74  input from.** st
1c020 61 6e 64 61 72 64 20 69 6e 70 75 74 2c 20 6f 72  andard input, or
1c030 20 69 66 20 61 20 66 69 6c 65 20 69 73 20 6e 61   if a file is na
1c040 6d 65 64 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61  med on the comma
1c050 6e 64 20 6c 69 6e 65 0a 2a 2a 20 74 68 65 20 54  nd line.** the T
1c060 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 72  CL interpreter r
1c070 65 61 64 73 20 61 6e 64 20 65 76 61 6c 75 61 74  eads and evaluat
1c080 65 73 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2f  es that file..*/
1c090 0a 23 69 66 20 54 43 4c 53 48 3d 3d 31 0a 73 74  .#if TCLSH==1.st
1c0a0 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
1c0b0 2a 74 63 6c 73 68 5f 6d 61 69 6e 5f 6c 6f 6f 70  *tclsh_main_loop
1c0c0 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63  (void){.  static
1c0d0 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 69   const char zMai
1c0e0 6e 6c 6f 6f 70 5b 5d 20 3d 0a 20 20 20 20 22 73  nloop[] =.    "s
1c0f0 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20  et line {}\n".  
1c100 20 20 22 77 68 69 6c 65 20 7b 21 5b 65 6f 66 20    "while {![eof 
1c110 73 74 64 69 6e 5d 7d 20 7b 5c 6e 22 0a 20 20 20  stdin]} {\n".   
1c120 20 20 20 22 69 66 20 7b 24 6c 69 6e 65 21 3d 5c     "if {$line!=\
1c130 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20  "\"} {\n".      
1c140 20 20 22 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69    "puts -nonewli
1c150 6e 65 20 5c 22 3e 20 5c 22 5c 6e 22 0a 20 20 20  ne \"> \"\n".   
1c160 20 20 20 22 7d 20 65 6c 73 65 20 7b 5c 6e 22 0a     "} else {\n".
1c170 20 20 20 20 20 20 20 20 22 70 75 74 73 20 2d 6e          "puts -n
1c180 6f 6e 65 77 6c 69 6e 65 20 5c 22 25 20 5c 22 5c  onewline \"% \"\
1c190 6e 22 0a 20 20 20 20 20 20 22 7d 5c 6e 22 0a 20  n".      "}\n". 
1c1a0 20 20 20 20 20 22 66 6c 75 73 68 20 73 74 64 6f       "flush stdo
1c1b0 75 74 5c 6e 22 0a 20 20 20 20 20 20 22 61 70 70  ut\n".      "app
1c1c0 65 6e 64 20 6c 69 6e 65 20 5b 67 65 74 73 20 73  end line [gets s
1c1d0 74 64 69 6e 5d 5c 6e 22 0a 20 20 20 20 20 20 22  tdin]\n".      "
1c1e0 69 66 20 7b 5b 69 6e 66 6f 20 63 6f 6d 70 6c 65  if {[info comple
1c1f0 74 65 20 24 6c 69 6e 65 5d 7d 20 7b 5c 6e 22 0a  te $line]} {\n".
1c200 20 20 20 20 20 20 20 20 22 69 66 20 7b 5b 63 61          "if {[ca
1c210 74 63 68 20 7b 75 70 6c 65 76 65 6c 20 23 30 20  tch {uplevel #0 
1c220 24 6c 69 6e 65 7d 20 72 65 73 75 6c 74 5d 7d 20  $line} result]} 
1c230 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 22  {\n".          "
1c240 70 75 74 73 20 73 74 64 65 72 72 20 5c 22 45 72  puts stderr \"Er
1c250 72 6f 72 3a 20 24 72 65 73 75 6c 74 5c 22 5c 6e  ror: $result\"\n
1c260 22 0a 20 20 20 20 20 20 20 20 22 7d 20 65 6c 73  ".        "} els
1c270 65 69 66 20 7b 24 72 65 73 75 6c 74 21 3d 5c 22  eif {$result!=\"
1c280 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20  \"} {\n".       
1c290 20 20 20 22 70 75 74 73 20 24 72 65 73 75 6c 74     "puts $result
1c2a0 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 7d 5c 6e  \n".        "}\n
1c2b0 22 0a 20 20 20 20 20 20 20 20 22 73 65 74 20 6c  ".        "set l
1c2c0 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20 20 20 20 20  ine {}\n".      
1c2d0 22 7d 20 65 6c 73 65 20 7b 5c 6e 22 0a 20 20 20  "} else {\n".   
1c2e0 20 20 20 20 20 22 61 70 70 65 6e 64 20 6c 69 6e       "append lin
1c2f0 65 20 5c 5c 6e 5c 6e 22 0a 20 20 20 20 20 20 22  e \\n\n".      "
1c300 7d 5c 6e 22 0a 20 20 20 20 22 7d 5c 6e 22 0a 20  }\n".    "}\n". 
1c310 20 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4d 61 69   ;.  return zMai
1c320 6e 6c 6f 6f 70 3b 0a 7d 0a 23 65 6e 64 69 66 0a  nloop;.}.#endif.
1c330 23 69 66 20 54 43 4c 53 48 3d 3d 32 0a 73 74 61  #if TCLSH==2.sta
1c340 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
1c350 74 63 6c 73 68 5f 6d 61 69 6e 5f 6c 6f 6f 70 28  tclsh_main_loop(
1c360 76 6f 69 64 29 3b 0a 23 65 6e 64 69 66 0a 0a 23  void);.#endif..#
1c370 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
1c380 54 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  T.static void in
1c390 69 74 5f 61 6c 6c 28 54 63 6c 5f 49 6e 74 65 72  it_all(Tcl_Inter
1c3a0 70 20 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  p *);.static int
1c3b0 20 69 6e 69 74 5f 61 6c 6c 5f 63 6d 64 28 0a 20   init_all_cmd(. 
1c3c0 20 43 6c 69 65 6e 74 44 61 74 61 20 63 64 2c 0a   ClientData cd,.
1c3d0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1c3e0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1c3f0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1c400 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 0a 20 20  ST objv[].){..  
1c410 54 63 6c 5f 49 6e 74 65 72 70 20 2a 73 6c 61 76  Tcl_Interp *slav
1c420 65 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  e;.  if( objc!=2
1c430 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
1c440 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
1c450 20 31 2c 20 6f 62 6a 76 2c 20 22 53 4c 41 56 45   1, objv, "SLAVE
1c460 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
1c470 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
1c480 20 73 6c 61 76 65 20 3d 20 54 63 6c 5f 47 65 74   slave = Tcl_Get
1c490 53 6c 61 76 65 28 69 6e 74 65 72 70 2c 20 54 63  Slave(interp, Tc
1c4a0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1c4b0 5b 31 5d 29 29 3b 0a 20 20 69 66 28 20 21 73 6c  [1]));.  if( !sl
1c4c0 61 76 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ave ){.    retur
1c4d0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1c4e0 0a 0a 20 20 69 6e 69 74 5f 61 6c 6c 28 73 6c 61  ..  init_all(sla
1c4f0 76 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  ve);.  return TC
1c500 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  L_OK;.}../*.** T
1c510 63 6c 63 6d 64 3a 20 64 62 5f 75 73 65 5f 6c 65  clcmd: db_use_le
1c520 67 61 63 79 5f 70 72 65 70 61 72 65 20 44 42 20  gacy_prepare DB 
1c530 42 4f 4f 4c 45 41 4e 0a 2a 2a 0a 2a 2a 20 20 20  BOOLEAN.**.**   
1c540 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
1c550 6e 74 20 74 6f 20 74 68 69 73 20 63 6f 6d 6d 61  nt to this comma
1c560 6e 64 20 6d 75 73 74 20 62 65 20 61 20 64 61 74  nd must be a dat
1c570 61 62 61 73 65 20 63 6f 6d 6d 61 6e 64 20 63 72  abase command cr
1c580 65 61 74 65 64 20 62 79 0a 2a 2a 20 20 20 5b 73  eated by.**   [s
1c590 71 6c 69 74 65 33 5d 2e 20 49 66 20 74 68 65 20  qlite3]. If the 
1c5a0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
1c5b0 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
1c5c0 65 20 68 61 6e 64 6c 65 20 69 73 20 63 6f 6e 66  e handle is conf
1c5d0 69 67 75 72 65 64 0a 2a 2a 20 20 20 74 6f 20 75  igured.**   to u
1c5e0 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 70  se the sqlite3_p
1c5f0 72 65 70 61 72 65 5f 76 32 28 29 20 66 75 6e 63  repare_v2() func
1c600 74 69 6f 6e 20 74 6f 20 70 72 65 70 61 72 65 20  tion to prepare 
1c610 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 66 20 69  statements. If i
1c620 74 0a 2a 2a 20 20 20 69 73 20 66 61 6c 73 65 2c  t.**   is false,
1c630 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
1c640 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
1c650 74 20 64 62 5f 75 73 65 5f 6c 65 67 61 63 79 5f  t db_use_legacy_
1c660 70 72 65 70 61 72 65 5f 63 6d 64 28 0a 20 20 43  prepare_cmd(.  C
1c670 6c 69 65 6e 74 44 61 74 61 20 63 64 2c 0a 20 20  lientData cd,.  
1c680 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1c690 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1c6a0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1c6b0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 54 63 6c   objv[].){.  Tcl
1c6c0 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66 6f  _CmdInfo cmdInfo
1c6d0 3b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  ;.  SqliteDb *pD
1c6e0 62 3b 0a 20 20 69 6e 74 20 62 50 72 65 70 61 72  b;.  int bPrepar
1c6f0 65 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  e;..  if( objc!=
1c700 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  3 ){.    Tcl_Wro
1c710 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
1c720 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 42  , 1, objv, "DB B
1c730 4f 4f 4c 45 41 4e 22 29 3b 0a 20 20 20 20 72 65  OOLEAN");.    re
1c740 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1c750 20 20 7d 0a 0a 20 20 69 66 28 20 21 54 63 6c 5f    }..  if( !Tcl_
1c760 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69  GetCommandInfo(i
1c770 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
1c780 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
1c790 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20  cmdInfo) ){.    
1c7a0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1c7b0 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 73 75 63  (interp, "no suc
1c7c0 68 20 64 62 3a 20 22 2c 20 54 63 6c 5f 47 65 74  h db: ", Tcl_Get
1c7d0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
1c7e0 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
1c7f0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1c800 3b 0a 20 20 7d 0a 20 20 70 44 62 20 3d 20 28 53  ;.  }.  pDb = (S
1c810 71 6c 69 74 65 44 62 2a 29 63 6d 64 49 6e 66 6f  qliteDb*)cmdInfo
1c820 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74 61 3b 0a  .objClientData;.
1c830 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f    if( Tcl_GetBoo
1c840 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
1c850 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 62 50  rp, objv[2], &bP
1c860 72 65 70 61 72 65 29 20 29 7b 0a 20 20 20 20 72  repare) ){.    r
1c870 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1c880 0a 20 20 7d 0a 0a 20 20 70 44 62 2d 3e 62 4c 65  .  }..  pDb->bLe
1c890 67 61 63 79 50 72 65 70 61 72 65 20 3d 20 62 50  gacyPrepare = bP
1c8a0 72 65 70 61 72 65 3b 0a 0a 20 20 54 63 6c 5f 52  repare;..  Tcl_R
1c8b0 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  esetResult(inter
1c8c0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  p);.  return TCL
1c8d0 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
1c8e0 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 74  *.** Configure t
1c8f0 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 70  he interpreter p
1c900 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
1c910 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 68  st argument to h
1c920 61 76 65 20 61 63 63 65 73 73 0a 2a 2a 20 74 6f  ave access.** to
1c930 20 74 68 65 20 63 6f 6d 6d 61 6e 64 73 20 61 6e   the commands an
1c940 64 20 6c 69 6e 6b 65 64 20 76 61 72 69 61 62 6c  d linked variabl
1c950 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 3a  es that make up:
1c960 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 5b  .**.**   * the [
1c970 73 71 6c 69 74 65 33 5d 20 65 78 74 65 6e 73 69  sqlite3] extensi
1c980 6f 6e 20 69 74 73 65 6c 66 2c 20 0a 2a 2a 0a 2a  on itself, .**.*
1c990 2a 20 20 20 2a 20 49 66 20 53 51 4c 49 54 45 5f  *   * If SQLITE_
1c9a0 54 43 4c 4d 44 35 20 6f 72 20 53 51 4c 49 54 45  TCLMD5 or SQLITE
1c9b0 5f 54 45 53 54 20 69 73 20 64 65 66 69 6e 65 64  _TEST is defined
1c9c0 2c 20 74 68 65 20 4d 64 35 20 63 6f 6d 6d 61 6e  , the Md5 comman
1c9d0 64 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  ds, and.**.**   
1c9e0 2a 20 49 66 20 53 51 4c 49 54 45 5f 54 45 53 54  * If SQLITE_TEST
1c9f0 20 69 73 20 73 65 74 2c 20 74 68 65 20 76 61 72   is set, the var
1ca00 69 6f 75 73 20 74 65 73 74 20 69 6e 74 65 72 66  ious test interf
1ca10 61 63 65 73 20 75 73 65 64 20 62 79 20 74 68 65  aces used by the
1ca20 20 54 63 6c 0a 2a 2a 20 20 20 20 20 74 65 73 74   Tcl.**     test
1ca30 20 73 75 69 74 65 2e 0a 2a 2f 0a 73 74 61 74 69   suite..*/.stati
1ca40 63 20 76 6f 69 64 20 69 6e 69 74 5f 61 6c 6c 28  c void init_all(
1ca50 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1ca60 72 70 29 7b 0a 20 20 53 71 6c 69 74 65 33 5f 49  rp){.  Sqlite3_I
1ca70 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 0a 23 69  nit(interp);..#i
1ca80 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1ca90 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65  _TEST) || define
1caa0 64 28 53 51 4c 49 54 45 5f 54 43 4c 4d 44 35 29  d(SQLITE_TCLMD5)
1cab0 0a 20 20 4d 64 35 5f 49 6e 69 74 28 69 6e 74 65  .  Md5_Init(inte
1cac0 72 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  rp);.#endif..  /
1cad0 2a 20 49 6e 73 74 61 6c 6c 20 74 68 65 20 5b 72  * Install the [r
1cae0 65 67 69 73 74 65 72 5f 64 62 73 74 61 74 5f 76  egister_dbstat_v
1caf0 74 61 62 5d 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  tab] command to 
1cb00 61 63 63 65 73 73 20 74 68 65 20 69 6d 70 6c 65  access the imple
1cb10 6d 65 6e 74 61 74 69 6f 6e 0a 20 20 2a 2a 20 6f  mentation.  ** o
1cb20 66 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  f virtual table 
1cb30 64 62 73 74 61 74 20 28 73 6f 75 72 63 65 20 66  dbstat (source f
1cb40 69 6c 65 20 74 65 73 74 5f 73 74 61 74 2e 63 29  ile test_stat.c)
1cb50 2e 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69  . This command i
1cb60 73 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20  s.  ** required 
1cb70 66 6f 72 20 74 65 73 74 66 69 78 74 75 72 65 20  for testfixture 
1cb80 61 6e 64 20 73 71 6c 69 74 65 33 5f 61 6e 61 6c  and sqlite3_anal
1cb90 79 7a 65 72 2c 20 62 75 74 20 6e 6f 74 20 62 79  yzer, but not by
1cba0 20 74 68 65 20 70 72 6f 64 75 63 74 69 6f 6e 0a   the production.
1cbb0 20 20 2a 2a 20 54 63 6c 20 65 78 74 65 6e 73 69    ** Tcl extensi
1cbc0 6f 6e 2e 20 20 2a 2f 0a 23 69 66 20 64 65 66 69  on.  */.#if defi
1cbd0 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
1cbe0 20 7c 7c 20 54 43 4c 53 48 3d 3d 32 0a 20 20 7b   || TCLSH==2.  {
1cbf0 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1cc00 53 71 6c 69 74 65 74 65 73 74 53 74 61 74 5f 49  SqlitetestStat_I
1cc10 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1cc20 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1cc30 53 74 61 74 5f 49 6e 69 74 28 69 6e 74 65 72 70  Stat_Init(interp
1cc40 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  );.  }.#endif..#
1cc50 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
1cc60 54 0a 20 20 7b 0a 20 20 20 20 65 78 74 65 72 6e  T.  {.    extern
1cc70 20 69 6e 74 20 53 71 6c 69 74 65 63 6f 6e 66 69   int Sqliteconfi
1cc80 67 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  g_Init(Tcl_Inter
1cc90 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1cca0 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 31 5f  int Sqlitetest1_
1ccb0 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1ccc0 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1ccd0 74 20 53 71 6c 69 74 65 74 65 73 74 32 5f 49 6e  t Sqlitetest2_In
1cce0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1ccf0 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1cd00 53 71 6c 69 74 65 74 65 73 74 33 5f 49 6e 69 74  Sqlitetest3_Init
1cd10 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1cd20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1cd30 6c 69 74 65 74 65 73 74 34 5f 49 6e 69 74 28 54  litetest4_Init(T
1cd40 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1cd50 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1cd60 74 65 74 65 73 74 35 5f 49 6e 69 74 28 54 63 6c  tetest5_Init(Tcl
1cd70 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1cd80 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1cd90 74 65 73 74 36 5f 49 6e 69 74 28 54 63 6c 5f 49  test6_Init(Tcl_I
1cda0 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1cdb0 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1cdc0 73 74 37 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  st7_Init(Tcl_Int
1cdd0 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1cde0 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1cdf0 38 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  8_Init(Tcl_Inter
1ce00 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1ce10 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 39 5f  int Sqlitetest9_
1ce20 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1ce30 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1ce40 74 20 53 71 6c 69 74 65 74 65 73 74 61 73 79 6e  t Sqlitetestasyn
1ce50 63 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  c_Init(Tcl_Inter
1ce60 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1ce70 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f 61  int Sqlitetest_a
1ce80 75 74 6f 65 78 74 5f 49 6e 69 74 28 54 63 6c 5f  utoext_Init(Tcl_
1ce90 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
1cea0 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1ceb0 65 73 74 5f 64 65 6d 6f 76 66 73 5f 49 6e 69 74  est_demovfs_Init
1cec0 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29 3b 0a  (Tcl_Interp *);.
1ced0 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1cee0 71 6c 69 74 65 74 65 73 74 5f 66 75 6e 63 5f 49  qlitetest_func_I
1cef0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1cf00 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1cf10 20 53 71 6c 69 74 65 74 65 73 74 5f 68 65 78 69   Sqlitetest_hexi
1cf20 6f 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  o_Init(Tcl_Inter
1cf30 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1cf40 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f 69  int Sqlitetest_i
1cf50 6e 69 74 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  nit_Init(Tcl_Int
1cf60 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1cf70 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1cf80 5f 6d 61 6c 6c 6f 63 5f 49 6e 69 74 28 54 63 6c  _malloc_Init(Tcl
1cf90 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1cfa0 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1cfb0 74 65 73 74 5f 6d 75 74 65 78 5f 49 6e 69 74 28  test_mutex_Init(
1cfc0 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1cfd0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1cfe0 69 74 65 74 65 73 74 73 63 68 65 6d 61 5f 49 6e  itetestschema_In
1cff0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1d000 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1d010 53 71 6c 69 74 65 74 65 73 74 73 73 65 5f 49 6e  Sqlitetestsse_In
1d020 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1d030 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1d040 53 71 6c 69 74 65 74 65 73 74 74 63 6c 76 61 72  Sqlitetesttclvar
1d050 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1d060 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1d070 6e 74 20 53 71 6c 69 74 65 74 65 73 74 54 68 72  nt SqlitetestThr
1d080 65 61 64 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  ead_Init(Tcl_Int
1d090 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1d0a0 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1d0b0 4f 6e 65 66 69 6c 65 5f 49 6e 69 74 28 29 3b 0a  Onefile_Init();.
1d0c0 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1d0d0 71 6c 69 74 65 74 65 73 74 4f 73 69 6e 73 74 5f  qlitetestOsinst_
1d0e0 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1d0f0 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1d100 74 20 53 71 6c 69 74 65 74 65 73 74 62 61 63 6b  t Sqlitetestback
1d110 75 70 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  up_Init(Tcl_Inte
1d120 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
1d130 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 69   int Sqlitetesti
1d140 6e 74 61 72 72 61 79 5f 49 6e 69 74 28 54 63 6c  ntarray_Init(Tcl
1d150 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1d160 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1d170 74 65 73 74 76 66 73 5f 49 6e 69 74 28 54 63 6c  testvfs_Init(Tcl
1d180 5f 49 6e 74 65 72 70 20 2a 29 3b 0a 20 20 20 20  _Interp *);.    
1d190 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1d1a0 65 74 65 73 74 72 74 72 65 65 5f 49 6e 69 74 28  etestrtree_Init(
1d1b0 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1d1c0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1d1d0 69 74 65 71 75 6f 74 61 5f 49 6e 69 74 28 54 63  itequota_Init(Tc
1d1e0 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1d1f0 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1d200 65 6d 75 6c 74 69 70 6c 65 78 5f 49 6e 69 74 28  emultiplex_Init(
1d210 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1d220 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1d230 69 74 65 53 75 70 65 72 6c 6f 63 6b 5f 49 6e 69  iteSuperlock_Ini
1d240 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1d250 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1d260 71 6c 69 74 65 74 65 73 74 53 79 73 63 61 6c 6c  qlitetestSyscall
1d270 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1d280 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1d290 6e 74 20 53 71 6c 69 74 65 74 65 73 74 66 75 7a  nt Sqlitetestfuz
1d2a0 7a 65 72 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  zer_Init(Tcl_Int
1d2b0 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1d2c0 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1d2d0 77 68 6f 6c 65 6e 75 6d 62 65 72 5f 49 6e 69 74  wholenumber_Init
1d2e0 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 23  (Tcl_Interp*);.#
1d2f0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1d300 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e  E_ENABLE_SESSION
1d310 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
1d320 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50  ITE_ENABLE_PREUP
1d330 44 41 54 45 5f 48 4f 4f 4b 29 0a 20 20 20 20 65  DATE_HOOK).    e
1d340 78 74 65 72 6e 20 69 6e 74 20 54 65 73 74 53 65  xtern int TestSe
1d350 73 73 69 6f 6e 5f 49 6e 69 74 28 54 63 6c 5f 49  ssion_Init(Tcl_I
1d360 6e 74 65 72 70 2a 29 3b 0a 23 65 6e 64 69 66 0a  nterp*);.#endif.
1d370 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1d380 71 6c 69 74 65 74 65 73 74 72 65 67 65 78 70 5f  qlitetestregexp_
1d390 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1d3a0 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  );..#if defined(
1d3b0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54  SQLITE_ENABLE_FT
1d3c0 53 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  S3) || defined(S
1d3d0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53  QLITE_ENABLE_FTS
1d3e0 34 29 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  4).    extern in
1d3f0 74 20 53 71 6c 69 74 65 74 65 73 74 66 74 73 33  t Sqlitetestfts3
1d400 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1d410 20 2a 69 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69   *interp);.#endi
1d420 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
1d430 5f 45 4e 41 42 4c 45 5f 5a 49 50 56 46 53 0a 20  _ENABLE_ZIPVFS. 
1d440 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 5a 69     extern int Zi
1d450 70 76 66 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  pvfs_Init(Tcl_In
1d460 74 65 72 70 2a 29 3b 0a 20 20 20 20 5a 69 70 76  terp*);.    Zipv
1d470 66 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  fs_Init(interp);
1d480 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 53 71 6c  .#endif..    Sql
1d490 69 74 65 63 6f 6e 66 69 67 5f 49 6e 69 74 28 69  iteconfig_Init(i
1d4a0 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1d4b0 74 65 74 65 73 74 31 5f 49 6e 69 74 28 69 6e 74  tetest1_Init(int
1d4c0 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1d4d0 74 65 73 74 32 5f 49 6e 69 74 28 69 6e 74 65 72  test2_Init(inter
1d4e0 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
1d4f0 73 74 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  st3_Init(interp)
1d500 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1d510 34 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  4_Init(interp);.
1d520 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 35 5f      Sqlitetest5_
1d530 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
1d540 20 20 53 71 6c 69 74 65 74 65 73 74 36 5f 49 6e    Sqlitetest6_In
1d550 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1d560 53 71 6c 69 74 65 74 65 73 74 37 5f 49 6e 69 74  Sqlitetest7_Init
1d570 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1d580 6c 69 74 65 74 65 73 74 38 5f 49 6e 69 74 28 69  litetest8_Init(i
1d590 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1d5a0 74 65 74 65 73 74 39 5f 49 6e 69 74 28 69 6e 74  tetest9_Init(int
1d5b0 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1d5c0 74 65 73 74 61 73 79 6e 63 5f 49 6e 69 74 28 69  testasync_Init(i
1d5d0 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1d5e0 74 65 74 65 73 74 5f 61 75 74 6f 65 78 74 5f 49  tetest_autoext_I
1d5f0 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1d600 20 53 71 6c 69 74 65 74 65 73 74 5f 64 65 6d 6f   Sqlitetest_demo
1d610 76 66 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  vfs_Init(interp)
1d620 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1d630 5f 66 75 6e 63 5f 49 6e 69 74 28 69 6e 74 65 72  _func_Init(inter
1d640 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
1d650 73 74 5f 68 65 78 69 6f 5f 49 6e 69 74 28 69 6e  st_hexio_Init(in
1d660 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
1d670 65 74 65 73 74 5f 69 6e 69 74 5f 49 6e 69 74 28  etest_init_Init(
1d680 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
1d690 69 74 65 74 65 73 74 5f 6d 61 6c 6c 6f 63 5f 49  itetest_malloc_I
1d6a0 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1d6b0 20 53 71 6c 69 74 65 74 65 73 74 5f 6d 75 74 65   Sqlitetest_mute
1d6c0 78 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  x_Init(interp);.
1d6d0 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 73 63      Sqlitetestsc
1d6e0 68 65 6d 61 5f 49 6e 69 74 28 69 6e 74 65 72 70  hema_Init(interp
1d6f0 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1d700 74 74 63 6c 76 61 72 5f 49 6e 69 74 28 69 6e 74  ttclvar_Init(int
1d710 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1d720 74 65 73 74 54 68 72 65 61 64 5f 49 6e 69 74 28  testThread_Init(
1d730 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
1d740 69 74 65 74 65 73 74 4f 6e 65 66 69 6c 65 5f 49  itetestOnefile_I
1d750 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1d760 20 53 71 6c 69 74 65 74 65 73 74 4f 73 69 6e 73   SqlitetestOsins
1d770 74 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  t_Init(interp);.
1d780 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 62 61      Sqlitetestba
1d790 63 6b 75 70 5f 49 6e 69 74 28 69 6e 74 65 72 70  ckup_Init(interp
1d7a0 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1d7b0 74 69 6e 74 61 72 72 61 79 5f 49 6e 69 74 28 69  tintarray_Init(i
1d7c0 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1d7d0 74 65 74 65 73 74 76 66 73 5f 49 6e 69 74 28 69  tetestvfs_Init(i
1d7e0 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1d7f0 74 65 74 65 73 74 72 74 72 65 65 5f 49 6e 69 74  tetestrtree_Init
1d800 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1d810 6c 69 74 65 71 75 6f 74 61 5f 49 6e 69 74 28 69  litequota_Init(i
1d820 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1d830 74 65 6d 75 6c 74 69 70 6c 65 78 5f 49 6e 69 74  temultiplex_Init
1d840 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1d850 6c 69 74 65 53 75 70 65 72 6c 6f 63 6b 5f 49 6e  liteSuperlock_In
1d860 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1d870 53 71 6c 69 74 65 74 65 73 74 53 79 73 63 61 6c  SqlitetestSyscal
1d880 6c 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  l_Init(interp);.
1d890 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 66 75      Sqlitetestfu
1d8a0 7a 7a 65 72 5f 49 6e 69 74 28 69 6e 74 65 72 70  zzer_Init(interp
1d8b0 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1d8c0 74 77 68 6f 6c 65 6e 75 6d 62 65 72 5f 49 6e 69  twholenumber_Ini
1d8d0 74 28 69 6e 74 65 72 70 29 3b 0a 23 69 66 20 64  t(interp);.#if d
1d8e0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
1d8f0 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 20 26 26  ABLE_SESSION) &&
1d900 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1d910 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45  ENABLE_PREUPDATE
1d920 5f 48 4f 4f 4b 29 0a 20 20 20 20 54 65 73 74 53  _HOOK).    TestS
1d930 65 73 73 69 6f 6e 5f 49 6e 69 74 28 69 6e 74 65  ession_Init(inte
1d940 72 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  rp);.#endif.    
1d950 53 71 6c 69 74 65 74 65 73 74 72 65 67 65 78 70  Sqlitetestregexp
1d960 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 0a  _Init(interp);..
1d970 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
1d980 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 29 20  TE_ENABLE_FTS3) 
1d990 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
1d9a0 45 5f 45 4e 41 42 4c 45 5f 46 54 53 34 29 0a 20  E_ENABLE_FTS4). 
1d9b0 20 20 20 53 71 6c 69 74 65 74 65 73 74 66 74 73     Sqlitetestfts
1d9c0 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  3_Init(interp);.
1d9d0 23 65 6e 64 69 66 0a 0a 20 20 20 20 54 63 6c 5f  #endif..    Tcl_
1d9e0 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
1d9f0 28 0a 20 20 20 20 20 20 20 20 69 6e 74 65 72 70  (.        interp
1da00 2c 20 22 6c 6f 61 64 5f 74 65 73 74 66 69 78 74  , "load_testfixt
1da10 75 72 65 5f 65 78 74 65 6e 73 69 6f 6e 73 22 2c  ure_extensions",
1da20 20 69 6e 69 74 5f 61 6c 6c 5f 63 6d 64 2c 20 30   init_all_cmd, 0
1da30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 20 20 54  , 0.    );.    T
1da40 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
1da50 61 6e 64 28 0a 20 20 20 20 20 20 20 20 69 6e 74  and(.        int
1da60 65 72 70 2c 20 22 64 62 5f 75 73 65 5f 6c 65 67  erp, "db_use_leg
1da70 61 63 79 5f 70 72 65 70 61 72 65 22 2c 20 64 62  acy_prepare", db
1da80 5f 75 73 65 5f 6c 65 67 61 63 79 5f 70 72 65 70  _use_legacy_prep
1da90 61 72 65 5f 63 6d 64 2c 20 30 2c 20 30 0a 20 20  are_cmd, 0, 0.  
1daa0 20 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c    );..#ifdef SQL
1dab0 49 54 45 5f 53 53 45 0a 20 20 20 20 53 71 6c 69  ITE_SSE.    Sqli
1dac0 74 65 74 65 73 74 73 73 65 5f 49 6e 69 74 28 69  tetestsse_Init(i
1dad0 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69 66 0a 20  nterp);.#endif. 
1dae0 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 64 65   }.#endif.}..#de
1daf0 66 69 6e 65 20 54 43 4c 53 48 5f 4d 41 49 4e 20  fine TCLSH_MAIN 
1db00 6d 61 69 6e 20 20 20 2f 2a 20 4e 65 65 64 65 64  main   /* Needed
1db10 20 74 6f 20 66 61 6b 65 20 6f 75 74 20 6d 6b 74   to fake out mkt
1db20 63 6c 61 70 70 20 2a 2f 0a 69 6e 74 20 54 43 4c  clapp */.int TCL
1db30 53 48 5f 4d 41 49 4e 28 69 6e 74 20 61 72 67 63  SH_MAIN(int argc
1db40 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a  , char **argv){.
1db50 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1db60 74 65 72 70 3b 0a 20 20 0a 20 20 2f 2a 20 43 61  terp;.  .  /* Ca
1db70 6c 6c 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64  ll sqlite3_shutd
1db80 6f 77 6e 28 29 20 6f 6e 63 65 20 62 65 66 6f 72  own() once befor
1db90 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67  e doing anything
1dba0 20 65 6c 73 65 2e 20 54 68 69 73 20 69 73 20 74   else. This is t
1dbb0 6f 0a 20 20 2a 2a 20 74 65 73 74 20 74 68 61 74  o.  ** test that
1dbc0 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77   sqlite3_shutdow
1dbd0 6e 28 29 20 63 61 6e 20 62 65 20 73 61 66 65 6c  n() can be safel
1dbe0 79 20 63 61 6c 6c 65 64 20 62 79 20 61 20 70 72  y called by a pr
1dbf0 6f 63 65 73 73 20 62 65 66 6f 72 65 0a 20 20 2a  ocess before.  *
1dc00 2a 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  * sqlite3_initia
1dc10 6c 69 7a 65 28 29 20 69 73 2e 20 2a 2f 0a 20 20  lize() is. */.  
1dc20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e  sqlite3_shutdown
1dc30 28 29 3b 0a 0a 20 20 54 63 6c 5f 46 69 6e 64 45  ();..  Tcl_FindE
1dc40 78 65 63 75 74 61 62 6c 65 28 61 72 67 76 5b 30  xecutable(argv[0
1dc50 5d 29 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20 54  ]);.  interp = T
1dc60 63 6c 5f 43 72 65 61 74 65 49 6e 74 65 72 70 28  cl_CreateInterp(
1dc70 29 3b 0a 0a 23 69 66 20 54 43 4c 53 48 3d 3d 32  );..#if TCLSH==2
1dc80 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69  .  sqlite3_confi
1dc90 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  g(SQLITE_CONFIG_
1dca0 53 49 4e 47 4c 45 54 48 52 45 41 44 29 3b 0a 23  SINGLETHREAD);.#
1dcb0 65 6e 64 69 66 0a 0a 20 20 69 6e 69 74 5f 61 6c  endif..  init_al
1dcc0 6c 28 69 6e 74 65 72 70 29 3b 0a 20 20 69 66 28  l(interp);.  if(
1dcd0 20 61 72 67 63 3e 3d 32 20 29 7b 0a 20 20 20 20   argc>=2 ){.    
1dce0 69 6e 74 20 69 3b 0a 20 20 20 20 63 68 61 72 20  int i;.    char 
1dcf0 7a 41 72 67 63 5b 33 32 5d 3b 0a 20 20 20 20 73  zArgc[32];.    s
1dd00 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
1dd10 73 69 7a 65 6f 66 28 7a 41 72 67 63 29 2c 20 7a  sizeof(zArgc), z
1dd20 41 72 67 63 2c 20 22 25 64 22 2c 20 61 72 67 63  Argc, "%d", argc
1dd30 2d 28 33 2d 54 43 4c 53 48 29 29 3b 0a 20 20 20  -(3-TCLSH));.   
1dd40 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65   Tcl_SetVar(inte
1dd50 72 70 2c 22 61 72 67 63 22 2c 20 7a 41 72 67 63  rp,"argc", zArgc
1dd60 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c  , TCL_GLOBAL_ONL
1dd70 59 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 56  Y);.    Tcl_SetV
1dd80 61 72 28 69 6e 74 65 72 70 2c 22 61 72 67 76 30  ar(interp,"argv0
1dd90 22 2c 61 72 67 76 5b 31 5d 2c 54 43 4c 5f 47 4c  ",argv[1],TCL_GL
1dda0 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20  OBAL_ONLY);.    
1ddb0 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72  Tcl_SetVar(inter
1ddc0 70 2c 22 61 72 67 76 22 2c 20 22 22 2c 20 54 43  p,"argv", "", TC
1ddd0 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a  L_GLOBAL_ONLY);.
1dde0 20 20 20 20 66 6f 72 28 69 3d 33 2d 54 43 4c 53      for(i=3-TCLS
1ddf0 48 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b  H; i<argc; i++){
1de00 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 56 61  .      Tcl_SetVa
1de10 72 28 69 6e 74 65 72 70 2c 20 22 61 72 67 76 22  r(interp, "argv"
1de20 2c 20 61 72 67 76 5b 69 5d 2c 0a 20 20 20 20 20  , argv[i],.     
1de30 20 20 20 20 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f       TCL_GLOBAL_
1de40 4f 4e 4c 59 20 7c 20 54 43 4c 5f 4c 49 53 54 5f  ONLY | TCL_LIST_
1de50 45 4c 45 4d 45 4e 54 20 7c 20 54 43 4c 5f 41 50  ELEMENT | TCL_AP
1de60 50 45 4e 44 5f 56 41 4c 55 45 29 3b 0a 20 20 20  PEND_VALUE);.   
1de70 20 7d 0a 20 20 20 20 69 66 28 20 54 43 4c 53 48   }.    if( TCLSH
1de80 3d 3d 31 20 26 26 20 54 63 6c 5f 45 76 61 6c 46  ==1 && Tcl_EvalF
1de90 69 6c 65 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ile(interp, argv
1dea0 5b 31 5d 29 21 3d 54 43 4c 5f 4f 4b 20 29 7b 0a  [1])!=TCL_OK ){.
1deb0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
1dec0 20 2a 7a 49 6e 66 6f 20 3d 20 54 63 6c 5f 47 65   *zInfo = Tcl_Ge
1ded0 74 56 61 72 28 69 6e 74 65 72 70 2c 20 22 65 72  tVar(interp, "er
1dee0 72 6f 72 49 6e 66 6f 22 2c 20 54 43 4c 5f 47 4c  rorInfo", TCL_GL
1def0 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20  OBAL_ONLY);.    
1df00 20 20 69 66 28 20 7a 49 6e 66 6f 3d 3d 30 20 29    if( zInfo==0 )
1df10 20 7a 49 6e 66 6f 20 3d 20 54 63 6c 5f 47 65 74   zInfo = Tcl_Get
1df20 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74  StringResult(int
1df30 65 72 70 29 3b 0a 20 20 20 20 20 20 66 70 72 69  erp);.      fpri
1df40 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a 20  ntf(stderr,"%s: 
1df50 25 73 5c 6e 22 2c 20 2a 61 72 67 76 2c 20 7a 49  %s\n", *argv, zI
1df60 6e 66 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75  nfo);.      retu
1df70 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1df80 20 20 69 66 28 20 54 43 4c 53 48 3d 3d 32 20 7c    if( TCLSH==2 |
1df90 7c 20 61 72 67 63 3c 3d 31 20 29 7b 0a 20 20 20  | argc<=1 ){.   
1dfa0 20 54 63 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 28   Tcl_GlobalEval(
1dfb0 69 6e 74 65 72 70 2c 20 74 63 6c 73 68 5f 6d 61  interp, tclsh_ma
1dfc0 69 6e 5f 6c 6f 6f 70 28 29 29 3b 0a 20 20 7d 0a  in_loop());.  }.
1dfd0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
1dfe0 6e 64 69 66 20 2f 2a 20 54 43 4c 53 48 20 2a 2f  ndif /* TCLSH */
1dff0 0a                                               .