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

Artifact fc9027118d5fa1b3d16a7b22c63684a54adeeb42:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 41 20 54 43 4c 20  ******.** A TCL 
0180: 49 6e 74 65 72 66 61 63 65 20 74 6f 20 53 51 4c  Interface to SQL
0190: 69 74 65 2e 20 20 41 70 70 65 6e 64 20 74 68 69  ite.  Append thi
01a0: 73 20 66 69 6c 65 20 74 6f 20 73 71 6c 69 74 65  s file to sqlite
01b0: 33 2e 63 20 61 6e 64 0a 2a 2a 20 63 6f 6d 70 69  3.c and.** compi
01c0: 6c 65 20 74 68 65 20 77 68 6f 6c 65 20 74 68 69  le the whole thi
01d0: 6e 67 20 74 6f 20 62 75 69 6c 64 20 61 20 54 43  ng to build a TC
01e0: 4c 2d 65 6e 61 62 6c 65 64 20 76 65 72 73 69 6f  L-enabled versio
01f0: 6e 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a 0a  n of SQLite..**.
0200: 2a 2a 20 43 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  ** Compile-time 
0210: 6f 70 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20  options:.**.**  
0220: 2d 44 54 43 4c 53 48 3d 31 20 20 20 20 20 20 20  -DTCLSH=1       
0230: 20 20 20 20 20 20 41 64 64 20 61 20 22 6d 61 69        Add a "mai
0240: 6e 28 29 22 20 72 6f 75 74 69 6e 65 20 74 68 61  n()" routine tha
0250: 74 20 77 6f 72 6b 73 20 61 73 20 61 20 74 63 6c  t works as a tcl
0260: 73 68 2e 0a 2a 2a 0a 2a 2a 20 20 2d 44 53 51 4c  sh..**.**  -DSQL
0270: 49 54 45 5f 54 43 4c 4d 44 35 20 20 20 20 20 20  ITE_TCLMD5      
0280: 20 57 68 65 6e 20 75 73 65 64 20 69 6e 20 63 6f   When used in co
0290: 6e 6a 75 63 74 69 6f 6e 20 77 69 74 68 20 2d 44  njuction with -D
02a0: 54 43 4c 53 48 3d 31 2c 20 61 64 64 0a 2a 2a 20  TCLSH=1, add.** 
02b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
02c0: 20 20 20 20 20 20 20 66 6f 75 72 20 6e 65 77 20         four new 
02d0: 63 6f 6d 6d 61 6e 64 73 20 74 6f 20 74 68 65 20  commands to the 
02e0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
02f0: 66 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  for.**          
0300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 65                ge
0310: 6e 65 72 61 74 69 6e 67 20 4d 44 35 20 63 68 65  nerating MD5 che
0320: 63 6b 73 75 6d 73 3a 20 20 6d 64 35 2c 20 6d 64  cksums:  md5, md
0330: 35 66 69 6c 65 2c 0a 2a 2a 20 20 20 20 20 20 20  5file,.**       
0340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0350: 20 6d 64 35 2d 31 30 78 38 2c 20 61 6e 64 20 6d   md5-10x8, and m
0360: 64 35 66 69 6c 65 2d 31 30 78 38 2e 0a 2a 2a 0a  d5file-10x8..**.
0370: 2a 2a 20 20 2d 44 53 51 4c 49 54 45 5f 54 45 53  **  -DSQLITE_TES
0380: 54 20 20 20 20 20 20 20 20 20 57 68 65 6e 20 75  T         When u
0390: 73 65 64 20 69 6e 20 63 6f 6e 6a 75 63 74 69 6f  sed in conjuctio
03a0: 6e 20 77 69 74 68 20 2d 44 54 43 4c 53 48 3d 31  n with -DTCLSH=1
03b0: 2c 20 61 64 64 0a 2a 2a 20 20 20 20 20 20 20 20  , add.**        
03c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
03d0: 68 75 6e 64 72 65 64 73 20 6f 66 20 6e 65 77 20  hundreds of new 
03e0: 63 6f 6d 6d 61 6e 64 73 20 75 73 65 64 20 66 6f  commands used fo
03f0: 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20 20 20 20  r testing.**    
0400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0410: 20 20 20 20 53 51 4c 69 74 65 2e 20 20 54 68 69      SQLite.  Thi
0420: 73 20 6f 70 74 69 6f 6e 20 69 6d 70 6c 69 65 73  s option implies
0430: 20 2d 44 53 51 4c 49 54 45 5f 54 43 4c 4d 44 35   -DSQLITE_TCLMD5
0440: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 74  ..*/.#include "t
0450: 63 6c 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c  cl.h".#include <
0460: 65 72 72 6e 6f 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20  errno.h>../*.** 
0470: 53 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  Some additional 
0480: 69 6e 63 6c 75 64 65 20 66 69 6c 65 73 20 61 72  include files ar
0490: 65 20 6e 65 65 64 65 64 20 69 66 20 74 68 69 73  e needed if this
04a0: 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20   file is not.** 
04b0: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
04c0: 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 2e 0a 2a 2f  amalgamation..*/
04d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
04e0: 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 0a 23 20 69  AMALGAMATION.# i
04f0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33 2e  nclude "sqlite3.
0500: 68 22 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 74  h".# include <st
0510: 64 6c 69 62 2e 68 3e 0a 23 20 69 6e 63 6c 75 64  dlib.h>.# includ
0520: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 20 69  e <string.h>.# i
0530: 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68  nclude <assert.h
0540: 3e 0a 20 20 74 79 70 65 64 65 66 20 75 6e 73 69  >.  typedef unsi
0550: 67 6e 65 64 20 63 68 61 72 20 75 38 3b 0a 23 65  gned char u8;.#e
0560: 6e 64 69 66 0a 23 69 6e 63 6c 75 64 65 20 3c 63  ndif.#include <c
0570: 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 20 2a 20 57  type.h>../*. * W
0580: 69 6e 64 6f 77 73 20 6e 65 65 64 73 20 74 6f 20  indows needs to 
0590: 6b 6e 6f 77 20 77 68 69 63 68 20 73 79 6d 62 6f  know which symbo
05a0: 6c 73 20 74 6f 20 65 78 70 6f 72 74 2e 20 20 55  ls to export.  U
05b0: 6e 69 78 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 2a  nix does not.. *
05c0: 20 42 55 49 4c 44 5f 73 71 6c 69 74 65 20 73 68   BUILD_sqlite sh
05d0: 6f 75 6c 64 20 62 65 20 75 6e 64 65 66 69 6e 65  ould be undefine
05e0: 64 20 66 6f 72 20 55 6e 69 78 2e 0a 20 2a 2f 0a  d for Unix.. */.
05f0: 23 69 66 64 65 66 20 42 55 49 4c 44 5f 73 71 6c  #ifdef BUILD_sql
0600: 69 74 65 0a 23 75 6e 64 65 66 20 54 43 4c 5f 53  ite.#undef TCL_S
0610: 54 4f 52 41 47 45 5f 43 4c 41 53 53 0a 23 64 65  TORAGE_CLASS.#de
0620: 66 69 6e 65 20 54 43 4c 5f 53 54 4f 52 41 47 45  fine TCL_STORAGE
0630: 5f 43 4c 41 53 53 20 44 4c 4c 45 58 50 4f 52 54  _CLASS DLLEXPORT
0640: 0a 23 65 6e 64 69 66 20 2f 2a 20 42 55 49 4c 44  .#endif /* BUILD
0650: 5f 73 71 6c 69 74 65 20 2a 2f 0a 0a 23 64 65 66  _sqlite */..#def
0660: 69 6e 65 20 4e 55 4d 5f 50 52 45 50 41 52 45 44  ine NUM_PREPARED
0670: 5f 53 54 4d 54 53 20 31 30 0a 23 64 65 66 69 6e  _STMTS 10.#defin
0680: 65 20 4d 41 58 5f 50 52 45 50 41 52 45 44 5f 53  e MAX_PREPARED_S
0690: 54 4d 54 53 20 31 30 30 0a 0a 2f 2a 20 46 6f 72  TMTS 100../* For
06a0: 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
06b0: 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75   */.typedef stru
06c0: 63 74 20 53 71 6c 69 74 65 44 62 20 53 71 6c 69  ct SqliteDb Sqli
06d0: 74 65 44 62 3b 0a 0a 2f 2a 0a 2a 2a 20 4e 65 77  teDb;../*.** New
06e0: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20 63   SQL functions c
06f0: 61 6e 20 62 65 20 63 72 65 61 74 65 64 20 61 73  an be created as
0700: 20 54 43 4c 20 73 63 72 69 70 74 73 2e 20 20 45   TCL scripts.  E
0710: 61 63 68 20 73 75 63 68 20 66 75 6e 63 74 69 6f  ach such functio
0720: 6e 0a 2a 2a 20 69 73 20 64 65 73 63 72 69 62 65  n.** is describe
0730: 64 20 62 79 20 61 6e 20 69 6e 73 74 61 6e 63 65  d by an instance
0740: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
0750: 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  g structure..*/.
0760: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53  typedef struct S
0770: 71 6c 46 75 6e 63 20 53 71 6c 46 75 6e 63 3b 0a  qlFunc SqlFunc;.
0780: 73 74 72 75 63 74 20 53 71 6c 46 75 6e 63 20 7b  struct SqlFunc {
0790: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
07a0: 6e 74 65 72 70 3b 20 20 20 2f 2a 20 54 68 65 20  nterp;   /* The 
07b0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 20 74 6f  TCL interpret to
07c0: 20 65 78 65 63 75 74 65 20 74 68 65 20 66 75 6e   execute the fun
07d0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ction */.  Tcl_O
07e0: 62 6a 20 2a 70 53 63 72 69 70 74 3b 20 20 20 20  bj *pScript;    
07f0: 20 2f 2a 20 54 68 65 20 54 63 6c 5f 4f 62 6a 20   /* The Tcl_Obj 
0800: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
0810: 66 20 74 68 65 20 73 63 72 69 70 74 20 2a 2f 0a  f the script */.
0820: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 3b    SqliteDb *pDb;
0830: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
0840: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  ase connection t
0850: 68 61 74 20 6f 77 6e 73 20 74 68 69 73 20 66 75  hat owns this fu
0860: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  nction */.  int 
0870: 75 73 65 45 76 61 6c 4f 62 6a 76 3b 20 20 20 20  useEvalObjv;    
0880: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 74 20    /* True if it 
0890: 69 73 20 73 61 66 65 20 74 6f 20 75 73 65 20 54  is safe to use T
08a0: 63 6c 5f 45 76 61 6c 4f 62 6a 76 20 2a 2f 0a 20  cl_EvalObjv */. 
08b0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
08c0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
08d0: 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
08e0: 2a 2f 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70 4e  */.  SqlFunc *pN
08f0: 65 78 74 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65  ext;       /* Ne
0900: 78 74 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 20 74  xt function on t
0910: 68 65 20 6c 69 73 74 20 6f 66 20 74 68 65 6d 20  he list of them 
0920: 61 6c 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  all */.};../*.**
0930: 20 4e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   New collation s
0940: 65 71 75 65 6e 63 65 73 20 66 75 6e 63 74 69 6f  equences functio
0950: 6e 20 63 61 6e 20 62 65 20 63 72 65 61 74 65 64  n can be created
0960: 20 61 73 20 54 43 4c 20 73 63 72 69 70 74 73 2e   as TCL scripts.
0970: 20 20 45 61 63 68 20 73 75 63 68 0a 2a 2a 20 66    Each such.** f
0980: 75 6e 63 74 69 6f 6e 20 69 73 20 64 65 73 63 72  unction is descr
0990: 69 62 65 64 20 62 79 20 61 6e 20 69 6e 73 74 61  ibed by an insta
09a0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
09b0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
09c0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
09d0: 74 20 53 71 6c 43 6f 6c 6c 61 74 65 20 53 71 6c  t SqlCollate Sql
09e0: 43 6f 6c 6c 61 74 65 3b 0a 73 74 72 75 63 74 20  Collate;.struct 
09f0: 53 71 6c 43 6f 6c 6c 61 74 65 20 7b 0a 20 20 54  SqlCollate {.  T
0a00: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
0a10: 70 3b 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  p;   /* The TCL 
0a20: 69 6e 74 65 72 70 72 65 74 20 74 6f 20 65 78 65  interpret to exe
0a30: 63 75 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f  cute the functio
0a40: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 63  n */.  char *zSc
0a50: 72 69 70 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  ript;        /* 
0a60: 54 68 65 20 73 63 72 69 70 74 20 74 6f 20 62 65  The script to be
0a70: 20 72 75 6e 20 2a 2f 0a 20 20 53 71 6c 43 6f 6c   run */.  SqlCol
0a80: 6c 61 74 65 20 2a 70 4e 65 78 74 3b 20 20 20 20  late *pNext;    
0a90: 2f 2a 20 4e 65 78 74 20 66 75 6e 63 74 69 6f 6e  /* Next function
0aa0: 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20   on the list of 
0ab0: 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 7d 3b 0a 0a  them all */.};..
0ac0: 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 64 20 73  /*.** Prepared s
0ad0: 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 63 61  tatements are ca
0ae0: 63 68 65 64 20 66 6f 72 20 66 61 73 74 65 72 20  ched for faster 
0af0: 65 78 65 63 75 74 69 6f 6e 2e 20 20 45 61 63 68  execution.  Each
0b00: 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74 61   prepared.** sta
0b10: 74 65 6d 65 6e 74 20 69 73 20 64 65 73 63 72 69  tement is descri
0b20: 62 65 64 20 62 79 20 61 6e 20 69 6e 73 74 61 6e  bed by an instan
0b30: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
0b40: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ing structure..*
0b50: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0b60: 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74   SqlPreparedStmt
0b70: 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74   SqlPreparedStmt
0b80: 3b 0a 73 74 72 75 63 74 20 53 71 6c 50 72 65 70  ;.struct SqlPrep
0b90: 61 72 65 64 53 74 6d 74 20 7b 0a 20 20 53 71 6c  aredStmt {.  Sql
0ba0: 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70 4e  PreparedStmt *pN
0bb0: 65 78 74 3b 20 20 2f 2a 20 4e 65 78 74 20 69 6e  ext;  /* Next in
0bc0: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 2a 2f 0a   linked list */.
0bd0: 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d    SqlPreparedStm
0be0: 74 20 2a 70 50 72 65 76 3b 20 20 2f 2a 20 50 72  t *pPrev;  /* Pr
0bf0: 65 76 69 6f 75 73 20 6f 6e 20 74 68 65 20 6c 69  evious on the li
0c00: 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  st */.  sqlite3_
0c10: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20  stmt *pStmt;    
0c20: 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65 64   /* The prepared
0c30: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
0c40: 69 6e 74 20 6e 53 71 6c 3b 20 20 20 20 20 20 20  int nSql;       
0c50: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 68 61 72           /* char
0c60: 73 20 69 6e 20 7a 53 71 6c 5b 5d 20 2a 2f 0a 20  s in zSql[] */. 
0c70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
0c80: 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78  l;        /* Tex
0c90: 74 20 6f 66 20 74 68 65 20 53 51 4c 20 73 74 61  t of the SQL sta
0ca0: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
0cb0: 6e 50 61 72 6d 3b 20 20 20 20 20 20 20 20 20 20  nParm;          
0cc0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
0cd0: 61 70 50 61 72 6d 20 61 72 72 61 79 20 2a 2f 0a  apParm array */.
0ce0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 50 61    Tcl_Obj **apPa
0cf0: 72 6d 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 72  rm;        /* Ar
0d00: 72 61 79 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ray of reference
0d10: 64 20 6f 62 6a 65 63 74 20 70 6f 69 6e 74 65 72  d object pointer
0d20: 73 20 2a 2f 0a 7d 3b 0a 0a 74 79 70 65 64 65 66  s */.};..typedef
0d30: 20 73 74 72 75 63 74 20 49 6e 63 72 62 6c 6f 62   struct Incrblob
0d40: 43 68 61 6e 6e 65 6c 20 49 6e 63 72 62 6c 6f 62  Channel Incrblob
0d50: 43 68 61 6e 6e 65 6c 3b 0a 0a 2f 2a 0a 2a 2a 20  Channel;../*.** 
0d60: 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73  There is one ins
0d70: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74  tance of this st
0d80: 72 75 63 74 75 72 65 20 66 6f 72 20 65 61 63 68  ructure for each
0d90: 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
0da0: 0a 2a 2a 20 74 68 61 74 20 68 61 73 20 62 65 65  .** that has bee
0db0: 6e 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20  n opened by the 
0dc0: 53 51 4c 69 74 65 20 54 43 4c 20 69 6e 74 65 72  SQLite TCL inter
0dd0: 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  face..**.** If t
0de0: 68 69 73 20 6d 6f 64 75 6c 65 20 69 73 20 62 75  his module is bu
0df0: 69 6c 74 20 77 69 74 68 20 53 51 4c 49 54 45 5f  ilt with SQLITE_
0e00: 54 45 53 54 20 64 65 66 69 6e 65 64 20 28 74 6f  TEST defined (to
0e10: 20 63 72 65 61 74 65 20 74 68 65 20 53 51 4c 69   create the SQLi
0e20: 74 65 0a 2a 2a 20 74 65 73 74 66 69 78 74 75 72  te.** testfixtur
0e30: 65 20 65 78 65 63 75 74 61 62 6c 65 29 2c 20 74  e executable), t
0e40: 68 65 6e 20 69 74 20 6d 61 79 20 62 65 20 63 6f  hen it may be co
0e50: 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73 65 20  nfigured to use 
0e60: 65 69 74 68 65 72 0a 2a 2a 20 73 71 6c 69 74 65  either.** sqlite
0e70: 33 5f 70 72 65 70 61 72 65 5f 76 32 28 29 20 6f  3_prepare_v2() o
0e80: 72 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  r sqlite3_prepar
0e90: 65 28 29 20 74 6f 20 70 72 65 70 61 72 65 20 53  e() to prepare S
0ea0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  QL statements..*
0eb0: 2a 20 49 66 20 53 71 6c 69 74 65 44 62 2e 62 4c  * If SqliteDb.bL
0ec0: 65 67 61 63 79 50 72 65 70 61 72 65 20 69 73 20  egacyPrepare is 
0ed0: 74 72 75 65 2c 20 73 71 6c 69 74 65 33 5f 70 72  true, sqlite3_pr
0ee0: 65 70 61 72 65 28 29 20 69 73 20 75 73 65 64 2e  epare() is used.
0ef0: 0a 2a 2f 0a 73 74 72 75 63 74 20 53 71 6c 69 74  .*/.struct Sqlit
0f00: 65 44 62 20 7b 0a 20 20 73 71 6c 69 74 65 33 20  eDb {.  sqlite3 
0f10: 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
0f20: 20 20 20 2f 2a 20 54 68 65 20 22 72 65 61 6c 22     /* The "real"
0f30: 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74   database struct
0f40: 75 72 65 2e 20 4d 55 53 54 20 42 45 20 46 49 52  ure. MUST BE FIR
0f50: 53 54 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  ST */.  Tcl_Inte
0f60: 72 70 20 2a 69 6e 74 65 72 70 3b 20 20 20 20 20  rp *interp;     
0f70: 20 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 72 70     /* The interp
0f80: 72 65 74 65 72 20 75 73 65 64 20 66 6f 72 20 74  reter used for t
0f90: 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  his database */.
0fa0: 20 20 63 68 61 72 20 2a 7a 42 75 73 79 3b 20 20    char *zBusy;  
0fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0fc0: 54 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  The busy callbac
0fd0: 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63  k routine */.  c
0fe0: 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 20 20 20  har *zCommit;   
0ff0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1000: 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 63 61 6c   commit hook cal
1010: 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f  lback routine */
1020: 0a 20 20 63 68 61 72 20 2a 7a 54 72 61 63 65 3b  .  char *zTrace;
1030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1040: 20 54 68 65 20 74 72 61 63 65 20 63 61 6c 6c 62   The trace callb
1050: 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  ack routine */. 
1060: 20 63 68 61 72 20 2a 7a 50 72 6f 66 69 6c 65 3b   char *zProfile;
1070: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1080: 68 65 20 70 72 6f 66 69 6c 65 20 63 61 6c 6c 62  he profile callb
1090: 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  ack routine */. 
10a0: 20 63 68 61 72 20 2a 7a 50 72 6f 67 72 65 73 73   char *zProgress
10b0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
10c0: 68 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c  he progress call
10d0: 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a  back routine */.
10e0: 20 20 63 68 61 72 20 2a 7a 41 75 74 68 3b 20 20    char *zAuth;  
10f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1100: 54 68 65 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  The authorizatio
1110: 6e 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69  n callback routi
1120: 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 61  ne */.  int disa
1130: 62 6c 65 41 75 74 68 3b 20 20 20 20 20 20 20 20  bleAuth;        
1140: 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 74 68     /* Disable th
1150: 65 20 61 75 74 68 6f 72 69 7a 65 72 20 69 66 20  e authorizer if 
1160: 69 74 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 63  it exists */.  c
1170: 68 61 72 20 2a 7a 4e 75 6c 6c 3b 20 20 20 20 20  har *zNull;     
1180: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
1190: 74 20 74 6f 20 73 75 62 73 74 69 74 75 74 65 20  t to substitute 
11a0: 66 6f 72 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 20  for an SQL NULL 
11b0: 76 61 6c 75 65 20 2a 2f 0a 20 20 53 71 6c 46 75  value */.  SqlFu
11c0: 6e 63 20 2a 70 46 75 6e 63 3b 20 20 20 20 20 20  nc *pFunc;      
11d0: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
11e0: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20 2a   SQL functions *
11f0: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 55 70  /.  Tcl_Obj *pUp
1200: 64 61 74 65 48 6f 6f 6b 3b 20 20 20 20 20 20 2f  dateHook;      /
1210: 2a 20 55 70 64 61 74 65 20 68 6f 6f 6b 20 73 63  * Update hook sc
1220: 72 69 70 74 20 28 69 66 20 61 6e 79 29 20 2a 2f  ript (if any) */
1230: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 6f 6c  .  Tcl_Obj *pRol
1240: 6c 62 61 63 6b 48 6f 6f 6b 3b 20 20 20 20 2f 2a  lbackHook;    /*
1250: 20 52 6f 6c 6c 62 61 63 6b 20 68 6f 6f 6b 20 73   Rollback hook s
1260: 63 72 69 70 74 20 28 69 66 20 61 6e 79 29 20 2a  cript (if any) *
1270: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 57 61  /.  Tcl_Obj *pWa
1280: 6c 48 6f 6f 6b 3b 20 20 20 20 20 20 20 20 20 2f  lHook;         /
1290: 2a 20 57 41 4c 20 68 6f 6f 6b 20 73 63 72 69 70  * WAL hook scrip
12a0: 74 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20 20  t (if any) */.  
12b0: 54 63 6c 5f 4f 62 6a 20 2a 70 55 6e 6c 6f 63 6b  Tcl_Obj *pUnlock
12c0: 4e 6f 74 69 66 79 3b 20 20 20 20 2f 2a 20 55 6e  Notify;    /* Un
12d0: 6c 6f 63 6b 20 6e 6f 74 69 66 79 20 73 63 72 69  lock notify scri
12e0: 70 74 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20  pt (if any) */. 
12f0: 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43 6f   SqlCollate *pCo
1300: 6c 6c 61 74 65 3b 20 20 20 20 20 20 2f 2a 20 4c  llate;      /* L
1310: 69 73 74 20 6f 66 20 53 51 4c 20 63 6f 6c 6c 61  ist of SQL colla
1320: 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 73 20 2a  tion functions *
1330: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
1340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1350: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 6f 66  * Return code of
1360: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c   most recent sql
1370: 69 74 65 33 5f 65 78 65 63 28 29 20 2a 2f 0a 20  ite3_exec() */. 
1380: 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f 6c 6c 61   Tcl_Obj *pColla
1390: 74 65 4e 65 65 64 65 64 3b 20 20 20 2f 2a 20 43  teNeeded;   /* C
13a0: 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65 64 65 64 20  ollation needed 
13b0: 73 63 72 69 70 74 20 2a 2f 0a 20 20 53 71 6c 50  script */.  SqlP
13c0: 72 65 70 61 72 65 64 53 74 6d 74 20 2a 73 74 6d  reparedStmt *stm
13d0: 74 4c 69 73 74 3b 20 2f 2a 20 4c 69 73 74 20 6f  tList; /* List o
13e0: 66 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  f prepared state
13f0: 6d 65 6e 74 73 2a 2f 0a 20 20 53 71 6c 50 72 65  ments*/.  SqlPre
1400: 70 61 72 65 64 53 74 6d 74 20 2a 73 74 6d 74 4c  paredStmt *stmtL
1410: 61 73 74 3b 20 2f 2a 20 4c 61 73 74 20 73 74 61  ast; /* Last sta
1420: 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 6c 69  tement in the li
1430: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 53  st */.  int maxS
1440: 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tmt;            
1450: 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 6d     /* The next m
1460: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
1470: 20 73 74 6d 74 4c 69 73 74 20 2a 2f 0a 20 20 69   stmtList */.  i
1480: 6e 74 20 6e 53 74 6d 74 3b 20 20 20 20 20 20 20  nt nStmt;       
1490: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
14a0: 62 65 72 20 6f 66 20 73 74 61 74 65 6d 65 6e 74  ber of statement
14b0: 73 20 69 6e 20 73 74 6d 74 4c 69 73 74 20 2a 2f  s in stmtList */
14c0: 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  .  IncrblobChann
14d0: 65 6c 20 2a 70 49 6e 63 72 62 6c 6f 62 3b 2f 2a  el *pIncrblob;/*
14e0: 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   Linked list of 
14f0: 6f 70 65 6e 20 69 6e 63 72 62 6c 6f 62 20 63 68  open incrblob ch
1500: 61 6e 6e 65 6c 73 20 2a 2f 0a 20 20 69 6e 74 20  annels */.  int 
1510: 6e 53 74 65 70 2c 20 6e 53 6f 72 74 2c 20 6e 49  nStep, nSort, nI
1520: 6e 64 65 78 3b 20 20 2f 2a 20 53 74 61 74 69 73  ndex;  /* Statis
1530: 74 69 63 73 20 66 6f 72 20 6d 6f 73 74 20 72 65  tics for most re
1540: 63 65 6e 74 20 6f 70 65 72 61 74 69 6f 6e 20 2a  cent operation *
1550: 2f 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 61 63  /.  int nTransac
1560: 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 2f  tion;          /
1570: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 73 74  * Number of nest
1580: 65 64 20 5b 74 72 61 6e 73 61 63 74 69 6f 6e 5d  ed [transaction]
1590: 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 69 66 64   methods */.#ifd
15a0: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
15b0: 20 69 6e 74 20 62 4c 65 67 61 63 79 50 72 65 70   int bLegacyPrep
15c0: 61 72 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  are;        /* T
15d0: 72 75 65 20 74 6f 20 75 73 65 20 73 71 6c 69 74  rue to use sqlit
15e0: 65 33 5f 70 72 65 70 61 72 65 28 29 20 2a 2f 0a  e3_prepare() */.
15f0: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 73 74 72 75 63  #endif.};..struc
1600: 74 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65  t IncrblobChanne
1610: 6c 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c  l {.  sqlite3_bl
1620: 6f 62 20 2a 70 42 6c 6f 62 3b 20 20 20 20 20 20  ob *pBlob;      
1630: 2f 2a 20 73 71 6c 69 74 65 33 20 62 6c 6f 62 20  /* sqlite3 blob 
1640: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 53 71 6c 69  handle */.  Sqli
1650: 74 65 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20  teDb *pDb;      
1660: 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61        /* Associa
1670: 74 65 64 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ted database con
1680: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
1690: 20 69 53 65 65 6b 3b 20 20 20 20 20 20 20 20 20   iSeek;         
16a0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
16b0: 74 20 73 65 65 6b 20 6f 66 66 73 65 74 20 2a 2f  t seek offset */
16c0: 0a 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63  .  Tcl_Channel c
16d0: 68 61 6e 6e 65 6c 3b 20 20 20 20 20 20 2f 2a 20  hannel;      /* 
16e0: 43 68 61 6e 6e 65 6c 20 69 64 65 6e 74 69 66 69  Channel identifi
16f0: 65 72 20 2a 2f 0a 20 20 49 6e 63 72 62 6c 6f 62  er */.  Incrblob
1700: 43 68 61 6e 6e 65 6c 20 2a 70 4e 65 78 74 3b 20  Channel *pNext; 
1710: 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74    /* Linked list
1720: 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 69 6e 63   of all open inc
1730: 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 73 20 2a  rblob channels *
1740: 2f 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e  /.  IncrblobChan
1750: 6e 65 6c 20 2a 70 50 72 65 76 3b 20 20 20 2f 2a  nel *pPrev;   /*
1760: 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   Linked list of 
1770: 61 6c 6c 20 6f 70 65 6e 20 69 6e 63 72 62 6c 6f  all open incrblo
1780: 62 20 63 68 61 6e 6e 65 6c 73 20 2a 2f 0a 7d 3b  b channels */.};
1790: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
17a0: 61 20 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  a string length 
17b0: 74 68 61 74 20 69 73 20 6c 69 6d 69 74 65 64 20  that is limited 
17c0: 74 6f 20 77 68 61 74 20 63 61 6e 20 62 65 20 73  to what can be s
17d0: 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 6c 6f 77 65  tored in.** lowe
17e0: 72 20 33 30 20 62 69 74 73 20 6f 66 20 61 20 33  r 30 bits of a 3
17f0: 32 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74  2-bit signed int
1800: 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eger..*/.static 
1810: 69 6e 74 20 73 74 72 6c 65 6e 33 30 28 63 6f 6e  int strlen30(con
1820: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63  st char *z){.  c
1830: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 20 3d 20  onst char *z2 = 
1840: 7a 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 32 20  z;.  while( *z2 
1850: 29 7b 20 7a 32 2b 2b 3b 20 7d 0a 20 20 72 65 74  ){ z2++; }.  ret
1860: 75 72 6e 20 30 78 33 66 66 66 66 66 66 66 20 26  urn 0x3fffffff &
1870: 20 28 69 6e 74 29 28 7a 32 20 2d 20 7a 29 3b 0a   (int)(z2 - z);.
1880: 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  }...#ifndef SQLI
1890: 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
18a0: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c  ./*.** Close all
18b0: 20 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65   incrblob channe
18c0: 6c 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20  ls opened using 
18d0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
18e0: 69 6f 6e 20 70 44 62 2e 0a 2a 2a 20 54 68 69 73  ion pDb..** This
18f0: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
1900: 73 68 75 74 74 69 6e 67 20 64 6f 77 6e 20 74 68  shutting down th
1910: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
1920: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
1930: 20 76 6f 69 64 20 63 6c 6f 73 65 49 6e 63 72 62   void closeIncrb
1940: 6c 6f 62 43 68 61 6e 6e 65 6c 73 28 53 71 6c 69  lobChannels(Sqli
1950: 74 65 44 62 20 2a 70 44 62 29 7b 0a 20 20 49 6e  teDb *pDb){.  In
1960: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70  crblobChannel *p
1970: 3b 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e  ;.  IncrblobChan
1980: 6e 65 6c 20 2a 70 4e 65 78 74 3b 0a 0a 20 20 66  nel *pNext;..  f
1990: 6f 72 28 70 3d 70 44 62 2d 3e 70 49 6e 63 72 62  or(p=pDb->pIncrb
19a0: 6c 6f 62 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29  lob; p; p=pNext)
19b0: 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d  {.    pNext = p-
19c0: 3e 70 4e 65 78 74 3b 0a 0a 20 20 20 20 2f 2a 20  >pNext;..    /* 
19d0: 4e 6f 74 65 3a 20 43 61 6c 6c 69 6e 67 20 75 6e  Note: Calling un
19e0: 72 65 67 69 73 74 65 72 20 68 65 72 65 20 63 61  register here ca
19f0: 6c 6c 20 54 63 6c 5f 43 6c 6f 73 65 20 6f 6e 20  ll Tcl_Close on 
1a00: 74 68 65 20 69 6e 63 72 62 6c 6f 62 20 63 68 61  the incrblob cha
1a10: 6e 6e 65 6c 2c 20 0a 20 20 20 20 2a 2a 20 77 68  nnel, .    ** wh
1a20: 69 63 68 20 64 65 6c 65 74 65 73 20 74 68 65 20  ich deletes the 
1a30: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20  IncrblobChannel 
1a40: 73 74 72 75 63 74 75 72 65 20 61 74 20 2a 70 2e  structure at *p.
1a50: 20 53 6f 20 64 6f 20 6e 6f 74 0a 20 20 20 20 2a   So do not.    *
1a60: 2a 20 63 61 6c 6c 20 54 63 6c 5f 46 72 65 65 28  * call Tcl_Free(
1a70: 29 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  ) here..    */. 
1a80: 20 20 20 54 63 6c 5f 55 6e 72 65 67 69 73 74 65     Tcl_Unregiste
1a90: 72 43 68 61 6e 6e 65 6c 28 70 44 62 2d 3e 69 6e  rChannel(pDb->in
1aa0: 74 65 72 70 2c 20 70 2d 3e 63 68 61 6e 6e 65 6c  terp, p->channel
1ab0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1ac0: 43 6c 6f 73 65 20 61 6e 20 69 6e 63 72 65 6d 65  Close an increme
1ad0: 6e 74 61 6c 20 62 6c 6f 62 20 63 68 61 6e 6e 65  ntal blob channe
1ae0: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
1af0: 20 69 6e 63 72 62 6c 6f 62 43 6c 6f 73 65 28 43   incrblobClose(C
1b00: 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e  lientData instan
1b10: 63 65 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65  ceData, Tcl_Inte
1b20: 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 49  rp *interp){.  I
1b30: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a  ncrblobChannel *
1b40: 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68 61  p = (IncrblobCha
1b50: 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e 63 65 44  nnel *)instanceD
1b60: 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ata;.  int rc = 
1b70: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f  sqlite3_blob_clo
1b80: 73 65 28 70 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20  se(p->pBlob);.  
1b90: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
1ba0: 3e 70 44 62 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20  >pDb->db;..  /* 
1bb0: 52 65 6d 6f 76 65 20 74 68 65 20 63 68 61 6e 6e  Remove the chann
1bc0: 65 6c 20 66 72 6f 6d 20 74 68 65 20 53 71 6c 69  el from the Sqli
1bd0: 74 65 44 62 2e 70 49 6e 63 72 62 6c 6f 62 20 6c  teDb.pIncrblob l
1be0: 69 73 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d  ist. */.  if( p-
1bf0: 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d  >pNext ){.    p-
1c00: 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
1c10: 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20  p->pPrev;.  }.  
1c20: 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a  if( p->pPrev ){.
1c30: 20 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e      p->pPrev->pN
1c40: 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
1c50: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 44 62    }.  if( p->pDb
1c60: 2d 3e 70 49 6e 63 72 62 6c 6f 62 3d 3d 70 20 29  ->pIncrblob==p )
1c70: 7b 0a 20 20 20 20 70 2d 3e 70 44 62 2d 3e 70 49  {.    p->pDb->pI
1c80: 6e 63 72 62 6c 6f 62 20 3d 20 70 2d 3e 70 4e 65  ncrblob = p->pNe
1c90: 78 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72  xt;.  }..  /* Fr
1ca0: 65 65 20 74 68 65 20 49 6e 63 72 62 6c 6f 62 43  ee the IncrblobC
1cb0: 68 61 6e 6e 65 6c 20 73 74 72 75 63 74 75 72 65  hannel structure
1cc0: 20 2a 2f 0a 20 20 54 63 6c 5f 46 72 65 65 28 28   */.  Tcl_Free((
1cd0: 63 68 61 72 20 2a 29 70 29 3b 0a 0a 20 20 69 66  char *)p);..  if
1ce0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1cf0: 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65  ){.    Tcl_SetRe
1d00: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
1d10: 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72  ar *)sqlite3_err
1d20: 6d 73 67 28 64 62 29 2c 20 54 43 4c 5f 56 4f 4c  msg(db), TCL_VOL
1d30: 41 54 49 4c 45 29 3b 0a 20 20 20 20 72 65 74 75  ATILE);.    retu
1d40: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1d50: 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
1d60: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  K;.}../*.** Read
1d70: 20 64 61 74 61 20 66 72 6f 6d 20 61 6e 20 69 6e   data from an in
1d80: 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63  cremental blob c
1d90: 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69  hannel..*/.stati
1da0: 63 20 69 6e 74 20 69 6e 63 72 62 6c 6f 62 49 6e  c int incrblobIn
1db0: 70 75 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  put(.  ClientDat
1dc0: 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20  a instanceData, 
1dd0: 0a 20 20 63 68 61 72 20 2a 62 75 66 2c 20 0a 20  .  char *buf, . 
1de0: 20 69 6e 74 20 62 75 66 53 69 7a 65 2c 0a 20 20   int bufSize,.  
1df0: 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 74  int *errorCodePt
1e00: 72 0a 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43  r.){.  IncrblobC
1e10: 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28 49 6e 63  hannel *p = (Inc
1e20: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 69  rblobChannel *)i
1e30: 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 69  nstanceData;.  i
1e40: 6e 74 20 6e 52 65 61 64 20 3d 20 62 75 66 53 69  nt nRead = bufSi
1e50: 7a 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ze;         /* N
1e60: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
1e70: 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20  o read */.  int 
1e80: 6e 42 6c 6f 62 3b 20 20 20 20 20 20 20 20 20 20  nBlob;          
1e90: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
1ea0: 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c  l size of the bl
1eb0: 6f 62 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ob */.  int rc; 
1ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed0: 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 20 65       /* sqlite e
1ee0: 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  rror code */..  
1ef0: 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f  nBlob = sqlite3_
1f00: 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70 42  blob_bytes(p->pB
1f10: 6c 6f 62 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e  lob);.  if( (p->
1f20: 69 53 65 65 6b 2b 6e 52 65 61 64 29 3e 6e 42 6c  iSeek+nRead)>nBl
1f30: 6f 62 20 29 7b 0a 20 20 20 20 6e 52 65 61 64 20  ob ){.    nRead 
1f40: 3d 20 6e 42 6c 6f 62 2d 70 2d 3e 69 53 65 65 6b  = nBlob-p->iSeek
1f50: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 61  ;.  }.  if( nRea
1f60: 64 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  d<=0 ){.    retu
1f70: 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  rn 0;.  }..  rc 
1f80: 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72  = sqlite3_blob_r
1f90: 65 61 64 28 70 2d 3e 70 42 6c 6f 62 2c 20 28 76  ead(p->pBlob, (v
1fa0: 6f 69 64 20 2a 29 62 75 66 2c 20 6e 52 65 61 64  oid *)buf, nRead
1fb0: 2c 20 70 2d 3e 69 53 65 65 6b 29 3b 0a 20 20 69  , p->iSeek);.  i
1fc0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1fd0: 20 29 7b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f   ){.    *errorCo
1fe0: 64 65 50 74 72 20 3d 20 72 63 3b 0a 20 20 20 20  dePtr = rc;.    
1ff0: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 0a  return -1;.  }..
2000: 20 20 70 2d 3e 69 53 65 65 6b 20 2b 3d 20 6e 52    p->iSeek += nR
2010: 65 61 64 3b 0a 20 20 72 65 74 75 72 6e 20 6e 52  ead;.  return nR
2020: 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72  ead;.}../*.** Wr
2030: 69 74 65 20 64 61 74 61 20 74 6f 20 61 6e 20 69  ite data to an i
2040: 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20  ncremental blob 
2050: 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74  channel..*/.stat
2060: 69 63 20 69 6e 74 20 69 6e 63 72 62 6c 6f 62 4f  ic int incrblobO
2070: 75 74 70 75 74 28 0a 20 20 43 6c 69 65 6e 74 44  utput(.  ClientD
2080: 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61  ata instanceData
2090: 2c 20 0a 20 20 43 4f 4e 53 54 20 63 68 61 72 20  , .  CONST char 
20a0: 2a 62 75 66 2c 20 0a 20 20 69 6e 74 20 74 6f 57  *buf, .  int toW
20b0: 72 69 74 65 2c 0a 20 20 69 6e 74 20 2a 65 72 72  rite,.  int *err
20c0: 6f 72 43 6f 64 65 50 74 72 0a 29 7b 0a 20 20 49  orCodePtr.){.  I
20d0: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a  ncrblobChannel *
20e0: 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68 61  p = (IncrblobCha
20f0: 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e 63 65 44  nnel *)instanceD
2100: 61 74 61 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74  ata;.  int nWrit
2110: 65 20 3d 20 74 6f 57 72 69 74 65 3b 20 20 20 20  e = toWrite;    
2120: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2130: 20 62 79 74 65 73 20 74 6f 20 77 72 69 74 65 20   bytes to write 
2140: 2a 2f 0a 20 20 69 6e 74 20 6e 42 6c 6f 62 3b 20  */.  int nBlob; 
2150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2160: 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
2170: 6f 66 20 74 68 65 20 62 6c 6f 62 20 2a 2f 0a 20  of the blob */. 
2180: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21a0: 20 73 71 6c 69 74 65 20 65 72 72 6f 72 20 63 6f   sqlite error co
21b0: 64 65 20 2a 2f 0a 0a 20 20 6e 42 6c 6f 62 20 3d  de */..  nBlob =
21c0: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79   sqlite3_blob_by
21d0: 74 65 73 28 70 2d 3e 70 42 6c 6f 62 29 3b 0a 20  tes(p->pBlob);. 
21e0: 20 69 66 28 20 28 70 2d 3e 69 53 65 65 6b 2b 6e   if( (p->iSeek+n
21f0: 57 72 69 74 65 29 3e 6e 42 6c 6f 62 20 29 7b 0a  Write)>nBlob ){.
2200: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74      *errorCodePt
2210: 72 20 3d 20 45 49 4e 56 41 4c 3b 0a 20 20 20 20  r = EINVAL;.    
2220: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20  return -1;.  }. 
2230: 20 69 66 28 20 6e 57 72 69 74 65 3c 3d 30 20 29   if( nWrite<=0 )
2240: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
2250: 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69    }..  rc = sqli
2260: 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65 28 70  te3_blob_write(p
2270: 2d 3e 70 42 6c 6f 62 2c 20 28 76 6f 69 64 20 2a  ->pBlob, (void *
2280: 29 62 75 66 2c 20 6e 57 72 69 74 65 2c 20 70 2d  )buf, nWrite, p-
2290: 3e 69 53 65 65 6b 29 3b 0a 20 20 69 66 28 20 72  >iSeek);.  if( r
22a0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
22b0: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74      *errorCodePt
22c0: 72 20 3d 20 45 49 4f 3b 0a 20 20 20 20 72 65 74  r = EIO;.    ret
22d0: 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 70  urn -1;.  }..  p
22e0: 2d 3e 69 53 65 65 6b 20 2b 3d 20 6e 57 72 69 74  ->iSeek += nWrit
22f0: 65 3b 0a 20 20 72 65 74 75 72 6e 20 6e 57 72 69  e;.  return nWri
2300: 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65  te;.}../*.** See
2310: 6b 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  k an incremental
2320: 20 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a   blob channel..*
2330: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63  /.static int inc
2340: 72 62 6c 6f 62 53 65 65 6b 28 0a 20 20 43 6c 69  rblobSeek(.  Cli
2350: 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65  entData instance
2360: 44 61 74 61 2c 20 0a 20 20 6c 6f 6e 67 20 6f 66  Data, .  long of
2370: 66 73 65 74 2c 0a 20 20 69 6e 74 20 73 65 65 6b  fset,.  int seek
2380: 4d 6f 64 65 2c 0a 20 20 69 6e 74 20 2a 65 72 72  Mode,.  int *err
2390: 6f 72 43 6f 64 65 50 74 72 0a 29 7b 0a 20 20 49  orCodePtr.){.  I
23a0: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a  ncrblobChannel *
23b0: 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68 61  p = (IncrblobCha
23c0: 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e 63 65 44  nnel *)instanceD
23d0: 61 74 61 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  ata;..  switch( 
23e0: 73 65 65 6b 4d 6f 64 65 20 29 7b 0a 20 20 20 20  seekMode ){.    
23f0: 63 61 73 65 20 53 45 45 4b 5f 53 45 54 3a 0a 20  case SEEK_SET:. 
2400: 20 20 20 20 20 70 2d 3e 69 53 65 65 6b 20 3d 20       p->iSeek = 
2410: 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 62 72  offset;.      br
2420: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 45  eak;.    case SE
2430: 45 4b 5f 43 55 52 3a 0a 20 20 20 20 20 20 70 2d  EK_CUR:.      p-
2440: 3e 69 53 65 65 6b 20 2b 3d 20 6f 66 66 73 65 74  >iSeek += offset
2450: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
2460: 20 20 20 63 61 73 65 20 53 45 45 4b 5f 45 4e 44     case SEEK_END
2470: 3a 0a 20 20 20 20 20 20 70 2d 3e 69 53 65 65 6b  :.      p->iSeek
2480: 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f   = sqlite3_blob_
2490: 62 79 74 65 73 28 70 2d 3e 70 42 6c 6f 62 29 20  bytes(p->pBlob) 
24a0: 2b 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  + offset;.      
24b0: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61  break;..    defa
24c0: 75 6c 74 3a 20 61 73 73 65 72 74 28 21 22 42 61  ult: assert(!"Ba
24d0: 64 20 73 65 65 6b 4d 6f 64 65 22 29 3b 0a 20 20  d seekMode");.  
24e0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 69  }..  return p->i
24f0: 53 65 65 6b 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63  Seek;.}...static
2500: 20 76 6f 69 64 20 69 6e 63 72 62 6c 6f 62 57 61   void incrblobWa
2510: 74 63 68 28 43 6c 69 65 6e 74 44 61 74 61 20 69  tch(ClientData i
2520: 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 69 6e 74  nstanceData, int
2530: 20 6d 6f 64 65 29 7b 20 0a 20 20 2f 2a 20 4e 4f   mode){ .  /* NO
2540: 2d 4f 50 20 2a 2f 20 0a 7d 0a 73 74 61 74 69 63  -OP */ .}.static
2550: 20 69 6e 74 20 69 6e 63 72 62 6c 6f 62 48 61 6e   int incrblobHan
2560: 64 6c 65 28 43 6c 69 65 6e 74 44 61 74 61 20 69  dle(ClientData i
2570: 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 69 6e 74  nstanceData, int
2580: 20 64 69 72 2c 20 43 6c 69 65 6e 74 44 61 74 61   dir, ClientData
2590: 20 2a 68 50 74 72 29 7b 0a 20 20 72 65 74 75 72   *hPtr){.  retur
25a0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a  n TCL_ERROR;.}..
25b0: 73 74 61 74 69 63 20 54 63 6c 5f 43 68 61 6e 6e  static Tcl_Chann
25c0: 65 6c 54 79 70 65 20 49 6e 63 72 62 6c 6f 62 43  elType IncrblobC
25d0: 68 61 6e 6e 65 6c 54 79 70 65 20 3d 20 7b 0a 20  hannelType = {. 
25e0: 20 22 69 6e 63 72 62 6c 6f 62 22 2c 20 20 20 20   "incrblob",    
25f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2600: 20 20 20 20 2f 2a 20 74 79 70 65 4e 61 6d 65 20      /* typeName 
2610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2620: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2630: 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45 52   TCL_CHANNEL_VER
2640: 53 49 4f 4e 5f 32 2c 20 20 20 20 20 20 20 20 20  SION_2,         
2650: 20 20 20 20 2f 2a 20 76 65 72 73 69 6f 6e 20 20      /* version  
2660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2670: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2680: 20 69 6e 63 72 62 6c 6f 62 43 6c 6f 73 65 2c 20   incrblobClose, 
2690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a0: 20 20 20 20 2f 2a 20 63 6c 6f 73 65 50 72 6f 63      /* closeProc
26b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
26d0: 20 69 6e 63 72 62 6c 6f 62 49 6e 70 75 74 2c 20   incrblobInput, 
26e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f0: 20 20 20 20 2f 2a 20 69 6e 70 75 74 50 72 6f 63      /* inputProc
2700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2710: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2720: 20 69 6e 63 72 62 6c 6f 62 4f 75 74 70 75 74 2c   incrblobOutput,
2730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2740: 20 20 20 20 2f 2a 20 6f 75 74 70 75 74 50 72 6f      /* outputPro
2750: 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
2760: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2770: 20 69 6e 63 72 62 6c 6f 62 53 65 65 6b 2c 20 20   incrblobSeek,  
2780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2790: 20 20 20 20 2f 2a 20 73 65 65 6b 50 72 6f 63 20      /* seekProc 
27a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
27c0: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e0: 20 20 20 20 2f 2a 20 73 65 74 4f 70 74 69 6f 6e      /* setOption
27f0: 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20  Proc            
2800: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2810: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
2820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2830: 20 20 20 20 2f 2a 20 67 65 74 4f 70 74 69 6f 6e      /* getOption
2840: 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20  Proc            
2850: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2860: 20 69 6e 63 72 62 6c 6f 62 57 61 74 63 68 2c 20   incrblobWatch, 
2870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2880: 20 20 20 20 2f 2a 20 77 61 74 63 68 50 72 6f 63      /* watchProc
2890: 20 28 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f   (this is a no-o
28a0: 70 29 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  p)          */. 
28b0: 20 69 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 2c   incrblobHandle,
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d0: 20 20 20 20 2f 2a 20 67 65 74 48 61 6e 64 6c 65      /* getHandle
28e0: 50 72 6f 63 20 28 61 6c 77 61 79 73 20 72 65 74  Proc (always ret
28f0: 75 72 6e 73 20 65 72 72 6f 72 29 20 2a 2f 0a 20  urns error) */. 
2900: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
2910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2920: 20 20 20 20 2f 2a 20 63 6c 6f 73 65 32 50 72 6f      /* close2Pro
2930: 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
2940: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2950: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
2960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2970: 20 20 20 20 2f 2a 20 62 6c 6f 63 6b 4d 6f 64 65      /* blockMode
2980: 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20  Proc            
2990: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
29a0: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
29b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c0: 20 20 20 20 2f 2a 20 66 6c 75 73 68 50 72 6f 63      /* flushProc
29d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
29f0: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
2a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a10: 20 20 20 20 2f 2a 20 68 61 6e 64 6c 65 72 50 72      /* handlerPr
2a20: 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  oc              
2a30: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2a40: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a60: 20 20 20 20 2f 2a 20 77 69 64 65 53 65 65 6b 50      /* wideSeekP
2a70: 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20  roc             
2a80: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 7d              */.}
2a90: 3b 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  ;../*.** Create 
2aa0: 61 20 6e 65 77 20 69 6e 63 72 62 6c 6f 62 20 63  a new incrblob c
2ab0: 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69  hannel..*/.stati
2ac0: 63 20 69 6e 74 20 63 72 65 61 74 65 49 6e 63 72  c int createIncr
2ad0: 62 6c 6f 62 43 68 61 6e 6e 65 6c 28 0a 20 20 54  blobChannel(.  T
2ae0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2af0: 70 2c 20 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  p, .  SqliteDb *
2b00: 70 44 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68  pDb, .  const ch
2b10: 61 72 20 2a 7a 44 62 2c 0a 20 20 63 6f 6e 73 74  ar *zDb,.  const
2b20: 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 2c 20 0a   char *zTable, .
2b30: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
2b40: 6f 6c 75 6d 6e 2c 20 0a 20 20 73 71 6c 69 74 65  olumn, .  sqlite
2b50: 5f 69 6e 74 36 34 20 69 52 6f 77 2c 0a 20 20 69  _int64 iRow,.  i
2b60: 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 0a 29 7b  nt isReadonly.){
2b70: 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  .  IncrblobChann
2b80: 65 6c 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33  el *p;.  sqlite3
2b90: 20 2a 64 62 20 3d 20 70 44 62 2d 3e 64 62 3b 0a   *db = pDb->db;.
2ba0: 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a    sqlite3_blob *
2bb0: 70 42 6c 6f 62 3b 0a 20 20 69 6e 74 20 72 63 3b  pBlob;.  int rc;
2bc0: 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 54  .  int flags = T
2bd0: 43 4c 5f 52 45 41 44 41 42 4c 45 7c 28 69 73 52  CL_READABLE|(isR
2be0: 65 61 64 6f 6e 6c 79 20 3f 20 30 20 3a 20 54 43  eadonly ? 0 : TC
2bf0: 4c 5f 57 52 49 54 41 42 4c 45 29 3b 0a 0a 20 20  L_WRITABLE);..  
2c00: 2f 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65  /* This variable
2c10: 20 69 73 20 75 73 65 64 20 74 6f 20 6e 61 6d 65   is used to name
2c20: 20 74 68 65 20 63 68 61 6e 6e 65 6c 73 3a 20 22   the channels: "
2c30: 69 6e 63 72 62 6c 6f 62 5f 5b 69 6e 63 72 20 63  incrblob_[incr c
2c40: 6f 75 6e 74 5d 22 20 2a 2f 0a 20 20 73 74 61 74  ount]" */.  stat
2c50: 69 63 20 69 6e 74 20 63 6f 75 6e 74 20 3d 20 30  ic int count = 0
2c60: 3b 0a 20 20 63 68 61 72 20 7a 43 68 61 6e 6e 65  ;.  char zChanne
2c70: 6c 5b 36 34 5d 3b 0a 0a 20 20 72 63 20 3d 20 73  l[64];..  rc = s
2c80: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e  qlite3_blob_open
2c90: 28 64 62 2c 20 7a 44 62 2c 20 7a 54 61 62 6c 65  (db, zDb, zTable
2ca0: 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 69 52 6f 77 2c  , zColumn, iRow,
2cb0: 20 21 69 73 52 65 61 64 6f 6e 6c 79 2c 20 26 70   !isReadonly, &p
2cc0: 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20 72 63 21  Blob);.  if( rc!
2cd0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2ce0: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
2cf0: 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
2d00: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
2d10: 44 62 2d 3e 64 62 29 2c 20 54 43 4c 5f 56 4f 4c  Db->db), TCL_VOL
2d20: 41 54 49 4c 45 29 3b 0a 20 20 20 20 72 65 74 75  ATILE);.    retu
2d30: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2d40: 7d 0a 0a 20 20 70 20 3d 20 28 49 6e 63 72 62 6c  }..  p = (Incrbl
2d50: 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 54 63 6c 5f  obChannel *)Tcl_
2d60: 41 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 49 6e 63  Alloc(sizeof(Inc
2d70: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 29 29 3b 0a  rblobChannel));.
2d80: 20 20 70 2d 3e 69 53 65 65 6b 20 3d 20 30 3b 0a    p->iSeek = 0;.
2d90: 20 20 70 2d 3e 70 42 6c 6f 62 20 3d 20 70 42 6c    p->pBlob = pBl
2da0: 6f 62 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73  ob;..  sqlite3_s
2db0: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
2dc0: 43 68 61 6e 6e 65 6c 29 2c 20 7a 43 68 61 6e 6e  Channel), zChann
2dd0: 65 6c 2c 20 22 69 6e 63 72 62 6c 6f 62 5f 25 64  el, "incrblob_%d
2de0: 22 2c 20 2b 2b 63 6f 75 6e 74 29 3b 0a 20 20 70  ", ++count);.  p
2df0: 2d 3e 63 68 61 6e 6e 65 6c 20 3d 20 54 63 6c 5f  ->channel = Tcl_
2e00: 43 72 65 61 74 65 43 68 61 6e 6e 65 6c 28 26 49  CreateChannel(&I
2e10: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 54 79  ncrblobChannelTy
2e20: 70 65 2c 20 7a 43 68 61 6e 6e 65 6c 2c 20 70 2c  pe, zChannel, p,
2e30: 20 66 6c 61 67 73 29 3b 0a 20 20 54 63 6c 5f 52   flags);.  Tcl_R
2e40: 65 67 69 73 74 65 72 43 68 61 6e 6e 65 6c 28 69  egisterChannel(i
2e50: 6e 74 65 72 70 2c 20 70 2d 3e 63 68 61 6e 6e 65  nterp, p->channe
2e60: 6c 29 3b 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74  l);..  /* Link t
2e70: 68 65 20 6e 65 77 20 63 68 61 6e 6e 65 6c 20 69  he new channel i
2e80: 6e 74 6f 20 74 68 65 20 53 71 6c 69 74 65 44 62  nto the SqliteDb
2e90: 2e 70 49 6e 63 72 62 6c 6f 62 20 6c 69 73 74 2e  .pIncrblob list.
2ea0: 20 2a 2f 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d   */.  p->pNext =
2eb0: 20 70 44 62 2d 3e 70 49 6e 63 72 62 6c 6f 62 3b   pDb->pIncrblob;
2ec0: 0a 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b  .  p->pPrev = 0;
2ed0: 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20  .  if( p->pNext 
2ee0: 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d  ){.    p->pNext-
2ef0: 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 7d 0a  >pPrev = p;.  }.
2f00: 20 20 70 44 62 2d 3e 70 49 6e 63 72 62 6c 6f 62    pDb->pIncrblob
2f10: 20 3d 20 70 3b 0a 20 20 70 2d 3e 70 44 62 20 3d   = p;.  p->pDb =
2f20: 20 70 44 62 3b 0a 0a 20 20 54 63 6c 5f 53 65 74   pDb;..  Tcl_Set
2f30: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
2f40: 63 68 61 72 20 2a 29 54 63 6c 5f 47 65 74 43 68  char *)Tcl_GetCh
2f50: 61 6e 6e 65 6c 4e 61 6d 65 28 70 2d 3e 63 68 61  annelName(p->cha
2f60: 6e 6e 65 6c 29 2c 20 54 43 4c 5f 56 4f 4c 41 54  nnel), TCL_VOLAT
2f70: 49 4c 45 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  ILE);.  return T
2f80: 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6c 73 65 20 20  CL_OK;.}.#else  
2f90: 2f 2a 20 65 6c 73 65 20 63 6c 61 75 73 65 20 66  /* else clause f
2fa0: 6f 72 20 22 23 69 66 6e 64 65 66 20 53 51 4c 49  or "#ifndef SQLI
2fb0: 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
2fc0: 22 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 63  " */.  #define c
2fd0: 6c 6f 73 65 49 6e 63 72 62 6c 6f 62 43 68 61 6e  loseIncrblobChan
2fe0: 6e 65 6c 73 28 70 44 62 29 0a 23 65 6e 64 69 66  nels(pDb).#endif
2ff0: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 61 74 20  ../*.** Look at 
3000: 74 68 65 20 73 63 72 69 70 74 20 70 72 65 66 69  the script prefi
3010: 78 20 69 6e 20 70 43 6d 64 2e 20 20 57 65 20 77  x in pCmd.  We w
3020: 69 6c 6c 20 62 65 20 65 78 65 63 75 74 69 6e 67  ill be executing
3030: 20 74 68 69 73 20 73 63 72 69 70 74 0a 2a 2a 20   this script.** 
3040: 61 66 74 65 72 20 66 69 72 73 74 20 61 70 70 65  after first appe
3050: 6e 64 69 6e 67 20 6f 6e 65 20 6f 72 20 6d 6f 72  nding one or mor
3060: 65 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 54 68  e arguments.  Th
3070: 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79  is routine analy
3080: 7a 65 73 0a 2a 2a 20 74 68 65 20 73 63 72 69 70  zes.** the scrip
3090: 74 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 69  t to see if it i
30a0: 73 20 73 61 66 65 20 74 6f 20 75 73 65 20 54 63  s safe to use Tc
30b0: 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 6f 6e 20  l_EvalObjv() on 
30c0: 74 68 65 20 73 63 72 69 70 74 0a 2a 2a 20 72 61  the script.** ra
30d0: 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6d 6f  ther than the mo
30e0: 72 65 20 67 65 6e 65 72 61 6c 20 54 63 6c 5f 45  re general Tcl_E
30f0: 76 61 6c 45 78 28 29 2e 20 20 54 63 6c 5f 45 76  valEx().  Tcl_Ev
3100: 61 6c 4f 62 6a 76 28 29 20 69 73 20 6d 75 63 68  alObjv() is much
3110: 0a 2a 2a 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a  .** faster..**.*
3120: 2a 20 53 63 72 69 70 74 73 20 74 68 61 74 20 61  * Scripts that a
3130: 72 65 20 73 61 66 65 20 74 6f 20 75 73 65 20 77  re safe to use w
3140: 69 74 68 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76  ith Tcl_EvalObjv
3150: 28 29 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  () consists of a
3160: 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65  .** command name
3170: 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 7a 65 72   followed by zer
3180: 6f 20 6f 72 20 6d 6f 72 65 20 61 72 67 75 6d 65  o or more argume
3190: 6e 74 73 20 77 69 74 68 20 6e 6f 20 5b 2e 2e 2e  nts with no [...
31a0: 5d 20 6f 72 20 24 0a 2a 2a 20 6f 72 20 7b 2e 2e  ] or $.** or {..
31b0: 2e 7d 20 6f 72 20 3b 20 74 6f 20 62 65 20 73 65  .} or ; to be se
31c0: 65 6e 20 61 6e 79 77 68 65 72 65 2e 20 20 4d 6f  en anywhere.  Mo
31d0: 73 74 20 63 61 6c 6c 62 61 63 6b 20 73 63 72 69  st callback scri
31e0: 70 74 73 20 63 6f 6e 73 69 73 74 0a 2a 2a 20 6f  pts consist.** o
31f0: 66 20 6a 75 73 74 20 61 20 73 69 6e 67 6c 65 20  f just a single 
3200: 70 72 6f 63 65 64 75 72 65 20 6e 61 6d 65 20 61  procedure name a
3210: 6e 64 20 74 68 65 79 20 6d 65 65 74 20 74 68 69  nd they meet thi
3220: 73 20 72 65 71 75 69 72 65 6d 65 6e 74 2e 0a 2a  s requirement..*
3230: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 66  /.static int saf
3240: 65 54 6f 55 73 65 45 76 61 6c 4f 62 6a 76 28 54  eToUseEvalObjv(T
3250: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
3260: 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64  p, Tcl_Obj *pCmd
3270: 29 7b 0a 20 20 2f 2a 20 57 65 20 63 6f 75 6c 64  ){.  /* We could
3280: 20 74 72 79 20 74 6f 20 64 6f 20 73 6f 6d 65 74   try to do somet
3290: 68 69 6e 67 20 77 69 74 68 20 54 63 6c 5f 50 61  hing with Tcl_Pa
32a0: 72 73 65 28 29 2e 20 20 42 75 74 20 77 65 20 77  rse().  But we w
32b0: 69 6c 6c 20 69 6e 73 74 65 61 64 0a 20 20 2a 2a  ill instead.  **
32c0: 20 6a 75 73 74 20 64 6f 20 61 20 73 65 61 72 63   just do a searc
32d0: 68 20 66 6f 72 20 66 6f 72 62 69 64 64 65 6e 20  h for forbidden 
32e0: 63 68 61 72 61 63 74 65 72 73 2e 20 20 49 66 20  characters.  If 
32f0: 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 72 62 69  any of the forbi
3300: 64 64 65 6e 0a 20 20 2a 2a 20 63 68 61 72 61 63  dden.  ** charac
3310: 74 65 72 73 20 61 70 70 65 61 72 20 69 6e 20 70  ters appear in p
3320: 43 6d 64 2c 20 77 65 20 77 69 6c 6c 20 72 65 70  Cmd, we will rep
3330: 6f 72 74 20 74 68 65 20 73 74 72 69 6e 67 20 61  ort the string a
3340: 73 20 75 6e 73 61 66 65 2e 0a 20 20 2a 2f 0a 20  s unsafe..  */. 
3350: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
3360: 20 20 69 6e 74 20 6e 3b 0a 20 20 7a 20 3d 20 54    int n;.  z = T
3370: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
3380: 4f 62 6a 28 70 43 6d 64 2c 20 26 6e 29 3b 0a 20  Obj(pCmd, &n);. 
3390: 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20   while( n-- > 0 
33a0: 29 7b 0a 20 20 20 20 69 6e 74 20 63 20 3d 20 2a  ){.    int c = *
33b0: 28 7a 2b 2b 29 3b 0a 20 20 20 20 69 66 28 20 63  (z++);.    if( c
33c0: 3d 3d 27 24 27 20 7c 7c 20 63 3d 3d 27 5b 27 20  =='$' || c=='[' 
33d0: 7c 7c 20 63 3d 3d 27 3b 27 20 29 20 72 65 74 75  || c==';' ) retu
33e0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
33f0: 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  rn 1;.}../*.** F
3400: 69 6e 64 20 61 6e 20 53 71 6c 46 75 6e 63 20 73  ind an SqlFunc s
3410: 74 72 75 63 74 75 72 65 20 77 69 74 68 20 74 68  tructure with th
3420: 65 20 67 69 76 65 6e 20 6e 61 6d 65 2e 20 20 4f  e given name.  O
3430: 72 20 63 72 65 61 74 65 20 61 20 6e 65 77 0a 2a  r create a new.*
3440: 2a 20 6f 6e 65 20 69 66 20 61 6e 20 65 78 69 73  * one if an exis
3450: 74 69 6e 67 20 6f 6e 65 20 63 61 6e 6e 6f 74 20  ting one cannot 
3460: 62 65 20 66 6f 75 6e 64 2e 20 20 52 65 74 75 72  be found.  Retur
3470: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
3480: 68 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  he.** structure.
3490: 0a 2a 2f 0a 73 74 61 74 69 63 20 53 71 6c 46 75  .*/.static SqlFu
34a0: 6e 63 20 2a 66 69 6e 64 53 71 6c 46 75 6e 63 28  nc *findSqlFunc(
34b0: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 2c 20 63  SqliteDb *pDb, c
34c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
34d0: 29 7b 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70 2c  ){.  SqlFunc *p,
34e0: 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b   *pNew;.  int i;
34f0: 0a 20 20 70 4e 65 77 20 3d 20 28 53 71 6c 46 75  .  pNew = (SqlFu
3500: 6e 63 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73  nc*)Tcl_Alloc( s
3510: 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20 73  izeof(*pNew) + s
3520: 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 20 2b  trlen30(zName) +
3530: 20 31 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 7a 4e   1 );.  pNew->zN
3540: 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e  ame = (char*)&pN
3550: 65 77 5b 31 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  ew[1];.  for(i=0
3560: 3b 20 7a 4e 61 6d 65 5b 69 5d 3b 20 69 2b 2b 29  ; zName[i]; i++)
3570: 7b 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 5b 69 5d  { pNew->zName[i]
3580: 20 3d 20 74 6f 6c 6f 77 65 72 28 7a 4e 61 6d 65   = tolower(zName
3590: 5b 69 5d 29 3b 20 7d 0a 20 20 70 4e 65 77 2d 3e  [i]); }.  pNew->
35a0: 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b 0a 20 20  zName[i] = 0;.  
35b0: 66 6f 72 28 70 3d 70 44 62 2d 3e 70 46 75 6e 63  for(p=pDb->pFunc
35c0: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
35d0: 7b 20 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  { .    if( strcm
35e0: 70 28 70 2d 3e 7a 4e 61 6d 65 2c 20 70 4e 65 77  p(p->zName, pNew
35f0: 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ->zName)==0 ){. 
3600: 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63       Tcl_Free((c
3610: 68 61 72 2a 29 70 4e 65 77 29 3b 0a 20 20 20 20  har*)pNew);.    
3620: 20 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20 20    return p;.    
3630: 7d 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 69 6e  }.  }.  pNew->in
3640: 74 65 72 70 20 3d 20 70 44 62 2d 3e 69 6e 74 65  terp = pDb->inte
3650: 72 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 44 62 20  rp;.  pNew->pDb 
3660: 3d 20 70 44 62 3b 0a 20 20 70 4e 65 77 2d 3e 70  = pDb;.  pNew->p
3670: 53 63 72 69 70 74 20 3d 20 30 3b 0a 20 20 70 4e  Script = 0;.  pN
3680: 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d  ew->pNext = pDb-
3690: 3e 70 46 75 6e 63 3b 0a 20 20 70 44 62 2d 3e 70  >pFunc;.  pDb->p
36a0: 46 75 6e 63 20 3d 20 70 4e 65 77 3b 0a 20 20 72  Func = pNew;.  r
36b0: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
36c0: 2a 0a 2a 2a 20 46 72 65 65 20 61 20 73 69 6e 67  *.** Free a sing
36d0: 6c 65 20 53 71 6c 50 72 65 70 61 72 65 64 53 74  le SqlPreparedSt
36e0: 6d 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  mt object..*/.st
36f0: 61 74 69 63 20 76 6f 69 64 20 64 62 46 72 65 65  atic void dbFree
3700: 53 74 6d 74 28 53 71 6c 50 72 65 70 61 72 65 64  Stmt(SqlPrepared
3710: 53 74 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 23 69  Stmt *pStmt){.#i
3720: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
3730: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73  .  if( sqlite3_s
3740: 71 6c 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74 29  ql(pStmt->pStmt)
3750: 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46  ==0 ){.    Tcl_F
3760: 72 65 65 28 28 63 68 61 72 20 2a 29 70 53 74 6d  ree((char *)pStm
3770: 74 2d 3e 7a 53 71 6c 29 3b 0a 20 20 7d 0a 23 65  t->zSql);.  }.#e
3780: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 66  ndif.  sqlite3_f
3790: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 2d 3e 70  inalize(pStmt->p
37a0: 53 74 6d 74 29 3b 0a 20 20 54 63 6c 5f 46 72 65  Stmt);.  Tcl_Fre
37b0: 65 28 28 63 68 61 72 20 2a 29 70 53 74 6d 74 29  e((char *)pStmt)
37c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 61 6c  ;.}../*.** Final
37d0: 69 7a 65 20 61 6e 64 20 66 72 65 65 20 61 20 6c  ize and free a l
37e0: 69 73 74 20 6f 66 20 70 72 65 70 61 72 65 64 20  ist of prepared 
37f0: 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74  statements.*/.st
3800: 61 74 69 63 20 76 6f 69 64 20 66 6c 75 73 68 53  atic void flushS
3810: 74 6d 74 43 61 63 68 65 28 53 71 6c 69 74 65 44  tmtCache(SqliteD
3820: 62 20 2a 70 44 62 29 7b 0a 20 20 53 71 6c 50 72  b *pDb){.  SqlPr
3830: 65 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65  eparedStmt *pPre
3840: 53 74 6d 74 3b 0a 20 20 53 71 6c 50 72 65 70 61  Stmt;.  SqlPrepa
3850: 72 65 64 53 74 6d 74 20 2a 70 4e 65 78 74 3b 0a  redStmt *pNext;.
3860: 0a 20 20 66 6f 72 28 70 50 72 65 53 74 6d 74 20  .  for(pPreStmt 
3870: 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 3b  = pDb->stmtList;
3880: 20 70 50 72 65 53 74 6d 74 3b 20 70 50 72 65 53   pPreStmt; pPreS
3890: 74 6d 74 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  tmt=pNext){.    
38a0: 70 4e 65 78 74 20 3d 20 70 50 72 65 53 74 6d 74  pNext = pPreStmt
38b0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 64 62 46  ->pNext;.    dbF
38c0: 72 65 65 53 74 6d 74 28 70 50 72 65 53 74 6d 74  reeStmt(pPreStmt
38d0: 29 3b 0a 20 20 7d 0a 20 20 70 44 62 2d 3e 6e 53  );.  }.  pDb->nS
38e0: 74 6d 74 20 3d 20 30 3b 0a 20 20 70 44 62 2d 3e  tmt = 0;.  pDb->
38f0: 73 74 6d 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20  stmtLast = 0;.  
3900: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20  pDb->stmtList = 
3910: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 43 4c 20  0;.}../*.** TCL 
3920: 63 61 6c 6c 73 20 74 68 69 73 20 70 72 6f 63 65  calls this proce
3930: 64 75 72 65 20 77 68 65 6e 20 61 6e 20 73 71 6c  dure when an sql
3940: 69 74 65 33 20 64 61 74 61 62 61 73 65 20 63 6f  ite3 database co
3950: 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 64 65 6c 65  mmand is.** dele
3960: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ted..*/.static v
3970: 6f 69 64 20 44 62 44 65 6c 65 74 65 43 6d 64 28  oid DbDeleteCmd(
3980: 76 6f 69 64 20 2a 64 62 29 7b 0a 20 20 53 71 6c  void *db){.  Sql
3990: 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71  iteDb *pDb = (Sq
39a0: 6c 69 74 65 44 62 2a 29 64 62 3b 0a 20 20 66 6c  liteDb*)db;.  fl
39b0: 75 73 68 53 74 6d 74 43 61 63 68 65 28 70 44 62  ushStmtCache(pDb
39c0: 29 3b 0a 20 20 63 6c 6f 73 65 49 6e 63 72 62 6c  );.  closeIncrbl
39d0: 6f 62 43 68 61 6e 6e 65 6c 73 28 70 44 62 29 3b  obChannels(pDb);
39e0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  .  sqlite3_close
39f0: 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20 77 68 69  (pDb->db);.  whi
3a00: 6c 65 28 20 70 44 62 2d 3e 70 46 75 6e 63 20 29  le( pDb->pFunc )
3a10: 7b 0a 20 20 20 20 53 71 6c 46 75 6e 63 20 2a 70  {.    SqlFunc *p
3a20: 46 75 6e 63 20 3d 20 70 44 62 2d 3e 70 46 75 6e  Func = pDb->pFun
3a30: 63 3b 0a 20 20 20 20 70 44 62 2d 3e 70 46 75 6e  c;.    pDb->pFun
3a40: 63 20 3d 20 70 46 75 6e 63 2d 3e 70 4e 65 78 74  c = pFunc->pNext
3a50: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ;.    assert( pF
3a60: 75 6e 63 2d 3e 70 44 62 3d 3d 70 44 62 20 29 3b  unc->pDb==pDb );
3a70: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
3a80: 43 6f 75 6e 74 28 70 46 75 6e 63 2d 3e 70 53 63  Count(pFunc->pSc
3a90: 72 69 70 74 29 3b 0a 20 20 20 20 54 63 6c 5f 46  ript);.    Tcl_F
3aa0: 72 65 65 28 28 63 68 61 72 2a 29 70 46 75 6e 63  ree((char*)pFunc
3ab0: 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  );.  }.  while( 
3ac0: 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20 29 7b  pDb->pCollate ){
3ad0: 0a 20 20 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20  .    SqlCollate 
3ae0: 2a 70 43 6f 6c 6c 61 74 65 20 3d 20 70 44 62 2d  *pCollate = pDb-
3af0: 3e 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 70  >pCollate;.    p
3b00: 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20 3d 20 70  Db->pCollate = p
3b10: 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78 74 3b 0a  Collate->pNext;.
3b20: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68      Tcl_Free((ch
3b30: 61 72 2a 29 70 43 6f 6c 6c 61 74 65 29 3b 0a 20  ar*)pCollate);. 
3b40: 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 42   }.  if( pDb->zB
3b50: 75 73 79 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46  usy ){.    Tcl_F
3b60: 72 65 65 28 70 44 62 2d 3e 7a 42 75 73 79 29 3b  ree(pDb->zBusy);
3b70: 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e  .  }.  if( pDb->
3b80: 7a 54 72 61 63 65 20 29 7b 0a 20 20 20 20 54 63  zTrace ){.    Tc
3b90: 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 54 72 61  l_Free(pDb->zTra
3ba0: 63 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ce);.  }.  if( p
3bb0: 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a  Db->zProfile ){.
3bc0: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
3bd0: 2d 3e 7a 50 72 6f 66 69 6c 65 29 3b 0a 20 20 7d  ->zProfile);.  }
3be0: 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74  .  if( pDb->zAut
3bf0: 68 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65  h ){.    Tcl_Fre
3c00: 65 28 70 44 62 2d 3e 7a 41 75 74 68 29 3b 0a 20  e(pDb->zAuth);. 
3c10: 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 4e   }.  if( pDb->zN
3c20: 75 6c 6c 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46  ull ){.    Tcl_F
3c30: 72 65 65 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29 3b  ree(pDb->zNull);
3c40: 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e  .  }.  if( pDb->
3c50: 70 55 70 64 61 74 65 48 6f 6f 6b 20 29 7b 0a 20  pUpdateHook ){. 
3c60: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
3c70: 75 6e 74 28 70 44 62 2d 3e 70 55 70 64 61 74 65  unt(pDb->pUpdate
3c80: 48 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Hook);.  }.  if(
3c90: 20 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48   pDb->pRollbackH
3ca0: 6f 6f 6b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44  ook ){.    Tcl_D
3cb0: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d  ecrRefCount(pDb-
3cc0: 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 29 3b  >pRollbackHook);
3cd0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e  .  }.  if( pDb->
3ce0: 70 57 61 6c 48 6f 6f 6b 20 29 7b 0a 20 20 20 20  pWalHook ){.    
3cf0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
3d00: 28 70 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 29 3b  (pDb->pWalHook);
3d10: 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e  .  }.  if( pDb->
3d20: 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 20 29  pCollateNeeded )
3d30: 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  {.    Tcl_DecrRe
3d40: 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c  fCount(pDb->pCol
3d50: 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 7d  lateNeeded);.  }
3d60: 0a 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61  .  Tcl_Free((cha
3d70: 72 2a 29 70 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  r*)pDb);.}../*.*
3d80: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
3d90: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
3da0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
3db0: 20 6c 6f 63 6b 65 64 20 77 68 69 6c 65 20 74 72   locked while tr
3dc0: 79 69 6e 67 0a 2a 2a 20 74 6f 20 65 78 65 63 75  ying.** to execu
3dd0: 74 65 20 53 51 4c 2e 0a 2a 2f 0a 73 74 61 74 69  te SQL..*/.stati
3de0: 63 20 69 6e 74 20 44 62 42 75 73 79 48 61 6e 64  c int DbBusyHand
3df0: 6c 65 72 28 76 6f 69 64 20 2a 63 64 2c 20 69 6e  ler(void *cd, in
3e00: 74 20 6e 54 72 69 65 73 29 7b 0a 20 20 53 71 6c  t nTries){.  Sql
3e10: 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71  iteDb *pDb = (Sq
3e20: 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e  liteDb*)cd;.  in
3e30: 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 56 61  t rc;.  char zVa
3e40: 6c 5b 33 30 5d 3b 0a 0a 20 20 73 71 6c 69 74 65  l[30];..  sqlite
3e50: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
3e60: 66 28 7a 56 61 6c 29 2c 20 7a 56 61 6c 2c 20 22  f(zVal), zVal, "
3e70: 25 64 22 2c 20 6e 54 72 69 65 73 29 3b 0a 20 20  %d", nTries);.  
3e80: 72 63 20 3d 20 54 63 6c 5f 56 61 72 45 76 61 6c  rc = Tcl_VarEval
3e90: 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44  (pDb->interp, pD
3ea0: 62 2d 3e 7a 42 75 73 79 2c 20 22 20 22 2c 20 7a  b->zBusy, " ", z
3eb0: 56 61 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  Val, (char*)0);.
3ec0: 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b    if( rc!=TCL_OK
3ed0: 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65 74   || atoi(Tcl_Get
3ee0: 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62  StringResult(pDb
3ef0: 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a 20 20  ->interp)) ){.  
3f00: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
3f10: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 23    return 1;.}..#
3f20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3f30: 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c  IT_PROGRESS_CALL
3f40: 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  BACK./*.** This 
3f50: 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b  routine is invok
3f60: 65 64 20 61 73 20 74 68 65 20 27 70 72 6f 67 72  ed as the 'progr
3f70: 65 73 73 20 63 61 6c 6c 62 61 63 6b 27 20 66 6f  ess callback' fo
3f80: 72 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  r the database..
3f90: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62  */.static int Db
3fa0: 50 72 6f 67 72 65 73 73 48 61 6e 64 6c 65 72 28  ProgressHandler(
3fb0: 76 6f 69 64 20 2a 63 64 29 7b 0a 20 20 53 71 6c  void *cd){.  Sql
3fc0: 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71  iteDb *pDb = (Sq
3fd0: 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e  liteDb*)cd;.  in
3fe0: 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
3ff0: 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20   pDb->zProgress 
4000: 29 3b 0a 20 20 72 63 20 3d 20 54 63 6c 5f 45 76  );.  rc = Tcl_Ev
4010: 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  al(pDb->interp, 
4020: 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 29 3b  pDb->zProgress);
4030: 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f  .  if( rc!=TCL_O
4040: 4b 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65  K || atoi(Tcl_Ge
4050: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44  tStringResult(pD
4060: 62 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a 20  b->interp)) ){. 
4070: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
4080: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
4090: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
40a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
40b0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
40c0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
40d0: 20 74 68 65 20 53 51 4c 69 74 65 20 74 72 61 63   the SQLite trac
40e0: 65 20 68 61 6e 64 6c 65 72 20 77 68 65 6e 65 76  e handler whenev
40f0: 65 72 20 61 20 6e 65 77 0a 2a 2a 20 62 6c 6f 63  er a new.** bloc
4100: 6b 20 6f 66 20 53 51 4c 20 69 73 20 65 78 65 63  k of SQL is exec
4110: 75 74 65 64 2e 20 20 54 68 65 20 54 43 4c 20 73  uted.  The TCL s
4120: 63 72 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a 54  cript in pDb->zT
4130: 72 61 63 65 20 69 73 20 65 78 65 63 75 74 65 64  race is executed
4140: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4150: 20 44 62 54 72 61 63 65 48 61 6e 64 6c 65 72 28   DbTraceHandler(
4160: 76 6f 69 64 20 2a 63 64 2c 20 63 6f 6e 73 74 20  void *cd, const 
4170: 63 68 61 72 20 2a 7a 53 71 6c 29 7b 0a 20 20 53  char *zSql){.  S
4180: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
4190: 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20  SqliteDb*)cd;.  
41a0: 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b  Tcl_DString str;
41b0: 0a 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49  ..  Tcl_DStringI
41c0: 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 54 63 6c  nit(&str);.  Tcl
41d0: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26  _DStringAppend(&
41e0: 73 74 72 2c 20 70 44 62 2d 3e 7a 54 72 61 63 65  str, pDb->zTrace
41f0: 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74  , -1);.  Tcl_DSt
4200: 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e  ringAppendElemen
4210: 74 28 26 73 74 72 2c 20 7a 53 71 6c 29 3b 0a 20  t(&str, zSql);. 
4220: 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69   Tcl_Eval(pDb->i
4230: 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53 74 72 69  nterp, Tcl_DStri
4240: 6e 67 56 61 6c 75 65 28 26 73 74 72 29 29 3b 0a  ngValue(&str));.
4250: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
4260: 65 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f 52  e(&str);.  Tcl_R
4270: 65 73 65 74 52 65 73 75 6c 74 28 70 44 62 2d 3e  esetResult(pDb->
4280: 69 6e 74 65 72 70 29 3b 0a 7d 0a 23 65 6e 64 69  interp);.}.#endi
4290: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
42a0: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a  E_OMIT_TRACE./*.
42b0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
42c0: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
42d0: 20 53 51 4c 69 74 65 20 70 72 6f 66 69 6c 65 20   SQLite profile 
42e0: 68 61 6e 64 6c 65 72 20 61 66 74 65 72 20 61 20  handler after a 
42f0: 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 53 51 4c  statement.** SQL
4300: 20 68 61 73 20 65 78 65 63 75 74 65 64 2e 20 20   has executed.  
4310: 54 68 65 20 54 43 4c 20 73 63 72 69 70 74 20 69  The TCL script i
4320: 6e 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20  n pDb->zProfile 
4330: 69 73 20 65 76 61 6c 75 61 74 65 64 2e 0a 2a 2f  is evaluated..*/
4340: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44 62 50  .static void DbP
4350: 72 6f 66 69 6c 65 48 61 6e 64 6c 65 72 28 76 6f  rofileHandler(vo
4360: 69 64 20 2a 63 64 2c 20 63 6f 6e 73 74 20 63 68  id *cd, const ch
4370: 61 72 20 2a 7a 53 71 6c 2c 20 73 71 6c 69 74 65  ar *zSql, sqlite
4380: 5f 75 69 6e 74 36 34 20 74 6d 29 7b 0a 20 20 53  _uint64 tm){.  S
4390: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
43a0: 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20  SqliteDb*)cd;.  
43b0: 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b  Tcl_DString str;
43c0: 0a 20 20 63 68 61 72 20 7a 54 6d 5b 31 30 30 5d  .  char zTm[100]
43d0: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ;..  sqlite3_snp
43e0: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 54 6d  rintf(sizeof(zTm
43f0: 29 2d 31 2c 20 7a 54 6d 2c 20 22 25 6c 6c 64 22  )-1, zTm, "%lld"
4400: 2c 20 74 6d 29 3b 0a 20 20 54 63 6c 5f 44 53 74  , tm);.  Tcl_DSt
4410: 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a  ringInit(&str);.
4420: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
4430: 65 6e 64 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a  end(&str, pDb->z
4440: 50 72 6f 66 69 6c 65 2c 20 2d 31 29 3b 0a 20 20  Profile, -1);.  
4450: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
4460: 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a  dElement(&str, z
4470: 53 71 6c 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  Sql);.  Tcl_DStr
4480: 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ingAppendElement
4490: 28 26 73 74 72 2c 20 7a 54 6d 29 3b 0a 20 20 54  (&str, zTm);.  T
44a0: 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74  cl_Eval(pDb->int
44b0: 65 72 70 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67  erp, Tcl_DString
44c0: 56 61 6c 75 65 28 26 73 74 72 29 29 3b 0a 20 20  Value(&str));.  
44d0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
44e0: 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f 52 65 73  &str);.  Tcl_Res
44f0: 65 74 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e  etResult(pDb->in
4500: 74 65 72 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  terp);.}.#endif.
4510: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
4520: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
4530: 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  en a transaction
4540: 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20   is committed.  
4550: 54 68 65 0a 2a 2a 20 54 43 4c 20 73 63 72 69 70  The.** TCL scrip
4560: 74 20 69 6e 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69  t in pDb->zCommi
4570: 74 20 69 73 20 65 78 65 63 75 74 65 64 2e 20 20  t is executed.  
4580: 49 66 20 69 74 20 72 65 74 75 72 6e 73 20 6e 6f  If it returns no
4590: 6e 2d 7a 65 72 6f 20 6f 72 0a 2a 2a 20 69 66 20  n-zero or.** if 
45a0: 69 74 20 74 68 72 6f 77 73 20 61 6e 20 65 78 63  it throws an exc
45b0: 65 70 74 69 6f 6e 2c 20 74 68 65 20 74 72 61 6e  eption, the tran
45c0: 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
45d0: 64 20 62 61 63 6b 20 69 6e 73 74 65 61 64 0a 2a  d back instead.*
45e0: 2a 20 6f 66 20 62 65 69 6e 67 20 63 6f 6d 6d 69  * of being commi
45f0: 74 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tted..*/.static 
4600: 69 6e 74 20 44 62 43 6f 6d 6d 69 74 48 61 6e 64  int DbCommitHand
4610: 6c 65 72 28 76 6f 69 64 20 2a 63 64 29 7b 0a 20  ler(void *cd){. 
4620: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
4630: 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a   (SqliteDb*)cd;.
4640: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20    int rc;..  rc 
4650: 3d 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e  = Tcl_Eval(pDb->
4660: 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 43 6f  interp, pDb->zCo
4670: 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21  mmit);.  if( rc!
4680: 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28  =TCL_OK || atoi(
4690: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73  Tcl_GetStringRes
46a0: 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29  ult(pDb->interp)
46b0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
46c0: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
46d0: 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  0;.}..static voi
46e0: 64 20 44 62 52 6f 6c 6c 62 61 63 6b 48 61 6e 64  d DbRollbackHand
46f0: 6c 65 72 28 76 6f 69 64 20 2a 63 6c 69 65 6e 74  ler(void *client
4700: 44 61 74 61 29 7b 0a 20 20 53 71 6c 69 74 65 44  Data){.  SqliteD
4710: 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65  b *pDb = (Sqlite
4720: 44 62 2a 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a  Db*)clientData;.
4730: 20 20 61 73 73 65 72 74 28 70 44 62 2d 3e 70 52    assert(pDb->pR
4740: 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 29 3b 0a 20 20  ollbackHook);.  
4750: 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f  if( TCL_OK!=Tcl_
4760: 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69  EvalObjEx(pDb->i
4770: 6e 74 65 72 70 2c 20 70 44 62 2d 3e 70 52 6f 6c  nterp, pDb->pRol
4780: 6c 62 61 63 6b 48 6f 6f 6b 2c 20 30 29 20 29 7b  lbackHook, 0) ){
4790: 0a 20 20 20 20 54 63 6c 5f 42 61 63 6b 67 72 6f  .    Tcl_Backgro
47a0: 75 6e 64 45 72 72 6f 72 28 70 44 62 2d 3e 69 6e  undError(pDb->in
47b0: 74 65 72 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  terp);.  }.}../*
47c0: 0a 2a 2a 20 54 68 69 73 20 70 72 6f 63 65 64 75  .** This procedu
47d0: 72 65 20 68 61 6e 64 6c 65 73 20 77 61 6c 5f 68  re handles wal_h
47e0: 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 2a  ook callbacks..*
47f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 57  /.static int DbW
4800: 61 6c 48 61 6e 64 6c 65 72 28 0a 20 20 76 6f 69  alHandler(.  voi
4810: 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c 20 0a  d *clientData, .
4820: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a    sqlite3 *db, .
4830: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
4840: 62 2c 20 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79  b, .  int nEntry
4850: 0a 29 7b 0a 20 20 69 6e 74 20 72 65 74 20 3d 20  .){.  int ret = 
4860: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 54 63 6c  SQLITE_OK;.  Tcl
4870: 5f 4f 62 6a 20 2a 70 3b 0a 20 20 53 71 6c 69 74  _Obj *p;.  Sqlit
4880: 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69  eDb *pDb = (Sqli
4890: 74 65 44 62 2a 29 63 6c 69 65 6e 74 44 61 74 61  teDb*)clientData
48a0: 3b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ;.  Tcl_Interp *
48b0: 69 6e 74 65 72 70 20 3d 20 70 44 62 2d 3e 69 6e  interp = pDb->in
48c0: 74 65 72 70 3b 0a 20 20 61 73 73 65 72 74 28 70  terp;.  assert(p
48d0: 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 29 3b 0a 0a  Db->pWalHook);..
48e0: 20 20 70 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63    p = Tcl_Duplic
48f0: 61 74 65 4f 62 6a 28 70 44 62 2d 3e 70 57 61 6c  ateObj(pDb->pWal
4900: 48 6f 6f 6b 29 3b 0a 20 20 54 63 6c 5f 49 6e 63  Hook);.  Tcl_Inc
4910: 72 52 65 66 43 6f 75 6e 74 28 70 29 3b 0a 20 20  rRefCount(p);.  
4920: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
4930: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
4940: 20 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e   p, Tcl_NewStrin
4950: 67 4f 62 6a 28 7a 44 62 2c 20 2d 31 29 29 3b 0a  gObj(zDb, -1));.
4960: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
4970: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
4980: 70 2c 20 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  p, p, Tcl_NewInt
4990: 4f 62 6a 28 6e 45 6e 74 72 79 29 29 3b 0a 20 20  Obj(nEntry));.  
49a0: 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f  if( TCL_OK!=Tcl_
49b0: 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70  EvalObjEx(interp
49c0: 2c 20 70 2c 20 30 29 20 0a 20 20 20 7c 7c 20 54  , p, 0) .   || T
49d0: 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e  CL_OK!=Tcl_GetIn
49e0: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
49f0: 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c   Tcl_GetObjResul
4a00: 74 28 69 6e 74 65 72 70 29 2c 20 26 72 65 74 29  t(interp), &ret)
4a10: 0a 20 20 29 7b 0a 20 20 20 20 54 63 6c 5f 42 61  .  ){.    Tcl_Ba
4a20: 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e  ckgroundError(in
4a30: 74 65 72 70 29 3b 0a 20 20 7d 0a 20 20 54 63 6c  terp);.  }.  Tcl
4a40: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 29  _DecrRefCount(p)
4a50: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b  ;..  return ret;
4a60: 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .}..#if defined(
4a70: 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20  SQLITE_TEST) && 
4a80: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
4a90: 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54  NABLE_UNLOCK_NOT
4aa0: 49 46 59 29 0a 73 74 61 74 69 63 20 76 6f 69 64  IFY).static void
4ab0: 20 73 65 74 54 65 73 74 55 6e 6c 6f 63 6b 4e 6f   setTestUnlockNo
4ac0: 74 69 66 79 56 61 72 73 28 54 63 6c 5f 49 6e 74  tifyVars(Tcl_Int
4ad0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
4ae0: 20 69 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 29   iArg, int nArg)
4af0: 7b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 36 34  {.  char zBuf[64
4b00: 5d 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75  ];.  sprintf(zBu
4b10: 66 2c 20 22 25 64 22 2c 20 69 41 72 67 29 3b 0a  f, "%d", iArg);.
4b20: 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74    Tcl_SetVar(int
4b30: 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 75 6e 6c  erp, "sqlite_unl
4b40: 6f 63 6b 5f 6e 6f 74 69 66 79 5f 61 72 67 22 2c  ock_notify_arg",
4b50: 20 7a 42 75 66 2c 20 54 43 4c 5f 47 4c 4f 42 41   zBuf, TCL_GLOBA
4b60: 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 73 70 72 69 6e  L_ONLY);.  sprin
4b70: 74 66 28 7a 42 75 66 2c 20 22 25 64 22 2c 20 6e  tf(zBuf, "%d", n
4b80: 41 72 67 29 3b 0a 20 20 54 63 6c 5f 53 65 74 56  Arg);.  Tcl_SetV
4b90: 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
4ba0: 74 65 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79  te_unlock_notify
4bb0: 5f 61 72 67 63 6f 75 6e 74 22 2c 20 7a 42 75 66  _argcount", zBuf
4bc0: 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c  , TCL_GLOBAL_ONL
4bd0: 59 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  Y);.}.#else.# de
4be0: 66 69 6e 65 20 73 65 74 54 65 73 74 55 6e 6c 6f  fine setTestUnlo
4bf0: 63 6b 4e 6f 74 69 66 79 56 61 72 73 28 78 2c 79  ckNotifyVars(x,y
4c00: 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  ,z).#endif..#ifd
4c10: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
4c20: 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0a 73  _UNLOCK_NOTIFY.s
4c30: 74 61 74 69 63 20 76 6f 69 64 20 44 62 55 6e 6c  tatic void DbUnl
4c40: 6f 63 6b 4e 6f 74 69 66 79 28 76 6f 69 64 20 2a  ockNotify(void *
4c50: 2a 61 70 41 72 67 2c 20 69 6e 74 20 6e 41 72 67  *apArg, int nArg
4c60: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
4c70: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
4c80: 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69  ++){.    const i
4c90: 6e 74 20 66 6c 61 67 73 20 3d 20 28 54 43 4c 5f  nt flags = (TCL_
4ca0: 45 56 41 4c 5f 47 4c 4f 42 41 4c 7c 54 43 4c 5f  EVAL_GLOBAL|TCL_
4cb0: 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20  EVAL_DIRECT);.  
4cc0: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
4cd0: 3d 20 28 53 71 6c 69 74 65 44 62 20 2a 29 61 70  = (SqliteDb *)ap
4ce0: 41 72 67 5b 69 5d 3b 0a 20 20 20 20 73 65 74 54  Arg[i];.    setT
4cf0: 65 73 74 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 56  estUnlockNotifyV
4d00: 61 72 73 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  ars(pDb->interp,
4d10: 20 69 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 61   i, nArg);.    a
4d20: 73 73 65 72 74 28 20 70 44 62 2d 3e 70 55 6e 6c  ssert( pDb->pUnl
4d30: 6f 63 6b 4e 6f 74 69 66 79 29 3b 0a 20 20 20 20  ockNotify);.    
4d40: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44  Tcl_EvalObjEx(pD
4d50: 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e  b->interp, pDb->
4d60: 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 2c 20 66  pUnlockNotify, f
4d70: 6c 61 67 73 29 3b 0a 20 20 20 20 54 63 6c 5f 44  lags);.    Tcl_D
4d80: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d  ecrRefCount(pDb-
4d90: 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 29 3b  >pUnlockNotify);
4da0: 0a 20 20 20 20 70 44 62 2d 3e 70 55 6e 6c 6f 63  .    pDb->pUnloc
4db0: 6b 4e 6f 74 69 66 79 20 3d 20 30 3b 0a 20 20 7d  kNotify = 0;.  }
4dc0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69  .}.#endif..stati
4dd0: 63 20 76 6f 69 64 20 44 62 55 70 64 61 74 65 48  c void DbUpdateH
4de0: 61 6e 64 6c 65 72 28 0a 20 20 76 6f 69 64 20 2a  andler(.  void *
4df0: 70 2c 20 0a 20 20 69 6e 74 20 6f 70 2c 0a 20 20  p, .  int op,.  
4e00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c  const char *zDb,
4e10: 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
4e20: 7a 54 62 6c 2c 20 0a 20 20 73 71 6c 69 74 65 5f  zTbl, .  sqlite_
4e30: 69 6e 74 36 34 20 72 6f 77 69 64 0a 29 7b 0a 20  int64 rowid.){. 
4e40: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
4e50: 20 28 53 71 6c 69 74 65 44 62 20 2a 29 70 3b 0a   (SqliteDb *)p;.
4e60: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b    Tcl_Obj *pCmd;
4e70: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 2d  ..  assert( pDb-
4e80: 3e 70 55 70 64 61 74 65 48 6f 6f 6b 20 29 3b 0a  >pUpdateHook );.
4e90: 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 51    assert( op==SQ
4ea0: 4c 49 54 45 5f 49 4e 53 45 52 54 20 7c 7c 20 6f  LITE_INSERT || o
4eb0: 70 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45  p==SQLITE_UPDATE
4ec0: 20 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 44   || op==SQLITE_D
4ed0: 45 4c 45 54 45 20 29 3b 0a 0a 20 20 70 43 6d 64  ELETE );..  pCmd
4ee0: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
4ef0: 4f 62 6a 28 70 44 62 2d 3e 70 55 70 64 61 74 65  Obj(pDb->pUpdate
4f00: 48 6f 6f 6b 29 3b 0a 20 20 54 63 6c 5f 49 6e 63  Hook);.  Tcl_Inc
4f10: 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b  rRefCount(pCmd);
4f20: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
4f30: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
4f40: 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Cmd, Tcl_NewStri
4f50: 6e 67 4f 62 6a 28 0a 20 20 20 20 28 20 28 6f 70  ngObj(.    ( (op
4f60: 3d 3d 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 29  ==SQLITE_INSERT)
4f70: 3f 22 49 4e 53 45 52 54 22 3a 28 6f 70 3d 3d 53  ?"INSERT":(op==S
4f80: 51 4c 49 54 45 5f 55 50 44 41 54 45 29 3f 22 55  QLITE_UPDATE)?"U
4f90: 50 44 41 54 45 22 3a 22 44 45 4c 45 54 45 22 29  PDATE":"DELETE")
4fa0: 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
4fb0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
4fc0: 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f  nt(0, pCmd, Tcl_
4fd0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 44 62  NewStringObj(zDb
4fe0: 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
4ff0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
5000: 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f  nt(0, pCmd, Tcl_
5010: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54 62  NewStringObj(zTb
5020: 6c 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c  l, -1));.  Tcl_L
5030: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
5040: 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c  ent(0, pCmd, Tcl
5050: 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 72  _NewWideIntObj(r
5060: 6f 77 69 64 29 29 3b 0a 20 20 54 63 6c 5f 45 76  owid));.  Tcl_Ev
5070: 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69 6e 74  alObjEx(pDb->int
5080: 65 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c 5f 45  erp, pCmd, TCL_E
5090: 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20 54  VAL_DIRECT);.  T
50a0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
50b0: 70 43 6d 64 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  pCmd);.}..static
50c0: 20 76 6f 69 64 20 74 63 6c 43 6f 6c 6c 61 74 65   void tclCollate
50d0: 4e 65 65 64 65 64 28 0a 20 20 76 6f 69 64 20 2a  Needed(.  void *
50e0: 70 43 74 78 2c 0a 20 20 73 71 6c 69 74 65 33 20  pCtx,.  sqlite3 
50f0: 2a 64 62 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a  *db,.  int enc,.
5100: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
5110: 61 6d 65 0a 29 7b 0a 20 20 53 71 6c 69 74 65 44  ame.){.  SqliteD
5120: 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65  b *pDb = (Sqlite
5130: 44 62 20 2a 29 70 43 74 78 3b 0a 20 20 54 63 6c  Db *)pCtx;.  Tcl
5140: 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 20 3d 20  _Obj *pScript = 
5150: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
5160: 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65  (pDb->pCollateNe
5170: 65 64 65 64 29 3b 0a 20 20 54 63 6c 5f 49 6e 63  eded);.  Tcl_Inc
5180: 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70  rRefCount(pScrip
5190: 74 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  t);.  Tcl_ListOb
51a0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
51b0: 2c 20 70 53 63 72 69 70 74 2c 20 54 63 6c 5f 4e  , pScript, Tcl_N
51c0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 4e 61 6d  ewStringObj(zNam
51d0: 65 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45  e, -1));.  Tcl_E
51e0: 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69 6e  valObjEx(pDb->in
51f0: 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20 30  terp, pScript, 0
5200: 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66  );.  Tcl_DecrRef
5210: 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a  Count(pScript);.
5220: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
5230: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
5240: 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20 53  to evaluate an S
5250: 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e  QL collation fun
5260: 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 65  ction implemente
5270: 64 0a 2a 2a 20 75 73 69 6e 67 20 54 43 4c 20 73  d.** using TCL s
5280: 63 72 69 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  cript..*/.static
5290: 20 69 6e 74 20 74 63 6c 53 71 6c 43 6f 6c 6c 61   int tclSqlColla
52a0: 74 65 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78  te(.  void *pCtx
52b0: 2c 0a 20 20 69 6e 74 20 6e 41 2c 0a 20 20 63 6f  ,.  int nA,.  co
52c0: 6e 73 74 20 76 6f 69 64 20 2a 7a 41 2c 0a 20 20  nst void *zA,.  
52d0: 69 6e 74 20 6e 42 2c 0a 20 20 63 6f 6e 73 74 20  int nB,.  const 
52e0: 76 6f 69 64 20 2a 7a 42 0a 29 7b 0a 20 20 53 71  void *zB.){.  Sq
52f0: 6c 43 6f 6c 6c 61 74 65 20 2a 70 20 3d 20 28 53  lCollate *p = (S
5300: 71 6c 43 6f 6c 6c 61 74 65 20 2a 29 70 43 74 78  qlCollate *)pCtx
5310: 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d  ;.  Tcl_Obj *pCm
5320: 64 3b 0a 0a 20 20 70 43 6d 64 20 3d 20 54 63 6c  d;..  pCmd = Tcl
5330: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 2d  _NewStringObj(p-
5340: 3e 7a 53 63 72 69 70 74 2c 20 2d 31 29 3b 0a 20  >zScript, -1);. 
5350: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
5360: 74 28 70 43 6d 64 29 3b 0a 20 20 54 63 6c 5f 4c  t(pCmd);.  Tcl_L
5370: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
5380: 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70  ent(p->interp, p
5390: 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Cmd, Tcl_NewStri
53a0: 6e 67 4f 62 6a 28 7a 41 2c 20 6e 41 29 29 3b 0a  ngObj(zA, nA));.
53b0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
53c0: 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d 3e 69 6e  endElement(p->in
53d0: 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 63 6c 5f  terp, pCmd, Tcl_
53e0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 42 2c  NewStringObj(zB,
53f0: 20 6e 42 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61   nB));.  Tcl_Eva
5400: 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70  lObjEx(p->interp
5410: 2c 20 70 43 6d 64 2c 20 54 43 4c 5f 45 56 41 4c  , pCmd, TCL_EVAL
5420: 5f 44 49 52 45 43 54 29 3b 0a 20 20 54 63 6c 5f  _DIRECT);.  Tcl_
5430: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d  DecrRefCount(pCm
5440: 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 61 74  d);.  return (at
5450: 6f 69 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  oi(Tcl_GetString
5460: 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70  Result(p->interp
5470: 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  )));.}../*.** Th
5480: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
5490: 6c 6c 65 64 20 74 6f 20 65 76 61 6c 75 61 74 65  lled to evaluate
54a0: 20 61 6e 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e   an SQL function
54b0: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20   implemented.** 
54c0: 75 73 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74  using TCL script
54d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
54e0: 20 74 63 6c 53 71 6c 46 75 6e 63 28 73 71 6c 69   tclSqlFunc(sqli
54f0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
5500: 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20  text, int argc, 
5510: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 61  sqlite3_value**a
5520: 72 67 76 29 7b 0a 20 20 53 71 6c 46 75 6e 63 20  rgv){.  SqlFunc 
5530: 2a 70 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65  *p = sqlite3_use
5540: 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29 3b  r_data(context);
5550: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64  .  Tcl_Obj *pCmd
5560: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
5570: 20 72 63 3b 0a 0a 20 20 69 66 28 20 61 72 67 63   rc;..  if( argc
5580: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ==0 ){.    /* If
5590: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 61 72   there are no ar
55a0: 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 66  guments to the f
55b0: 75 6e 63 74 69 6f 6e 2c 20 63 61 6c 6c 20 54 63  unction, call Tc
55c0: 6c 5f 45 76 61 6c 4f 62 6a 45 78 20 6f 6e 20 74  l_EvalObjEx on t
55d0: 68 65 0a 20 20 20 20 2a 2a 20 73 63 72 69 70 74  he.    ** script
55e0: 20 6f 62 6a 65 63 74 20 64 69 72 65 63 74 6c 79   object directly
55f0: 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74  .  This allows t
5600: 68 65 20 54 43 4c 20 63 6f 6d 70 69 6c 65 72 20  he TCL compiler 
5610: 74 6f 20 67 65 6e 65 72 61 74 65 0a 20 20 20 20  to generate.    
5620: 2a 2a 20 62 79 74 65 63 6f 64 65 20 66 6f 72 20  ** bytecode for 
5630: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6f 6e 20 74  the command on t
5640: 68 65 20 66 69 72 73 74 20 69 6e 76 6f 63 61 74  he first invocat
5650: 69 6f 6e 20 61 6e 64 20 74 68 75 73 20 6d 61 6b  ion and thus mak
5660: 65 0a 20 20 20 20 2a 2a 20 73 75 62 73 65 71 75  e.    ** subsequ
5670: 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73 20  ent invocations 
5680: 6d 75 63 68 20 66 61 73 74 65 72 2e 20 2a 2f 0a  much faster. */.
5690: 20 20 20 20 70 43 6d 64 20 3d 20 70 2d 3e 70 53      pCmd = p->pS
56a0: 63 72 69 70 74 3b 0a 20 20 20 20 54 63 6c 5f 49  cript;.    Tcl_I
56b0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64  ncrRefCount(pCmd
56c0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 54 63 6c 5f  );.    rc = Tcl_
56d0: 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74  EvalObjEx(p->int
56e0: 65 72 70 2c 20 70 43 6d 64 2c 20 30 29 3b 0a 20  erp, pCmd, 0);. 
56f0: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
5700: 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 7d 65 6c  unt(pCmd);.  }el
5710: 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  se{.    /* If th
5720: 65 72 65 20 61 72 65 20 61 72 67 75 6d 65 6e 74  ere are argument
5730: 73 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f  s to the functio
5740: 6e 2c 20 6d 61 6b 65 20 61 20 73 68 61 6c 6c 6f  n, make a shallo
5750: 77 20 63 6f 70 79 20 6f 66 20 74 68 65 0a 20 20  w copy of the.  
5760: 20 20 2a 2a 20 73 63 72 69 70 74 20 6f 62 6a 65    ** script obje
5770: 63 74 2c 20 6c 61 70 70 65 6e 64 20 74 68 65 20  ct, lappend the 
5780: 61 72 67 75 6d 65 6e 74 73 2c 20 74 68 65 6e 20  arguments, then 
5790: 65 76 61 6c 75 61 74 65 20 74 68 65 20 63 6f 70  evaluate the cop
57a0: 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  y..    **.    **
57b0: 20 42 79 20 22 73 68 61 6c 6c 6f 77 22 20 63 6f   By "shallow" co
57c0: 70 79 2c 20 77 65 20 6d 65 61 6e 20 61 20 6f 6e  py, we mean a on
57d0: 6c 79 20 74 68 65 20 6f 75 74 65 72 20 6c 69 73  ly the outer lis
57e0: 74 20 54 63 6c 5f 4f 62 6a 20 69 73 20 64 75 70  t Tcl_Obj is dup
57f0: 6c 69 63 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20  licated..    ** 
5800: 54 68 65 20 6e 65 77 20 54 63 6c 5f 4f 62 6a 20  The new Tcl_Obj 
5810: 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74 65 72  contains pointer
5820: 73 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  s to the origina
5830: 6c 20 6c 69 73 74 20 65 6c 65 6d 65 6e 74 73 2e  l list elements.
5840: 20 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 77 61   .    ** That wa
5850: 79 2c 20 77 68 65 6e 20 54 63 6c 5f 45 76 61 6c  y, when Tcl_Eval
5860: 4f 62 6a 76 28 29 20 69 73 20 72 75 6e 20 61 6e  Objv() is run an
5870: 64 20 73 68 69 6d 6d 65 72 73 20 74 68 65 20 66  d shimmers the f
5880: 69 72 73 74 20 65 6c 65 6d 65 6e 74 0a 20 20 20  irst element.   
5890: 20 2a 2a 20 6f 66 20 74 68 65 20 6c 69 73 74 20   ** of the list 
58a0: 74 6f 20 74 63 6c 43 6d 64 4e 61 6d 65 54 79 70  to tclCmdNameTyp
58b0: 65 2c 20 74 68 61 74 20 61 6c 74 65 72 6e 61 74  e, that alternat
58c0: 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  e representation
58d0: 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20   will.    ** be 
58e0: 70 72 65 73 65 72 76 65 64 20 61 6e 64 20 72 65  preserved and re
58f0: 75 73 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74  used on the next
5900: 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 20 20 20   invocation..   
5910: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20   */.    Tcl_Obj 
5920: 2a 2a 61 41 72 67 3b 0a 20 20 20 20 69 6e 74 20  **aArg;.    int 
5930: 6e 41 72 67 3b 0a 20 20 20 20 69 66 28 20 54 63  nArg;.    if( Tc
5940: 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d  l_ListObjGetElem
5950: 65 6e 74 73 28 70 2d 3e 69 6e 74 65 72 70 2c 20  ents(p->interp, 
5960: 70 2d 3e 70 53 63 72 69 70 74 2c 20 26 6e 41 72  p->pScript, &nAr
5970: 67 2c 20 26 61 41 72 67 29 20 29 7b 0a 20 20 20  g, &aArg) ){.   
5980: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
5990: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
59a0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65   Tcl_GetStringRe
59b0: 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c  sult(p->interp),
59c0: 20 2d 31 29 3b 20 0a 20 20 20 20 20 20 72 65 74   -1); .      ret
59d0: 75 72 6e 3b 0a 20 20 20 20 7d 20 20 20 20 20 0a  urn;.    }     .
59e0: 20 20 20 20 70 43 6d 64 20 3d 20 54 63 6c 5f 4e      pCmd = Tcl_N
59f0: 65 77 4c 69 73 74 4f 62 6a 28 6e 41 72 67 2c 20  ewListObj(nArg, 
5a00: 61 41 72 67 29 3b 0a 20 20 20 20 54 63 6c 5f 49  aArg);.    Tcl_I
5a10: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64  ncrRefCount(pCmd
5a20: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
5a30: 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20  i<argc; i++){.  
5a40: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
5a50: 65 20 2a 70 49 6e 20 3d 20 61 72 67 76 5b 69 5d  e *pIn = argv[i]
5a60: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20  ;.      Tcl_Obj 
5a70: 2a 70 56 61 6c 3b 0a 20 20 20 20 20 20 20 20 20  *pVal;.         
5a80: 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 53 65 74     .      /* Set
5a90: 20 70 56 61 6c 20 74 6f 20 63 6f 6e 74 61 69 6e   pVal to contain
5aa0: 20 74 68 65 20 69 27 74 68 20 63 6f 6c 75 6d 6e   the i'th column
5ab0: 20 6f 66 20 74 68 69 73 20 72 6f 77 2e 20 2a 2f   of this row. */
5ac0: 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20 73  .      switch( s
5ad0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
5ae0: 65 28 70 49 6e 29 20 29 7b 0a 20 20 20 20 20 20  e(pIn) ){.      
5af0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 4c    case SQLITE_BL
5b00: 4f 42 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  OB: {.          
5b10: 69 6e 74 20 62 79 74 65 73 20 3d 20 73 71 6c 69  int bytes = sqli
5b20: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
5b30: 70 49 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pIn);.          
5b40: 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79  pVal = Tcl_NewBy
5b50: 74 65 41 72 72 61 79 4f 62 6a 28 73 71 6c 69 74  teArrayObj(sqlit
5b60: 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 70 49  e3_value_blob(pI
5b70: 6e 29 2c 20 62 79 74 65 73 29 3b 0a 20 20 20 20  n), bytes);.    
5b80: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5b90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63       }.        c
5ba0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  ase SQLITE_INTEG
5bb0: 45 52 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ER: {.          
5bc0: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 76 20 3d  sqlite_int64 v =
5bd0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
5be0: 6e 74 36 34 28 70 49 6e 29 3b 0a 20 20 20 20 20  nt64(pIn);.     
5bf0: 20 20 20 20 20 69 66 28 20 76 3e 3d 2d 32 31 34       if( v>=-214
5c00: 37 34 38 33 36 34 37 20 26 26 20 76 3c 3d 32 31  7483647 && v<=21
5c10: 34 37 34 38 33 36 34 37 20 29 7b 0a 20 20 20 20  47483647 ){.    
5c20: 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54          pVal = T
5c30: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 28 69 6e  cl_NewIntObj((in
5c40: 74 29 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  t)v);.          
5c50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
5c60: 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65     pVal = Tcl_Ne
5c70: 77 57 69 64 65 49 6e 74 4f 62 6a 28 76 29 3b 0a  wWideIntObj(v);.
5c80: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
5c90: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5ca0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63       }.        c
5cb0: 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54  ase SQLITE_FLOAT
5cc0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 64 6f  : {.          do
5cd0: 75 62 6c 65 20 72 20 3d 20 73 71 6c 69 74 65 33  uble r = sqlite3
5ce0: 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 70 49  _value_double(pI
5cf0: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 56  n);.          pV
5d00: 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 44 6f 75 62  al = Tcl_NewDoub
5d10: 6c 65 4f 62 6a 28 72 29 3b 0a 20 20 20 20 20 20  leObj(r);.      
5d20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
5d30: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73     }.        cas
5d40: 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b  e SQLITE_NULL: {
5d50: 0a 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20  .          pVal 
5d60: 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
5d70: 62 6a 28 70 2d 3e 70 44 62 2d 3e 7a 4e 75 6c 6c  bj(p->pDb->zNull
5d80: 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20  , -1);.         
5d90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
5da0: 7d 0a 20 20 20 20 20 20 20 20 64 65 66 61 75 6c  }.        defaul
5db0: 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69  t: {.          i
5dc0: 6e 74 20 62 79 74 65 73 20 3d 20 73 71 6c 69 74  nt bytes = sqlit
5dd0: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70  e3_value_bytes(p
5de0: 49 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  In);.          p
5df0: 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72  Val = Tcl_NewStr
5e00: 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29 73  ingObj((char *)s
5e10: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
5e20: 74 28 70 49 6e 29 2c 20 62 79 74 65 73 29 3b 0a  t(pIn), bytes);.
5e30: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
5e40: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5e50: 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 54 63   }.      rc = Tc
5e60: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
5e70: 6c 65 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70  lement(p->interp
5e80: 2c 20 70 43 6d 64 2c 20 70 56 61 6c 29 3b 0a 20  , pCmd, pVal);. 
5e90: 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
5ea0: 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52         Tcl_DecrR
5eb0: 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20  efCount(pCmd);. 
5ec0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
5ed0: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
5ee0: 65 78 74 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  ext, Tcl_GetStri
5ef0: 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65  ngResult(p->inte
5f00: 72 70 29 2c 20 2d 31 29 3b 20 0a 20 20 20 20 20  rp), -1); .     
5f10: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
5f20: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
5f30: 20 21 70 2d 3e 75 73 65 45 76 61 6c 4f 62 6a 76   !p->useEvalObjv
5f40: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 63 6c   ){.      /* Tcl
5f50: 5f 45 76 61 6c 4f 62 6a 45 78 28 29 20 77 69 6c  _EvalObjEx() wil
5f60: 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  l automatically 
5f70: 63 61 6c 6c 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  call Tcl_EvalObj
5f80: 76 28 29 20 69 66 20 70 43 6d 64 0a 20 20 20 20  v() if pCmd.    
5f90: 20 20 2a 2a 20 69 73 20 61 20 6c 69 73 74 20 77    ** is a list w
5fa0: 69 74 68 6f 75 74 20 61 20 73 74 72 69 6e 67 20  ithout a string 
5fb0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20  representation. 
5fc0: 20 54 6f 20 70 72 65 76 65 6e 74 20 74 68 69 73   To prevent this
5fd0: 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 68   from.      ** h
5fe0: 61 70 70 65 6e 69 6e 67 2c 20 6d 61 6b 65 20 73  appening, make s
5ff0: 75 72 65 20 70 43 6d 64 20 68 61 73 20 61 20 76  ure pCmd has a v
6000: 61 6c 69 64 20 73 74 72 69 6e 67 20 72 65 70 72  alid string repr
6010: 65 73 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20  esentation */.  
6020: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
6030: 67 28 70 43 6d 64 29 3b 0a 20 20 20 20 7d 0a 20  g(pCmd);.    }. 
6040: 20 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c     rc = Tcl_Eval
6050: 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c  ObjEx(p->interp,
6060: 20 70 43 6d 64 2c 20 54 43 4c 5f 45 56 41 4c 5f   pCmd, TCL_EVAL_
6070: 44 49 52 45 43 54 29 3b 0a 20 20 20 20 54 63 6c  DIRECT);.    Tcl
6080: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43  _DecrRefCount(pC
6090: 6d 64 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  md);.  }..  if( 
60a0: 72 63 20 26 26 20 72 63 21 3d 54 43 4c 5f 52 45  rc && rc!=TCL_RE
60b0: 54 55 52 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69  TURN ){.    sqli
60c0: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
60d0: 28 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f 47 65  (context, Tcl_Ge
60e0: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 2d  tStringResult(p-
60f0: 3e 69 6e 74 65 72 70 29 2c 20 2d 31 29 3b 20 0a  >interp), -1); .
6100: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c    }else{.    Tcl
6110: 5f 4f 62 6a 20 2a 70 56 61 72 20 3d 20 54 63 6c  _Obj *pVar = Tcl
6120: 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 70 2d  _GetObjResult(p-
6130: 3e 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 69 6e  >interp);.    in
6140: 74 20 6e 3b 0a 20 20 20 20 75 38 20 2a 64 61 74  t n;.    u8 *dat
6150: 61 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  a;.    const cha
6160: 72 20 2a 7a 54 79 70 65 20 3d 20 28 70 56 61 72  r *zType = (pVar
6170: 2d 3e 74 79 70 65 50 74 72 20 3f 20 70 56 61 72  ->typePtr ? pVar
6180: 2d 3e 74 79 70 65 50 74 72 2d 3e 6e 61 6d 65 20  ->typePtr->name 
6190: 3a 20 22 22 29 3b 0a 20 20 20 20 63 68 61 72 20  : "");.    char 
61a0: 63 20 3d 20 7a 54 79 70 65 5b 30 5d 3b 0a 20 20  c = zType[0];.  
61b0: 20 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20    if( c=='b' && 
61c0: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 62 79  strcmp(zType,"by
61d0: 74 65 61 72 72 61 79 22 29 3d 3d 30 20 26 26 20  tearray")==0 && 
61e0: 70 56 61 72 2d 3e 62 79 74 65 73 3d 3d 30 20 29  pVar->bytes==0 )
61f0: 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20  {.      /* Only 
6200: 72 65 74 75 72 6e 20 61 20 42 4c 4f 42 20 74 79  return a BLOB ty
6210: 70 65 20 69 66 20 74 68 65 20 54 63 6c 20 76 61  pe if the Tcl va
6220: 72 69 61 62 6c 65 20 69 73 20 61 20 62 79 74 65  riable is a byte
6230: 61 72 72 61 79 20 61 6e 64 0a 20 20 20 20 20 20  array and.      
6240: 2a 2a 20 68 61 73 20 6e 6f 20 73 74 72 69 6e 67  ** has no string
6250: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e   representation.
6260: 20 2a 2f 0a 20 20 20 20 20 20 64 61 74 61 20 3d   */.      data =
6270: 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61   Tcl_GetByteArra
6280: 79 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26  yFromObj(pVar, &
6290: 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
62a0: 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 28 63 6f  3_result_blob(co
62b0: 6e 74 65 78 74 2c 20 64 61 74 61 2c 20 6e 2c 20  ntext, data, n, 
62c0: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
62d0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
62e0: 20 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d   c=='b' && strcm
62f0: 70 28 7a 54 79 70 65 2c 22 62 6f 6f 6c 65 61 6e  p(zType,"boolean
6300: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54  ")==0 ){.      T
6310: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
6320: 28 30 2c 20 70 56 61 72 2c 20 26 6e 29 3b 0a 20  (0, pVar, &n);. 
6330: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
6340: 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c  ult_int(context,
6350: 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69   n);.    }else i
6360: 66 28 20 63 3d 3d 27 64 27 20 26 26 20 73 74 72  f( c=='d' && str
6370: 63 6d 70 28 7a 54 79 70 65 2c 22 64 6f 75 62 6c  cmp(zType,"doubl
6380: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
6390: 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20 20 20  double r;.      
63a0: 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f  Tcl_GetDoubleFro
63b0: 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c 20 26 72  mObj(0, pVar, &r
63c0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
63d0: 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63  _result_double(c
63e0: 6f 6e 74 65 78 74 2c 20 72 29 3b 0a 20 20 20 20  ontext, r);.    
63f0: 7d 65 6c 73 65 20 69 66 28 20 28 63 3d 3d 27 77  }else if( (c=='w
6400: 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70  ' && strcmp(zTyp
6410: 65 2c 22 77 69 64 65 49 6e 74 22 29 3d 3d 30 29  e,"wideInt")==0)
6420: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 28 63   ||.          (c
6430: 3d 3d 27 69 27 20 26 26 20 73 74 72 63 6d 70 28  =='i' && strcmp(
6440: 7a 54 79 70 65 2c 22 69 6e 74 22 29 3d 3d 30 29  zType,"int")==0)
6450: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 69   ){.      Tcl_Wi
6460: 64 65 49 6e 74 20 76 3b 0a 20 20 20 20 20 20 54  deInt v;.      T
6470: 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f  cl_GetWideIntFro
6480: 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c 20 26 76  mObj(0, pVar, &v
6490: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
64a0: 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f  _result_int64(co
64b0: 6e 74 65 78 74 2c 20 76 29 3b 0a 20 20 20 20 7d  ntext, v);.    }
64c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 61 74 61  else{.      data
64d0: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
64e0: 72 20 2a 29 54 63 6c 5f 47 65 74 53 74 72 69 6e  r *)Tcl_GetStrin
64f0: 67 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26  gFromObj(pVar, &
6500: 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
6510: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
6520: 6e 74 65 78 74 2c 20 28 63 68 61 72 20 2a 29 64  ntext, (char *)d
6530: 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 54  ata, n, SQLITE_T
6540: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d  RANSIENT);.    }
6550: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
6560: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
6570: 4f 52 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20  ORIZATION./*.** 
6580: 54 68 69 73 20 69 73 20 74 68 65 20 61 75 74 68  This is the auth
6590: 65 6e 74 69 63 61 74 69 6f 6e 20 66 75 6e 63 74  entication funct
65a0: 69 6f 6e 2e 20 20 49 74 20 61 70 70 65 6e 64 73  ion.  It appends
65b0: 20 74 68 65 20 61 75 74 68 65 6e 74 69 63 61 74   the authenticat
65c0: 69 6f 6e 0a 2a 2a 20 74 79 70 65 20 63 6f 64 65  ion.** type code
65d0: 20 61 6e 64 20 74 68 65 20 74 77 6f 20 61 72 67   and the two arg
65e0: 75 6d 65 6e 74 73 20 74 6f 20 7a 43 6d 64 5b 5d  uments to zCmd[]
65f0: 20 74 68 65 6e 20 69 6e 76 6f 6b 65 73 20 74 68   then invokes th
6600: 65 20 72 65 73 75 6c 74 0a 2a 2a 20 6f 6e 20 74  e result.** on t
6610: 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 20  he interpreter. 
6620: 20 54 68 65 20 72 65 70 6c 79 20 69 73 20 65 78   The reply is ex
6630: 61 6d 69 6e 65 64 20 74 6f 20 64 65 74 65 72 6d  amined to determ
6640: 69 6e 65 20 69 66 20 74 68 65 0a 2a 2a 20 61 75  ine if the.** au
6650: 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 66 61 69  thentication fai
6660: 6c 73 20 6f 72 20 73 75 63 63 65 65 64 73 2e 0a  ls or succeeds..
6670: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75  */.static int au
6680: 74 68 5f 63 61 6c 6c 62 61 63 6b 28 0a 20 20 76  th_callback(.  v
6690: 6f 69 64 20 2a 70 41 72 67 2c 0a 20 20 69 6e 74  oid *pArg,.  int
66a0: 20 63 6f 64 65 2c 0a 20 20 63 6f 6e 73 74 20 63   code,.  const c
66b0: 68 61 72 20 2a 7a 41 72 67 31 2c 0a 20 20 63 6f  har *zArg1,.  co
66c0: 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 32 2c  nst char *zArg2,
66d0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
66e0: 41 72 67 33 2c 0a 20 20 63 6f 6e 73 74 20 63 68  Arg3,.  const ch
66f0: 61 72 20 2a 7a 41 72 67 34 0a 29 7b 0a 20 20 63  ar *zArg4.){.  c
6700: 68 61 72 20 2a 7a 43 6f 64 65 3b 0a 20 20 54 63  har *zCode;.  Tc
6710: 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a 20  l_DString str;. 
6720: 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74   int rc;.  const
6730: 20 63 68 61 72 20 2a 7a 52 65 70 6c 79 3b 0a 20   char *zReply;. 
6740: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
6750: 20 28 53 71 6c 69 74 65 44 62 2a 29 70 41 72 67   (SqliteDb*)pArg
6760: 3b 0a 20 20 69 66 28 20 70 44 62 2d 3e 64 69 73  ;.  if( pDb->dis
6770: 61 62 6c 65 41 75 74 68 20 29 20 72 65 74 75 72  ableAuth ) retur
6780: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
6790: 73 77 69 74 63 68 28 20 63 6f 64 65 20 29 7b 0a  switch( code ){.
67a0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
67b0: 43 4f 50 59 20 20 20 20 20 20 20 20 20 20 20 20  COPY            
67c0: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
67d0: 45 5f 43 4f 50 59 22 3b 20 62 72 65 61 6b 3b 0a  E_COPY"; break;.
67e0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
67f0: 43 52 45 41 54 45 5f 49 4e 44 45 58 20 20 20 20  CREATE_INDEX    
6800: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
6810: 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 22 3b  E_CREATE_INDEX";
6820: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
6830: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
6840: 41 42 4c 45 20 20 20 20 20 20 3a 20 7a 43 6f 64  ABLE      : zCod
6850: 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45  e="SQLITE_CREATE
6860: 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a  _TABLE"; break;.
6870: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
6880: 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45  CREATE_TEMP_INDE
6890: 58 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54  X : zCode="SQLIT
68a0: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e  E_CREATE_TEMP_IN
68b0: 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  DEX"; break;.   
68c0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45   case SQLITE_CRE
68d0: 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 20 3a  ATE_TEMP_TABLE :
68e0: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43   zCode="SQLITE_C
68f0: 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45  REATE_TEMP_TABLE
6900: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
6910: 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45  se SQLITE_CREATE
6920: 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 3a 20 7a  _TEMP_TRIGGER: z
6930: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45  Code="SQLITE_CRE
6940: 41 54 45 5f 54 45 4d 50 5f 54 52 49 47 47 45 52  ATE_TEMP_TRIGGER
6950: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
6960: 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45  se SQLITE_CREATE
6970: 5f 54 45 4d 50 5f 56 49 45 57 20 20 3a 20 7a 43  _TEMP_VIEW  : zC
6980: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41  ode="SQLITE_CREA
6990: 54 45 5f 54 45 4d 50 5f 56 49 45 57 22 3b 20 62  TE_TEMP_VIEW"; b
69a0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
69b0: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 52 49  QLITE_CREATE_TRI
69c0: 47 47 45 52 20 20 20 20 3a 20 7a 43 6f 64 65 3d  GGER    : zCode=
69d0: 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54  "SQLITE_CREATE_T
69e0: 52 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a  RIGGER"; break;.
69f0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
6a00: 43 52 45 41 54 45 5f 56 49 45 57 20 20 20 20 20  CREATE_VIEW     
6a10: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
6a20: 45 5f 43 52 45 41 54 45 5f 56 49 45 57 22 3b 20  E_CREATE_VIEW"; 
6a30: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
6a40: 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 20 20  SQLITE_DELETE   
6a50: 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65           : zCode
6a60: 3d 22 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 22  ="SQLITE_DELETE"
6a70: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
6a80: 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e  e SQLITE_DROP_IN
6a90: 44 45 58 20 20 20 20 20 20 20 20 3a 20 7a 43 6f  DEX        : zCo
6aa0: 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f  de="SQLITE_DROP_
6ab0: 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20  INDEX"; break;. 
6ac0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
6ad0: 52 4f 50 5f 54 41 42 4c 45 20 20 20 20 20 20 20  ROP_TABLE       
6ae0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
6af0: 5f 44 52 4f 50 5f 54 41 42 4c 45 22 3b 20 62 72  _DROP_TABLE"; br
6b00: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
6b10: 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49  LITE_DROP_TEMP_I
6b20: 4e 44 45 58 20 20 20 3a 20 7a 43 6f 64 65 3d 22  NDEX   : zCode="
6b30: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
6b40: 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a  _INDEX"; break;.
6b50: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
6b60: 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 20  DROP_TEMP_TABLE 
6b70: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
6b80: 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c  E_DROP_TEMP_TABL
6b90: 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  E"; break;.    c
6ba0: 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  ase SQLITE_DROP_
6bb0: 54 45 4d 50 5f 54 52 49 47 47 45 52 20 3a 20 7a  TEMP_TRIGGER : z
6bc0: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f  Code="SQLITE_DRO
6bd0: 50 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 22 3b  P_TEMP_TRIGGER";
6be0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
6bf0: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d   SQLITE_DROP_TEM
6c00: 50 5f 56 49 45 57 20 20 20 20 3a 20 7a 43 6f 64  P_VIEW    : zCod
6c10: 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54  e="SQLITE_DROP_T
6c20: 45 4d 50 5f 56 49 45 57 22 3b 20 62 72 65 61 6b  EMP_VIEW"; break
6c30: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
6c40: 45 5f 44 52 4f 50 5f 54 52 49 47 47 45 52 20 20  E_DROP_TRIGGER  
6c50: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
6c60: 49 54 45 5f 44 52 4f 50 5f 54 52 49 47 47 45 52  ITE_DROP_TRIGGER
6c70: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
6c80: 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56  se SQLITE_DROP_V
6c90: 49 45 57 20 20 20 20 20 20 20 20 20 3a 20 7a 43  IEW         : zC
6ca0: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50  ode="SQLITE_DROP
6cb0: 5f 56 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20  _VIEW"; break;. 
6cc0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
6cd0: 4e 53 45 52 54 20 20 20 20 20 20 20 20 20 20 20  NSERT           
6ce0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
6cf0: 5f 49 4e 53 45 52 54 22 3b 20 62 72 65 61 6b 3b  _INSERT"; break;
6d00: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
6d10: 5f 50 52 41 47 4d 41 20 20 20 20 20 20 20 20 20  _PRAGMA         
6d20: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
6d30: 54 45 5f 50 52 41 47 4d 41 22 3b 20 62 72 65 61  TE_PRAGMA"; brea
6d40: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
6d50: 54 45 5f 52 45 41 44 20 20 20 20 20 20 20 20 20  TE_READ         
6d60: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
6d70: 4c 49 54 45 5f 52 45 41 44 22 3b 20 62 72 65 61  LITE_READ"; brea
6d80: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
6d90: 54 45 5f 53 45 4c 45 43 54 20 20 20 20 20 20 20  TE_SELECT       
6da0: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
6db0: 4c 49 54 45 5f 53 45 4c 45 43 54 22 3b 20 62 72  LITE_SELECT"; br
6dc0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
6dd0: 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e  LITE_TRANSACTION
6de0: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
6df0: 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49  SQLITE_TRANSACTI
6e00: 4f 4e 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  ON"; break;.    
6e10: 63 61 73 65 20 53 51 4c 49 54 45 5f 55 50 44 41  case SQLITE_UPDA
6e20: 54 45 20 20 20 20 20 20 20 20 20 20 20 20 3a 20  TE            : 
6e30: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 55 50  zCode="SQLITE_UP
6e40: 44 41 54 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  DATE"; break;.  
6e50: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 54    case SQLITE_AT
6e60: 54 41 43 48 20 20 20 20 20 20 20 20 20 20 20 20  TACH            
6e70: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
6e80: 41 54 54 41 43 48 22 3b 20 62 72 65 61 6b 3b 0a  ATTACH"; break;.
6e90: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
6ea0: 44 45 54 41 43 48 20 20 20 20 20 20 20 20 20 20  DETACH          
6eb0: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
6ec0: 45 5f 44 45 54 41 43 48 22 3b 20 62 72 65 61 6b  E_DETACH"; break
6ed0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
6ee0: 45 5f 41 4c 54 45 52 5f 54 41 42 4c 45 20 20 20  E_ALTER_TABLE   
6ef0: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
6f00: 49 54 45 5f 41 4c 54 45 52 5f 54 41 42 4c 45 22  ITE_ALTER_TABLE"
6f10: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
6f20: 65 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58  e SQLITE_REINDEX
6f30: 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f             : zCo
6f40: 64 65 3d 22 53 51 4c 49 54 45 5f 52 45 49 4e 44  de="SQLITE_REIND
6f50: 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  EX"; break;.    
6f60: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 4e 41 4c  case SQLITE_ANAL
6f70: 59 5a 45 20 20 20 20 20 20 20 20 20 20 20 3a 20  YZE           : 
6f80: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 41 4e  zCode="SQLITE_AN
6f90: 41 4c 59 5a 45 22 3b 20 62 72 65 61 6b 3b 0a 20  ALYZE"; break;. 
6fa0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
6fb0: 52 45 41 54 45 5f 56 54 41 42 4c 45 20 20 20 20  REATE_VTABLE    
6fc0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
6fd0: 5f 43 52 45 41 54 45 5f 56 54 41 42 4c 45 22 3b  _CREATE_VTABLE";
6fe0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
6ff0: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54 41   SQLITE_DROP_VTA
7000: 42 4c 45 20 20 20 20 20 20 20 3a 20 7a 43 6f 64  BLE       : zCod
7010: 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56  e="SQLITE_DROP_V
7020: 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20  TABLE"; break;. 
7030: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
7040: 55 4e 43 54 49 4f 4e 20 20 20 20 20 20 20 20 20  UNCTION         
7050: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
7060: 5f 46 55 4e 43 54 49 4f 4e 22 3b 20 62 72 65 61  _FUNCTION"; brea
7070: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
7080: 54 45 5f 53 41 56 45 50 4f 49 4e 54 20 20 20 20  TE_SAVEPOINT    
7090: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
70a0: 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e 54 22 3b  LITE_SAVEPOINT";
70b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
70c0: 75 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ult             
70d0: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
70e0: 65 3d 22 3f 3f 3f 3f 22 3b 20 62 72 65 61 6b 3b  e="????"; break;
70f0: 0a 20 20 7d 0a 20 20 54 63 6c 5f 44 53 74 72 69  .  }.  Tcl_DStri
7100: 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20  ngInit(&str);.  
7110: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
7120: 64 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a 41 75  d(&str, pDb->zAu
7130: 74 68 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44  th, -1);.  Tcl_D
7140: 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d  StringAppendElem
7150: 65 6e 74 28 26 73 74 72 2c 20 7a 43 6f 64 65 29  ent(&str, zCode)
7160: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41  ;.  Tcl_DStringA
7170: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74  ppendElement(&st
7180: 72 2c 20 7a 41 72 67 31 20 3f 20 7a 41 72 67 31  r, zArg1 ? zArg1
7190: 20 3a 20 22 22 29 3b 0a 20 20 54 63 6c 5f 44 53   : "");.  Tcl_DS
71a0: 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65  tringAppendEleme
71b0: 6e 74 28 26 73 74 72 2c 20 7a 41 72 67 32 20 3f  nt(&str, zArg2 ?
71c0: 20 7a 41 72 67 32 20 3a 20 22 22 29 3b 0a 20 20   zArg2 : "");.  
71d0: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
71e0: 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a  dElement(&str, z
71f0: 41 72 67 33 20 3f 20 7a 41 72 67 33 20 3a 20 22  Arg3 ? zArg3 : "
7200: 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  ");.  Tcl_DStrin
7210: 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26  gAppendElement(&
7220: 73 74 72 2c 20 7a 41 72 67 34 20 3f 20 7a 41 72  str, zArg4 ? zAr
7230: 67 34 20 3a 20 22 22 29 3b 0a 20 20 72 63 20 3d  g4 : "");.  rc =
7240: 20 54 63 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 28   Tcl_GlobalEval(
7250: 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c  pDb->interp, Tcl
7260: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73  _DStringValue(&s
7270: 74 72 29 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  tr));.  Tcl_DStr
7280: 69 6e 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20  ingFree(&str);. 
7290: 20 7a 52 65 70 6c 79 20 3d 20 72 63 3d 3d 54 43   zReply = rc==TC
72a0: 4c 5f 4f 4b 20 3f 20 54 63 6c 5f 47 65 74 53 74  L_OK ? Tcl_GetSt
72b0: 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62 2d 3e  ringResult(pDb->
72c0: 69 6e 74 65 72 70 29 20 3a 20 22 53 51 4c 49 54  interp) : "SQLIT
72d0: 45 5f 44 45 4e 59 22 3b 0a 20 20 69 66 28 20 73  E_DENY";.  if( s
72e0: 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22 53 51  trcmp(zReply,"SQ
72f0: 4c 49 54 45 5f 4f 4b 22 29 3d 3d 30 20 29 7b 0a  LITE_OK")==0 ){.
7300: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
7310: 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  OK;.  }else if( 
7320: 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22 53  strcmp(zReply,"S
7330: 51 4c 49 54 45 5f 44 45 4e 59 22 29 3d 3d 30 20  QLITE_DENY")==0 
7340: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
7350: 54 45 5f 44 45 4e 59 3b 0a 20 20 7d 65 6c 73 65  TE_DENY;.  }else
7360: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 52 65 70   if( strcmp(zRep
7370: 6c 79 2c 22 53 51 4c 49 54 45 5f 49 47 4e 4f 52  ly,"SQLITE_IGNOR
7380: 45 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  E")==0 ){.    rc
7390: 20 3d 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45   = SQLITE_IGNORE
73a0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
73b0: 63 20 3d 20 39 39 39 3b 0a 20 20 7d 0a 20 20 72  c = 999;.  }.  r
73c0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
73d0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
73e0: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 20  T_AUTHORIZATION 
73f0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  */../*.** This r
7400: 6f 75 74 69 6e 65 20 72 65 61 64 73 20 61 20 6c  outine reads a l
7410: 69 6e 65 20 6f 66 20 74 65 78 74 20 66 72 6f 6d  ine of text from
7420: 20 46 49 4c 45 20 69 6e 2c 20 73 74 6f 72 65 73   FILE in, stores
7430: 0a 2a 2a 20 74 68 65 20 74 65 78 74 20 69 6e 20  .** the text in 
7440: 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
7450: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20 61 6e  from malloc() an
7460: 64 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  d returns a poin
7470: 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 74 65  ter.** to the te
7480: 78 74 2e 20 20 4e 55 4c 4c 20 69 73 20 72 65 74  xt.  NULL is ret
7490: 75 72 6e 65 64 20 61 74 20 65 6e 64 20 6f 66 20  urned at end of 
74a0: 66 69 6c 65 2c 20 6f 72 20 69 66 20 6d 61 6c 6c  file, or if mall
74b0: 6f 63 28 29 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a  oc().** fails..*
74c0: 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61  *.** The interfa
74d0: 63 65 20 69 73 20 6c 69 6b 65 20 22 72 65 61 64  ce is like "read
74e0: 6c 69 6e 65 22 20 62 75 74 20 6e 6f 20 63 6f 6d  line" but no com
74f0: 6d 61 6e 64 2d 6c 69 6e 65 20 65 64 69 74 69 6e  mand-line editin
7500: 67 0a 2a 2a 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a  g.** is done..**
7510: 0a 2a 2a 20 63 6f 70 69 65 64 20 66 72 6f 6d 20  .** copied from 
7520: 73 68 65 6c 6c 2e 63 20 66 72 6f 6d 20 27 2e 69  shell.c from '.i
7530: 6d 70 6f 72 74 27 20 63 6f 6d 6d 61 6e 64 0a 2a  mport' command.*
7540: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 6c  /.static char *l
7550: 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 63 68 61  ocal_getline(cha
7560: 72 20 2a 7a 50 72 6f 6d 70 74 2c 20 46 49 4c 45  r *zPrompt, FILE
7570: 20 2a 69 6e 29 7b 0a 20 20 63 68 61 72 20 2a 7a   *in){.  char *z
7580: 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 4c 69 6e  Line;.  int nLin
7590: 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 6e  e;.  int n;..  n
75a0: 4c 69 6e 65 20 3d 20 31 30 30 3b 0a 20 20 7a 4c  Line = 100;.  zL
75b0: 69 6e 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 4c  ine = malloc( nL
75c0: 69 6e 65 20 29 3b 0a 20 20 69 66 28 20 7a 4c 69  ine );.  if( zLi
75d0: 6e 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ne==0 ) return 0
75e0: 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 77 68 69  ;.  n = 0;.  whi
75f0: 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69 66 28  le( 1 ){.    if(
7600: 20 6e 2b 31 30 30 3e 6e 4c 69 6e 65 20 29 7b 0a   n+100>nLine ){.
7610: 20 20 20 20 20 20 6e 4c 69 6e 65 20 3d 20 6e 4c        nLine = nL
7620: 69 6e 65 2a 32 20 2b 20 31 30 30 3b 0a 20 20 20  ine*2 + 100;.   
7630: 20 20 20 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c     zLine = reall
7640: 6f 63 28 7a 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29  oc(zLine, nLine)
7650: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e  ;.      if( zLin
7660: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  e==0 ) return 0;
7670: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66  .    }.    if( f
7680: 67 65 74 73 28 26 7a 4c 69 6e 65 5b 6e 5d 2c 20  gets(&zLine[n], 
7690: 6e 4c 69 6e 65 20 2d 20 6e 2c 20 69 6e 29 3d 3d  nLine - n, in)==
76a0: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  0 ){.      if( n
76b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ==0 ){.        f
76c0: 72 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20  ree(zLine);.    
76d0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
76e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4c 69 6e      }.      zLin
76f0: 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  e[n] = 0;.      
7700: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
7710: 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 6e 5d   while( zLine[n]
7720: 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 20 20 69   ){ n++; }.    i
7730: 66 28 20 6e 3e 30 20 26 26 20 7a 4c 69 6e 65 5b  f( n>0 && zLine[
7740: 6e 2d 31 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20  n-1]=='\n' ){.  
7750: 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a      n--;.      z
7760: 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20  Line[n] = 0;.   
7770: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7780: 20 20 7d 0a 20 20 7a 4c 69 6e 65 20 3d 20 72 65    }.  zLine = re
7790: 61 6c 6c 6f 63 28 20 7a 4c 69 6e 65 2c 20 6e 2b  alloc( zLine, n+
77a0: 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4c  1 );.  return zL
77b0: 69 6e 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  ine;.}.../*.** T
77c0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
77d0: 70 61 72 74 20 6f 66 20 74 68 65 20 69 6d 70 6c  part of the impl
77e0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
77f0: 65 20 63 6f 6d 6d 61 6e 64 3a 0a 2a 2a 0a 2a 2a  e command:.**.**
7800: 20 20 20 24 64 62 20 74 72 61 6e 73 61 63 74 69     $db transacti
7810: 6f 6e 20 5b 2d 64 65 66 65 72 72 65 64 7c 2d 69  on [-deferred|-i
7820: 6d 6d 65 64 69 61 74 65 7c 2d 65 78 63 6c 75 73  mmediate|-exclus
7830: 69 76 65 5d 20 53 43 52 49 50 54 0a 2a 2a 0a 2a  ive] SCRIPT.**.*
7840: 2a 20 49 74 20 69 73 20 69 6e 76 6f 6b 65 64 20  * It is invoked 
7850: 61 66 74 65 72 20 65 76 61 6c 75 61 74 69 6e 67  after evaluating
7860: 20 74 68 65 20 73 63 72 69 70 74 20 53 43 52 49   the script SCRI
7870: 50 54 20 74 6f 20 63 6f 6d 6d 69 74 20 6f 72 20  PT to commit or 
7880: 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 74 68 65 20  rollback.** the 
7890: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 73  transaction or s
78a0: 61 76 65 70 6f 69 6e 74 20 6f 70 65 6e 65 64 20  avepoint opened 
78b0: 62 79 20 74 68 65 20 5b 74 72 61 6e 73 61 63 74  by the [transact
78c0: 69 6f 6e 5d 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f  ion] command..*/
78d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 54 72  .static int DbTr
78e0: 61 6e 73 50 6f 73 74 43 6d 64 28 0a 20 20 43 6c  ansPostCmd(.  Cl
78f0: 69 65 6e 74 44 61 74 61 20 64 61 74 61 5b 5d 2c  ientData data[],
7900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7910: 20 20 20 2f 2a 20 64 61 74 61 5b 30 5d 20 69 73     /* data[0] is
7920: 20 74 68 65 20 53 71 6c 69 74 65 33 44 62 2a 20   the Sqlite3Db* 
7930: 66 6f 72 20 24 64 62 20 2a 2f 0a 20 20 54 63 6c  for $db */.  Tcl
7940: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
7950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7960: 20 20 2f 2a 20 54 63 6c 20 69 6e 74 65 72 70 72    /* Tcl interpr
7970: 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65  eter */.  int re
7980: 73 75 6c 74 20 20 20 20 20 20 20 20 20 20 20 20  sult            
7990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
79a0: 2a 20 52 65 73 75 6c 74 20 6f 66 20 65 76 61 6c  * Result of eval
79b0: 75 61 74 69 6e 67 20 53 43 52 49 50 54 20 2a 2f  uating SCRIPT */
79c0: 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  .){.  static con
79d0: 73 74 20 63 68 61 72 20 2a 61 7a 45 6e 64 5b 5d  st char *azEnd[]
79e0: 20 3d 20 7b 0a 20 20 20 20 22 52 45 4c 45 41 53   = {.    "RELEAS
79f0: 45 20 5f 74 63 6c 5f 74 72 61 6e 73 61 63 74 69  E _tcl_transacti
7a00: 6f 6e 22 2c 20 20 20 20 20 20 20 20 2f 2a 20 72  on",        /* r
7a10: 63 3d 3d 54 43 4c 5f 45 52 52 4f 52 2c 20 6e 54  c==TCL_ERROR, nT
7a20: 72 61 6e 73 61 63 74 69 6f 6e 21 3d 30 20 2a 2f  ransaction!=0 */
7a30: 0a 20 20 20 20 22 43 4f 4d 4d 49 54 22 2c 20 20  .    "COMMIT",  
7a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a50: 20 20 20 20 20 20 20 20 2f 2a 20 72 63 21 3d 54          /* rc!=T
7a60: 43 4c 5f 45 52 52 4f 52 2c 20 6e 54 72 61 6e 73  CL_ERROR, nTrans
7a70: 61 63 74 69 6f 6e 3d 3d 30 20 2a 2f 0a 20 20 20  action==0 */.   
7a80: 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 5f 74   "ROLLBACK TO _t
7a90: 63 6c 5f 74 72 61 6e 73 61 63 74 69 6f 6e 20 3b  cl_transaction ;
7aa0: 20 52 45 4c 45 41 53 45 20 5f 74 63 6c 5f 74 72   RELEASE _tcl_tr
7ab0: 61 6e 73 61 63 74 69 6f 6e 22 2c 0a 20 20 20 20  ansaction",.    
7ac0: 22 52 4f 4c 4c 42 41 43 4b 22 20 20 20 20 20 20  "ROLLBACK"      
7ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ae0: 20 20 20 2f 2a 20 72 63 3d 3d 54 43 4c 5f 45 52     /* rc==TCL_ER
7af0: 52 4f 52 2c 20 6e 54 72 61 6e 73 61 63 74 69 6f  ROR, nTransactio
7b00: 6e 3d 3d 30 20 2a 2f 0a 20 20 7d 3b 0a 20 20 53  n==0 */.  };.  S
7b10: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
7b20: 53 71 6c 69 74 65 44 62 2a 29 64 61 74 61 5b 30  SqliteDb*)data[0
7b30: 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 72 65  ];.  int rc = re
7b40: 73 75 6c 74 3b 0a 20 20 63 6f 6e 73 74 20 63 68  sult;.  const ch
7b50: 61 72 20 2a 7a 45 6e 64 3b 0a 0a 20 20 70 44 62  ar *zEnd;..  pDb
7b60: 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d  ->nTransaction--
7b70: 3b 0a 20 20 7a 45 6e 64 20 3d 20 61 7a 45 6e 64  ;.  zEnd = azEnd
7b80: 5b 28 72 63 3d 3d 54 43 4c 5f 45 52 52 4f 52 29  [(rc==TCL_ERROR)
7b90: 2a 32 20 2b 20 28 70 44 62 2d 3e 6e 54 72 61 6e  *2 + (pDb->nTran
7ba0: 73 61 63 74 69 6f 6e 3d 3d 30 29 5d 3b 0a 0a 20  saction==0)];.. 
7bb0: 20 70 44 62 2d 3e 64 69 73 61 62 6c 65 41 75 74   pDb->disableAut
7bc0: 68 2b 2b 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  h++;.  if( sqlit
7bd0: 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c  e3_exec(pDb->db,
7be0: 20 7a 45 6e 64 2c 20 30 2c 20 30 2c 20 30 29 20   zEnd, 0, 0, 0) 
7bf0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
7c00: 20 69 73 20 61 20 74 72 69 63 6b 79 20 73 63 65   is a tricky sce
7c10: 6e 61 72 69 6f 20 74 6f 20 68 61 6e 64 6c 65 2e  nario to handle.
7c20: 20 54 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79   The most likely
7c30: 20 63 61 75 73 65 20 6f 66 20 61 6e 0a 20 20 20   cause of an.   
7c40: 20 20 20 2a 2a 20 65 72 72 6f 72 20 69 73 20 74     ** error is t
7c50: 68 61 74 20 74 68 65 20 65 78 65 63 28 29 20 61  hat the exec() a
7c60: 62 6f 76 65 20 77 61 73 20 61 6e 20 61 74 74 65  bove was an atte
7c70: 6d 70 74 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68  mpt to commit th
7c80: 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 70 2d  e .      ** top-
7c90: 6c 65 76 65 6c 20 74 72 61 6e 73 61 63 74 69 6f  level transactio
7ca0: 6e 20 74 68 61 74 20 72 65 74 75 72 6e 65 64 20  n that returned 
7cb0: 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 4f 72 2c  SQLITE_BUSY. Or,
7cc0: 20 6c 65 73 73 20 6c 69 6b 65 6c 79 2c 0a 20 20   less likely,.  
7cd0: 20 20 20 20 2a 2a 20 74 68 61 74 20 61 6e 20 49      ** that an I
7ce0: 4f 2d 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  O-error has occu
7cf0: 72 65 64 2e 20 49 6e 20 65 69 74 68 65 72 20 63  red. In either c
7d00: 61 73 65 2c 20 74 68 72 6f 77 20 61 20 54 63 6c  ase, throw a Tcl
7d10: 20 65 78 63 65 70 74 69 6f 6e 0a 20 20 20 20 20   exception.     
7d20: 20 2a 2a 20 61 6e 64 20 74 72 79 20 74 6f 20 72   ** and try to r
7d30: 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e  ollback the tran
7d40: 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  saction..      *
7d50: 2a 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20 69  *.      ** But i
7d60: 74 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20  t could also be 
7d70: 74 68 61 74 20 74 68 65 20 75 73 65 72 20 65 78  that the user ex
7d80: 65 63 75 74 65 64 20 6f 6e 65 20 6f 72 20 6d 6f  ecuted one or mo
7d90: 72 65 20 42 45 47 49 4e 2c 20 0a 20 20 20 20 20  re BEGIN, .     
7da0: 20 2a 2a 20 43 4f 4d 4d 49 54 2c 20 53 41 56 45   ** COMMIT, SAVE
7db0: 50 4f 49 4e 54 2c 20 52 45 4c 45 41 53 45 20 6f  POINT, RELEASE o
7dc0: 72 20 52 4f 4c 4c 42 41 43 4b 20 63 6f 6d 6d 61  r ROLLBACK comma
7dd0: 6e 64 73 20 74 68 61 74 20 61 72 65 20 63 6f 6e  nds that are con
7de0: 66 75 73 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  fusing.      ** 
7df0: 74 68 69 73 20 6d 65 74 68 6f 64 27 73 20 6c 6f  this method's lo
7e00: 67 69 63 2e 20 4e 6f 74 20 63 6c 65 61 72 20 68  gic. Not clear h
7e10: 6f 77 20 74 68 69 73 20 77 6f 75 6c 64 20 62 65  ow this would be
7e20: 20 62 65 73 74 20 68 61 6e 64 6c 65 64 2e 0a 20   best handled.. 
7e30: 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20       */.    if( 
7e40: 72 63 21 3d 54 43 4c 5f 45 52 52 4f 52 20 29 7b  rc!=TCL_ERROR ){
7e50: 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
7e60: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
7e70: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
7e80: 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20  Db->db), 0);.   
7e90: 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f     rc = TCL_ERRO
7ea0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  R;.    }.    sql
7eb0: 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64  ite3_exec(pDb->d
7ec0: 62 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30  b, "ROLLBACK", 0
7ed0: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 70  , 0, 0);.  }.  p
7ee0: 44 62 2d 3e 64 69 73 61 62 6c 65 41 75 74 68 2d  Db->disableAuth-
7ef0: 2d 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  -;..  return rc;
7f00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73  .}../*.** Unless
7f10: 20 53 51 4c 49 54 45 5f 54 45 53 54 20 69 73 20   SQLITE_TEST is 
7f20: 64 65 66 69 6e 65 64 2c 20 74 68 69 73 20 66 75  defined, this fu
7f30: 6e 63 74 69 6f 6e 20 69 73 20 61 20 73 69 6d 70  nction is a simp
7f40: 6c 65 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e  le wrapper aroun
7f50: 64 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 70 72 65  d.** sqlite3_pre
7f60: 70 61 72 65 5f 76 32 28 29 2e 20 49 66 20 53 51  pare_v2(). If SQ
7f70: 4c 49 54 45 5f 54 45 53 54 20 69 73 20 64 65 66  LITE_TEST is def
7f80: 69 6e 65 64 2c 20 74 68 65 6e 20 69 74 20 75 73  ined, then it us
7f90: 65 73 20 65 69 74 68 65 72 0a 2a 2a 20 73 71 6c  es either.** sql
7fa0: 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
7fb0: 29 20 6f 72 20 6c 65 67 61 63 79 20 69 6e 74 65  ) or legacy inte
7fc0: 72 66 61 63 65 20 73 71 6c 69 74 65 33 5f 70 72  rface sqlite3_pr
7fd0: 65 70 61 72 65 28 29 2c 20 64 65 70 65 6e 64 69  epare(), dependi
7fe0: 6e 67 0a 2a 2a 20 6f 6e 20 77 68 65 74 68 65 72  ng.** on whether
7ff0: 20 6f 72 20 6e 6f 74 20 74 68 65 20 5b 64 62 5f   or not the [db_
8000: 75 73 65 5f 6c 65 67 61 63 79 5f 70 72 65 70 61  use_legacy_prepa
8010: 72 65 5d 20 63 6f 6d 6d 61 6e 64 20 68 61 73 20  re] command has 
8020: 62 65 65 6e 20 75 73 65 64 20 74 6f 20 0a 2a 2a  been used to .**
8030: 20 63 6f 6e 66 69 67 75 72 65 20 74 68 65 20 63   configure the c
8040: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  onnection..*/.st
8050: 61 74 69 63 20 69 6e 74 20 64 62 50 72 65 70 61  atic int dbPrepa
8060: 72 65 28 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  re(.  SqliteDb *
8070: 70 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  pDb,            
8080: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
8090: 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f  e object */.  co
80a0: 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20  nst char *zSql, 
80b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
80c0: 20 53 51 4c 20 74 6f 20 63 6f 6d 70 69 6c 65 20   SQL to compile 
80d0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
80e0: 74 20 2a 2a 70 70 53 74 6d 74 2c 20 20 20 20 20  t **ppStmt,     
80f0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 72 65       /* OUT: Pre
8100: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
8110: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
8120: 2a 2a 70 7a 4f 75 74 20 20 20 20 20 20 20 20 20  **pzOut         
8130: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 69       /* OUT: Poi
8140: 6e 74 65 72 20 74 6f 20 6e 65 78 74 20 53 51 4c  nter to next SQL
8150: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b   statement */.){
8160: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
8170: 45 53 54 0a 20 20 69 66 28 20 70 44 62 2d 3e 62  EST.  if( pDb->b
8180: 4c 65 67 61 63 79 50 72 65 70 61 72 65 20 29 7b  LegacyPrepare ){
8190: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
81a0: 74 65 33 5f 70 72 65 70 61 72 65 28 70 44 62 2d  te3_prepare(pDb-
81b0: 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 70  >db, zSql, -1, p
81c0: 70 53 74 6d 74 2c 20 70 7a 4f 75 74 29 3b 0a 20  pStmt, pzOut);. 
81d0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
81e0: 72 6e 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  rn sqlite3_prepa
81f0: 72 65 5f 76 32 28 70 44 62 2d 3e 64 62 2c 20 7a  re_v2(pDb->db, z
8200: 53 71 6c 2c 20 2d 31 2c 20 70 70 53 74 6d 74 2c  Sql, -1, ppStmt,
8210: 20 70 7a 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pzOut);.}../*.*
8220: 2a 20 53 65 61 72 63 68 20 74 68 65 20 63 61 63  * Search the cac
8230: 68 65 20 66 6f 72 20 61 20 70 72 65 70 61 72 65  he for a prepare
8240: 64 2d 73 74 61 74 65 6d 65 6e 74 20 6f 62 6a 65  d-statement obje
8250: 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  ct that implemen
8260: 74 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  ts the.** first 
8270: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  SQL statement in
8280: 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
8290: 74 65 64 20 74 6f 20 62 79 20 70 61 72 61 6d 65  ted to by parame
82a0: 74 65 72 20 7a 49 6e 2e 20 49 66 0a 2a 2a 20 6e  ter zIn. If.** n
82b0: 6f 20 73 75 63 68 20 70 72 65 70 61 72 65 64 2d  o such prepared-
82c0: 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 20 62 65  statement can be
82d0: 20 66 6f 75 6e 64 2c 20 61 6c 6c 6f 63 61 74 65   found, allocate
82e0: 20 61 6e 64 20 70 72 65 70 61 72 65 20 61 20 6e   and prepare a n
82f0: 65 77 0a 2a 2a 20 6f 6e 65 2e 20 49 6e 20 65 69  ew.** one. In ei
8300: 74 68 65 72 20 63 61 73 65 2c 20 62 69 6e 64 20  ther case, bind 
8310: 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
8320: 65 73 20 6f 66 20 74 68 65 20 72 65 6c 65 76 61  es of the releva
8330: 6e 74 20 54 63 6c 0a 2a 2a 20 76 61 72 69 61 62  nt Tcl.** variab
8340: 6c 65 73 20 74 6f 20 61 6e 79 20 24 76 61 72 2c  les to any $var,
8350: 20 3a 76 61 72 20 6f 72 20 40 76 61 72 20 76 61   :var or @var va
8360: 72 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20 73  riables in the s
8370: 74 61 74 65 6d 65 6e 74 2e 20 42 65 66 6f 72 65  tatement. Before
8380: 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2c 20 73  .** returning, s
8390: 65 74 20 2a 70 70 50 72 65 53 74 6d 74 20 74 6f  et *ppPreStmt to
83a0: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 72   point to the pr
83b0: 65 70 61 72 65 64 2d 73 74 61 74 65 6d 65 6e 74  epared-statement
83c0: 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 4f   object..**.** O
83d0: 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 20  utput parameter 
83e0: 2a 70 7a 4f 75 74 20 69 73 20 73 65 74 20 74 6f  *pzOut is set to
83f0: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65   point to the ne
8400: 78 74 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  xt SQL statement
8410: 20 69 6e 0a 2a 2a 20 62 75 66 66 65 72 20 7a 49   in.** buffer zI
8420: 6e 2c 20 6f 72 20 74 6f 20 74 68 65 20 27 5c 30  n, or to the '\0
8430: 27 20 62 79 74 65 20 61 74 20 74 68 65 20 65 6e  ' byte at the en
8440: 64 20 6f 66 20 7a 49 6e 20 69 66 20 74 68 65 72  d of zIn if ther
8450: 65 20 69 73 20 6e 6f 0a 2a 2a 20 6e 65 78 74 20  e is no.** next 
8460: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
8470: 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
8480: 54 43 4c 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  TCL_OK is return
8490: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 54  ed. Otherwise, T
84a0: 43 4c 5f 45 52 52 4f 52 20 69 73 20 72 65 74 75  CL_ERROR is retu
84b0: 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65  rned.** and an e
84c0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6c 6f 61  rror message loa
84d0: 64 65 64 20 69 6e 74 6f 20 69 6e 74 65 72 70 72  ded into interpr
84e0: 65 74 65 72 20 70 44 62 2d 3e 69 6e 74 65 72 70  eter pDb->interp
84f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8500: 64 62 50 72 65 70 61 72 65 41 6e 64 42 69 6e 64  dbPrepareAndBind
8510: 28 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  (.  SqliteDb *pD
8520: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
8530: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
8540: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72  object */.  char
8550: 20 63 6f 6e 73 74 20 2a 7a 49 6e 2c 20 20 20 20   const *zIn,    
8560: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
8570: 51 4c 20 74 6f 20 63 6f 6d 70 69 6c 65 20 2a 2f  QL to compile */
8580: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a  .  char const **
8590: 70 7a 4f 75 74 2c 20 20 20 20 20 20 20 20 20 20  pzOut,          
85a0: 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e 74     /* OUT: Point
85b0: 65 72 20 74 6f 20 6e 65 78 74 20 53 51 4c 20 73  er to next SQL s
85c0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 71  tatement */.  Sq
85d0: 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 2a  lPreparedStmt **
85e0: 70 70 50 72 65 53 74 6d 74 20 20 20 20 20 2f 2a  ppPreStmt     /*
85f0: 20 4f 55 54 3a 20 4f 62 6a 65 63 74 20 75 73 65   OUT: Object use
8600: 64 20 74 6f 20 63 61 63 68 65 20 73 74 61 74 65  d to cache state
8610: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  ment */.){.  con
8620: 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20  st char *zSql = 
8630: 7a 49 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  zIn;         /* 
8640: 50 6f 69 6e 74 65 72 20 74 6f 20 66 69 72 73 74  Pointer to first
8650: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69   SQL statement i
8660: 6e 20 7a 49 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  n zIn */.  sqlit
8670: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20  e3_stmt *pStmt; 
8680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
8690: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
86a0: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 53 71 6c   object */.  Sql
86b0: 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70 50  PreparedStmt *pP
86c0: 72 65 53 74 6d 74 3b 20 20 20 20 20 20 2f 2a 20  reStmt;      /* 
86d0: 50 6f 69 6e 74 65 72 20 74 6f 20 63 61 63 68 65  Pointer to cache
86e0: 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  d statement */. 
86f0: 20 69 6e 74 20 6e 53 71 6c 3b 20 20 20 20 20 20   int nSql;      
8700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8710: 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 53   /* Length of zS
8720: 71 6c 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  ql in bytes */. 
8730: 20 69 6e 74 20 6e 56 61 72 3b 20 20 20 20 20 20   int nVar;      
8740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8750: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61   /* Number of va
8760: 72 69 61 62 6c 65 73 20 69 6e 20 73 74 61 74 65  riables in state
8770: 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 50  ment */.  int iP
8780: 61 72 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 20  arm = 0;        
8790: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
87a0: 74 20 66 72 65 65 20 65 6e 74 72 79 20 69 6e 20  t free entry in 
87b0: 61 70 50 61 72 6d 20 2a 2f 0a 20 20 69 6e 74 20  apParm */.  int 
87c0: 69 3b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  i;.  Tcl_Interp 
87d0: 2a 69 6e 74 65 72 70 20 3d 20 70 44 62 2d 3e 69  *interp = pDb->i
87e0: 6e 74 65 72 70 3b 0a 0a 20 20 2a 70 70 50 72 65  nterp;..  *ppPre
87f0: 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  Stmt = 0;..  /* 
8800: 54 72 69 6d 20 73 70 61 63 65 73 20 66 72 6f 6d  Trim spaces from
8810: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 7a 53   the start of zS
8820: 71 6c 20 61 6e 64 20 63 61 6c 63 75 6c 61 74 65  ql and calculate
8830: 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 20 6c   the remaining l
8840: 65 6e 67 74 68 2e 20 2a 2f 0a 20 20 77 68 69 6c  ength. */.  whil
8850: 65 28 20 69 73 73 70 61 63 65 28 7a 53 71 6c 5b  e( isspace(zSql[
8860: 30 5d 29 20 29 7b 20 7a 53 71 6c 2b 2b 3b 20 7d  0]) ){ zSql++; }
8870: 0a 20 20 6e 53 71 6c 20 3d 20 73 74 72 6c 65 6e  .  nSql = strlen
8880: 33 30 28 7a 53 71 6c 29 3b 0a 0a 20 20 66 6f 72  30(zSql);..  for
8890: 28 70 50 72 65 53 74 6d 74 20 3d 20 70 44 62 2d  (pPreStmt = pDb-
88a0: 3e 73 74 6d 74 4c 69 73 74 3b 20 70 50 72 65 53  >stmtList; pPreS
88b0: 74 6d 74 3b 20 70 50 72 65 53 74 6d 74 3d 70 50  tmt; pPreStmt=pP
88c0: 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 29 7b 0a  reStmt->pNext){.
88d0: 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 50 72 65      int n = pPre
88e0: 53 74 6d 74 2d 3e 6e 53 71 6c 3b 0a 20 20 20 20  Stmt->nSql;.    
88f0: 69 66 28 20 6e 53 71 6c 3e 3d 6e 20 0a 20 20 20  if( nSql>=n .   
8900: 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70       && memcmp(p
8910: 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c 20 7a  PreStmt->zSql, z
8920: 53 71 6c 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 20  Sql, n)==0.     
8930: 20 20 20 26 26 20 28 7a 53 71 6c 5b 6e 5d 3d 3d     && (zSql[n]==
8940: 30 20 7c 7c 20 7a 53 71 6c 5b 6e 2d 31 5d 3d 3d  0 || zSql[n-1]==
8950: 27 3b 27 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  ';').    ){.    
8960: 20 20 70 53 74 6d 74 20 3d 20 70 50 72 65 53 74    pStmt = pPreSt
8970: 6d 74 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20 20  mt->pStmt;.     
8980: 20 2a 70 7a 4f 75 74 20 3d 20 26 7a 53 71 6c 5b   *pzOut = &zSql[
8990: 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 5d 3b  pPreStmt->nSql];
89a0: 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20  ..      /* When 
89b0: 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
89c0: 6d 65 6e 74 20 69 73 20 66 6f 75 6e 64 2c 20 75  ment is found, u
89d0: 6e 6c 69 6e 6b 20 69 74 20 66 72 6f 6d 20 74 68  nlink it from th
89e0: 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 63 68 65  e.      ** cache
89f0: 20 6c 69 73 74 2e 20 20 49 74 20 77 69 6c 6c 20   list.  It will 
8a00: 6c 61 74 65 72 20 62 65 20 61 64 64 65 64 20 62  later be added b
8a10: 61 63 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e  ack to the begin
8a20: 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 6f 66  ning.      ** of
8a30: 20 74 68 65 20 63 61 63 68 65 20 6c 69 73 74 20   the cache list 
8a40: 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6d 70 6c  in order to impl
8a50: 65 6d 65 6e 74 20 4c 52 55 20 72 65 70 6c 61 63  ement LRU replac
8a60: 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ement..      */.
8a70: 20 20 20 20 20 20 69 66 28 20 70 50 72 65 53 74        if( pPreSt
8a80: 6d 74 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20  mt->pPrev ){.   
8a90: 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70       pPreStmt->p
8aa0: 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 50  Prev->pNext = pP
8ab0: 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 3b 0a 20  reStmt->pNext;. 
8ac0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8ad0: 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73      pDb->stmtLis
8ae0: 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e  t = pPreStmt->pN
8af0: 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
8b00: 20 20 20 69 66 28 20 70 50 72 65 53 74 6d 74 2d     if( pPreStmt-
8b10: 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  >pNext ){.      
8b20: 20 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78    pPreStmt->pNex
8b30: 74 2d 3e 70 50 72 65 76 20 3d 20 70 50 72 65 53  t->pPrev = pPreS
8b40: 74 6d 74 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20  tmt->pPrev;.    
8b50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8b60: 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d   pDb->stmtLast =
8b70: 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76   pPreStmt->pPrev
8b80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8b90: 70 44 62 2d 3e 6e 53 74 6d 74 2d 2d 3b 0a 20 20  pDb->nStmt--;.  
8ba0: 20 20 20 20 6e 56 61 72 20 3d 20 73 71 6c 69 74      nVar = sqlit
8bb0: 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
8bc0: 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a  r_count(pStmt);.
8bd0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8be0: 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49   }.  }.  .  /* I
8bf0: 66 20 6e 6f 20 70 72 65 70 61 72 65 64 20 73 74  f no prepared st
8c00: 61 74 65 6d 65 6e 74 20 77 61 73 20 66 6f 75 6e  atement was foun
8c10: 64 2e 20 43 6f 6d 70 69 6c 65 20 74 68 65 20 53  d. Compile the S
8c20: 51 4c 20 74 65 78 74 2e 20 41 6c 73 6f 20 61 6c  QL text. Also al
8c30: 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 61 20 6e 65  locate.  ** a ne
8c40: 77 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d  w SqlPreparedStm
8c50: 74 20 73 74 72 75 63 74 75 72 65 2e 20 20 2a 2f  t structure.  */
8c60: 0a 20 20 69 66 28 20 70 50 72 65 53 74 6d 74 3d  .  if( pPreStmt=
8c70: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42  =0 ){.    int nB
8c80: 79 74 65 3b 0a 0a 20 20 20 20 69 66 28 20 53 51  yte;..    if( SQ
8c90: 4c 49 54 45 5f 4f 4b 21 3d 64 62 50 72 65 70 61  LITE_OK!=dbPrepa
8ca0: 72 65 28 70 44 62 2c 20 7a 53 71 6c 2c 20 26 70  re(pDb, zSql, &p
8cb0: 53 74 6d 74 2c 20 70 7a 4f 75 74 29 20 29 7b 0a  Stmt, pzOut) ){.
8cc0: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a        Tcl_SetObj
8cd0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
8ce0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
8cf0: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
8d00: 44 62 2d 3e 64 62 29 2c 20 2d 31 29 29 3b 0a 20  Db->db), -1));. 
8d10: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
8d20: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
8d30: 20 69 66 28 20 70 53 74 6d 74 3d 3d 30 20 29 7b   if( pStmt==0 ){
8d40: 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
8d50: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 65 72  E_OK!=sqlite3_er
8d60: 72 63 6f 64 65 28 70 44 62 2d 3e 64 62 29 20 29  rcode(pDb->db) )
8d70: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63  {.        /* A c
8d80: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 65 72 72 6f  ompile-time erro
8d90: 72 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  r in the stateme
8da0: 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 54  nt. */.        T
8db0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
8dc0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53  interp, Tcl_NewS
8dd0: 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33  tringObj(sqlite3
8de0: 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29  _errmsg(pDb->db)
8df0: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20  , -1));.        
8e00: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
8e10: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
8e20: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 74         /* The st
8e30: 61 74 65 6d 65 6e 74 20 77 61 73 20 61 20 6e 6f  atement was a no
8e40: 2d 6f 70 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74  -op.  Continue t
8e50: 6f 20 74 68 65 20 6e 65 78 74 20 73 74 61 74 65  o the next state
8e60: 6d 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  ment.        ** 
8e70: 69 6e 20 74 68 65 20 53 51 4c 20 73 74 72 69 6e  in the SQL strin
8e80: 67 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  g..        */.  
8e90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
8ea0: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
8eb0: 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20   }..    assert( 
8ec0: 70 50 72 65 53 74 6d 74 3d 3d 30 20 29 3b 0a 20  pPreStmt==0 );. 
8ed0: 20 20 20 6e 56 61 72 20 3d 20 73 71 6c 69 74 65     nVar = sqlite
8ee0: 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
8ef0: 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20  _count(pStmt);. 
8f00: 20 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f     nByte = sizeo
8f10: 66 28 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d  f(SqlPreparedStm
8f20: 74 29 20 2b 20 6e 56 61 72 2a 73 69 7a 65 6f 66  t) + nVar*sizeof
8f30: 28 54 63 6c 5f 4f 62 6a 20 2a 29 3b 0a 20 20 20  (Tcl_Obj *);.   
8f40: 20 70 50 72 65 53 74 6d 74 20 3d 20 28 53 71 6c   pPreStmt = (Sql
8f50: 50 72 65 70 61 72 65 64 53 74 6d 74 2a 29 54 63  PreparedStmt*)Tc
8f60: 6c 5f 41 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a  l_Alloc(nByte);.
8f70: 20 20 20 20 6d 65 6d 73 65 74 28 70 50 72 65 53      memset(pPreS
8f80: 74 6d 74 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a  tmt, 0, nByte);.
8f90: 0a 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70  .    pPreStmt->p
8fa0: 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20  Stmt = pStmt;.  
8fb0: 20 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c    pPreStmt->nSql
8fc0: 20 3d 20 28 69 6e 74 29 28 2a 70 7a 4f 75 74 20   = (int)(*pzOut 
8fd0: 2d 20 7a 53 71 6c 29 3b 0a 20 20 20 20 70 50 72  - zSql);.    pPr
8fe0: 65 53 74 6d 74 2d 3e 7a 53 71 6c 20 3d 20 73 71  eStmt->zSql = sq
8ff0: 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d 74 29  lite3_sql(pStmt)
9000: 3b 0a 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e  ;.    pPreStmt->
9010: 61 70 50 61 72 6d 20 3d 20 28 54 63 6c 5f 4f 62  apParm = (Tcl_Ob
9020: 6a 20 2a 2a 29 26 70 50 72 65 53 74 6d 74 5b 31  j **)&pPreStmt[1
9030: 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ];.#ifdef SQLITE
9040: 5f 54 45 53 54 0a 20 20 20 20 69 66 28 20 70 50  _TEST.    if( pP
9050: 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 3d 3d 30 20  reStmt->zSql==0 
9060: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
9070: 43 6f 70 79 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63  Copy = Tcl_Alloc
9080: 28 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 20  (pPreStmt->nSql 
9090: 2b 20 31 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  + 1);.      memc
90a0: 70 79 28 7a 43 6f 70 79 2c 20 7a 53 71 6c 2c 20  py(zCopy, zSql, 
90b0: 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 29 3b  pPreStmt->nSql);
90c0: 0a 20 20 20 20 20 20 7a 43 6f 70 79 5b 70 50 72  .      zCopy[pPr
90d0: 65 53 74 6d 74 2d 3e 6e 53 71 6c 5d 20 3d 20 27  eStmt->nSql] = '
90e0: 5c 30 27 3b 0a 20 20 20 20 20 20 70 50 72 65 53  \0';.      pPreS
90f0: 74 6d 74 2d 3e 7a 53 71 6c 20 3d 20 7a 43 6f 70  tmt->zSql = zCop
9100: 79 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  y;.    }.#endif.
9110: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
9120: 72 65 53 74 6d 74 20 29 3b 0a 20 20 61 73 73 65  reStmt );.  asse
9130: 72 74 28 20 73 74 72 6c 65 6e 33 30 28 70 50 72  rt( strlen30(pPr
9140: 65 53 74 6d 74 2d 3e 7a 53 71 6c 29 3d 3d 70 50  eStmt->zSql)==pP
9150: 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 20 29 3b 0a  reStmt->nSql );.
9160: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 6d 65 6d    assert( 0==mem
9170: 63 6d 70 28 70 50 72 65 53 74 6d 74 2d 3e 7a 53  cmp(pPreStmt->zS
9180: 71 6c 2c 20 7a 53 71 6c 2c 20 70 50 72 65 53 74  ql, zSql, pPreSt
9190: 6d 74 2d 3e 6e 53 71 6c 29 20 29 3b 0a 0a 20 20  mt->nSql) );..  
91a0: 2f 2a 20 42 69 6e 64 20 76 61 6c 75 65 73 20 74  /* Bind values t
91b0: 6f 20 70 61 72 61 6d 65 74 65 72 73 20 74 68 61  o parameters tha
91c0: 74 20 62 65 67 69 6e 20 77 69 74 68 20 24 20 6f  t begin with $ o
91d0: 72 20 3a 20 2a 2f 20 20 0a 20 20 66 6f 72 28 69  r : */  .  for(i
91e0: 3d 31 3b 20 69 3c 3d 6e 56 61 72 3b 20 69 2b 2b  =1; i<=nVar; i++
91f0: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
9200: 72 20 2a 7a 56 61 72 20 3d 20 73 71 6c 69 74 65  r *zVar = sqlite
9210: 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
9220: 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20 69 29 3b  _name(pStmt, i);
9230: 0a 20 20 20 20 69 66 28 20 7a 56 61 72 21 3d 30  .    if( zVar!=0
9240: 20 26 26 20 28 7a 56 61 72 5b 30 5d 3d 3d 27 24   && (zVar[0]=='$
9250: 27 20 7c 7c 20 7a 56 61 72 5b 30 5d 3d 3d 27 3a  ' || zVar[0]==':
9260: 27 20 7c 7c 20 7a 56 61 72 5b 30 5d 3d 3d 27 40  ' || zVar[0]=='@
9270: 27 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  ') ){.      Tcl_
9280: 4f 62 6a 20 2a 70 56 61 72 20 3d 20 54 63 6c 5f  Obj *pVar = Tcl_
9290: 47 65 74 56 61 72 32 45 78 28 69 6e 74 65 72 70  GetVar2Ex(interp
92a0: 2c 20 26 7a 56 61 72 5b 31 5d 2c 20 30 2c 20 30  , &zVar[1], 0, 0
92b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 56 61  );.      if( pVa
92c0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  r ){.        int
92d0: 20 6e 3b 0a 20 20 20 20 20 20 20 20 75 38 20 2a   n;.        u8 *
92e0: 64 61 74 61 3b 0a 20 20 20 20 20 20 20 20 63 6f  data;.        co
92f0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20  nst char *zType 
9300: 3d 20 28 70 56 61 72 2d 3e 74 79 70 65 50 74 72  = (pVar->typePtr
9310: 20 3f 20 70 56 61 72 2d 3e 74 79 70 65 50 74 72   ? pVar->typePtr
9320: 2d 3e 6e 61 6d 65 20 3a 20 22 22 29 3b 0a 20 20  ->name : "");.  
9330: 20 20 20 20 20 20 63 68 61 72 20 63 20 3d 20 7a        char c = z
9340: 54 79 70 65 5b 30 5d 3b 0a 20 20 20 20 20 20 20  Type[0];.       
9350: 20 69 66 28 20 7a 56 61 72 5b 30 5d 3d 3d 27 40   if( zVar[0]=='@
9360: 27 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  ' ||.           
9370: 28 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d  (c=='b' && strcm
9380: 70 28 7a 54 79 70 65 2c 22 62 79 74 65 61 72 72  p(zType,"bytearr
9390: 61 79 22 29 3d 3d 30 20 26 26 20 70 56 61 72 2d  ay")==0 && pVar-
93a0: 3e 62 79 74 65 73 3d 3d 30 29 20 29 7b 0a 20 20  >bytes==0) ){.  
93b0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 61 64 20          /* Load 
93c0: 61 20 42 4c 4f 42 20 74 79 70 65 20 69 66 20 74  a BLOB type if t
93d0: 68 65 20 54 63 6c 20 76 61 72 69 61 62 6c 65 20  he Tcl variable 
93e0: 69 73 20 61 20 62 79 74 65 61 72 72 61 79 20 61  is a bytearray a
93f0: 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nd.          ** 
9400: 69 74 20 68 61 73 20 6e 6f 20 73 74 72 69 6e 67  it has no string
9410: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
9420: 6f 72 20 74 68 65 20 68 6f 73 74 0a 20 20 20 20  or the host.    
9430: 20 20 20 20 20 20 2a 2a 20 70 61 72 61 6d 65 74        ** paramet
9440: 65 72 20 6e 61 6d 65 20 62 65 67 69 6e 73 20 77  er name begins w
9450: 69 74 68 20 22 40 22 2e 20 2a 2f 0a 20 20 20 20  ith "@". */.    
9460: 20 20 20 20 20 20 64 61 74 61 20 3d 20 54 63 6c        data = Tcl
9470: 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f  _GetByteArrayFro
9480: 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a  mObj(pVar, &n);.
9490: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
94a0: 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d  3_bind_blob(pStm
94b0: 74 2c 20 69 2c 20 64 61 74 61 2c 20 6e 2c 20 53  t, i, data, n, S
94c0: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
94d0: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63           Tcl_Inc
94e0: 72 52 65 66 43 6f 75 6e 74 28 70 56 61 72 29 3b  rRefCount(pVar);
94f0: 0a 20 20 20 20 20 20 20 20 20 20 70 50 72 65 53  .          pPreS
9500: 74 6d 74 2d 3e 61 70 50 61 72 6d 5b 69 50 61 72  tmt->apParm[iPar
9510: 6d 2b 2b 5d 20 3d 20 70 56 61 72 3b 0a 20 20 20  m++] = pVar;.   
9520: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
9530: 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d 70 28  =='b' && strcmp(
9540: 7a 54 79 70 65 2c 22 62 6f 6f 6c 65 61 6e 22 29  zType,"boolean")
9550: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
9560: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
9570: 62 6a 28 69 6e 74 65 72 70 2c 20 70 56 61 72 2c  bj(interp, pVar,
9580: 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20   &n);.          
9590: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
95a0: 28 70 53 74 6d 74 2c 20 69 2c 20 6e 29 3b 0a 20  (pStmt, i, n);. 
95b0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
95c0: 20 63 3d 3d 27 64 27 20 26 26 20 73 74 72 63 6d   c=='d' && strcm
95d0: 70 28 7a 54 79 70 65 2c 22 64 6f 75 62 6c 65 22  p(zType,"double"
95e0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
95f0: 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20    double r;.    
9600: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 44 6f 75        Tcl_GetDou
9610: 62 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  bleFromObj(inter
9620: 70 2c 20 70 56 61 72 2c 20 26 72 29 3b 0a 20 20  p, pVar, &r);.  
9630: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
9640: 62 69 6e 64 5f 64 6f 75 62 6c 65 28 70 53 74 6d  bind_double(pStm
9650: 74 2c 20 69 2c 20 72 29 3b 0a 20 20 20 20 20 20  t, i, r);.      
9660: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63 3d 3d    }else if( (c==
9670: 27 77 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54  'w' && strcmp(zT
9680: 79 70 65 2c 22 77 69 64 65 49 6e 74 22 29 3d 3d  ype,"wideInt")==
9690: 30 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  0) ||.          
96a0: 20 20 20 20 28 63 3d 3d 27 69 27 20 26 26 20 73      (c=='i' && s
96b0: 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 69 6e 74  trcmp(zType,"int
96c0: 22 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  ")==0) ){.      
96d0: 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20      Tcl_WideInt 
96e0: 76 3b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  v;.          Tcl
96f0: 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f  _GetWideIntFromO
9700: 62 6a 28 69 6e 74 65 72 70 2c 20 70 56 61 72 2c  bj(interp, pVar,
9710: 20 26 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20   &v);.          
9720: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
9730: 36 34 28 70 53 74 6d 74 2c 20 69 2c 20 76 29 3b  64(pStmt, i, v);
9740: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
9750: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 20 3d            data =
9760: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
9770: 2a 29 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  *)Tcl_GetStringF
9780: 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29  romObj(pVar, &n)
9790: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
97a0: 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53  te3_bind_text(pS
97b0: 74 6d 74 2c 20 69 2c 20 28 63 68 61 72 20 2a 29  tmt, i, (char *)
97c0: 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f  data, n, SQLITE_
97d0: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20  STATIC);.       
97e0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
97f0: 75 6e 74 28 70 56 61 72 29 3b 0a 20 20 20 20 20  unt(pVar);.     
9800: 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 61       pPreStmt->a
9810: 70 50 61 72 6d 5b 69 50 61 72 6d 2b 2b 5d 20 3d  pParm[iParm++] =
9820: 20 70 56 61 72 3b 0a 20 20 20 20 20 20 20 20 7d   pVar;.        }
9830: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
9840: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
9850: 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69  nd_null(pStmt, i
9860: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
9870: 0a 20 20 7d 0a 20 20 70 50 72 65 53 74 6d 74 2d  .  }.  pPreStmt-
9880: 3e 6e 50 61 72 6d 20 3d 20 69 50 61 72 6d 3b 0a  >nParm = iParm;.
9890: 20 20 2a 70 70 50 72 65 53 74 6d 74 20 3d 20 70    *ppPreStmt = p
98a0: 50 72 65 53 74 6d 74 3b 0a 0a 20 20 72 65 74 75  PreStmt;..  retu
98b0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
98c0: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 73 74  .** Release a st
98d0: 61 74 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63  atement referenc
98e0: 65 20 6f 62 74 61 69 6e 65 64 20 62 79 20 63 61  e obtained by ca
98f0: 6c 6c 69 6e 67 20 64 62 50 72 65 70 61 72 65 41  lling dbPrepareA
9900: 6e 64 42 69 6e 64 28 29 2e 0a 2a 2a 20 54 68 65  ndBind()..** The
9910: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 65 78 61  re should be exa
9920: 63 74 6c 79 20 6f 6e 65 20 63 61 6c 6c 20 74 6f  ctly one call to
9930: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66   this function f
9940: 6f 72 20 65 61 63 68 20 63 61 6c 6c 20 74 6f 0a  or each call to.
9950: 2a 2a 20 64 62 50 72 65 70 61 72 65 41 6e 64 42  ** dbPrepareAndB
9960: 69 6e 64 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ind()..**.** If 
9970: 74 68 65 20 64 69 73 63 61 72 64 20 70 61 72 61  the discard para
9980: 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72  meter is non-zer
9990: 6f 2c 20 74 68 65 6e 20 74 68 65 20 73 74 61 74  o, then the stat
99a0: 65 6d 65 6e 74 20 69 73 20 64 65 6c 65 74 65 64  ement is deleted
99b0: 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  .** immediately.
99c0: 20 4f 74 68 65 72 77 69 73 65 20 69 74 20 69 73   Otherwise it is
99d0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52   added to the LR
99e0: 55 20 6c 69 73 74 20 61 6e 64 20 6d 61 79 20 62  U list and may b
99f0: 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 62 79  e returned.** by
9a00: 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 63 61   a subsequent ca
9a10: 6c 6c 20 74 6f 20 64 62 50 72 65 70 61 72 65 41  ll to dbPrepareA
9a20: 6e 64 42 69 6e 64 28 29 2e 0a 2a 2f 0a 73 74 61  ndBind()..*/.sta
9a30: 74 69 63 20 76 6f 69 64 20 64 62 52 65 6c 65 61  tic void dbRelea
9a40: 73 65 53 74 6d 74 28 0a 20 20 53 71 6c 69 74 65  seStmt(.  Sqlite
9a50: 44 62 20 2a 70 44 62 2c 20 20 20 20 20 20 20 20  Db *pDb,        
9a60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
9a70: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
9a80: 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d    SqlPreparedStm
9a90: 74 20 2a 70 50 72 65 53 74 6d 74 2c 20 20 20 20  t *pPreStmt,    
9aa0: 20 20 2f 2a 20 50 72 65 70 61 72 65 64 20 73 74    /* Prepared st
9ab0: 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20 74  atement handle t
9ac0: 6f 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69  o release */.  i
9ad0: 6e 74 20 64 69 73 63 61 72 64 20 20 20 20 20 20  nt discard      
9ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9af0: 2a 20 54 72 75 65 20 74 6f 20 64 65 6c 65 74 65  * True to delete
9b00: 20 28 6e 6f 74 20 63 61 63 68 65 29 20 74 68 65   (not cache) the
9b10: 20 70 50 72 65 53 74 6d 74 20 2a 2f 0a 29 7b 0a   pPreStmt */.){.
9b20: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 46    int i;..  /* F
9b30: 72 65 65 20 74 68 65 20 62 6f 75 6e 64 20 73 74  ree the bound st
9b40: 72 69 6e 67 20 61 6e 64 20 62 6c 6f 62 20 70 61  ring and blob pa
9b50: 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 66 6f  rameters */.  fo
9b60: 72 28 69 3d 30 3b 20 69 3c 70 50 72 65 53 74 6d  r(i=0; i<pPreStm
9b70: 74 2d 3e 6e 50 61 72 6d 3b 20 69 2b 2b 29 7b 0a  t->nParm; i++){.
9b80: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
9b90: 6f 75 6e 74 28 70 50 72 65 53 74 6d 74 2d 3e 61  ount(pPreStmt->a
9ba0: 70 50 61 72 6d 5b 69 5d 29 3b 0a 20 20 7d 0a 20  pParm[i]);.  }. 
9bb0: 20 70 50 72 65 53 74 6d 74 2d 3e 6e 50 61 72 6d   pPreStmt->nParm
9bc0: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 44 62   = 0;..  if( pDb
9bd0: 2d 3e 6d 61 78 53 74 6d 74 3c 3d 30 20 7c 7c 20  ->maxStmt<=0 || 
9be0: 64 69 73 63 61 72 64 20 29 7b 0a 20 20 20 20 2f  discard ){.    /
9bf0: 2a 20 49 66 20 74 68 65 20 63 61 63 68 65 20 69  * If the cache i
9c00: 73 20 74 75 72 6e 65 64 20 6f 66 66 2c 20 64 65  s turned off, de
9c10: 61 6c 6c 6f 63 61 74 65 64 20 74 68 65 20 73 74  allocated the st
9c20: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 64  atement */.    d
9c30: 62 46 72 65 65 53 74 6d 74 28 70 50 72 65 53 74  bFreeStmt(pPreSt
9c40: 6d 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  mt);.  }else{.  
9c50: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 70 72 65    /* Add the pre
9c60: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
9c70: 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
9c80: 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 6c 69   of the cache li
9c90: 73 74 2e 20 2a 2f 0a 20 20 20 20 70 50 72 65 53  st. */.    pPreS
9ca0: 74 6d 74 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62  tmt->pNext = pDb
9cb0: 2d 3e 73 74 6d 74 4c 69 73 74 3b 0a 20 20 20 20  ->stmtList;.    
9cc0: 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 20  pPreStmt->pPrev 
9cd0: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 44 62  = 0;.    if( pDb
9ce0: 2d 3e 73 74 6d 74 4c 69 73 74 20 29 7b 0a 20 20  ->stmtList ){.  
9cf0: 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74     pDb->stmtList
9d00: 2d 3e 70 50 72 65 76 20 3d 20 70 50 72 65 53 74  ->pPrev = pPreSt
9d10: 6d 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44  mt;.    }.    pD
9d20: 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20 70 50  b->stmtList = pP
9d30: 72 65 53 74 6d 74 3b 0a 20 20 20 20 69 66 28 20  reStmt;.    if( 
9d40: 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 3d 3d 30  pDb->stmtLast==0
9d50: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
9d60: 28 20 70 44 62 2d 3e 6e 53 74 6d 74 3d 3d 30 20  ( pDb->nStmt==0 
9d70: 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 73 74  );.      pDb->st
9d80: 6d 74 4c 61 73 74 20 3d 20 70 50 72 65 53 74 6d  mtLast = pPreStm
9d90: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
9da0: 20 20 20 20 61 73 73 65 72 74 28 20 70 44 62 2d      assert( pDb-
9db0: 3e 6e 53 74 6d 74 3e 30 20 29 3b 0a 20 20 20 20  >nStmt>0 );.    
9dc0: 7d 0a 20 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74  }.    pDb->nStmt
9dd0: 2b 2b 3b 0a 20 20 20 0a 20 20 20 20 2f 2a 20 49  ++;.   .    /* I
9de0: 66 20 77 65 20 68 61 76 65 20 74 6f 6f 20 6d 61  f we have too ma
9df0: 6e 79 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  ny statement in 
9e00: 63 61 63 68 65 2c 20 72 65 6d 6f 76 65 20 74 68  cache, remove th
9e10: 65 20 73 75 72 70 6c 75 73 20 66 72 6f 6d 20 0a  e surplus from .
9e20: 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 64 20 6f      ** the end o
9e30: 66 20 74 68 65 20 63 61 63 68 65 20 6c 69 73 74  f the cache list
9e40: 2e 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28  .  */.    while(
9e50: 20 70 44 62 2d 3e 6e 53 74 6d 74 3e 70 44 62 2d   pDb->nStmt>pDb-
9e60: 3e 6d 61 78 53 74 6d 74 20 29 7b 0a 20 20 20 20  >maxStmt ){.    
9e70: 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d    SqlPreparedStm
9e80: 74 20 2a 70 4c 61 73 74 20 3d 20 70 44 62 2d 3e  t *pLast = pDb->
9e90: 73 74 6d 74 4c 61 73 74 3b 0a 20 20 20 20 20 20  stmtLast;.      
9ea0: 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20  pDb->stmtLast = 
9eb0: 70 4c 61 73 74 2d 3e 70 50 72 65 76 3b 0a 20 20  pLast->pPrev;.  
9ec0: 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73      pDb->stmtLas
9ed0: 74 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  t->pNext = 0;.  
9ee0: 20 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74 2d 2d      pDb->nStmt--
9ef0: 3b 0a 20 20 20 20 20 20 64 62 46 72 65 65 53 74  ;.      dbFreeSt
9f00: 6d 74 28 70 4c 61 73 74 29 3b 0a 20 20 20 20 7d  mt(pLast);.    }
9f10: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74  .  }.}../*.** St
9f20: 72 75 63 74 75 72 65 20 75 73 65 64 20 77 69 74  ructure used wit
9f30: 68 20 64 62 45 76 61 6c 58 58 58 28 29 20 66 75  h dbEvalXXX() fu
9f40: 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20  nctions:.**.**  
9f50: 20 64 62 45 76 61 6c 49 6e 69 74 28 29 0a 2a 2a   dbEvalInit().**
9f60: 20 20 20 64 62 45 76 61 6c 53 74 65 70 28 29 0a     dbEvalStep().
9f70: 2a 2a 20 20 20 64 62 45 76 61 6c 46 69 6e 61 6c  **   dbEvalFinal
9f80: 69 7a 65 28 29 0a 2a 2a 20 20 20 64 62 45 76 61  ize().**   dbEva
9f90: 6c 52 6f 77 49 6e 66 6f 28 29 0a 2a 2a 20 20 20  lRowInfo().**   
9fa0: 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75  dbEvalColumnValu
9fb0: 65 28 29 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  e().*/.typedef s
9fc0: 74 72 75 63 74 20 44 62 45 76 61 6c 43 6f 6e 74  truct DbEvalCont
9fd0: 65 78 74 20 44 62 45 76 61 6c 43 6f 6e 74 65 78  ext DbEvalContex
9fe0: 74 3b 0a 73 74 72 75 63 74 20 44 62 45 76 61 6c  t;.struct DbEval
9ff0: 43 6f 6e 74 65 78 74 20 7b 0a 20 20 53 71 6c 69  Context {.  Sqli
a000: 74 65 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20  teDb *pDb;      
a010: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
a020: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
a030: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 71  /.  Tcl_Obj *pSq
a040: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
a050: 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 68 6f      /* Object ho
a060: 6c 64 69 6e 67 20 73 74 72 69 6e 67 20 7a 53 71  lding string zSq
a070: 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  l */.  const cha
a080: 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20 20  r *zSql;        
a090: 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 61 69 6e         /* Remain
a0a0: 69 6e 67 20 53 51 4c 20 74 6f 20 65 78 65 63 75  ing SQL to execu
a0b0: 74 65 20 2a 2f 0a 20 20 53 71 6c 50 72 65 70 61  te */.  SqlPrepa
a0c0: 72 65 64 53 74 6d 74 20 2a 70 50 72 65 53 74 6d  redStmt *pPreStm
a0d0: 74 3b 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65  t;      /* Curre
a0e0: 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  nt statement */.
a0f0: 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
a100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a110: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
a120: 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20  olumns returned 
a130: 62 79 20 70 53 74 6d 74 20 2a 2f 0a 20 20 54 63  by pStmt */.  Tc
a140: 6c 5f 4f 62 6a 20 2a 70 41 72 72 61 79 3b 20 20  l_Obj *pArray;  
a150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a160: 20 4e 61 6d 65 20 6f 66 20 61 72 72 61 79 20 76   Name of array v
a170: 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 54 63 6c  ariable */.  Tcl
a180: 5f 4f 62 6a 20 2a 2a 61 70 43 6f 6c 4e 61 6d 65  _Obj **apColName
a190: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
a1a0: 41 72 72 61 79 20 6f 66 20 63 6f 6c 75 6d 6e 20  Array of column 
a1b0: 6e 61 6d 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  names */.};../*.
a1c0: 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e 79 20 63  ** Release any c
a1d0: 61 63 68 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e  ache of column n
a1e0: 61 6d 65 73 20 63 75 72 72 65 6e 74 6c 79 20 68  ames currently h
a1f0: 65 6c 64 20 61 73 20 70 61 72 74 20 6f 66 0a 2a  eld as part of.*
a200: 2a 20 74 68 65 20 44 62 45 76 61 6c 43 6f 6e 74  * the DbEvalCont
a210: 65 78 74 20 73 74 72 75 63 74 75 72 65 20 70 61  ext structure pa
a220: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
a230: 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  t argument..*/.s
a240: 74 61 74 69 63 20 76 6f 69 64 20 64 62 52 65 6c  tatic void dbRel
a250: 65 61 73 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  easeColumnNames(
a260: 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70  DbEvalContext *p
a270: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 6f  ){.  if( p->apCo
a280: 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 69 6e 74  lName ){.    int
a290: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
a2a0: 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29   i<p->nCol; i++)
a2b0: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72  {.      Tcl_Decr
a2c0: 52 65 66 43 6f 75 6e 74 28 70 2d 3e 61 70 43 6f  RefCount(p->apCo
a2d0: 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 7d  lName[i]);.    }
a2e0: 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63  .    Tcl_Free((c
a2f0: 68 61 72 20 2a 29 70 2d 3e 61 70 43 6f 6c 4e 61  har *)p->apColNa
a300: 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 61 70 43 6f  me);.    p->apCo
a310: 6c 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  lName = 0;.  }. 
a320: 20 70 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 7d 0a   p->nCol = 0;.}.
a330: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
a340: 65 20 61 20 44 62 45 76 61 6c 43 6f 6e 74 65 78  e a DbEvalContex
a350: 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  t structure..**.
a360: 2a 2a 20 49 66 20 70 41 72 72 61 79 20 69 73 20  ** If pArray is 
a370: 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69  not NULL, then i
a380: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e  t contains the n
a390: 61 6d 65 20 6f 66 20 61 20 54 63 6c 20 61 72 72  ame of a Tcl arr
a3a0: 61 79 0a 2a 2a 20 76 61 72 69 61 62 6c 65 2e 20  ay.** variable. 
a3b0: 54 68 65 20 22 2a 22 20 6d 65 6d 62 65 72 20 6f  The "*" member o
a3c0: 66 20 74 68 69 73 20 61 72 72 61 79 20 69 73 20  f this array is 
a3d0: 73 65 74 20 74 6f 20 61 20 6c 69 73 74 20 63 6f  set to a list co
a3e0: 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 74 68 65 20  ntaining.** the 
a3f0: 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c  names of the col
a400: 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79  umns returned by
a410: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 61   the statement a
a420: 73 20 70 61 72 74 20 6f 66 20 65 61 63 68 0a 2a  s part of each.*
a430: 2a 20 63 61 6c 6c 20 74 6f 20 64 62 45 76 61 6c  * call to dbEval
a440: 53 74 65 70 28 29 2c 20 69 6e 20 6f 72 64 65 72  Step(), in order
a450: 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69   from left to ri
a460: 67 68 74 2e 20 65 2e 67 2e 20 69 66 20 74 68 65  ght. e.g. if the
a470: 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 74 68   names .** of th
a480: 65 20 72 65 74 75 72 6e 65 64 20 63 6f 6c 75 6d  e returned colum
a490: 6e 73 20 61 72 65 20 61 2c 20 62 20 61 6e 64 20  ns are a, b and 
a4a0: 63 2c 20 69 74 20 64 6f 65 73 20 74 68 65 20 65  c, it does the e
a4b0: 71 75 69 76 61 6c 65 6e 74 20 6f 66 20 74 68 65  quivalent of the
a4c0: 20 0a 2a 2a 20 74 63 6c 20 63 6f 6d 6d 61 6e 64   .** tcl command
a4d0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 65 74 20  :.**.**     set 
a4e0: 24 7b 70 41 72 72 61 79 7d 28 2a 29 20 7b 61 20  ${pArray}(*) {a 
a4f0: 62 20 63 7d 0a 2a 2f 0a 73 74 61 74 69 63 20 76  b c}.*/.static v
a500: 6f 69 64 20 64 62 45 76 61 6c 49 6e 69 74 28 0a  oid dbEvalInit(.
a510: 20 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20    DbEvalContext 
a520: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
a530: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
a540: 73 74 72 75 63 74 75 72 65 20 74 6f 20 69 6e 69  structure to ini
a550: 74 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 53 71 6c  tialize */.  Sql
a560: 69 74 65 44 62 20 2a 70 44 62 2c 20 20 20 20 20  iteDb *pDb,     
a570: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a580: 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  Database handle 
a590: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53  */.  Tcl_Obj *pS
a5a0: 71 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ql,             
a5b0: 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 63       /* Object c
a5c0: 6f 6e 74 61 69 6e 69 6e 67 20 53 51 4c 20 73 63  ontaining SQL sc
a5d0: 72 69 70 74 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ript */.  Tcl_Ob
a5e0: 6a 20 2a 70 41 72 72 61 79 20 20 20 20 20 20 20  j *pArray       
a5f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
a600: 65 20 6f 66 20 54 63 6c 20 61 72 72 61 79 20 74  e of Tcl array t
a610: 6f 20 73 65 74 20 28 2a 29 20 65 6c 65 6d 65 6e  o set (*) elemen
a620: 74 20 6f 66 20 2a 2f 0a 29 7b 0a 20 20 6d 65 6d  t of */.){.  mem
a630: 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66  set(p, 0, sizeof
a640: 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 29 29  (DbEvalContext))
a650: 3b 0a 20 20 70 2d 3e 70 44 62 20 3d 20 70 44 62  ;.  p->pDb = pDb
a660: 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20 3d 20 54 63  ;.  p->zSql = Tc
a670: 6c 5f 47 65 74 53 74 72 69 6e 67 28 70 53 71 6c  l_GetString(pSql
a680: 29 3b 0a 20 20 70 2d 3e 70 53 71 6c 20 3d 20 70  );.  p->pSql = p
a690: 53 71 6c 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52  Sql;.  Tcl_IncrR
a6a0: 65 66 43 6f 75 6e 74 28 70 53 71 6c 29 3b 0a 20  efCount(pSql);. 
a6b0: 20 69 66 28 20 70 41 72 72 61 79 20 29 7b 0a 20   if( pArray ){. 
a6c0: 20 20 20 70 2d 3e 70 41 72 72 61 79 20 3d 20 70     p->pArray = p
a6d0: 41 72 72 61 79 3b 0a 20 20 20 20 54 63 6c 5f 49  Array;.    Tcl_I
a6e0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 41 72 72  ncrRefCount(pArr
a6f0: 61 79 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ay);.  }.}../*.*
a700: 2a 20 4f 62 74 61 69 6e 20 69 6e 66 6f 72 6d 61  * Obtain informa
a710: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 72  tion about the r
a720: 6f 77 20 74 68 61 74 20 74 68 65 20 44 62 45 76  ow that the DbEv
a730: 61 6c 43 6f 6e 74 65 78 74 20 70 61 73 73 65 64  alContext passed
a740: 20 61 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74   as the.** first
a750: 20 61 72 67 75 6d 65 6e 74 20 63 75 72 72 65 6e   argument curren
a760: 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a  tly points to..*
a770: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 62  /.static void db
a780: 45 76 61 6c 52 6f 77 49 6e 66 6f 28 0a 20 20 44  EvalRowInfo(.  D
a790: 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70 2c  bEvalContext *p,
a7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a7b0: 2a 20 45 76 61 6c 75 61 74 69 6f 6e 20 63 6f 6e  * Evaluation con
a7c0: 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  text */.  int *p
a7d0: 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  nCol,           
a7e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
a7f0: 3a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  : Number of colu
a800: 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 54 63  mn names */.  Tc
a810: 6c 5f 4f 62 6a 20 2a 2a 2a 70 61 70 43 6f 6c 4e  l_Obj ***papColN
a820: 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ame           /*
a830: 20 4f 55 54 3a 20 41 72 72 61 79 20 6f 66 20 63   OUT: Array of c
a840: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 29  olumn names */.)
a850: 7b 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63  {.  /* Compute c
a860: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20  olumn names */. 
a870: 20 69 66 28 20 30 3d 3d 70 2d 3e 61 70 43 6f 6c   if( 0==p->apCol
a880: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Name ){.    sqli
a890: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
a8a0: 3d 20 70 2d 3e 70 50 72 65 53 74 6d 74 2d 3e 70  = p->pPreStmt->p
a8b0: 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b  Stmt;.    int i;
a8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8d0: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
a8e0: 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  tor variable */.
a8f0: 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20      int nCol;   
a900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a910: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
a920: 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20  olumns returned 
a930: 62 79 20 70 53 74 6d 74 20 2a 2f 0a 20 20 20 20  by pStmt */.    
a940: 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 43 6f 6c 4e  Tcl_Obj **apColN
a950: 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  ame = 0;      /*
a960: 20 41 72 72 61 79 20 6f 66 20 63 6f 6c 75 6d 6e   Array of column
a970: 20 6e 61 6d 65 73 20 2a 2f 0a 0a 20 20 20 20 70   names */..    p
a980: 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 20 3d 20  ->nCol = nCol = 
a990: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
a9a0: 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20  ount(pStmt);.   
a9b0: 20 69 66 28 20 6e 43 6f 6c 3e 30 20 26 26 20 28   if( nCol>0 && (
a9c0: 70 61 70 43 6f 6c 4e 61 6d 65 20 7c 7c 20 70 2d  papColName || p-
a9d0: 3e 70 41 72 72 61 79 29 20 29 7b 0a 20 20 20 20  >pArray) ){.    
a9e0: 20 20 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 54    apColName = (T
a9f0: 63 6c 5f 4f 62 6a 2a 2a 29 54 63 6c 5f 41 6c 6c  cl_Obj**)Tcl_All
aa00: 6f 63 28 20 73 69 7a 65 6f 66 28 54 63 6c 5f 4f  oc( sizeof(Tcl_O
aa10: 62 6a 2a 29 2a 6e 43 6f 6c 20 29 3b 0a 20 20 20  bj*)*nCol );.   
aa20: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
aa30: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
aa40: 20 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 20 3d    apColName[i] =
aa50: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
aa60: 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  j(sqlite3_column
aa70: 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29 2c 20  _name(pStmt,i), 
aa80: 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c  -1);.        Tcl
aa90: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 61 70  _IncrRefCount(ap
aaa0: 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20  ColName[i]);.   
aab0: 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 61 70     }.      p->ap
aac0: 43 6f 6c 4e 61 6d 65 20 3d 20 61 70 43 6f 6c 4e  ColName = apColN
aad0: 61 6d 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ame;.    }..    
aae0: 2f 2a 20 49 66 20 72 65 73 75 6c 74 73 20 61 72  /* If results ar
aaf0: 65 20 62 65 69 6e 67 20 73 74 6f 72 65 64 20 69  e being stored i
ab00: 6e 20 61 6e 20 61 72 72 61 79 20 76 61 72 69 61  n an array varia
ab10: 62 6c 65 2c 20 74 68 65 6e 20 63 72 65 61 74 65  ble, then create
ab20: 0a 20 20 20 20 2a 2a 20 74 68 65 20 61 72 72 61  .    ** the arra
ab30: 79 28 2a 29 20 65 6e 74 72 79 20 66 6f 72 20 74  y(*) entry for t
ab40: 68 61 74 20 61 72 72 61 79 0a 20 20 20 20 2a 2f  hat array.    */
ab50: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 41 72 72  .    if( p->pArr
ab60: 61 79 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  ay ){.      Tcl_
ab70: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 20 3d  Interp *interp =
ab80: 20 70 2d 3e 70 44 62 2d 3e 69 6e 74 65 72 70 3b   p->pDb->interp;
ab90: 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  .      Tcl_Obj *
aba0: 70 43 6f 6c 4c 69 73 74 20 3d 20 54 63 6c 5f 4e  pColList = Tcl_N
abb0: 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20 20 20 54  ewObj();.      T
abc0: 63 6c 5f 4f 62 6a 20 2a 70 53 74 61 72 20 3d 20  cl_Obj *pStar = 
abd0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
abe0: 28 22 2a 22 2c 20 2d 31 29 3b 0a 0a 20 20 20 20  ("*", -1);..    
abf0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
ac00: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
ac10: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
ac20: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
ac30: 2c 20 70 43 6f 6c 4c 69 73 74 2c 20 61 70 43 6f  , pColList, apCo
ac40: 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 20  lName[i]);.     
ac50: 20 7d 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63   }.      Tcl_Inc
ac60: 72 52 65 66 43 6f 75 6e 74 28 70 53 74 61 72 29  rRefCount(pStar)
ac70: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53  ;.      Tcl_ObjS
ac80: 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 70  etVar2(interp, p
ac90: 2d 3e 70 41 72 72 61 79 2c 20 70 53 74 61 72 2c  ->pArray, pStar,
aca0: 20 70 43 6f 6c 4c 69 73 74 2c 20 30 29 3b 0a 20   pColList, 0);. 
acb0: 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
acc0: 43 6f 75 6e 74 28 70 53 74 61 72 29 3b 0a 20 20  Count(pStar);.  
acd0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
ace0: 61 70 43 6f 6c 4e 61 6d 65 20 29 7b 0a 20 20 20  apColName ){.   
acf0: 20 2a 70 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 70   *papColName = p
ad00: 2d 3e 61 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 7d  ->apColName;.  }
ad10: 0a 20 20 69 66 28 20 70 6e 43 6f 6c 20 29 7b 0a  .  if( pnCol ){.
ad20: 20 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 70 2d 3e      *pnCol = p->
ad30: 6e 43 6f 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  nCol;.  }.}../*.
ad40: 2a 2a 20 52 65 74 75 72 6e 20 6f 6e 65 20 6f 66  ** Return one of
ad50: 20 54 43 4c 5f 4f 4b 2c 20 54 43 4c 5f 42 52 45   TCL_OK, TCL_BRE
ad60: 41 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 2e  AK or TCL_ERROR.
ad70: 20 49 66 20 54 43 4c 5f 45 52 52 4f 52 20 69 73   If TCL_ERROR is
ad80: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2c 20 74 68  .** returned, th
ad90: 65 6e 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  en an error mess
ada0: 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  age is stored in
adb0: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
adc0: 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72   before.** retur
add0: 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65  ning..**.** A re
ade0: 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 54 43  turn value of TC
adf0: 4c 5f 4f 4b 20 6d 65 61 6e 73 20 74 68 65 72 65  L_OK means there
ae00: 20 69 73 20 61 20 72 6f 77 20 6f 66 20 64 61 74   is a row of dat
ae10: 61 20 61 76 61 69 6c 61 62 6c 65 2e 20 54 68 65  a available. The
ae20: 0a 2a 2a 20 64 61 74 61 20 6d 61 79 20 62 65 20  .** data may be 
ae30: 61 63 63 65 73 73 65 64 20 75 73 69 6e 67 20 64  accessed using d
ae40: 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28 29 20 61  bEvalRowInfo() a
ae50: 6e 64 20 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56  nd dbEvalColumnV
ae60: 61 6c 75 65 28 29 2e 20 54 68 69 73 0a 2a 2a 20  alue(). This.** 
ae70: 69 73 20 61 6e 61 6c 6f 67 6f 75 73 20 74 6f 20  is analogous to 
ae80: 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49  a return of SQLI
ae90: 54 45 5f 52 4f 57 20 66 72 6f 6d 20 73 71 6c 69  TE_ROW from sqli
aea0: 74 65 33 5f 73 74 65 70 28 29 2e 20 49 66 20 54  te3_step(). If T
aeb0: 43 4c 5f 42 52 45 41 4b 0a 2a 2a 20 69 73 20 72  CL_BREAK.** is r
aec0: 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 74 68  eturned, then th
aed0: 65 20 53 51 4c 20 73 63 72 69 70 74 20 68 61 73  e SQL script has
aee0: 20 66 69 6e 69 73 68 65 64 20 65 78 65 63 75 74   finished execut
aef0: 69 6e 67 20 61 6e 64 20 74 68 65 72 65 20 61 72  ing and there ar
af00: 65 0a 2a 2a 20 6e 6f 20 66 75 72 74 68 65 72 20  e.** no further 
af10: 72 6f 77 73 20 61 76 61 69 6c 61 62 6c 65 2e 20  rows available. 
af20: 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20  This is similar 
af30: 74 6f 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a  to SQLITE_DONE..
af40: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 62  */.static int db
af50: 45 76 61 6c 53 74 65 70 28 44 62 45 76 61 6c 43  EvalStep(DbEvalC
af60: 6f 6e 74 65 78 74 20 2a 70 29 7b 0a 20 20 63 6f  ontext *p){.  co
af70: 6e 73 74 20 63 68 61 72 20 2a 7a 50 72 65 76 53  nst char *zPrevS
af80: 71 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ql = 0;       /*
af90: 20 50 72 65 76 69 6f 75 73 20 76 61 6c 75 65 20   Previous value 
afa0: 6f 66 20 70 2d 3e 7a 53 71 6c 20 2a 2f 0a 0a 20  of p->zSql */.. 
afb0: 20 77 68 69 6c 65 28 20 70 2d 3e 7a 53 71 6c 5b   while( p->zSql[
afc0: 30 5d 20 7c 7c 20 70 2d 3e 70 50 72 65 53 74 6d  0] || p->pPreStm
afd0: 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  t ){.    int rc;
afe0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 50 72 65  .    if( p->pPre
aff0: 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Stmt==0 ){.     
b000: 20 7a 50 72 65 76 53 71 6c 20 3d 20 28 70 2d 3e   zPrevSql = (p->
b010: 7a 53 71 6c 3d 3d 7a 50 72 65 76 53 71 6c 20 3f  zSql==zPrevSql ?
b020: 20 30 20 3a 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20   0 : p->zSql);. 
b030: 20 20 20 20 20 72 63 20 3d 20 64 62 50 72 65 70       rc = dbPrep
b040: 61 72 65 41 6e 64 42 69 6e 64 28 70 2d 3e 70 44  areAndBind(p->pD
b050: 62 2c 20 70 2d 3e 7a 53 71 6c 2c 20 26 70 2d 3e  b, p->zSql, &p->
b060: 7a 53 71 6c 2c 20 26 70 2d 3e 70 50 72 65 53 74  zSql, &p->pPreSt
b070: 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  mt);.      if( r
b080: 63 21 3d 54 43 4c 5f 4f 4b 20 29 20 72 65 74 75  c!=TCL_OK ) retu
b090: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 65 6c 73 65  rn rc;.    }else
b0a0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 73 3b  {.      int rcs;
b0b0: 0a 20 20 20 20 20 20 53 71 6c 69 74 65 44 62 20  .      SqliteDb 
b0c0: 2a 70 44 62 20 3d 20 70 2d 3e 70 44 62 3b 0a 20  *pDb = p->pDb;. 
b0d0: 20 20 20 20 20 53 71 6c 50 72 65 70 61 72 65 64       SqlPrepared
b0e0: 53 74 6d 74 20 2a 70 50 72 65 53 74 6d 74 20 3d  Stmt *pPreStmt =
b0f0: 20 70 2d 3e 70 50 72 65 53 74 6d 74 3b 0a 20 20   p->pPreStmt;.  
b100: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
b110: 20 2a 70 53 74 6d 74 20 3d 20 70 50 72 65 53 74   *pStmt = pPreSt
b120: 6d 74 2d 3e 70 53 74 6d 74 3b 0a 0a 20 20 20 20  mt->pStmt;..    
b130: 20 20 72 63 73 20 3d 20 73 71 6c 69 74 65 33 5f    rcs = sqlite3_
b140: 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20  step(pStmt);.   
b150: 20 20 20 69 66 28 20 72 63 73 3d 3d 53 51 4c 49     if( rcs==SQLI
b160: 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20  TE_ROW ){.      
b170: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
b180: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
b190: 66 28 20 70 2d 3e 70 41 72 72 61 79 20 29 7b 0a  f( p->pArray ){.
b1a0: 20 20 20 20 20 20 20 20 64 62 45 76 61 6c 52 6f          dbEvalRo
b1b0: 77 49 6e 66 6f 28 70 2c 20 30 2c 20 30 29 3b 0a  wInfo(p, 0, 0);.
b1c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
b1d0: 73 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  s = sqlite3_rese
b1e0: 74 28 70 53 74 6d 74 29 3b 0a 0a 20 20 20 20 20  t(pStmt);..     
b1f0: 20 70 44 62 2d 3e 6e 53 74 65 70 20 3d 20 73 71   pDb->nStep = sq
b200: 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75  lite3_stmt_statu
b210: 73 28 70 53 74 6d 74 2c 53 51 4c 49 54 45 5f 53  s(pStmt,SQLITE_S
b220: 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43  TMTSTATUS_FULLSC
b230: 41 4e 5f 53 54 45 50 2c 31 29 3b 0a 20 20 20 20  AN_STEP,1);.    
b240: 20 20 70 44 62 2d 3e 6e 53 6f 72 74 20 3d 20 73    pDb->nSort = s
b250: 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74  qlite3_stmt_stat
b260: 75 73 28 70 53 74 6d 74 2c 53 51 4c 49 54 45 5f  us(pStmt,SQLITE_
b270: 53 54 4d 54 53 54 41 54 55 53 5f 53 4f 52 54 2c  STMTSTATUS_SORT,
b280: 31 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 6e  1);.      pDb->n
b290: 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 5f  Index = sqlite3_
b2a0: 73 74 6d 74 5f 73 74 61 74 75 73 28 70 53 74 6d  stmt_status(pStm
b2b0: 74 2c 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  t,SQLITE_STMTSTA
b2c0: 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 2c 31 29  TUS_AUTOINDEX,1)
b2d0: 3b 0a 20 20 20 20 20 20 64 62 52 65 6c 65 61 73  ;.      dbReleas
b2e0: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 29 3b  eColumnNames(p);
b2f0: 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 65 53 74  .      p->pPreSt
b300: 6d 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69  mt = 0;..      i
b310: 66 28 20 72 63 73 21 3d 53 51 4c 49 54 45 5f 4f  f( rcs!=SQLITE_O
b320: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  K ){.        /* 
b330: 49 66 20 61 20 72 75 6e 2d 74 69 6d 65 20 65 72  If a run-time er
b340: 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 70 6f  ror occurs, repo
b350: 72 74 20 74 68 65 20 65 72 72 6f 72 20 61 6e 64  rt the error and
b360: 20 73 74 6f 70 20 72 65 61 64 69 6e 67 0a 20 20   stop reading.  
b370: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c        ** the SQL
b380: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 64 62  .  */.        db
b390: 52 65 6c 65 61 73 65 53 74 6d 74 28 70 44 62 2c  ReleaseStmt(pDb,
b3a0: 20 70 50 72 65 53 74 6d 74 2c 20 31 29 3b 0a 23   pPreStmt, 1);.#
b3b0: 69 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  if SQLITE_TEST. 
b3c0: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 44         if( p->pD
b3d0: 62 2d 3e 62 4c 65 67 61 63 79 50 72 65 70 61 72  b->bLegacyPrepar
b3e0: 65 20 26 26 20 72 63 73 3d 3d 53 51 4c 49 54 45  e && rcs==SQLITE
b3f0: 5f 53 43 48 45 4d 41 20 26 26 20 7a 50 72 65 76  _SCHEMA && zPrev
b400: 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Sql ){.         
b410: 20 2f 2a 20 49 66 20 74 68 65 20 72 75 6e 74 69   /* If the runti
b420: 6d 65 20 65 72 72 6f 72 20 77 61 73 20 61 6e 20  me error was an 
b430: 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 2c 20 61  SQLITE_SCHEMA, a
b440: 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  nd the database.
b450: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61 6e            ** han
b460: 64 6c 65 20 69 73 20 63 6f 6e 66 69 67 75 72 65  dle is configure
b470: 64 20 74 6f 20 75 73 65 20 74 68 65 20 6c 65 67  d to use the leg
b480: 61 63 79 20 73 71 6c 69 74 65 33 5f 70 72 65 70  acy sqlite3_prep
b490: 61 72 65 28 29 20 0a 20 20 20 20 20 20 20 20 20  are() .         
b4a0: 20 2a 2a 20 69 6e 74 65 72 66 61 63 65 2c 20 72   ** interface, r
b4b0: 65 74 72 79 20 70 72 65 70 61 72 65 28 29 2f 73  etry prepare()/s
b4c0: 74 65 70 28 29 20 6f 6e 20 74 68 65 20 73 61 6d  tep() on the sam
b4d0: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  e SQL statement.
b4e0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68  .          ** Th
b4f0: 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20  is only happens 
b500: 6f 6e 63 65 2e 20 49 66 20 74 68 65 72 65 20 69  once. If there i
b510: 73 20 61 20 73 65 63 6f 6e 64 20 53 51 4c 49 54  s a second SQLIT
b520: 45 5f 53 43 48 45 4d 41 0a 20 20 20 20 20 20 20  E_SCHEMA.       
b530: 20 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65     ** error, the
b540: 20 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 72   error will be r
b550: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
b560: 61 6c 6c 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  aller. */.      
b570: 20 20 20 20 70 2d 3e 7a 53 71 6c 20 3d 20 7a 50      p->zSql = zP
b580: 72 65 76 53 71 6c 3b 0a 20 20 20 20 20 20 20 20  revSql;.        
b590: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
b5a0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
b5b0: 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52       Tcl_SetObjR
b5c0: 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72  esult(pDb->inter
b5d0: 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
b5e0: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
b5f0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c  NewStringObj(sql
b600: 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d  ite3_errmsg(pDb-
b610: 3e 64 62 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20  >db), -1));.    
b620: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
b630: 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RROR;.      }els
b640: 65 7b 0a 20 20 20 20 20 20 20 20 64 62 52 65 6c  e{.        dbRel
b650: 65 61 73 65 53 74 6d 74 28 70 44 62 2c 20 70 50  easeStmt(pDb, pP
b660: 72 65 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  reStmt, 0);.    
b670: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
b680: 20 2f 2a 20 46 69 6e 69 73 68 65 64 20 2a 2f 0a   /* Finished */.
b690: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 42 52 45    return TCL_BRE
b6a0: 41 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  AK;.}../*.** Fre
b6b0: 65 20 61 6c 6c 20 72 65 73 6f 75 72 63 65 73 20  e all resources 
b6c0: 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 62  currently held b
b6d0: 79 20 74 68 65 20 44 62 45 76 61 6c 43 6f 6e 74  y the DbEvalCont
b6e0: 65 78 74 20 73 74 72 75 63 74 75 72 65 20 70 61  ext structure pa
b6f0: 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66  ssed.** as the f
b700: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54  irst argument. T
b710: 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 65  here should be e
b720: 78 61 63 74 6c 79 20 6f 6e 65 20 63 61 6c 6c 20  xactly one call 
b730: 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
b740: 0a 2a 2a 20 66 6f 72 20 65 61 63 68 20 63 61 6c  .** for each cal
b750: 6c 20 74 6f 20 64 62 45 76 61 6c 49 6e 69 74 28  l to dbEvalInit(
b760: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
b770: 64 20 64 62 45 76 61 6c 46 69 6e 61 6c 69 7a 65  d dbEvalFinalize
b780: 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a  (DbEvalContext *
b790: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72  p){.  if( p->pPr
b7a0: 65 53 74 6d 74 20 29 7b 0a 20 20 20 20 73 71 6c  eStmt ){.    sql
b7b0: 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 50  ite3_reset(p->pP
b7c0: 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 29 3b 0a  reStmt->pStmt);.
b7d0: 20 20 20 20 64 62 52 65 6c 65 61 73 65 53 74 6d      dbReleaseStm
b7e0: 74 28 70 2d 3e 70 44 62 2c 20 70 2d 3e 70 50 72  t(p->pDb, p->pPr
b7f0: 65 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 70  eStmt, 0);.    p
b800: 2d 3e 70 50 72 65 53 74 6d 74 20 3d 20 30 3b 0a  ->pPreStmt = 0;.
b810: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 41 72    }.  if( p->pAr
b820: 72 61 79 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44  ray ){.    Tcl_D
b830: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70  ecrRefCount(p->p
b840: 41 72 72 61 79 29 3b 0a 20 20 20 20 70 2d 3e 70  Array);.    p->p
b850: 41 72 72 61 79 20 3d 20 30 3b 0a 20 20 7d 0a 20  Array = 0;.  }. 
b860: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
b870: 74 28 70 2d 3e 70 53 71 6c 29 3b 0a 20 20 64 62  t(p->pSql);.  db
b880: 52 65 6c 65 61 73 65 43 6f 6c 75 6d 6e 4e 61 6d  ReleaseColumnNam
b890: 65 73 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  es(p);.}../*.** 
b8a0: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
b8b0: 20 74 6f 20 61 20 54 63 6c 5f 4f 62 6a 20 73 74   to a Tcl_Obj st
b8c0: 72 75 63 74 75 72 65 20 77 69 74 68 20 72 65 66  ructure with ref
b8d0: 2d 63 6f 75 6e 74 20 30 20 74 68 61 74 20 63 6f  -count 0 that co
b8e0: 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 76 61  ntains.** the va
b8f0: 6c 75 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c  lue for the iCol
b900: 27 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  'th column of th
b910: 65 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79 20  e row currently 
b920: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 0a 2a 2a  pointed to by.**
b930: 20 74 68 65 20 44 62 45 76 61 6c 43 6f 6e 74 65   the DbEvalConte
b940: 78 74 20 73 74 72 75 63 74 75 72 65 20 70 61 73  xt structure pas
b950: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
b960: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
b970: 61 74 69 63 20 54 63 6c 5f 4f 62 6a 20 2a 64 62  atic Tcl_Obj *db
b980: 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65 28  EvalColumnValue(
b990: 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70  DbEvalContext *p
b9a0: 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 73  , int iCol){.  s
b9b0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
b9c0: 6d 74 20 3d 20 70 2d 3e 70 50 72 65 53 74 6d 74  mt = p->pPreStmt
b9d0: 2d 3e 70 53 74 6d 74 3b 0a 20 20 73 77 69 74 63  ->pStmt;.  switc
b9e0: 68 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  h( sqlite3_colum
b9f0: 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c 20 69 43  n_type(pStmt, iC
ba00: 6f 6c 29 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ol) ){.    case 
ba10: 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20  SQLITE_BLOB: {. 
ba20: 20 20 20 20 20 69 6e 74 20 62 79 74 65 73 20 3d       int bytes =
ba30: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
ba40: 62 79 74 65 73 28 70 53 74 6d 74 2c 20 69 43 6f  bytes(pStmt, iCo
ba50: 6c 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  l);.      const 
ba60: 63 68 61 72 20 2a 7a 42 6c 6f 62 20 3d 20 73 71  char *zBlob = sq
ba70: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f  lite3_column_blo
ba80: 62 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a  b(pStmt, iCol);.
ba90: 20 20 20 20 20 20 69 66 28 20 21 7a 42 6c 6f 62        if( !zBlob
baa0: 20 29 20 62 79 74 65 73 20 3d 20 30 3b 0a 20 20   ) bytes = 0;.  
bab0: 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e      return Tcl_N
bac0: 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 28  ewByteArrayObj((
bad0: 75 38 2a 29 7a 42 6c 6f 62 2c 20 62 79 74 65 73  u8*)zBlob, bytes
bae0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  );.    }.    cas
baf0: 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  e SQLITE_INTEGER
bb00: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
bb10: 5f 69 6e 74 36 34 20 76 20 3d 20 73 71 6c 69 74  _int64 v = sqlit
bb20: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28  e3_column_int64(
bb30: 70 53 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20 20  pStmt, iCol);.  
bb40: 20 20 20 20 69 66 28 20 76 3e 3d 2d 32 31 34 37      if( v>=-2147
bb50: 34 38 33 36 34 37 20 26 26 20 76 3c 3d 32 31 34  483647 && v<=214
bb60: 37 34 38 33 36 34 37 20 29 7b 0a 20 20 20 20 20  7483647 ){.     
bb70: 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 65     return Tcl_Ne
bb80: 77 49 6e 74 4f 62 6a 28 28 69 6e 74 29 76 29 3b  wIntObj((int)v);
bb90: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
bba0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c        return Tcl
bbb0: 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 76  _NewWideIntObj(v
bbc0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
bbd0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
bbe0: 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20  _FLOAT: {.      
bbf0: 72 65 74 75 72 6e 20 54 63 6c 5f 4e 65 77 44 6f  return Tcl_NewDo
bc00: 75 62 6c 65 4f 62 6a 28 73 71 6c 69 74 65 33 5f  ubleObj(sqlite3_
bc10: 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 53  column_double(pS
bc20: 74 6d 74 2c 20 69 43 6f 6c 29 29 3b 0a 20 20 20  tmt, iCol));.   
bc30: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
bc40: 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  TE_NULL: {.     
bc50: 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 65 77 53   return Tcl_NewS
bc60: 74 72 69 6e 67 4f 62 6a 28 70 2d 3e 70 44 62 2d  tringObj(p->pDb-
bc70: 3e 7a 4e 75 6c 6c 2c 20 2d 31 29 3b 0a 20 20 20  >zNull, -1);.   
bc80: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
bc90: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
bca0: 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  j(sqlite3_column
bcb0: 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 43 6f  _text(pStmt, iCo
bcc0: 6c 29 2c 20 2d 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  l), -1);.}../*.*
bcd0: 2a 20 49 66 20 75 73 69 6e 67 20 54 63 6c 20 76  * If using Tcl v
bce0: 65 72 73 69 6f 6e 20 38 2e 36 20 6f 72 20 67 72  ersion 8.6 or gr
bcf0: 65 61 74 65 72 2c 20 75 73 65 20 74 68 65 20 4e  eater, use the N
bd00: 52 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 61  R functions to a
bd10: 76 6f 69 64 0a 2a 2a 20 72 65 63 75 72 73 69 76  void.** recursiv
bd20: 65 20 65 76 61 6c 75 74 69 6f 6e 20 6f 66 20 73  e evalution of s
bd30: 63 72 69 70 74 73 20 62 79 20 74 68 65 20 5b 64  cripts by the [d
bd40: 62 20 65 76 61 6c 5d 20 61 6e 64 20 5b 64 62 20  b eval] and [db 
bd50: 74 72 61 6e 73 5d 0a 2a 2a 20 63 6f 6d 6d 61 6e  trans].** comman
bd60: 64 73 2e 20 45 76 65 6e 20 69 66 20 74 68 65 20  ds. Even if the 
bd70: 68 65 61 64 65 72 73 20 75 73 65 64 20 77 68 69  headers used whi
bd80: 6c 65 20 63 6f 6d 70 69 6c 69 6e 67 20 74 68 65  le compiling the
bd90: 20 65 78 74 65 6e 73 69 6f 6e 0a 2a 2a 20 61 72   extension.** ar
bda0: 65 20 38 2e 36 20 6f 72 20 6e 65 77 65 72 2c 20  e 8.6 or newer, 
bdb0: 74 68 65 20 63 6f 64 65 20 73 74 69 6c 6c 20 74  the code still t
bdc0: 65 73 74 73 20 74 68 65 20 54 63 6c 20 76 65 72  ests the Tcl ver
bdd0: 73 69 6f 6e 20 61 74 20 72 75 6e 74 69 6d 65 2e  sion at runtime.
bde0: 0a 2a 2a 20 54 68 69 73 20 61 6c 6c 6f 77 73 20  .** This allows 
bdf0: 73 74 75 62 73 2d 65 6e 61 62 6c 65 64 20 62 75  stubs-enabled bu
be00: 69 6c 64 73 20 74 6f 20 62 65 20 75 73 65 64 20  ilds to be used 
be10: 77 69 74 68 20 6f 6c 64 65 72 20 54 63 6c 20 6c  with older Tcl l
be20: 69 62 72 61 72 69 65 73 2e 0a 2a 2f 0a 23 69 66  ibraries..*/.#if
be30: 20 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49   TCL_MAJOR_VERSI
be40: 4f 4e 3e 38 20 7c 7c 20 28 54 43 4c 5f 4d 41 4a  ON>8 || (TCL_MAJ
be50: 4f 52 5f 56 45 52 53 49 4f 4e 3d 3d 38 20 26 26  OR_VERSION==8 &&
be60: 20 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49   TCL_MINOR_VERSI
be70: 4f 4e 3e 3d 36 29 0a 23 20 64 65 66 69 6e 65 20  ON>=6).# define 
be80: 53 51 4c 49 54 45 5f 54 43 4c 5f 4e 52 45 20 31  SQLITE_TCL_NRE 1
be90: 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 55 73  .static int DbUs
bea0: 65 4e 72 65 28 76 6f 69 64 29 7b 0a 20 20 69 6e  eNre(void){.  in
beb0: 74 20 6d 61 6a 6f 72 2c 20 6d 69 6e 6f 72 3b 0a  t major, minor;.
bec0: 20 20 54 63 6c 5f 47 65 74 56 65 72 73 69 6f 6e    Tcl_GetVersion
bed0: 28 26 6d 61 6a 6f 72 2c 20 26 6d 69 6e 6f 72 2c  (&major, &minor,
bee0: 20 30 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e   0, 0);.  return
bef0: 28 20 28 6d 61 6a 6f 72 3d 3d 38 20 26 26 20 6d  ( (major==8 && m
bf00: 69 6e 6f 72 3e 3d 36 29 20 7c 7c 20 6d 61 6a 6f  inor>=6) || majo
bf10: 72 3e 38 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 2f  r>8 );.}.#else./
bf20: 2a 20 0a 2a 2a 20 43 6f 6d 70 69 6c 69 6e 67 20  * .** Compiling 
bf30: 75 73 69 6e 67 20 68 65 61 64 65 72 73 20 65 61  using headers ea
bf40: 72 6c 69 65 72 20 74 68 61 6e 20 38 2e 36 2e 20  rlier than 8.6. 
bf50: 49 6e 20 74 68 69 73 20 63 61 73 65 20 4e 52 20  In this case NR 
bf60: 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 75 73 65  cannot be.** use
bf70: 64 2c 20 73 6f 20 44 62 55 73 65 4e 72 65 28 29  d, so DbUseNre()
bf80: 20 74 6f 20 61 6c 77 61 79 73 20 72 65 74 75 72   to always retur
bf90: 6e 20 7a 65 72 6f 2e 20 41 64 64 20 23 64 65 66  n zero. Add #def
bfa0: 69 6e 65 73 20 66 6f 72 20 74 68 65 20 6f 74 68  ines for the oth
bfb0: 65 72 0a 2a 2a 20 54 63 6c 5f 4e 52 78 78 78 28  er.** Tcl_NRxxx(
bfc0: 29 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 70  ) functions to p
bfd0: 72 65 76 65 6e 74 20 74 68 65 6d 20 66 72 6f 6d  revent them from
bfe0: 20 63 61 75 73 69 6e 67 20 63 6f 6d 70 69 6c 61   causing compila
bff0: 74 69 6f 6e 20 65 72 72 6f 72 73 2c 0a 2a 2a 20  tion errors,.** 
c000: 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 20  even though the 
c010: 6f 6e 6c 79 20 69 6e 76 6f 63 61 74 69 6f 6e 73  only invocations
c020: 20 6f 66 20 74 68 65 6d 20 61 72 65 20 77 69 74   of them are wit
c030: 68 69 6e 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20  hin conditional 
c040: 62 6c 6f 63 6b 73 20 0a 2a 2a 20 6f 66 20 74 68  blocks .** of th
c050: 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  e form:.**.**   
c060: 69 66 28 20 44 62 55 73 65 4e 72 65 28 29 20 29  if( DbUseNre() )
c070: 20 7b 20 2e 2e 2e 20 7d 0a 2a 2f 0a 23 20 64 65   { ... }.*/.# de
c080: 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 43 4c 5f  fine SQLITE_TCL_
c090: 4e 52 45 20 30 0a 23 20 64 65 66 69 6e 65 20 44  NRE 0.# define D
c0a0: 62 55 73 65 4e 72 65 28 29 20 30 0a 23 20 64 65  bUseNre() 0.# de
c0b0: 66 69 6e 65 20 54 63 6c 5f 4e 52 41 64 64 43 61  fine Tcl_NRAddCa
c0c0: 6c 6c 62 61 63 6b 28 61 2c 62 2c 63 2c 64 2c 65  llback(a,b,c,d,e
c0d0: 2c 66 29 20 30 0a 23 20 64 65 66 69 6e 65 20 54  ,f) 0.# define T
c0e0: 63 6c 5f 4e 52 45 76 61 6c 4f 62 6a 28 61 2c 62  cl_NREvalObj(a,b
c0f0: 2c 63 29 20 30 0a 23 20 64 65 66 69 6e 65 20 54  ,c) 0.# define T
c100: 63 6c 5f 4e 52 43 72 65 61 74 65 43 6f 6d 6d 61  cl_NRCreateComma
c110: 6e 64 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20  nd(a,b,c,d,e,f) 
c120: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
c130: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
c140: 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6d 70   part of the imp
c150: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
c160: 68 65 20 63 6f 6d 6d 61 6e 64 3a 0a 2a 2a 0a 2a  he command:.**.*
c170: 2a 20 20 20 24 64 62 20 65 76 61 6c 20 53 51 4c  *   $db eval SQL
c180: 20 3f 41 52 52 41 59 4e 41 4d 45 3f 20 53 43 52   ?ARRAYNAME? SCR
c190: 49 50 54 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  IPT.*/.static in
c1a0: 74 20 44 62 45 76 61 6c 4e 65 78 74 43 6d 64 28  t DbEvalNextCmd(
c1b0: 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 64 61  .  ClientData da
c1c0: 74 61 5b 5d 2c 20 20 20 20 20 20 20 20 20 20 20  ta[],           
c1d0: 20 20 20 20 20 20 20 20 2f 2a 20 64 61 74 61 5b          /* data[
c1e0: 30 5d 20 69 73 20 74 68 65 20 28 44 62 45 76 61  0] is the (DbEva
c1f0: 6c 43 6f 6e 74 65 78 74 2a 29 20 2a 2f 0a 20 20  lContext*) */.  
c200: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
c210: 72 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rp,             
c220: 20 20 20 20 20 2f 2a 20 54 63 6c 20 69 6e 74 65       /* Tcl inte
c230: 72 70 72 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74  rpreter */.  int
c240: 20 72 65 73 75 6c 74 20 20 20 20 20 20 20 20 20   result         
c250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c260: 20 20 2f 2a 20 52 65 73 75 6c 74 20 73 6f 20 66    /* Result so f
c270: 61 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ar */.){.  int r
c280: 63 20 3d 20 72 65 73 75 6c 74 3b 20 20 20 20 20  c = result;     
c290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2a0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
c2b0: 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 66 69 72 73  /..  /* The firs
c2c0: 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  t element of the
c2d0: 20 64 61 74 61 5b 5d 20 61 72 72 61 79 20 69 73   data[] array is
c2e0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
c2f0: 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 0a 20 20  DbEvalContext.  
c300: 2a 2a 20 73 74 72 75 63 74 75 72 65 20 61 6c 6c  ** structure all
c310: 6f 63 61 74 65 64 20 75 73 69 6e 67 20 54 63 6c  ocated using Tcl
c320: 5f 41 6c 6c 6f 63 28 29 2e 20 54 68 65 20 73 65  _Alloc(). The se
c330: 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20 6f 66 20  cond element of 
c340: 64 61 74 61 5b 5d 0a 20 20 2a 2a 20 69 73 20 61  data[].  ** is a
c350: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 54 63   pointer to a Tc
c360: 6c 5f 4f 62 6a 20 63 6f 6e 74 61 69 6e 69 6e 67  l_Obj containing
c370: 20 74 68 65 20 73 63 72 69 70 74 20 74 6f 20 72   the script to r
c380: 75 6e 20 66 6f 72 20 65 61 63 68 20 72 6f 77 0a  un for each row.
c390: 20 20 2a 2a 20 72 65 74 75 72 6e 65 64 20 62 79    ** returned by
c3a0: 20 74 68 65 20 71 75 65 72 69 65 73 20 65 6e 63   the queries enc
c3b0: 61 70 73 75 6c 61 74 65 64 20 69 6e 20 64 61 74  apsulated in dat
c3c0: 61 5b 30 5d 2e 20 2a 2f 0a 20 20 44 62 45 76 61  a[0]. */.  DbEva
c3d0: 6c 43 6f 6e 74 65 78 74 20 2a 70 20 3d 20 28 44  lContext *p = (D
c3e0: 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 29 64  bEvalContext *)d
c3f0: 61 74 61 5b 30 5d 3b 0a 20 20 54 63 6c 5f 4f 62  ata[0];.  Tcl_Ob
c400: 6a 20 2a 70 53 63 72 69 70 74 20 3d 20 28 54 63  j *pScript = (Tc
c410: 6c 5f 4f 62 6a 20 2a 29 64 61 74 61 5b 31 5d 3b  l_Obj *)data[1];
c420: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 72  .  Tcl_Obj *pArr
c430: 61 79 20 3d 20 70 2d 3e 70 41 72 72 61 79 3b 0a  ay = p->pArray;.
c440: 0a 20 20 77 68 69 6c 65 28 20 28 72 63 3d 3d 54  .  while( (rc==T
c450: 43 4c 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 54 43 4c  CL_OK || rc==TCL
c460: 5f 43 4f 4e 54 49 4e 55 45 29 20 26 26 20 54 43  _CONTINUE) && TC
c470: 4c 5f 4f 4b 3d 3d 28 72 63 20 3d 20 64 62 45 76  L_OK==(rc = dbEv
c480: 61 6c 53 74 65 70 28 70 29 29 20 29 7b 0a 20 20  alStep(p)) ){.  
c490: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
c4a0: 20 6e 43 6f 6c 3b 0a 20 20 20 20 54 63 6c 5f 4f   nCol;.    Tcl_O
c4b0: 62 6a 20 2a 2a 61 70 43 6f 6c 4e 61 6d 65 3b 0a  bj **apColName;.
c4c0: 20 20 20 20 64 62 45 76 61 6c 52 6f 77 49 6e 66      dbEvalRowInf
c4d0: 6f 28 70 2c 20 26 6e 43 6f 6c 2c 20 26 61 70 43  o(p, &nCol, &apC
c4e0: 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72  olName);.    for
c4f0: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
c500: 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62  +){.      Tcl_Ob
c510: 6a 20 2a 70 56 61 6c 20 3d 20 64 62 45 76 61 6c  j *pVal = dbEval
c520: 43 6f 6c 75 6d 6e 56 61 6c 75 65 28 70 2c 20 69  ColumnValue(p, i
c530: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 72  );.      if( pAr
c540: 72 61 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ray==0 ){.      
c550: 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32    Tcl_ObjSetVar2
c560: 28 69 6e 74 65 72 70 2c 20 61 70 43 6f 6c 4e 61  (interp, apColNa
c570: 6d 65 5b 69 5d 2c 20 30 2c 20 70 56 61 6c 2c 20  me[i], 0, pVal, 
c580: 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  0);.      }else{
c590: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a  .        Tcl_Obj
c5a0: 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20  SetVar2(interp, 
c5b0: 70 41 72 72 61 79 2c 20 61 70 43 6f 6c 4e 61 6d  pArray, apColNam
c5c0: 65 5b 69 5d 2c 20 70 56 61 6c 2c 20 30 29 3b 0a  e[i], pVal, 0);.
c5d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
c5e0: 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 69 72     /* The requir
c5f0: 65 64 20 69 6e 74 65 72 70 72 65 74 65 72 20 76  ed interpreter v
c600: 61 72 69 61 62 6c 65 73 20 61 72 65 20 6e 6f 77  ariables are now
c610: 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
c620: 74 68 65 20 64 61 74 61 20 0a 20 20 20 20 2a 2a  the data .    **
c630: 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e   from the curren
c640: 74 20 72 6f 77 2e 20 49 66 20 75 73 69 6e 67 20  t row. If using 
c650: 4e 52 45 2c 20 73 63 68 65 64 75 6c 65 20 63 61  NRE, schedule ca
c660: 6c 6c 62 61 63 6b 73 20 74 6f 20 65 76 61 6c 75  llbacks to evalu
c670: 61 74 65 0a 20 20 20 20 2a 2a 20 73 63 72 69 70  ate.    ** scrip
c680: 74 20 70 53 63 72 69 70 74 2c 20 74 68 65 6e 20  t pScript, then 
c690: 74 6f 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 66  to invoke this f
c6a0: 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 20 74 6f  unction again to
c6b0: 20 66 65 74 63 68 20 74 68 65 20 6e 65 78 74 0a   fetch the next.
c6c0: 20 20 20 20 2a 2a 20 72 6f 77 20 28 6f 72 20 63      ** row (or c
c6d0: 6c 65 61 6e 20 75 70 20 69 66 20 74 68 65 72 65  lean up if there
c6e0: 20 69 73 20 6e 6f 20 6e 65 78 74 20 72 6f 77 20   is no next row 
c6f0: 6f 72 20 74 68 65 20 73 63 72 69 70 74 20 74 68  or the script th
c700: 72 6f 77 73 20 61 6e 0a 20 20 20 20 2a 2a 20 65  rows an.    ** e
c710: 78 63 65 70 74 69 6f 6e 29 2e 20 41 66 74 65 72  xception). After
c720: 20 73 63 68 65 64 75 6c 69 6e 67 20 74 68 65 20   scheduling the 
c730: 63 61 6c 6c 62 61 63 6b 73 2c 20 72 65 74 75 72  callbacks, retur
c740: 6e 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65  n control to the
c750: 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 2e   .    ** caller.
c760: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
c770: 66 20 6e 6f 74 20 75 73 69 6e 67 20 4e 52 45 2c  f not using NRE,
c780: 20 65 76 61 6c 75 61 74 65 20 70 53 63 72 69 70   evaluate pScrip
c790: 74 20 64 69 72 65 63 74 6c 79 20 61 6e 64 20 63  t directly and c
c7a0: 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68 65  ontinue with the
c7b0: 0a 20 20 20 20 2a 2a 20 6e 65 78 74 20 69 74 65  .    ** next ite
c7c0: 72 61 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 77  ration of this w
c7d0: 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 2e 20  hile(...) loop. 
c7e0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 44 62 55 73   */.    if( DbUs
c7f0: 65 4e 72 65 28 29 20 29 7b 0a 20 20 20 20 20 20  eNre() ){.      
c800: 54 63 6c 5f 4e 52 41 64 64 43 61 6c 6c 62 61 63  Tcl_NRAddCallbac
c810: 6b 28 69 6e 74 65 72 70 2c 20 44 62 45 76 61 6c  k(interp, DbEval
c820: 4e 65 78 74 43 6d 64 2c 20 28 76 6f 69 64 2a 29  NextCmd, (void*)
c830: 70 2c 20 28 76 6f 69 64 2a 29 70 53 63 72 69 70  p, (void*)pScrip
c840: 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 0, 0);.      
c850: 72 65 74 75 72 6e 20 54 63 6c 5f 4e 52 45 76 61  return Tcl_NREva
c860: 6c 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 53 63  lObj(interp, pSc
c870: 72 69 70 74 2c 20 30 29 3b 0a 20 20 20 20 7d 65  ript, 0);.    }e
c880: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
c890: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e  Tcl_EvalObjEx(in
c8a0: 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20 30  terp, pScript, 0
c8b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
c8c0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
c8d0: 28 70 53 63 72 69 70 74 29 3b 0a 20 20 64 62 45  (pScript);.  dbE
c8e0: 76 61 6c 46 69 6e 61 6c 69 7a 65 28 70 29 3b 0a  valFinalize(p);.
c8f0: 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72    Tcl_Free((char
c900: 20 2a 29 70 29 3b 0a 0a 20 20 69 66 28 20 72 63   *)p);..  if( rc
c910: 3d 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 72 63 3d 3d  ==TCL_OK || rc==
c920: 54 43 4c 5f 42 52 45 41 4b 20 29 7b 0a 20 20 20  TCL_BREAK ){.   
c930: 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74   Tcl_ResetResult
c940: 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 63  (interp);.    rc
c950: 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 7d 0a 20   = TCL_OK;.  }. 
c960: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
c970: 2a 0a 2a 2a 20 54 68 65 20 22 73 71 6c 69 74 65  *.** The "sqlite
c980: 22 20 63 6f 6d 6d 61 6e 64 20 62 65 6c 6f 77 20  " command below 
c990: 63 72 65 61 74 65 73 20 61 20 6e 65 77 20 54 63  creates a new Tc
c9a0: 6c 20 63 6f 6d 6d 61 6e 64 20 66 6f 72 20 65 61  l command for ea
c9b0: 63 68 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  ch.** connection
c9c0: 20 69 74 20 6f 70 65 6e 73 20 74 6f 20 61 6e 20   it opens to an 
c9d0: 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e  SQLite database.
c9e0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
c9f0: 73 20 69 6e 76 6f 6b 65 64 0a 2a 2a 20 77 68 65  s invoked.** whe
ca00: 6e 65 76 65 72 20 6f 6e 65 20 6f 66 20 74 68 6f  never one of tho
ca10: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2d 73 70  se connection-sp
ca20: 65 63 69 66 69 63 20 63 6f 6d 6d 61 6e 64 73 20  ecific commands 
ca30: 69 73 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 69  is executed.** i
ca40: 6e 20 54 63 6c 2e 20 20 46 6f 72 20 65 78 61 6d  n Tcl.  For exam
ca50: 70 6c 65 2c 20 69 66 20 79 6f 75 20 72 75 6e 20  ple, if you run 
ca60: 54 63 6c 20 63 6f 64 65 20 6c 69 6b 65 20 74 68  Tcl code like th
ca70: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
ca80: 73 71 6c 69 74 65 33 20 64 62 31 20 20 22 6d 79  sqlite3 db1  "my
ca90: 5f 64 61 74 61 62 61 73 65 22 0a 2a 2a 20 20 20  _database".**   
caa0: 20 20 20 20 64 62 31 20 63 6c 6f 73 65 0a 2a 2a      db1 close.**
cab0: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 63 6f  .** The first co
cac0: 6d 6d 61 6e 64 20 6f 70 65 6e 73 20 61 20 63 6f  mmand opens a co
cad0: 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  nnection to the 
cae0: 22 6d 79 5f 64 61 74 61 62 61 73 65 22 20 64 61  "my_database" da
caf0: 74 61 62 61 73 65 0a 2a 2a 20 61 6e 64 20 63 61  tabase.** and ca
cb00: 6c 6c 73 20 74 68 61 74 20 63 6f 6e 6e 65 63 74  lls that connect
cb10: 69 6f 6e 20 22 64 62 31 22 2e 20 20 54 68 65 20  ion "db1".  The 
cb20: 73 65 63 6f 6e 64 20 63 6f 6d 6d 61 6e 64 20 63  second command c
cb30: 61 75 73 65 73 20 74 68 69 73 0a 2a 2a 20 73 75  auses this.** su
cb40: 62 72 6f 75 74 69 6e 65 20 74 6f 20 62 65 20 69  broutine to be i
cb50: 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  nvoked..*/.stati
cb60: 63 20 69 6e 74 20 44 62 4f 62 6a 43 6d 64 28 76  c int DbObjCmd(v
cb70: 6f 69 64 20 2a 63 64 2c 20 54 63 6c 5f 49 6e 74  oid *cd, Tcl_Int
cb80: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
cb90: 20 6f 62 6a 63 2c 54 63 6c 5f 4f 62 6a 20 2a 63   objc,Tcl_Obj *c
cba0: 6f 6e 73 74 2a 6f 62 6a 76 29 7b 0a 20 20 53 71  onst*objv){.  Sq
cbb0: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
cbc0: 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69  qliteDb*)cd;.  i
cbd0: 6e 74 20 63 68 6f 69 63 65 3b 0a 20 20 69 6e 74  nt choice;.  int
cbe0: 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20   rc = TCL_OK;.  
cbf0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
cc00: 72 20 2a 44 42 5f 73 74 72 73 5b 5d 20 3d 20 7b  r *DB_strs[] = {
cc10: 0a 20 20 20 20 22 61 75 74 68 6f 72 69 7a 65 72  .    "authorizer
cc20: 22 2c 20 20 20 20 20 20 20 20 20 22 62 61 63 6b  ",         "back
cc30: 75 70 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  up",            
cc40: 22 62 75 73 79 22 2c 0a 20 20 20 20 22 63 61 63  "busy",.    "cac
cc50: 68 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  he",            
cc60: 20 20 22 63 68 61 6e 67 65 73 22 2c 20 20 20 20    "changes",    
cc70: 20 20 20 20 20 20 20 22 63 6c 6f 73 65 22 2c 0a         "close",.
cc80: 20 20 20 20 22 63 6f 6c 6c 61 74 65 22 2c 20 20      "collate",  
cc90: 20 20 20 20 20 20 20 20 20 20 22 63 6f 6c 6c 61            "colla
cca0: 74 69 6f 6e 5f 6e 65 65 64 65 64 22 2c 20 20 22  tion_needed",  "
ccb0: 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 22 2c 0a 20 20  commit_hook",.  
ccc0: 20 20 22 63 6f 6d 70 6c 65 74 65 22 2c 20 20 20    "complete",   
ccd0: 20 20 20 20 20 20 20 20 22 63 6f 70 79 22 2c 20          "copy", 
cce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 65 6e               "en
ccf0: 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73  able_load_extens
cd00: 69 6f 6e 22 2c 0a 20 20 20 20 22 65 72 72 6f 72  ion",.    "error
cd10: 63 6f 64 65 22 2c 20 20 20 20 20 20 20 20 20 20  code",          
cd20: 22 65 76 61 6c 22 2c 20 20 20 20 20 20 20 20 20  "eval",         
cd30: 20 20 20 20 20 22 65 78 69 73 74 73 22 2c 0a 20       "exists",. 
cd40: 20 20 20 22 66 75 6e 63 74 69 6f 6e 22 2c 20 20     "function",  
cd50: 20 20 20 20 20 20 20 20 20 22 69 6e 63 72 62 6c           "incrbl
cd60: 6f 62 22 2c 20 20 20 20 20 20 20 20 20 20 22 69  ob",          "i
cd70: 6e 74 65 72 72 75 70 74 22 2c 0a 20 20 20 20 22  nterrupt",.    "
cd80: 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
cd90: 64 22 2c 20 20 22 6e 75 6c 6c 76 61 6c 75 65 22  d",  "nullvalue"
cda0: 2c 20 20 20 20 20 20 20 20 20 22 6f 6e 65 63 6f  ,         "oneco
cdb0: 6c 75 6d 6e 22 2c 0a 20 20 20 20 22 70 72 6f 66  lumn",.    "prof
cdc0: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ile",           
cdd0: 20 22 70 72 6f 67 72 65 73 73 22 2c 20 20 20 20   "progress",    
cde0: 20 20 20 20 20 20 22 72 65 6b 65 79 22 2c 0a 20        "rekey",. 
cdf0: 20 20 20 22 72 65 73 74 6f 72 65 22 2c 20 20 20     "restore",   
ce00: 20 20 20 20 20 20 20 20 20 22 72 6f 6c 6c 62 61           "rollba
ce10: 63 6b 5f 68 6f 6f 6b 22 2c 20 20 20 20 20 22 73  ck_hook",     "s
ce20: 74 61 74 75 73 22 2c 0a 20 20 20 20 22 74 69 6d  tatus",.    "tim
ce30: 65 6f 75 74 22 2c 20 20 20 20 20 20 20 20 20 20  eout",          
ce40: 20 20 22 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73    "total_changes
ce50: 22 2c 20 20 20 20 20 22 74 72 61 63 65 22 2c 0a  ",     "trace",.
ce60: 20 20 20 20 22 74 72 61 6e 73 61 63 74 69 6f 6e      "transaction
ce70: 22 2c 20 20 20 20 20 20 20 20 22 75 6e 6c 6f 63  ",        "unloc
ce80: 6b 5f 6e 6f 74 69 66 79 22 2c 20 20 20 20 20 22  k_notify",     "
ce90: 75 70 64 61 74 65 5f 68 6f 6f 6b 22 2c 0a 20 20  update_hook",.  
cea0: 20 20 22 76 65 72 73 69 6f 6e 22 2c 20 20 20 20    "version",    
ceb0: 20 20 20 20 20 20 20 20 22 77 61 6c 5f 68 6f 6f          "wal_hoo
cec0: 6b 22 2c 20 20 20 20 20 20 20 20 20 20 30 0a 20  k",          0. 
ced0: 20 7d 3b 0a 20 20 65 6e 75 6d 20 44 42 5f 65 6e   };.  enum DB_en
cee0: 75 6d 20 7b 0a 20 20 20 20 44 42 5f 41 55 54 48  um {.    DB_AUTH
cef0: 4f 52 49 5a 45 52 2c 20 20 20 20 20 20 20 20 44  ORIZER,        D
cf00: 42 5f 42 41 43 4b 55 50 2c 20 20 20 20 20 20 20  B_BACKUP,       
cf10: 20 20 20 20 44 42 5f 42 55 53 59 2c 0a 20 20 20      DB_BUSY,.   
cf20: 20 44 42 5f 43 41 43 48 45 2c 20 20 20 20 20 20   DB_CACHE,      
cf30: 20 20 20 20 20 20 20 44 42 5f 43 48 41 4e 47 45         DB_CHANGE
cf40: 53 2c 20 20 20 20 20 20 20 20 20 20 44 42 5f 43  S,          DB_C
cf50: 4c 4f 53 45 2c 0a 20 20 20 20 44 42 5f 43 4f 4c  LOSE,.    DB_COL
cf60: 4c 41 54 45 2c 20 20 20 20 20 20 20 20 20 20 20  LATE,           
cf70: 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e 45 45  DB_COLLATION_NEE
cf80: 44 45 44 2c 20 44 42 5f 43 4f 4d 4d 49 54 5f 48  DED, DB_COMMIT_H
cf90: 4f 4f 4b 2c 0a 20 20 20 20 44 42 5f 43 4f 4d 50  OOK,.    DB_COMP
cfa0: 4c 45 54 45 2c 20 20 20 20 20 20 20 20 20 20 44  LETE,          D
cfb0: 42 5f 43 4f 50 59 2c 20 20 20 20 20 20 20 20 20  B_COPY,         
cfc0: 20 20 20 20 44 42 5f 45 4e 41 42 4c 45 5f 4c 4f      DB_ENABLE_LO
cfd0: 41 44 5f 45 58 54 45 4e 53 49 4f 4e 2c 0a 20 20  AD_EXTENSION,.  
cfe0: 20 20 44 42 5f 45 52 52 4f 52 43 4f 44 45 2c 20    DB_ERRORCODE, 
cff0: 20 20 20 20 20 20 20 20 44 42 5f 45 56 41 4c 2c          DB_EVAL,
d000: 20 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f               DB_
d010: 45 58 49 53 54 53 2c 0a 20 20 20 20 44 42 5f 46  EXISTS,.    DB_F
d020: 55 4e 43 54 49 4f 4e 2c 20 20 20 20 20 20 20 20  UNCTION,        
d030: 20 20 44 42 5f 49 4e 43 52 42 4c 4f 42 2c 20 20    DB_INCRBLOB,  
d040: 20 20 20 20 20 20 20 44 42 5f 49 4e 54 45 52 52         DB_INTERR
d050: 55 50 54 2c 0a 20 20 20 20 44 42 5f 4c 41 53 54  UPT,.    DB_LAST
d060: 5f 49 4e 53 45 52 54 5f 52 4f 57 49 44 2c 20 44  _INSERT_ROWID, D
d070: 42 5f 4e 55 4c 4c 56 41 4c 55 45 2c 20 20 20 20  B_NULLVALUE,    
d080: 20 20 20 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e      DB_ONECOLUMN
d090: 2c 0a 20 20 20 20 44 42 5f 50 52 4f 46 49 4c 45  ,.    DB_PROFILE
d0a0: 2c 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 50  ,           DB_P
d0b0: 52 4f 47 52 45 53 53 2c 20 20 20 20 20 20 20 20  ROGRESS,        
d0c0: 20 44 42 5f 52 45 4b 45 59 2c 0a 20 20 20 20 44   DB_REKEY,.    D
d0d0: 42 5f 52 45 53 54 4f 52 45 2c 20 20 20 20 20 20  B_RESTORE,      
d0e0: 20 20 20 20 20 44 42 5f 52 4f 4c 4c 42 41 43 4b       DB_ROLLBACK
d0f0: 5f 48 4f 4f 4b 2c 20 20 20 20 44 42 5f 53 54 41  _HOOK,    DB_STA
d100: 54 55 53 2c 0a 20 20 20 20 44 42 5f 54 49 4d 45  TUS,.    DB_TIME
d110: 4f 55 54 2c 20 20 20 20 20 20 20 20 20 20 20 44  OUT,           D
d120: 42 5f 54 4f 54 41 4c 5f 43 48 41 4e 47 45 53 2c  B_TOTAL_CHANGES,
d130: 20 20 20 20 44 42 5f 54 52 41 43 45 2c 0a 20 20      DB_TRACE,.  
d140: 20 20 44 42 5f 54 52 41 4e 53 41 43 54 49 4f 4e    DB_TRANSACTION
d150: 2c 20 20 20 20 20 20 20 44 42 5f 55 4e 4c 4f 43  ,       DB_UNLOC
d160: 4b 5f 4e 4f 54 49 46 59 2c 20 20 20 20 44 42 5f  K_NOTIFY,    DB_
d170: 55 50 44 41 54 45 5f 48 4f 4f 4b 2c 0a 20 20 20  UPDATE_HOOK,.   
d180: 20 44 42 5f 56 45 52 53 49 4f 4e 2c 20 20 20 20   DB_VERSION,    
d190: 20 20 20 20 20 20 20 44 42 5f 57 41 4c 5f 48 4f         DB_WAL_HO
d1a0: 4f 4b 0a 20 20 7d 3b 0a 20 20 2f 2a 20 64 6f 6e  OK.  };.  /* don
d1b0: 27 74 20 6c 65 61 76 65 20 74 72 61 69 6c 69 6e  't leave trailin
d1c0: 67 20 63 6f 6d 6d 61 73 20 6f 6e 20 44 42 5f 65  g commas on DB_e
d1d0: 6e 75 6d 2c 20 69 74 20 63 6f 6e 66 75 73 65 73  num, it confuses
d1e0: 20 74 68 65 20 41 49 58 20 78 6c 63 20 63 6f 6d   the AIX xlc com
d1f0: 70 69 6c 65 72 20 2a 2f 0a 0a 20 20 69 66 28 20  piler */..  if( 
d200: 6f 62 6a 63 3c 32 20 29 7b 0a 20 20 20 20 54 63  objc<2 ){.    Tc
d210: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
d220: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
d230: 22 53 55 42 43 4f 4d 4d 41 4e 44 20 2e 2e 2e 22  "SUBCOMMAND ..."
d240: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
d250: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
d260: 66 28 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46  f( Tcl_GetIndexF
d270: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
d280: 62 6a 76 5b 31 5d 2c 20 44 42 5f 73 74 72 73 2c  bjv[1], DB_strs,
d290: 20 22 6f 70 74 69 6f 6e 22 2c 20 30 2c 20 26 63   "option", 0, &c
d2a0: 68 6f 69 63 65 29 20 29 7b 0a 20 20 20 20 72 65  hoice) ){.    re
d2b0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
d2c0: 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 28    }..  switch( (
d2d0: 65 6e 75 6d 20 44 42 5f 65 6e 75 6d 29 63 68 6f  enum DB_enum)cho
d2e0: 69 63 65 20 29 7b 0a 0a 20 20 2f 2a 20 20 20 20  ice ){..  /*    
d2f0: 24 64 62 20 61 75 74 68 6f 72 69 7a 65 72 20 3f  $db authorizer ?
d300: 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20  CALLBACK?.  **. 
d310: 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67   ** Invoke the g
d320: 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 74 6f  iven callback to
d330: 20 61 75 74 68 6f 72 69 7a 65 20 65 61 63 68 20   authorize each 
d340: 53 51 4c 20 6f 70 65 72 61 74 69 6f 6e 20 61 73  SQL operation as
d350: 20 69 74 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70   it is.  ** comp
d360: 69 6c 65 64 2e 20 20 35 20 61 72 67 75 6d 65 6e  iled.  5 argumen
d370: 74 73 20 61 72 65 20 61 70 70 65 6e 64 65 64 20  ts are appended 
d380: 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  to the callback 
d390: 62 65 66 6f 72 65 20 69 74 20 69 73 0a 20 20 2a  before it is.  *
d3a0: 2a 20 69 6e 76 6f 6b 65 64 3a 0a 20 20 2a 2a 0a  * invoked:.  **.
d3b0: 20 20 2a 2a 20 20 20 28 31 29 20 54 68 65 20 61    **   (1) The a
d3c0: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 79 70  uthorization typ
d3d0: 65 20 28 65 78 3a 20 53 51 4c 49 54 45 5f 43 52  e (ex: SQLITE_CR
d3e0: 45 41 54 45 5f 54 41 42 4c 45 2c 20 53 51 4c 49  EATE_TABLE, SQLI
d3f0: 54 45 5f 49 4e 53 45 52 54 2c 20 2e 2e 2e 29 0a  TE_INSERT, ...).
d400: 20 20 2a 2a 20 20 20 28 32 29 20 46 69 72 73 74    **   (2) First
d410: 20 64 65 73 63 72 69 70 74 69 76 65 20 6e 61 6d   descriptive nam
d420: 65 20 28 64 65 70 65 6e 64 73 20 6f 6e 20 61 75  e (depends on au
d430: 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 79 70 65  thorization type
d440: 29 0a 20 20 2a 2a 20 20 20 28 33 29 20 53 65 63  ).  **   (3) Sec
d450: 6f 6e 64 20 64 65 73 63 72 69 70 74 69 76 65 20  ond descriptive 
d460: 6e 61 6d 65 0a 20 20 2a 2a 20 20 20 28 34 29 20  name.  **   (4) 
d470: 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
d480: 62 61 73 65 20 28 65 78 3a 20 22 6d 61 69 6e 22  base (ex: "main"
d490: 2c 20 22 74 65 6d 70 22 29 0a 20 20 2a 2a 20 20  , "temp").  **  
d4a0: 20 28 35 29 20 4e 61 6d 65 20 6f 66 20 74 72 69   (5) Name of tri
d4b0: 67 67 65 72 20 74 68 61 74 20 69 73 20 64 6f 69  gger that is doi
d4c0: 6e 67 20 74 68 65 20 61 63 63 65 73 73 0a 20 20  ng the access.  
d4d0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c  **.  ** The call
d4e0: 62 61 63 6b 20 73 68 6f 75 6c 64 20 72 65 74 75  back should retu
d4f0: 72 6e 20 6f 6e 20 6f 66 20 74 68 65 20 66 6f 6c  rn on of the fol
d500: 6c 6f 77 69 6e 67 20 73 74 72 69 6e 67 73 3a 20  lowing strings: 
d510: 53 51 4c 49 54 45 5f 4f 4b 2c 0a 20 20 2a 2a 20  SQLITE_OK,.  ** 
d520: 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 2c 20 6f  SQLITE_IGNORE, o
d530: 72 20 53 51 4c 49 54 45 5f 44 45 4e 59 2e 20 20  r SQLITE_DENY.  
d540: 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e  Any other return
d550: 20 76 61 6c 75 65 20 69 73 20 61 6e 20 65 72 72   value is an err
d560: 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  or..  **.  ** If
d570: 20 74 68 69 73 20 6d 65 74 68 6f 64 20 69 73 20   this method is 
d580: 69 6e 76 6f 6b 65 64 20 77 69 74 68 20 6e 6f 20  invoked with no 
d590: 61 72 67 75 6d 65 6e 74 73 2c 20 74 68 65 20 63  arguments, the c
d5a0: 75 72 72 65 6e 74 20 61 75 74 68 6f 72 69 7a 61  urrent authoriza
d5b0: 74 69 6f 6e 0a 20 20 2a 2a 20 63 61 6c 6c 62 61  tion.  ** callba
d5c0: 63 6b 20 73 74 72 69 6e 67 20 69 73 20 72 65 74  ck string is ret
d5d0: 75 72 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61  urned..  */.  ca
d5e0: 73 65 20 44 42 5f 41 55 54 48 4f 52 49 5a 45 52  se DB_AUTHORIZER
d5f0: 3a 20 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  : {.#ifdef SQLIT
d600: 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
d610: 54 49 4f 4e 0a 20 20 20 20 54 63 6c 5f 41 70 70  TION.    Tcl_App
d620: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
d630: 2c 20 22 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  , "authorization
d640: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 69   not available i
d650: 6e 20 74 68 69 73 20 62 75 69 6c 64 22 2c 20 30  n this build", 0
d660: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
d670: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20  L_ERROR;.#else. 
d680: 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b     if( objc>3 ){
d690: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
d6a0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
d6b0: 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42  2, objv, "?CALLB
d6c0: 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65  ACK?");.      re
d6d0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
d6e0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62      }else if( ob
d6f0: 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69  jc==2 ){.      i
d700: 66 28 20 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b  f( pDb->zAuth ){
d710: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70  .        Tcl_App
d720: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
d730: 2c 20 70 44 62 2d 3e 7a 41 75 74 68 2c 20 30 29  , pDb->zAuth, 0)
d740: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
d750: 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20  lse{.      char 
d760: 2a 7a 41 75 74 68 3b 0a 20 20 20 20 20 20 69 6e  *zAuth;.      in
d770: 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28  t len;.      if(
d780: 20 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20   pDb->zAuth ){. 
d790: 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28         Tcl_Free(
d7a0: 70 44 62 2d 3e 7a 41 75 74 68 29 3b 0a 20 20 20  pDb->zAuth);.   
d7b0: 20 20 20 7d 0a 20 20 20 20 20 20 7a 41 75 74 68     }.      zAuth
d7c0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
d7d0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
d7e0: 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66   &len);.      if
d7f0: 28 20 7a 41 75 74 68 20 26 26 20 6c 65 6e 3e 30  ( zAuth && len>0
d800: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
d810: 3e 7a 41 75 74 68 20 3d 20 54 63 6c 5f 41 6c 6c  >zAuth = Tcl_All
d820: 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20  oc( len + 1 );. 
d830: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44         memcpy(pD
d840: 62 2d 3e 7a 41 75 74 68 2c 20 7a 41 75 74 68 2c  b->zAuth, zAuth,
d850: 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d   len+1);.      }
d860: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44  else{.        pD
d870: 62 2d 3e 7a 41 75 74 68 20 3d 20 30 3b 0a 20 20  b->zAuth = 0;.  
d880: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
d890: 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20  pDb->zAuth ){.  
d8a0: 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72        pDb->inter
d8b0: 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20  p = interp;.    
d8c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f      sqlite3_set_
d8d0: 61 75 74 68 6f 72 69 7a 65 72 28 70 44 62 2d 3e  authorizer(pDb->
d8e0: 64 62 2c 20 61 75 74 68 5f 63 61 6c 6c 62 61 63  db, auth_callbac
d8f0: 6b 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d  k, pDb);.      }
d900: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
d910: 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72  lite3_set_author
d920: 69 7a 65 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c  izer(pDb->db, 0,
d930: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
d940: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72   }.#endif.    br
d950: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
d960: 20 20 24 64 62 20 62 61 63 6b 75 70 20 3f 44 41    $db backup ?DA
d970: 54 41 42 41 53 45 3f 20 46 49 4c 45 4e 41 4d 45  TABASE? FILENAME
d980: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 70 65 6e 20  .  **.  ** Open 
d990: 6f 72 20 63 72 65 61 74 65 20 61 20 64 61 74 61  or create a data
d9a0: 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 64 20  base file named 
d9b0: 46 49 4c 45 4e 41 4d 45 2e 20 20 54 72 61 6e 73  FILENAME.  Trans
d9c0: 66 65 72 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6e  fer the.  ** con
d9d0: 74 65 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 64 61  tent of local da
d9e0: 74 61 62 61 73 65 20 44 41 54 41 42 41 53 45 20  tabase DATABASE 
d9f0: 28 64 65 66 61 75 6c 74 3a 20 22 6d 61 69 6e 22  (default: "main"
da00: 29 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  ) into the.  ** 
da10: 46 49 4c 45 4e 41 4d 45 20 64 61 74 61 62 61 73  FILENAME databas
da20: 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  e..  */.  case D
da30: 42 5f 42 41 43 4b 55 50 3a 20 7b 0a 20 20 20 20  B_BACKUP: {.    
da40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 73  const char *zDes
da50: 74 46 69 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74  tFile;.    const
da60: 20 63 68 61 72 20 2a 7a 53 72 63 44 62 3b 0a 20   char *zSrcDb;. 
da70: 20 20 20 73 71 6c 69 74 65 33 20 2a 70 44 65 73     sqlite3 *pDes
da80: 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  t;.    sqlite3_b
da90: 61 63 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b 0a  ackup *pBackup;.
daa0: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33  .    if( objc==3
dab0: 20 29 7b 0a 20 20 20 20 20 20 7a 53 72 63 44 62   ){.      zSrcDb
dac0: 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 20   = "main";.     
dad0: 20 7a 44 65 73 74 46 69 6c 65 20 3d 20 54 63 6c   zDestFile = Tcl
dae0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
daf0: 32 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  2]);.    }else i
db00: 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20  f( objc==4 ){.  
db10: 20 20 20 20 7a 53 72 63 44 62 20 3d 20 54 63 6c      zSrcDb = Tcl
db20: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
db30: 32 5d 29 3b 0a 20 20 20 20 20 20 7a 44 65 73 74  2]);.      zDest
db40: 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  File = Tcl_GetSt
db50: 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20  ring(objv[3]);. 
db60: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
db70: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
db80: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
db90: 2c 20 22 3f 44 41 54 41 42 41 53 45 3f 20 46 49  , "?DATABASE? FI
dba0: 4c 45 4e 41 4d 45 22 29 3b 0a 20 20 20 20 20 20  LENAME");.      
dbb0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
dbc0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
dbd0: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 44   sqlite3_open(zD
dbe0: 65 73 74 46 69 6c 65 2c 20 26 70 44 65 73 74 29  estFile, &pDest)
dbf0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
dc00: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
dc10: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
dc20: 74 28 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f  t(interp, "canno
dc30: 74 20 6f 70 65 6e 20 74 61 72 67 65 74 20 64 61  t open target da
dc40: 74 61 62 61 73 65 3a 20 22 2c 0a 20 20 20 20 20  tabase: ",.     
dc50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72        sqlite3_er
dc60: 72 6d 73 67 28 70 44 65 73 74 29 2c 20 28 63 68  rmsg(pDest), (ch
dc70: 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 73 71  ar*)0);.      sq
dc80: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 44 65 73  lite3_close(pDes
dc90: 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
dca0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
dcb0: 7d 0a 20 20 20 20 70 42 61 63 6b 75 70 20 3d 20  }.    pBackup = 
dcc0: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 69  sqlite3_backup_i
dcd0: 6e 69 74 28 70 44 65 73 74 2c 20 22 6d 61 69 6e  nit(pDest, "main
dce0: 22 2c 20 70 44 62 2d 3e 64 62 2c 20 7a 53 72 63  ", pDb->db, zSrc
dcf0: 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70 42 61  Db);.    if( pBa
dd00: 63 6b 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ckup==0 ){.     
dd10: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
dd20: 74 28 69 6e 74 65 72 70 2c 20 22 62 61 63 6b 75  t(interp, "backu
dd30: 70 20 66 61 69 6c 65 64 3a 20 22 2c 0a 20 20 20  p failed: ",.   
dd40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
dd50: 65 72 72 6d 73 67 28 70 44 65 73 74 29 2c 20 28  errmsg(pDest), (
dd60: 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
dd70: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 44  sqlite3_close(pD
dd80: 65 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  est);.      retu
dd90: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
dda0: 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 20    }.    while(  
ddb0: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 61  (rc = sqlite3_ba
ddc0: 63 6b 75 70 5f 73 74 65 70 28 70 42 61 63 6b 75  ckup_step(pBacku
ddd0: 70 2c 31 30 30 29 29 3d 3d 53 51 4c 49 54 45 5f  p,100))==SQLITE_
dde0: 4f 4b 20 29 7b 7d 0a 20 20 20 20 73 71 6c 69 74  OK ){}.    sqlit
ddf0: 65 33 5f 62 61 63 6b 75 70 5f 66 69 6e 69 73 68  e3_backup_finish
de00: 28 70 42 61 63 6b 75 70 29 3b 0a 20 20 20 20 69  (pBackup);.    i
de10: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
de20: 4e 45 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  NE ){.      rc =
de30: 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c   TCL_OK;.    }el
de40: 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  se{.      Tcl_Ap
de50: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
de60: 70 2c 20 22 62 61 63 6b 75 70 20 66 61 69 6c 65  p, "backup faile
de70: 64 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d: ",.          
de80: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
de90: 70 44 65 73 74 29 2c 20 28 63 68 61 72 2a 29 30  pDest), (char*)0
dea0: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43  );.      rc = TC
deb0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
dec0: 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
ded0: 28 70 44 65 73 74 29 3b 0a 20 20 20 20 62 72 65  (pDest);.    bre
dee0: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
def0: 20 24 64 62 20 62 75 73 79 20 3f 43 41 4c 4c 42   $db busy ?CALLB
df00: 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ACK?.  **.  ** I
df10: 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20  nvoke the given 
df20: 63 61 6c 6c 62 61 63 6b 20 69 66 20 61 6e 20 53  callback if an S
df30: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 74 74  QL statement att
df40: 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 0a 20 20  empts to open.  
df50: 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 64 61 74 61  ** a locked data
df60: 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  base file..  */.
df70: 20 20 63 61 73 65 20 44 42 5f 42 55 53 59 3a 20    case DB_BUSY: 
df80: 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33  {.    if( objc>3
df90: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
dfa0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
dfb0: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 43 41 4c  p, 2, objv, "CAL
dfc0: 4c 42 41 43 4b 22 29 3b 0a 20 20 20 20 20 20 72  LBACK");.      r
dfd0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
dfe0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
dff0: 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  bjc==2 ){.      
e000: 69 66 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29  if( pDb->zBusy )
e010: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  {.        Tcl_Ap
e020: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
e030: 70 2c 20 70 44 62 2d 3e 7a 42 75 73 79 2c 20 30  p, pDb->zBusy, 0
e040: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
e050: 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72  else{.      char
e060: 20 2a 7a 42 75 73 79 3b 0a 20 20 20 20 20 20 69   *zBusy;.      i
e070: 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66  nt len;.      if
e080: 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a  ( pDb->zBusy ){.
e090: 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65          Tcl_Free
e0a0: 28 70 44 62 2d 3e 7a 42 75 73 79 29 3b 0a 20 20  (pDb->zBusy);.  
e0b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 42 75 73      }.      zBus
e0c0: 79 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  y = Tcl_GetStrin
e0d0: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
e0e0: 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69  , &len);.      i
e0f0: 66 28 20 7a 42 75 73 79 20 26 26 20 6c 65 6e 3e  f( zBusy && len>
e100: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  0 ){.        pDb
e110: 2d 3e 7a 42 75 73 79 20 3d 20 54 63 6c 5f 41 6c  ->zBusy = Tcl_Al
e120: 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a  loc( len + 1 );.
e130: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
e140: 44 62 2d 3e 7a 42 75 73 79 2c 20 7a 42 75 73 79  Db->zBusy, zBusy
e150: 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20  , len+1);.      
e160: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
e170: 44 62 2d 3e 7a 42 75 73 79 20 3d 20 30 3b 0a 20  Db->zBusy = 0;. 
e180: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
e190: 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20   pDb->zBusy ){. 
e1a0: 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65         pDb->inte
e1b0: 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp = interp;.   
e1c0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73       sqlite3_bus
e1d0: 79 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64  y_handler(pDb->d
e1e0: 62 2c 20 44 62 42 75 73 79 48 61 6e 64 6c 65 72  b, DbBusyHandler
e1f0: 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65  , pDb);.      }e
e200: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
e210: 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65  ite3_busy_handle
e220: 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29  r(pDb->db, 0, 0)
e230: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
e240: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
e250: 20 20 2f 2a 20 20 20 20 20 24 64 62 20 63 61 63    /*     $db cac
e260: 68 65 20 66 6c 75 73 68 0a 20 20 2a 2a 20 20 20  he flush.  **   
e270: 20 20 24 64 62 20 63 61 63 68 65 20 73 69 7a 65    $db cache size
e280: 20 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6c 75   n.  **.  ** Flu
e290: 73 68 20 74 68 65 20 70 72 65 70 61 72 65 64 20  sh the prepared 
e2a0: 73 74 61 74 65 6d 65 6e 74 20 63 61 63 68 65 2c  statement cache,
e2b0: 20 6f 72 20 73 65 74 20 74 68 65 20 6d 61 78 69   or set the maxi
e2c0: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  mum number of.  
e2d0: 2a 2a 20 63 61 63 68 65 64 20 73 74 61 74 65 6d  ** cached statem
e2e0: 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  ents..  */.  cas
e2f0: 65 20 44 42 5f 43 41 43 48 45 3a 20 7b 0a 20 20  e DB_CACHE: {.  
e300: 20 20 63 68 61 72 20 2a 73 75 62 43 6d 64 3b 0a    char *subCmd;.
e310: 20 20 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 20 20      int n;..    
e320: 69 66 28 20 6f 62 6a 63 3c 3d 32 20 29 7b 0a 20  if( objc<=2 ){. 
e330: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
e340: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
e350: 20 6f 62 6a 76 2c 20 22 63 61 63 68 65 20 6f 70   objv, "cache op
e360: 74 69 6f 6e 20 3f 61 72 67 3f 22 29 3b 0a 20 20  tion ?arg?");.  
e370: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
e380: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
e390: 73 75 62 43 6d 64 20 3d 20 54 63 6c 5f 47 65 74  subCmd = Tcl_Get
e3a0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 20 6f  StringFromObj( o
e3b0: 62 6a 76 5b 32 5d 2c 20 30 20 29 3b 0a 20 20 20  bjv[2], 0 );.   
e3c0: 20 69 66 28 20 2a 73 75 62 43 6d 64 3d 3d 27 66   if( *subCmd=='f
e3d0: 27 20 26 26 20 73 74 72 63 6d 70 28 73 75 62 43  ' && strcmp(subC
e3e0: 6d 64 2c 22 66 6c 75 73 68 22 29 3d 3d 30 20 29  md,"flush")==0 )
e3f0: 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63  {.      if( objc
e400: 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 54  !=3 ){.        T
e410: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
e420: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
e430: 20 22 66 6c 75 73 68 22 29 3b 0a 20 20 20 20 20   "flush");.     
e440: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
e450: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ROR;.      }else
e460: 7b 0a 20 20 20 20 20 20 20 20 66 6c 75 73 68 53  {.        flushS
e470: 74 6d 74 43 61 63 68 65 28 20 70 44 62 20 29 3b  tmtCache( pDb );
e480: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
e490: 73 65 20 69 66 28 20 2a 73 75 62 43 6d 64 3d 3d  se if( *subCmd==
e4a0: 27 73 27 20 26 26 20 73 74 72 63 6d 70 28 73 75  's' && strcmp(su
e4b0: 62 43 6d 64 2c 22 73 69 7a 65 22 29 3d 3d 30 20  bCmd,"size")==0 
e4c0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a  ){.      if( obj
e4d0: 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20  c!=4 ){.        
e4e0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
e4f0: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
e500: 2c 20 22 73 69 7a 65 20 6e 22 29 3b 0a 20 20 20  , "size n");.   
e510: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
e520: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c  ERROR;.      }el
e530: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  se{.        if( 
e540: 54 43 4c 5f 45 52 52 4f 52 3d 3d 54 63 6c 5f 47  TCL_ERROR==Tcl_G
e550: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
e560: 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e  erp, objv[3], &n
e570: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  ) ){.          T
e580: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
e590: 20 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74   interp, "cannot
e5a0: 20 63 6f 6e 76 65 72 74 20 5c 22 22 2c 20 0a 20   convert \"", . 
e5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
e5c0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
e5d0: 62 6a 28 6f 62 6a 76 5b 33 5d 2c 30 29 2c 20 22  bj(objv[3],0), "
e5e0: 5c 22 20 74 6f 20 69 6e 74 65 67 65 72 22 2c 20  \" to integer", 
e5f0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  0);.          re
e600: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
e610: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
e620: 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 3c 30           if( n<0
e630: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
e640: 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28 20  flushStmtCache( 
e650: 70 44 62 20 29 3b 0a 20 20 20 20 20 20 20 20 20  pDb );.         
e660: 20 20 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20     n = 0;.      
e670: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3e      }else if( n>
e680: 4d 41 58 5f 50 52 45 50 41 52 45 44 5f 53 54 4d  MAX_PREPARED_STM
e690: 54 53 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  TS ){.          
e6a0: 20 20 6e 20 3d 20 4d 41 58 5f 50 52 45 50 41 52    n = MAX_PREPAR
e6b0: 45 44 5f 53 54 4d 54 53 3b 0a 20 20 20 20 20 20  ED_STMTS;.      
e6c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
e6d0: 70 44 62 2d 3e 6d 61 78 53 74 6d 74 20 3d 20 6e  pDb->maxStmt = n
e6e0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e6f0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
e700: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
e710: 65 73 75 6c 74 28 20 69 6e 74 65 72 70 2c 20 22  esult( interp, "
e720: 62 61 64 20 6f 70 74 69 6f 6e 20 5c 22 22 2c 20  bad option \"", 
e730: 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47  .          Tcl_G
e740: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
e750: 6f 62 6a 76 5b 32 5d 2c 30 29 2c 20 22 5c 22 3a  objv[2],0), "\":
e760: 20 6d 75 73 74 20 62 65 20 66 6c 75 73 68 20 6f   must be flush o
e770: 72 20 73 69 7a 65 22 2c 20 30 29 3b 0a 20 20 20  r size", 0);.   
e780: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
e790: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  ROR;.    }.    b
e7a0: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
e7b0: 20 20 20 20 24 64 62 20 63 68 61 6e 67 65 73 0a      $db changes.
e7c0: 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e    **.  ** Return
e7d0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
e7e0: 6f 77 73 20 74 68 61 74 20 77 65 72 65 20 6d 6f  ows that were mo
e7f0: 64 69 66 69 65 64 2c 20 69 6e 73 65 72 74 65 64  dified, inserted
e800: 2c 20 6f 72 20 64 65 6c 65 74 65 64 20 62 79 0a  , or deleted by.
e810: 20 20 2a 2a 20 74 68 65 20 6d 6f 73 74 20 72 65    ** the most re
e820: 63 65 6e 74 20 49 4e 53 45 52 54 2c 20 55 50 44  cent INSERT, UPD
e830: 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74  ATE or DELETE st
e840: 61 74 65 6d 65 6e 74 2c 20 6e 6f 74 20 69 6e 63  atement, not inc
e850: 6c 75 64 69 6e 67 20 0a 20 20 2a 2a 20 61 6e 79  luding .  ** any
e860: 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79   changes made by
e870: 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d   trigger program
e880: 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  s..  */.  case D
e890: 42 5f 43 48 41 4e 47 45 53 3a 20 7b 0a 20 20 20  B_CHANGES: {.   
e8a0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c   Tcl_Obj *pResul
e8b0: 74 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  t;.    if( objc!
e8c0: 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =2 ){.      Tcl_
e8d0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
e8e0: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22  erp, 2, objv, ""
e8f0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
e900: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
e910: 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54  .    pResult = T
e920: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_GetObjResult(
e930: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c  interp);.    Tcl
e940: 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52 65 73 75  _SetIntObj(pResu
e950: 6c 74 2c 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  lt, sqlite3_chan
e960: 67 65 73 28 70 44 62 2d 3e 64 62 29 29 3b 0a 20  ges(pDb->db));. 
e970: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
e980: 20 2f 2a 20 20 20 20 24 64 62 20 63 6c 6f 73 65   /*    $db close
e990: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 68 75 74 64  .  **.  ** Shutd
e9a0: 6f 77 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  own the database
e9b0: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
e9c0: 43 4c 4f 53 45 3a 20 7b 0a 20 20 20 20 54 63 6c  CLOSE: {.    Tcl
e9d0: 5f 44 65 6c 65 74 65 43 6f 6d 6d 61 6e 64 28 69  _DeleteCommand(i
e9e0: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
e9f0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
ea00: 5b 30 5d 2c 20 30 29 29 3b 0a 20 20 20 20 62 72  [0], 0));.    br
ea10: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
ea20: 20 2a 2a 20 20 20 20 20 24 64 62 20 63 6f 6c 6c   **     $db coll
ea30: 61 74 65 20 4e 41 4d 45 20 53 43 52 49 50 54 0a  ate NAME SCRIPT.
ea40: 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65 61 74 65    **.  ** Create
ea50: 20 61 20 6e 65 77 20 53 51 4c 20 63 6f 6c 6c 61   a new SQL colla
ea60: 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 63 61  tion function ca
ea70: 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 57 68 65 6e  lled NAME.  When
ea80: 65 76 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 66  ever.  ** that f
ea90: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
eaa0: 64 2c 20 69 6e 76 6f 6b 65 20 53 43 52 49 50 54  d, invoke SCRIPT
eab0: 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65   to evaluate the
eac0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a   function..  */.
ead0: 20 20 63 61 73 65 20 44 42 5f 43 4f 4c 4c 41 54    case DB_COLLAT
eae0: 45 3a 20 7b 0a 20 20 20 20 53 71 6c 43 6f 6c 6c  E: {.    SqlColl
eaf0: 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65 3b 0a 20  ate *pCollate;. 
eb00: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a     char *zName;.
eb10: 20 20 20 20 63 68 61 72 20 2a 7a 53 63 72 69 70      char *zScrip
eb20: 74 3b 0a 20 20 20 20 69 6e 74 20 6e 53 63 72 69  t;.    int nScri
eb30: 70 74 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  pt;.    if( objc
eb40: 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=4 ){.      Tcl
eb50: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
eb60: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
eb70: 4e 41 4d 45 20 53 43 52 49 50 54 22 29 3b 0a 20  NAME SCRIPT");. 
eb80: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
eb90: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
eba0: 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74   zName = Tcl_Get
ebb0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
ebc0: 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20 7a  jv[2], 0);.    z
ebd0: 53 63 72 69 70 74 20 3d 20 54 63 6c 5f 47 65 74  Script = Tcl_Get
ebe0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
ebf0: 6a 76 5b 33 5d 2c 20 26 6e 53 63 72 69 70 74 29  jv[3], &nScript)
ec00: 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 20 3d  ;.    pCollate =
ec10: 20 28 53 71 6c 43 6f 6c 6c 61 74 65 2a 29 54 63   (SqlCollate*)Tc
ec20: 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  l_Alloc( sizeof(
ec30: 2a 70 43 6f 6c 6c 61 74 65 29 20 2b 20 6e 53 63  *pCollate) + nSc
ec40: 72 69 70 74 20 2b 20 31 20 29 3b 0a 20 20 20 20  ript + 1 );.    
ec50: 69 66 28 20 70 43 6f 6c 6c 61 74 65 3d 3d 30 20  if( pCollate==0 
ec60: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
ec70: 4f 52 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65  OR;.    pCollate
ec80: 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  ->interp = inter
ec90: 70 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d  p;.    pCollate-
eca0: 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 70 43  >pNext = pDb->pC
ecb0: 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 70 43 6f 6c  ollate;.    pCol
ecc0: 6c 61 74 65 2d 3e 7a 53 63 72 69 70 74 20 3d 20  late->zScript = 
ecd0: 28 63 68 61 72 2a 29 26 70 43 6f 6c 6c 61 74 65  (char*)&pCollate
ece0: 5b 31 5d 3b 0a 20 20 20 20 70 44 62 2d 3e 70 43  [1];.    pDb->pC
ecf0: 6f 6c 6c 61 74 65 20 3d 20 70 43 6f 6c 6c 61 74  ollate = pCollat
ed00: 65 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 43  e;.    memcpy(pC
ed10: 6f 6c 6c 61 74 65 2d 3e 7a 53 63 72 69 70 74 2c  ollate->zScript,
ed20: 20 7a 53 63 72 69 70 74 2c 20 6e 53 63 72 69 70   zScript, nScrip
ed30: 74 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 73 71  t+1);.    if( sq
ed40: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
ed50: 6c 61 74 69 6f 6e 28 70 44 62 2d 3e 64 62 2c 20  lation(pDb->db, 
ed60: 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54  zName, SQLITE_UT
ed70: 46 38 2c 20 0a 20 20 20 20 20 20 20 20 70 43 6f  F8, .        pCo
ed80: 6c 6c 61 74 65 2c 20 74 63 6c 53 71 6c 43 6f 6c  llate, tclSqlCol
ed90: 6c 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20 54  late) ){.      T
eda0: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
edb0: 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c  erp, (char *)sql
edc0: 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d  ite3_errmsg(pDb-
edd0: 3e 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49  >db), TCL_VOLATI
ede0: 4c 45 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  LE);.      retur
edf0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
ee00: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
ee10: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
ee20: 20 24 64 62 20 63 6f 6c 6c 61 74 69 6f 6e 5f 6e   $db collation_n
ee30: 65 65 64 65 64 20 53 43 52 49 50 54 0a 20 20 2a  eeded SCRIPT.  *
ee40: 2a 0a 20 20 2a 2a 20 43 72 65 61 74 65 20 61 20  *.  ** Create a 
ee50: 6e 65 77 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f  new SQL collatio
ee60: 6e 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65  n function calle
ee70: 64 20 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76 65  d NAME.  Wheneve
ee80: 72 0a 20 20 2a 2a 20 74 68 61 74 20 66 75 6e 63  r.  ** that func
ee90: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
eea0: 69 6e 76 6f 6b 65 20 53 43 52 49 50 54 20 74 6f  invoke SCRIPT to
eeb0: 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 66 75   evaluate the fu
eec0: 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63  nction..  */.  c
eed0: 61 73 65 20 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e  ase DB_COLLATION
eee0: 5f 4e 45 45 44 45 44 3a 20 7b 0a 20 20 20 20 69  _NEEDED: {.    i
eef0: 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
ef00: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
ef10: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
ef20: 6f 62 6a 76 2c 20 22 53 43 52 49 50 54 22 29 3b  objv, "SCRIPT");
ef30: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
ef40: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
ef50: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 43 6f 6c     if( pDb->pCol
ef60: 6c 61 74 65 4e 65 65 64 65 64 20 29 7b 0a 20 20  lateNeeded ){.  
ef70: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
ef80: 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c 61  ount(pDb->pColla
ef90: 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 7d  teNeeded);.    }
efa0: 0a 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61  .    pDb->pColla
efb0: 74 65 4e 65 65 64 65 64 20 3d 20 54 63 6c 5f 44  teNeeded = Tcl_D
efc0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 6f 62 6a 76  uplicateObj(objv
efd0: 5b 32 5d 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e  [2]);.    Tcl_In
efe0: 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e  crRefCount(pDb->
eff0: 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b  pCollateNeeded);
f000: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c  .    sqlite3_col
f010: 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28 70 44  lation_needed(pD
f020: 62 2d 3e 64 62 2c 20 70 44 62 2c 20 74 63 6c 43  b->db, pDb, tclC
f030: 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20  ollateNeeded);. 
f040: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
f050: 20 2f 2a 20 20 20 20 24 64 62 20 63 6f 6d 6d 69   /*    $db commi
f060: 74 5f 68 6f 6f 6b 20 3f 43 41 4c 4c 42 41 43 4b  t_hook ?CALLBACK
f070: 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f  ?.  **.  ** Invo
f080: 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c  ke the given cal
f090: 6c 62 61 63 6b 20 6a 75 73 74 20 62 65 66 6f 72  lback just befor
f0a0: 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 65 76 65  e committing eve
f0b0: 72 79 20 53 51 4c 20 74 72 61 6e 73 61 63 74 69  ry SQL transacti
f0c0: 6f 6e 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20  on..  ** If the 
f0d0: 63 61 6c 6c 62 61 63 6b 20 74 68 72 6f 77 73 20  callback throws 
f0e0: 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 6f 72 20  an exception or 
f0f0: 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  returns non-zero
f100: 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20  , then the.  ** 
f110: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
f120: 62 6f 72 74 65 64 2e 20 20 49 66 20 43 41 4c 4c  borted.  If CALL
f130: 42 41 43 4b 20 69 73 20 61 6e 20 65 6d 70 74 79  BACK is an empty
f140: 20 73 74 72 69 6e 67 2c 20 74 68 65 20 63 61 6c   string, the cal
f150: 6c 62 61 63 6b 0a 20 20 2a 2a 20 69 73 20 64 69  lback.  ** is di
f160: 73 61 62 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 63  sabled..  */.  c
f170: 61 73 65 20 44 42 5f 43 4f 4d 4d 49 54 5f 48 4f  ase DB_COMMIT_HO
f180: 4f 4b 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62  OK: {.    if( ob
f190: 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63  jc>3 ){.      Tc
f1a0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
f1b0: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
f1c0: 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20  "?CALLBACK?");. 
f1d0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
f1e0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65  ERROR;.    }else
f1f0: 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a   if( objc==2 ){.
f200: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
f210: 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  Commit ){.      
f220: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
f230: 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e  lt(interp, pDb->
f240: 7a 43 6f 6d 6d 69 74 2c 20 30 29 3b 0a 20 20 20  zCommit, 0);.   
f250: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
f260: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6d        char *zCom
f270: 6d 69 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c  mit;.      int l
f280: 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44  en;.      if( pD
f290: 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  b->zCommit ){.  
f2a0: 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70        Tcl_Free(p
f2b0: 44 62 2d 3e 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20  Db->zCommit);.  
f2c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 43 6f 6d      }.      zCom
f2d0: 6d 69 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  mit = Tcl_GetStr
f2e0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
f2f0: 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20  2], &len);.     
f300: 20 69 66 28 20 7a 43 6f 6d 6d 69 74 20 26 26 20   if( zCommit && 
f310: 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  len>0 ){.       
f320: 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20   pDb->zCommit = 
f330: 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b  Tcl_Alloc( len +
f340: 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65   1 );.        me
f350: 6d 63 70 79 28 70 44 62 2d 3e 7a 43 6f 6d 6d 69  mcpy(pDb->zCommi
f360: 74 2c 20 7a 43 6f 6d 6d 69 74 2c 20 6c 65 6e 2b  t, zCommit, len+
f370: 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
f380: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 43  .        pDb->zC
f390: 6f 6d 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  ommit = 0;.     
f3a0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44 62   }.      if( pDb
f3b0: 2d 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20  ->zCommit ){.   
f3c0: 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70       pDb->interp
f3d0: 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20   = interp;.     
f3e0: 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69     sqlite3_commi
f3f0: 74 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20  t_hook(pDb->db, 
f400: 44 62 43 6f 6d 6d 69 74 48 61 6e 64 6c 65 72 2c  DbCommitHandler,
f410: 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c   pDb);.      }el
f420: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
f430: 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28  te3_commit_hook(
f440: 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a  pDb->db, 0, 0);.
f450: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
f460: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
f470: 2f 2a 20 20 20 20 24 64 62 20 63 6f 6d 70 6c 65  /*    $db comple
f480: 74 65 20 53 51 4c 0a 20 20 2a 2a 0a 20 20 2a 2a  te SQL.  **.  **
f490: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
f4a0: 53 51 4c 20 69 73 20 61 20 63 6f 6d 70 6c 65 74  SQL is a complet
f4b0: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  e SQL statement.
f4c0: 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69    Return FALSE i
f4d0: 66 0a 20 20 2a 2a 20 61 64 64 69 74 69 6f 6e 61  f.  ** additiona
f4e0: 6c 20 6c 69 6e 65 73 20 6f 66 20 69 6e 70 75 74  l lines of input
f4f0: 20 61 72 65 20 6e 65 65 64 65 64 2e 20 20 54 68   are needed.  Th
f500: 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  is is similar to
f510: 20 74 68 65 0a 20 20 2a 2a 20 62 75 69 6c 74 2d   the.  ** built-
f520: 69 6e 20 22 69 6e 66 6f 20 63 6f 6d 70 6c 65 74  in "info complet
f530: 65 22 20 63 6f 6d 6d 61 6e 64 20 6f 66 20 54 63  e" command of Tc
f540: 6c 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  l..  */.  case D
f550: 42 5f 43 4f 4d 50 4c 45 54 45 3a 20 7b 0a 23 69  B_COMPLETE: {.#i
f560: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f570: 54 5f 43 4f 4d 50 4c 45 54 45 0a 20 20 20 20 54  T_COMPLETE.    T
f580: 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b  cl_Obj *pResult;
f590: 0a 20 20 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c  .    int isCompl
f5a0: 65 74 65 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a  ete;.    if( obj
f5b0: 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=3 ){.      Tc
f5c0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
f5d0: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
f5e0: 22 53 51 4c 22 29 3b 0a 20 20 20 20 20 20 72 65  "SQL");.      re
f5f0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
f600: 20 20 20 20 7d 0a 20 20 20 20 69 73 43 6f 6d 70      }.    isComp
f610: 6c 65 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63  lete = sqlite3_c
f620: 6f 6d 70 6c 65 74 65 28 20 54 63 6c 5f 47 65 74  omplete( Tcl_Get
f630: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
f640: 6a 76 5b 32 5d 2c 20 30 29 20 29 3b 0a 20 20 20  jv[2], 0) );.   
f650: 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47   pResult = Tcl_G
f660: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
f670: 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  rp);.    Tcl_Set
f680: 42 6f 6f 6c 65 61 6e 4f 62 6a 28 70 52 65 73 75  BooleanObj(pResu
f690: 6c 74 2c 20 69 73 43 6f 6d 70 6c 65 74 65 29 3b  lt, isComplete);
f6a0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61  .#endif.    brea
f6b0: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
f6c0: 24 64 62 20 63 6f 70 79 20 63 6f 6e 66 6c 69 63  $db copy conflic
f6d0: 74 2d 61 6c 67 6f 72 69 74 68 6d 20 74 61 62 6c  t-algorithm tabl
f6e0: 65 20 66 69 6c 65 6e 61 6d 65 20 3f 53 45 50 41  e filename ?SEPA
f6f0: 52 41 54 4f 52 3f 20 3f 4e 55 4c 4c 49 4e 44 49  RATOR? ?NULLINDI
f700: 43 41 54 4f 52 3f 0a 20 20 2a 2a 0a 20 20 2a 2a  CATOR?.  **.  **
f710: 20 43 6f 70 79 20 64 61 74 61 20 69 6e 74 6f 20   Copy data into 
f720: 74 61 62 6c 65 20 66 72 6f 6d 20 66 69 6c 65 6e  table from filen
f730: 61 6d 65 2c 20 6f 70 74 69 6f 6e 61 6c 6c 79 20  ame, optionally 
f740: 75 73 69 6e 67 20 53 45 50 41 52 41 54 4f 52 0a  using SEPARATOR.
f750: 20 20 2a 2a 20 61 73 20 63 6f 6c 75 6d 6e 20 73    ** as column s
f760: 65 70 61 72 61 74 6f 72 73 2e 20 20 49 66 20 61  eparators.  If a
f770: 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73   column contains
f780: 20 61 20 6e 75 6c 6c 20 73 74 72 69 6e 67 2c 20   a null string, 
f790: 6f 72 20 74 68 65 0a 20 20 2a 2a 20 76 61 6c 75  or the.  ** valu
f7a0: 65 20 6f 66 20 4e 55 4c 4c 49 4e 44 49 43 41 54  e of NULLINDICAT
f7b0: 4f 52 2c 20 61 20 4e 55 4c 4c 20 69 73 20 69 6e  OR, a NULL is in
f7c0: 73 65 72 74 65 64 20 66 6f 72 20 74 68 65 20 63  serted for the c
f7d0: 6f 6c 75 6d 6e 2e 0a 20 20 2a 2a 20 63 6f 6e 66  olumn..  ** conf
f7e0: 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20 69  lict-algorithm i
f7f0: 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 71 6c  s one of the sql
f800: 69 74 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67  ite conflict alg
f810: 6f 72 69 74 68 6d 73 3a 0a 20 20 2a 2a 20 20 20  orithms:.  **   
f820: 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 62 6f 72 74   rollback, abort
f830: 2c 20 66 61 69 6c 2c 20 69 67 6e 6f 72 65 2c 20  , fail, ignore, 
f840: 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 4f 6e 20  replace.  ** On 
f850: 73 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20  success, return 
f860: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 69  the number of li
f870: 6e 65 73 20 70 72 6f 63 65 73 73 65 64 2c 20 6e  nes processed, n
f880: 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 73  ot necessarily s
f890: 61 6d 65 0a 20 20 2a 2a 20 61 73 20 27 64 62 20  ame.  ** as 'db 
f8a0: 63 68 61 6e 67 65 73 27 20 64 75 65 20 74 6f 20  changes' due to 
f8b0: 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74  conflict-algorit
f8c0: 68 6d 20 73 65 6c 65 63 74 65 64 2e 0a 20 20 2a  hm selected..  *
f8d0: 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65  *.  ** This code
f8e0: 20 69 73 20 62 61 73 69 63 61 6c 6c 79 20 61 6e   is basically an
f8f0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2f   implementation/
f900: 65 6e 68 61 6e 63 65 6d 65 6e 74 20 6f 66 0a 20  enhancement of. 
f910: 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 20   ** the sqlite3 
f920: 73 68 65 6c 6c 2e 63 20 22 2e 69 6d 70 6f 72 74  shell.c ".import
f930: 22 20 63 6f 6d 6d 61 6e 64 2e 0a 20 20 2a 2a 0a  " command..  **.
f940: 20 20 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e    ** This comman
f950: 64 20 75 73 61 67 65 20 69 73 20 65 71 75 69 76  d usage is equiv
f960: 61 6c 65 6e 74 20 74 6f 20 74 68 65 20 73 71 6c  alent to the sql
f970: 69 74 65 32 2e 78 20 43 4f 50 59 20 73 74 61 74  ite2.x COPY stat
f980: 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 77 68 69 63  ement,.  ** whic
f990: 68 20 69 6d 70 6f 72 74 73 20 66 69 6c 65 20 64  h imports file d
f9a0: 61 74 61 20 69 6e 74 6f 20 61 20 74 61 62 6c 65  ata into a table
f9b0: 20 75 73 69 6e 67 20 74 68 65 20 50 6f 73 74 67   using the Postg
f9c0: 72 65 53 51 4c 20 43 4f 50 59 20 66 69 6c 65 20  reSQL COPY file 
f9d0: 66 6f 72 6d 61 74 3a 0a 20 20 2a 2a 20 20 20 24  format:.  **   $
f9e0: 64 62 20 63 6f 70 79 20 24 63 6f 6e 66 6c 69 74  db copy $conflit
f9f0: 5f 61 6c 67 6f 20 24 74 61 62 6c 65 5f 6e 61 6d  _algo $table_nam
fa00: 65 20 24 66 69 6c 65 6e 61 6d 65 20 5c 74 20 5c  e $filename \t \
fa10: 5c 4e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  \N.  */.  case D
fa20: 42 5f 43 4f 50 59 3a 20 7b 0a 20 20 20 20 63 68  B_COPY: {.    ch
fa30: 61 72 20 2a 7a 54 61 62 6c 65 3b 20 20 20 20 20  ar *zTable;     
fa40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73            /* Ins
fa50: 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68  ert data into th
fa60: 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  is table */.    
fa70: 63 68 61 72 20 2a 7a 46 69 6c 65 3b 20 20 20 20  char *zFile;    
fa80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
fa90: 68 65 20 66 69 6c 65 20 66 72 6f 6d 20 77 68 69  he file from whi
faa0: 63 68 20 74 6f 20 65 78 74 72 61 63 74 20 64 61  ch to extract da
fab0: 74 61 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  ta */.    char *
fac0: 7a 43 6f 6e 66 6c 69 63 74 3b 20 20 20 20 20 20  zConflict;      
fad0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
fae0: 66 6c 69 63 74 20 61 6c 67 6f 72 69 74 68 6d 20  flict algorithm 
faf0: 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 73 71  to use */.    sq
fb00: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
fb10: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73  t;        /* A s
fb20: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
fb30: 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20  int nCol;       
fb40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
fb50: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
fb60: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   in the table */
fb70: 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 20  .    int nByte; 
fb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb90: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
fba0: 74 65 73 20 69 6e 20 61 6e 20 53 51 4c 20 73 74  tes in an SQL st
fbb0: 72 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ring */.    int 
fbc0: 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
fbd0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
fbe0: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 20 20  counters */.    
fbf0: 69 6e 74 20 6e 53 65 70 3b 20 20 20 20 20 20 20  int nSep;       
fc00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
fc10: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
fc20: 6e 20 7a 53 65 70 5b 5d 20 2a 2f 0a 20 20 20 20  n zSep[] */.    
fc30: 69 6e 74 20 6e 4e 75 6c 6c 3b 20 20 20 20 20 20  int nNull;      
fc40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
fc50: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
fc60: 6e 20 7a 4e 75 6c 6c 5b 5d 20 2a 2f 0a 20 20 20  n zNull[] */.   
fc70: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20   char *zSql;    
fc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fc90: 41 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  An SQL statement
fca0: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c   */.    char *zL
fcb0: 69 6e 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ine;            
fcc0: 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
fcd0: 6c 69 6e 65 20 6f 66 20 69 6e 70 75 74 20 66 72  line of input fr
fce0: 6f 6d 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20  om the file */. 
fcf0: 20 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 3b     char **azCol;
fd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fd10: 2a 20 7a 4c 69 6e 65 5b 5d 20 62 72 6f 6b 65 6e  * zLine[] broken
fd20: 20 75 70 20 69 6e 74 6f 20 63 6f 6c 75 6d 6e 73   up into columns
fd30: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 43   */.    char *zC
fd40: 6f 6d 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20  ommit;          
fd50: 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 63 6f      /* How to co
fd60: 6d 6d 69 74 20 63 68 61 6e 67 65 73 20 2a 2f 0a  mmit changes */.
fd70: 20 20 20 20 46 49 4c 45 20 2a 69 6e 3b 20 20 20      FILE *in;   
fd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd90: 2f 2a 20 54 68 65 20 69 6e 70 75 74 20 66 69 6c  /* The input fil
fda0: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 69 6e  e */.    int lin
fdb0: 65 6e 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20  eno = 0;        
fdc0: 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d       /* Line num
fdd0: 62 65 72 20 6f 66 20 69 6e 70 75 74 20 66 69 6c  ber of input fil
fde0: 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 7a 4c  e */.    char zL
fdf0: 69 6e 65 4e 75 6d 5b 38 30 5d 3b 20 20 20 20 20  ineNum[80];     
fe00: 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d       /* Line num
fe10: 62 65 72 20 70 72 69 6e 74 20 62 75 66 66 65 72  ber print buffer
fe20: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20   */.    Tcl_Obj 
fe30: 2a 70 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20  *pResult;       
fe40: 20 20 20 20 2f 2a 20 69 6e 74 65 72 70 20 72 65      /* interp re
fe50: 73 75 6c 74 20 2a 2f 0a 0a 20 20 20 20 63 68 61  sult */..    cha
fe60: 72 20 2a 7a 53 65 70 3b 0a 20 20 20 20 63 68 61  r *zSep;.    cha
fe70: 72 20 2a 7a 4e 75 6c 6c 3b 0a 20 20 20 20 69 66  r *zNull;.    if
fe80: 28 20 6f 62 6a 63 3c 35 20 7c 7c 20 6f 62 6a 63  ( objc<5 || objc
fe90: 3e 37 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  >7 ){.      Tcl_
fea0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
feb0: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 0a 20  erp, 2, objv, . 
fec0: 20 20 20 20 20 20 20 20 22 43 4f 4e 46 4c 49 43          "CONFLIC
fed0: 54 2d 41 4c 47 4f 52 49 54 48 4d 20 54 41 42 4c  T-ALGORITHM TABL
fee0: 45 20 46 49 4c 45 4e 41 4d 45 20 3f 53 45 50 41  E FILENAME ?SEPA
fef0: 52 41 54 4f 52 3f 20 3f 4e 55 4c 4c 49 4e 44 49  RATOR? ?NULLINDI
ff00: 43 41 54 4f 52 3f 22 29 3b 0a 20 20 20 20 20 20  CATOR?");.      
ff10: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
ff20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
ff30: 6f 62 6a 63 3e 3d 36 20 29 7b 0a 20 20 20 20 20  objc>=6 ){.     
ff40: 20 7a 53 65 70 20 3d 20 54 63 6c 5f 47 65 74 53   zSep = Tcl_GetS
ff50: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
ff60: 76 5b 35 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 65  v[5], 0);.    }e
ff70: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 53 65 70 20  lse{.      zSep 
ff80: 3d 20 22 5c 74 22 3b 0a 20 20 20 20 7d 0a 20 20  = "\t";.    }.  
ff90: 20 20 69 66 28 20 6f 62 6a 63 3e 3d 37 20 29 7b    if( objc>=7 ){
ffa0: 0a 20 20 20 20 20 20 7a 4e 75 6c 6c 20 3d 20 54  .      zNull = T
ffb0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
ffc0: 4f 62 6a 28 6f 62 6a 76 5b 36 5d 2c 20 30 29 3b  Obj(objv[6], 0);
ffd0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
ffe0: 20 20 7a 4e 75 6c 6c 20 3d 20 22 22 3b 0a 20 20    zNull = "";.  
fff0: 20 20 7d 0a 20 20 20 20 7a 43 6f 6e 66 6c 69 63    }.    zConflic
10000 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  t = Tcl_GetStrin
10010 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
10020 2c 20 30 29 3b 0a 20 20 20 20 7a 54 61 62 6c 65  , 0);.    zTable
10030 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
10040 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c  FromObj(objv[3],
10050 20 30 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d   0);.    zFile =
10060 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
10070 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 34 5d 2c 20 30  omObj(objv[4], 0
10080 29 3b 0a 20 20 20 20 6e 53 65 70 20 3d 20 73 74  );.    nSep = st
10090 72 6c 65 6e 33 30 28 7a 53 65 70 29 3b 0a 20 20  rlen30(zSep);.  
100a0 20 20 6e 4e 75 6c 6c 20 3d 20 73 74 72 6c 65 6e    nNull = strlen
100b0 33 30 28 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 69  30(zNull);.    i
100c0 66 28 20 6e 53 65 70 3d 3d 30 20 29 7b 0a 20 20  f( nSep==0 ){.  
100d0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
100e0 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72  sult(interp,"Err
100f0 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20 73 65 70  or: non-null sep
10100 61 72 61 74 6f 72 20 72 65 71 75 69 72 65 64 20  arator required 
10110 66 6f 72 20 63 6f 70 79 22 2c 30 29 3b 0a 20 20  for copy",0);.  
10120 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
10130 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
10140 69 66 28 73 74 72 63 6d 70 28 7a 43 6f 6e 66 6c  if(strcmp(zConfl
10150 69 63 74 2c 20 22 72 6f 6c 6c 62 61 63 6b 22 29  ict, "rollback")
10160 20 21 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20   != 0 &&.       
10170 73 74 72 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74  strcmp(zConflict
10180 2c 20 22 61 62 6f 72 74 22 20 20 20 29 20 21 3d  , "abort"   ) !=
10190 20 30 20 26 26 0a 20 20 20 20 20 20 20 73 74 72   0 &&.       str
101a0 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22  cmp(zConflict, "
101b0 66 61 69 6c 22 20 20 20 20 29 20 21 3d 20 30 20  fail"    ) != 0 
101c0 26 26 0a 20 20 20 20 20 20 20 73 74 72 63 6d 70  &&.       strcmp
101d0 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 69 67 6e  (zConflict, "ign
101e0 6f 72 65 22 20 20 29 20 21 3d 20 30 20 26 26 0a  ore"  ) != 0 &&.
101f0 20 20 20 20 20 20 20 73 74 72 63 6d 70 28 7a 43         strcmp(zC
10200 6f 6e 66 6c 69 63 74 2c 20 22 72 65 70 6c 61 63  onflict, "replac
10210 65 22 20 29 20 21 3d 20 30 20 29 20 7b 0a 20 20  e" ) != 0 ) {.  
10220 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
10230 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72  sult(interp, "Er
10240 72 6f 72 3a 20 5c 22 22 2c 20 7a 43 6f 6e 66 6c  ror: \"", zConfl
10250 69 63 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ict, .          
10260 20 20 22 5c 22 2c 20 63 6f 6e 66 6c 69 63 74 2d    "\", conflict-
10270 61 6c 67 6f 72 69 74 68 6d 20 6d 75 73 74 20 62  algorithm must b
10280 65 20 6f 6e 65 20 6f 66 3a 20 72 6f 6c 6c 62 61  e one of: rollba
10290 63 6b 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20  ck, ".          
102a0 20 20 22 61 62 6f 72 74 2c 20 66 61 69 6c 2c 20    "abort, fail, 
102b0 69 67 6e 6f 72 65 2c 20 6f 72 20 72 65 70 6c 61  ignore, or repla
102c0 63 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  ce", 0);.      r
102d0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
102e0 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20  .    }.    zSql 
102f0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
10300 66 28 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  f("SELECT * FROM
10310 20 27 25 71 27 22 2c 20 7a 54 61 62 6c 65 29 3b   '%q'", zTable);
10320 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  .    if( zSql==0
10330 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
10340 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
10350 70 2c 20 22 45 72 72 6f 72 3a 20 6e 6f 20 73 75  p, "Error: no su
10360 63 68 20 74 61 62 6c 65 3a 20 22 2c 20 7a 54 61  ch table: ", zTa
10370 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  ble, 0);.      r
10380 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10390 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65  .    }.    nByte
103a0 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c   = strlen30(zSql
103b0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
103c0 74 65 33 5f 70 72 65 70 61 72 65 28 70 44 62 2d  te3_prepare(pDb-
103d0 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  >db, zSql, -1, &
103e0 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73  pStmt, 0);.    s
103f0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
10400 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
10410 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
10420 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
10430 22 45 72 72 6f 72 3a 20 22 2c 20 73 71 6c 69 74  "Error: ", sqlit
10440 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64  e3_errmsg(pDb->d
10450 62 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 6e 43  b), 0);.      nC
10460 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ol = 0;.    }els
10470 65 7b 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20  e{.      nCol = 
10480 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
10490 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20  ount(pStmt);.   
104a0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
104b0 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
104c0 20 20 20 20 69 66 28 20 6e 43 6f 6c 3d 3d 30 20      if( nCol==0 
104d0 29 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ) {.      return
104e0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
104f0 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20 6d 61 6c  }.    zSql = mal
10500 6c 6f 63 28 20 6e 42 79 74 65 20 2b 20 35 30 20  loc( nByte + 50 
10510 2b 20 6e 43 6f 6c 2a 32 20 29 3b 0a 20 20 20 20  + nCol*2 );.    
10520 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20 7b 0a  if( zSql==0 ) {.
10530 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
10540 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
10550 45 72 72 6f 72 3a 20 63 61 6e 27 74 20 6d 61 6c  Error: can't mal
10560 6c 6f 63 28 29 22 2c 20 30 29 3b 0a 20 20 20 20  loc()", 0);.    
10570 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
10580 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  OR;.    }.    sq
10590 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
105a0 42 79 74 65 2b 35 30 2c 20 7a 53 71 6c 2c 20 22  Byte+50, zSql, "
105b0 49 4e 53 45 52 54 20 4f 52 20 25 71 20 49 4e 54  INSERT OR %q INT
105c0 4f 20 27 25 71 27 20 56 41 4c 55 45 53 28 3f 22  O '%q' VALUES(?"
105d0 2c 0a 20 20 20 20 20 20 20 20 20 7a 43 6f 6e 66  ,.         zConf
105e0 6c 69 63 74 2c 20 7a 54 61 62 6c 65 29 3b 0a 20  lict, zTable);. 
105f0 20 20 20 6a 20 3d 20 73 74 72 6c 65 6e 33 30 28     j = strlen30(
10600 7a 53 71 6c 29 3b 0a 20 20 20 20 66 6f 72 28 69  zSql);.    for(i
10610 3d 31 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =1; i<nCol; i++)
10620 7b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b  {.      zSql[j++
10630 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 7a  ] = ',';.      z
10640 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 3f 27 3b 0a  Sql[j++] = '?';.
10650 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 5b 6a      }.    zSql[j
10660 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20 7a  ++] = ')';.    z
10670 53 71 6c 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20  Sql[j] = 0;.    
10680 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
10690 70 61 72 65 28 70 44 62 2d 3e 64 62 2c 20 7a 53  pare(pDb->db, zS
106a0 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
106b0 30 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 53 71  0);.    free(zSq
106c0 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  l);.    if( rc )
106d0 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
106e0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
106f0 20 22 45 72 72 6f 72 3a 20 22 2c 20 73 71 6c 69   "Error: ", sqli
10700 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
10710 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  db), 0);.      s
10720 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
10730 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 65  pStmt);.      re
10740 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
10750 20 20 20 20 7d 0a 20 20 20 20 69 6e 20 3d 20 66      }.    in = f
10760 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 22 72 62 22  open(zFile, "rb"
10770 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 3d 3d 30  );.    if( in==0
10780 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
10790 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
107a0 70 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f  p, "Error: canno
107b0 74 20 6f 70 65 6e 20 66 69 6c 65 3a 20 22 2c 20  t open file: ", 
107c0 7a 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 20 20  zFile, NULL);.  
107d0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
107e0 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
107f0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
10800 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ROR;.    }.    a
10810 7a 43 6f 6c 20 3d 20 6d 61 6c 6c 6f 63 28 20 73  zCol = malloc( s
10820 69 7a 65 6f 66 28 61 7a 43 6f 6c 5b 30 5d 29 2a  izeof(azCol[0])*
10830 28 6e 43 6f 6c 2b 31 29 20 29 3b 0a 20 20 20 20  (nCol+1) );.    
10840 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 20 7b  if( azCol==0 ) {
10850 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
10860 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
10870 22 45 72 72 6f 72 3a 20 63 61 6e 27 74 20 6d 61  "Error: can't ma
10880 6c 6c 6f 63 28 29 22 2c 20 30 29 3b 0a 20 20 20  lloc()", 0);.   
10890 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20     fclose(in);. 
108a0 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
108b0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
108c0 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f 65   (void)sqlite3_e
108d0 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 22 42 45  xec(pDb->db, "BE
108e0 47 49 4e 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  GIN", 0, 0, 0);.
108f0 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 43      zCommit = "C
10900 4f 4d 4d 49 54 22 3b 0a 20 20 20 20 77 68 69 6c  OMMIT";.    whil
10910 65 28 20 28 7a 4c 69 6e 65 20 3d 20 6c 6f 63 61  e( (zLine = loca
10920 6c 5f 67 65 74 6c 69 6e 65 28 30 2c 20 69 6e 29  l_getline(0, in)
10930 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68  )!=0 ){.      ch
10940 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 6c 69 6e  ar *z;.      lin
10950 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 61 7a 43  eno++;.      azC
10960 6f 6c 5b 30 5d 20 3d 20 7a 4c 69 6e 65 3b 0a 20  ol[0] = zLine;. 
10970 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 7a 3d       for(i=0, z=
10980 7a 4c 69 6e 65 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b  zLine; *z; z++){
10990 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 7a 3d  .        if( *z=
109a0 3d 7a 53 65 70 5b 30 5d 20 26 26 20 73 74 72 6e  =zSep[0] && strn
109b0 63 6d 70 28 7a 2c 20 7a 53 65 70 2c 20 6e 53 65  cmp(z, zSep, nSe
109c0 70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  p)==0 ){.       
109d0 20 20 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 20     *z = 0;.     
109e0 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
109f0 20 20 20 20 69 66 28 20 69 3c 6e 43 6f 6c 20 29      if( i<nCol )
10a00 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 7a  {.            az
10a10 43 6f 6c 5b 69 5d 20 3d 20 26 7a 5b 6e 53 65 70  Col[i] = &z[nSep
10a20 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  ];.            z
10a30 20 2b 3d 20 6e 53 65 70 2d 31 3b 0a 20 20 20 20   += nSep-1;.    
10a40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
10a50 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
10a60 69 66 28 20 69 2b 31 21 3d 6e 43 6f 6c 20 29 7b  if( i+1!=nCol ){
10a70 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
10a80 45 72 72 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  Err;.        int
10a90 20 6e 45 72 72 20 3d 20 73 74 72 6c 65 6e 33 30   nErr = strlen30
10aa0 28 7a 46 69 6c 65 29 20 2b 20 32 30 30 3b 0a 20  (zFile) + 200;. 
10ab0 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20 6d 61         zErr = ma
10ac0 6c 6c 6f 63 28 6e 45 72 72 29 3b 0a 20 20 20 20  lloc(nErr);.    
10ad0 20 20 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a      if( zErr ){.
10ae0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
10af0 33 5f 73 6e 70 72 69 6e 74 66 28 6e 45 72 72 2c  3_snprintf(nErr,
10b00 20 7a 45 72 72 2c 0a 20 20 20 20 20 20 20 20 20   zErr,.         
10b10 20 20 20 20 22 45 72 72 6f 72 3a 20 25 73 20 6c      "Error: %s l
10b20 69 6e 65 20 25 64 3a 20 65 78 70 65 63 74 65 64  ine %d: expected
10b30 20 25 64 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64   %d columns of d
10b40 61 74 61 20 62 75 74 20 66 6f 75 6e 64 20 25 64  ata but found %d
10b50 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
10b60 7a 46 69 6c 65 2c 20 6c 69 6e 65 6e 6f 2c 20 6e  zFile, lineno, n
10b70 43 6f 6c 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20  Col, i+1);.     
10b80 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
10b90 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45  esult(interp, zE
10ba0 72 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  rr, 0);.        
10bb0 20 20 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20    free(zErr);.  
10bc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
10bd0 7a 43 6f 6d 6d 69 74 20 3d 20 22 52 4f 4c 4c 42  zCommit = "ROLLB
10be0 41 43 4b 22 3b 0a 20 20 20 20 20 20 20 20 62 72  ACK";.        br
10bf0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
10c00 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
10c10 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
10c20 20 20 2f 2a 20 63 68 65 63 6b 20 66 6f 72 20 6e    /* check for n
10c30 75 6c 6c 20 64 61 74 61 2c 20 69 66 20 73 6f 2c  ull data, if so,
10c40 20 62 69 6e 64 20 61 73 20 6e 75 6c 6c 20 2a 2f   bind as null */
10c50 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6e 4e  .        if( (nN
10c60 75 6c 6c 3e 30 20 26 26 20 73 74 72 63 6d 70 28  ull>0 && strcmp(
10c70 61 7a 43 6f 6c 5b 69 5d 2c 20 7a 4e 75 6c 6c 29  azCol[i], zNull)
10c80 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20 7c  ==0).          |
10c90 7c 20 73 74 72 6c 65 6e 33 30 28 61 7a 43 6f 6c  | strlen30(azCol
10ca0 5b 69 5d 29 3d 3d 30 20 0a 20 20 20 20 20 20 20  [i])==0 .       
10cb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
10cc0 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28  lite3_bind_null(
10cd0 70 53 74 6d 74 2c 20 69 2b 31 29 3b 0a 20 20 20  pStmt, i+1);.   
10ce0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
10cf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
10d00 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69  nd_text(pStmt, i
10d10 2b 31 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 20 2d 31  +1, azCol[i], -1
10d20 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
10d30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10d40 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
10d50 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20  3_step(pStmt);. 
10d60 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
10d70 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a  3_reset(pStmt);.
10d80 20 20 20 20 20 20 66 72 65 65 28 7a 4c 69 6e 65        free(zLine
10d90 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
10da0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10db0 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
10dc0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45  Result(interp,"E
10dd0 72 72 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65 33  rror: ", sqlite3
10de0 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29  _errmsg(pDb->db)
10df0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7a 43  , 0);.        zC
10e00 6f 6d 6d 69 74 20 3d 20 22 52 4f 4c 4c 42 41 43  ommit = "ROLLBAC
10e10 4b 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  K";.        brea
10e20 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
10e30 0a 20 20 20 20 66 72 65 65 28 61 7a 43 6f 6c 29  .    free(azCol)
10e40 3b 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29  ;.    fclose(in)
10e50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
10e60 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
10e70 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33     (void)sqlite3
10e80 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a  _exec(pDb->db, z
10e90 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 2c 20 30 29  Commit, 0, 0, 0)
10ea0 3b 0a 0a 20 20 20 20 69 66 28 20 7a 43 6f 6d 6d  ;..    if( zComm
10eb0 69 74 5b 30 5d 20 3d 3d 20 27 43 27 20 29 7b 0a  it[0] == 'C' ){.
10ec0 20 20 20 20 20 20 2f 2a 20 73 75 63 63 65 73 73        /* success
10ed0 2c 20 73 65 74 20 72 65 73 75 6c 74 20 61 73 20  , set result as 
10ee0 6e 75 6d 62 65 72 20 6f 66 20 6c 69 6e 65 73 20  number of lines 
10ef0 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20  processed */.   
10f00 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c     pResult = Tcl
10f10 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _GetObjResult(in
10f20 74 65 72 70 29 3b 0a 20 20 20 20 20 20 54 63 6c  terp);.      Tcl
10f30 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52 65 73 75  _SetIntObj(pResu
10f40 6c 74 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20  lt, lineno);.   
10f50 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a     rc = TCL_OK;.
10f60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10f70 20 2f 2a 20 66 61 69 6c 75 72 65 2c 20 61 70 70   /* failure, app
10f80 65 6e 64 20 6c 69 6e 65 6e 6f 20 77 68 65 72 65  end lineno where
10f90 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20   failed */.     
10fa0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
10fb0 66 28 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 4e 75  f(sizeof(zLineNu
10fc0 6d 29 2c 20 7a 4c 69 6e 65 4e 75 6d 2c 22 25 64  m), zLineNum,"%d
10fd0 22 2c 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20  ",lineno);.     
10fe0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
10ff0 74 28 69 6e 74 65 72 70 2c 22 2c 20 66 61 69 6c  t(interp,", fail
11000 65 64 20 77 68 69 6c 65 20 70 72 6f 63 65 73 73  ed while process
11010 69 6e 67 20 6c 69 6e 65 3a 20 22 2c 7a 4c 69 6e  ing line: ",zLin
11020 65 4e 75 6d 2c 30 29 3b 0a 20 20 20 20 20 20 72  eNum,0);.      r
11030 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  c = TCL_ERROR;. 
11040 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
11050 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
11060 20 20 24 64 62 20 65 6e 61 62 6c 65 5f 6c 6f 61    $db enable_loa
11070 64 5f 65 78 74 65 6e 73 69 6f 6e 20 42 4f 4f 4c  d_extension BOOL
11080 45 41 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 75  EAN.  **.  ** Tu
11090 72 6e 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e  rn the extension
110a0 20 6c 6f 61 64 69 6e 67 20 66 65 61 74 75 72 65   loading feature
110b0 20 6f 6e 20 6f 72 20 6f 66 66 2e 20 20 49 74 20   on or off.  It 
110c0 69 66 20 6f 66 66 20 62 79 0a 20 20 2a 2a 20 64  if off by.  ** d
110d0 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 63  efault..  */.  c
110e0 61 73 65 20 44 42 5f 45 4e 41 42 4c 45 5f 4c 4f  ase DB_ENABLE_LO
110f0 41 44 5f 45 58 54 45 4e 53 49 4f 4e 3a 20 7b 0a  AD_EXTENSION: {.
11100 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11110 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
11120 4f 4e 0a 20 20 20 20 69 6e 74 20 6f 6e 6f 66 66  ON.    int onoff
11130 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
11140 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
11150 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
11160 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 42 4f  rp, 2, objv, "BO
11170 4f 4c 45 41 4e 22 29 3b 0a 20 20 20 20 20 20 72  OLEAN");.      r
11180 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
11190 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 54  .    }.    if( T
111a0 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
111b0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
111c0 76 5b 32 5d 2c 20 26 6f 6e 6f 66 66 29 20 29 7b  v[2], &onoff) ){
111d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
111e0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
111f0 20 20 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c     sqlite3_enabl
11200 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e  e_load_extension
11210 28 70 44 62 2d 3e 64 62 2c 20 6f 6e 6f 66 66 29  (pDb->db, onoff)
11220 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 23 65 6c  ;.    break;.#el
11230 73 65 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  se.    Tcl_Appen
11240 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
11250 22 65 78 74 65 6e 73 69 6f 6e 20 6c 6f 61 64 69  "extension loadi
11260 6e 67 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66  ng is turned off
11270 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
11280 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
11290 20 20 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20          0);.    
112a0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
112b0 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  ;.#endif.  }..  
112c0 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 65  /*.  **    $db e
112d0 72 72 6f 72 63 6f 64 65 0a 20 20 2a 2a 0a 20 20  rrorcode.  **.  
112e0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
112f0 6d 65 72 69 63 20 65 72 72 6f 72 20 63 6f 64 65  meric error code
11300 20 74 68 61 74 20 77 61 73 20 72 65 74 75 72 6e   that was return
11310 65 64 20 62 79 20 74 68 65 20 6d 6f 73 74 20 72  ed by the most r
11320 65 63 65 6e 74 0a 20 20 2a 2a 20 63 61 6c 6c 20  ecent.  ** call 
11330 74 6f 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  to sqlite3_exec(
11340 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  )..  */.  case D
11350 42 5f 45 52 52 4f 52 43 4f 44 45 3a 20 7b 0a 20  B_ERRORCODE: {. 
11360 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
11370 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
11380 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65  NewIntObj(sqlite
11390 33 5f 65 72 72 63 6f 64 65 28 70 44 62 2d 3e 64  3_errcode(pDb->d
113a0 62 29 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  b)));.    break;
113b0 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
113c0 20 20 20 24 64 62 20 65 78 69 73 74 73 20 24 73     $db exists $s
113d0 71 6c 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 6f  ql.  **    $db o
113e0 6e 65 63 6f 6c 75 6d 6e 20 24 73 71 6c 0a 20 20  necolumn $sql.  
113f0 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65 63  **.  ** The onec
11400 6f 6c 75 6d 6e 20 6d 65 74 68 6f 64 20 69 73 20  olumn method is 
11410 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6f  the equivalent o
11420 66 3a 0a 20 20 2a 2a 20 20 20 20 20 6c 69 6e 64  f:.  **     lind
11430 65 78 20 5b 24 64 62 20 65 76 61 6c 20 24 73 71  ex [$db eval $sq
11440 6c 5d 20 30 0a 20 20 2a 2f 0a 20 20 63 61 73 65  l] 0.  */.  case
11450 20 44 42 5f 45 58 49 53 54 53 3a 20 0a 20 20 63   DB_EXISTS: .  c
11460 61 73 65 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e  ase DB_ONECOLUMN
11470 3a 20 7b 0a 20 20 20 20 44 62 45 76 61 6c 43 6f  : {.    DbEvalCo
11480 6e 74 65 78 74 20 73 45 76 61 6c 3b 0a 20 20 20  ntext sEval;.   
11490 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
114a0 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
114b0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
114c0 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 22 29 3b 0a  , objv, "SQL");.
114d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
114e0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
114f0 20 20 20 64 62 45 76 61 6c 49 6e 69 74 28 26 73     dbEvalInit(&s
11500 45 76 61 6c 2c 20 70 44 62 2c 20 6f 62 6a 76 5b  Eval, pDb, objv[
11510 32 5d 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d  2], 0);.    rc =
11520 20 64 62 45 76 61 6c 53 74 65 70 28 26 73 45 76   dbEvalStep(&sEv
11530 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 63 68 6f  al);.    if( cho
11540 69 63 65 3d 3d 44 42 5f 4f 4e 45 43 4f 4c 55 4d  ice==DB_ONECOLUM
11550 4e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72  N ){.      if( r
11560 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20  c==TCL_OK ){.   
11570 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52       Tcl_SetObjR
11580 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 64 62  esult(interp, db
11590 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65 28  EvalColumnValue(
115a0 26 73 45 76 61 6c 2c 20 30 29 29 3b 0a 20 20 20  &sEval, 0));.   
115b0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d     }else if( rc=
115c0 3d 54 43 4c 5f 42 52 45 41 4b 20 29 7b 0a 20 20  =TCL_BREAK ){.  
115d0 20 20 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52        Tcl_ResetR
115e0 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
115f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
11600 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 42 52 45   if( rc==TCL_BRE
11610 41 4b 20 7c 7c 20 72 63 3d 3d 54 43 4c 5f 4f 4b  AK || rc==TCL_OK
11620 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65   ){.      Tcl_Se
11630 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
11640 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61  p, Tcl_NewBoolea
11650 6e 4f 62 6a 28 72 63 3d 3d 54 43 4c 5f 4f 4b 29  nObj(rc==TCL_OK)
11660 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 45  );.    }.    dbE
11670 76 61 6c 46 69 6e 61 6c 69 7a 65 28 26 73 45 76  valFinalize(&sEv
11680 61 6c 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  al);..    if( rc
11690 3d 3d 54 43 4c 5f 42 52 45 41 4b 20 29 7b 0a 20  ==TCL_BREAK ){. 
116a0 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b       rc = TCL_OK
116b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  ;.    }.    brea
116c0 6b 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 2f 2a 0a  k;.  }.   .  /*.
116d0 20 20 2a 2a 20 20 20 20 24 64 62 20 65 76 61 6c    **    $db eval
116e0 20 24 73 71 6c 20 3f 61 72 72 61 79 3f 20 3f 7b   $sql ?array? ?{
116f0 20 20 2e 2e 2e 63 6f 64 65 2e 2e 2e 20 7d 3f 0a    ...code... }?.
11700 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 53 51    **.  ** The SQ
11710 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 24  L statement in $
11720 73 71 6c 20 69 73 20 65 76 61 6c 75 61 74 65 64  sql is evaluated
11730 2e 20 20 46 6f 72 20 65 61 63 68 20 72 6f 77 2c  .  For each row,
11740 20 74 68 65 20 76 61 6c 75 65 73 20 61 72 65 0a   the values are.
11750 20 20 2a 2a 20 70 6c 61 63 65 64 20 69 6e 20 65    ** placed in e
11760 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 61  lements of the a
11770 72 72 61 79 20 6e 61 6d 65 64 20 22 61 72 72 61  rray named "arra
11780 79 22 20 61 6e 64 20 2e 2e 2e 63 6f 64 65 2e 2e  y" and ...code..
11790 2e 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a 20  . is executed.. 
117a0 20 2a 2a 20 49 66 20 22 61 72 72 61 79 22 20 61   ** If "array" a
117b0 6e 64 20 22 63 6f 64 65 22 20 61 72 65 20 6f 6d  nd "code" are om
117c0 69 74 74 65 64 2c 20 74 68 65 6e 20 6e 6f 20 63  itted, then no c
117d0 61 6c 6c 62 61 63 6b 20 69 73 20 65 76 65 72 79  allback is every
117e0 20 69 6e 76 6f 6b 65 64 2e 0a 20 20 2a 2a 20 49   invoked..  ** I
117f0 66 20 22 61 72 72 61 79 22 20 69 73 20 61 6e 20  f "array" is an 
11800 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 20 74 68  empty string, th
11810 65 6e 20 74 68 65 20 76 61 6c 75 65 73 20 61 72  en the values ar
11820 65 20 70 6c 61 63 65 64 20 69 6e 20 76 61 72 69  e placed in vari
11830 61 62 6c 65 73 0a 20 20 2a 2a 20 74 68 61 74 20  ables.  ** that 
11840 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 61  have the same na
11850 6d 65 20 61 73 20 74 68 65 20 66 69 65 6c 64 73  me as the fields
11860 20 65 78 74 72 61 63 74 65 64 20 62 79 20 74 68   extracted by th
11870 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  e query..  */.  
11880 63 61 73 65 20 44 42 5f 45 56 41 4c 3a 20 7b 0a  case DB_EVAL: {.
11890 20 20 20 20 69 66 28 20 6f 62 6a 63 3c 33 20 7c      if( objc<3 |
118a0 7c 20 6f 62 6a 63 3e 35 20 29 7b 0a 20 20 20 20  | objc>5 ){.    
118b0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
118c0 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
118d0 6a 76 2c 20 22 53 51 4c 20 3f 41 52 52 41 59 2d  jv, "SQL ?ARRAY-
118e0 4e 41 4d 45 3f 20 3f 53 43 52 49 50 54 3f 22 29  NAME? ?SCRIPT?")
118f0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
11900 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
11910 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33  .    if( objc==3
11920 20 29 7b 0a 20 20 20 20 20 20 44 62 45 76 61 6c   ){.      DbEval
11930 43 6f 6e 74 65 78 74 20 73 45 76 61 6c 3b 0a 20  Context sEval;. 
11940 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52       Tcl_Obj *pR
11950 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28  et = Tcl_NewObj(
11960 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63  );.      Tcl_Inc
11970 72 52 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b  rRefCount(pRet);
11980 0a 20 20 20 20 20 20 64 62 45 76 61 6c 49 6e 69  .      dbEvalIni
11990 74 28 26 73 45 76 61 6c 2c 20 70 44 62 2c 20 6f  t(&sEval, pDb, o
119a0 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20  bjv[2], 0);.    
119b0 20 20 77 68 69 6c 65 28 20 54 43 4c 5f 4f 4b 3d    while( TCL_OK=
119c0 3d 28 72 63 20 3d 20 64 62 45 76 61 6c 53 74 65  =(rc = dbEvalSte
119d0 70 28 26 73 45 76 61 6c 29 29 20 29 7b 0a 20 20  p(&sEval)) ){.  
119e0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
119f0 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20       int nCol;. 
11a00 20 20 20 20 20 20 20 64 62 45 76 61 6c 52 6f 77         dbEvalRow
11a10 49 6e 66 6f 28 26 73 45 76 61 6c 2c 20 26 6e 43  Info(&sEval, &nC
11a20 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ol, 0);.        
11a30 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
11a40 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
11a50 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
11a60 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
11a70 2c 20 70 52 65 74 2c 20 64 62 45 76 61 6c 43 6f  , pRet, dbEvalCo
11a80 6c 75 6d 6e 56 61 6c 75 65 28 26 73 45 76 61 6c  lumnValue(&sEval
11a90 2c 20 69 29 29 3b 0a 20 20 20 20 20 20 20 20 7d  , i));.        }
11aa0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64  .      }.      d
11ab0 62 45 76 61 6c 46 69 6e 61 6c 69 7a 65 28 26 73  bEvalFinalize(&s
11ac0 45 76 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  Eval);.      if(
11ad0 20 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20 29   rc==TCL_BREAK )
11ae0 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65  {.        Tcl_Se
11af0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
11b00 70 2c 20 70 52 65 74 29 3b 0a 20 20 20 20 20 20  p, pRet);.      
11b10 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20    rc = TCL_OK;. 
11b20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 63 6c       }.      Tcl
11b30 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 52  _DecrRefCount(pR
11b40 65 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  et);.    }else{.
11b50 20 20 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61        ClientData
11b60 20 63 64 5b 32 5d 3b 0a 20 20 20 20 20 20 44 62   cd[2];.      Db
11b70 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70 3b 0a  EvalContext *p;.
11b80 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70        Tcl_Obj *p
11b90 41 72 72 61 79 20 3d 20 30 3b 0a 20 20 20 20 20  Array = 0;.     
11ba0 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70   Tcl_Obj *pScrip
11bb0 74 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 62  t;..      if( ob
11bc0 6a 63 3d 3d 35 20 26 26 20 2a 28 63 68 61 72 20  jc==5 && *(char 
11bd0 2a 29 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  *)Tcl_GetString(
11be0 6f 62 6a 76 5b 33 5d 29 20 29 7b 0a 20 20 20 20  objv[3]) ){.    
11bf0 20 20 20 20 70 41 72 72 61 79 20 3d 20 6f 62 6a      pArray = obj
11c00 76 5b 33 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  v[3];.      }.  
11c10 20 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62      pScript = ob
11c20 6a 76 5b 6f 62 6a 63 2d 31 5d 3b 0a 20 20 20 20  jv[objc-1];.    
11c30 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
11c40 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 20 20 20  nt(pScript);.   
11c50 20 20 20 0a 20 20 20 20 20 20 70 20 3d 20 28 44     .      p = (D
11c60 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 29 54  bEvalContext *)T
11c70 63 6c 5f 41 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  cl_Alloc(sizeof(
11c80 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 29 29 3b  DbEvalContext));
11c90 0a 20 20 20 20 20 20 64 62 45 76 61 6c 49 6e 69  .      dbEvalIni
11ca0 74 28 70 2c 20 70 44 62 2c 20 6f 62 6a 76 5b 32  t(p, pDb, objv[2
11cb0 5d 2c 20 70 41 72 72 61 79 29 3b 0a 0a 20 20 20  ], pArray);..   
11cc0 20 20 20 63 64 5b 30 5d 20 3d 20 28 76 6f 69 64     cd[0] = (void
11cd0 20 2a 29 70 3b 0a 20 20 20 20 20 20 63 64 5b 31   *)p;.      cd[1
11ce0 5d 20 3d 20 28 76 6f 69 64 20 2a 29 70 53 63 72  ] = (void *)pScr
11cf0 69 70 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ipt;.      rc = 
11d00 44 62 45 76 61 6c 4e 65 78 74 43 6d 64 28 63 64  DbEvalNextCmd(cd
11d10 2c 20 69 6e 74 65 72 70 2c 20 54 43 4c 5f 4f 4b  , interp, TCL_OK
11d20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  );.    }.    bre
11d30 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
11d40 2a 2a 20 20 20 20 20 24 64 62 20 66 75 6e 63 74  **     $db funct
11d50 69 6f 6e 20 4e 41 4d 45 20 5b 2d 61 72 67 63 6f  ion NAME [-argco
11d60 75 6e 74 20 4e 5d 20 53 43 52 49 50 54 0a 20 20  unt N] SCRIPT.  
11d70 2a 2a 0a 20 20 2a 2a 20 43 72 65 61 74 65 20 61  **.  ** Create a
11d80 20 6e 65 77 20 53 51 4c 20 66 75 6e 63 74 69 6f   new SQL functio
11d90 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20  n called NAME.  
11da0 57 68 65 6e 65 76 65 72 20 74 68 61 74 20 66 75  Whenever that fu
11db0 6e 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63  nction is.  ** c
11dc0 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53 43  alled, invoke SC
11dd0 52 49 50 54 20 74 6f 20 65 76 61 6c 75 61 74 65  RIPT to evaluate
11de0 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20   the function.. 
11df0 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 46 55   */.  case DB_FU
11e00 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 53 71  NCTION: {.    Sq
11e10 6c 46 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20  lFunc *pFunc;.  
11e20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69    Tcl_Obj *pScri
11e30 70 74 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e  pt;.    char *zN
11e40 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 6e 41 72  ame;.    int nAr
11e50 67 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20  g = -1;.    if( 
11e60 6f 62 6a 63 3d 3d 36 20 29 7b 0a 20 20 20 20 20  objc==6 ){.     
11e70 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
11e80 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
11e90 62 6a 76 5b 33 5d 29 3b 0a 20 20 20 20 20 20 69  bjv[3]);.      i
11ea0 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28  nt n = strlen30(
11eb0 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e  z);.      if( n>
11ec0 32 20 26 26 20 73 74 72 6e 63 6d 70 28 7a 2c 20  2 && strncmp(z, 
11ed0 22 2d 61 72 67 63 6f 75 6e 74 22 2c 6e 29 3d 3d  "-argcount",n)==
11ee0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
11ef0 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
11f00 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
11f10 34 5d 2c 20 26 6e 41 72 67 29 20 29 20 72 65 74  4], &nArg) ) ret
11f20 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
11f30 20 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3c         if( nArg<
11f40 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  0 ){.          T
11f50 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
11f60 69 6e 74 65 72 70 2c 20 22 6e 75 6d 62 65 72 20  interp, "number 
11f70 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 6d 75 73  of arguments mus
11f80 74 20 62 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  t be non-negativ
11f90 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e",.            
11fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
11fb0 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
11fc0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
11fd0 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a  RROR;.        }.
11fe0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53        }.      pS
11ff0 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 35 5d 3b  cript = objv[5];
12000 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
12010 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20  bjc!=4 ){.      
12020 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
12030 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
12040 2c 20 22 4e 41 4d 45 20 5b 2d 61 72 67 63 6f 75  , "NAME [-argcou
12050 6e 74 20 4e 5d 20 53 43 52 49 50 54 22 29 3b 0a  nt N] SCRIPT");.
12060 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
12070 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73  _ERROR;.    }els
12080 65 7b 0a 20 20 20 20 20 20 70 53 63 72 69 70 74  e{.      pScript
12090 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20   = objv[3];.    
120a0 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 54 63  }.    zName = Tc
120b0 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
120c0 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a  bj(objv[2], 0);.
120d0 20 20 20 20 70 46 75 6e 63 20 3d 20 66 69 6e 64      pFunc = find
120e0 53 71 6c 46 75 6e 63 28 70 44 62 2c 20 7a 4e 61  SqlFunc(pDb, zNa
120f0 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 46 75  me);.    if( pFu
12100 6e 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 54  nc==0 ) return T
12110 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 69 66  CL_ERROR;.    if
12120 28 20 70 46 75 6e 63 2d 3e 70 53 63 72 69 70 74  ( pFunc->pScript
12130 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44 65   ){.      Tcl_De
12140 63 72 52 65 66 43 6f 75 6e 74 28 70 46 75 6e 63  crRefCount(pFunc
12150 2d 3e 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20  ->pScript);.    
12160 7d 0a 20 20 20 20 70 46 75 6e 63 2d 3e 70 53 63  }.    pFunc->pSc
12170 72 69 70 74 20 3d 20 70 53 63 72 69 70 74 3b 0a  ript = pScript;.
12180 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
12190 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 20  ount(pScript);. 
121a0 20 20 20 70 46 75 6e 63 2d 3e 75 73 65 45 76 61     pFunc->useEva
121b0 6c 4f 62 6a 76 20 3d 20 73 61 66 65 54 6f 55 73  lObjv = safeToUs
121c0 65 45 76 61 6c 4f 62 6a 76 28 69 6e 74 65 72 70  eEvalObjv(interp
121d0 2c 20 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20  , pScript);.    
121e0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
121f0 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 44 62  ate_function(pDb
12200 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72  ->db, zName, nAr
12210 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a  g, SQLITE_UTF8,.
12220 20 20 20 20 20 20 20 20 70 46 75 6e 63 2c 20 74          pFunc, t
12230 63 6c 53 71 6c 46 75 6e 63 2c 20 30 2c 20 30 29  clSqlFunc, 0, 0)
12240 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
12250 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12260 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b   rc = TCL_ERROR;
12270 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65  .      Tcl_SetRe
12280 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
12290 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72  ar *)sqlite3_err
122a0 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 54 43  msg(pDb->db), TC
122b0 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20  L_VOLATILE);.   
122c0 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
122d0 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
122e0 20 24 64 62 20 69 6e 63 72 62 6c 6f 62 20 3f 2d   $db incrblob ?-
122f0 72 65 61 64 6f 6e 6c 79 3f 20 3f 44 42 3f 20 54  readonly? ?DB? T
12300 41 42 4c 45 20 43 4f 4c 55 4d 4e 20 52 4f 57 49  ABLE COLUMN ROWI
12310 44 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  D.  */.  case DB
12320 5f 49 4e 43 52 42 4c 4f 42 3a 20 7b 0a 23 69 66  _INCRBLOB: {.#if
12330 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12340 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 54 63 6c  INCRBLOB.    Tcl
12350 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
12360 74 65 72 70 2c 20 22 69 6e 63 72 62 6c 6f 62 20  terp, "incrblob 
12370 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 69 6e  not available in
12380 20 74 68 69 73 20 62 75 69 6c 64 22 2c 20 30 29   this build", 0)
12390 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
123a0 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20  _ERROR;.#else.  
123b0 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79    int isReadonly
123c0 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   = 0;.    const 
123d0 63 68 61 72 20 2a 7a 44 62 20 3d 20 22 6d 61 69  char *zDb = "mai
123e0 6e 22 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  n";.    const ch
123f0 61 72 20 2a 7a 54 61 62 6c 65 3b 0a 20 20 20 20  ar *zTable;.    
12400 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
12410 75 6d 6e 3b 0a 20 20 20 20 54 63 6c 5f 57 69 64  umn;.    Tcl_Wid
12420 65 49 6e 74 20 69 52 6f 77 3b 0a 0a 20 20 20 20  eInt iRow;..    
12430 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 74 68 65  /* Check for the
12440 20 2d 72 65 61 64 6f 6e 6c 79 20 6f 70 74 69 6f   -readonly optio
12450 6e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 62 6a  n */.    if( obj
12460 63 3e 33 20 26 26 20 73 74 72 63 6d 70 28 54 63  c>3 && strcmp(Tc
12470 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
12480 5b 32 5d 29 2c 20 22 2d 72 65 61 64 6f 6e 6c 79  [2]), "-readonly
12490 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
124a0 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20  sReadonly = 1;. 
124b0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62     }..    if( ob
124c0 6a 63 21 3d 28 35 2b 69 73 52 65 61 64 6f 6e 6c  jc!=(5+isReadonl
124d0 79 29 20 26 26 20 6f 62 6a 63 21 3d 28 36 2b 69  y) && objc!=(6+i
124e0 73 52 65 61 64 6f 6e 6c 79 29 20 29 7b 0a 20 20  sReadonly) ){.  
124f0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
12500 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
12510 6f 62 6a 76 2c 20 22 3f 2d 72 65 61 64 6f 6e 6c  objv, "?-readonl
12520 79 3f 20 3f 44 42 3f 20 54 41 42 4c 45 20 43 4f  y? ?DB? TABLE CO
12530 4c 55 4d 4e 20 52 4f 57 49 44 22 29 3b 0a 20 20  LUMN ROWID");.  
12540 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
12550 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
12560 20 69 66 28 20 6f 62 6a 63 3d 3d 28 36 2b 69 73   if( objc==(6+is
12570 52 65 61 64 6f 6e 6c 79 29 20 29 7b 0a 20 20 20  Readonly) ){.   
12580 20 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74     zDb = Tcl_Get
12590 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
125a0 0a 20 20 20 20 7d 0a 20 20 20 20 7a 54 61 62 6c  .    }.    zTabl
125b0 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
125c0 67 28 6f 62 6a 76 5b 6f 62 6a 63 2d 33 5d 29 3b  g(objv[objc-3]);
125d0 0a 20 20 20 20 7a 43 6f 6c 75 6d 6e 20 3d 20 54  .    zColumn = T
125e0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
125f0 76 5b 6f 62 6a 63 2d 32 5d 29 3b 0a 20 20 20 20  v[objc-2]);.    
12600 72 63 20 3d 20 54 63 6c 5f 47 65 74 57 69 64 65  rc = Tcl_GetWide
12610 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
12620 70 2c 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 2c  p, objv[objc-1],
12630 20 26 69 52 6f 77 29 3b 0a 0a 20 20 20 20 69 66   &iRow);..    if
12640 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a  ( rc==TCL_OK ){.
12650 20 20 20 20 20 20 72 63 20 3d 20 63 72 65 61 74        rc = creat
12660 65 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c  eIncrblobChannel
12670 28 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 65  (.          inte
12680 72 70 2c 20 70 44 62 2c 20 7a 44 62 2c 20 7a 54  rp, pDb, zDb, zT
12690 61 62 6c 65 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 69  able, zColumn, i
126a0 52 6f 77 2c 20 69 73 52 65 61 64 6f 6e 6c 79 0a  Row, isReadonly.
126b0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 23        );.    }.#
126c0 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b  endif.    break;
126d0 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
126e0 20 20 20 20 24 64 62 20 69 6e 74 65 72 72 75 70      $db interrup
126f0 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 74 65  t.  **.  ** Inte
12700 72 72 75 70 74 20 74 68 65 20 65 78 65 63 75 74  rrupt the execut
12710 69 6f 6e 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  ion of the inner
12720 2d 6d 6f 73 74 20 53 51 4c 20 69 6e 74 65 72 70  -most SQL interp
12730 72 65 74 65 72 2e 20 20 54 68 69 73 0a 20 20 2a  reter.  This.  *
12740 2a 20 63 61 75 73 65 73 20 74 68 65 20 53 51 4c  * causes the SQL
12750 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 72 65   statement to re
12760 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 6f 66  turn an error of
12770 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
12780 54 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  T..  */.  case D
12790 42 5f 49 4e 54 45 52 52 55 50 54 3a 20 7b 0a 20  B_INTERRUPT: {. 
127a0 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72     sqlite3_inter
127b0 72 75 70 74 28 70 44 62 2d 3e 64 62 29 3b 0a 20  rupt(pDb->db);. 
127c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
127d0 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62   /*.  **     $db
127e0 20 6e 75 6c 6c 76 61 6c 75 65 20 3f 53 54 52 49   nullvalue ?STRI
127f0 4e 47 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 68  NG?.  **.  ** Ch
12800 61 6e 67 65 20 74 65 78 74 20 75 73 65 64 20 77  ange text used w
12810 68 65 6e 20 61 20 4e 55 4c 4c 20 63 6f 6d 65 73  hen a NULL comes
12820 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 64   back from the d
12830 61 74 61 62 61 73 65 2e 20 49 66 20 3f 53 54 52  atabase. If ?STR
12840 49 4e 47 3f 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  ING?.  ** is not
12850 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 74   present, then t
12860 68 65 20 63 75 72 72 65 6e 74 20 73 74 72 69 6e  he current strin
12870 67 20 75 73 65 64 20 66 6f 72 20 4e 55 4c 4c 20  g used for NULL 
12880 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a  is returned..  *
12890 2a 20 49 66 20 53 54 52 49 4e 47 20 69 73 20 70  * If STRING is p
128a0 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 53 54 52  resent, then STR
128b0 49 4e 47 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ING is returned.
128c0 0a 20 20 2a 2a 0a 20 20 2a 2f 0a 20 20 63 61 73  .  **.  */.  cas
128d0 65 20 44 42 5f 4e 55 4c 4c 56 41 4c 55 45 3a 20  e DB_NULLVALUE: 
128e0 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  {.    if( objc!=
128f0 32 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a  2 && objc!=3 ){.
12900 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
12910 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
12920 2c 20 6f 62 6a 76 2c 20 22 4e 55 4c 4c 56 41 4c  , objv, "NULLVAL
12930 55 45 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  UE");.      retu
12940 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
12950 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63    }.    if( objc
12960 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==3 ){.      int
12970 20 6c 65 6e 3b 0a 20 20 20 20 20 20 63 68 61 72   len;.      char
12980 20 2a 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 47 65   *zNull = Tcl_Ge
12990 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
129a0 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20  bjv[2], &len);. 
129b0 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 4e       if( pDb->zN
129c0 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 54  ull ){.        T
129d0 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 4e 75  cl_Free(pDb->zNu
129e0 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ll);.      }.   
129f0 20 20 20 69 66 28 20 7a 4e 75 6c 6c 20 26 26 20     if( zNull && 
12a00 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  len>0 ){.       
12a10 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 3d 20 54 63   pDb->zNull = Tc
12a20 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31  l_Alloc( len + 1
12a30 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   );.        memc
12a40 70 79 28 70 44 62 2d 3e 7a 4e 75 6c 6c 2c 20 7a  py(pDb->zNull, z
12a50 4e 75 6c 6c 2c 20 6c 65 6e 29 3b 0a 20 20 20 20  Null, len);.    
12a60 20 20 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c 5b 6c      pDb->zNull[l
12a70 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  en] = '\0';.    
12a80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
12a90 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 3d 20 30 3b   pDb->zNull = 0;
12aa0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12ab0 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
12ac0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
12ad0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 44 62  NewStringObj(pDb
12ae0 2d 3e 7a 4e 75 6c 6c 2c 20 2d 31 29 29 3b 0a 20  ->zNull, -1));. 
12af0 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
12b00 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62   /*.  **     $db
12b10 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77   last_insert_row
12b20 69 64 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  id .  **.  ** Re
12b30 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20  turn an integer 
12b40 77 68 69 63 68 20 69 73 20 74 68 65 20 52 4f 57  which is the ROW
12b50 49 44 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20  ID for the most 
12b60 72 65 63 65 6e 74 20 69 6e 73 65 72 74 2e 0a 20  recent insert.. 
12b70 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 4c 41   */.  case DB_LA
12b80 53 54 5f 49 4e 53 45 52 54 5f 52 4f 57 49 44 3a  ST_INSERT_ROWID:
12b90 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a   {.    Tcl_Obj *
12ba0 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 54 63 6c  pResult;.    Tcl
12bb0 5f 57 69 64 65 49 6e 74 20 72 6f 77 69 64 3b 0a  _WideInt rowid;.
12bc0 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20      if( objc!=2 
12bd0 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
12be0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
12bf0 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a  , 2, objv, "");.
12c00 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
12c10 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
12c20 20 20 72 6f 77 69 64 20 3d 20 73 71 6c 69 74 65    rowid = sqlite
12c30 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f  3_last_insert_ro
12c40 77 69 64 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20  wid(pDb->db);.  
12c50 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f    pResult = Tcl_
12c60 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  GetObjResult(int
12c70 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  erp);.    Tcl_Se
12c80 74 57 69 64 65 49 6e 74 4f 62 6a 28 70 52 65 73  tWideIntObj(pRes
12c90 75 6c 74 2c 20 72 6f 77 69 64 29 3b 0a 20 20 20  ult, rowid);.   
12ca0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
12cb0 2a 0a 20 20 2a 2a 20 54 68 65 20 44 42 5f 4f 4e  *.  ** The DB_ON
12cc0 45 43 4f 4c 55 4d 4e 20 6d 65 74 68 6f 64 20 69  ECOLUMN method i
12cd0 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 74 6f  s implemented to
12ce0 67 65 74 68 65 72 20 77 69 74 68 20 44 42 5f 45  gether with DB_E
12cf0 58 49 53 54 53 2e 0a 20 20 2a 2f 0a 0a 20 20 2f  XISTS..  */..  /
12d00 2a 20 20 20 20 24 64 62 20 70 72 6f 67 72 65 73  *    $db progres
12d10 73 20 3f 4e 20 43 41 4c 4c 42 41 43 4b 3f 0a 20  s ?N CALLBACK?. 
12d20 20 2a 2a 20 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65   ** .  ** Invoke
12d30 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62   the given callb
12d40 61 63 6b 20 65 76 65 72 79 20 4e 20 76 69 72 74  ack every N virt
12d50 75 61 6c 20 6d 61 63 68 69 6e 65 20 6f 70 63 6f  ual machine opco
12d60 64 65 73 20 77 68 69 6c 65 20 65 78 65 63 75 74  des while execut
12d70 69 6e 67 0a 20 20 2a 2a 20 71 75 65 72 69 65 73  ing.  ** queries
12d80 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
12d90 5f 50 52 4f 47 52 45 53 53 3a 20 7b 0a 20 20 20  _PROGRESS: {.   
12da0 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a   if( objc==2 ){.
12db0 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
12dc0 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20  Progress ){.    
12dd0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
12de0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62  sult(interp, pDb
12df0 2d 3e 7a 50 72 6f 67 72 65 73 73 2c 20 30 29 3b  ->zProgress, 0);
12e00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
12e10 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29  se if( objc==4 )
12e20 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 50  {.      char *zP
12e30 72 6f 67 72 65 73 73 3b 0a 20 20 20 20 20 20 69  rogress;.      i
12e40 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 6e  nt len;.      in
12e50 74 20 4e 3b 0a 20 20 20 20 20 20 69 66 28 20 54  t N;.      if( T
12e60 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e  CL_OK!=Tcl_GetIn
12e70 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
12e80 20 6f 62 6a 76 5b 32 5d 2c 20 26 4e 29 20 29 7b   objv[2], &N) ){
12e90 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
12ea0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
12eb0 20 7d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44   };.      if( pD
12ec0 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a  b->zProgress ){.
12ed0 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65          Tcl_Free
12ee0 28 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 29  (pDb->zProgress)
12ef0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12f00 7a 50 72 6f 67 72 65 73 73 20 3d 20 54 63 6c 5f  zProgress = Tcl_
12f10 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
12f20 28 6f 62 6a 76 5b 33 5d 2c 20 26 6c 65 6e 29 3b  (objv[3], &len);
12f30 0a 20 20 20 20 20 20 69 66 28 20 7a 50 72 6f 67  .      if( zProg
12f40 72 65 73 73 20 26 26 20 6c 65 6e 3e 30 20 29 7b  ress && len>0 ){
12f50 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50  .        pDb->zP
12f60 72 6f 67 72 65 73 73 20 3d 20 54 63 6c 5f 41 6c  rogress = Tcl_Al
12f70 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a  loc( len + 1 );.
12f80 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
12f90 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 2c 20 7a  Db->zProgress, z
12fa0 50 72 6f 67 72 65 73 73 2c 20 6c 65 6e 2b 31 29  Progress, len+1)
12fb0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
12fc0 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f         pDb->zPro
12fd0 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 20  gress = 0;.     
12fe0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
12ff0 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f  E_OMIT_PROGRESS_
13000 43 41 4c 4c 42 41 43 4b 0a 20 20 20 20 20 20 69  CALLBACK.      i
13010 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73  f( pDb->zProgres
13020 73 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  s ){.        pDb
13030 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  ->interp = inter
13040 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  p;.        sqlit
13050 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64  e3_progress_hand
13060 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20 4e 2c 20  ler(pDb->db, N, 
13070 44 62 50 72 6f 67 72 65 73 73 48 61 6e 64 6c 65  DbProgressHandle
13080 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d  r, pDb);.      }
13090 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
130a0 6c 69 74 65 33 5f 70 72 6f 67 72 65 73 73 5f 68  lite3_progress_h
130b0 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20  andler(pDb->db, 
130c0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
130d0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  }.#endif.    }el
130e0 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72  se{.      Tcl_Wr
130f0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
13100 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 20 43  p, 2, objv, "N C
13110 41 4c 4c 42 41 43 4b 22 29 3b 0a 20 20 20 20 20  ALLBACK");.     
13120 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
13130 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  R;.    }.    bre
13140 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
13150 20 24 64 62 20 70 72 6f 66 69 6c 65 20 3f 43 41   $db profile ?CA
13160 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a  LLBACK?.  **.  *
13170 2a 20 4d 61 6b 65 20 61 72 72 61 6e 67 65 6d 65  * Make arrangeme
13180 6e 74 73 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68  nts to invoke th
13190 65 20 43 41 4c 4c 42 41 43 4b 20 72 6f 75 74 69  e CALLBACK routi
131a0 6e 65 20 61 66 74 65 72 20 65 61 63 68 20 53 51  ne after each SQ
131b0 4c 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  L statement.  **
131c0 20 74 68 61 74 20 68 61 73 20 72 75 6e 2e 20 20   that has run.  
131d0 54 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  The text of the 
131e0 53 51 4c 20 61 6e 64 20 74 68 65 20 61 6d 6f 75  SQL and the amou
131f0 6e 74 20 6f 66 20 65 6c 61 70 73 65 20 74 69 6d  nt of elapse tim
13200 65 20 61 72 65 0a 20 20 2a 2a 20 61 70 70 65 6e  e are.  ** appen
13210 64 65 64 20 74 6f 20 43 41 4c 4c 42 41 43 4b 20  ded to CALLBACK 
13220 62 65 66 6f 72 65 20 74 68 65 20 73 63 72 69 70  before the scrip
13230 74 20 69 73 20 72 75 6e 2e 0a 20 20 2a 2f 0a 20  t is run..  */. 
13240 20 63 61 73 65 20 44 42 5f 50 52 4f 46 49 4c 45   case DB_PROFILE
13250 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  : {.    if( objc
13260 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  >3 ){.      Tcl_
13270 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
13280 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f  erp, 2, objv, "?
13290 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20  CALLBACK?");.   
132a0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
132b0 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ROR;.    }else i
132c0 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20  f( objc==2 ){.  
132d0 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72      if( pDb->zPr
132e0 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  ofile ){.       
132f0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
13300 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a  t(interp, pDb->z
13310 50 72 6f 66 69 6c 65 2c 20 30 29 3b 0a 20 20 20  Profile, 0);.   
13320 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
13330 20 20 20 20 20 20 63 68 61 72 20 2a 7a 50 72 6f        char *zPro
13340 66 69 6c 65 3b 0a 20 20 20 20 20 20 69 6e 74 20  file;.      int 
13350 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70  len;.      if( p
13360 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a  Db->zProfile ){.
13370 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65          Tcl_Free
13380 28 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 29 3b  (pDb->zProfile);
13390 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
133a0 50 72 6f 66 69 6c 65 20 3d 20 54 63 6c 5f 47 65  Profile = Tcl_Ge
133b0 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
133c0 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20  bjv[2], &len);. 
133d0 20 20 20 20 20 69 66 28 20 7a 50 72 6f 66 69 6c       if( zProfil
133e0 65 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20  e && len>0 ){.  
133f0 20 20 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f 66        pDb->zProf
13400 69 6c 65 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28  ile = Tcl_Alloc(
13410 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20   len + 1 );.    
13420 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e      memcpy(pDb->
13430 7a 50 72 6f 66 69 6c 65 2c 20 7a 50 72 6f 66 69  zProfile, zProfi
13440 6c 65 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20  le, len+1);.    
13450 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13460 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 3d   pDb->zProfile =
13470 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20   0;.      }.#if 
13480 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
13490 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 21  OMIT_TRACE) && !
134a0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
134b0 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
134c0 4e 54 29 0a 20 20 20 20 20 20 69 66 28 20 70 44  NT).      if( pD
134d0 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20  b->zProfile ){. 
134e0 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65         pDb->inte
134f0 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp = interp;.   
13500 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f       sqlite3_pro
13510 66 69 6c 65 28 70 44 62 2d 3e 64 62 2c 20 44 62  file(pDb->db, Db
13520 50 72 6f 66 69 6c 65 48 61 6e 64 6c 65 72 2c 20  ProfileHandler, 
13530 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  pDb);.      }els
13540 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
13550 65 33 5f 70 72 6f 66 69 6c 65 28 70 44 62 2d 3e  e3_profile(pDb->
13560 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  db, 0, 0);.     
13570 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
13580 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
13590 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64    /*.  **     $d
135a0 62 20 72 65 6b 65 79 20 4b 45 59 0a 20 20 2a 2a  b rekey KEY.  **
135b0 0a 20 20 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  .  ** Change the
135c0 20 65 6e 63 72 79 70 74 69 6f 6e 20 6b 65 79 20   encryption key 
135d0 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79  on the currently
135e0 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 2e 0a   open database..
135f0 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 52    */.  case DB_R
13600 45 4b 45 59 3a 20 7b 0a 23 69 66 64 65 66 20 53  EKEY: {.#ifdef S
13610 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
13620 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20      int nKey;.  
13630 20 20 76 6f 69 64 20 2a 70 4b 65 79 3b 0a 23 65    void *pKey;.#e
13640 6e 64 69 66 0a 20 20 20 20 69 66 28 20 6f 62 6a  ndif.    if( obj
13650 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=3 ){.      Tc
13660 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
13670 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
13680 22 4b 45 59 22 29 3b 0a 20 20 20 20 20 20 72 65  "KEY");.      re
13690 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
136a0 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
136b0 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
136c0 20 20 70 4b 65 79 20 3d 20 54 63 6c 5f 47 65 74    pKey = Tcl_Get
136d0 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a  ByteArrayFromObj
136e0 28 6f 62 6a 76 5b 32 5d 2c 20 26 6e 4b 65 79 29  (objv[2], &nKey)
136f0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
13700 65 33 5f 72 65 6b 65 79 28 70 44 62 2d 3e 64 62  e3_rekey(pDb->db
13710 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20  , pKey, nKey);. 
13720 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
13730 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
13740 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69  ult(interp, sqli
13750 74 65 33 5f 65 72 72 73 74 72 28 72 63 29 2c 20  te3_errstr(rc), 
13760 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54  0);.      rc = T
13770 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
13780 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b  #endif.    break
13790 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24  ;.  }..  /*    $
137a0 64 62 20 72 65 73 74 6f 72 65 20 3f 44 41 54 41  db restore ?DATA
137b0 42 41 53 45 3f 20 46 49 4c 45 4e 41 4d 45 0a 20  BASE? FILENAME. 
137c0 20 2a 2a 0a 20 20 2a 2a 20 4f 70 65 6e 20 61 20   **.  ** Open a 
137d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61  database file na
137e0 6d 65 64 20 46 49 4c 45 4e 41 4d 45 2e 20 20 54  med FILENAME.  T
137f0 72 61 6e 73 66 65 72 20 74 68 65 20 63 6f 6e 74  ransfer the cont
13800 65 6e 74 20 0a 20 20 2a 2a 20 6f 66 20 46 49 4c  ent .  ** of FIL
13810 45 4e 41 4d 45 20 69 6e 74 6f 20 74 68 65 20 6c  ENAME into the l
13820 6f 63 61 6c 20 64 61 74 61 62 61 73 65 20 44 41  ocal database DA
13830 54 41 42 41 53 45 20 28 64 65 66 61 75 6c 74 3a  TABASE (default:
13840 20 22 6d 61 69 6e 22 29 2e 0a 20 20 2a 2f 0a 20   "main")..  */. 
13850 20 63 61 73 65 20 44 42 5f 52 45 53 54 4f 52 45   case DB_RESTORE
13860 3a 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  : {.    const ch
13870 61 72 20 2a 7a 53 72 63 46 69 6c 65 3b 0a 20 20  ar *zSrcFile;.  
13880 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
13890 65 73 74 44 62 3b 0a 20 20 20 20 73 71 6c 69 74  estDb;.    sqlit
138a0 65 33 20 2a 70 53 72 63 3b 0a 20 20 20 20 73 71  e3 *pSrc;.    sq
138b0 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42  lite3_backup *pB
138c0 61 63 6b 75 70 3b 0a 20 20 20 20 69 6e 74 20 6e  ackup;.    int n
138d0 54 69 6d 65 6f 75 74 20 3d 20 30 3b 0a 0a 20 20  Timeout = 0;..  
138e0 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b    if( objc==3 ){
138f0 0a 20 20 20 20 20 20 7a 44 65 73 74 44 62 20 3d  .      zDestDb =
13900 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 20 20 7a   "main";.      z
13910 53 72 63 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65  SrcFile = Tcl_Ge
13920 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
13930 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
13940 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20  objc==4 ){.     
13950 20 7a 44 65 73 74 44 62 20 3d 20 54 63 6c 5f 47   zDestDb = Tcl_G
13960 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
13970 29 3b 0a 20 20 20 20 20 20 7a 53 72 63 46 69 6c  );.      zSrcFil
13980 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
13990 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 20 20  g(objv[3]);.    
139a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c  }else{.      Tcl
139b0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
139c0 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
139d0 3f 44 41 54 41 42 41 53 45 3f 20 46 49 4c 45 4e  ?DATABASE? FILEN
139e0 41 4d 45 22 29 3b 0a 20 20 20 20 20 20 72 65 74  AME");.      ret
139f0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
13a00 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
13a10 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 7a 53  lite3_open_v2(zS
13a20 72 63 46 69 6c 65 2c 20 26 70 53 72 63 2c 20 53  rcFile, &pSrc, S
13a30 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
13a40 4e 4c 59 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  NLY, 0);.    if(
13a50 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13a60 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
13a70 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
13a80 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 73 6f   "cannot open so
13a90 75 72 63 65 20 64 61 74 61 62 61 73 65 3a 20 22  urce database: "
13aa0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  ,.           sql
13ab0 69 74 65 33 5f 65 72 72 6d 73 67 28 70 53 72 63  ite3_errmsg(pSrc
13ac0 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ), (char*)0);.  
13ad0 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
13ae0 65 28 70 53 72 63 29 3b 0a 20 20 20 20 20 20 72  e(pSrc);.      r
13af0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13b00 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 61 63 6b  .    }.    pBack
13b10 75 70 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63  up = sqlite3_bac
13b20 6b 75 70 5f 69 6e 69 74 28 70 44 62 2d 3e 64 62  kup_init(pDb->db
13b30 2c 20 7a 44 65 73 74 44 62 2c 20 70 53 72 63 2c  , zDestDb, pSrc,
13b40 20 22 6d 61 69 6e 22 29 3b 0a 20 20 20 20 69 66   "main");.    if
13b50 28 20 70 42 61 63 6b 75 70 3d 3d 30 20 29 7b 0a  ( pBackup==0 ){.
13b60 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
13b70 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
13b80 72 65 73 74 6f 72 65 20 66 61 69 6c 65 64 3a 20  restore failed: 
13b90 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71  ",.           sq
13ba0 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
13bb0 2d 3e 64 62 29 2c 20 28 63 68 61 72 2a 29 30 29  ->db), (char*)0)
13bc0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
13bd0 63 6c 6f 73 65 28 70 53 72 63 29 3b 0a 20 20 20  close(pSrc);.   
13be0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
13bf0 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77  ROR;.    }.    w
13c00 68 69 6c 65 28 20 28 72 63 20 3d 20 73 71 6c 69  hile( (rc = sqli
13c10 74 65 33 5f 62 61 63 6b 75 70 5f 73 74 65 70 28  te3_backup_step(
13c20 70 42 61 63 6b 75 70 2c 31 30 30 29 29 3d 3d 53  pBackup,100))==S
13c30 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20  QLITE_OK.       
13c40 20 20 20 20 20 20 20 7c 7c 20 72 63 3d 3d 53 51         || rc==SQ
13c50 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
13c60 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
13c70 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20  E_BUSY ){.      
13c80 20 20 69 66 28 20 6e 54 69 6d 65 6f 75 74 2b 2b    if( nTimeout++
13c90 20 3e 3d 20 33 20 29 20 62 72 65 61 6b 3b 0a 20   >= 3 ) break;. 
13ca0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
13cb0 6c 65 65 70 28 31 30 30 29 3b 0a 20 20 20 20 20  leep(100);.     
13cc0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
13cd0 69 74 65 33 5f 62 61 63 6b 75 70 5f 66 69 6e 69  ite3_backup_fini
13ce0 73 68 28 70 42 61 63 6b 75 70 29 3b 0a 20 20 20  sh(pBackup);.   
13cf0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
13d00 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 72 63  DONE ){.      rc
13d10 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d   = TCL_OK;.    }
13d20 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
13d30 49 54 45 5f 42 55 53 59 20 7c 7c 20 72 63 3d 3d  ITE_BUSY || rc==
13d40 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 29 7b  SQLITE_LOCKED ){
13d50 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
13d60 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
13d70 22 72 65 73 74 6f 72 65 20 66 61 69 6c 65 64 3a  "restore failed:
13d80 20 73 6f 75 72 63 65 20 64 61 74 61 62 61 73 65   source database
13d90 20 62 75 73 79 22 2c 0a 20 20 20 20 20 20 20 20   busy",.        
13da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
13db0 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
13dc0 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  rc = TCL_ERROR;.
13dd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13de0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
13df0 74 28 69 6e 74 65 72 70 2c 20 22 72 65 73 74 6f  t(interp, "resto
13e00 72 65 20 66 61 69 6c 65 64 3a 20 22 2c 0a 20 20  re failed: ",.  
13e10 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
13e20 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29  _errmsg(pDb->db)
13e30 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
13e40 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f     rc = TCL_ERRO
13e50 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  R;.    }.    sql
13e60 69 74 65 33 5f 63 6c 6f 73 65 28 70 53 72 63 29  ite3_close(pSrc)
13e70 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
13e80 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  /*.  **     
13e90 24 64 62 20 73 74 61 74 75 73 20 28 73 74 65 70  $db status (step
13ea0 7c 73 6f 72 74 7c 61 75 74 6f 69 6e 64 65 78 29  |sort|autoindex)
13eb0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 69 73 70 6c  .  **.  ** Displ
13ec0 61 79 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54  ay SQLITE_STMTST
13ed0 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54  ATUS_FULLSCAN_ST
13ee0 45 50 20 6f 72 20 0a 20 20 2a 2a 20 53 51 4c 49  EP or .  ** SQLI
13ef0 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 53 4f  TE_STMTSTATUS_SO
13f00 52 54 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20  RT for the most 
13f10 72 65 63 65 6e 74 20 65 76 61 6c 2e 0a 20 20 2a  recent eval..  *
13f20 2f 0a 20 20 63 61 73 65 20 44 42 5f 53 54 41 54  /.  case DB_STAT
13f30 55 53 3a 20 7b 0a 20 20 20 20 69 6e 74 20 76 3b  US: {.    int v;
13f40 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
13f50 2a 7a 4f 70 3b 0a 20 20 20 20 69 66 28 20 6f 62  *zOp;.    if( ob
13f60 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54  jc!=3 ){.      T
13f70 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
13f80 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
13f90 20 22 28 73 74 65 70 7c 73 6f 72 74 7c 61 75 74   "(step|sort|aut
13fa0 6f 69 6e 64 65 78 29 22 29 3b 0a 20 20 20 20 20  oindex)");.     
13fb0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
13fc0 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4f 70  R;.    }.    zOp
13fd0 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
13fe0 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 69  (objv[2]);.    i
13ff0 66 28 20 73 74 72 63 6d 70 28 7a 4f 70 2c 20 22  f( strcmp(zOp, "
14000 73 74 65 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20  step")==0 ){.   
14010 20 20 20 76 20 3d 20 70 44 62 2d 3e 6e 53 74 65     v = pDb->nSte
14020 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  p;.    }else if(
14030 20 73 74 72 63 6d 70 28 7a 4f 70 2c 20 22 73 6f   strcmp(zOp, "so
14040 72 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rt")==0 ){.     
14050 20 76 20 3d 20 70 44 62 2d 3e 6e 53 6f 72 74 3b   v = pDb->nSort;
14060 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
14070 74 72 63 6d 70 28 7a 4f 70 2c 20 22 61 75 74 6f  trcmp(zOp, "auto
14080 69 6e 64 65 78 22 29 3d 3d 30 20 29 7b 0a 20 20  index")==0 ){.  
14090 20 20 20 20 76 20 3d 20 70 44 62 2d 3e 6e 49 6e      v = pDb->nIn
140a0 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  dex;.    }else{.
140b0 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
140c0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a  Result(interp, .
140d0 20 20 20 20 20 20 20 20 20 20 20 20 22 62 61 64              "bad
140e0 20 61 72 67 75 6d 65 6e 74 3a 20 73 68 6f 75 6c   argument: shoul
140f0 64 20 62 65 20 61 75 74 6f 69 6e 64 65 78 2c 20  d be autoindex, 
14100 73 74 65 70 2c 20 6f 72 20 73 6f 72 74 22 2c 20  step, or sort", 
14110 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68  .            (ch
14120 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65  ar*)0);.      re
14130 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
14140 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 53 65      }.    Tcl_Se
14150 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
14160 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
14170 28 76 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  (v));.    break;
14180 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a  .  }.  .  /*.  *
14190 2a 20 20 20 20 20 24 64 62 20 74 69 6d 65 6f 75  *     $db timeou
141a0 74 20 4d 49 4c 4c 45 53 45 43 4f 4e 44 53 0a 20  t MILLESECONDS. 
141b0 20 2a 2a 0a 20 20 2a 2a 20 44 65 6c 61 79 20 66   **.  ** Delay f
141c0 6f 72 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  or the number of
141d0 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 70   milliseconds sp
141e0 65 63 69 66 69 65 64 20 77 68 65 6e 20 61 20 66  ecified when a f
141f0 69 6c 65 20 69 73 20 6c 6f 63 6b 65 64 2e 0a 20  ile is locked.. 
14200 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54 49   */.  case DB_TI
14210 4d 45 4f 55 54 3a 20 7b 0a 20 20 20 20 69 6e 74  MEOUT: {.    int
14220 20 6d 73 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a   ms;.    if( obj
14230 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=3 ){.      Tc
14240 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
14250 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
14260 22 4d 49 4c 4c 49 53 45 43 4f 4e 44 53 22 29 3b  "MILLISECONDS");
14270 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
14280 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
14290 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e     if( Tcl_GetIn
142a0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
142b0 20 6f 62 6a 76 5b 32 5d 2c 20 26 6d 73 29 20 29   objv[2], &ms) )
142c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
142d0 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  R;.    sqlite3_b
142e0 75 73 79 5f 74 69 6d 65 6f 75 74 28 70 44 62 2d  usy_timeout(pDb-
142f0 3e 64 62 2c 20 6d 73 29 3b 0a 20 20 20 20 62 72  >db, ms);.    br
14300 65 61 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  eak;.  }.  .  /*
14310 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 74 6f  .  **     $db to
14320 74 61 6c 5f 63 68 61 6e 67 65 73 0a 20 20 2a 2a  tal_changes.  **
14330 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  .  ** Return the
14340 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
14350 74 68 61 74 20 77 65 72 65 20 6d 6f 64 69 66 69  that were modifi
14360 65 64 2c 20 69 6e 73 65 72 74 65 64 2c 20 6f 72  ed, inserted, or
14370 20 64 65 6c 65 74 65 64 20 0a 20 20 2a 2a 20 73   deleted .  ** s
14380 69 6e 63 65 20 74 68 65 20 64 61 74 61 62 61 73  ince the databas
14390 65 20 68 61 6e 64 6c 65 20 77 61 73 20 63 72 65  e handle was cre
143a0 61 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  ated..  */.  cas
143b0 65 20 44 42 5f 54 4f 54 41 4c 5f 43 48 41 4e 47  e DB_TOTAL_CHANG
143c0 45 53 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62  ES: {.    Tcl_Ob
143d0 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20  j *pResult;.    
143e0 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
143f0 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
14400 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
14410 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20   objv, "");.    
14420 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
14430 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 52  OR;.    }.    pR
14440 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f  esult = Tcl_GetO
14450 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  bjResult(interp)
14460 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 49 6e 74  ;.    Tcl_SetInt
14470 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 73 71 6c  Obj(pResult, sql
14480 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67  ite3_total_chang
14490 65 73 28 70 44 62 2d 3e 64 62 29 29 3b 0a 20 20  es(pDb->db));.  
144a0 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
144b0 2f 2a 20 20 20 20 24 64 62 20 74 72 61 63 65 20  /*    $db trace 
144c0 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a  ?CALLBACK?.  **.
144d0 20 20 2a 2a 20 4d 61 6b 65 20 61 72 72 61 6e 67    ** Make arrang
144e0 65 6d 65 6e 74 73 20 74 6f 20 69 6e 76 6f 6b 65  ements to invoke
144f0 20 74 68 65 20 43 41 4c 4c 42 41 43 4b 20 72 6f   the CALLBACK ro
14500 75 74 69 6e 65 20 66 6f 72 20 65 61 63 68 20 53  utine for each S
14510 51 4c 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a  QL statement.  *
14520 2a 20 74 68 61 74 20 69 73 20 65 78 65 63 75 74  * that is execut
14530 65 64 2e 20 20 54 68 65 20 74 65 78 74 20 6f 66  ed.  The text of
14540 20 74 68 65 20 53 51 4c 20 69 73 20 61 70 70 65   the SQL is appe
14550 6e 64 65 64 20 74 6f 20 43 41 4c 4c 42 41 43 4b  nded to CALLBACK
14560 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 69 74 20   before.  ** it 
14570 69 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20 2a  is executed..  *
14580 2f 0a 20 20 63 61 73 65 20 44 42 5f 54 52 41 43  /.  case DB_TRAC
14590 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a  E: {.    if( obj
145a0 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  c>3 ){.      Tcl
145b0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
145c0 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
145d0 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20  ?CALLBACK?");.  
145e0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
145f0 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20  RROR;.    }else 
14600 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20  if( objc==2 ){. 
14610 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54       if( pDb->zT
14620 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  race ){.        
14630 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
14640 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 54  (interp, pDb->zT
14650 72 61 63 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  race, 0);.      
14660 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
14670 20 20 20 63 68 61 72 20 2a 7a 54 72 61 63 65 3b     char *zTrace;
14680 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  .      int len;.
14690 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
146a0 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20  Trace ){.       
146b0 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
146c0 54 72 61 63 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Trace);.      }.
146d0 20 20 20 20 20 20 7a 54 72 61 63 65 20 3d 20 54        zTrace = T
146e0 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
146f0 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65  Obj(objv[2], &le
14700 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 54  n);.      if( zT
14710 72 61 63 65 20 26 26 20 6c 65 6e 3e 30 20 29 7b  race && len>0 ){
14720 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 54  .        pDb->zT
14730 72 61 63 65 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63  race = Tcl_Alloc
14740 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20  ( len + 1 );.   
14750 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d       memcpy(pDb-
14760 3e 7a 54 72 61 63 65 2c 20 7a 54 72 61 63 65 2c  >zTrace, zTrace,
14770 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d   len+1);.      }
14780 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44  else{.        pD
14790 62 2d 3e 7a 54 72 61 63 65 20 3d 20 30 3b 0a 20  b->zTrace = 0;. 
147a0 20 20 20 20 20 7d 0a 23 69 66 20 21 64 65 66 69       }.#if !defi
147b0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
147c0 54 52 41 43 45 29 20 26 26 20 21 64 65 66 69 6e  TRACE) && !defin
147d0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ed(SQLITE_OMIT_F
147e0 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20  LOATING_POINT). 
147f0 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54       if( pDb->zT
14800 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  race ){.        
14810 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e  pDb->interp = in
14820 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71  terp;.        sq
14830 6c 69 74 65 33 5f 74 72 61 63 65 28 70 44 62 2d  lite3_trace(pDb-
14840 3e 64 62 2c 20 44 62 54 72 61 63 65 48 61 6e 64  >db, DbTraceHand
14850 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20  ler, pDb);.     
14860 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14870 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28 70 44  sqlite3_trace(pD
14880 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  b->db, 0, 0);.  
14890 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
148a0 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
148b0 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 74  }..  /*    $db t
148c0 72 61 6e 73 61 63 74 69 6f 6e 20 5b 2d 64 65 66  ransaction [-def
148d0 65 72 72 65 64 7c 2d 69 6d 6d 65 64 69 61 74 65  erred|-immediate
148e0 7c 2d 65 78 63 6c 75 73 69 76 65 5d 20 53 43 52  |-exclusive] SCR
148f0 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 74  IPT.  **.  ** St
14900 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61  art a new transa
14910 63 74 69 6f 6e 20 28 69 66 20 77 65 20 61 72 65  ction (if we are
14920 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20   not already in 
14930 74 68 65 20 6d 69 64 73 74 20 6f 66 20 61 0a 20  the midst of a. 
14940 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 29   ** transaction)
14950 20 61 6e 64 20 65 78 65 63 75 74 65 20 74 68 65   and execute the
14960 20 54 43 4c 20 73 63 72 69 70 74 20 53 43 52 49   TCL script SCRI
14970 50 54 2e 20 20 41 66 74 65 72 20 53 43 52 49 50  PT.  After SCRIP
14980 54 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 73  T.  ** completes
14990 2c 20 65 69 74 68 65 72 20 63 6f 6d 6d 69 74 20  , either commit 
149a0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
149b0 6f 72 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20  or roll it back 
149c0 69 66 20 53 43 52 49 50 54 0a 20 20 2a 2a 20 74  if SCRIPT.  ** t
149d0 68 72 6f 77 73 20 61 6e 20 65 78 63 65 70 74 69  hrows an excepti
149e0 6f 6e 2e 20 20 4f 72 20 69 66 20 6e 6f 20 6e 65  on.  Or if no ne
149f0 77 20 74 72 61 6e 73 61 74 69 6f 6e 20 77 61 73  w transation was
14a00 20 73 74 61 72 74 65 64 2c 20 64 6f 20 6e 6f 74   started, do not
14a10 68 69 6e 67 2e 0a 20 20 2a 2a 20 70 61 73 73 20  hing..  ** pass 
14a20 74 68 65 20 65 78 63 65 70 74 69 6f 6e 20 6f 6e  the exception on
14a30 20 75 70 20 74 68 65 20 73 74 61 63 6b 2e 0a 20   up the stack.. 
14a40 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63 6f   **.  ** This co
14a50 6d 6d 61 6e 64 20 77 61 73 20 69 6e 73 70 69 72  mmand was inspir
14a60 65 64 20 62 79 20 44 61 76 65 20 54 68 6f 6d 61  ed by Dave Thoma
14a70 73 27 73 20 74 61 6c 6b 20 6f 6e 20 52 75 62 79  s's talk on Ruby
14a80 20 61 74 20 74 68 65 0a 20 20 2a 2a 20 32 30 30   at the.  ** 200
14a90 35 20 4f 27 52 65 69 6c 6c 79 20 4f 70 65 6e 20  5 O'Reilly Open 
14aa0 53 6f 75 72 63 65 20 43 6f 6e 76 65 6e 74 69 6f  Source Conventio
14ab0 6e 20 28 4f 53 43 4f 4e 29 2e 0a 20 20 2a 2f 0a  n (OSCON)..  */.
14ac0 20 20 63 61 73 65 20 44 42 5f 54 52 41 4e 53 41    case DB_TRANSA
14ad0 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 54 63 6c  CTION: {.    Tcl
14ae0 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 0a 20  _Obj *pScript;. 
14af0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
14b00 42 65 67 69 6e 20 3d 20 22 53 41 56 45 50 4f 49  Begin = "SAVEPOI
14b10 4e 54 20 5f 74 63 6c 5f 74 72 61 6e 73 61 63 74  NT _tcl_transact
14b20 69 6f 6e 22 3b 0a 20 20 20 20 69 66 28 20 6f 62  ion";.    if( ob
14b30 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d 34  jc!=3 && objc!=4
14b40 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
14b50 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
14b60 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 5b 54 59  p, 2, objv, "[TY
14b70 50 45 5d 20 53 43 52 49 50 54 22 29 3b 0a 20 20  PE] SCRIPT");.  
14b80 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
14b90 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
14ba0 20 69 66 28 20 70 44 62 2d 3e 6e 54 72 61 6e 73   if( pDb->nTrans
14bb0 61 63 74 69 6f 6e 3d 3d 30 20 26 26 20 6f 62 6a  action==0 && obj
14bc0 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 73 74  c==4 ){.      st
14bd0 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
14be0 2a 54 54 59 50 45 5f 73 74 72 73 5b 5d 20 3d 20  *TTYPE_strs[] = 
14bf0 7b 0a 20 20 20 20 20 20 20 20 22 64 65 66 65 72  {.        "defer
14c00 72 65 64 22 2c 20 20 20 22 65 78 63 6c 75 73 69  red",   "exclusi
14c10 76 65 22 2c 20 20 22 69 6d 6d 65 64 69 61 74 65  ve",  "immediate
14c20 22 2c 20 30 0a 20 20 20 20 20 20 7d 3b 0a 20 20  ", 0.      };.  
14c30 20 20 20 20 65 6e 75 6d 20 54 54 59 50 45 5f 65      enum TTYPE_e
14c40 6e 75 6d 20 7b 0a 20 20 20 20 20 20 20 20 54 54  num {.        TT
14c50 59 50 45 5f 44 45 46 45 52 52 45 44 2c 20 54 54  YPE_DEFERRED, TT
14c60 59 50 45 5f 45 58 43 4c 55 53 49 56 45 2c 20 54  YPE_EXCLUSIVE, T
14c70 54 59 50 45 5f 49 4d 4d 45 44 49 41 54 45 0a 20  TYPE_IMMEDIATE. 
14c80 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 69 6e       };.      in
14c90 74 20 74 74 79 70 65 3b 0a 20 20 20 20 20 20 69  t ttype;.      i
14ca0 66 28 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46  f( Tcl_GetIndexF
14cb0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
14cc0 62 6a 76 5b 32 5d 2c 20 54 54 59 50 45 5f 73 74  bjv[2], TTYPE_st
14cd0 72 73 2c 20 22 74 72 61 6e 73 61 63 74 69 6f 6e  rs, "transaction
14ce0 20 74 79 70 65 22 2c 0a 20 20 20 20 20 20 20 20   type",.        
14cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d00 20 20 20 20 20 20 30 2c 20 26 74 74 79 70 65 29        0, &ttype)
14d10 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
14d20 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
14d30 20 20 20 20 7d 0a 20 20 20 20 20 20 73 77 69 74      }.      swit
14d40 63 68 28 20 28 65 6e 75 6d 20 54 54 59 50 45 5f  ch( (enum TTYPE_
14d50 65 6e 75 6d 29 74 74 79 70 65 20 29 7b 0a 20 20  enum)ttype ){.  
14d60 20 20 20 20 20 20 63 61 73 65 20 54 54 59 50 45        case TTYPE
14d70 5f 44 45 46 45 52 52 45 44 3a 20 20 20 20 2f 2a  _DEFERRED:    /*
14d80 20 6e 6f 2d 6f 70 20 2a 2f 3b 20 20 20 20 20 20   no-op */;      
14d90 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
14da0 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 54  ;.        case T
14db0 54 59 50 45 5f 45 58 43 4c 55 53 49 56 45 3a 20  TYPE_EXCLUSIVE: 
14dc0 20 20 7a 42 65 67 69 6e 20 3d 20 22 42 45 47 49    zBegin = "BEGI
14dd0 4e 20 45 58 43 4c 55 53 49 56 45 22 3b 20 20 62  N EXCLUSIVE";  b
14de0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
14df0 73 65 20 54 54 59 50 45 5f 49 4d 4d 45 44 49 41  se TTYPE_IMMEDIA
14e00 54 45 3a 20 20 20 7a 42 65 67 69 6e 20 3d 20 22  TE:   zBegin = "
14e10 42 45 47 49 4e 20 49 4d 4d 45 44 49 41 54 45 22  BEGIN IMMEDIATE"
14e20 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;  break;.      
14e30 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 63 72  }.    }.    pScr
14e40 69 70 74 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d  ipt = objv[objc-
14e50 31 5d 3b 0a 0a 20 20 20 20 2f 2a 20 52 75 6e 20  1];..    /* Run 
14e60 74 68 65 20 53 51 4c 69 74 65 20 42 45 47 49 4e  the SQLite BEGIN
14e70 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 6f 70 65 6e   command to open
14e80 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f   a transaction o
14e90 72 20 73 61 76 65 70 6f 69 6e 74 2e 20 2a 2f 0a  r savepoint. */.
14ea0 20 20 20 20 70 44 62 2d 3e 64 69 73 61 62 6c 65      pDb->disable
14eb0 41 75 74 68 2b 2b 3b 0a 20 20 20 20 72 63 20 3d  Auth++;.    rc =
14ec0 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44   sqlite3_exec(pD
14ed0 62 2d 3e 64 62 2c 20 7a 42 65 67 69 6e 2c 20 30  b->db, zBegin, 0
14ee0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 44 62  , 0, 0);.    pDb
14ef0 2d 3e 64 69 73 61 62 6c 65 41 75 74 68 2d 2d 3b  ->disableAuth--;
14f00 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
14f10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
14f20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
14f30 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33  (interp, sqlite3
14f40 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29  _errmsg(pDb->db)
14f50 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , 0);.      retu
14f60 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
14f70 20 20 7d 0a 20 20 20 20 70 44 62 2d 3e 6e 54 72    }.    pDb->nTr
14f80 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 0a 20 20  ansaction++;..  
14f90 20 20 2f 2a 20 49 66 20 75 73 69 6e 67 20 4e 52    /* If using NR
14fa0 45 2c 20 73 63 68 65 64 75 6c 65 20 61 20 63 61  E, schedule a ca
14fb0 6c 6c 62 61 63 6b 20 74 6f 20 69 6e 76 6f 6b 65  llback to invoke
14fc0 20 74 68 65 20 73 63 72 69 70 74 20 70 53 63 72   the script pScr
14fd0 69 70 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ipt, then.    **
14fe0 20 61 20 73 65 63 6f 6e 64 20 63 61 6c 6c 62 61   a second callba
14ff0 63 6b 20 74 6f 20 63 6f 6d 6d 69 74 20 28 6f 72  ck to commit (or
15000 20 72 6f 6c 6c 62 61 63 6b 29 20 74 68 65 20 74   rollback) the t
15010 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 73 61  ransaction or sa
15020 76 65 70 6f 69 6e 74 0a 20 20 20 20 2a 2a 20 6f  vepoint.    ** o
15030 70 65 6e 65 64 20 61 62 6f 76 65 2e 20 49 66 20  pened above. If 
15040 6e 6f 74 20 75 73 69 6e 67 20 4e 52 45 2c 20 65  not using NRE, e
15050 76 61 6c 75 61 74 65 20 74 68 65 20 73 63 72 69  valuate the scri
15060 70 74 20 64 69 72 65 63 74 6c 79 2c 20 74 68 65  pt directly, the
15070 6e 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 66 75  n.    ** call fu
15080 6e 63 74 69 6f 6e 20 44 62 54 72 61 6e 73 50 6f  nction DbTransPo
15090 73 74 43 6d 64 28 29 20 74 6f 20 63 6f 6d 6d 69  stCmd() to commi
150a0 74 20 28 6f 72 20 72 6f 6c 6c 62 61 63 6b 29 20  t (or rollback) 
150b0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
150c0 0a 20 20 20 20 2a 2a 20 6f 72 20 73 61 76 65 70  .    ** or savep
150d0 6f 69 6e 74 2e 20 20 2a 2f 0a 20 20 20 20 69 66  oint.  */.    if
150e0 28 20 44 62 55 73 65 4e 72 65 28 29 20 29 7b 0a  ( DbUseNre() ){.
150f0 20 20 20 20 20 20 54 63 6c 5f 4e 52 41 64 64 43        Tcl_NRAddC
15100 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20  allback(interp, 
15110 44 62 54 72 61 6e 73 50 6f 73 74 43 6d 64 2c 20  DbTransPostCmd, 
15120 63 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  cd, 0, 0, 0);.  
15130 20 20 20 20 54 63 6c 5f 4e 52 45 76 61 6c 4f 62      Tcl_NREvalOb
15140 6a 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70  j(interp, pScrip
15150 74 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t, 0);.    }else
15160 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 44 62 54  {.      rc = DbT
15170 72 61 6e 73 50 6f 73 74 43 6d 64 28 26 63 64 2c  ransPostCmd(&cd,
15180 20 69 6e 74 65 72 70 2c 20 54 63 6c 5f 45 76 61   interp, Tcl_Eva
15190 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 70  lObjEx(interp, p
151a0 53 63 72 69 70 74 2c 20 30 29 29 3b 0a 20 20 20  Script, 0));.   
151b0 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
151c0 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
151d0 24 64 62 20 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66  $db unlock_notif
151e0 79 20 3f 73 63 72 69 70 74 3f 0a 20 20 2a 2f 0a  y ?script?.  */.
151f0 20 20 63 61 73 65 20 44 42 5f 55 4e 4c 4f 43 4b    case DB_UNLOCK
15200 5f 4e 4f 54 49 46 59 3a 20 7b 0a 23 69 66 6e 64  _NOTIFY: {.#ifnd
15210 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
15220 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0a 20  _UNLOCK_NOTIFY. 
15230 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
15240 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 6c  ult(interp, "unl
15250 6f 63 6b 5f 6e 6f 74 69 66 79 20 6e 6f 74 20 61  ock_notify not a
15260 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 69 73  vailable in this
15270 20 62 75 69 6c 64 22 2c 20 30 29 3b 0a 20 20 20   build", 0);.   
15280 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b   rc = TCL_ERROR;
15290 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 6f  .#else.    if( o
152a0 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d  bjc!=2 && objc!=
152b0 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
152c0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
152d0 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 53  rp, 2, objv, "?S
152e0 43 52 49 50 54 3f 22 29 3b 0a 20 20 20 20 20 20  CRIPT?");.      
152f0 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  rc = TCL_ERROR;.
15300 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15310 20 76 6f 69 64 20 28 2a 78 4e 6f 74 69 66 79 29   void (*xNotify)
15320 28 76 6f 69 64 20 2a 2a 2c 20 69 6e 74 29 20 3d  (void **, int) =
15330 20 30 3b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a   0;.      void *
15340 70 4e 6f 74 69 66 79 41 72 67 20 3d 20 30 3b 0a  pNotifyArg = 0;.
15350 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
15360 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 20 29 7b  pUnlockNotify ){
15370 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63  .        Tcl_Dec
15380 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70  rRefCount(pDb->p
15390 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 29 3b 0a 20  UnlockNotify);. 
153a0 20 20 20 20 20 20 20 70 44 62 2d 3e 70 55 6e 6c         pDb->pUnl
153b0 6f 63 6b 4e 6f 74 69 66 79 20 3d 20 30 3b 0a 20  ockNotify = 0;. 
153c0 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
153d0 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20  if( objc==3 ){. 
153e0 20 20 20 20 20 20 20 78 4e 6f 74 69 66 79 20 3d         xNotify =
153f0 20 44 62 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 3b   DbUnlockNotify;
15400 0a 20 20 20 20 20 20 20 20 70 4e 6f 74 69 66 79  .        pNotify
15410 41 72 67 20 3d 20 28 76 6f 69 64 20 2a 29 70 44  Arg = (void *)pD
15420 62 3b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  b;.        pDb->
15430 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 20 3d 20  pUnlockNotify = 
15440 6f 62 6a 76 5b 32 5d 3b 0a 20 20 20 20 20 20 20  objv[2];.       
15450 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
15460 74 28 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f  t(pDb->pUnlockNo
15470 74 69 66 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20  tify);.      }. 
15480 20 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69   .      if( sqli
15490 74 65 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66  te3_unlock_notif
154a0 79 28 70 44 62 2d 3e 64 62 2c 20 78 4e 6f 74 69  y(pDb->db, xNoti
154b0 66 79 2c 20 70 4e 6f 74 69 66 79 41 72 67 29 20  fy, pNotifyArg) 
154c0 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41  ){.        Tcl_A
154d0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
154e0 72 70 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  rp, sqlite3_errm
154f0 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b  sg(pDb->db), 0);
15500 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 43  .        rc = TC
15510 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  L_ERROR;.      }
15520 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
15530 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
15540 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 77  /*.  **    $db w
15550 61 6c 5f 68 6f 6f 6b 20 3f 73 63 72 69 70 74 3f  al_hook ?script?
15560 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 75 70 64  .  **    $db upd
15570 61 74 65 5f 68 6f 6f 6b 20 3f 73 63 72 69 70 74  ate_hook ?script
15580 3f 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 72 6f  ?.  **    $db ro
15590 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 20 3f 73 63 72  llback_hook ?scr
155a0 69 70 74 3f 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ipt?.  */.  case
155b0 20 44 42 5f 57 41 4c 5f 48 4f 4f 4b 3a 20 0a 20   DB_WAL_HOOK: . 
155c0 20 63 61 73 65 20 44 42 5f 55 50 44 41 54 45 5f   case DB_UPDATE_
155d0 48 4f 4f 4b 3a 20 0a 20 20 63 61 73 65 20 44 42  HOOK: .  case DB
155e0 5f 52 4f 4c 4c 42 41 43 4b 5f 48 4f 4f 4b 3a 20  _ROLLBACK_HOOK: 
155f0 7b 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 70 70  {..    /* set pp
15600 48 6f 6f 6b 20 74 6f 20 70 6f 69 6e 74 20 61 74  Hook to point at
15610 20 70 55 70 64 61 74 65 48 6f 6f 6b 20 6f 72 20   pUpdateHook or 
15620 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 2c 20 64  pRollbackHook, d
15630 65 70 65 6e 64 69 6e 67 20 6f 6e 20 0a 20 20 20  epending on .   
15640 20 2a 2a 20 77 68 65 74 68 65 72 20 5b 24 64 62   ** whether [$db
15650 20 75 70 64 61 74 65 5f 68 6f 6f 6b 5d 20 6f 72   update_hook] or
15660 20 5b 24 64 62 20 72 6f 6c 6c 62 61 63 6b 5f 68   [$db rollback_h
15670 6f 6f 6b 5d 20 77 61 73 20 69 6e 76 6f 6b 65 64  ook] was invoked
15680 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c  ..    */.    Tcl
15690 5f 4f 62 6a 20 2a 2a 70 70 48 6f 6f 6b 3b 20 0a  _Obj **ppHook; .
156a0 20 20 20 20 69 66 28 20 63 68 6f 69 63 65 3d 3d      if( choice==
156b0 44 42 5f 55 50 44 41 54 45 5f 48 4f 4f 4b 20 29  DB_UPDATE_HOOK )
156c0 7b 0a 20 20 20 20 20 20 70 70 48 6f 6f 6b 20 3d  {.      ppHook =
156d0 20 26 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f   &pDb->pUpdateHo
156e0 6f 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ok;.    }else if
156f0 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f 57 41 4c  ( choice==DB_WAL
15700 5f 48 4f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  _HOOK ){.      p
15710 70 48 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e 70 57  pHook = &pDb->pW
15720 61 6c 48 6f 6f 6b 3b 0a 20 20 20 20 7d 65 6c 73  alHook;.    }els
15730 65 7b 0a 20 20 20 20 20 20 70 70 48 6f 6f 6b 20  e{.      ppHook 
15740 3d 20 26 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63  = &pDb->pRollbac
15750 6b 48 6f 6f 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  kHook;.    }..  
15760 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26 26    if( objc!=2 &&
15770 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
15780 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
15790 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
157a0 62 6a 76 2c 20 22 3f 53 43 52 49 50 54 3f 22 29  bjv, "?SCRIPT?")
157b0 3b 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  ;.       return 
157c0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
157d0 0a 20 20 20 20 69 66 28 20 2a 70 70 48 6f 6f 6b  .    if( *ppHook
157e0 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65   ){.      Tcl_Se
157f0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
15800 70 2c 20 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20  p, *ppHook);.   
15810 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29     if( objc==3 )
15820 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65  {.        Tcl_De
15830 63 72 52 65 66 43 6f 75 6e 74 28 2a 70 70 48 6f  crRefCount(*ppHo
15840 6f 6b 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70  ok);.        *pp
15850 48 6f 6f 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  Hook = 0;.      
15860 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
15870 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20  objc==3 ){.     
15880 20 61 73 73 65 72 74 28 20 21 28 2a 70 70 48 6f   assert( !(*ppHo
15890 6f 6b 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ok) );.      if(
158a0 20 54 63 6c 5f 47 65 74 43 68 61 72 4c 65 6e 67   Tcl_GetCharLeng
158b0 74 68 28 6f 62 6a 76 5b 32 5d 29 3e 30 20 29 7b  th(objv[2])>0 ){
158c0 0a 20 20 20 20 20 20 20 20 2a 70 70 48 6f 6f 6b  .        *ppHook
158d0 20 3d 20 6f 62 6a 76 5b 32 5d 3b 0a 20 20 20 20   = objv[2];.    
158e0 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
158f0 6f 75 6e 74 28 2a 70 70 48 6f 6f 6b 29 3b 0a 20  ount(*ppHook);. 
15900 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
15910 20 20 73 71 6c 69 74 65 33 5f 75 70 64 61 74 65    sqlite3_update
15920 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20 28  _hook(pDb->db, (
15930 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b  pDb->pUpdateHook
15940 3f 44 62 55 70 64 61 74 65 48 61 6e 64 6c 65 72  ?DbUpdateHandler
15950 3a 30 29 2c 20 70 44 62 29 3b 0a 20 20 20 20 73  :0), pDb);.    s
15960 71 6c 69 74 65 33 5f 72 6f 6c 6c 62 61 63 6b 5f  qlite3_rollback_
15970 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 28 70 44  hook(pDb->db,(pD
15980 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b  b->pRollbackHook
15990 3f 44 62 52 6f 6c 6c 62 61 63 6b 48 61 6e 64 6c  ?DbRollbackHandl
159a0 65 72 3a 30 29 2c 70 44 62 29 3b 0a 20 20 20 20  er:0),pDb);.    
159b0 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
159c0 28 70 44 62 2d 3e 64 62 2c 28 70 44 62 2d 3e 70  (pDb->db,(pDb->p
159d0 57 61 6c 48 6f 6f 6b 3f 44 62 57 61 6c 48 61 6e  WalHook?DbWalHan
159e0 64 6c 65 72 3a 30 29 2c 70 44 62 29 3b 0a 0a 20  dler:0),pDb);.. 
159f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
15a00 20 2f 2a 20 20 20 20 24 64 62 20 76 65 72 73 69   /*    $db versi
15a10 6f 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74  on.  **.  ** Ret
15a20 75 72 6e 20 74 68 65 20 76 65 72 73 69 6f 6e 20  urn the version 
15a30 73 74 72 69 6e 67 20 66 6f 72 20 74 68 69 73 20  string for this 
15a40 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20  database..  */. 
15a50 20 63 61 73 65 20 44 42 5f 56 45 52 53 49 4f 4e   case DB_VERSION
15a60 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52  : {.    Tcl_SetR
15a70 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
15a80 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6c 69  har *)sqlite3_li
15a90 62 76 65 72 73 69 6f 6e 28 29 2c 20 54 43 4c 5f  bversion(), TCL_
15aa0 53 54 41 54 49 43 29 3b 0a 20 20 20 20 62 72 65  STATIC);.    bre
15ab0 61 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 7d 20 2f 2a  ak;.  }...  } /*
15ac0 20 45 6e 64 20 6f 66 20 74 68 65 20 53 57 49 54   End of the SWIT
15ad0 43 48 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CH statement */.
15ae0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
15af0 23 69 66 20 53 51 4c 49 54 45 5f 54 43 4c 5f 4e  #if SQLITE_TCL_N
15b00 52 45 0a 2f 2a 0a 2a 2a 20 41 64 61 70 74 6f 72  RE./*.** Adaptor
15b10 20 74 68 61 74 20 70 72 6f 76 69 64 65 73 20 61   that provides a
15b20 6e 20 6f 62 6a 43 6d 64 20 69 6e 74 65 72 66 61  n objCmd interfa
15b30 63 65 20 74 6f 20 74 68 65 20 4e 52 45 2d 65 6e  ce to the NRE-en
15b40 61 62 6c 65 64 0a 2a 2a 20 69 6e 74 65 72 66 61  abled.** interfa
15b50 63 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ce implementatio
15b60 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
15b70 20 44 62 4f 62 6a 43 6d 64 41 64 61 70 74 6f 72   DbObjCmdAdaptor
15b80 28 0a 20 20 76 6f 69 64 20 2a 63 64 2c 0a 20 20  (.  void *cd,.  
15b90 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
15ba0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
15bb0 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74    Tcl_Obj *const
15bc0 2a 6f 62 6a 76 0a 29 7b 0a 20 20 72 65 74 75 72  *objv.){.  retur
15bd0 6e 20 54 63 6c 5f 4e 52 43 61 6c 6c 4f 62 6a 50  n Tcl_NRCallObjP
15be0 72 6f 63 28 69 6e 74 65 72 70 2c 20 44 62 4f 62  roc(interp, DbOb
15bf0 6a 43 6d 64 2c 20 63 64 2c 20 6f 62 6a 63 2c 20  jCmd, cd, objc, 
15c00 6f 62 6a 76 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  objv);.}.#endif 
15c10 2f 2a 20 53 51 4c 49 54 45 5f 54 43 4c 5f 4e 52  /* SQLITE_TCL_NR
15c20 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 20 20 73 71  E */../*.**   sq
15c30 6c 69 74 65 33 20 44 42 4e 41 4d 45 20 46 49 4c  lite3 DBNAME FIL
15c40 45 4e 41 4d 45 20 3f 2d 76 66 73 20 56 46 53 4e  ENAME ?-vfs VFSN
15c50 41 4d 45 3f 20 3f 2d 6b 65 79 20 4b 45 59 3f 20  AME? ?-key KEY? 
15c60 3f 2d 72 65 61 64 6f 6e 6c 79 20 42 4f 4f 4c 45  ?-readonly BOOLE
15c70 41 4e 3f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  AN?.**          
15c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c90 20 3f 2d 63 72 65 61 74 65 20 42 4f 4f 4c 45 41   ?-create BOOLEA
15ca0 4e 3f 20 3f 2d 6e 6f 6d 75 74 65 78 20 42 4f 4f  N? ?-nomutex BOO
15cb0 4c 45 41 4e 3f 0a 2a 2a 0a 2a 2a 20 54 68 69 73  LEAN?.**.** This
15cc0 20 69 73 20 74 68 65 20 6d 61 69 6e 20 54 63 6c   is the main Tcl
15cd0 20 63 6f 6d 6d 61 6e 64 2e 20 20 57 68 65 6e 20   command.  When 
15ce0 74 68 65 20 22 73 71 6c 69 74 65 22 20 54 63 6c  the "sqlite" Tcl
15cf0 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 69   command is.** i
15d00 6e 76 6f 6b 65 64 2c 20 74 68 69 73 20 72 6f 75  nvoked, this rou
15d10 74 69 6e 65 20 72 75 6e 73 20 74 6f 20 70 72 6f  tine runs to pro
15d20 63 65 73 73 20 74 68 61 74 20 63 6f 6d 6d 61 6e  cess that comman
15d30 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  d..**.** The fir
15d40 73 74 20 61 72 67 75 6d 65 6e 74 2c 20 44 42 4e  st argument, DBN
15d50 41 4d 45 2c 20 69 73 20 61 6e 20 61 72 62 69 74  AME, is an arbit
15d60 72 61 72 79 20 6e 61 6d 65 20 66 6f 72 20 61 20  rary name for a 
15d70 6e 65 77 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  new.** database 
15d80 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 54 68 69  connection.  Thi
15d90 73 20 63 6f 6d 6d 61 6e 64 20 63 72 65 61 74 65  s command create
15da0 73 20 61 20 6e 65 77 20 63 6f 6d 6d 61 6e 64 20  s a new command 
15db0 6e 61 6d 65 64 0a 2a 2a 20 44 42 4e 41 4d 45 20  named.** DBNAME 
15dc0 74 68 61 74 20 69 73 20 75 73 65 64 20 74 6f 20  that is used to 
15dd0 63 6f 6e 74 72 6f 6c 20 74 68 61 74 20 63 6f 6e  control that con
15de0 6e 65 63 74 69 6f 6e 2e 20 20 54 68 65 20 64 61  nection.  The da
15df0 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63  tabase.** connec
15e00 74 69 6f 6e 20 69 73 20 64 65 6c 65 74 65 64 20  tion is deleted 
15e10 77 68 65 6e 20 74 68 65 20 44 42 4e 41 4d 45 20  when the DBNAME 
15e20 63 6f 6d 6d 61 6e 64 20 69 73 20 64 65 6c 65 74  command is delet
15e30 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65  ed..**.** The se
15e40 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
15e50 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
15e60 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
15e70 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  **.*/.static int
15e80 20 44 62 4d 61 69 6e 28 76 6f 69 64 20 2a 63 64   DbMain(void *cd
15e90 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
15ea0 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 54  terp, int objc,T
15eb0 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62  cl_Obj *const*ob
15ec0 6a 76 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20  jv){.  SqliteDb 
15ed0 2a 70 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  *p;.  const char
15ee0 20 2a 7a 41 72 67 3b 0a 20 20 63 68 61 72 20 2a   *zArg;.  char *
15ef0 7a 45 72 72 4d 73 67 3b 0a 20 20 69 6e 74 20 69  zErrMsg;.  int i
15f00 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
15f10 7a 46 69 6c 65 3b 0a 20 20 63 6f 6e 73 74 20 63  zFile;.  const c
15f20 68 61 72 20 2a 7a 56 66 73 20 3d 20 30 3b 0a 20  har *zVfs = 0;. 
15f30 20 69 6e 74 20 66 6c 61 67 73 3b 0a 20 20 54 63   int flags;.  Tc
15f40 6c 5f 44 53 74 72 69 6e 67 20 74 72 61 6e 73 6c  l_DString transl
15f50 61 74 65 64 46 69 6c 65 6e 61 6d 65 3b 0a 23 69  atedFilename;.#i
15f60 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
15f70 43 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 70 4b  CODEC.  void *pK
15f80 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4b  ey = 0;.  int nK
15f90 65 79 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  ey = 0;.#endif. 
15fa0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 49   int rc;..  /* I
15fb0 6e 20 6e 6f 72 6d 61 6c 20 75 73 65 2c 20 65 61  n normal use, ea
15fc0 63 68 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  ch TCL interpret
15fd0 65 72 20 72 75 6e 73 20 69 6e 20 61 20 73 69 6e  er runs in a sin
15fe0 67 6c 65 20 74 68 72 65 61 64 2e 20 20 53 6f 0a  gle thread.  So.
15ff0 20 20 2a 2a 20 62 79 20 64 65 66 61 75 6c 74 2c    ** by default,
16000 20 77 65 20 63 61 6e 20 74 75 72 6e 20 6f 66 20   we can turn of 
16010 6d 75 74 65 78 69 6e 67 20 6f 6e 20 53 51 4c 69  mutexing on SQLi
16020 74 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  te database conn
16030 65 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a 20 48 6f  ections..  ** Ho
16040 77 65 76 65 72 2c 20 66 6f 72 20 74 65 73 74 69  wever, for testi
16050 6e 67 20 70 75 72 70 6f 73 65 73 20 69 74 20 69  ng purposes it i
16060 73 20 75 73 65 66 75 6c 20 74 6f 20 68 61 76 65  s useful to have
16070 20 6d 75 74 65 78 65 73 20 74 75 72 6e 65 64 0a   mutexes turned.
16080 20 20 2a 2a 20 6f 6e 2e 20 20 53 6f 2c 20 62 79    ** on.  So, by
16090 20 64 65 66 61 75 6c 74 2c 20 6d 75 74 65 78 65   default, mutexe
160a0 73 20 64 65 66 61 75 6c 74 20 6f 66 66 2e 20 20  s default off.  
160b0 42 75 74 20 69 66 20 63 6f 6d 70 69 6c 65 64 20  But if compiled 
160c0 77 69 74 68 0a 20 20 2a 2a 20 53 51 4c 49 54 45  with.  ** SQLITE
160d0 5f 54 43 4c 5f 44 45 46 41 55 4c 54 5f 46 55 4c  _TCL_DEFAULT_FUL
160e0 4c 4d 55 54 45 58 20 74 68 65 6e 20 6d 75 74 65  LMUTEX then mute
160f0 78 65 73 20 64 65 66 61 75 6c 74 20 6f 6e 2e 0a  xes default on..
16100 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
16110 54 45 5f 54 43 4c 5f 44 45 46 41 55 4c 54 5f 46  TE_TCL_DEFAULT_F
16120 55 4c 4c 4d 55 54 45 58 0a 20 20 66 6c 61 67 73  ULLMUTEX.  flags
16130 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
16140 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54  EADWRITE | SQLIT
16150 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 20  E_OPEN_CREATE | 
16160 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c  SQLITE_OPEN_FULL
16170 4d 55 54 45 58 3b 0a 23 65 6c 73 65 0a 20 20 66  MUTEX;.#else.  f
16180 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50  lags = SQLITE_OP
16190 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53  EN_READWRITE | S
161a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
161b0 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
161c0 4e 4f 4d 55 54 45 58 3b 0a 23 65 6e 64 69 66 0a  NOMUTEX;.#endif.
161d0 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29  .  if( objc==2 )
161e0 7b 0a 20 20 20 20 7a 41 72 67 20 3d 20 54 63 6c  {.    zArg = Tcl
161f0 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
16200 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20  j(objv[1], 0);. 
16210 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41     if( strcmp(zA
16220 72 67 2c 22 2d 76 65 72 73 69 6f 6e 22 29 3d 3d  rg,"-version")==
16230 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  0 ){.      Tcl_A
16240 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
16250 72 70 2c 73 71 6c 69 74 65 33 5f 76 65 72 73 69  rp,sqlite3_versi
16260 6f 6e 2c 30 29 3b 0a 20 20 20 20 20 20 72 65 74  on,0);.      ret
16270 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20  urn TCL_OK;.    
16280 7d 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  }.    if( strcmp
16290 28 7a 41 72 67 2c 22 2d 68 61 73 2d 63 6f 64 65  (zArg,"-has-code
162a0 63 22 29 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66  c")==0 ){.#ifdef
162b0 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
162c0 43 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  C.      Tcl_Appe
162d0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
162e0 22 31 22 2c 30 29 3b 0a 23 65 6c 73 65 0a 20 20  "1",0);.#else.  
162f0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
16300 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 30 22 2c  sult(interp,"0",
16310 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  0);.#endif.     
16320 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
16330 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
16340 69 3d 33 3b 20 69 2b 31 3c 6f 62 6a 63 3b 20 69  i=3; i+1<objc; i
16350 2b 3d 32 29 7b 0a 20 20 20 20 7a 41 72 67 20 3d  +=2){.    zArg =
16360 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
16370 62 6a 76 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28  bjv[i]);.    if(
16380 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 6b   strcmp(zArg,"-k
16390 65 79 22 29 3d 3d 30 20 29 7b 0a 23 69 66 64 65  ey")==0 ){.#ifde
163a0 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
163b0 45 43 0a 20 20 20 20 20 20 70 4b 65 79 20 3d 20  EC.      pKey = 
163c0 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
163d0 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 69 2b 31  FromObj(objv[i+1
163e0 5d 2c 20 26 6e 4b 65 79 29 3b 0a 23 65 6e 64 69  ], &nKey);.#endi
163f0 66 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  f.    }else if( 
16400 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d 76  strcmp(zArg, "-v
16410 66 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  fs")==0 ){.     
16420 20 7a 56 66 73 20 3d 20 54 63 6c 5f 47 65 74 53   zVfs = Tcl_GetS
16430 74 72 69 6e 67 28 6f 62 6a 76 5b 69 2b 31 5d 29  tring(objv[i+1])
16440 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
16450 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d 72  strcmp(zArg, "-r
16460 65 61 64 6f 6e 6c 79 22 29 3d 3d 30 20 29 7b 0a  eadonly")==0 ){.
16470 20 20 20 20 20 20 69 6e 74 20 62 3b 0a 20 20 20        int b;.   
16480 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f     if( Tcl_GetBo
16490 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
164a0 65 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20  erp, objv[i+1], 
164b0 26 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  &b) ) return TCL
164c0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 69 66  _ERROR;.      if
164d0 28 20 62 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ( b ){.        f
164e0 6c 61 67 73 20 26 3d 20 7e 28 53 51 4c 49 54 45  lags &= ~(SQLITE
164f0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
16500 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
16510 54 45 29 3b 0a 20 20 20 20 20 20 20 20 66 6c 61  TE);.        fla
16520 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
16530 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  N_READONLY;.    
16540 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
16550 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54   flags &= ~SQLIT
16560 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b  E_OPEN_READONLY;
16570 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c  .        flags |
16580 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
16590 41 44 57 52 49 54 45 3b 0a 20 20 20 20 20 20 7d  ADWRITE;.      }
165a0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
165b0 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d 63 72  trcmp(zArg, "-cr
165c0 65 61 74 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  eate")==0 ){.   
165d0 20 20 20 69 6e 74 20 62 3b 0a 20 20 20 20 20 20     int b;.      
165e0 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  if( Tcl_GetBoole
165f0 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
16600 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 62 29  , objv[i+1], &b)
16610 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
16620 52 4f 52 3b 0a 20 20 20 20 20 20 69 66 28 20 62  ROR;.      if( b
16630 20 26 26 20 28 66 6c 61 67 73 20 26 20 53 51 4c   && (flags & SQL
16640 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
16650 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Y)==0 ){.       
16660 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45   flags |= SQLITE
16670 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b 0a 20 20  _OPEN_CREATE;.  
16680 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16690 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c     flags &= ~SQL
166a0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b  ITE_OPEN_CREATE;
166b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
166c0 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41  se if( strcmp(zA
166d0 72 67 2c 20 22 2d 6e 6f 6d 75 74 65 78 22 29 3d  rg, "-nomutex")=
166e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
166f0 62 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c  b;.      if( Tcl
16700 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
16710 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
16720 69 2b 31 5d 2c 20 26 62 29 20 29 20 72 65 74 75  i+1], &b) ) retu
16730 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
16740 20 20 20 20 69 66 28 20 62 20 29 7b 0a 20 20 20      if( b ){.   
16750 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51       flags |= SQ
16760 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45  LITE_OPEN_NOMUTE
16770 58 3b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  X;.        flags
16780 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e   &= ~SQLITE_OPEN
16790 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a 20 20 20 20  _FULLMUTEX;.    
167a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
167b0 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54   flags &= ~SQLIT
167c0 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a  E_OPEN_NOMUTEX;.
167d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
167e0 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72  e if( strcmp(zAr
167f0 67 2c 20 22 2d 66 75 6c 6c 6d 75 74 65 78 22 29  g, "-fullmutex")
16800 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
16810 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63   b;.      if( Tc
16820 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
16830 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
16840 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20 72 65 74  [i+1], &b) ) ret
16850 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
16860 20 20 20 20 20 69 66 28 20 62 20 29 7b 0a 20 20       if( b ){.  
16870 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53        flags |= S
16880 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d  QLITE_OPEN_FULLM
16890 55 54 45 58 3b 0a 20 20 20 20 20 20 20 20 66 6c  UTEX;.        fl
168a0 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f  ags &= ~SQLITE_O
168b0 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 20 20 20  PEN_NOMUTEX;.   
168c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
168d0 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49    flags &= ~SQLI
168e0 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45  TE_OPEN_FULLMUTE
168f0 58 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  X;.      }.    }
16900 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
16910 7a 41 72 67 2c 20 22 2d 75 72 69 22 29 3d 3d 30  zArg, "-uri")==0
16920 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 3b   ){.      int b;
16930 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47  .      if( Tcl_G
16940 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
16950 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 2b  (interp, objv[i+
16960 31 5d 2c 20 26 62 29 20 29 20 72 65 74 75 72 6e  1], &b) ) return
16970 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
16980 20 20 69 66 28 20 62 20 29 7b 0a 20 20 20 20 20    if( b ){.     
16990 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49     flags |= SQLI
169a0 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 20 20 20  TE_OPEN_URI;.   
169b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
169c0 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49    flags &= ~SQLI
169d0 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 20 20 20  TE_OPEN_URI;.   
169e0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
169f0 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
16a00 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
16a10 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20  unknown option: 
16a20 22 2c 20 7a 41 72 67 2c 20 28 63 68 61 72 2a 29  ", zArg, (char*)
16a30 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
16a40 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
16a50 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63  }.  }.  if( objc
16a60 3c 33 20 7c 7c 20 28 6f 62 6a 63 26 31 29 21 3d  <3 || (objc&1)!=
16a70 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  1 ){.    Tcl_Wro
16a80 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
16a90 2c 20 31 2c 20 6f 62 6a 76 2c 20 0a 20 20 20 20  , 1, objv, .    
16aa0 20 20 22 48 41 4e 44 4c 45 20 46 49 4c 45 4e 41    "HANDLE FILENA
16ab0 4d 45 20 3f 2d 76 66 73 20 56 46 53 4e 41 4d 45  ME ?-vfs VFSNAME
16ac0 3f 20 3f 2d 72 65 61 64 6f 6e 6c 79 20 42 4f 4f  ? ?-readonly BOO
16ad0 4c 45 41 4e 3f 20 3f 2d 63 72 65 61 74 65 20 42  LEAN? ?-create B
16ae0 4f 4f 4c 45 41 4e 3f 22 0a 20 20 20 20 20 20 22  OOLEAN?".      "
16af0 20 3f 2d 6e 6f 6d 75 74 65 78 20 42 4f 4f 4c 45   ?-nomutex BOOLE
16b00 41 4e 3f 20 3f 2d 66 75 6c 6c 6d 75 74 65 78 20  AN? ?-fullmutex 
16b10 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 75 72 69 20 42  BOOLEAN? ?-uri B
16b20 4f 4f 4c 45 41 4e 3f 22 0a 23 69 66 64 65 66 20  OOLEAN?".#ifdef 
16b30 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
16b40 0a 20 20 20 20 20 20 22 20 3f 2d 6b 65 79 20 43  .      " ?-key C
16b50 4f 44 45 43 4b 45 59 3f 22 0a 23 65 6e 64 69 66  ODECKEY?".#endif
16b60 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 65 74 75  .    );.    retu
16b70 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
16b80 7d 0a 20 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b  }.  zErrMsg = 0;
16b90 0a 20 20 70 20 3d 20 28 53 71 6c 69 74 65 44 62  .  p = (SqliteDb
16ba0 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a  *)Tcl_Alloc( siz
16bb0 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28  eof(*p) );.  if(
16bc0 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c   p==0 ){.    Tcl
16bd0 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
16be0 70 2c 20 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65  p, "malloc faile
16bf0 64 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  d", TCL_STATIC);
16c00 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
16c10 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 6d 65 6d  ERROR;.  }.  mem
16c20 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66  set(p, 0, sizeof
16c30 28 2a 70 29 29 3b 0a 20 20 7a 46 69 6c 65 20 3d  (*p));.  zFile =
16c40 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
16c50 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30  omObj(objv[2], 0
16c60 29 3b 0a 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c  );.  zFile = Tcl
16c70 5f 54 72 61 6e 73 6c 61 74 65 46 69 6c 65 4e 61  _TranslateFileNa
16c80 6d 65 28 69 6e 74 65 72 70 2c 20 7a 46 69 6c 65  me(interp, zFile
16c90 2c 20 26 74 72 61 6e 73 6c 61 74 65 64 46 69 6c  , &translatedFil
16ca0 65 6e 61 6d 65 29 3b 0a 20 20 72 63 20 3d 20 73  ename);.  rc = s
16cb0 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 7a  qlite3_open_v2(z
16cc0 46 69 6c 65 2c 20 26 70 2d 3e 64 62 2c 20 66 6c  File, &p->db, fl
16cd0 61 67 73 2c 20 7a 56 66 73 29 3b 0a 20 20 54 63  ags, zVfs);.  Tc
16ce0 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 74  l_DStringFree(&t
16cf0 72 61 6e 73 6c 61 74 65 64 46 69 6c 65 6e 61 6d  ranslatedFilenam
16d00 65 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 20  e);.  if( p->db 
16d10 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  ){.    if( SQLIT
16d20 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 65 72  E_OK!=sqlite3_er
16d30 72 63 6f 64 65 28 70 2d 3e 64 62 29 20 29 7b 0a  rcode(p->db) ){.
16d40 20 20 20 20 20 20 7a 45 72 72 4d 73 67 20 3d 20        zErrMsg = 
16d50 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
16d60 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  "%s", sqlite3_er
16d70 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20  rmsg(p->db));.  
16d80 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
16d90 65 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20  e(p->db);.      
16da0 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 20 20 7d  p->db = 0;.    }
16db0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 45  .  }else{.    zE
16dc0 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
16dd0 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71  mprintf("%s", sq
16de0 6c 69 74 65 33 5f 65 72 72 73 74 72 28 72 63 29  lite3_errstr(rc)
16df0 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51  );.  }.#ifdef SQ
16e00 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
16e10 20 69 66 28 20 70 2d 3e 64 62 20 29 7b 0a 20 20   if( p->db ){.  
16e20 20 20 73 71 6c 69 74 65 33 5f 6b 65 79 28 70 2d    sqlite3_key(p-
16e30 3e 64 62 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 29  >db, pKey, nKey)
16e40 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
16e50 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20  f( p->db==0 ){. 
16e60 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
16e70 28 69 6e 74 65 72 70 2c 20 7a 45 72 72 4d 73 67  (interp, zErrMsg
16e80 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b  , TCL_VOLATILE);
16e90 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63  .    Tcl_Free((c
16ea0 68 61 72 2a 29 70 29 3b 0a 20 20 20 20 73 71 6c  har*)p);.    sql
16eb0 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73  ite3_free(zErrMs
16ec0 67 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  g);.    return T
16ed0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
16ee0 70 2d 3e 6d 61 78 53 74 6d 74 20 3d 20 4e 55 4d  p->maxStmt = NUM
16ef0 5f 50 52 45 50 41 52 45 44 5f 53 54 4d 54 53 3b  _PREPARED_STMTS;
16f00 0a 20 20 70 2d 3e 69 6e 74 65 72 70 20 3d 20 69  .  p->interp = i
16f10 6e 74 65 72 70 3b 0a 20 20 7a 41 72 67 20 3d 20  nterp;.  zArg = 
16f20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
16f30 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29  mObj(objv[1], 0)
16f40 3b 0a 20 20 69 66 28 20 44 62 55 73 65 4e 72 65  ;.  if( DbUseNre
16f50 28 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 4e 52  () ){.    Tcl_NR
16f60 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e  CreateCommand(in
16f70 74 65 72 70 2c 20 7a 41 72 67 2c 20 44 62 4f 62  terp, zArg, DbOb
16f80 6a 43 6d 64 41 64 61 70 74 6f 72 2c 20 44 62 4f  jCmdAdaptor, DbO
16f90 62 6a 43 6d 64 2c 0a 20 20 20 20 20 20 20 20 20  bjCmd,.         
16fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
16fb0 63 68 61 72 2a 29 70 2c 20 44 62 44 65 6c 65 74  char*)p, DbDelet
16fc0 65 43 6d 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  eCmd);.  }else{.
16fd0 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
16fe0 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
16ff0 20 7a 41 72 67 2c 20 44 62 4f 62 6a 43 6d 64 2c   zArg, DbObjCmd,
17000 20 28 63 68 61 72 2a 29 70 2c 20 44 62 44 65 6c   (char*)p, DbDel
17010 65 74 65 43 6d 64 29 3b 0a 20 20 7d 0a 20 20 72  eteCmd);.  }.  r
17020 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
17030 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20 61  ./*.** Provide a
17040 20 64 75 6d 6d 79 20 54 63 6c 5f 49 6e 69 74 53   dummy Tcl_InitS
17050 74 75 62 73 20 69 66 20 77 65 20 61 72 65 20 75  tubs if we are u
17060 73 69 6e 67 20 74 68 69 73 20 61 73 20 61 20 73  sing this as a s
17070 74 61 74 69 63 0a 2a 2a 20 6c 69 62 72 61 72 79  tatic.** library
17080 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 55 53 45  ..*/.#ifndef USE
17090 5f 54 43 4c 5f 53 54 55 42 53 0a 23 20 75 6e 64  _TCL_STUBS.# und
170a0 65 66 20 20 54 63 6c 5f 49 6e 69 74 53 74 75 62  ef  Tcl_InitStub
170b0 73 0a 23 20 64 65 66 69 6e 65 20 54 63 6c 5f 49  s.# define Tcl_I
170c0 6e 69 74 53 74 75 62 73 28 61 2c 62 2c 63 29 0a  nitStubs(a,b,c).
170d0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61  #endif../*.** Ma
170e0 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20  ke sure we have 
170f0 61 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f  a PACKAGE_VERSIO
17100 4e 20 6d 61 63 72 6f 20 64 65 66 69 6e 65 64 2e  N macro defined.
17110 20 20 54 68 69 73 20 77 69 6c 6c 20 62 65 0a 2a    This will be.*
17120 2a 20 64 65 66 69 6e 65 64 20 61 75 74 6f 6d 61  * defined automa
17130 74 69 63 61 6c 6c 79 20 62 79 20 74 68 65 20 54  tically by the T
17140 45 41 20 6d 61 6b 65 66 69 6c 65 2e 20 20 42 75  EA makefile.  Bu
17150 74 20 6f 74 68 65 72 20 6d 61 6b 65 66 69 6c 65  t other makefile
17160 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 64 65 66 69  s.** do not defi
17170 6e 65 20 69 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ne it..*/.#ifnde
17180 66 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f  f PACKAGE_VERSIO
17190 4e 0a 23 20 64 65 66 69 6e 65 20 50 41 43 4b 41  N.# define PACKA
171a0 47 45 5f 56 45 52 53 49 4f 4e 20 53 51 4c 49 54  GE_VERSION SQLIT
171b0 45 5f 56 45 52 53 49 4f 4e 0a 23 65 6e 64 69 66  E_VERSION.#endif
171c0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
171d0 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a  ze this module..
171e0 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 63 6c 20 6d  **.** This Tcl m
171f0 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 6f  odule contains o
17200 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 6e 65 77  nly a single new
17210 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d   Tcl command nam
17220 65 64 20 22 73 71 6c 69 74 65 22 2e 0a 2a 2a 20  ed "sqlite"..** 
17230 28 48 65 6e 63 65 20 74 68 65 72 65 20 69 73 20  (Hence there is 
17240 6e 6f 20 6e 61 6d 65 73 70 61 63 65 2e 20 20 54  no namespace.  T
17250 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74  here is no point
17260 20 69 6e 20 75 73 69 6e 67 20 61 20 6e 61 6d 65   in using a name
17270 73 70 61 63 65 0a 2a 2a 20 69 66 20 74 68 65 20  space.** if the 
17280 65 78 74 65 6e 73 69 6f 6e 20 6f 6e 6c 79 20 73  extension only s
17290 75 70 70 6c 69 65 73 20 6f 6e 65 20 6e 65 77 20  upplies one new 
172a0 6e 61 6d 65 21 29 20 20 54 68 65 20 22 73 71 6c  name!)  The "sql
172b0 69 74 65 22 20 63 6f 6d 6d 61 6e 64 20 69 73 0a  ite" command is.
172c0 2a 2a 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20  ** used to open 
172d0 61 20 6e 65 77 20 53 51 4c 69 74 65 20 64 61 74  a new SQLite dat
172e0 61 62 61 73 65 2e 20 20 53 65 65 20 74 68 65 20  abase.  See the 
172f0 44 62 4d 61 69 6e 28 29 20 72 6f 75 74 69 6e 65  DbMain() routine
17300 20 61 62 6f 76 65 0a 2a 2a 20 66 6f 72 20 61 64   above.** for ad
17310 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
17320 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
17330 45 58 54 45 52 4e 20 6d 61 63 72 6f 73 20 61 72  EXTERN macros ar
17340 65 20 72 65 71 75 69 72 65 64 20 62 79 20 54 43  e required by TC
17350 4c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f  L in order to wo
17360 72 6b 20 6f 6e 20 77 69 6e 64 6f 77 73 2e 0a 2a  rk on windows..*
17370 2f 0a 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c  /.EXTERN int Sql
17380 69 74 65 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  ite3_Init(Tcl_In
17390 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20  terp *interp){. 
173a0 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 69   Tcl_InitStubs(i
173b0 6e 74 65 72 70 2c 20 22 38 2e 34 22 2c 20 30 29  nterp, "8.4", 0)
173c0 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62  ;.  Tcl_CreateOb
173d0 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
173e0 20 22 73 71 6c 69 74 65 33 22 2c 20 28 54 63 6c   "sqlite3", (Tcl
173f0 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a 29 44 62 4d  _ObjCmdProc*)DbM
17400 61 69 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63  ain, 0, 0);.  Tc
17410 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74  l_PkgProvide(int
17420 65 72 70 2c 20 22 73 71 6c 69 74 65 33 22 2c 20  erp, "sqlite3", 
17430 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29  PACKAGE_VERSION)
17440 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
17450 45 5f 33 5f 53 55 46 46 49 58 5f 4f 4e 4c 59 0a  E_3_SUFFIX_ONLY.
17460 20 20 2f 2a 20 54 68 65 20 22 73 71 6c 69 74 65    /* The "sqlite
17470 22 20 61 6c 69 61 73 20 69 73 20 75 6e 64 6f 63  " alias is undoc
17480 75 6d 65 6e 74 65 64 2e 20 20 49 74 20 69 73 20  umented.  It is 
17490 68 65 72 65 20 6f 6e 6c 79 20 74 6f 20 73 75 70  here only to sup
174a0 70 6f 72 74 0a 20 20 2a 2a 20 6c 65 67 61 63 79  port.  ** legacy
174b0 20 73 63 72 69 70 74 73 2e 20 20 41 6c 6c 20 6e   scripts.  All n
174c0 65 77 20 73 63 72 69 70 74 73 20 73 68 6f 75 6c  ew scripts shoul
174d0 64 20 75 73 65 20 6f 6e 6c 79 20 74 68 65 20 22  d use only the "
174e0 73 71 6c 69 74 65 33 22 0a 20 20 2a 2a 20 63 6f  sqlite3".  ** co
174f0 6d 6d 61 6e 64 2e 0a 20 20 2a 2f 0a 20 20 54 63  mmand..  */.  Tc
17500 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
17510 6e 64 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  nd(interp, "sqli
17520 74 65 22 2c 20 28 54 63 6c 5f 4f 62 6a 43 6d 64  te", (Tcl_ObjCmd
17530 50 72 6f 63 2a 29 44 62 4d 61 69 6e 2c 20 30 2c  Proc*)DbMain, 0,
17540 20 30 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 72   0);.#endif..  r
17550 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
17560 45 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73 71  EXTERN int Tclsq
17570 6c 69 74 65 33 5f 49 6e 69 74 28 54 63 6c 5f 49  lite3_Init(Tcl_I
17580 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20  nterp *interp){ 
17590 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33 5f 49  return Sqlite3_I
175a0 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a 45  nit(interp); }.E
175b0 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65  XTERN int Sqlite
175c0 33 5f 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74  3_Unload(Tcl_Int
175d0 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
175e0 20 66 6c 61 67 73 29 7b 20 72 65 74 75 72 6e 20   flags){ return 
175f0 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e  TCL_OK; }.EXTERN
17600 20 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 33 5f   int Tclsqlite3_
17610 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72  Unload(Tcl_Inter
17620 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66  p *interp, int f
17630 6c 61 67 73 29 7b 20 72 65 74 75 72 6e 20 54 43  lags){ return TC
17640 4c 5f 4f 4b 3b 20 7d 0a 0a 2f 2a 20 42 65 63 61  L_OK; }../* Beca
17650 75 73 65 20 69 74 20 61 63 63 65 73 73 65 73 20  use it accesses 
17660 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
17670 61 6e 64 20 75 73 65 73 20 70 65 72 73 69 73 74  and uses persist
17680 65 6e 74 20 73 74 61 74 65 2c 20 53 51 4c 69 74  ent state, SQLit
17690 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 73  e.** is not cons
176a0 69 64 65 72 65 64 20 61 70 70 72 6f 70 72 69 61  idered appropria
176b0 74 65 20 66 6f 72 20 73 61 66 65 20 69 6e 74 65  te for safe inte
176c0 72 70 72 65 74 65 72 73 2e 20 20 48 65 6e 63 65  rpreters.  Hence
176d0 2c 20 77 65 20 64 65 6c 69 62 65 72 61 74 65 6c  , we deliberatel
176e0 79 0a 2a 2a 20 6f 6d 69 74 20 74 68 65 20 5f 53  y.** omit the _S
176f0 61 66 65 49 6e 69 74 28 29 20 69 6e 74 65 72 66  afeInit() interf
17700 61 63 65 73 2e 0a 2a 2f 0a 0a 23 69 66 6e 64 65  aces..*/..#ifnde
17710 66 20 53 51 4c 49 54 45 5f 33 5f 53 55 46 46 49  f SQLITE_3_SUFFI
17720 58 5f 4f 4e 4c 59 0a 69 6e 74 20 53 71 6c 69 74  X_ONLY.int Sqlit
17730 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  e_Init(Tcl_Inter
17740 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75  p *interp){ retu
17750 72 6e 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28  rn Sqlite3_Init(
17760 69 6e 74 65 72 70 29 3b 20 7d 0a 69 6e 74 20 54  interp); }.int T
17770 63 6c 73 71 6c 69 74 65 5f 49 6e 69 74 28 54 63  clsqlite_Init(Tc
17780 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
17790 29 7b 20 72 65 74 75 72 6e 20 53 71 6c 69 74 65  ){ return Sqlite
177a0 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 20  3_Init(interp); 
177b0 7d 0a 69 6e 74 20 53 71 6c 69 74 65 5f 55 6e 6c  }.int Sqlite_Unl
177c0 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  oad(Tcl_Interp *
177d0 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67  interp, int flag
177e0 73 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  s){ return TCL_O
177f0 4b 3b 20 7d 0a 69 6e 74 20 54 63 6c 73 71 6c 69  K; }.int Tclsqli
17800 74 65 5f 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e  te_Unload(Tcl_In
17810 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
17820 74 20 66 6c 61 67 73 29 7b 20 72 65 74 75 72 6e  t flags){ return
17830 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 23 65 6e 64 69   TCL_OK; }.#endi
17840 66 0a 0a 23 69 66 64 65 66 20 54 43 4c 53 48 0a  f..#ifdef TCLSH.
17850 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
17860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
178a0 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64  * All of the cod
178b0 65 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69  e that follows i
178c0 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20  s used to build 
178d0 73 74 61 6e 64 61 6c 6f 6e 65 20 54 43 4c 20 69  standalone TCL i
178e0 6e 74 65 72 70 72 65 74 65 72 73 0a 2a 2a 20 74  nterpreters.** t
178f0 68 61 74 20 61 72 65 20 73 74 61 74 69 63 61 6c  hat are statical
17900 6c 79 20 6c 69 6e 6b 65 64 20 77 69 74 68 20 53  ly linked with S
17910 51 4c 69 74 65 2e 20 20 45 6e 61 62 6c 65 20 74  QLite.  Enable t
17920 68 65 73 65 20 62 79 20 63 6f 6d 70 69 6c 69 6e  hese by compilin
17930 67 0a 2a 2a 20 77 69 74 68 20 2d 44 54 43 4c 53  g.** with -DTCLS
17940 48 3d 6e 20 77 68 65 72 65 20 6e 20 63 61 6e 20  H=n where n can 
17950 62 65 20 31 20 6f 72 20 32 2e 20 20 41 6e 20 6e  be 1 or 2.  An n
17960 20 6f 66 20 31 20 67 65 6e 65 72 61 74 65 73 20   of 1 generates 
17970 61 20 73 74 61 6e 64 61 72 64 0a 2a 2a 20 74 63  a standard.** tc
17980 6c 73 68 20 62 75 74 20 77 69 74 68 20 53 51 4c  lsh but with SQL
17990 69 74 65 20 62 75 69 6c 74 20 69 6e 2e 20 20 41  ite built in.  A
179a0 6e 20 6e 20 6f 66 20 32 20 67 65 6e 65 72 61 74  n n of 2 generat
179b0 65 73 20 74 68 65 20 53 51 4c 69 74 65 20 73 70  es the SQLite sp
179c0 61 63 65 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 20  ace.** analysis 
179d0 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 0a 23 69 66  program..*/..#if
179e0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
179f0 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65 64  TEST) || defined
17a00 28 53 51 4c 49 54 45 5f 54 43 4c 4d 44 35 29 0a  (SQLITE_TCLMD5).
17a10 2f 2a 0a 20 2a 20 54 68 69 73 20 63 6f 64 65 20  /*. * This code 
17a20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 4d  implements the M
17a30 44 35 20 6d 65 73 73 61 67 65 2d 64 69 67 65 73  D5 message-diges
17a40 74 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 20 2a 20  t algorithm.. * 
17a50 54 68 65 20 61 6c 67 6f 72 69 74 68 6d 20 69 73  The algorithm is
17a60 20 64 75 65 20 74 6f 20 52 6f 6e 20 52 69 76 65   due to Ron Rive
17a70 73 74 2e 20 20 54 68 69 73 20 63 6f 64 65 20 77  st.  This code w
17a80 61 73 0a 20 2a 20 77 72 69 74 74 65 6e 20 62 79  as. * written by
17a90 20 43 6f 6c 69 6e 20 50 6c 75 6d 62 20 69 6e 20   Colin Plumb in 
17aa0 31 39 39 33 2c 20 6e 6f 20 63 6f 70 79 72 69 67  1993, no copyrig
17ab0 68 74 20 69 73 20 63 6c 61 69 6d 65 64 2e 0a 20  ht is claimed.. 
17ac0 2a 20 54 68 69 73 20 63 6f 64 65 20 69 73 20 69  * This code is i
17ad0 6e 20 74 68 65 20 70 75 62 6c 69 63 20 64 6f 6d  n the public dom
17ae0 61 69 6e 3b 20 64 6f 20 77 69 74 68 20 69 74 20  ain; do with it 
17af0 77 68 61 74 20 79 6f 75 20 77 69 73 68 2e 0a 20  what you wish.. 
17b00 2a 0a 20 2a 20 45 71 75 69 76 61 6c 65 6e 74 20  *. * Equivalent 
17b10 63 6f 64 65 20 69 73 20 61 76 61 69 6c 61 62 6c  code is availabl
17b20 65 20 66 72 6f 6d 20 52 53 41 20 44 61 74 61 20  e from RSA Data 
17b30 53 65 63 75 72 69 74 79 2c 20 49 6e 63 2e 0a 20  Security, Inc.. 
17b40 2a 20 54 68 69 73 20 63 6f 64 65 20 68 61 73 20  * This code has 
17b50 62 65 65 6e 20 74 65 73 74 65 64 20 61 67 61 69  been tested agai
17b60 6e 73 74 20 74 68 61 74 2c 20 61 6e 64 20 69 73  nst that, and is
17b70 20 65 71 75 69 76 61 6c 65 6e 74 2c 0a 20 2a 20   equivalent,. * 
17b80 65 78 63 65 70 74 20 74 68 61 74 20 79 6f 75 20  except that you 
17b90 64 6f 6e 27 74 20 6e 65 65 64 20 74 6f 20 69 6e  don't need to in
17ba0 63 6c 75 64 65 20 74 77 6f 20 70 61 67 65 73 20  clude two pages 
17bb0 6f 66 20 6c 65 67 61 6c 65 73 65 0a 20 2a 20 77  of legalese. * w
17bc0 69 74 68 20 65 76 65 72 79 20 63 6f 70 79 2e 0a  ith every copy..
17bd0 20 2a 0a 20 2a 20 54 6f 20 63 6f 6d 70 75 74 65   *. * To compute
17be0 20 74 68 65 20 6d 65 73 73 61 67 65 20 64 69 67   the message dig
17bf0 65 73 74 20 6f 66 20 61 20 63 68 75 6e 6b 20 6f  est of a chunk o
17c00 66 20 62 79 74 65 73 2c 20 64 65 63 6c 61 72 65  f bytes, declare
17c10 20 61 6e 0a 20 2a 20 4d 44 35 43 6f 6e 74 65 78   an. * MD5Contex
17c20 74 20 73 74 72 75 63 74 75 72 65 2c 20 70 61 73  t structure, pas
17c30 73 20 69 74 20 74 6f 20 4d 44 35 49 6e 69 74 2c  s it to MD5Init,
17c40 20 63 61 6c 6c 20 4d 44 35 55 70 64 61 74 65 20   call MD5Update 
17c50 61 73 0a 20 2a 20 6e 65 65 64 65 64 20 6f 6e 20  as. * needed on 
17c60 62 75 66 66 65 72 73 20 66 75 6c 6c 20 6f 66 20  buffers full of 
17c70 62 79 74 65 73 2c 20 61 6e 64 20 74 68 65 6e 20  bytes, and then 
17c80 63 61 6c 6c 20 4d 44 35 46 69 6e 61 6c 2c 20 77  call MD5Final, w
17c90 68 69 63 68 0a 20 2a 20 77 69 6c 6c 20 66 69 6c  hich. * will fil
17ca0 6c 20 61 20 73 75 70 70 6c 69 65 64 20 31 36 2d  l a supplied 16-
17cb0 62 79 74 65 20 61 72 72 61 79 20 77 69 74 68 20  byte array with 
17cc0 74 68 65 20 64 69 67 65 73 74 2e 0a 20 2a 2f 0a  the digest.. */.
17cd0 0a 2f 2a 0a 20 2a 20 49 66 20 63 6f 6d 70 69 6c  ./*. * If compil
17ce0 65 64 20 6f 6e 20 61 20 6d 61 63 68 69 6e 65 20  ed on a machine 
17cf0 74 68 61 74 20 64 6f 65 73 6e 27 74 20 68 61 76  that doesn't hav
17d00 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  e a 32-bit integ
17d10 65 72 2c 0a 20 2a 20 79 6f 75 20 6a 75 73 74 20  er,. * you just 
17d20 73 65 74 20 22 75 69 6e 74 33 32 22 20 74 6f 20  set "uint32" to 
17d30 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
17d40 64 61 74 61 74 79 70 65 20 66 6f 72 20 61 6e 0a  datatype for an.
17d50 20 2a 20 75 6e 73 69 67 6e 65 64 20 33 32 2d 62   * unsigned 32-b
17d60 69 74 20 69 6e 74 65 67 65 72 2e 20 20 46 6f 72  it integer.  For
17d70 20 65 78 61 6d 70 6c 65 3a 0a 20 2a 0a 20 2a 20   example:. *. * 
17d80 20 20 20 20 20 20 63 63 20 2d 44 75 69 6e 74 33        cc -Duint3
17d90 32 3d 27 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  2='unsigned long
17da0 27 20 6d 64 35 2e 63 0a 20 2a 0a 20 2a 2f 0a 23  ' md5.c. *. */.#
17db0 69 66 6e 64 65 66 20 75 69 6e 74 33 32 0a 23 20  ifndef uint32.# 
17dc0 20 64 65 66 69 6e 65 20 75 69 6e 74 33 32 20 75   define uint32 u
17dd0 6e 73 69 67 6e 65 64 20 69 6e 74 0a 23 65 6e 64  nsigned int.#end
17de0 69 66 0a 0a 73 74 72 75 63 74 20 4d 44 35 43 6f  if..struct MD5Co
17df0 6e 74 65 78 74 20 7b 0a 20 20 69 6e 74 20 69 73  ntext {.  int is
17e00 49 6e 69 74 3b 0a 20 20 75 69 6e 74 33 32 20 62  Init;.  uint32 b
17e10 75 66 5b 34 5d 3b 0a 20 20 75 69 6e 74 33 32 20  uf[4];.  uint32 
17e20 62 69 74 73 5b 32 5d 3b 0a 20 20 75 6e 73 69 67  bits[2];.  unsig
17e30 6e 65 64 20 63 68 61 72 20 69 6e 5b 36 34 5d 3b  ned char in[64];
17e40 0a 7d 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  .};.typedef stru
17e50 63 74 20 4d 44 35 43 6f 6e 74 65 78 74 20 4d 44  ct MD5Context MD
17e60 35 43 6f 6e 74 65 78 74 3b 0a 0a 2f 2a 0a 20 2a  5Context;../*. *
17e70 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 6f 64 65   Note: this code
17e80 20 69 73 20 68 61 72 6d 6c 65 73 73 20 6f 6e 20   is harmless on 
17e90 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e 20 6d 61  little-endian ma
17ea0 63 68 69 6e 65 73 2e 0a 20 2a 2f 0a 73 74 61 74  chines.. */.stat
17eb0 69 63 20 76 6f 69 64 20 62 79 74 65 52 65 76 65  ic void byteReve
17ec0 72 73 65 20 28 75 6e 73 69 67 6e 65 64 20 63 68  rse (unsigned ch
17ed0 61 72 20 2a 62 75 66 2c 20 75 6e 73 69 67 6e 65  ar *buf, unsigne
17ee0 64 20 6c 6f 6e 67 73 29 7b 0a 20 20 20 20 20 20  d longs){.      
17ef0 20 20 75 69 6e 74 33 32 20 74 3b 0a 20 20 20 20    uint32 t;.    
17f00 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20      do {.       
17f10 20 20 20 20 20 20 20 20 20 74 20 3d 20 28 75 69           t = (ui
17f20 6e 74 33 32 29 28 28 75 6e 73 69 67 6e 65 64 29  nt32)((unsigned)
17f30 62 75 66 5b 33 5d 3c 3c 38 20 7c 20 62 75 66 5b  buf[3]<<8 | buf[
17f40 32 5d 29 20 3c 3c 20 31 36 20 7c 0a 20 20 20 20  2]) << 16 |.    
17f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f60 20 20 20 20 20 20 20 20 28 28 75 6e 73 69 67 6e          ((unsign
17f70 65 64 29 62 75 66 5b 31 5d 3c 3c 38 20 7c 20 62  ed)buf[1]<<8 | b
17f80 75 66 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20  uf[0]);.        
17f90 20 20 20 20 20 20 20 20 2a 28 75 69 6e 74 33 32          *(uint32
17fa0 20 2a 29 62 75 66 20 3d 20 74 3b 0a 20 20 20 20   *)buf = t;.    
17fb0 20 20 20 20 20 20 20 20 20 20 20 20 62 75 66 20              buf 
17fc0 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 20  += 4;.        } 
17fd0 77 68 69 6c 65 20 28 2d 2d 6c 6f 6e 67 73 29 3b  while (--longs);
17fe0 0a 7d 0a 2f 2a 20 54 68 65 20 66 6f 75 72 20 63  .}./* The four c
17ff0 6f 72 65 20 66 75 6e 63 74 69 6f 6e 73 20 2d 20  ore functions - 
18000 46 31 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20  F1 is optimized 
18010 73 6f 6d 65 77 68 61 74 20 2a 2f 0a 0a 2f 2a 20  somewhat */../* 
18020 23 64 65 66 69 6e 65 20 46 31 28 78 2c 20 79 2c  #define F1(x, y,
18030 20 7a 29 20 28 78 20 26 20 79 20 7c 20 7e 78 20   z) (x & y | ~x 
18040 26 20 7a 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20  & z) */.#define 
18050 46 31 28 78 2c 20 79 2c 20 7a 29 20 28 7a 20 5e  F1(x, y, z) (z ^
18060 20 28 78 20 26 20 28 79 20 5e 20 7a 29 29 29 0a   (x & (y ^ z))).
18070 23 64 65 66 69 6e 65 20 46 32 28 78 2c 20 79 2c  #define F2(x, y,
18080 20 7a 29 20 46 31 28 7a 2c 20 78 2c 20 79 29 0a   z) F1(z, x, y).
18090 23 64 65 66 69 6e 65 20 46 33 28 78 2c 20 79 2c  #define F3(x, y,
180a0 20 7a 29 20 28 78 20 5e 20 79 20 5e 20 7a 29 0a   z) (x ^ y ^ z).
180b0 23 64 65 66 69 6e 65 20 46 34 28 78 2c 20 79 2c  #define F4(x, y,
180c0 20 7a 29 20 28 79 20 5e 20 28 78 20 7c 20 7e 7a   z) (y ^ (x | ~z
180d0 29 29 0a 0a 2f 2a 20 54 68 69 73 20 69 73 20 74  ))../* This is t
180e0 68 65 20 63 65 6e 74 72 61 6c 20 73 74 65 70 20  he central step 
180f0 69 6e 20 74 68 65 20 4d 44 35 20 61 6c 67 6f 72  in the MD5 algor
18100 69 74 68 6d 2e 20 2a 2f 0a 23 64 65 66 69 6e 65  ithm. */.#define
18110 20 4d 44 35 53 54 45 50 28 66 2c 20 77 2c 20 78   MD5STEP(f, w, x
18120 2c 20 79 2c 20 7a 2c 20 64 61 74 61 2c 20 73 29  , y, z, data, s)
18130 20 5c 0a 20 20 20 20 20 20 20 20 28 20 77 20 2b   \.        ( w +
18140 3d 20 66 28 78 2c 20 79 2c 20 7a 29 20 2b 20 64  = f(x, y, z) + d
18150 61 74 61 2c 20 20 77 20 3d 20 77 3c 3c 73 20 7c  ata,  w = w<<s |
18160 20 77 3e 3e 28 33 32 2d 73 29 2c 20 20 77 20 2b   w>>(32-s),  w +
18170 3d 20 78 20 29 0a 0a 2f 2a 0a 20 2a 20 54 68 65  = x )../*. * The
18180 20 63 6f 72 65 20 6f 66 20 74 68 65 20 4d 44 35   core of the MD5
18190 20 61 6c 67 6f 72 69 74 68 6d 2c 20 74 68 69 73   algorithm, this
181a0 20 61 6c 74 65 72 73 20 61 6e 20 65 78 69 73 74   alters an exist
181b0 69 6e 67 20 4d 44 35 20 68 61 73 68 20 74 6f 0a  ing MD5 hash to.
181c0 20 2a 20 72 65 66 6c 65 63 74 20 74 68 65 20 61   * reflect the a
181d0 64 64 69 74 69 6f 6e 20 6f 66 20 31 36 20 6c 6f  ddition of 16 lo
181e0 6e 67 77 6f 72 64 73 20 6f 66 20 6e 65 77 20 64  ngwords of new d
181f0 61 74 61 2e 20 20 4d 44 35 55 70 64 61 74 65 20  ata.  MD5Update 
18200 62 6c 6f 63 6b 73 0a 20 2a 20 74 68 65 20 64 61  blocks. * the da
18210 74 61 20 61 6e 64 20 63 6f 6e 76 65 72 74 73 20  ta and converts 
18220 62 79 74 65 73 20 69 6e 74 6f 20 6c 6f 6e 67 77  bytes into longw
18230 6f 72 64 73 20 66 6f 72 20 74 68 69 73 20 72 6f  ords for this ro
18240 75 74 69 6e 65 2e 0a 20 2a 2f 0a 73 74 61 74 69  utine.. */.stati
18250 63 20 76 6f 69 64 20 4d 44 35 54 72 61 6e 73 66  c void MD5Transf
18260 6f 72 6d 28 75 69 6e 74 33 32 20 62 75 66 5b 34  orm(uint32 buf[4
18270 5d 2c 20 63 6f 6e 73 74 20 75 69 6e 74 33 32 20  ], const uint32 
18280 69 6e 5b 31 36 5d 29 7b 0a 20 20 20 20 20 20 20  in[16]){.       
18290 20 72 65 67 69 73 74 65 72 20 75 69 6e 74 33 32   register uint32
182a0 20 61 2c 20 62 2c 20 63 2c 20 64 3b 0a 0a 20 20   a, b, c, d;..  
182b0 20 20 20 20 20 20 61 20 3d 20 62 75 66 5b 30 5d        a = buf[0]
182c0 3b 0a 20 20 20 20 20 20 20 20 62 20 3d 20 62 75  ;.        b = bu
182d0 66 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 63 20  f[1];.        c 
182e0 3d 20 62 75 66 5b 32 5d 3b 0a 20 20 20 20 20 20  = buf[2];.      
182f0 20 20 64 20 3d 20 62 75 66 5b 33 5d 3b 0a 0a 20    d = buf[3];.. 
18300 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
18310 31 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69  1, a, b, c, d, i
18320 6e 5b 20 30 5d 2b 30 78 64 37 36 61 61 34 37 38  n[ 0]+0xd76aa478
18330 2c 20 20 37 29 3b 0a 20 20 20 20 20 20 20 20 4d  ,  7);.        M
18340 44 35 53 54 45 50 28 46 31 2c 20 64 2c 20 61 2c  D5STEP(F1, d, a,
18350 20 62 2c 20 63 2c 20 69 6e 5b 20 31 5d 2b 30 78   b, c, in[ 1]+0x
18360 65 38 63 37 62 37 35 36 2c 20 31 32 29 3b 0a 20  e8c7b756, 12);. 
18370 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
18380 31 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69  1, c, d, a, b, i
18390 6e 5b 20 32 5d 2b 30 78 32 34 32 30 37 30 64 62  n[ 2]+0x242070db
183a0 2c 20 31 37 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 17);.        M
183b0 44 35 53 54 45 50 28 46 31 2c 20 62 2c 20 63 2c  D5STEP(F1, b, c,
183c0 20 64 2c 20 61 2c 20 69 6e 5b 20 33 5d 2b 30 78   d, a, in[ 3]+0x
183d0 63 31 62 64 63 65 65 65 2c 20 32 32 29 3b 0a 20  c1bdceee, 22);. 
183e0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
183f0 31 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69  1, a, b, c, d, i
18400 6e 5b 20 34 5d 2b 30 78 66 35 37 63 30 66 61 66  n[ 4]+0xf57c0faf
18410 2c 20 20 37 29 3b 0a 20 20 20 20 20 20 20 20 4d  ,  7);.        M
18420 44 35 53 54 45 50 28 46 31 2c 20 64 2c 20 61 2c  D5STEP(F1, d, a,
18430 20 62 2c 20 63 2c 20 69 6e 5b 20 35 5d 2b 30 78   b, c, in[ 5]+0x
18440 34 37 38 37 63 36 32 61 2c 20 31 32 29 3b 0a 20  4787c62a, 12);. 
18450 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
18460 31 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69  1, c, d, a, b, i
18470 6e 5b 20 36 5d 2b 30 78 61 38 33 30 34 36 31 33  n[ 6]+0xa8304613
18480 2c 20 31 37 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 17);.        M
18490 44 35 53 54 45 50 28 46 31 2c 20 62 2c 20 63 2c  D5STEP(F1, b, c,
184a0 20 64 2c 20 61 2c 20 69 6e 5b 20 37 5d 2b 30 78   d, a, in[ 7]+0x
184b0 66 64 34 36 39 35 30 31 2c 20 32 32 29 3b 0a 20  fd469501, 22);. 
184c0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
184d0 31 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69  1, a, b, c, d, i
184e0 6e 5b 20 38 5d 2b 30 78 36 39 38 30 39 38 64 38  n[ 8]+0x698098d8
184f0 2c 20 20 37 29 3b 0a 20 20 20 20 20 20 20 20 4d  ,  7);.        M
18500 44 35 53 54 45 50 28 46 31 2c 20 64 2c 20 61 2c  D5STEP(F1, d, a,
18510 20 62 2c 20 63 2c 20 69 6e 5b 20 39 5d 2b 30 78   b, c, in[ 9]+0x
18520 38 62 34 34 66 37 61 66 2c 20 31 32 29 3b 0a 20  8b44f7af, 12);. 
18530 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
18540 31 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69  1, c, d, a, b, i
18550 6e 5b 31 30 5d 2b 30 78 66 66 66 66 35 62 62 31  n[10]+0xffff5bb1
18560 2c 20 31 37 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 17);.        M
18570 44 35 53 54 45 50 28 46 31 2c 20 62 2c 20 63 2c  D5STEP(F1, b, c,
18580 20 64 2c 20 61 2c 20 69 6e 5b 31 31 5d 2b 30 78   d, a, in[11]+0x
18590 38 39 35 63 64 37 62 65 2c 20 32 32 29 3b 0a 20  895cd7be, 22);. 
185a0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
185b0 31 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69  1, a, b, c, d, i
185c0 6e 5b 31 32 5d 2b 30 78 36 62 39 30 31 31 32 32  n[12]+0x6b901122
185d0 2c 20 20 37 29 3b 0a 20 20 20 20 20 20 20 20 4d  ,  7);.        M
185e0 44 35 53 54 45 50 28 46 31 2c 20 64 2c 20 61 2c  D5STEP(F1, d, a,
185f0 20 62 2c 20 63 2c 20 69 6e 5b 31 33 5d 2b 30 78   b, c, in[13]+0x
18600 66 64 39 38 37 31 39 33 2c 20 31 32 29 3b 0a 20  fd987193, 12);. 
18610 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
18620 31 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69  1, c, d, a, b, i
18630 6e 5b 31 34 5d 2b 30 78 61 36 37 39 34 33 38 65  n[14]+0xa679438e
18640 2c 20 31 37 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 17);.        M
18650 44 35 53 54 45 50 28 46 31 2c 20 62 2c 20 63 2c  D5STEP(F1, b, c,
18660 20 64 2c 20 61 2c 20 69 6e 5b 31 35 5d 2b 30 78   d, a, in[15]+0x
18670 34 39 62 34 30 38 32 31 2c 20 32 32 29 3b 0a 0a  49b40821, 22);..
18680 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
18690 46 32 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20  F2, a, b, c, d, 
186a0 69 6e 5b 20 31 5d 2b 30 78 66 36 31 65 32 35 36  in[ 1]+0xf61e256
186b0 32 2c 20 20 35 29 3b 0a 20 20 20 20 20 20 20 20  2,  5);.        
186c0 4d 44 35 53 54 45 50 28 46 32 2c 20 64 2c 20 61  MD5STEP(F2, d, a
186d0 2c 20 62 2c 20 63 2c 20 69 6e 5b 20 36 5d 2b 30  , b, c, in[ 6]+0
186e0 78 63 30 34 30 62 33 34 30 2c 20 20 39 29 3b 0a  xc040b340,  9);.
186f0 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
18700 46 32 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20  F2, c, d, a, b, 
18710 69 6e 5b 31 31 5d 2b 30 78 32 36 35 65 35 61 35  in[11]+0x265e5a5
18720 31 2c 20 31 34 29 3b 0a 20 20 20 20 20 20 20 20  1, 14);.        
18730 4d 44 35 53 54 45 50 28 46 32 2c 20 62 2c 20 63  MD5STEP(F2, b, c
18740 2c 20 64 2c 20 61 2c 20 69 6e 5b 20 30 5d 2b 30  , d, a, in[ 0]+0
18750 78 65 39 62 36 63 37 61 61 2c 20 32 30 29 3b 0a  xe9b6c7aa, 20);.
18760 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
18770 46 32 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20  F2, a, b, c, d, 
18780 69 6e 5b 20 35 5d 2b 30 78 64 36 32 66 31 30 35  in[ 5]+0xd62f105
18790 64 2c 20 20 35 29 3b 0a 20 20 20 20 20 20 20 20  d,  5);.        
187a0 4d 44 35 53 54 45 50 28 46 32 2c 20 64 2c 20 61  MD5STEP(F2, d, a
187b0 2c 20 62 2c 20 63 2c 20 69 6e 5b 31 30 5d 2b 30  , b, c, in[10]+0
187c0 78 30 32 34 34 31 34 35 33 2c 20 20 39 29 3b 0a  x02441453,  9);.
187d0 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
187e0 46 32 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20  F2, c, d, a, b, 
187f0 69 6e 5b 31 35 5d 2b 30 78 64 38 61 31 65 36 38  in[15]+0xd8a1e68
18800 31 2c 20 31 34 29 3b 0a 20 20 20 20 20 20 20 20  1, 14);.        
18810 4d 44 35 53 54 45 50 28 46 32 2c 20 62 2c 20 63  MD5STEP(F2, b, c
18820 2c 20 64 2c 20 61 2c 20 69 6e 5b 20 34 5d 2b 30  , d, a, in[ 4]+0
18830 78 65 37 64 33 66 62 63 38 2c 20 32 30 29 3b 0a  xe7d3fbc8, 20);.
18840 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
18850 46 32 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20  F2, a, b, c, d, 
18860 69 6e 5b 20 39 5d 2b 30 78 32 31 65 31 63 64 65  in[ 9]+0x21e1cde
18870 36 2c 20 20 35 29 3b 0a 20 20 20 20 20 20 20 20  6,  5);.        
18880 4d 44 35 53 54 45 50 28 46 32 2c 20 64 2c 20 61  MD5STEP(F2, d, a
18890 2c 20 62 2c 20 63 2c 20 69 6e 5b 31 34 5d 2b 30  , b, c, in[14]+0
188a0 78 63 33 33 37 30 37 64 36 2c 20 20 39 29 3b 0a  xc33707d6,  9);.
188b0 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
188c0 46 32 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20  F2, c, d, a, b, 
188d0 69 6e 5b 20 33 5d 2b 30 78 66 34 64 35 30 64 38  in[ 3]+0xf4d50d8
188e0 37 2c 20 31 34 29 3b 0a 20 20 20 20 20 20 20 20  7, 14);.        
188f0 4d 44 35 53 54 45 50 28 46 32 2c 20 62 2c 20 63  MD5STEP(F2, b, c
18900 2c 20 64 2c 20 61 2c 20 69 6e 5b 20 38 5d 2b 30  , d, a, in[ 8]+0
18910 78 34 35 35 61 31 34 65 64 2c 20 32 30 29 3b 0a  x455a14ed, 20);.
18920 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
18930 46 32 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20  F2, a, b, c, d, 
18940 69 6e 5b 31 33 5d 2b 30 78 61 39 65 33 65 39 30  in[13]+0xa9e3e90
18950 35 2c 20 20 35 29 3b 0a 20 20 20 20 20 20 20 20  5,  5);.        
18960 4d 44 35 53 54 45 50 28 46 32 2c 20 64 2c 20 61  MD5STEP(F2, d, a
18970 2c 20 62 2c 20 63 2c 20 69 6e 5b 20 32 5d 2b 30  , b, c, in[ 2]+0
18980 78 66 63 65 66 61 33 66 38 2c 20 20 39 29 3b 0a  xfcefa3f8,  9);.
18990 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
189a0 46 32 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20  F2, c, d, a, b, 
189b0 69 6e 5b 20 37 5d 2b 30 78 36 37 36 66 30 32 64  in[ 7]+0x676f02d
189c0 39 2c 20 31 34 29 3b 0a 20 20 20 20 20 20 20 20  9, 14);.        
189d0 4d 44 35 53 54 45 50 28 46 32 2c 20 62 2c 20 63  MD5STEP(F2, b, c
189e0 2c 20 64 2c 20 61 2c 20 69 6e 5b 31 32 5d 2b 30  , d, a, in[12]+0
189f0 78 38 64 32 61 34 63 38 61 2c 20 32 30 29 3b 0a  x8d2a4c8a, 20);.
18a00 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
18a10 28 46 33 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c  (F3, a, b, c, d,
18a20 20 69 6e 5b 20 35 5d 2b 30 78 66 66 66 61 33 39   in[ 5]+0xfffa39
18a30 34 32 2c 20 20 34 29 3b 0a 20 20 20 20 20 20 20  42,  4);.       
18a40 20 4d 44 35 53 54 45 50 28 46 33 2c 20 64 2c 20   MD5STEP(F3, d, 
18a50 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20 38 5d 2b  a, b, c, in[ 8]+
18a60 30 78 38 37 37 31 66 36 38 31 2c 20 31 31 29 3b  0x8771f681, 11);
18a70 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
18a80 28 46 33 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c  (F3, c, d, a, b,
18a90 20 69 6e 5b 31 31 5d 2b 30 78 36 64 39 64 36 31   in[11]+0x6d9d61
18aa0 32 32 2c 20 31 36 29 3b 0a 20 20 20 20 20 20 20  22, 16);.       
18ab0 20 4d 44 35 53 54 45 50 28 46 33 2c 20 62 2c 20   MD5STEP(F3, b, 
18ac0 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 31 34 5d 2b  c, d, a, in[14]+
18ad0 30 78 66 64 65 35 33 38 30 63 2c 20 32 33 29 3b  0xfde5380c, 23);
18ae0 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
18af0 28 46 33 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c  (F3, a, b, c, d,
18b00 20 69 6e 5b 20 31 5d 2b 30 78 61 34 62 65 65 61   in[ 1]+0xa4beea
18b10 34 34 2c 20 20 34 29 3b 0a 20 20 20 20 20 20 20  44,  4);.       
18b20 20 4d 44 35 53 54 45 50 28 46 33 2c 20 64 2c 20   MD5STEP(F3, d, 
18b30 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20 34 5d 2b  a, b, c, in[ 4]+
18b40 30 78 34 62 64 65 63 66 61 39 2c 20 31 31 29 3b  0x4bdecfa9, 11);
18b50 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
18b60 28 46 33 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c  (F3, c, d, a, b,
18b70 20 69 6e 5b 20 37 5d 2b 30 78 66 36 62 62 34 62   in[ 7]+0xf6bb4b
18b80 36 30 2c 20 31 36 29 3b 0a 20 20 20 20 20 20 20  60, 16);.       
18b90 20 4d 44 35 53 54 45 50 28 46 33 2c 20 62 2c 20   MD5STEP(F3, b, 
18ba0 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 31 30 5d 2b  c, d, a, in[10]+
18bb0 30 78 62 65 62 66 62 63 37 30 2c 20 32 33 29 3b  0xbebfbc70, 23);
18bc0 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
18bd0 28 46 33 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c  (F3, a, b, c, d,
18be0 20 69 6e 5b 31 33 5d 2b 30 78 32 38 39 62 37 65   in[13]+0x289b7e
18bf0 63 36 2c 20 20 34 29 3b 0a 20 20 20 20 20 20 20  c6,  4);.       
18c00 20 4d 44 35 53 54 45 50 28 46 33 2c 20 64 2c 20   MD5STEP(F3, d, 
18c10 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20 30 5d 2b  a, b, c, in[ 0]+
18c20 30 78 65 61 61 31 32 37 66 61 2c 20 31 31 29 3b  0xeaa127fa, 11);
18c30 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
18c40 28 46 33 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c  (F3, c, d, a, b,
18c50 20 69 6e 5b 20 33 5d 2b 30 78 64 34 65 66 33 30   in[ 3]+0xd4ef30
18c60 38 35 2c 20 31 36 29 3b 0a 20 20 20 20 20 20 20  85, 16);.       
18c70 20 4d 44 35 53 54 45 50 28 46 33 2c 20 62 2c 20   MD5STEP(F3, b, 
18c80 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20 36 5d 2b  c, d, a, in[ 6]+
18c90 30 78 30 34 38 38 31 64 30 35 2c 20 32 33 29 3b  0x04881d05, 23);
18ca0 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
18cb0 28 46 33 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c  (F3, a, b, c, d,
18cc0 20 69 6e 5b 20 39 5d 2b 30 78 64 39 64 34 64 30   in[ 9]+0xd9d4d0
18cd0 33 39 2c 20 20 34 29 3b 0a 20 20 20 20 20 20 20  39,  4);.       
18ce0 20 4d 44 35 53 54 45 50 28 46 33 2c 20 64 2c 20   MD5STEP(F3, d, 
18cf0 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 31 32 5d 2b  a, b, c, in[12]+
18d00 30 78 65 36 64 62 39 39 65 35 2c 20 31 31 29 3b  0xe6db99e5, 11);
18d10 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
18d20 28 46 33 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c  (F3, c, d, a, b,
18d30 20 69 6e 5b 31 35 5d 2b 30 78 31 66 61 32 37 63   in[15]+0x1fa27c
18d40 66 38 2c 20 31 36 29 3b 0a 20 20 20 20 20 20 20  f8, 16);.       
18d50 20 4d 44 35 53 54 45 50 28 46 33 2c 20 62 2c 20   MD5STEP(F3, b, 
18d60 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20 32 5d 2b  c, d, a, in[ 2]+
18d70 30 78 63 34 61 63 35 36 36 35 2c 20 32 33 29 3b  0xc4ac5665, 23);
18d80 0a 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ..        MD5STE
18d90 50 28 46 34 2c 20 61 2c 20 62 2c 20 63 2c 20 64  P(F4, a, b, c, d
18da0 2c 20 69 6e 5b 20 30 5d 2b 30 78 66 34 32 39 32  , in[ 0]+0xf4292
18db0 32 34 34 2c 20 20 36 29 3b 0a 20 20 20 20 20 20  244,  6);.      
18dc0 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 64 2c    MD5STEP(F4, d,
18dd0 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20 37 5d   a, b, c, in[ 7]
18de0 2b 30 78 34 33 32 61 66 66 39 37 2c 20 31 30 29  +0x432aff97, 10)
18df0 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
18e00 50 28 46 34 2c 20 63 2c 20 64 2c 20 61 2c 20 62  P(F4, c, d, a, b
18e10 2c 20 69 6e 5b 31 34 5d 2b 30 78 61 62 39 34 32  , in[14]+0xab942
18e20 33 61 37 2c 20 31 35 29 3b 0a 20 20 20 20 20 20  3a7, 15);.      
18e30 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 62 2c    MD5STEP(F4, b,
18e40 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20 35 5d   c, d, a, in[ 5]
18e50 2b 30 78 66 63 39 33 61 30 33 39 2c 20 32 31 29  +0xfc93a039, 21)
18e60 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
18e70 50 28 46 34 2c 20 61 2c 20 62 2c 20 63 2c 20 64  P(F4, a, b, c, d
18e80 2c 20 69 6e 5b 31 32 5d 2b 30 78 36 35 35 62 35  , in[12]+0x655b5
18e90 39 63 33 2c 20 20 36 29 3b 0a 20 20 20 20 20 20  9c3,  6);.      
18ea0 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 64 2c    MD5STEP(F4, d,
18eb0 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20 33 5d   a, b, c, in[ 3]
18ec0 2b 30 78 38 66 30 63 63 63 39 32 2c 20 31 30 29  +0x8f0ccc92, 10)
18ed0 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
18ee0 50 28 46 34 2c 20 63 2c 20 64 2c 20 61 2c 20 62  P(F4, c, d, a, b
18ef0 2c 20 69 6e 5b 31 30 5d 2b 30 78 66 66 65 66 66  , in[10]+0xffeff
18f00 34 37 64 2c 20 31 35 29 3b 0a 20 20 20 20 20 20  47d, 15);.      
18f10 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 62 2c    MD5STEP(F4, b,
18f20 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20 31 5d   c, d, a, in[ 1]
18f30 2b 30 78 38 35 38 34 35 64 64 31 2c 20 32 31 29  +0x85845dd1, 21)
18f40 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
18f50 50 28 46 34 2c 20 61 2c 20 62 2c 20 63 2c 20 64  P(F4, a, b, c, d
18f60 2c 20 69 6e 5b 20 38 5d 2b 30 78 36 66 61 38 37  , in[ 8]+0x6fa87
18f70 65 34 66 2c 20 20 36 29 3b 0a 20 20 20 20 20 20  e4f,  6);.      
18f80 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 64 2c    MD5STEP(F4, d,
18f90 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 31 35 5d   a, b, c, in[15]
18fa0 2b 30 78 66 65 32 63 65 36 65 30 2c 20 31 30 29  +0xfe2ce6e0, 10)
18fb0 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
18fc0 50 28 46 34 2c 20 63 2c 20 64 2c 20 61 2c 20 62  P(F4, c, d, a, b
18fd0 2c 20 69 6e 5b 20 36 5d 2b 30 78 61 33 30 31 34  , in[ 6]+0xa3014
18fe0 33 31 34 2c 20 31 35 29 3b 0a 20 20 20 20 20 20  314, 15);.      
18ff0 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 62 2c    MD5STEP(F4, b,
19000 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 31 33 5d   c, d, a, in[13]
19010 2b 30 78 34 65 30 38 31 31 61 31 2c 20 32 31 29  +0x4e0811a1, 21)
19020 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
19030 50 28 46 34 2c 20 61 2c 20 62 2c 20 63 2c 20 64  P(F4, a, b, c, d
19040 2c 20 69 6e 5b 20 34 5d 2b 30 78 66 37 35 33 37  , in[ 4]+0xf7537
19050 65 38 32 2c 20 20 36 29 3b 0a 20 20 20 20 20 20  e82,  6);.      
19060 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 64 2c    MD5STEP(F4, d,
19070 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 31 31 5d   a, b, c, in[11]
19080 2b 30 78 62 64 33 61 66 32 33 35 2c 20 31 30 29  +0xbd3af235, 10)
19090 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
190a0 50 28 46 34 2c 20 63 2c 20 64 2c 20 61 2c 20 62  P(F4, c, d, a, b
190b0 2c 20 69 6e 5b 20 32 5d 2b 30 78 32 61 64 37 64  , in[ 2]+0x2ad7d
190c0 32 62 62 2c 20 31 35 29 3b 0a 20 20 20 20 20 20  2bb, 15);.      
190d0 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 62 2c    MD5STEP(F4, b,
190e0 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20 39 5d   c, d, a, in[ 9]
190f0 2b 30 78 65 62 38 36 64 33 39 31 2c 20 32 31 29  +0xeb86d391, 21)
19100 3b 0a 0a 20 20 20 20 20 20 20 20 62 75 66 5b 30  ;..        buf[0
19110 5d 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 20 20  ] += a;.        
19120 62 75 66 5b 31 5d 20 2b 3d 20 62 3b 0a 20 20 20  buf[1] += b;.   
19130 20 20 20 20 20 62 75 66 5b 32 5d 20 2b 3d 20 63       buf[2] += c
19140 3b 0a 20 20 20 20 20 20 20 20 62 75 66 5b 33 5d  ;.        buf[3]
19150 20 2b 3d 20 64 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20   += d;.}../*. * 
19160 53 74 61 72 74 20 4d 44 35 20 61 63 63 75 6d 75  Start MD5 accumu
19170 6c 61 74 69 6f 6e 2e 20 20 53 65 74 20 62 69 74  lation.  Set bit
19180 20 63 6f 75 6e 74 20 74 6f 20 30 20 61 6e 64 20   count to 0 and 
19190 62 75 66 66 65 72 20 74 6f 20 6d 79 73 74 65 72  buffer to myster
191a0 69 6f 75 73 0a 20 2a 20 69 6e 69 74 69 61 6c 69  ious. * initiali
191b0 7a 61 74 69 6f 6e 20 63 6f 6e 73 74 61 6e 74 73  zation constants
191c0 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  .. */.static voi
191d0 64 20 4d 44 35 49 6e 69 74 28 4d 44 35 43 6f 6e  d MD5Init(MD5Con
191e0 74 65 78 74 20 2a 63 74 78 29 7b 0a 20 20 20 20  text *ctx){.    
191f0 20 20 20 20 63 74 78 2d 3e 69 73 49 6e 69 74 20      ctx->isInit 
19200 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63 74 78  = 1;.        ctx
19210 2d 3e 62 75 66 5b 30 5d 20 3d 20 30 78 36 37 34  ->buf[0] = 0x674
19220 35 32 33 30 31 3b 0a 20 20 20 20 20 20 20 20 63  52301;.        c
19230 74 78 2d 3e 62 75 66 5b 31 5d 20 3d 20 30 78 65  tx->buf[1] = 0xe
19240 66 63 64 61 62 38 39 3b 0a 20 20 20 20 20 20 20  fcdab89;.       
19250 20 63 74 78 2d 3e 62 75 66 5b 32 5d 20 3d 20 30   ctx->buf[2] = 0
19260 78 39 38 62 61 64 63 66 65 3b 0a 20 20 20 20 20  x98badcfe;.     
19270 20 20 20 63 74 78 2d 3e 62 75 66 5b 33 5d 20 3d     ctx->buf[3] =
19280 20 30 78 31 30 33 32 35 34 37 36 3b 0a 20 20 20   0x10325476;.   
19290 20 20 20 20 20 63 74 78 2d 3e 62 69 74 73 5b 30       ctx->bits[0
192a0 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63  ] = 0;.        c
192b0 74 78 2d 3e 62 69 74 73 5b 31 5d 20 3d 20 30 3b  tx->bits[1] = 0;
192c0 0a 7d 0a 0a 2f 2a 0a 20 2a 20 55 70 64 61 74 65  .}../*. * Update
192d0 20 63 6f 6e 74 65 78 74 20 74 6f 20 72 65 66 6c   context to refl
192e0 65 63 74 20 74 68 65 20 63 6f 6e 63 61 74 65 6e  ect the concaten
192f0 61 74 69 6f 6e 20 6f 66 20 61 6e 6f 74 68 65 72  ation of another
19300 20 62 75 66 66 65 72 20 66 75 6c 6c 0a 20 2a 20   buffer full. * 
19310 6f 66 20 62 79 74 65 73 2e 0a 20 2a 2f 0a 73 74  of bytes.. */.st
19320 61 74 69 63 20 0a 76 6f 69 64 20 4d 44 35 55 70  atic .void MD5Up
19330 64 61 74 65 28 4d 44 35 43 6f 6e 74 65 78 74 20  date(MD5Context 
19340 2a 63 74 78 2c 20 63 6f 6e 73 74 20 75 6e 73 69  *ctx, const unsi
19350 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20  gned char *buf, 
19360 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65 6e  unsigned int len
19370 29 7b 0a 20 20 20 20 20 20 20 20 75 69 6e 74 33  ){.        uint3
19380 32 20 74 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  2 t;..        /*
19390 20 55 70 64 61 74 65 20 62 69 74 63 6f 75 6e 74   Update bitcount
193a0 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 74 20 3d   */..        t =
193b0 20 63 74 78 2d 3e 62 69 74 73 5b 30 5d 3b 0a 20   ctx->bits[0];. 
193c0 20 20 20 20 20 20 20 69 66 20 28 28 63 74 78 2d         if ((ctx-
193d0 3e 62 69 74 73 5b 30 5d 20 3d 20 74 20 2b 20 28  >bits[0] = t + (
193e0 28 75 69 6e 74 33 32 29 6c 65 6e 20 3c 3c 20 33  (uint32)len << 3
193f0 29 29 20 3c 20 74 29 0a 20 20 20 20 20 20 20 20  )) < t).        
19400 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62 69 74          ctx->bit
19410 73 5b 31 5d 2b 2b 3b 20 2f 2a 20 43 61 72 72 79  s[1]++; /* Carry
19420 20 66 72 6f 6d 20 6c 6f 77 20 74 6f 20 68 69 67   from low to hig
19430 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 74 78  h */.        ctx
19440 2d 3e 62 69 74 73 5b 31 5d 20 2b 3d 20 6c 65 6e  ->bits[1] += len
19450 20 3e 3e 20 32 39 3b 0a 0a 20 20 20 20 20 20 20   >> 29;..       
19460 20 74 20 3d 20 28 74 20 3e 3e 20 33 29 20 26 20   t = (t >> 3) & 
19470 30 78 33 66 3b 20 20 20 20 2f 2a 20 42 79 74 65  0x3f;    /* Byte
19480 73 20 61 6c 72 65 61 64 79 20 69 6e 20 73 68 73  s already in shs
19490 49 6e 66 6f 2d 3e 64 61 74 61 20 2a 2f 0a 0a 20  Info->data */.. 
194a0 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65         /* Handle
194b0 20 61 6e 79 20 6c 65 61 64 69 6e 67 20 6f 64 64   any leading odd
194c0 2d 73 69 7a 65 64 20 63 68 75 6e 6b 73 20 2a 2f  -sized chunks */
194d0 0a 0a 20 20 20 20 20 20 20 20 69 66 20 28 20 74  ..        if ( t
194e0 20 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20   ) {.           
194f0 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
19500 61 72 20 2a 70 20 3d 20 28 75 6e 73 69 67 6e 65  ar *p = (unsigne
19510 64 20 63 68 61 72 20 2a 29 63 74 78 2d 3e 69 6e  d char *)ctx->in
19520 20 2b 20 74 3b 0a 0a 20 20 20 20 20 20 20 20 20   + t;..         
19530 20 20 20 20 20 20 20 74 20 3d 20 36 34 2d 74 3b         t = 64-t;
19540 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19550 20 69 66 20 28 6c 65 6e 20 3c 20 74 29 20 7b 0a   if (len < t) {.
19560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19570 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
19580 2c 20 62 75 66 2c 20 6c 65 6e 29 3b 0a 20 20 20  , buf, len);.   
19590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
195a0 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
195b0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
195c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
195d0 65 6d 63 70 79 28 70 2c 20 62 75 66 2c 20 74 29  emcpy(p, buf, t)
195e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
195f0 20 20 62 79 74 65 52 65 76 65 72 73 65 28 63 74    byteReverse(ct
19600 78 2d 3e 69 6e 2c 20 31 36 29 3b 0a 20 20 20 20  x->in, 16);.    
19610 20 20 20 20 20 20 20 20 20 20 20 20 4d 44 35 54              MD5T
19620 72 61 6e 73 66 6f 72 6d 28 63 74 78 2d 3e 62 75  ransform(ctx->bu
19630 66 2c 20 28 75 69 6e 74 33 32 20 2a 29 63 74 78  f, (uint32 *)ctx
19640 2d 3e 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  ->in);.         
19650 20 20 20 20 20 20 20 62 75 66 20 2b 3d 20 74 3b         buf += t;
19660 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19670 20 6c 65 6e 20 2d 3d 20 74 3b 0a 20 20 20 20 20   len -= t;.     
19680 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
19690 20 50 72 6f 63 65 73 73 20 64 61 74 61 20 69 6e   Process data in
196a0 20 36 34 2d 62 79 74 65 20 63 68 75 6e 6b 73 20   64-byte chunks 
196b0 2a 2f 0a 0a 20 20 20 20 20 20 20 20 77 68 69 6c  */..        whil
196c0 65 20 28 6c 65 6e 20 3e 3d 20 36 34 29 20 7b 0a  e (len >= 64) {.
196d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196e0 6d 65 6d 63 70 79 28 63 74 78 2d 3e 69 6e 2c 20  memcpy(ctx->in, 
196f0 62 75 66 2c 20 36 34 29 3b 0a 20 20 20 20 20 20  buf, 64);.      
19700 20 20 20 20 20 20 20 20 20 20 62 79 74 65 52 65            byteRe
19710 76 65 72 73 65 28 63 74 78 2d 3e 69 6e 2c 20 31  verse(ctx->in, 1
19720 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  6);.            
19730 20 20 20 20 4d 44 35 54 72 61 6e 73 66 6f 72 6d      MD5Transform
19740 28 63 74 78 2d 3e 62 75 66 2c 20 28 75 69 6e 74  (ctx->buf, (uint
19750 33 32 20 2a 29 63 74 78 2d 3e 69 6e 29 3b 0a 20  32 *)ctx->in);. 
19760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
19770 75 66 20 2b 3d 20 36 34 3b 0a 20 20 20 20 20 20  uf += 64;.      
19780 20 20 20 20 20 20 20 20 20 20 6c 65 6e 20 2d 3d            len -=
19790 20 36 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a   64;.        }..
197a0 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
197b0 65 20 61 6e 79 20 72 65 6d 61 69 6e 69 6e 67 20  e any remaining 
197c0 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 20 2a  bytes of data. *
197d0 2f 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  /..        memcp
197e0 79 28 63 74 78 2d 3e 69 6e 2c 20 62 75 66 2c 20  y(ctx->in, buf, 
197f0 6c 65 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 46  len);.}../*. * F
19800 69 6e 61 6c 20 77 72 61 70 75 70 20 2d 20 70 61  inal wrapup - pa
19810 64 20 74 6f 20 36 34 2d 62 79 74 65 20 62 6f 75  d to 64-byte bou
19820 6e 64 61 72 79 20 77 69 74 68 20 74 68 65 20 62  ndary with the b
19830 69 74 20 70 61 74 74 65 72 6e 20 0a 20 2a 20 31  it pattern . * 1
19840 20 30 2a 20 28 36 34 2d 62 69 74 20 63 6f 75 6e   0* (64-bit coun
19850 74 20 6f 66 20 62 69 74 73 20 70 72 6f 63 65 73  t of bits proces
19860 73 65 64 2c 20 4d 53 42 2d 66 69 72 73 74 29 0a  sed, MSB-first).
19870 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
19880 4d 44 35 46 69 6e 61 6c 28 75 6e 73 69 67 6e 65  MD5Final(unsigne
19890 64 20 63 68 61 72 20 64 69 67 65 73 74 5b 31 36  d char digest[16
198a0 5d 2c 20 4d 44 35 43 6f 6e 74 65 78 74 20 2a 63  ], MD5Context *c
198b0 74 78 29 7b 0a 20 20 20 20 20 20 20 20 75 6e 73  tx){.        uns
198c0 69 67 6e 65 64 20 63 6f 75 6e 74 3b 0a 20 20 20  igned count;.   
198d0 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
198e0 61 72 20 2a 70 3b 0a 0a 20 20 20 20 20 20 20 20  ar *p;..        
198f0 2f 2a 20 43 6f 6d 70 75 74 65 20 6e 75 6d 62 65  /* Compute numbe
19900 72 20 6f 66 20 62 79 74 65 73 20 6d 6f 64 20 36  r of bytes mod 6
19910 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 75  4 */.        cou
19920 6e 74 20 3d 20 28 63 74 78 2d 3e 62 69 74 73 5b  nt = (ctx->bits[
19930 30 5d 20 3e 3e 20 33 29 20 26 20 30 78 33 46 3b  0] >> 3) & 0x3F;
19940 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  ..        /* Set
19950 20 74 68 65 20 66 69 72 73 74 20 63 68 61 72 20   the first char 
19960 6f 66 20 70 61 64 64 69 6e 67 20 74 6f 20 30 78  of padding to 0x
19970 38 30 2e 20 20 54 68 69 73 20 69 73 20 73 61 66  80.  This is saf
19980 65 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73  e since there is
19990 0a 20 20 20 20 20 20 20 20 20 20 20 61 6c 77 61  .           alwa
199a0 79 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ys at least one 
199b0 62 79 74 65 20 66 72 65 65 20 2a 2f 0a 20 20 20  byte free */.   
199c0 20 20 20 20 20 70 20 3d 20 63 74 78 2d 3e 69 6e       p = ctx->in
199d0 20 2b 20 63 6f 75 6e 74 3b 0a 20 20 20 20 20 20   + count;.      
199e0 20 20 2a 70 2b 2b 20 3d 20 30 78 38 30 3b 0a 0a    *p++ = 0x80;..
199f0 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
19a00 20 6f 66 20 70 61 64 64 69 6e 67 20 6e 65 65 64   of padding need
19a10 65 64 20 74 6f 20 6d 61 6b 65 20 36 34 20 62 79  ed to make 64 by
19a20 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63  tes */.        c
19a30 6f 75 6e 74 20 3d 20 36 34 20 2d 20 31 20 2d 20  ount = 64 - 1 - 
19a40 63 6f 75 6e 74 3b 0a 0a 20 20 20 20 20 20 20 20  count;..        
19a50 2f 2a 20 50 61 64 20 6f 75 74 20 74 6f 20 35 36  /* Pad out to 56
19a60 20 6d 6f 64 20 36 34 20 2a 2f 0a 20 20 20 20 20   mod 64 */.     
19a70 20 20 20 69 66 20 28 63 6f 75 6e 74 20 3c 20 38     if (count < 8
19a80 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
19a90 20 20 20 20 2f 2a 20 54 77 6f 20 6c 6f 74 73 20      /* Two lots 
19aa0 6f 66 20 70 61 64 64 69 6e 67 3a 20 20 50 61 64  of padding:  Pad
19ab0 20 74 68 65 20 66 69 72 73 74 20 62 6c 6f 63 6b   the first block
19ac0 20 74 6f 20 36 34 20 62 79 74 65 73 20 2a 2f 0a   to 64 bytes */.
19ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ae0 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 63 6f 75  memset(p, 0, cou
19af0 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nt);.           
19b00 20 20 20 20 20 62 79 74 65 52 65 76 65 72 73 65       byteReverse
19b10 28 63 74 78 2d 3e 69 6e 2c 20 31 36 29 3b 0a 20  (ctx->in, 16);. 
19b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4d                 M
19b30 44 35 54 72 61 6e 73 66 6f 72 6d 28 63 74 78 2d  D5Transform(ctx-
19b40 3e 62 75 66 2c 20 28 75 69 6e 74 33 32 20 2a 29  >buf, (uint32 *)
19b50 63 74 78 2d 3e 69 6e 29 3b 0a 0a 20 20 20 20 20  ctx->in);..     
19b60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
19b70 77 20 66 69 6c 6c 20 74 68 65 20 6e 65 78 74 20  w fill the next 
19b80 62 6c 6f 63 6b 20 77 69 74 68 20 35 36 20 62 79  block with 56 by
19b90 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  tes */.         
19ba0 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 63 74         memset(ct
19bb0 78 2d 3e 69 6e 2c 20 30 2c 20 35 36 29 3b 0a 20  x->in, 0, 56);. 
19bc0 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a         } else {.
19bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19be0 2f 2a 20 50 61 64 20 62 6c 6f 63 6b 20 74 6f 20  /* Pad block to 
19bf0 35 36 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  56 bytes */.    
19c00 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73              mems
19c10 65 74 28 70 2c 20 30 2c 20 63 6f 75 6e 74 2d 38  et(p, 0, count-8
19c20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
19c30 20 20 20 20 20 62 79 74 65 52 65 76 65 72 73 65       byteReverse
19c40 28 63 74 78 2d 3e 69 6e 2c 20 31 34 29 3b 0a 0a  (ctx->in, 14);..
19c50 20 20 20 20 20 20 20 20 2f 2a 20 41 70 70 65 6e          /* Appen
19c60 64 20 6c 65 6e 67 74 68 20 69 6e 20 62 69 74 73  d length in bits
19c70 20 61 6e 64 20 74 72 61 6e 73 66 6f 72 6d 20 2a   and transform *
19c80 2f 0a 20 20 20 20 20 20 20 20 28 28 75 69 6e 74  /.        ((uint
19c90 33 32 20 2a 29 63 74 78 2d 3e 69 6e 29 5b 20 31  32 *)ctx->in)[ 1
19ca0 34 20 5d 20 3d 20 63 74 78 2d 3e 62 69 74 73 5b  4 ] = ctx->bits[
19cb0 30 5d 3b 0a 20 20 20 20 20 20 20 20 28 28 75 69  0];.        ((ui
19cc0 6e 74 33 32 20 2a 29 63 74 78 2d 3e 69 6e 29 5b  nt32 *)ctx->in)[
19cd0 20 31 35 20 5d 20 3d 20 63 74 78 2d 3e 62 69 74   15 ] = ctx->bit
19ce0 73 5b 31 5d 3b 0a 0a 20 20 20 20 20 20 20 20 4d  s[1];..        M
19cf0 44 35 54 72 61 6e 73 66 6f 72 6d 28 63 74 78 2d  D5Transform(ctx-
19d00 3e 62 75 66 2c 20 28 75 69 6e 74 33 32 20 2a 29  >buf, (uint32 *)
19d10 63 74 78 2d 3e 69 6e 29 3b 0a 20 20 20 20 20 20  ctx->in);.      
19d20 20 20 62 79 74 65 52 65 76 65 72 73 65 28 28 75    byteReverse((u
19d30 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 63  nsigned char *)c
19d40 74 78 2d 3e 62 75 66 2c 20 34 29 3b 0a 20 20 20  tx->buf, 4);.   
19d50 20 20 20 20 20 6d 65 6d 63 70 79 28 64 69 67 65       memcpy(dige
19d60 73 74 2c 20 63 74 78 2d 3e 62 75 66 2c 20 31 36  st, ctx->buf, 16
19d70 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  );.        memse
19d80 74 28 63 74 78 2c 20 30 2c 20 73 69 7a 65 6f 66  t(ctx, 0, sizeof
19d90 28 63 74 78 29 29 3b 20 20 20 20 2f 2a 20 49 6e  (ctx));    /* In
19da0 20 63 61 73 65 20 69 74 20 69 73 20 73 65 6e 73   case it is sens
19db0 69 74 69 76 65 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a  itive */.}../*.*
19dc0 2a 20 43 6f 6e 76 65 72 74 20 61 20 31 32 38 2d  * Convert a 128-
19dd0 62 69 74 20 4d 44 35 20 64 69 67 65 73 74 20 69  bit MD5 digest i
19de0 6e 74 6f 20 61 20 33 32 2d 64 69 67 69 74 20 62  nto a 32-digit b
19df0 61 73 65 2d 31 36 20 6e 75 6d 62 65 72 2e 0a 2a  ase-16 number..*
19e00 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 4d 44  /.static void MD
19e10 35 44 69 67 65 73 74 54 6f 42 61 73 65 31 36 28  5DigestToBase16(
19e20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
19e30 69 67 65 73 74 2c 20 63 68 61 72 20 2a 7a 42 75  igest, char *zBu
19e40 66 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61  f){.  static cha
19e50 72 20 63 6f 6e 73 74 20 7a 45 6e 63 6f 64 65 5b  r const zEncode[
19e60 5d 20 3d 20 22 30 31 32 33 34 35 36 37 38 39 61  ] = "0123456789a
19e70 62 63 64 65 66 22 3b 0a 20 20 69 6e 74 20 69 2c  bcdef";.  int i,
19e80 20 6a 3b 0a 0a 20 20 66 6f 72 28 6a 3d 69 3d 30   j;..  for(j=i=0
19e90 3b 20 69 3c 31 36 3b 20 69 2b 2b 29 7b 0a 20 20  ; i<16; i++){.  
19ea0 20 20 69 6e 74 20 61 20 3d 20 64 69 67 65 73 74    int a = digest
19eb0 5b 69 5d 3b 0a 20 20 20 20 7a 42 75 66 5b 6a 2b  [i];.    zBuf[j+
19ec0 2b 5d 20 3d 20 7a 45 6e 63 6f 64 65 5b 28 61 3e  +] = zEncode[(a>
19ed0 3e 34 29 26 30 78 66 5d 3b 0a 20 20 20 20 7a 42  >4)&0xf];.    zB
19ee0 75 66 5b 6a 2b 2b 5d 20 3d 20 7a 45 6e 63 6f 64  uf[j++] = zEncod
19ef0 65 5b 61 20 26 20 30 78 66 5d 3b 0a 20 20 7d 0a  e[a & 0xf];.  }.
19f00 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 7d    zBuf[j] = 0;.}
19f10 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  .../*.** Convert
19f20 20 61 20 31 32 38 2d 62 69 74 20 4d 44 35 20 64   a 128-bit MD5 d
19f30 69 67 65 73 74 20 69 6e 74 6f 20 73 65 71 75 65  igest into seque
19f40 6e 63 79 20 6f 66 20 65 69 67 68 74 20 35 2d 64  ncy of eight 5-d
19f50 69 67 69 74 20 69 6e 74 65 67 65 72 73 0a 2a 2a  igit integers.**
19f60 20 65 61 63 68 20 72 65 70 72 65 73 65 6e 74 69   each representi
19f70 6e 67 20 31 36 20 62 69 74 73 20 6f 66 20 74 68  ng 16 bits of th
19f80 65 20 64 69 67 65 73 74 20 61 6e 64 20 73 65 70  e digest and sep
19f90 61 72 61 74 65 64 20 66 72 6f 6d 20 65 61 63 68  arated from each
19fa0 0a 2a 2a 20 6f 74 68 65 72 20 62 79 20 61 20 22  .** other by a "
19fb0 2d 22 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f  -" character..*/
19fc0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 4d 44 35  .static void MD5
19fd0 44 69 67 65 73 74 54 6f 42 61 73 65 31 30 78 38  DigestToBase10x8
19fe0 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64  (unsigned char d
19ff0 69 67 65 73 74 5b 31 36 5d 2c 20 63 68 61 72 20  igest[16], char 
1a000 7a 44 69 67 65 73 74 5b 35 30 5d 29 7b 0a 20 20  zDigest[50]){.  
1a010 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 75 6e 73 69  int i, j;.  unsi
1a020 67 6e 65 64 20 69 6e 74 20 78 3b 0a 20 20 66 6f  gned int x;.  fo
1a030 72 28 69 3d 6a 3d 30 3b 20 69 3c 31 36 3b 20 69  r(i=j=0; i<16; i
1a040 2b 3d 32 29 7b 0a 20 20 20 20 78 20 3d 20 64 69  +=2){.    x = di
1a050 67 65 73 74 5b 69 5d 2a 32 35 36 20 2b 20 64 69  gest[i]*256 + di
1a060 67 65 73 74 5b 69 2b 31 5d 3b 0a 20 20 20 20 69  gest[i+1];.    i
1a070 66 28 20 69 3e 30 20 29 20 7a 44 69 67 65 73 74  f( i>0 ) zDigest
1a080 5b 6a 2b 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20 20  [j++] = '-';.   
1a090 20 73 70 72 69 6e 74 66 28 26 7a 44 69 67 65 73   sprintf(&zDiges
1a0a0 74 5b 6a 5d 2c 20 22 25 30 35 75 22 2c 20 78 29  t[j], "%05u", x)
1a0b0 3b 0a 20 20 20 20 6a 20 2b 3d 20 35 3b 0a 20 20  ;.    j += 5;.  
1a0c0 7d 0a 20 20 7a 44 69 67 65 73 74 5b 6a 5d 20 3d  }.  zDigest[j] =
1a0d0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 54   0;.}../*.** A T
1a0e0 43 4c 20 63 6f 6d 6d 61 6e 64 20 66 6f 72 20 6d  CL command for m
1a0f0 64 35 2e 20 20 54 68 65 20 61 72 67 75 6d 65 6e  d5.  The argumen
1a100 74 20 69 73 20 74 68 65 20 74 65 78 74 20 74 6f  t is the text to
1a110 20 62 65 20 68 61 73 68 65 64 2e 20 20 54 68 65   be hashed.  The
1a120 0a 2a 2a 20 52 65 73 75 6c 74 20 69 73 20 74 68  .** Result is th
1a130 65 20 68 61 73 68 20 69 6e 20 62 61 73 65 36 34  e hash in base64
1a140 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .  .*/.static in
1a150 74 20 6d 64 35 5f 63 6d 64 28 76 6f 69 64 2a 63  t md5_cmd(void*c
1a160 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  d, Tcl_Interp *i
1a170 6e 74 65 72 70 2c 20 69 6e 74 20 61 72 67 63 2c  nterp, int argc,
1a180 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72   const char **ar
1a190 67 76 29 7b 0a 20 20 4d 44 35 43 6f 6e 74 65 78  gv){.  MD5Contex
1a1a0 74 20 63 74 78 3b 0a 20 20 75 6e 73 69 67 6e 65  t ctx;.  unsigne
1a1b0 64 20 63 68 61 72 20 64 69 67 65 73 74 5b 31 36  d char digest[16
1a1c0 5d 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35  ];.  char zBuf[5
1a1d0 30 5d 3b 0a 20 20 76 6f 69 64 20 28 2a 63 6f 6e  0];.  void (*con
1a1e0 76 65 72 74 65 72 29 28 75 6e 73 69 67 6e 65 64  verter)(unsigned
1a1f0 20 63 68 61 72 2a 2c 20 63 68 61 72 2a 29 3b 0a   char*, char*);.
1a200 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29  .  if( argc!=2 )
1a210 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1a220 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 77  Result(interp,"w
1a230 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
1a240 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
1a250 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 20 22 20  [0], .        " 
1a260 54 45 58 54 5c 22 22 2c 20 30 29 3b 0a 20 20 20  TEXT\"", 0);.   
1a270 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1a280 52 3b 0a 20 20 7d 0a 20 20 4d 44 35 49 6e 69 74  R;.  }.  MD5Init
1a290 28 26 63 74 78 29 3b 0a 20 20 4d 44 35 55 70 64  (&ctx);.  MD5Upd
1a2a0 61 74 65 28 26 63 74 78 2c 20 28 75 6e 73 69 67  ate(&ctx, (unsig
1a2b0 6e 65 64 20 63 68 61 72 2a 29 61 72 67 76 5b 31  ned char*)argv[1
1a2c0 5d 2c 20 28 75 6e 73 69 67 6e 65 64 29 73 74 72  ], (unsigned)str
1a2d0 6c 65 6e 28 61 72 67 76 5b 31 5d 29 29 3b 0a 20  len(argv[1]));. 
1a2e0 20 4d 44 35 46 69 6e 61 6c 28 64 69 67 65 73 74   MD5Final(digest
1a2f0 2c 20 26 63 74 78 29 3b 0a 20 20 63 6f 6e 76 65  , &ctx);.  conve
1a300 72 74 65 72 20 3d 20 28 76 6f 69 64 28 2a 29 28  rter = (void(*)(
1a310 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 2c 63  unsigned char*,c
1a320 68 61 72 2a 29 29 63 64 3b 0a 20 20 63 6f 6e 76  har*))cd;.  conv
1a330 65 72 74 65 72 28 64 69 67 65 73 74 2c 20 7a 42  erter(digest, zB
1a340 75 66 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  uf);.  Tcl_Appen
1a350 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1a360 7a 42 75 66 2c 20 28 63 68 61 72 2a 29 30 29 3b  zBuf, (char*)0);
1a370 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1a380 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 54 43 4c  ;.}../*.** A TCL
1a390 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 74 61 6b 65   command to take
1a3a0 20 74 68 65 20 6d 64 35 20 68 61 73 68 20 6f 66   the md5 hash of
1a3b0 20 61 20 66 69 6c 65 2e 20 20 54 68 65 20 61 72   a file.  The ar
1a3c0 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a  gument is the.**
1a3d0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   name of the fil
1a3e0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1a3f0 20 6d 64 35 66 69 6c 65 5f 63 6d 64 28 76 6f 69   md5file_cmd(voi
1a400 64 2a 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70  d*cd, Tcl_Interp
1a410 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 61 72 67  *interp, int arg
1a420 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  c, const char **
1a430 61 72 67 76 29 7b 0a 20 20 46 49 4c 45 20 2a 69  argv){.  FILE *i
1a440 6e 3b 0a 20 20 4d 44 35 43 6f 6e 74 65 78 74 20  n;.  MD5Context 
1a450 63 74 78 3b 0a 20 20 76 6f 69 64 20 28 2a 63 6f  ctx;.  void (*co
1a460 6e 76 65 72 74 65 72 29 28 75 6e 73 69 67 6e 65  nverter)(unsigne
1a470 64 20 63 68 61 72 2a 2c 20 63 68 61 72 2a 29 3b  d char*, char*);
1a480 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1a490 20 64 69 67 65 73 74 5b 31 36 5d 3b 0a 20 20 63   digest[16];.  c
1a4a0 68 61 72 20 7a 42 75 66 5b 31 30 32 34 30 5d 3b  har zBuf[10240];
1a4b0 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20  ..  if( argc!=2 
1a4c0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1a4d0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22  dResult(interp,"
1a4e0 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
1a4f0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
1a500 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 20 22  v[0], .        "
1a510 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30 29   FILENAME\"", 0)
1a520 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1a530 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 6e  _ERROR;.  }.  in
1a540 20 3d 20 66 6f 70 65 6e 28 61 72 67 76 5b 31 5d   = fopen(argv[1]
1a550 2c 22 72 62 22 29 3b 0a 20 20 69 66 28 20 69 6e  ,"rb");.  if( in
1a560 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  ==0 ){.    Tcl_A
1a570 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1a580 72 70 2c 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70  rp,"unable to op
1a590 65 6e 20 66 69 6c 65 20 5c 22 22 2c 20 61 72 67  en file \"", arg
1a5a0 76 5b 31 5d 2c 20 0a 20 20 20 20 20 20 20 20 20  v[1], .         
1a5b0 22 5c 22 20 66 6f 72 20 72 65 61 64 69 6e 67 22  "\" for reading"
1a5c0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1a5d0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1a5e0 20 20 4d 44 35 49 6e 69 74 28 26 63 74 78 29 3b    MD5Init(&ctx);
1a5f0 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20  .  for(;;){.    
1a600 69 6e 74 20 6e 3b 0a 20 20 20 20 6e 20 3d 20 28  int n;.    n = (
1a610 69 6e 74 29 66 72 65 61 64 28 7a 42 75 66 2c 20  int)fread(zBuf, 
1a620 31 2c 20 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c  1, sizeof(zBuf),
1a630 20 69 6e 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c   in);.    if( n<
1a640 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
1a650 4d 44 35 55 70 64 61 74 65 28 26 63 74 78 2c 20  MD5Update(&ctx, 
1a660 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
1a670 7a 42 75 66 2c 20 28 75 6e 73 69 67 6e 65 64 29  zBuf, (unsigned)
1a680 6e 29 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65  n);.  }.  fclose
1a690 28 69 6e 29 3b 0a 20 20 4d 44 35 46 69 6e 61 6c  (in);.  MD5Final
1a6a0 28 64 69 67 65 73 74 2c 20 26 63 74 78 29 3b 0a  (digest, &ctx);.
1a6b0 20 20 63 6f 6e 76 65 72 74 65 72 20 3d 20 28 76    converter = (v
1a6c0 6f 69 64 28 2a 29 28 75 6e 73 69 67 6e 65 64 20  oid(*)(unsigned 
1a6d0 63 68 61 72 2a 2c 63 68 61 72 2a 29 29 63 64 3b  char*,char*))cd;
1a6e0 0a 20 20 63 6f 6e 76 65 72 74 65 72 28 64 69 67  .  converter(dig
1a6f0 65 73 74 2c 20 7a 42 75 66 29 3b 0a 20 20 54 63  est, zBuf);.  Tc
1a700 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1a710 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 28 63 68  nterp, zBuf, (ch
1a720 61 72 2a 29 30 29 3b 0a 20 20 72 65 74 75 72 6e  ar*)0);.  return
1a730 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1a740 2a 20 52 65 67 69 73 74 65 72 20 74 68 65 20 66  * Register the f
1a750 6f 75 72 20 6e 65 77 20 54 43 4c 20 63 6f 6d 6d  our new TCL comm
1a760 61 6e 64 73 20 66 6f 72 20 67 65 6e 65 72 61 74  ands for generat
1a770 69 6e 67 20 4d 44 35 20 63 68 65 63 6b 73 75 6d  ing MD5 checksum
1a780 73 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 54 43  s.** with the TC
1a790 4c 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 2a  L interpreter..*
1a7a0 2f 0a 69 6e 74 20 4d 64 35 5f 49 6e 69 74 28 54  /.int Md5_Init(T
1a7b0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1a7c0 70 29 7b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65  p){.  Tcl_Create
1a7d0 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
1a7e0 22 6d 64 35 22 2c 20 28 54 63 6c 5f 43 6d 64 50  "md5", (Tcl_CmdP
1a7f0 72 6f 63 2a 29 6d 64 35 5f 63 6d 64 2c 0a 20 20  roc*)md5_cmd,.  
1a800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a810 20 20 4d 44 35 44 69 67 65 73 74 54 6f 42 61 73    MD5DigestToBas
1a820 65 31 36 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43  e16, 0);.  Tcl_C
1a830 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74  reateCommand(int
1a840 65 72 70 2c 20 22 6d 64 35 2d 31 30 78 38 22 2c  erp, "md5-10x8",
1a850 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 6d   (Tcl_CmdProc*)m
1a860 64 35 5f 63 6d 64 2c 0a 20 20 20 20 20 20 20 20  d5_cmd,.        
1a870 20 20 20 20 20 20 20 20 20 20 20 20 4d 44 35 44              MD5D
1a880 69 67 65 73 74 54 6f 42 61 73 65 31 30 78 38 2c  igestToBase10x8,
1a890 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74   0);.  Tcl_Creat
1a8a0 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  eCommand(interp,
1a8b0 20 22 6d 64 35 66 69 6c 65 22 2c 20 28 54 63 6c   "md5file", (Tcl
1a8c0 5f 43 6d 64 50 72 6f 63 2a 29 6d 64 35 66 69 6c  _CmdProc*)md5fil
1a8d0 65 5f 63 6d 64 2c 0a 20 20 20 20 20 20 20 20 20  e_cmd,.         
1a8e0 20 20 20 20 20 20 20 20 20 20 20 4d 44 35 44 69             MD5Di
1a8f0 67 65 73 74 54 6f 42 61 73 65 31 36 2c 20 30 29  gestToBase16, 0)
1a900 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 43 6f  ;.  Tcl_CreateCo
1a910 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 6d  mmand(interp, "m
1a920 64 35 66 69 6c 65 2d 31 30 78 38 22 2c 20 28 54  d5file-10x8", (T
1a930 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 6d 64 35 66  cl_CmdProc*)md5f
1a940 69 6c 65 5f 63 6d 64 2c 0a 20 20 20 20 20 20 20  ile_cmd,.       
1a950 20 20 20 20 20 20 20 20 20 20 20 20 20 4d 44 35               MD5
1a960 44 69 67 65 73 74 54 6f 42 61 73 65 31 30 78 38  DigestToBase10x8
1a970 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
1a980 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  CL_OK;.}.#endif 
1a990 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  /* defined(SQLIT
1a9a0 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e  E_TEST) || defin
1a9b0 65 64 28 53 51 4c 49 54 45 5f 54 43 4c 4d 44 35  ed(SQLITE_TCLMD5
1a9c0 29 20 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65  ) */..#if define
1a9d0 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f  d(SQLITE_TEST)./
1a9e0 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 74 65 73 74  *.** During test
1a9f0 69 6e 67 2c 20 74 68 65 20 73 70 65 63 69 61 6c  ing, the special
1aa00 20 6d 64 35 73 75 6d 28 29 20 61 67 67 72 65 67   md5sum() aggreg
1aa10 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  ate function is 
1aa20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 20 69 6e  available..** in
1aa30 73 69 64 65 20 53 51 4c 69 74 65 2e 20 20 54 68  side SQLite.  Th
1aa40 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74  e following rout
1aa50 69 6e 65 73 20 69 6d 70 6c 65 6d 65 6e 74 20 74  ines implement t
1aa60 68 61 74 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  hat function..*/
1aa70 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 64 35  .static void md5
1aa80 73 74 65 70 28 73 71 6c 69 74 65 33 5f 63 6f 6e  step(sqlite3_con
1aa90 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69  text *context, i
1aaa0 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
1aab0 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a  _value **argv){.
1aac0 20 20 4d 44 35 43 6f 6e 74 65 78 74 20 2a 70 3b    MD5Context *p;
1aad0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
1aae0 61 72 67 63 3c 31 20 29 20 72 65 74 75 72 6e 3b  argc<1 ) return;
1aaf0 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61  .  p = sqlite3_a
1ab00 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
1ab10 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66  (context, sizeof
1ab20 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 3d 3d  (*p));.  if( p==
1ab30 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
1ab40 28 20 21 70 2d 3e 69 73 49 6e 69 74 20 29 7b 0a  ( !p->isInit ){.
1ab50 20 20 20 20 4d 44 35 49 6e 69 74 28 70 29 3b 0a      MD5Init(p);.
1ab60 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
1ab70 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <argc; i++){.   
1ab80 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61   const char *zDa
1ab90 74 61 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69  ta = (char*)sqli
1aba0 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
1abb0 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28  rgv[i]);.    if(
1abc0 20 7a 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20   zData ){.      
1abd0 4d 44 35 55 70 64 61 74 65 28 70 2c 20 28 75 6e  MD5Update(p, (un
1abe0 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 44 61  signed char*)zDa
1abf0 74 61 2c 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  ta, (int)strlen(
1ac00 7a 44 61 74 61 29 29 3b 0a 20 20 20 20 7d 0a 20  zData));.    }. 
1ac10 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
1ac20 20 6d 64 35 66 69 6e 61 6c 69 7a 65 28 73 71 6c   md5finalize(sql
1ac30 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
1ac40 6e 74 65 78 74 29 7b 0a 20 20 4d 44 35 43 6f 6e  ntext){.  MD5Con
1ac50 74 65 78 74 20 2a 70 3b 0a 20 20 75 6e 73 69 67  text *p;.  unsig
1ac60 6e 65 64 20 63 68 61 72 20 64 69 67 65 73 74 5b  ned char digest[
1ac70 31 36 5d 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  16];.  char zBuf
1ac80 5b 33 33 5d 3b 0a 20 20 70 20 3d 20 73 71 6c 69  [33];.  p = sqli
1ac90 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
1aca0 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73  ntext(context, s
1acb0 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 4d 44  izeof(*p));.  MD
1acc0 35 46 69 6e 61 6c 28 64 69 67 65 73 74 2c 70 29  5Final(digest,p)
1acd0 3b 0a 20 20 4d 44 35 44 69 67 65 73 74 54 6f 42  ;.  MD5DigestToB
1ace0 61 73 65 31 36 28 64 69 67 65 73 74 2c 20 7a 42  ase16(digest, zB
1acf0 75 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  uf);.  sqlite3_r
1ad00 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
1ad10 78 74 2c 20 7a 42 75 66 2c 20 2d 31 2c 20 53 51  xt, zBuf, -1, SQ
1ad20 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
1ad30 0a 7d 0a 69 6e 74 20 4d 64 35 5f 52 65 67 69 73  .}.int Md5_Regis
1ad40 74 65 72 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ter(sqlite3 *db)
1ad50 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  {.  int rc = sql
1ad60 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
1ad70 74 69 6f 6e 28 64 62 2c 20 22 6d 64 35 73 75 6d  tion(db, "md5sum
1ad80 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  ", -1, SQLITE_UT
1ad90 46 38 2c 20 30 2c 20 30 2c 20 0a 20 20 20 20 20  F8, 0, 0, .     
1ada0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1adb0 20 20 20 20 20 20 20 20 20 20 20 20 6d 64 35 73              md5s
1adc0 74 65 70 2c 20 6d 64 35 66 69 6e 61 6c 69 7a 65  tep, md5finalize
1add0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6f 76 65  );.  sqlite3_ove
1ade0 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e 28 64  rload_function(d
1adf0 62 2c 20 22 6d 64 35 73 75 6d 22 2c 20 2d 31 29  b, "md5sum", -1)
1ae00 3b 20 20 2f 2a 20 54 6f 20 65 78 65 72 63 69 73  ;  /* To exercis
1ae10 65 20 74 68 69 73 20 41 50 49 20 2a 2f 0a 20 20  e this API */.  
1ae20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
1ae30 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53  dif /* defined(S
1ae40 51 4c 49 54 45 5f 54 45 53 54 29 20 2a 2f 0a 0a  QLITE_TEST) */..
1ae50 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61  ./*.** If the ma
1ae60 63 72 6f 20 54 43 4c 53 48 20 69 73 20 6f 6e 65  cro TCLSH is one
1ae70 2c 20 74 68 65 6e 20 70 75 74 20 69 6e 20 63 6f  , then put in co
1ae80 64 65 20 74 68 69 73 20 66 6f 72 20 74 68 65 0a  de this for the.
1ae90 2a 2a 20 22 6d 61 69 6e 22 20 72 6f 75 74 69 6e  ** "main" routin
1aea0 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 69 74  e that will init
1aeb0 69 61 6c 69 7a 65 20 54 63 6c 20 61 6e 64 20 74  ialize Tcl and t
1aec0 61 6b 65 20 69 6e 70 75 74 20 66 72 6f 6d 0a 2a  ake input from.*
1aed0 2a 20 73 74 61 6e 64 61 72 64 20 69 6e 70 75 74  * standard input
1aee0 2c 20 6f 72 20 69 66 20 61 20 66 69 6c 65 20 69  , or if a file i
1aef0 73 20 6e 61 6d 65 64 20 6f 6e 20 74 68 65 20 63  s named on the c
1af00 6f 6d 6d 61 6e 64 20 6c 69 6e 65 0a 2a 2a 20 74  ommand line.** t
1af10 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
1af20 65 72 20 72 65 61 64 73 20 61 6e 64 20 65 76 61  er reads and eva
1af30 6c 75 61 74 65 73 20 74 68 61 74 20 66 69 6c 65  luates that file
1af40 2e 0a 2a 2f 0a 23 69 66 20 54 43 4c 53 48 3d 3d  ..*/.#if TCLSH==
1af50 31 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  1.static const c
1af60 68 61 72 20 2a 74 63 6c 73 68 5f 6d 61 69 6e 5f  har *tclsh_main_
1af70 6c 6f 6f 70 28 76 6f 69 64 29 7b 0a 20 20 73 74  loop(void){.  st
1af80 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
1af90 7a 4d 61 69 6e 6c 6f 6f 70 5b 5d 20 3d 0a 20 20  zMainloop[] =.  
1afa0 20 20 22 73 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e    "set line {}\n
1afb0 22 0a 20 20 20 20 22 77 68 69 6c 65 20 7b 21 5b  ".    "while {![
1afc0 65 6f 66 20 73 74 64 69 6e 5d 7d 20 7b 5c 6e 22  eof stdin]} {\n"
1afd0 0a 20 20 20 20 20 20 22 69 66 20 7b 24 6c 69 6e  .      "if {$lin
1afe0 65 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20  e!=\"\"} {\n".  
1aff0 20 20 20 20 20 20 22 70 75 74 73 20 2d 6e 6f 6e        "puts -non
1b000 65 77 6c 69 6e 65 20 5c 22 3e 20 5c 22 5c 6e 22  ewline \"> \"\n"
1b010 0a 20 20 20 20 20 20 22 7d 20 65 6c 73 65 20 7b  .      "} else {
1b020 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 70 75 74  \n".        "put
1b030 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22 25  s -nonewline \"%
1b040 20 5c 22 5c 6e 22 0a 20 20 20 20 20 20 22 7d 5c   \"\n".      "}\
1b050 6e 22 0a 20 20 20 20 20 20 22 66 6c 75 73 68 20  n".      "flush 
1b060 73 74 64 6f 75 74 5c 6e 22 0a 20 20 20 20 20 20  stdout\n".      
1b070 22 61 70 70 65 6e 64 20 6c 69 6e 65 20 5b 67 65  "append line [ge
1b080 74 73 20 73 74 64 69 6e 5d 5c 6e 22 0a 20 20 20  ts stdin]\n".   
1b090 20 20 20 22 69 66 20 7b 5b 69 6e 66 6f 20 63 6f     "if {[info co
1b0a0 6d 70 6c 65 74 65 20 24 6c 69 6e 65 5d 7d 20 7b  mplete $line]} {
1b0b0 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 69 66 20  \n".        "if 
1b0c0 7b 5b 63 61 74 63 68 20 7b 75 70 6c 65 76 65 6c  {[catch {uplevel
1b0d0 20 23 30 20 24 6c 69 6e 65 7d 20 72 65 73 75 6c   #0 $line} resul
1b0e0 74 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20  t]} {\n".       
1b0f0 20 20 20 22 70 75 74 73 20 73 74 64 65 72 72 20     "puts stderr 
1b100 5c 22 45 72 72 6f 72 3a 20 24 72 65 73 75 6c 74  \"Error: $result
1b110 5c 22 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 7d  \"\n".        "}
1b120 20 65 6c 73 65 69 66 20 7b 24 72 65 73 75 6c 74   elseif {$result
1b130 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20  !=\"\"} {\n".   
1b140 20 20 20 20 20 20 20 22 70 75 74 73 20 24 72 65         "puts $re
1b150 73 75 6c 74 5c 6e 22 0a 20 20 20 20 20 20 20 20  sult\n".        
1b160 22 7d 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 73  "}\n".        "s
1b170 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20  et line {}\n".  
1b180 20 20 20 20 22 7d 20 65 6c 73 65 20 7b 5c 6e 22      "} else {\n"
1b190 0a 20 20 20 20 20 20 20 20 22 61 70 70 65 6e 64  .        "append
1b1a0 20 6c 69 6e 65 20 5c 5c 6e 5c 6e 22 0a 20 20 20   line \\n\n".   
1b1b0 20 20 20 22 7d 5c 6e 22 0a 20 20 20 20 22 7d 5c     "}\n".    "}\
1b1c0 6e 22 0a 20 20 3b 0a 20 20 72 65 74 75 72 6e 20  n".  ;.  return 
1b1d0 7a 4d 61 69 6e 6c 6f 6f 70 3b 0a 7d 0a 23 65 6e  zMainloop;.}.#en
1b1e0 64 69 66 0a 23 69 66 20 54 43 4c 53 48 3d 3d 32  dif.#if TCLSH==2
1b1f0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
1b200 61 72 20 2a 74 63 6c 73 68 5f 6d 61 69 6e 5f 6c  ar *tclsh_main_l
1b210 6f 6f 70 28 76 6f 69 64 29 3b 0a 23 65 6e 64 69  oop(void);.#endi
1b220 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
1b230 5f 54 45 53 54 0a 73 74 61 74 69 63 20 76 6f 69  _TEST.static voi
1b240 64 20 69 6e 69 74 5f 61 6c 6c 28 54 63 6c 5f 49  d init_all(Tcl_I
1b250 6e 74 65 72 70 20 2a 29 3b 0a 73 74 61 74 69 63  nterp *);.static
1b260 20 69 6e 74 20 69 6e 69 74 5f 61 6c 6c 5f 63 6d   int init_all_cm
1b270 64 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  d(.  ClientData 
1b280 63 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  cd,.  Tcl_Interp
1b290 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1b2a0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1b2b0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1b2c0 0a 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ..  Tcl_Interp *
1b2d0 73 6c 61 76 65 3b 0a 20 20 69 66 28 20 6f 62 6a  slave;.  if( obj
1b2e0 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
1b2f0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
1b300 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
1b310 4c 41 56 45 22 29 3b 0a 20 20 20 20 72 65 74 75  LAVE");.    retu
1b320 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1b330 7d 0a 0a 20 20 73 6c 61 76 65 20 3d 20 54 63 6c  }..  slave = Tcl
1b340 5f 47 65 74 53 6c 61 76 65 28 69 6e 74 65 72 70  _GetSlave(interp
1b350 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
1b360 6f 62 6a 76 5b 31 5d 29 29 3b 0a 20 20 69 66 28  objv[1]));.  if(
1b370 20 21 73 6c 61 76 65 20 29 7b 0a 20 20 20 20 72   !slave ){.    r
1b380 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1b390 0a 20 20 7d 0a 0a 20 20 69 6e 69 74 5f 61 6c 6c  .  }..  init_all
1b3a0 28 73 6c 61 76 65 29 3b 0a 20 20 72 65 74 75 72  (slave);.  retur
1b3b0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1b3c0 2a 2a 20 54 63 6c 63 6d 64 3a 20 64 62 5f 75 73  ** Tclcmd: db_us
1b3d0 65 5f 6c 65 67 61 63 79 5f 70 72 65 70 61 72 65  e_legacy_prepare
1b3e0 20 44 42 20 42 4f 4f 4c 45 41 4e 0a 2a 2a 0a 2a   DB BOOLEAN.**.*
1b3f0 2a 20 20 20 54 68 65 20 66 69 72 73 74 20 61 72  *   The first ar
1b400 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 63  gument to this c
1b410 6f 6d 6d 61 6e 64 20 6d 75 73 74 20 62 65 20 61  ommand must be a
1b420 20 64 61 74 61 62 61 73 65 20 63 6f 6d 6d 61 6e   database comman
1b430 64 20 63 72 65 61 74 65 64 20 62 79 0a 2a 2a 20  d created by.** 
1b440 20 20 5b 73 71 6c 69 74 65 33 5d 2e 20 49 66 20    [sqlite3]. If 
1b450 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
1b460 65 6e 74 20 69 73 20 74 72 75 65 2c 20 74 68 65  ent is true, the
1b470 6e 20 74 68 65 20 68 61 6e 64 6c 65 20 69 73 20  n the handle is 
1b480 63 6f 6e 66 69 67 75 72 65 64 0a 2a 2a 20 20 20  configured.**   
1b490 74 6f 20 75 73 65 20 74 68 65 20 73 71 6c 69 74  to use the sqlit
1b4a0 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 29 20  e3_prepare_v2() 
1b4b0 66 75 6e 63 74 69 6f 6e 20 74 6f 20 70 72 65 70  function to prep
1b4c0 61 72 65 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  are statements. 
1b4d0 49 66 20 69 74 0a 2a 2a 20 20 20 69 73 20 66 61  If it.**   is fa
1b4e0 6c 73 65 2c 20 73 71 6c 69 74 65 33 5f 70 72 65  lse, sqlite3_pre
1b4f0 70 61 72 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  pare()..*/.stati
1b500 63 20 69 6e 74 20 64 62 5f 75 73 65 5f 6c 65 67  c int db_use_leg
1b510 61 63 79 5f 70 72 65 70 61 72 65 5f 63 6d 64 28  acy_prepare_cmd(
1b520 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 64  .  ClientData cd
1b530 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1b540 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1b550 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1b560 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
1b570 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64   Tcl_CmdInfo cmd
1b580 49 6e 66 6f 3b 0a 20 20 53 71 6c 69 74 65 44 62  Info;.  SqliteDb
1b590 20 2a 70 44 62 3b 0a 20 20 69 6e 74 20 62 50 72   *pDb;.  int bPr
1b5a0 65 70 61 72 65 3b 0a 0a 20 20 69 66 28 20 6f 62  epare;..  if( ob
1b5b0 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
1b5c0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
1b5d0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
1b5e0 44 42 20 42 4f 4f 4c 45 41 4e 22 29 3b 0a 20 20  DB BOOLEAN");.  
1b5f0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1b600 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21  OR;.  }..  if( !
1b610 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e  Tcl_GetCommandIn
1b620 66 6f 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  fo(interp, Tcl_G
1b630 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1b640 29 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29 7b 0a  ), &cmdInfo) ){.
1b650 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1b660 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f  sult(interp, "no
1b670 20 73 75 63 68 20 64 62 3a 20 22 2c 20 54 63 6c   such db: ", Tcl
1b680 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1b690 31 5d 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  1]), (char*)0);.
1b6a0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1b6b0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 44 62 20  RROR;.  }.  pDb 
1b6c0 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 6d 64  = (SqliteDb*)cmd
1b6d0 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61  Info.objClientDa
1b6e0 74 61 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  ta;.  if( Tcl_Ge
1b6f0 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
1b700 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
1b710 20 26 62 50 72 65 70 61 72 65 29 20 29 7b 0a 20   &bPrepare) ){. 
1b720 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1b730 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70 44 62 2d  ROR;.  }..  pDb-
1b740 3e 62 4c 65 67 61 63 79 50 72 65 70 61 72 65 20  >bLegacyPrepare 
1b750 3d 20 62 50 72 65 70 61 72 65 3b 0a 0a 20 20 54  = bPrepare;..  T
1b760 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69  cl_ResetResult(i
1b770 6e 74 65 72 70 29 3b 0a 20 20 72 65 74 75 72 6e  nterp);.  return
1b780 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69   TCL_OK;.}.#endi
1b790 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75  f../*.** Configu
1b7a0 72 65 20 74 68 65 20 69 6e 74 65 72 70 72 65 74  re the interpret
1b7b0 65 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  er passed as the
1b7c0 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
1b7d0 74 6f 20 68 61 76 65 20 61 63 63 65 73 73 0a 2a  to have access.*
1b7e0 2a 20 74 6f 20 74 68 65 20 63 6f 6d 6d 61 6e 64  * to the command
1b7f0 73 20 61 6e 64 20 6c 69 6e 6b 65 64 20 76 61 72  s and linked var
1b800 69 61 62 6c 65 73 20 74 68 61 74 20 6d 61 6b 65  iables that make
1b810 20 75 70 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74   up:.**.**   * t
1b820 68 65 20 5b 73 71 6c 69 74 65 33 5d 20 65 78 74  he [sqlite3] ext
1b830 65 6e 73 69 6f 6e 20 69 74 73 65 6c 66 2c 20 0a  ension itself, .
1b840 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 53 51 4c  **.**   * If SQL
1b850 49 54 45 5f 54 43 4c 4d 44 35 20 6f 72 20 53 51  ITE_TCLMD5 or SQ
1b860 4c 49 54 45 5f 54 45 53 54 20 69 73 20 64 65 66  LITE_TEST is def
1b870 69 6e 65 64 2c 20 74 68 65 20 4d 64 35 20 63 6f  ined, the Md5 co
1b880 6d 6d 61 6e 64 73 2c 20 61 6e 64 0a 2a 2a 0a 2a  mmands, and.**.*
1b890 2a 20 20 20 2a 20 49 66 20 53 51 4c 49 54 45 5f  *   * If SQLITE_
1b8a0 54 45 53 54 20 69 73 20 73 65 74 2c 20 74 68 65  TEST is set, the
1b8b0 20 76 61 72 69 6f 75 73 20 74 65 73 74 20 69 6e   various test in
1b8c0 74 65 72 66 61 63 65 73 20 75 73 65 64 20 62 79  terfaces used by
1b8d0 20 74 68 65 20 54 63 6c 0a 2a 2a 20 20 20 20 20   the Tcl.**     
1b8e0 74 65 73 74 20 73 75 69 74 65 2e 0a 2a 2f 0a 73  test suite..*/.s
1b8f0 74 61 74 69 63 20 76 6f 69 64 20 69 6e 69 74 5f  tatic void init_
1b900 61 6c 6c 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  all(Tcl_Interp *
1b910 69 6e 74 65 72 70 29 7b 0a 20 20 53 71 6c 69 74  interp){.  Sqlit
1b920 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  e3_Init(interp);
1b930 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
1b940 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65  LITE_TEST) || de
1b950 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 43 4c  fined(SQLITE_TCL
1b960 4d 44 35 29 0a 20 20 4d 64 35 5f 49 6e 69 74 28  MD5).  Md5_Init(
1b970 69 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69 66 0a  interp);.#endif.
1b980 0a 20 20 2f 2a 20 49 6e 73 74 61 6c 6c 20 74 68  .  /* Install th
1b990 65 20 5b 72 65 67 69 73 74 65 72 5f 64 62 73 74  e [register_dbst
1b9a0 61 74 5f 76 74 61 62 5d 20 63 6f 6d 6d 61 6e 64  at_vtab] command
1b9b0 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 69   to access the i
1b9c0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 20 20  mplementation.  
1b9d0 2a 2a 20 6f 66 20 76 69 72 74 75 61 6c 20 74 61  ** of virtual ta
1b9e0 62 6c 65 20 64 62 73 74 61 74 20 28 73 6f 75 72  ble dbstat (sour
1b9f0 63 65 20 66 69 6c 65 20 74 65 73 74 5f 73 74 61  ce file test_sta
1ba00 74 2e 63 29 2e 20 54 68 69 73 20 63 6f 6d 6d 61  t.c). This comma
1ba10 6e 64 20 69 73 0a 20 20 2a 2a 20 72 65 71 75 69  nd is.  ** requi
1ba20 72 65 64 20 66 6f 72 20 74 65 73 74 66 69 78 74  red for testfixt
1ba30 75 72 65 20 61 6e 64 20 73 71 6c 69 74 65 33 5f  ure and sqlite3_
1ba40 61 6e 61 6c 79 7a 65 72 2c 20 62 75 74 20 6e 6f  analyzer, but no
1ba50 74 20 62 79 20 74 68 65 20 70 72 6f 64 75 63 74  t by the product
1ba60 69 6f 6e 0a 20 20 2a 2a 20 54 63 6c 20 65 78 74  ion.  ** Tcl ext
1ba70 65 6e 73 69 6f 6e 2e 20 20 2a 2f 0a 23 69 66 20  ension.  */.#if 
1ba80 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
1ba90 45 53 54 29 20 7c 7c 20 54 43 4c 53 48 3d 3d 32  EST) || TCLSH==2
1baa0 0a 20 20 7b 0a 20 20 20 20 65 78 74 65 72 6e 20  .  {.    extern 
1bab0 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 53 74  int SqlitetestSt
1bac0 61 74 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  at_Init(Tcl_Inte
1bad0 72 70 2a 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  rp*);.    Sqlite
1bae0 74 65 73 74 53 74 61 74 5f 49 6e 69 74 28 69 6e  testStat_Init(in
1baf0 74 65 72 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  terp);.  }.#endi
1bb00 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
1bb10 5f 54 45 53 54 0a 20 20 7b 0a 20 20 20 20 65 78  _TEST.  {.    ex
1bb20 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 63  tern int Sqlitec
1bb30 6f 6e 66 69 67 5f 49 6e 69 74 28 54 63 6c 5f 49  onfig_Init(Tcl_I
1bb40 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1bb50 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1bb60 73 74 31 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  st1_Init(Tcl_Int
1bb70 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1bb80 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1bb90 32 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  2_Init(Tcl_Inter
1bba0 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1bbb0 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 33 5f  int Sqlitetest3_
1bbc0 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1bbd0 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1bbe0 74 20 53 71 6c 69 74 65 74 65 73 74 34 5f 49 6e  t Sqlitetest4_In
1bbf0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1bc00 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1bc10 53 71 6c 69 74 65 74 65 73 74 35 5f 49 6e 69 74  Sqlitetest5_Init
1bc20 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1bc30 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1bc40 6c 69 74 65 74 65 73 74 36 5f 49 6e 69 74 28 54  litetest6_Init(T
1bc50 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1bc60 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1bc70 74 65 74 65 73 74 37 5f 49 6e 69 74 28 54 63 6c  tetest7_Init(Tcl
1bc80 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1bc90 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1bca0 74 65 73 74 38 5f 49 6e 69 74 28 54 63 6c 5f 49  test8_Init(Tcl_I
1bcb0 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1bcc0 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1bcd0 73 74 39 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  st9_Init(Tcl_Int
1bce0 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1bcf0 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1bd00 61 73 79 6e 63 5f 49 6e 69 74 28 54 63 6c 5f 49  async_Init(Tcl_I
1bd10 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1bd20 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1bd30 73 74 5f 61 75 74 6f 65 78 74 5f 49 6e 69 74 28  st_autoext_Init(
1bd40 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1bd50 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1bd60 69 74 65 74 65 73 74 5f 64 65 6d 6f 76 66 73 5f  itetest_demovfs_
1bd70 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
1bd80 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1bd90 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f 66 75  nt Sqlitetest_fu
1bda0 6e 63 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  nc_Init(Tcl_Inte
1bdb0 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
1bdc0 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f   int Sqlitetest_
1bdd0 68 65 78 69 6f 5f 49 6e 69 74 28 54 63 6c 5f 49  hexio_Init(Tcl_I
1bde0 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1bdf0 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1be00 73 74 5f 69 6e 69 74 5f 49 6e 69 74 28 54 63 6c  st_init_Init(Tcl
1be10 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1be20 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1be30 74 65 73 74 5f 6d 61 6c 6c 6f 63 5f 49 6e 69 74  test_malloc_Init
1be40 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1be50 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1be60 6c 69 74 65 74 65 73 74 5f 6d 75 74 65 78 5f 49  litetest_mutex_I
1be70 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1be80 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1be90 20 53 71 6c 69 74 65 74 65 73 74 73 63 68 65 6d   Sqlitetestschem
1bea0 61 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  a_Init(Tcl_Inter
1beb0 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1bec0 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 73 73  int Sqlitetestss
1bed0 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  e_Init(Tcl_Inter
1bee0 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1bef0 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 74 63  int Sqlitetesttc
1bf00 6c 76 61 72 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  lvar_Init(Tcl_In
1bf10 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1bf20 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1bf30 74 54 68 72 65 61 64 5f 49 6e 69 74 28 54 63 6c  tThread_Init(Tcl
1bf40 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1bf50 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1bf60 74 65 73 74 4f 6e 65 66 69 6c 65 5f 49 6e 69 74  testOnefile_Init
1bf70 28 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  ();.    extern i
1bf80 6e 74 20 53 71 6c 69 74 65 74 65 73 74 4f 73 69  nt SqlitetestOsi
1bf90 6e 73 74 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  nst_Init(Tcl_Int
1bfa0 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1bfb0 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1bfc0 62 61 63 6b 75 70 5f 49 6e 69 74 28 54 63 6c 5f  backup_Init(Tcl_
1bfd0 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
1bfe0 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1bff0 65 73 74 69 6e 74 61 72 72 61 79 5f 49 6e 69 74  estintarray_Init
1c000 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1c010 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1c020 6c 69 74 65 74 65 73 74 76 66 73 5f 49 6e 69 74  litetestvfs_Init
1c030 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29 3b 0a  (Tcl_Interp *);.
1c040 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1c050 71 6c 69 74 65 74 65 73 74 72 74 72 65 65 5f 49  qlitetestrtree_I
1c060 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1c070 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1c080 20 53 71 6c 69 74 65 71 75 6f 74 61 5f 49 6e 69   Sqlitequota_Ini
1c090 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1c0a0 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1c0b0 71 6c 69 74 65 6d 75 6c 74 69 70 6c 65 78 5f 49  qlitemultiplex_I
1c0c0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1c0d0 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1c0e0 20 53 71 6c 69 74 65 53 75 70 65 72 6c 6f 63 6b   SqliteSuperlock
1c0f0 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1c100 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1c110 6e 74 20 53 71 6c 69 74 65 74 65 73 74 53 79 73  nt SqlitetestSys
1c120 63 61 6c 6c 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  call_Init(Tcl_In
1c130 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1c140 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1c150 74 66 75 7a 7a 65 72 5f 49 6e 69 74 28 54 63 6c  tfuzzer_Init(Tcl
1c160 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1c170 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1c180 74 65 73 74 77 68 6f 6c 65 6e 75 6d 62 65 72 5f  testwholenumber_
1c190 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1c1a0 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  );..#if defined(
1c1b0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54  SQLITE_ENABLE_FT
1c1c0 53 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  S3) || defined(S
1c1d0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53  QLITE_ENABLE_FTS
1c1e0 34 29 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  4).    extern in
1c1f0 74 20 53 71 6c 69 74 65 74 65 73 74 66 74 73 33  t Sqlitetestfts3
1c200 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1c210 20 2a 69 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69   *interp);.#endi
1c220 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
1c230 5f 45 4e 41 42 4c 45 5f 5a 49 50 56 46 53 0a 20  _ENABLE_ZIPVFS. 
1c240 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 5a 69     extern int Zi
1c250 70 76 66 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  pvfs_Init(Tcl_In
1c260 74 65 72 70 2a 29 3b 0a 20 20 20 20 5a 69 70 76  terp*);.    Zipv
1c270 66 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  fs_Init(interp);
1c280 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 53 71 6c  .#endif..    Sql
1c290 69 74 65 63 6f 6e 66 69 67 5f 49 6e 69 74 28 69  iteconfig_Init(i
1c2a0 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1c2b0 74 65 74 65 73 74 31 5f 49 6e 69 74 28 69 6e 74  tetest1_Init(int
1c2c0 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1c2d0 74 65 73 74 32 5f 49 6e 69 74 28 69 6e 74 65 72  test2_Init(inter
1c2e0 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
1c2f0 73 74 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  st3_Init(interp)
1c300 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1c310 34 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  4_Init(interp);.
1c320 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 35 5f      Sqlitetest5_
1c330 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
1c340 20 20 53 71 6c 69 74 65 74 65 73 74 36 5f 49 6e    Sqlitetest6_In
1c350 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1c360 53 71 6c 69 74 65 74 65 73 74 37 5f 49 6e 69 74  Sqlitetest7_Init
1c370 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1c380 6c 69 74 65 74 65 73 74 38 5f 49 6e 69 74 28 69  litetest8_Init(i
1c390 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1c3a0 74 65 74 65 73 74 39 5f 49 6e 69 74 28 69 6e 74  tetest9_Init(int
1c3b0 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1c3c0 74 65 73 74 61 73 79 6e 63 5f 49 6e 69 74 28 69  testasync_Init(i
1c3d0 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1c3e0 74 65 74 65 73 74 5f 61 75 74 6f 65 78 74 5f 49  tetest_autoext_I
1c3f0 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1c400 20 53 71 6c 69 74 65 74 65 73 74 5f 64 65 6d 6f   Sqlitetest_demo
1c410 76 66 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  vfs_Init(interp)
1c420 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1c430 5f 66 75 6e 63 5f 49 6e 69 74 28 69 6e 74 65 72  _func_Init(inter
1c440 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
1c450 73 74 5f 68 65 78 69 6f 5f 49 6e 69 74 28 69 6e  st_hexio_Init(in
1c460 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
1c470 65 74 65 73 74 5f 69 6e 69 74 5f 49 6e 69 74 28  etest_init_Init(
1c480 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
1c490 69 74 65 74 65 73 74 5f 6d 61 6c 6c 6f 63 5f 49  itetest_malloc_I
1c4a0 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1c4b0 20 53 71 6c 69 74 65 74 65 73 74 5f 6d 75 74 65   Sqlitetest_mute
1c4c0 78 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  x_Init(interp);.
1c4d0 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 73 63      Sqlitetestsc
1c4e0 68 65 6d 61 5f 49 6e 69 74 28 69 6e 74 65 72 70  hema_Init(interp
1c4f0 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1c500 74 74 63 6c 76 61 72 5f 49 6e 69 74 28 69 6e 74  ttclvar_Init(int
1c510 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1c520 74 65 73 74 54 68 72 65 61 64 5f 49 6e 69 74 28  testThread_Init(
1c530 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
1c540 69 74 65 74 65 73 74 4f 6e 65 66 69 6c 65 5f 49  itetestOnefile_I
1c550 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1c560 20 53 71 6c 69 74 65 74 65 73 74 4f 73 69 6e 73   SqlitetestOsins
1c570 74 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  t_Init(interp);.
1c580 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 62 61      Sqlitetestba
1c590 63 6b 75 70 5f 49 6e 69 74 28 69 6e 74 65 72 70  ckup_Init(interp
1c5a0 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1c5b0 74 69 6e 74 61 72 72 61 79 5f 49 6e 69 74 28 69  tintarray_Init(i
1c5c0 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1c5d0 74 65 74 65 73 74 76 66 73 5f 49 6e 69 74 28 69  tetestvfs_Init(i
1c5e0 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1c5f0 74 65 74 65 73 74 72 74 72 65 65 5f 49 6e 69 74  tetestrtree_Init
1c600 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1c610 6c 69 74 65 71 75 6f 74 61 5f 49 6e 69 74 28 69  litequota_Init(i
1c620 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1c630 74 65 6d 75 6c 74 69 70 6c 65 78 5f 49 6e 69 74  temultiplex_Init
1c640 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1c650 6c 69 74 65 53 75 70 65 72 6c 6f 63 6b 5f 49 6e  liteSuperlock_In
1c660 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1c670 53 71 6c 69 74 65 74 65 73 74 53 79 73 63 61 6c  SqlitetestSyscal
1c680 6c 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  l_Init(interp);.
1c690 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 66 75      Sqlitetestfu
1c6a0 7a 7a 65 72 5f 49 6e 69 74 28 69 6e 74 65 72 70  zzer_Init(interp
1c6b0 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1c6c0 74 77 68 6f 6c 65 6e 75 6d 62 65 72 5f 49 6e 69  twholenumber_Ini
1c6d0 74 28 69 6e 74 65 72 70 29 3b 0a 0a 23 69 66 20  t(interp);..#if 
1c6e0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
1c6f0 4e 41 42 4c 45 5f 46 54 53 33 29 20 7c 7c 20 64  NABLE_FTS3) || d
1c700 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
1c710 41 42 4c 45 5f 46 54 53 34 29 0a 20 20 20 20 53  ABLE_FTS4).    S
1c720 71 6c 69 74 65 74 65 73 74 66 74 73 33 5f 49 6e  qlitetestfts3_In
1c730 69 74 28 69 6e 74 65 72 70 29 3b 0a 23 65 6e 64  it(interp);.#end
1c740 69 66 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  if..    Tcl_Crea
1c750 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 0a 20 20  teObjCommand(.  
1c760 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20 22 6c        interp, "l
1c770 6f 61 64 5f 74 65 73 74 66 69 78 74 75 72 65 5f  oad_testfixture_
1c780 65 78 74 65 6e 73 69 6f 6e 73 22 2c 20 69 6e 69  extensions", ini
1c790 74 5f 61 6c 6c 5f 63 6d 64 2c 20 30 2c 20 30 0a  t_all_cmd, 0, 0.
1c7a0 20 20 20 20 29 3b 0a 20 20 20 20 54 63 6c 5f 43      );.    Tcl_C
1c7b0 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
1c7c0 0a 20 20 20 20 20 20 20 20 69 6e 74 65 72 70 2c  .        interp,
1c7d0 20 22 64 62 5f 75 73 65 5f 6c 65 67 61 63 79 5f   "db_use_legacy_
1c7e0 70 72 65 70 61 72 65 22 2c 20 64 62 5f 75 73 65  prepare", db_use
1c7f0 5f 6c 65 67 61 63 79 5f 70 72 65 70 61 72 65 5f  _legacy_prepare_
1c800 63 6d 64 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b  cmd, 0, 0.    );
1c810 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1c820 53 53 45 0a 20 20 20 20 53 71 6c 69 74 65 74 65  SSE.    Sqlitete
1c830 73 74 73 73 65 5f 49 6e 69 74 28 69 6e 74 65 72  stsse_Init(inter
1c840 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23  p);.#endif.  }.#
1c850 65 6e 64 69 66 0a 7d 0a 0a 23 64 65 66 69 6e 65  endif.}..#define
1c860 20 54 43 4c 53 48 5f 4d 41 49 4e 20 6d 61 69 6e   TCLSH_MAIN main
1c870 20 20 20 2f 2a 20 4e 65 65 64 65 64 20 74 6f 20     /* Needed to 
1c880 66 61 6b 65 20 6f 75 74 20 6d 6b 74 63 6c 61 70  fake out mktclap
1c890 70 20 2a 2f 0a 69 6e 74 20 54 43 4c 53 48 5f 4d  p */.int TCLSH_M
1c8a0 41 49 4e 28 69 6e 74 20 61 72 67 63 2c 20 63 68  AIN(int argc, ch
1c8b0 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 54 63  ar **argv){.  Tc
1c8c0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1c8d0 3b 0a 20 20 0a 20 20 2f 2a 20 43 61 6c 6c 20 73  ;.  .  /* Call s
1c8e0 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28  qlite3_shutdown(
1c8f0 29 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 64 6f  ) once before do
1c900 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73  ing anything els
1c910 65 2e 20 54 68 69 73 20 69 73 20 74 6f 0a 20 20  e. This is to.  
1c920 2a 2a 20 74 65 73 74 20 74 68 61 74 20 73 71 6c  ** test that sql
1c930 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 29 20  ite3_shutdown() 
1c940 63 61 6e 20 62 65 20 73 61 66 65 6c 79 20 63 61  can be safely ca
1c950 6c 6c 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  lled by a proces
1c960 73 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 73 71  s before.  ** sq
1c970 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
1c980 28 29 20 69 73 2e 20 2a 2f 0a 20 20 73 71 6c 69  () is. */.  sqli
1c990 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 29 3b 0a  te3_shutdown();.
1c9a0 0a 20 20 54 63 6c 5f 46 69 6e 64 45 78 65 63 75  .  Tcl_FindExecu
1c9b0 74 61 62 6c 65 28 61 72 67 76 5b 30 5d 29 3b 0a  table(argv[0]);.
1c9c0 20 20 69 6e 74 65 72 70 20 3d 20 54 63 6c 5f 43    interp = Tcl_C
1c9d0 72 65 61 74 65 49 6e 74 65 72 70 28 29 3b 0a 0a  reateInterp();..
1c9e0 23 69 66 20 54 43 4c 53 48 3d 3d 32 0a 20 20 73  #if TCLSH==2.  s
1c9f0 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51  qlite3_config(SQ
1ca00 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 49 4e 47  LITE_CONFIG_SING
1ca10 4c 45 54 48 52 45 41 44 29 3b 0a 23 65 6e 64 69  LETHREAD);.#endi
1ca20 66 0a 0a 20 20 69 6e 69 74 5f 61 6c 6c 28 69 6e  f..  init_all(in
1ca30 74 65 72 70 29 3b 0a 20 20 69 66 28 20 61 72 67  terp);.  if( arg
1ca40 63 3e 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74 20  c>=2 ){.    int 
1ca50 69 3b 0a 20 20 20 20 63 68 61 72 20 7a 41 72 67  i;.    char zArg
1ca60 63 5b 33 32 5d 3b 0a 20 20 20 20 73 71 6c 69 74  c[32];.    sqlit
1ca70 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
1ca80 6f 66 28 7a 41 72 67 63 29 2c 20 7a 41 72 67 63  of(zArgc), zArgc
1ca90 2c 20 22 25 64 22 2c 20 61 72 67 63 2d 28 33 2d  , "%d", argc-(3-
1caa0 54 43 4c 53 48 29 29 3b 0a 20 20 20 20 54 63 6c  TCLSH));.    Tcl
1cab0 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 22  _SetVar(interp,"
1cac0 61 72 67 63 22 2c 20 7a 41 72 67 63 2c 20 54 43  argc", zArgc, TC
1cad0 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a  L_GLOBAL_ONLY);.
1cae0 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69      Tcl_SetVar(i
1caf0 6e 74 65 72 70 2c 22 61 72 67 76 30 22 2c 61 72  nterp,"argv0",ar
1cb00 67 76 5b 31 5d 2c 54 43 4c 5f 47 4c 4f 42 41 4c  gv[1],TCL_GLOBAL
1cb10 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 54 63 6c 5f  _ONLY);.    Tcl_
1cb20 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 22 61  SetVar(interp,"a
1cb30 72 67 76 22 2c 20 22 22 2c 20 54 43 4c 5f 47 4c  rgv", "", TCL_GL
1cb40 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20  OBAL_ONLY);.    
1cb50 66 6f 72 28 69 3d 33 2d 54 43 4c 53 48 3b 20 69  for(i=3-TCLSH; i
1cb60 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <argc; i++){.   
1cb70 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e     Tcl_SetVar(in
1cb80 74 65 72 70 2c 20 22 61 72 67 76 22 2c 20 61 72  terp, "argv", ar
1cb90 67 76 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20  gv[i],.         
1cba0 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59   TCL_GLOBAL_ONLY
1cbb0 20 7c 20 54 43 4c 5f 4c 49 53 54 5f 45 4c 45 4d   | TCL_LIST_ELEM
1cbc0 45 4e 54 20 7c 20 54 43 4c 5f 41 50 50 45 4e 44  ENT | TCL_APPEND
1cbd0 5f 56 41 4c 55 45 29 3b 0a 20 20 20 20 7d 0a 20  _VALUE);.    }. 
1cbe0 20 20 20 69 66 28 20 54 43 4c 53 48 3d 3d 31 20     if( TCLSH==1 
1cbf0 26 26 20 54 63 6c 5f 45 76 61 6c 46 69 6c 65 28  && Tcl_EvalFile(
1cc00 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 29  interp, argv[1])
1cc10 21 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20  !=TCL_OK ){.    
1cc20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
1cc30 6e 66 6f 20 3d 20 54 63 6c 5f 47 65 74 56 61 72  nfo = Tcl_GetVar
1cc40 28 69 6e 74 65 72 70 2c 20 22 65 72 72 6f 72 49  (interp, "errorI
1cc50 6e 66 6f 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c  nfo", TCL_GLOBAL
1cc60 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 20 20 69 66  _ONLY);.      if
1cc70 28 20 7a 49 6e 66 6f 3d 3d 30 20 29 20 7a 49 6e  ( zInfo==0 ) zIn
1cc80 66 6f 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  fo = Tcl_GetStri
1cc90 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  ngResult(interp)
1cca0 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  ;.      fprintf(
1ccb0 73 74 64 65 72 72 2c 22 25 73 3a 20 25 73 5c 6e  stderr,"%s: %s\n
1ccc0 22 2c 20 2a 61 72 67 76 2c 20 7a 49 6e 66 6f 29  ", *argv, zInfo)
1ccd0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
1cce0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
1ccf0 28 20 54 43 4c 53 48 3d 3d 32 20 7c 7c 20 61 72  ( TCLSH==2 || ar
1cd00 67 63 3c 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c  gc<=1 ){.    Tcl
1cd10 5f 47 6c 6f 62 61 6c 45 76 61 6c 28 69 6e 74 65  _GlobalEval(inte
1cd20 72 70 2c 20 74 63 6c 73 68 5f 6d 61 69 6e 5f 6c  rp, tclsh_main_l
1cd30 6f 6f 70 28 29 29 3b 0a 20 20 7d 0a 20 20 72 65  oop());.  }.  re
1cd40 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
1cd50 20 2f 2a 20 54 43 4c 53 48 20 2a 2f 0a            /* TCLSH */.