/ Hex Artifact Content
Login

Artifact a870d43e3c19663fce878aa4c7cac9c624aab564:


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 20 55 73 65 64  type.h>../* Used
0580: 20 74 6f 20 67 65 74 20 74 68 65 20 63 75 72 72   to get the curr
0590: 65 6e 74 20 70 72 6f 63 65 73 73 20 49 44 20 2a  ent process ID *
05a0: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f  /.#if !defined(_
05b0: 57 49 4e 33 32 29 0a 23 20 69 6e 63 6c 75 64 65  WIN32).# include
05c0: 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 20 64 65   <unistd.h>.# de
05d0: 66 69 6e 65 20 47 45 54 50 49 44 20 67 65 74 70  fine GETPID getp
05e0: 69 64 0a 23 65 6c 69 66 20 21 64 65 66 69 6e 65  id.#elif !define
05f0: 64 28 5f 57 49 4e 33 32 5f 57 43 45 29 0a 23 20  d(_WIN32_WCE).# 
0600: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 41 4d  ifndef SQLITE_AM
0610: 41 4c 47 41 4d 41 54 49 4f 4e 0a 23 20 20 64 65  ALGAMATION.#  de
0620: 66 69 6e 65 20 57 49 4e 33 32 5f 4c 45 41 4e 5f  fine WIN32_LEAN_
0630: 41 4e 44 5f 4d 45 41 4e 0a 23 20 20 69 6e 63 6c  AND_MEAN.#  incl
0640: 75 64 65 20 3c 77 69 6e 64 6f 77 73 2e 68 3e 0a  ude <windows.h>.
0650: 23 20 65 6e 64 69 66 0a 23 20 64 65 66 69 6e 65  # endif.# define
0660: 20 47 45 54 50 49 44 20 28 69 6e 74 29 47 65 74   GETPID (int)Get
0670: 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
0680: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 57  .#endif../*. * W
0690: 69 6e 64 6f 77 73 20 6e 65 65 64 73 20 74 6f 20  indows needs to 
06a0: 6b 6e 6f 77 20 77 68 69 63 68 20 73 79 6d 62 6f  know which symbo
06b0: 6c 73 20 74 6f 20 65 78 70 6f 72 74 2e 20 20 55  ls to export.  U
06c0: 6e 69 78 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 2a  nix does not.. *
06d0: 20 42 55 49 4c 44 5f 73 71 6c 69 74 65 20 73 68   BUILD_sqlite sh
06e0: 6f 75 6c 64 20 62 65 20 75 6e 64 65 66 69 6e 65  ould be undefine
06f0: 64 20 66 6f 72 20 55 6e 69 78 2e 0a 20 2a 2f 0a  d for Unix.. */.
0700: 23 69 66 64 65 66 20 42 55 49 4c 44 5f 73 71 6c  #ifdef BUILD_sql
0710: 69 74 65 0a 23 75 6e 64 65 66 20 54 43 4c 5f 53  ite.#undef TCL_S
0720: 54 4f 52 41 47 45 5f 43 4c 41 53 53 0a 23 64 65  TORAGE_CLASS.#de
0730: 66 69 6e 65 20 54 43 4c 5f 53 54 4f 52 41 47 45  fine TCL_STORAGE
0740: 5f 43 4c 41 53 53 20 44 4c 4c 45 58 50 4f 52 54  _CLASS DLLEXPORT
0750: 0a 23 65 6e 64 69 66 20 2f 2a 20 42 55 49 4c 44  .#endif /* BUILD
0760: 5f 73 71 6c 69 74 65 20 2a 2f 0a 0a 23 64 65 66  _sqlite */..#def
0770: 69 6e 65 20 4e 55 4d 5f 50 52 45 50 41 52 45 44  ine NUM_PREPARED
0780: 5f 53 54 4d 54 53 20 31 30 0a 23 64 65 66 69 6e  _STMTS 10.#defin
0790: 65 20 4d 41 58 5f 50 52 45 50 41 52 45 44 5f 53  e MAX_PREPARED_S
07a0: 54 4d 54 53 20 31 30 30 0a 0a 2f 2a 20 46 6f 72  TMTS 100../* For
07b0: 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
07c0: 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75   */.typedef stru
07d0: 63 74 20 53 71 6c 69 74 65 44 62 20 53 71 6c 69  ct SqliteDb Sqli
07e0: 74 65 44 62 3b 0a 0a 2f 2a 0a 2a 2a 20 4e 65 77  teDb;../*.** New
07f0: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20 63   SQL functions c
0800: 61 6e 20 62 65 20 63 72 65 61 74 65 64 20 61 73  an be created as
0810: 20 54 43 4c 20 73 63 72 69 70 74 73 2e 20 20 45   TCL scripts.  E
0820: 61 63 68 20 73 75 63 68 20 66 75 6e 63 74 69 6f  ach such functio
0830: 6e 0a 2a 2a 20 69 73 20 64 65 73 63 72 69 62 65  n.** is describe
0840: 64 20 62 79 20 61 6e 20 69 6e 73 74 61 6e 63 65  d by an instance
0850: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
0860: 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  g structure..*/.
0870: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53  typedef struct S
0880: 71 6c 46 75 6e 63 20 53 71 6c 46 75 6e 63 3b 0a  qlFunc SqlFunc;.
0890: 73 74 72 75 63 74 20 53 71 6c 46 75 6e 63 20 7b  struct SqlFunc {
08a0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
08b0: 6e 74 65 72 70 3b 20 20 20 2f 2a 20 54 68 65 20  nterp;   /* The 
08c0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 20 74 6f  TCL interpret to
08d0: 20 65 78 65 63 75 74 65 20 74 68 65 20 66 75 6e   execute the fun
08e0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ction */.  Tcl_O
08f0: 62 6a 20 2a 70 53 63 72 69 70 74 3b 20 20 20 20  bj *pScript;    
0900: 20 2f 2a 20 54 68 65 20 54 63 6c 5f 4f 62 6a 20   /* The Tcl_Obj 
0910: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
0920: 66 20 74 68 65 20 73 63 72 69 70 74 20 2a 2f 0a  f the script */.
0930: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 3b    SqliteDb *pDb;
0940: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
0950: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  ase connection t
0960: 68 61 74 20 6f 77 6e 73 20 74 68 69 73 20 66 75  hat owns this fu
0970: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  nction */.  int 
0980: 75 73 65 45 76 61 6c 4f 62 6a 76 3b 20 20 20 20  useEvalObjv;    
0990: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 74 20    /* True if it 
09a0: 69 73 20 73 61 66 65 20 74 6f 20 75 73 65 20 54  is safe to use T
09b0: 63 6c 5f 45 76 61 6c 4f 62 6a 76 20 2a 2f 0a 20  cl_EvalObjv */. 
09c0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
09d0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
09e0: 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
09f0: 2a 2f 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70 4e  */.  SqlFunc *pN
0a00: 65 78 74 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65  ext;       /* Ne
0a10: 78 74 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 20 74  xt function on t
0a20: 68 65 20 6c 69 73 74 20 6f 66 20 74 68 65 6d 20  he list of them 
0a30: 61 6c 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  all */.};../*.**
0a40: 20 4e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   New collation s
0a50: 65 71 75 65 6e 63 65 73 20 66 75 6e 63 74 69 6f  equences functio
0a60: 6e 20 63 61 6e 20 62 65 20 63 72 65 61 74 65 64  n can be created
0a70: 20 61 73 20 54 43 4c 20 73 63 72 69 70 74 73 2e   as TCL scripts.
0a80: 20 20 45 61 63 68 20 73 75 63 68 0a 2a 2a 20 66    Each such.** f
0a90: 75 6e 63 74 69 6f 6e 20 69 73 20 64 65 73 63 72  unction is descr
0aa0: 69 62 65 64 20 62 79 20 61 6e 20 69 6e 73 74 61  ibed by an insta
0ab0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
0ac0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
0ad0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
0ae0: 74 20 53 71 6c 43 6f 6c 6c 61 74 65 20 53 71 6c  t SqlCollate Sql
0af0: 43 6f 6c 6c 61 74 65 3b 0a 73 74 72 75 63 74 20  Collate;.struct 
0b00: 53 71 6c 43 6f 6c 6c 61 74 65 20 7b 0a 20 20 54  SqlCollate {.  T
0b10: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
0b20: 70 3b 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  p;   /* The TCL 
0b30: 69 6e 74 65 72 70 72 65 74 20 74 6f 20 65 78 65  interpret to exe
0b40: 63 75 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f  cute the functio
0b50: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 63  n */.  char *zSc
0b60: 72 69 70 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  ript;        /* 
0b70: 54 68 65 20 73 63 72 69 70 74 20 74 6f 20 62 65  The script to be
0b80: 20 72 75 6e 20 2a 2f 0a 20 20 53 71 6c 43 6f 6c   run */.  SqlCol
0b90: 6c 61 74 65 20 2a 70 4e 65 78 74 3b 20 20 20 20  late *pNext;    
0ba0: 2f 2a 20 4e 65 78 74 20 66 75 6e 63 74 69 6f 6e  /* Next function
0bb0: 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20   on the list of 
0bc0: 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 7d 3b 0a 0a  them all */.};..
0bd0: 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 64 20 73  /*.** Prepared s
0be0: 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 63 61  tatements are ca
0bf0: 63 68 65 64 20 66 6f 72 20 66 61 73 74 65 72 20  ched for faster 
0c00: 65 78 65 63 75 74 69 6f 6e 2e 20 20 45 61 63 68  execution.  Each
0c10: 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74 61   prepared.** sta
0c20: 74 65 6d 65 6e 74 20 69 73 20 64 65 73 63 72 69  tement is descri
0c30: 62 65 64 20 62 79 20 61 6e 20 69 6e 73 74 61 6e  bed by an instan
0c40: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
0c50: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ing structure..*
0c60: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0c70: 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74   SqlPreparedStmt
0c80: 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74   SqlPreparedStmt
0c90: 3b 0a 73 74 72 75 63 74 20 53 71 6c 50 72 65 70  ;.struct SqlPrep
0ca0: 61 72 65 64 53 74 6d 74 20 7b 0a 20 20 53 71 6c  aredStmt {.  Sql
0cb0: 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70 4e  PreparedStmt *pN
0cc0: 65 78 74 3b 20 20 2f 2a 20 4e 65 78 74 20 69 6e  ext;  /* Next in
0cd0: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 2a 2f 0a   linked list */.
0ce0: 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d    SqlPreparedStm
0cf0: 74 20 2a 70 50 72 65 76 3b 20 20 2f 2a 20 50 72  t *pPrev;  /* Pr
0d00: 65 76 69 6f 75 73 20 6f 6e 20 74 68 65 20 6c 69  evious on the li
0d10: 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  st */.  sqlite3_
0d20: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20  stmt *pStmt;    
0d30: 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65 64   /* The prepared
0d40: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
0d50: 69 6e 74 20 6e 53 71 6c 3b 20 20 20 20 20 20 20  int nSql;       
0d60: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 68 61 72           /* char
0d70: 73 20 69 6e 20 7a 53 71 6c 5b 5d 20 2a 2f 0a 20  s in zSql[] */. 
0d80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
0d90: 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78  l;        /* Tex
0da0: 74 20 6f 66 20 74 68 65 20 53 51 4c 20 73 74 61  t of the SQL sta
0db0: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
0dc0: 6e 50 61 72 6d 3b 20 20 20 20 20 20 20 20 20 20  nParm;          
0dd0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
0de0: 61 70 50 61 72 6d 20 61 72 72 61 79 20 2a 2f 0a  apParm array */.
0df0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 50 61    Tcl_Obj **apPa
0e00: 72 6d 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 72  rm;        /* Ar
0e10: 72 61 79 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ray of reference
0e20: 64 20 6f 62 6a 65 63 74 20 70 6f 69 6e 74 65 72  d object pointer
0e30: 73 20 2a 2f 0a 7d 3b 0a 0a 74 79 70 65 64 65 66  s */.};..typedef
0e40: 20 73 74 72 75 63 74 20 49 6e 63 72 62 6c 6f 62   struct Incrblob
0e50: 43 68 61 6e 6e 65 6c 20 49 6e 63 72 62 6c 6f 62  Channel Incrblob
0e60: 43 68 61 6e 6e 65 6c 3b 0a 0a 2f 2a 0a 2a 2a 20  Channel;../*.** 
0e70: 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73  There is one ins
0e80: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74  tance of this st
0e90: 72 75 63 74 75 72 65 20 66 6f 72 20 65 61 63 68  ructure for each
0ea0: 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
0eb0: 0a 2a 2a 20 74 68 61 74 20 68 61 73 20 62 65 65  .** that has bee
0ec0: 6e 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20  n opened by the 
0ed0: 53 51 4c 69 74 65 20 54 43 4c 20 69 6e 74 65 72  SQLite TCL inter
0ee0: 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  face..**.** If t
0ef0: 68 69 73 20 6d 6f 64 75 6c 65 20 69 73 20 62 75  his module is bu
0f00: 69 6c 74 20 77 69 74 68 20 53 51 4c 49 54 45 5f  ilt with SQLITE_
0f10: 54 45 53 54 20 64 65 66 69 6e 65 64 20 28 74 6f  TEST defined (to
0f20: 20 63 72 65 61 74 65 20 74 68 65 20 53 51 4c 69   create the SQLi
0f30: 74 65 0a 2a 2a 20 74 65 73 74 66 69 78 74 75 72  te.** testfixtur
0f40: 65 20 65 78 65 63 75 74 61 62 6c 65 29 2c 20 74  e executable), t
0f50: 68 65 6e 20 69 74 20 6d 61 79 20 62 65 20 63 6f  hen it may be co
0f60: 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73 65 20  nfigured to use 
0f70: 65 69 74 68 65 72 0a 2a 2a 20 73 71 6c 69 74 65  either.** sqlite
0f80: 33 5f 70 72 65 70 61 72 65 5f 76 32 28 29 20 6f  3_prepare_v2() o
0f90: 72 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  r sqlite3_prepar
0fa0: 65 28 29 20 74 6f 20 70 72 65 70 61 72 65 20 53  e() to prepare S
0fb0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  QL statements..*
0fc0: 2a 20 49 66 20 53 71 6c 69 74 65 44 62 2e 62 4c  * If SqliteDb.bL
0fd0: 65 67 61 63 79 50 72 65 70 61 72 65 20 69 73 20  egacyPrepare is 
0fe0: 74 72 75 65 2c 20 73 71 6c 69 74 65 33 5f 70 72  true, sqlite3_pr
0ff0: 65 70 61 72 65 28 29 20 69 73 20 75 73 65 64 2e  epare() is used.
1000: 0a 2a 2f 0a 73 74 72 75 63 74 20 53 71 6c 69 74  .*/.struct Sqlit
1010: 65 44 62 20 7b 0a 20 20 73 71 6c 69 74 65 33 20  eDb {.  sqlite3 
1020: 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
1030: 20 20 20 2f 2a 20 54 68 65 20 22 72 65 61 6c 22     /* The "real"
1040: 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74   database struct
1050: 75 72 65 2e 20 4d 55 53 54 20 42 45 20 46 49 52  ure. MUST BE FIR
1060: 53 54 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  ST */.  Tcl_Inte
1070: 72 70 20 2a 69 6e 74 65 72 70 3b 20 20 20 20 20  rp *interp;     
1080: 20 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 72 70     /* The interp
1090: 72 65 74 65 72 20 75 73 65 64 20 66 6f 72 20 74  reter used for t
10a0: 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  his database */.
10b0: 20 20 63 68 61 72 20 2a 7a 42 75 73 79 3b 20 20    char *zBusy;  
10c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10d0: 54 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  The busy callbac
10e0: 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63  k routine */.  c
10f0: 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 20 20 20  har *zCommit;   
1100: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1110: 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 63 61 6c   commit hook cal
1120: 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f  lback routine */
1130: 0a 20 20 63 68 61 72 20 2a 7a 54 72 61 63 65 3b  .  char *zTrace;
1140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1150: 20 54 68 65 20 74 72 61 63 65 20 63 61 6c 6c 62   The trace callb
1160: 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  ack routine */. 
1170: 20 63 68 61 72 20 2a 7a 50 72 6f 66 69 6c 65 3b   char *zProfile;
1180: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1190: 68 65 20 70 72 6f 66 69 6c 65 20 63 61 6c 6c 62  he profile callb
11a0: 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  ack routine */. 
11b0: 20 63 68 61 72 20 2a 7a 50 72 6f 67 72 65 73 73   char *zProgress
11c0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
11d0: 68 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c  he progress call
11e0: 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a  back routine */.
11f0: 20 20 63 68 61 72 20 2a 7a 41 75 74 68 3b 20 20    char *zAuth;  
1200: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1210: 54 68 65 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  The authorizatio
1220: 6e 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69  n callback routi
1230: 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 61  ne */.  int disa
1240: 62 6c 65 41 75 74 68 3b 20 20 20 20 20 20 20 20  bleAuth;        
1250: 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 74 68     /* Disable th
1260: 65 20 61 75 74 68 6f 72 69 7a 65 72 20 69 66 20  e authorizer if 
1270: 69 74 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 63  it exists */.  c
1280: 68 61 72 20 2a 7a 4e 75 6c 6c 3b 20 20 20 20 20  har *zNull;     
1290: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
12a0: 74 20 74 6f 20 73 75 62 73 74 69 74 75 74 65 20  t to substitute 
12b0: 66 6f 72 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 20  for an SQL NULL 
12c0: 76 61 6c 75 65 20 2a 2f 0a 20 20 53 71 6c 46 75  value */.  SqlFu
12d0: 6e 63 20 2a 70 46 75 6e 63 3b 20 20 20 20 20 20  nc *pFunc;      
12e0: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
12f0: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20 2a   SQL functions *
1300: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 55 70  /.  Tcl_Obj *pUp
1310: 64 61 74 65 48 6f 6f 6b 3b 20 20 20 20 20 20 2f  dateHook;      /
1320: 2a 20 55 70 64 61 74 65 20 68 6f 6f 6b 20 73 63  * Update hook sc
1330: 72 69 70 74 20 28 69 66 20 61 6e 79 29 20 2a 2f  ript (if any) */
1340: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 50 72 65  .  Tcl_Obj *pPre
1350: 55 70 64 61 74 65 48 6f 6f 6b 3b 20 20 20 2f 2a  UpdateHook;   /*
1360: 20 50 72 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b   Pre-update hook
1370: 20 73 63 72 69 70 74 20 28 69 66 20 61 6e 79 29   script (if any)
1380: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70   */.  Tcl_Obj *p
1390: 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3b 20 20 20  RollbackHook;   
13a0: 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 68 6f 6f   /* Rollback hoo
13b0: 6b 20 73 63 72 69 70 74 20 28 69 66 20 61 6e 79  k script (if any
13c0: 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  ) */.  Tcl_Obj *
13d0: 70 57 61 6c 48 6f 6f 6b 3b 20 20 20 20 20 20 20  pWalHook;       
13e0: 20 20 2f 2a 20 57 41 4c 20 68 6f 6f 6b 20 73 63    /* WAL hook sc
13f0: 72 69 70 74 20 28 69 66 20 61 6e 79 29 20 2a 2f  ript (if any) */
1400: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 55 6e 6c  .  Tcl_Obj *pUnl
1410: 6f 63 6b 4e 6f 74 69 66 79 3b 20 20 20 20 2f 2a  ockNotify;    /*
1420: 20 55 6e 6c 6f 63 6b 20 6e 6f 74 69 66 79 20 73   Unlock notify s
1430: 63 72 69 70 74 20 28 69 66 20 61 6e 79 29 20 2a  cript (if any) *
1440: 2f 0a 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a  /.  SqlCollate *
1450: 70 43 6f 6c 6c 61 74 65 3b 20 20 20 20 20 20 2f  pCollate;      /
1460: 2a 20 4c 69 73 74 20 6f 66 20 53 51 4c 20 63 6f  * List of SQL co
1470: 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  llation function
1480: 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  s */.  int rc;  
1490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
14b0: 20 6f 66 20 6d 6f 73 74 20 72 65 63 65 6e 74 20   of most recent 
14c0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 2a  sqlite3_exec() *
14d0: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f  /.  Tcl_Obj *pCo
14e0: 6c 6c 61 74 65 4e 65 65 64 65 64 3b 20 20 20 2f  llateNeeded;   /
14f0: 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65 64  * Collation need
1500: 65 64 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 53  ed script */.  S
1510: 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a  qlPreparedStmt *
1520: 73 74 6d 74 4c 69 73 74 3b 20 2f 2a 20 4c 69 73  stmtList; /* Lis
1530: 74 20 6f 66 20 70 72 65 70 61 72 65 64 20 73 74  t of prepared st
1540: 61 74 65 6d 65 6e 74 73 2a 2f 0a 20 20 53 71 6c  atements*/.  Sql
1550: 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 73 74  PreparedStmt *st
1560: 6d 74 4c 61 73 74 3b 20 2f 2a 20 4c 61 73 74 20  mtLast; /* Last 
1570: 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65  statement in the
1580: 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6d   list */.  int m
1590: 61 78 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20  axStmt;         
15a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78        /* The nex
15b0: 74 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  t maximum number
15c0: 20 6f 66 20 73 74 6d 74 4c 69 73 74 20 2a 2f 0a   of stmtList */.
15d0: 20 20 69 6e 74 20 6e 53 74 6d 74 3b 20 20 20 20    int nStmt;    
15e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15f0: 4e 75 6d 62 65 72 20 6f 66 20 73 74 61 74 65 6d  Number of statem
1600: 65 6e 74 73 20 69 6e 20 73 74 6d 74 4c 69 73 74  ents in stmtList
1610: 20 2a 2f 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68   */.  IncrblobCh
1620: 61 6e 6e 65 6c 20 2a 70 49 6e 63 72 62 6c 6f 62  annel *pIncrblob
1630: 3b 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20  ;/* Linked list 
1640: 6f 66 20 6f 70 65 6e 20 69 6e 63 72 62 6c 6f 62  of open incrblob
1650: 20 63 68 61 6e 6e 65 6c 73 20 2a 2f 0a 20 20 69   channels */.  i
1660: 6e 74 20 6e 53 74 65 70 2c 20 6e 53 6f 72 74 2c  nt nStep, nSort,
1670: 20 6e 49 6e 64 65 78 3b 20 20 2f 2a 20 53 74 61   nIndex;  /* Sta
1680: 74 69 73 74 69 63 73 20 66 6f 72 20 6d 6f 73 74  tistics for most
1690: 20 72 65 63 65 6e 74 20 6f 70 65 72 61 74 69 6f   recent operatio
16a0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 72 61 6e  n */.  int nTran
16b0: 73 61 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20  saction;        
16c0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e    /* Number of n
16d0: 65 73 74 65 64 20 5b 74 72 61 6e 73 61 63 74 69  ested [transacti
16e0: 6f 6e 5d 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23  on] methods */.#
16f0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
1700: 54 0a 20 20 69 6e 74 20 62 4c 65 67 61 63 79 50  T.  int bLegacyP
1710: 72 65 70 61 72 65 3b 20 20 20 20 20 20 20 20 2f  repare;        /
1720: 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 73 71  * True to use sq
1730: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29 20  lite3_prepare() 
1740: 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 73 74  */.#endif.};..st
1750: 72 75 63 74 20 49 6e 63 72 62 6c 6f 62 43 68 61  ruct IncrblobCha
1760: 6e 6e 65 6c 20 7b 0a 20 20 73 71 6c 69 74 65 33  nnel {.  sqlite3
1770: 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 3b 20 20 20  _blob *pBlob;   
1780: 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 20 62 6c     /* sqlite3 bl
1790: 6f 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 53  ob handle */.  S
17a0: 71 6c 69 74 65 44 62 20 2a 70 44 62 3b 20 20 20  qliteDb *pDb;   
17b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f           /* Asso
17c0: 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20  ciated database 
17d0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
17e0: 69 6e 74 20 69 53 65 65 6b 3b 20 20 20 20 20 20  int iSeek;      
17f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
1800: 72 65 6e 74 20 73 65 65 6b 20 6f 66 66 73 65 74  rent seek offset
1810: 20 2a 2f 0a 20 20 54 63 6c 5f 43 68 61 6e 6e 65   */.  Tcl_Channe
1820: 6c 20 63 68 61 6e 6e 65 6c 3b 20 20 20 20 20 20  l channel;      
1830: 2f 2a 20 43 68 61 6e 6e 65 6c 20 69 64 65 6e 74  /* Channel ident
1840: 69 66 69 65 72 20 2a 2f 0a 20 20 49 6e 63 72 62  ifier */.  Incrb
1850: 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 4e 65 78  lobChannel *pNex
1860: 74 3b 20 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c  t;   /* Linked l
1870: 69 73 74 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20  ist of all open 
1880: 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c  incrblob channel
1890: 73 20 2a 2f 0a 20 20 49 6e 63 72 62 6c 6f 62 43  s */.  IncrblobC
18a0: 68 61 6e 6e 65 6c 20 2a 70 50 72 65 76 3b 20 20  hannel *pPrev;  
18b0: 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20   /* Linked list 
18c0: 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 69 6e 63 72  of all open incr
18d0: 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 73 20 2a 2f  blob channels */
18e0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  .};../*.** Compu
18f0: 74 65 20 61 20 73 74 72 69 6e 67 20 6c 65 6e 67  te a string leng
1900: 74 68 20 74 68 61 74 20 69 73 20 6c 69 6d 69 74  th that is limit
1910: 65 64 20 74 6f 20 77 68 61 74 20 63 61 6e 20 62  ed to what can b
1920: 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 6c  e stored in.** l
1930: 6f 77 65 72 20 33 30 20 62 69 74 73 20 6f 66 20  ower 30 bits of 
1940: 61 20 33 32 2d 62 69 74 20 73 69 67 6e 65 64 20  a 32-bit signed 
1950: 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74  integer..*/.stat
1960: 69 63 20 69 6e 74 20 73 74 72 6c 65 6e 33 30 28  ic int strlen30(
1970: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
1980: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32    const char *z2
1990: 20 3d 20 7a 3b 0a 20 20 77 68 69 6c 65 28 20 2a   = z;.  while( *
19a0: 7a 32 20 29 7b 20 7a 32 2b 2b 3b 20 7d 0a 20 20  z2 ){ z2++; }.  
19b0: 72 65 74 75 72 6e 20 30 78 33 66 66 66 66 66 66  return 0x3ffffff
19c0: 66 20 26 20 28 69 6e 74 29 28 7a 32 20 2d 20 7a  f & (int)(z2 - z
19d0: 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53  );.}...#ifndef S
19e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
19f0: 4c 4f 42 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  LOB./*.** Close 
1a00: 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 20 63 68 61  all incrblob cha
1a10: 6e 6e 65 6c 73 20 6f 70 65 6e 65 64 20 75 73 69  nnels opened usi
1a20: 6e 67 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ng database conn
1a30: 65 63 74 69 6f 6e 20 70 44 62 2e 0a 2a 2a 20 54  ection pDb..** T
1a40: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 77 68  his is called wh
1a50: 65 6e 20 73 68 75 74 74 69 6e 67 20 64 6f 77 6e  en shutting down
1a60: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
1a70: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nnection..*/.sta
1a80: 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 49 6e  tic void closeIn
1a90: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 73 28 53  crblobChannels(S
1aa0: 71 6c 69 74 65 44 62 20 2a 70 44 62 29 7b 0a 20  qliteDb *pDb){. 
1ab0: 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c   IncrblobChannel
1ac0: 20 2a 70 3b 0a 20 20 49 6e 63 72 62 6c 6f 62 43   *p;.  IncrblobC
1ad0: 68 61 6e 6e 65 6c 20 2a 70 4e 65 78 74 3b 0a 0a  hannel *pNext;..
1ae0: 20 20 66 6f 72 28 70 3d 70 44 62 2d 3e 70 49 6e    for(p=pDb->pIn
1af0: 63 72 62 6c 6f 62 3b 20 70 3b 20 70 3d 70 4e 65  crblob; p; p=pNe
1b00: 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
1b10: 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 20 20   p->pNext;..    
1b20: 2f 2a 20 4e 6f 74 65 3a 20 43 61 6c 6c 69 6e 67  /* Note: Calling
1b30: 20 75 6e 72 65 67 69 73 74 65 72 20 68 65 72 65   unregister here
1b40: 20 63 61 6c 6c 20 54 63 6c 5f 43 6c 6f 73 65 20   call Tcl_Close 
1b50: 6f 6e 20 74 68 65 20 69 6e 63 72 62 6c 6f 62 20  on the incrblob 
1b60: 63 68 61 6e 6e 65 6c 2c 20 0a 20 20 20 20 2a 2a  channel, .    **
1b70: 20 77 68 69 63 68 20 64 65 6c 65 74 65 73 20 74   which deletes t
1b80: 68 65 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  he IncrblobChann
1b90: 65 6c 20 73 74 72 75 63 74 75 72 65 20 61 74 20  el structure at 
1ba0: 2a 70 2e 20 53 6f 20 64 6f 20 6e 6f 74 0a 20 20  *p. So do not.  
1bb0: 20 20 2a 2a 20 63 61 6c 6c 20 54 63 6c 5f 46 72    ** call Tcl_Fr
1bc0: 65 65 28 29 20 68 65 72 65 2e 0a 20 20 20 20 2a  ee() here..    *
1bd0: 2f 0a 20 20 20 20 54 63 6c 5f 55 6e 72 65 67 69  /.    Tcl_Unregi
1be0: 73 74 65 72 43 68 61 6e 6e 65 6c 28 70 44 62 2d  sterChannel(pDb-
1bf0: 3e 69 6e 74 65 72 70 2c 20 70 2d 3e 63 68 61 6e  >interp, p->chan
1c00: 6e 65 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  nel);.  }.}../*.
1c10: 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 69 6e 63 72  ** Close an incr
1c20: 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 68 61  emental blob cha
1c30: 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nnel..*/.static 
1c40: 69 6e 74 20 69 6e 63 72 62 6c 6f 62 43 6c 6f 73  int incrblobClos
1c50: 65 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73  e(ClientData ins
1c60: 74 61 6e 63 65 44 61 74 61 2c 20 54 63 6c 5f 49  tanceData, Tcl_I
1c70: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a  nterp *interp){.
1c80: 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65    IncrblobChanne
1c90: 6c 20 2a 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62  l *p = (Incrblob
1ca0: 43 68 61 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e  Channel *)instan
1cb0: 63 65 44 61 74 61 3b 0a 20 20 69 6e 74 20 72 63  ceData;.  int rc
1cc0: 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f   = sqlite3_blob_
1cd0: 63 6c 6f 73 65 28 70 2d 3e 70 42 6c 6f 62 29 3b  close(p->pBlob);
1ce0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1cf0: 20 70 2d 3e 70 44 62 2d 3e 64 62 3b 0a 0a 20 20   p->pDb->db;..  
1d00: 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 63 68  /* Remove the ch
1d10: 61 6e 6e 65 6c 20 66 72 6f 6d 20 74 68 65 20 53  annel from the S
1d20: 71 6c 69 74 65 44 62 2e 70 49 6e 63 72 62 6c 6f  qliteDb.pIncrblo
1d30: 62 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 69 66 28  b list. */.  if(
1d40: 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20   p->pNext ){.   
1d50: 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
1d60: 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d   = p->pPrev;.  }
1d70: 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20  .  if( p->pPrev 
1d80: 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d  ){.    p->pPrev-
1d90: 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78  >pNext = p->pNex
1da0: 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  t;.  }.  if( p->
1db0: 70 44 62 2d 3e 70 49 6e 63 72 62 6c 6f 62 3d 3d  pDb->pIncrblob==
1dc0: 70 20 29 7b 0a 20 20 20 20 70 2d 3e 70 44 62 2d  p ){.    p->pDb-
1dd0: 3e 70 49 6e 63 72 62 6c 6f 62 20 3d 20 70 2d 3e  >pIncrblob = p->
1de0: 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pNext;.  }..  /*
1df0: 20 46 72 65 65 20 74 68 65 20 49 6e 63 72 62 6c   Free the Incrbl
1e00: 6f 62 43 68 61 6e 6e 65 6c 20 73 74 72 75 63 74  obChannel struct
1e10: 75 72 65 20 2a 2f 0a 20 20 54 63 6c 5f 46 72 65  ure */.  Tcl_Fre
1e20: 65 28 28 63 68 61 72 20 2a 29 70 29 3b 0a 0a 20  e((char *)p);.. 
1e30: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1e40: 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65  OK ){.    Tcl_Se
1e50: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
1e60: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
1e70: 65 72 72 6d 73 67 28 64 62 29 2c 20 54 43 4c 5f  errmsg(db), TCL_
1e80: 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 72  VOLATILE);.    r
1e90: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1ea0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
1eb0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  L_OK;.}../*.** R
1ec0: 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 6e  ead data from an
1ed0: 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f   incremental blo
1ee0: 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74  b channel..*/.st
1ef0: 61 74 69 63 20 69 6e 74 20 69 6e 63 72 62 6c 6f  atic int incrblo
1f00: 62 49 6e 70 75 74 28 0a 20 20 43 6c 69 65 6e 74  bInput(.  Client
1f10: 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74  Data instanceDat
1f20: 61 2c 20 0a 20 20 63 68 61 72 20 2a 62 75 66 2c  a, .  char *buf,
1f30: 20 0a 20 20 69 6e 74 20 62 75 66 53 69 7a 65 2c   .  int bufSize,
1f40: 0a 20 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64  .  int *errorCod
1f50: 65 50 74 72 0a 29 7b 0a 20 20 49 6e 63 72 62 6c  ePtr.){.  Incrbl
1f60: 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28  obChannel *p = (
1f70: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20  IncrblobChannel 
1f80: 2a 29 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a  *)instanceData;.
1f90: 20 20 69 6e 74 20 6e 52 65 61 64 20 3d 20 62 75    int nRead = bu
1fa0: 66 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 2f  fSize;         /
1fb0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
1fc0: 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69  s to read */.  i
1fd0: 6e 74 20 6e 42 6c 6f 62 3b 20 20 20 20 20 20 20  nt nBlob;       
1fe0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1ff0: 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65  otal size of the
2000: 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 6e 74 20 72   blob */.  int r
2010: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2020: 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
2030: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  e error code */.
2040: 0a 20 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74  .  nBlob = sqlit
2050: 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d  e3_blob_bytes(p-
2060: 3e 70 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20 28  >pBlob);.  if( (
2070: 70 2d 3e 69 53 65 65 6b 2b 6e 52 65 61 64 29 3e  p->iSeek+nRead)>
2080: 6e 42 6c 6f 62 20 29 7b 0a 20 20 20 20 6e 52 65  nBlob ){.    nRe
2090: 61 64 20 3d 20 6e 42 6c 6f 62 2d 70 2d 3e 69 53  ad = nBlob-p->iS
20a0: 65 65 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  eek;.  }.  if( n
20b0: 52 65 61 64 3c 3d 30 20 29 7b 0a 20 20 20 20 72  Read<=0 ){.    r
20c0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
20d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f  rc = sqlite3_blo
20e0: 62 5f 72 65 61 64 28 70 2d 3e 70 42 6c 6f 62 2c  b_read(p->pBlob,
20f0: 20 28 76 6f 69 64 20 2a 29 62 75 66 2c 20 6e 52   (void *)buf, nR
2100: 65 61 64 2c 20 70 2d 3e 69 53 65 65 6b 29 3b 0a  ead, p->iSeek);.
2110: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2120: 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 65 72 72 6f  _OK ){.    *erro
2130: 72 43 6f 64 65 50 74 72 20 3d 20 72 63 3b 0a 20  rCodePtr = rc;. 
2140: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
2150: 7d 0a 0a 20 20 70 2d 3e 69 53 65 65 6b 20 2b 3d  }..  p->iSeek +=
2160: 20 6e 52 65 61 64 3b 0a 20 20 72 65 74 75 72 6e   nRead;.  return
2170: 20 6e 52 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   nRead;.}../*.**
2180: 20 57 72 69 74 65 20 64 61 74 61 20 74 6f 20 61   Write data to a
2190: 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c  n incremental bl
21a0: 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73  ob channel..*/.s
21b0: 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 62 6c  tatic int incrbl
21c0: 6f 62 4f 75 74 70 75 74 28 0a 20 20 43 6c 69 65  obOutput(.  Clie
21d0: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44  ntData instanceD
21e0: 61 74 61 2c 20 0a 20 20 43 4f 4e 53 54 20 63 68  ata, .  CONST ch
21f0: 61 72 20 2a 62 75 66 2c 20 0a 20 20 69 6e 74 20  ar *buf, .  int 
2200: 74 6f 57 72 69 74 65 2c 0a 20 20 69 6e 74 20 2a  toWrite,.  int *
2210: 65 72 72 6f 72 43 6f 64 65 50 74 72 0a 29 7b 0a  errorCodePtr.){.
2220: 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65    IncrblobChanne
2230: 6c 20 2a 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62  l *p = (Incrblob
2240: 43 68 61 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e  Channel *)instan
2250: 63 65 44 61 74 61 3b 0a 20 20 69 6e 74 20 6e 57  ceData;.  int nW
2260: 72 69 74 65 20 3d 20 74 6f 57 72 69 74 65 3b 20  rite = toWrite; 
2270: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2280: 20 6f 66 20 62 79 74 65 73 20 74 6f 20 77 72 69   of bytes to wri
2290: 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 6c 6f  te */.  int nBlo
22a0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
22b0: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69       /* Total si
22c0: 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 62 20 2a  ze of the blob *
22d0: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
22e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f0: 20 2f 2a 20 73 71 6c 69 74 65 20 65 72 72 6f 72   /* sqlite error
2300: 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 6e 42 6c 6f   code */..  nBlo
2310: 62 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  b = sqlite3_blob
2320: 5f 62 79 74 65 73 28 70 2d 3e 70 42 6c 6f 62 29  _bytes(p->pBlob)
2330: 3b 0a 20 20 69 66 28 20 28 70 2d 3e 69 53 65 65  ;.  if( (p->iSee
2340: 6b 2b 6e 57 72 69 74 65 29 3e 6e 42 6c 6f 62 20  k+nWrite)>nBlob 
2350: 29 7b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f 64  ){.    *errorCod
2360: 65 50 74 72 20 3d 20 45 49 4e 56 41 4c 3b 0a 20  ePtr = EINVAL;. 
2370: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
2380: 7d 0a 20 20 69 66 28 20 6e 57 72 69 74 65 3c 3d  }.  if( nWrite<=
2390: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
23a0: 30 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73  0;.  }..  rc = s
23b0: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74  qlite3_blob_writ
23c0: 65 28 70 2d 3e 70 42 6c 6f 62 2c 20 28 76 6f 69  e(p->pBlob, (voi
23d0: 64 20 2a 29 62 75 66 2c 20 6e 57 72 69 74 65 2c  d *)buf, nWrite,
23e0: 20 70 2d 3e 69 53 65 65 6b 29 3b 0a 20 20 69 66   p->iSeek);.  if
23f0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2400: 29 7b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f 64  ){.    *errorCod
2410: 65 50 74 72 20 3d 20 45 49 4f 3b 0a 20 20 20 20  ePtr = EIO;.    
2420: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 0a  return -1;.  }..
2430: 20 20 70 2d 3e 69 53 65 65 6b 20 2b 3d 20 6e 57    p->iSeek += nW
2440: 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 6e  rite;.  return n
2450: 57 72 69 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Write;.}../*.** 
2460: 53 65 65 6b 20 61 6e 20 69 6e 63 72 65 6d 65 6e  Seek an incremen
2470: 74 61 6c 20 62 6c 6f 62 20 63 68 61 6e 6e 65 6c  tal blob channel
2480: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2490: 69 6e 63 72 62 6c 6f 62 53 65 65 6b 28 0a 20 20  incrblobSeek(.  
24a0: 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61  ClientData insta
24b0: 6e 63 65 44 61 74 61 2c 20 0a 20 20 6c 6f 6e 67  nceData, .  long
24c0: 20 6f 66 66 73 65 74 2c 0a 20 20 69 6e 74 20 73   offset,.  int s
24d0: 65 65 6b 4d 6f 64 65 2c 0a 20 20 69 6e 74 20 2a  eekMode,.  int *
24e0: 65 72 72 6f 72 43 6f 64 65 50 74 72 0a 29 7b 0a  errorCodePtr.){.
24f0: 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65    IncrblobChanne
2500: 6c 20 2a 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62  l *p = (Incrblob
2510: 43 68 61 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e  Channel *)instan
2520: 63 65 44 61 74 61 3b 0a 0a 20 20 73 77 69 74 63  ceData;..  switc
2530: 68 28 20 73 65 65 6b 4d 6f 64 65 20 29 7b 0a 20  h( seekMode ){. 
2540: 20 20 20 63 61 73 65 20 53 45 45 4b 5f 53 45 54     case SEEK_SET
2550: 3a 0a 20 20 20 20 20 20 70 2d 3e 69 53 65 65 6b  :.      p->iSeek
2560: 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20   = offset;.     
2570: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
2580: 20 53 45 45 4b 5f 43 55 52 3a 0a 20 20 20 20 20   SEEK_CUR:.     
2590: 20 70 2d 3e 69 53 65 65 6b 20 2b 3d 20 6f 66 66   p->iSeek += off
25a0: 73 65 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  set;.      break
25b0: 3b 0a 20 20 20 20 63 61 73 65 20 53 45 45 4b 5f  ;.    case SEEK_
25c0: 45 4e 44 3a 0a 20 20 20 20 20 20 70 2d 3e 69 53  END:.      p->iS
25d0: 65 65 6b 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c  eek = sqlite3_bl
25e0: 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70 42 6c 6f  ob_bytes(p->pBlo
25f0: 62 29 20 2b 20 6f 66 66 73 65 74 3b 0a 20 20 20  b) + offset;.   
2600: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64     break;..    d
2610: 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28 21  efault: assert(!
2620: 22 42 61 64 20 73 65 65 6b 4d 6f 64 65 22 29 3b  "Bad seekMode");
2630: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
2640: 2d 3e 69 53 65 65 6b 3b 0a 7d 0a 0a 0a 73 74 61  ->iSeek;.}...sta
2650: 74 69 63 20 76 6f 69 64 20 69 6e 63 72 62 6c 6f  tic void incrblo
2660: 62 57 61 74 63 68 28 43 6c 69 65 6e 74 44 61 74  bWatch(ClientDat
2670: 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20  a instanceData, 
2680: 69 6e 74 20 6d 6f 64 65 29 7b 20 0a 20 20 2f 2a  int mode){ .  /*
2690: 20 4e 4f 2d 4f 50 20 2a 2f 20 0a 7d 0a 73 74 61   NO-OP */ .}.sta
26a0: 74 69 63 20 69 6e 74 20 69 6e 63 72 62 6c 6f 62  tic int incrblob
26b0: 48 61 6e 64 6c 65 28 43 6c 69 65 6e 74 44 61 74  Handle(ClientDat
26c0: 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20  a instanceData, 
26d0: 69 6e 74 20 64 69 72 2c 20 43 6c 69 65 6e 74 44  int dir, ClientD
26e0: 61 74 61 20 2a 68 50 74 72 29 7b 0a 20 20 72 65  ata *hPtr){.  re
26f0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2700: 7d 0a 0a 73 74 61 74 69 63 20 54 63 6c 5f 43 68  }..static Tcl_Ch
2710: 61 6e 6e 65 6c 54 79 70 65 20 49 6e 63 72 62 6c  annelType Incrbl
2720: 6f 62 43 68 61 6e 6e 65 6c 54 79 70 65 20 3d 20  obChannelType = 
2730: 7b 0a 20 20 22 69 6e 63 72 62 6c 6f 62 22 2c 20  {.  "incrblob", 
2740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2750: 20 20 20 20 20 20 20 2f 2a 20 74 79 70 65 4e 61         /* typeNa
2760: 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  me              
2770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2780: 2f 0a 20 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f  /.  TCL_CHANNEL_
2790: 56 45 52 53 49 4f 4e 5f 32 2c 20 20 20 20 20 20  VERSION_2,      
27a0: 20 20 20 20 20 20 20 2f 2a 20 76 65 72 73 69 6f         /* versio
27b0: 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
27c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
27d0: 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 43 6c 6f 73  /.  incrblobClos
27e0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
27f0: 20 20 20 20 20 20 20 2f 2a 20 63 6c 6f 73 65 50         /* closeP
2800: 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20  roc             
2810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2820: 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 49 6e 70 75  /.  incrblobInpu
2830: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
2840: 20 20 20 20 20 20 20 2f 2a 20 69 6e 70 75 74 50         /* inputP
2850: 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20  roc             
2860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2870: 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 4f 75 74 70  /.  incrblobOutp
2880: 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ut,             
2890: 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 70 75 74         /* output
28a0: 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20  Proc            
28b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
28c0: 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 53 65 65 6b  /.  incrblobSeek
28d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28e0: 20 20 20 20 20 20 20 2f 2a 20 73 65 65 6b 50 72         /* seekPr
28f0: 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  oc              
2900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2910: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
2920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2930: 20 20 20 20 20 20 20 2f 2a 20 73 65 74 4f 70 74         /* setOpt
2940: 69 6f 6e 50 72 6f 63 20 20 20 20 20 20 20 20 20  ionProc         
2950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2960: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
2970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2980: 20 20 20 20 20 20 20 2f 2a 20 67 65 74 4f 70 74         /* getOpt
2990: 69 6f 6e 50 72 6f 63 20 20 20 20 20 20 20 20 20  ionProc         
29a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
29b0: 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 57 61 74 63  /.  incrblobWatc
29c0: 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
29d0: 20 20 20 20 20 20 20 2f 2a 20 77 61 74 63 68 50         /* watchP
29e0: 72 6f 63 20 28 74 68 69 73 20 69 73 20 61 20 6e  roc (this is a n
29f0: 6f 2d 6f 70 29 20 20 20 20 20 20 20 20 20 20 2a  o-op)          *
2a00: 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 48 61 6e 64  /.  incrblobHand
2a10: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
2a20: 20 20 20 20 20 20 20 2f 2a 20 67 65 74 48 61 6e         /* getHan
2a30: 64 6c 65 50 72 6f 63 20 28 61 6c 77 61 79 73 20  dleProc (always 
2a40: 72 65 74 75 72 6e 73 20 65 72 72 6f 72 29 20 2a  returns error) *
2a50: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
2a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a70: 20 20 20 20 20 20 20 2f 2a 20 63 6c 6f 73 65 32         /* close2
2a80: 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20  Proc            
2a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2aa0: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
2ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac0: 20 20 20 20 20 20 20 2f 2a 20 62 6c 6f 63 6b 4d         /* blockM
2ad0: 6f 64 65 50 72 6f 63 20 20 20 20 20 20 20 20 20  odeProc         
2ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2af0: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
2b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b10: 20 20 20 20 20 20 20 2f 2a 20 66 6c 75 73 68 50         /* flushP
2b20: 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20  roc             
2b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2b40: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
2b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b60: 20 20 20 20 20 20 20 2f 2a 20 68 61 6e 64 6c 65         /* handle
2b70: 72 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20  rProc           
2b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2b90: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
2ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb0: 20 20 20 20 20 20 20 2f 2a 20 77 69 64 65 53 65         /* wideSe
2bc0: 65 6b 50 72 6f 63 20 20 20 20 20 20 20 20 20 20  ekProc          
2bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2be0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  /.};../*.** Crea
2bf0: 74 65 20 61 20 6e 65 77 20 69 6e 63 72 62 6c 6f  te a new incrblo
2c00: 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74  b channel..*/.st
2c10: 61 74 69 63 20 69 6e 74 20 63 72 65 61 74 65 49  atic int createI
2c20: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 28 0a  ncrblobChannel(.
2c30: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
2c40: 74 65 72 70 2c 20 0a 20 20 53 71 6c 69 74 65 44  terp, .  SqliteD
2c50: 62 20 2a 70 44 62 2c 20 0a 20 20 63 6f 6e 73 74  b *pDb, .  const
2c60: 20 63 68 61 72 20 2a 7a 44 62 2c 0a 20 20 63 6f   char *zDb,.  co
2c70: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65  nst char *zTable
2c80: 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
2c90: 2a 7a 43 6f 6c 75 6d 6e 2c 20 0a 20 20 73 71 6c  *zColumn, .  sql
2ca0: 69 74 65 5f 69 6e 74 36 34 20 69 52 6f 77 2c 0a  ite_int64 iRow,.
2cb0: 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79    int isReadonly
2cc0: 0a 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68  .){.  IncrblobCh
2cd0: 61 6e 6e 65 6c 20 2a 70 3b 0a 20 20 73 71 6c 69  annel *p;.  sqli
2ce0: 74 65 33 20 2a 64 62 20 3d 20 70 44 62 2d 3e 64  te3 *db = pDb->d
2cf0: 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f  b;.  sqlite3_blo
2d00: 62 20 2a 70 42 6c 6f 62 3b 0a 20 20 69 6e 74 20  b *pBlob;.  int 
2d10: 72 63 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20  rc;.  int flags 
2d20: 3d 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 7c 28  = TCL_READABLE|(
2d30: 69 73 52 65 61 64 6f 6e 6c 79 20 3f 20 30 20 3a  isReadonly ? 0 :
2d40: 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 3b 0a   TCL_WRITABLE);.
2d50: 0a 20 20 2f 2a 20 54 68 69 73 20 76 61 72 69 61  .  /* This varia
2d60: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6e  ble is used to n
2d70: 61 6d 65 20 74 68 65 20 63 68 61 6e 6e 65 6c 73  ame the channels
2d80: 3a 20 22 69 6e 63 72 62 6c 6f 62 5f 5b 69 6e 63  : "incrblob_[inc
2d90: 72 20 63 6f 75 6e 74 5d 22 20 2a 2f 0a 20 20 73  r count]" */.  s
2da0: 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 20  tatic int count 
2db0: 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 43 68 61  = 0;.  char zCha
2dc0: 6e 6e 65 6c 5b 36 34 5d 3b 0a 0a 20 20 72 63 20  nnel[64];..  rc 
2dd0: 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f  = sqlite3_blob_o
2de0: 70 65 6e 28 64 62 2c 20 7a 44 62 2c 20 7a 54 61  pen(db, zDb, zTa
2df0: 62 6c 65 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 69 52  ble, zColumn, iR
2e00: 6f 77 2c 20 21 69 73 52 65 61 64 6f 6e 6c 79 2c  ow, !isReadonly,
2e10: 20 26 70 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20   &pBlob);.  if( 
2e20: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2e30: 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
2e40: 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
2e50: 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72 6d 73   *)sqlite3_errms
2e60: 67 28 70 44 62 2d 3e 64 62 29 2c 20 54 43 4c 5f  g(pDb->db), TCL_
2e70: 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 72  VOLATILE);.    r
2e80: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2e90: 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 28 49 6e 63  .  }..  p = (Inc
2ea0: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 54  rblobChannel *)T
2eb0: 63 6c 5f 41 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  cl_Alloc(sizeof(
2ec0: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 29  IncrblobChannel)
2ed0: 29 3b 0a 20 20 70 2d 3e 69 53 65 65 6b 20 3d 20  );.  p->iSeek = 
2ee0: 30 3b 0a 20 20 70 2d 3e 70 42 6c 6f 62 20 3d 20  0;.  p->pBlob = 
2ef0: 70 42 6c 6f 62 3b 0a 0a 20 20 73 71 6c 69 74 65  pBlob;..  sqlite
2f00: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
2f10: 66 28 7a 43 68 61 6e 6e 65 6c 29 2c 20 7a 43 68  f(zChannel), zCh
2f20: 61 6e 6e 65 6c 2c 20 22 69 6e 63 72 62 6c 6f 62  annel, "incrblob
2f30: 5f 25 64 22 2c 20 2b 2b 63 6f 75 6e 74 29 3b 0a  _%d", ++count);.
2f40: 20 20 70 2d 3e 63 68 61 6e 6e 65 6c 20 3d 20 54    p->channel = T
2f50: 63 6c 5f 43 72 65 61 74 65 43 68 61 6e 6e 65 6c  cl_CreateChannel
2f60: 28 26 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65  (&IncrblobChanne
2f70: 6c 54 79 70 65 2c 20 7a 43 68 61 6e 6e 65 6c 2c  lType, zChannel,
2f80: 20 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 54 63   p, flags);.  Tc
2f90: 6c 5f 52 65 67 69 73 74 65 72 43 68 61 6e 6e 65  l_RegisterChanne
2fa0: 6c 28 69 6e 74 65 72 70 2c 20 70 2d 3e 63 68 61  l(interp, p->cha
2fb0: 6e 6e 65 6c 29 3b 0a 0a 20 20 2f 2a 20 4c 69 6e  nnel);..  /* Lin
2fc0: 6b 20 74 68 65 20 6e 65 77 20 63 68 61 6e 6e 65  k the new channe
2fd0: 6c 20 69 6e 74 6f 20 74 68 65 20 53 71 6c 69 74  l into the Sqlit
2fe0: 65 44 62 2e 70 49 6e 63 72 62 6c 6f 62 20 6c 69  eDb.pIncrblob li
2ff0: 73 74 2e 20 2a 2f 0a 20 20 70 2d 3e 70 4e 65 78  st. */.  p->pNex
3000: 74 20 3d 20 70 44 62 2d 3e 70 49 6e 63 72 62 6c  t = pDb->pIncrbl
3010: 6f 62 3b 0a 20 20 70 2d 3e 70 50 72 65 76 20 3d  ob;.  p->pPrev =
3020: 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65   0;.  if( p->pNe
3030: 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65  xt ){.    p->pNe
3040: 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20  xt->pPrev = p;. 
3050: 20 7d 0a 20 20 70 44 62 2d 3e 70 49 6e 63 72 62   }.  pDb->pIncrb
3060: 6c 6f 62 20 3d 20 70 3b 0a 20 20 70 2d 3e 70 44  lob = p;.  p->pD
3070: 62 20 3d 20 70 44 62 3b 0a 0a 20 20 54 63 6c 5f  b = pDb;..  Tcl_
3080: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
3090: 2c 20 28 63 68 61 72 20 2a 29 54 63 6c 5f 47 65  , (char *)Tcl_Ge
30a0: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 70 2d 3e  tChannelName(p->
30b0: 63 68 61 6e 6e 65 6c 29 2c 20 54 43 4c 5f 56 4f  channel), TCL_VO
30c0: 4c 41 54 49 4c 45 29 3b 0a 20 20 72 65 74 75 72  LATILE);.  retur
30d0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6c 73  n TCL_OK;.}.#els
30e0: 65 20 20 2f 2a 20 65 6c 73 65 20 63 6c 61 75 73  e  /* else claus
30f0: 65 20 66 6f 72 20 22 23 69 66 6e 64 65 66 20 53  e for "#ifndef S
3100: 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
3110: 4c 4f 42 22 20 2a 2f 0a 20 20 23 64 65 66 69 6e  LOB" */.  #defin
3120: 65 20 63 6c 6f 73 65 49 6e 63 72 62 6c 6f 62 43  e closeIncrblobC
3130: 68 61 6e 6e 65 6c 73 28 70 44 62 29 0a 23 65 6e  hannels(pDb).#en
3140: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20  dif../*.** Look 
3150: 61 74 20 74 68 65 20 73 63 72 69 70 74 20 70 72  at the script pr
3160: 65 66 69 78 20 69 6e 20 70 43 6d 64 2e 20 20 57  efix in pCmd.  W
3170: 65 20 77 69 6c 6c 20 62 65 20 65 78 65 63 75 74  e will be execut
3180: 69 6e 67 20 74 68 69 73 20 73 63 72 69 70 74 0a  ing this script.
3190: 2a 2a 20 61 66 74 65 72 20 66 69 72 73 74 20 61  ** after first a
31a0: 70 70 65 6e 64 69 6e 67 20 6f 6e 65 20 6f 72 20  ppending one or 
31b0: 6d 6f 72 65 20 61 72 67 75 6d 65 6e 74 73 2e 20  more arguments. 
31c0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e   This routine an
31d0: 61 6c 79 7a 65 73 0a 2a 2a 20 74 68 65 20 73 63  alyzes.** the sc
31e0: 72 69 70 74 20 74 6f 20 73 65 65 20 69 66 20 69  ript to see if i
31f0: 74 20 69 73 20 73 61 66 65 20 74 6f 20 75 73 65  t is safe to use
3200: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20   Tcl_EvalObjv() 
3210: 6f 6e 20 74 68 65 20 73 63 72 69 70 74 0a 2a 2a  on the script.**
3220: 20 72 61 74 68 65 72 20 74 68 61 6e 20 74 68 65   rather than the
3230: 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20 54 63   more general Tc
3240: 6c 5f 45 76 61 6c 45 78 28 29 2e 20 20 54 63 6c  l_EvalEx().  Tcl
3250: 5f 45 76 61 6c 4f 62 6a 76 28 29 20 69 73 20 6d  _EvalObjv() is m
3260: 75 63 68 0a 2a 2a 20 66 61 73 74 65 72 2e 0a 2a  uch.** faster..*
3270: 2a 0a 2a 2a 20 53 63 72 69 70 74 73 20 74 68 61  *.** Scripts tha
3280: 74 20 61 72 65 20 73 61 66 65 20 74 6f 20 75 73  t are safe to us
3290: 65 20 77 69 74 68 20 54 63 6c 5f 45 76 61 6c 4f  e with Tcl_EvalO
32a0: 62 6a 76 28 29 20 63 6f 6e 73 69 73 74 73 20 6f  bjv() consists o
32b0: 66 20 61 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 20 6e  f a.** command n
32c0: 61 6d 65 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20  ame followed by 
32d0: 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 61 72 67  zero or more arg
32e0: 75 6d 65 6e 74 73 20 77 69 74 68 20 6e 6f 20 5b  uments with no [
32f0: 2e 2e 2e 5d 20 6f 72 20 24 0a 2a 2a 20 6f 72 20  ...] or $.** or 
3300: 7b 2e 2e 2e 7d 20 6f 72 20 3b 20 74 6f 20 62 65  {...} or ; to be
3310: 20 73 65 65 6e 20 61 6e 79 77 68 65 72 65 2e 20   seen anywhere. 
3320: 20 4d 6f 73 74 20 63 61 6c 6c 62 61 63 6b 20 73   Most callback s
3330: 63 72 69 70 74 73 20 63 6f 6e 73 69 73 74 0a 2a  cripts consist.*
3340: 2a 20 6f 66 20 6a 75 73 74 20 61 20 73 69 6e 67  * of just a sing
3350: 6c 65 20 70 72 6f 63 65 64 75 72 65 20 6e 61 6d  le procedure nam
3360: 65 20 61 6e 64 20 74 68 65 79 20 6d 65 65 74 20  e and they meet 
3370: 74 68 69 73 20 72 65 71 75 69 72 65 6d 65 6e 74  this requirement
3380: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3390: 73 61 66 65 54 6f 55 73 65 45 76 61 6c 4f 62 6a  safeToUseEvalObj
33a0: 76 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  v(Tcl_Interp *in
33b0: 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a 70  terp, Tcl_Obj *p
33c0: 43 6d 64 29 7b 0a 20 20 2f 2a 20 57 65 20 63 6f  Cmd){.  /* We co
33d0: 75 6c 64 20 74 72 79 20 74 6f 20 64 6f 20 73 6f  uld try to do so
33e0: 6d 65 74 68 69 6e 67 20 77 69 74 68 20 54 63 6c  mething with Tcl
33f0: 5f 50 61 72 73 65 28 29 2e 20 20 42 75 74 20 77  _Parse().  But w
3400: 65 20 77 69 6c 6c 20 69 6e 73 74 65 61 64 0a 20  e will instead. 
3410: 20 2a 2a 20 6a 75 73 74 20 64 6f 20 61 20 73 65   ** just do a se
3420: 61 72 63 68 20 66 6f 72 20 66 6f 72 62 69 64 64  arch for forbidd
3430: 65 6e 20 63 68 61 72 61 63 74 65 72 73 2e 20 20  en characters.  
3440: 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  If any of the fo
3450: 72 62 69 64 64 65 6e 0a 20 20 2a 2a 20 63 68 61  rbidden.  ** cha
3460: 72 61 63 74 65 72 73 20 61 70 70 65 61 72 20 69  racters appear i
3470: 6e 20 70 43 6d 64 2c 20 77 65 20 77 69 6c 6c 20  n pCmd, we will 
3480: 72 65 70 6f 72 74 20 74 68 65 20 73 74 72 69 6e  report the strin
3490: 67 20 61 73 20 75 6e 73 61 66 65 2e 0a 20 20 2a  g as unsafe..  *
34a0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
34b0: 7a 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 7a 20  z;.  int n;.  z 
34c0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
34d0: 72 6f 6d 4f 62 6a 28 70 43 6d 64 2c 20 26 6e 29  romObj(pCmd, &n)
34e0: 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e  ;.  while( n-- >
34f0: 20 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 20   0 ){.    int c 
3500: 3d 20 2a 28 7a 2b 2b 29 3b 0a 20 20 20 20 69 66  = *(z++);.    if
3510: 28 20 63 3d 3d 27 24 27 20 7c 7c 20 63 3d 3d 27  ( c=='$' || c=='
3520: 5b 27 20 7c 7c 20 63 3d 3d 27 3b 27 20 29 20 72  [' || c==';' ) r
3530: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
3540: 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 1;.}../*.*
3550: 2a 20 46 69 6e 64 20 61 6e 20 53 71 6c 46 75 6e  * Find an SqlFun
3560: 63 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68  c structure with
3570: 20 74 68 65 20 67 69 76 65 6e 20 6e 61 6d 65 2e   the given name.
3580: 20 20 4f 72 20 63 72 65 61 74 65 20 61 20 6e 65    Or create a ne
3590: 77 0a 2a 2a 20 6f 6e 65 20 69 66 20 61 6e 20 65  w.** one if an e
35a0: 78 69 73 74 69 6e 67 20 6f 6e 65 20 63 61 6e 6e  xisting one cann
35b0: 6f 74 20 62 65 20 66 6f 75 6e 64 2e 20 20 52 65  ot be found.  Re
35c0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
35d0: 6f 20 74 68 65 0a 2a 2a 20 73 74 72 75 63 74 75  o the.** structu
35e0: 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 71  re..*/.static Sq
35f0: 6c 46 75 6e 63 20 2a 66 69 6e 64 53 71 6c 46 75  lFunc *findSqlFu
3600: 6e 63 28 53 71 6c 69 74 65 44 62 20 2a 70 44 62  nc(SqliteDb *pDb
3610: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
3620: 61 6d 65 29 7b 0a 20 20 53 71 6c 46 75 6e 63 20  ame){.  SqlFunc 
3630: 2a 70 2c 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74  *p, *pNew;.  int
3640: 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 33   nName = strlen3
3650: 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 70 4e 65 77  0(zName);.  pNew
3660: 20 3d 20 28 53 71 6c 46 75 6e 63 2a 29 54 63 6c   = (SqlFunc*)Tcl
3670: 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  _Alloc( sizeof(*
3680: 70 4e 65 77 29 20 2b 20 6e 4e 61 6d 65 20 2b 20  pNew) + nName + 
3690: 31 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 7a 4e 61  1 );.  pNew->zNa
36a0: 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65  me = (char*)&pNe
36b0: 77 5b 31 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 70  w[1];.  memcpy(p
36c0: 4e 65 77 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  New->zName, zNam
36d0: 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 66  e, nName+1);.  f
36e0: 6f 72 28 70 3d 70 44 62 2d 3e 70 46 75 6e 63 3b  or(p=pDb->pFunc;
36f0: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
3700: 20 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65   .    if( sqlite
3710: 33 5f 73 74 72 69 63 6d 70 28 70 2d 3e 7a 4e 61  3_stricmp(p->zNa
3720: 6d 65 2c 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 29  me, pNew->zName)
3730: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  ==0 ){.      Tcl
3740: 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 4e 65  _Free((char*)pNe
3750: 77 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  w);.      return
3760: 20 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   p;.    }.  }.  
3770: 70 4e 65 77 2d 3e 69 6e 74 65 72 70 20 3d 20 70  pNew->interp = p
3780: 44 62 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 70 4e  Db->interp;.  pN
3790: 65 77 2d 3e 70 44 62 20 3d 20 70 44 62 3b 0a 20  ew->pDb = pDb;. 
37a0: 20 70 4e 65 77 2d 3e 70 53 63 72 69 70 74 20 3d   pNew->pScript =
37b0: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78   0;.  pNew->pNex
37c0: 74 20 3d 20 70 44 62 2d 3e 70 46 75 6e 63 3b 0a  t = pDb->pFunc;.
37d0: 20 20 70 44 62 2d 3e 70 46 75 6e 63 20 3d 20 70    pDb->pFunc = p
37e0: 4e 65 77 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e  New;.  return pN
37f0: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  ew;.}../*.** Fre
3800: 65 20 61 20 73 69 6e 67 6c 65 20 53 71 6c 50 72  e a single SqlPr
3810: 65 70 61 72 65 64 53 74 6d 74 20 6f 62 6a 65 63  eparedStmt objec
3820: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
3830: 64 20 64 62 46 72 65 65 53 74 6d 74 28 53 71 6c  d dbFreeStmt(Sql
3840: 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70 53  PreparedStmt *pS
3850: 74 6d 74 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  tmt){.#ifdef SQL
3860: 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73  ITE_TEST.  if( s
3870: 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d 74  qlite3_sql(pStmt
3880: 2d 3e 70 53 74 6d 74 29 3d 3d 30 20 29 7b 0a 20  ->pStmt)==0 ){. 
3890: 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61     Tcl_Free((cha
38a0: 72 20 2a 29 70 53 74 6d 74 2d 3e 7a 53 71 6c 29  r *)pStmt->zSql)
38b0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
38c0: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
38d0: 70 53 74 6d 74 2d 3e 70 53 74 6d 74 29 3b 0a 20  pStmt->pStmt);. 
38e0: 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 20   Tcl_Free((char 
38f0: 2a 29 70 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a  *)pStmt);.}../*.
3900: 2a 2a 20 46 69 6e 61 6c 69 7a 65 20 61 6e 64 20  ** Finalize and 
3910: 66 72 65 65 20 61 20 6c 69 73 74 20 6f 66 20 70  free a list of p
3920: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
3930: 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ts.*/.static voi
3940: 64 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65  d flushStmtCache
3950: 28 53 71 6c 69 74 65 44 62 20 2a 70 44 62 29 7b  (SqliteDb *pDb){
3960: 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74  .  SqlPreparedSt
3970: 6d 74 20 2a 70 50 72 65 53 74 6d 74 3b 0a 20 20  mt *pPreStmt;.  
3980: 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20  SqlPreparedStmt 
3990: 2a 70 4e 65 78 74 3b 0a 0a 20 20 66 6f 72 28 70  *pNext;..  for(p
39a0: 50 72 65 53 74 6d 74 20 3d 20 70 44 62 2d 3e 73  PreStmt = pDb->s
39b0: 74 6d 74 4c 69 73 74 3b 20 70 50 72 65 53 74 6d  tmtList; pPreStm
39c0: 74 3b 20 70 50 72 65 53 74 6d 74 3d 70 4e 65 78  t; pPreStmt=pNex
39d0: 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t){.    pNext = 
39e0: 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 3b  pPreStmt->pNext;
39f0: 0a 20 20 20 20 64 62 46 72 65 65 53 74 6d 74 28  .    dbFreeStmt(
3a00: 70 50 72 65 53 74 6d 74 29 3b 0a 20 20 7d 0a 20  pPreStmt);.  }. 
3a10: 20 70 44 62 2d 3e 6e 53 74 6d 74 20 3d 20 30 3b   pDb->nStmt = 0;
3a20: 0a 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74  .  pDb->stmtLast
3a30: 20 3d 20 30 3b 0a 20 20 70 44 62 2d 3e 73 74 6d   = 0;.  pDb->stm
3a40: 74 4c 69 73 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  tList = 0;.}../*
3a50: 0a 2a 2a 20 54 43 4c 20 63 61 6c 6c 73 20 74 68  .** TCL calls th
3a60: 69 73 20 70 72 6f 63 65 64 75 72 65 20 77 68 65  is procedure whe
3a70: 6e 20 61 6e 20 73 71 6c 69 74 65 33 20 64 61 74  n an sqlite3 dat
3a80: 61 62 61 73 65 20 63 6f 6d 6d 61 6e 64 20 69 73  abase command is
3a90: 0a 2a 2a 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a  .** deleted..*/.
3aa0: 73 74 61 74 69 63 20 76 6f 69 64 20 44 62 44 65  static void DbDe
3ab0: 6c 65 74 65 43 6d 64 28 76 6f 69 64 20 2a 64 62  leteCmd(void *db
3ac0: 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  ){.  SqliteDb *p
3ad0: 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29  Db = (SqliteDb*)
3ae0: 64 62 3b 0a 20 20 66 6c 75 73 68 53 74 6d 74 43  db;.  flushStmtC
3af0: 61 63 68 65 28 70 44 62 29 3b 0a 20 20 63 6c 6f  ache(pDb);.  clo
3b00: 73 65 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65  seIncrblobChanne
3b10: 6c 73 28 70 44 62 29 3b 0a 20 20 73 71 6c 69 74  ls(pDb);.  sqlit
3b20: 65 33 5f 63 6c 6f 73 65 28 70 44 62 2d 3e 64 62  e3_close(pDb->db
3b30: 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 44 62 2d  );.  while( pDb-
3b40: 3e 70 46 75 6e 63 20 29 7b 0a 20 20 20 20 53 71  >pFunc ){.    Sq
3b50: 6c 46 75 6e 63 20 2a 70 46 75 6e 63 20 3d 20 70  lFunc *pFunc = p
3b60: 44 62 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 70  Db->pFunc;.    p
3b70: 44 62 2d 3e 70 46 75 6e 63 20 3d 20 70 46 75 6e  Db->pFunc = pFun
3b80: 63 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61 73  c->pNext;.    as
3b90: 73 65 72 74 28 20 70 46 75 6e 63 2d 3e 70 44 62  sert( pFunc->pDb
3ba0: 3d 3d 70 44 62 20 29 3b 0a 20 20 20 20 54 63 6c  ==pDb );.    Tcl
3bb0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 46  _DecrRefCount(pF
3bc0: 75 6e 63 2d 3e 70 53 63 72 69 70 74 29 3b 0a 20  unc->pScript);. 
3bd0: 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61     Tcl_Free((cha
3be0: 72 2a 29 70 46 75 6e 63 29 3b 0a 20 20 7d 0a 20  r*)pFunc);.  }. 
3bf0: 20 77 68 69 6c 65 28 20 70 44 62 2d 3e 70 43 6f   while( pDb->pCo
3c00: 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 53 71 6c  llate ){.    Sql
3c10: 43 6f 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c 61 74  Collate *pCollat
3c20: 65 20 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74  e = pDb->pCollat
3c30: 65 3b 0a 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c  e;.    pDb->pCol
3c40: 6c 61 74 65 20 3d 20 70 43 6f 6c 6c 61 74 65 2d  late = pCollate-
3c50: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 54 63 6c 5f  >pNext;.    Tcl_
3c60: 46 72 65 65 28 28 63 68 61 72 2a 29 70 43 6f 6c  Free((char*)pCol
3c70: 6c 61 74 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  late);.  }.  if(
3c80: 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20   pDb->zBusy ){. 
3c90: 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d     Tcl_Free(pDb-
3ca0: 3e 7a 42 75 73 79 29 3b 0a 20 20 7d 0a 20 20 69  >zBusy);.  }.  i
3cb0: 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29  f( pDb->zTrace )
3cc0: 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70  {.    Tcl_Free(p
3cd0: 44 62 2d 3e 7a 54 72 61 63 65 29 3b 0a 20 20 7d  Db->zTrace);.  }
3ce0: 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f  .  if( pDb->zPro
3cf0: 66 69 6c 65 20 29 7b 0a 20 20 20 20 54 63 6c 5f  file ){.    Tcl_
3d00: 46 72 65 65 28 70 44 62 2d 3e 7a 50 72 6f 66 69  Free(pDb->zProfi
3d10: 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  le);.  }.  if( p
3d20: 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20  Db->zAuth ){.   
3d30: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
3d40: 41 75 74 68 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Auth);.  }.  if(
3d50: 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 29 7b 0a 20   pDb->zNull ){. 
3d60: 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d     Tcl_Free(pDb-
3d70: 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69  >zNull);.  }.  i
3d80: 66 28 20 70 44 62 2d 3e 70 55 70 64 61 74 65 48  f( pDb->pUpdateH
3d90: 6f 6f 6b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44  ook ){.    Tcl_D
3da0: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d  ecrRefCount(pDb-
3db0: 3e 70 55 70 64 61 74 65 48 6f 6f 6b 29 3b 0a 20  >pUpdateHook);. 
3dc0: 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 50   }.  if( pDb->pP
3dd0: 72 65 55 70 64 61 74 65 48 6f 6f 6b 20 29 7b 0a  reUpdateHook ){.
3de0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
3df0: 6f 75 6e 74 28 70 44 62 2d 3e 70 50 72 65 55 70  ount(pDb->pPreUp
3e00: 64 61 74 65 48 6f 6f 6b 29 3b 0a 20 20 7d 0a 20  dateHook);.  }. 
3e10: 20 69 66 28 20 70 44 62 2d 3e 70 52 6f 6c 6c 62   if( pDb->pRollb
3e20: 61 63 6b 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 54  ackHook ){.    T
3e30: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
3e40: 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f  pDb->pRollbackHo
3e50: 6f 6b 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ok);.  }.  if( p
3e60: 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 20 29 7b 0a  Db->pWalHook ){.
3e70: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
3e80: 6f 75 6e 74 28 70 44 62 2d 3e 70 57 61 6c 48 6f  ount(pDb->pWalHo
3e90: 6f 6b 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ok);.  }.  if( p
3ea0: 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64  Db->pCollateNeed
3eb0: 65 64 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65  ed ){.    Tcl_De
3ec0: 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e  crRefCount(pDb->
3ed0: 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b  pCollateNeeded);
3ee0: 0a 20 20 7d 0a 20 20 54 63 6c 5f 46 72 65 65 28  .  }.  Tcl_Free(
3ef0: 28 63 68 61 72 2a 29 70 44 62 29 3b 0a 7d 0a 0a  (char*)pDb);.}..
3f00: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
3f10: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
3f20: 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  n a database fil
3f30: 65 20 69 73 20 6c 6f 63 6b 65 64 20 77 68 69 6c  e is locked whil
3f40: 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 65  e trying.** to e
3f50: 78 65 63 75 74 65 20 53 51 4c 2e 0a 2a 2f 0a 73  xecute SQL..*/.s
3f60: 74 61 74 69 63 20 69 6e 74 20 44 62 42 75 73 79  tatic int DbBusy
3f70: 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64  Handler(void *cd
3f80: 2c 20 69 6e 74 20 6e 54 72 69 65 73 29 7b 0a 20  , int nTries){. 
3f90: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
3fa0: 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a   (SqliteDb*)cd;.
3fb0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
3fc0: 20 7a 56 61 6c 5b 33 30 5d 3b 0a 0a 20 20 73 71   zVal[30];..  sq
3fd0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
3fe0: 69 7a 65 6f 66 28 7a 56 61 6c 29 2c 20 7a 56 61  izeof(zVal), zVa
3ff0: 6c 2c 20 22 25 64 22 2c 20 6e 54 72 69 65 73 29  l, "%d", nTries)
4000: 3b 0a 20 20 72 63 20 3d 20 54 63 6c 5f 56 61 72  ;.  rc = Tcl_Var
4010: 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70  Eval(pDb->interp
4020: 2c 20 70 44 62 2d 3e 7a 42 75 73 79 2c 20 22 20  , pDb->zBusy, " 
4030: 22 2c 20 7a 56 61 6c 2c 20 28 63 68 61 72 2a 29  ", zVal, (char*)
4040: 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 54 43  0);.  if( rc!=TC
4050: 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28 54 63 6c  L_OK || atoi(Tcl
4060: 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74  _GetStringResult
4070: 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 29 20 29  (pDb->interp)) )
4080: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
4090: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a    }.  return 1;.
40a0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
40b0: 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f  E_OMIT_PROGRESS_
40c0: 43 41 4c 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 54  CALLBACK./*.** T
40d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69  his routine is i
40e0: 6e 76 6f 6b 65 64 20 61 73 20 74 68 65 20 27 70  nvoked as the 'p
40f0: 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b  rogress callback
4100: 27 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  ' for the databa
4110: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
4120: 74 20 44 62 50 72 6f 67 72 65 73 73 48 61 6e 64  t DbProgressHand
4130: 6c 65 72 28 76 6f 69 64 20 2a 63 64 29 7b 0a 20  ler(void *cd){. 
4140: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
4150: 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a   (SqliteDb*)cd;.
4160: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
4170: 65 72 74 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72  ert( pDb->zProgr
4180: 65 73 73 20 29 3b 0a 20 20 72 63 20 3d 20 54 63  ess );.  rc = Tc
4190: 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65  l_Eval(pDb->inte
41a0: 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65  rp, pDb->zProgre
41b0: 73 73 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 54  ss);.  if( rc!=T
41c0: 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28 54 63  CL_OK || atoi(Tc
41d0: 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
41e0: 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 29 20  t(pDb->interp)) 
41f0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
4200: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
4210: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
4220: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
4230: 52 41 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  RACE./*.** This 
4240: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
4250: 64 20 62 79 20 74 68 65 20 53 51 4c 69 74 65 20  d by the SQLite 
4260: 74 72 61 63 65 20 68 61 6e 64 6c 65 72 20 77 68  trace handler wh
4270: 65 6e 65 76 65 72 20 61 20 6e 65 77 0a 2a 2a 20  enever a new.** 
4280: 62 6c 6f 63 6b 20 6f 66 20 53 51 4c 20 69 73 20  block of SQL is 
4290: 65 78 65 63 75 74 65 64 2e 20 20 54 68 65 20 54  executed.  The T
42a0: 43 4c 20 73 63 72 69 70 74 20 69 6e 20 70 44 62  CL script in pDb
42b0: 2d 3e 7a 54 72 61 63 65 20 69 73 20 65 78 65 63  ->zTrace is exec
42c0: 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uted..*/.static 
42d0: 76 6f 69 64 20 44 62 54 72 61 63 65 48 61 6e 64  void DbTraceHand
42e0: 6c 65 72 28 76 6f 69 64 20 2a 63 64 2c 20 63 6f  ler(void *cd, co
42f0: 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 29 7b  nst char *zSql){
4300: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
4310: 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64   = (SqliteDb*)cd
4320: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20  ;.  Tcl_DString 
4330: 73 74 72 3b 0a 0a 20 20 54 63 6c 5f 44 53 74 72  str;..  Tcl_DStr
4340: 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20  ingInit(&str);. 
4350: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
4360: 6e 64 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a 54  nd(&str, pDb->zT
4370: 72 61 63 65 2c 20 2d 31 29 3b 0a 20 20 54 63 6c  race, -1);.  Tcl
4380: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c  _DStringAppendEl
4390: 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 53 71 6c  ement(&str, zSql
43a0: 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 28 70 44  );.  Tcl_Eval(pD
43b0: 62 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44  b->interp, Tcl_D
43c0: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72  StringValue(&str
43d0: 29 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  ));.  Tcl_DStrin
43e0: 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20 54  gFree(&str);.  T
43f0: 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 70  cl_ResetResult(p
4400: 44 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 7d 0a 23  Db->interp);.}.#
4410: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
4420: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
4430: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
4440: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
4450: 20 74 68 65 20 53 51 4c 69 74 65 20 70 72 6f 66   the SQLite prof
4460: 69 6c 65 20 68 61 6e 64 6c 65 72 20 61 66 74 65  ile handler afte
4470: 72 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  r a statement.**
4480: 20 53 51 4c 20 68 61 73 20 65 78 65 63 75 74 65   SQL has execute
4490: 64 2e 20 20 54 68 65 20 54 43 4c 20 73 63 72 69  d.  The TCL scri
44a0: 70 74 20 69 6e 20 70 44 62 2d 3e 7a 50 72 6f 66  pt in pDb->zProf
44b0: 69 6c 65 20 69 73 20 65 76 61 6c 75 61 74 65 64  ile is evaluated
44c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
44d0: 20 44 62 50 72 6f 66 69 6c 65 48 61 6e 64 6c 65   DbProfileHandle
44e0: 72 28 76 6f 69 64 20 2a 63 64 2c 20 63 6f 6e 73  r(void *cd, cons
44f0: 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 73 71  t char *zSql, sq
4500: 6c 69 74 65 5f 75 69 6e 74 36 34 20 74 6d 29 7b  lite_uint64 tm){
4510: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
4520: 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64   = (SqliteDb*)cd
4530: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20  ;.  Tcl_DString 
4540: 73 74 72 3b 0a 20 20 63 68 61 72 20 7a 54 6d 5b  str;.  char zTm[
4550: 31 30 30 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33  100];..  sqlite3
4560: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
4570: 28 7a 54 6d 29 2d 31 2c 20 7a 54 6d 2c 20 22 25  (zTm)-1, zTm, "%
4580: 6c 6c 64 22 2c 20 74 6d 29 3b 0a 20 20 54 63 6c  lld", tm);.  Tcl
4590: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74  _DStringInit(&st
45a0: 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  r);.  Tcl_DStrin
45b0: 67 41 70 70 65 6e 64 28 26 73 74 72 2c 20 70 44  gAppend(&str, pD
45c0: 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20 2d 31 29  b->zProfile, -1)
45d0: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41  ;.  Tcl_DStringA
45e0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74  ppendElement(&st
45f0: 72 2c 20 7a 53 71 6c 29 3b 0a 20 20 54 63 6c 5f  r, zSql);.  Tcl_
4600: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65  DStringAppendEle
4610: 6d 65 6e 74 28 26 73 74 72 2c 20 7a 54 6d 29 3b  ment(&str, zTm);
4620: 0a 20 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d  .  Tcl_Eval(pDb-
4630: 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53 74  >interp, Tcl_DSt
4640: 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29 29  ringValue(&str))
4650: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46  ;.  Tcl_DStringF
4660: 72 65 65 28 26 73 74 72 29 3b 0a 20 20 54 63 6c  ree(&str);.  Tcl
4670: 5f 52 65 73 65 74 52 65 73 75 6c 74 28 70 44 62  _ResetResult(pDb
4680: 2d 3e 69 6e 74 65 72 70 29 3b 0a 7d 0a 23 65 6e  ->interp);.}.#en
4690: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
46a0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
46b0: 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63  d when a transac
46c0: 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
46d0: 64 2e 20 20 54 68 65 0a 2a 2a 20 54 43 4c 20 73  d.  The.** TCL s
46e0: 63 72 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a 43  cript in pDb->zC
46f0: 6f 6d 6d 69 74 20 69 73 20 65 78 65 63 75 74 65  ommit is execute
4700: 64 2e 20 20 49 66 20 69 74 20 72 65 74 75 72 6e  d.  If it return
4710: 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 0a 2a 2a  s non-zero or.**
4720: 20 69 66 20 69 74 20 74 68 72 6f 77 73 20 61 6e   if it throws an
4730: 20 65 78 63 65 70 74 69 6f 6e 2c 20 74 68 65 20   exception, the 
4740: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
4750: 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 73 74 65  olled back inste
4760: 61 64 0a 2a 2a 20 6f 66 20 62 65 69 6e 67 20 63  ad.** of being c
4770: 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f 0a 73 74 61  ommitted..*/.sta
4780: 74 69 63 20 69 6e 74 20 44 62 43 6f 6d 6d 69 74  tic int DbCommit
4790: 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64  Handler(void *cd
47a0: 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  ){.  SqliteDb *p
47b0: 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29  Db = (SqliteDb*)
47c0: 63 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  cd;.  int rc;.. 
47d0: 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 28 70   rc = Tcl_Eval(p
47e0: 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d  Db->interp, pDb-
47f0: 3e 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28  >zCommit);.  if(
4800: 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61   rc!=TCL_OK || a
4810: 74 6f 69 28 54 63 6c 5f 47 65 74 53 74 72 69 6e  toi(Tcl_GetStrin
4820: 67 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74  gResult(pDb->int
4830: 65 72 70 29 29 20 29 7b 0a 20 20 20 20 72 65 74  erp)) ){.    ret
4840: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
4850: 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63  urn 0;.}..static
4860: 20 76 6f 69 64 20 44 62 52 6f 6c 6c 62 61 63 6b   void DbRollback
4870: 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 6c  Handler(void *cl
4880: 69 65 6e 74 44 61 74 61 29 7b 0a 20 20 53 71 6c  ientData){.  Sql
4890: 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71  iteDb *pDb = (Sq
48a0: 6c 69 74 65 44 62 2a 29 63 6c 69 65 6e 74 44 61  liteDb*)clientDa
48b0: 74 61 3b 0a 20 20 61 73 73 65 72 74 28 70 44 62  ta;.  assert(pDb
48c0: 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 29  ->pRollbackHook)
48d0: 3b 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d  ;.  if( TCL_OK!=
48e0: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44  Tcl_EvalObjEx(pD
48f0: 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e  b->interp, pDb->
4900: 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 2c 20 30  pRollbackHook, 0
4910: 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 42 61 63  ) ){.    Tcl_Bac
4920: 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 70 44 62  kgroundError(pDb
4930: 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 7d  ->interp);.  }.}
4940: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 70 72 6f  ../*.** This pro
4950: 63 65 64 75 72 65 20 68 61 6e 64 6c 65 73 20 77  cedure handles w
4960: 61 6c 5f 68 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b  al_hook callback
4970: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
4980: 20 44 62 57 61 6c 48 61 6e 64 6c 65 72 28 0a 20   DbWalHandler(. 
4990: 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74   void *clientDat
49a0: 61 2c 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  a, .  sqlite3 *d
49b0: 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  b, .  const char
49c0: 20 2a 7a 44 62 2c 20 0a 20 20 69 6e 74 20 6e 45   *zDb, .  int nE
49d0: 6e 74 72 79 0a 29 7b 0a 20 20 69 6e 74 20 72 65  ntry.){.  int re
49e0: 74 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  t = SQLITE_OK;. 
49f0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 3b 0a 20 20 53   Tcl_Obj *p;.  S
4a00: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
4a10: 53 71 6c 69 74 65 44 62 2a 29 63 6c 69 65 6e 74  SqliteDb*)client
4a20: 44 61 74 61 3b 0a 20 20 54 63 6c 5f 49 6e 74 65  Data;.  Tcl_Inte
4a30: 72 70 20 2a 69 6e 74 65 72 70 20 3d 20 70 44 62  rp *interp = pDb
4a40: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 61 73 73 65  ->interp;.  asse
4a50: 72 74 28 70 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b  rt(pDb->pWalHook
4a60: 29 3b 0a 0a 20 20 70 20 3d 20 54 63 6c 5f 44 75  );..  p = Tcl_Du
4a70: 70 6c 69 63 61 74 65 4f 62 6a 28 70 44 62 2d 3e  plicateObj(pDb->
4a80: 70 57 61 6c 48 6f 6f 6b 29 3b 0a 20 20 54 63 6c  pWalHook);.  Tcl
4a90: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 29  _IncrRefCount(p)
4aa0: 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
4ab0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
4ac0: 65 72 70 2c 20 70 2c 20 54 63 6c 5f 4e 65 77 53  erp, p, Tcl_NewS
4ad0: 74 72 69 6e 67 4f 62 6a 28 7a 44 62 2c 20 2d 31  tringObj(zDb, -1
4ae0: 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
4af0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
4b00: 6e 74 65 72 70 2c 20 70 2c 20 54 63 6c 5f 4e 65  nterp, p, Tcl_Ne
4b10: 77 49 6e 74 4f 62 6a 28 6e 45 6e 74 72 79 29 29  wIntObj(nEntry))
4b20: 3b 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d  ;.  if( TCL_OK!=
4b30: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e  Tcl_EvalObjEx(in
4b40: 74 65 72 70 2c 20 70 2c 20 30 29 20 0a 20 20 20  terp, p, 0) .   
4b50: 7c 7c 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47  || TCL_OK!=Tcl_G
4b60: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
4b70: 65 72 70 2c 20 54 63 6c 5f 47 65 74 4f 62 6a 52  erp, Tcl_GetObjR
4b80: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 26  esult(interp), &
4b90: 72 65 74 29 0a 20 20 29 7b 0a 20 20 20 20 54 63  ret).  ){.    Tc
4ba0: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f  l_BackgroundErro
4bb0: 72 28 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 20  r(interp);.  }. 
4bc0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
4bd0: 74 28 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  t(p);..  return 
4be0: 72 65 74 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69  ret;.}..#if defi
4bf0: 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
4c00: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
4c10: 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b  TE_ENABLE_UNLOCK
4c20: 5f 4e 4f 54 49 46 59 29 0a 73 74 61 74 69 63 20  _NOTIFY).static 
4c30: 76 6f 69 64 20 73 65 74 54 65 73 74 55 6e 6c 6f  void setTestUnlo
4c40: 63 6b 4e 6f 74 69 66 79 56 61 72 73 28 54 63 6c  ckNotifyVars(Tcl
4c50: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
4c60: 20 69 6e 74 20 69 41 72 67 2c 20 69 6e 74 20 6e   int iArg, int n
4c70: 41 72 67 29 7b 0a 20 20 63 68 61 72 20 7a 42 75  Arg){.  char zBu
4c80: 66 5b 36 34 5d 3b 0a 20 20 73 70 72 69 6e 74 66  f[64];.  sprintf
4c90: 28 7a 42 75 66 2c 20 22 25 64 22 2c 20 69 41 72  (zBuf, "%d", iAr
4ca0: 67 29 3b 0a 20 20 54 63 6c 5f 53 65 74 56 61 72  g);.  Tcl_SetVar
4cb0: 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
4cc0: 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 5f 61  _unlock_notify_a
4cd0: 72 67 22 2c 20 7a 42 75 66 2c 20 54 43 4c 5f 47  rg", zBuf, TCL_G
4ce0: 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 73  LOBAL_ONLY);.  s
4cf0: 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64  printf(zBuf, "%d
4d00: 22 2c 20 6e 41 72 67 29 3b 0a 20 20 54 63 6c 5f  ", nArg);.  Tcl_
4d10: 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 20 22  SetVar(interp, "
4d20: 73 71 6c 69 74 65 5f 75 6e 6c 6f 63 6b 5f 6e 6f  sqlite_unlock_no
4d30: 74 69 66 79 5f 61 72 67 63 6f 75 6e 74 22 2c 20  tify_argcount", 
4d40: 7a 42 75 66 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c  zBuf, TCL_GLOBAL
4d50: 5f 4f 4e 4c 59 29 3b 0a 7d 0a 23 65 6c 73 65 0a  _ONLY);.}.#else.
4d60: 23 20 64 65 66 69 6e 65 20 73 65 74 54 65 73 74  # define setTest
4d70: 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 56 61 72 73  UnlockNotifyVars
4d80: 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a  (x,y,z).#endif..
4d90: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
4da0: 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49  ABLE_UNLOCK_NOTI
4db0: 46 59 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44  FY.static void D
4dc0: 62 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 28 76 6f  bUnlockNotify(vo
4dd0: 69 64 20 2a 2a 61 70 41 72 67 2c 20 69 6e 74 20  id **apArg, int 
4de0: 6e 41 72 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  nArg){.  int i;.
4df0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
4e00: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e  g; i++){.    con
4e10: 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28  st int flags = (
4e20: 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 7c  TCL_EVAL_GLOBAL|
4e30: 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29  TCL_EVAL_DIRECT)
4e40: 3b 0a 20 20 20 20 53 71 6c 69 74 65 44 62 20 2a  ;.    SqliteDb *
4e50: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 20  pDb = (SqliteDb 
4e60: 2a 29 61 70 41 72 67 5b 69 5d 3b 0a 20 20 20 20  *)apArg[i];.    
4e70: 73 65 74 54 65 73 74 55 6e 6c 6f 63 6b 4e 6f 74  setTestUnlockNot
4e80: 69 66 79 56 61 72 73 28 70 44 62 2d 3e 69 6e 74  ifyVars(pDb->int
4e90: 65 72 70 2c 20 69 2c 20 6e 41 72 67 29 3b 0a 20  erp, i, nArg);. 
4ea0: 20 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e     assert( pDb->
4eb0: 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 29 3b 0a  pUnlockNotify);.
4ec0: 20 20 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45      Tcl_EvalObjE
4ed0: 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70  x(pDb->interp, p
4ee0: 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66  Db->pUnlockNotif
4ef0: 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 54  y, flags);.    T
4f00: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
4f10: 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69  pDb->pUnlockNoti
4f20: 66 79 29 3b 0a 20 20 20 20 70 44 62 2d 3e 70 55  fy);.    pDb->pU
4f30: 6e 6c 6f 63 6b 4e 6f 74 69 66 79 20 3d 20 30 3b  nlockNotify = 0;
4f40: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  .  }.}.#endif..#
4f50: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
4f60: 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f  BLE_PREUPDATE_HO
4f70: 4f 4b 0a 2f 2a 0a 2a 2a 20 50 72 65 2d 75 70 64  OK./*.** Pre-upd
4f80: 61 74 65 20 68 6f 6f 6b 20 63 61 6c 6c 62 61 63  ate hook callbac
4f90: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  k..*/.static voi
4fa0: 64 20 44 62 50 72 65 55 70 64 61 74 65 48 61 6e  d DbPreUpdateHan
4fb0: 64 6c 65 72 28 0a 20 20 76 6f 69 64 20 2a 70 2c  dler(.  void *p,
4fc0: 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c   .  sqlite3 *db,
4fd0: 0a 20 20 69 6e 74 20 6f 70 2c 0a 20 20 63 6f 6e  .  int op,.  con
4fe0: 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 0a 20  st char *zDb, . 
4ff0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62   const char *zTb
5000: 6c 2c 20 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74  l, .  sqlite_int
5010: 36 34 20 69 4b 65 79 31 2c 0a 20 20 73 71 6c 69  64 iKey1,.  sqli
5020: 74 65 5f 69 6e 74 36 34 20 69 4b 65 79 32 0a 29  te_int64 iKey2.)
5030: 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  {.  SqliteDb *pD
5040: 62 20 3d 20 28 53 71 6c 69 74 65 44 62 20 2a 29  b = (SqliteDb *)
5050: 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43  p;.  Tcl_Obj *pC
5060: 6d 64 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  md;.  static con
5070: 73 74 20 63 68 61 72 20 2a 61 7a 53 74 72 5b 5d  st char *azStr[]
5080: 20 3d 20 7b 22 44 45 4c 45 54 45 22 2c 20 22 49   = {"DELETE", "I
5090: 4e 53 45 52 54 22 2c 20 22 55 50 44 41 54 45 22  NSERT", "UPDATE"
50a0: 7d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 53  };..  assert( (S
50b0: 51 4c 49 54 45 5f 44 45 4c 45 54 45 2d 31 29 2f  QLITE_DELETE-1)/
50c0: 39 20 3d 3d 20 30 20 29 3b 0a 20 20 61 73 73 65  9 == 0 );.  asse
50d0: 72 74 28 20 28 53 51 4c 49 54 45 5f 49 4e 53 45  rt( (SQLITE_INSE
50e0: 52 54 2d 31 29 2f 39 20 3d 3d 20 31 20 29 3b 0a  RT-1)/9 == 1 );.
50f0: 20 20 61 73 73 65 72 74 28 20 28 53 51 4c 49 54    assert( (SQLIT
5100: 45 5f 55 50 44 41 54 45 2d 31 29 2f 39 20 3d 3d  E_UPDATE-1)/9 ==
5110: 20 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20   2 );.  assert( 
5120: 70 44 62 2d 3e 70 50 72 65 55 70 64 61 74 65 48  pDb->pPreUpdateH
5130: 6f 6f 6b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ook );.  assert(
5140: 20 64 62 3d 3d 70 44 62 2d 3e 64 62 20 29 3b 0a   db==pDb->db );.
5150: 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 51    assert( op==SQ
5160: 4c 49 54 45 5f 49 4e 53 45 52 54 20 7c 7c 20 6f  LITE_INSERT || o
5170: 70 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45  p==SQLITE_UPDATE
5180: 20 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 44   || op==SQLITE_D
5190: 45 4c 45 54 45 20 29 3b 0a 0a 20 20 70 43 6d 64  ELETE );..  pCmd
51a0: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
51b0: 4f 62 6a 28 70 44 62 2d 3e 70 50 72 65 55 70 64  Obj(pDb->pPreUpd
51c0: 61 74 65 48 6f 6f 6b 29 3b 0a 20 20 54 63 6c 5f  ateHook);.  Tcl_
51d0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d  IncrRefCount(pCm
51e0: 64 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  d);.  Tcl_ListOb
51f0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
5200: 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53  , pCmd, Tcl_NewS
5210: 74 72 69 6e 67 4f 62 6a 28 61 7a 53 74 72 5b 28  tringObj(azStr[(
5220: 6f 70 2d 31 29 2f 39 5d 2c 20 2d 31 29 29 3b 0a  op-1)/9], -1));.
5230: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
5240: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43  endElement(0, pC
5250: 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  md, Tcl_NewStrin
5260: 67 4f 62 6a 28 7a 44 62 2c 20 2d 31 29 29 3b 0a  gObj(zDb, -1));.
5270: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
5280: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43  endElement(0, pC
5290: 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  md, Tcl_NewStrin
52a0: 67 4f 62 6a 28 7a 54 62 6c 2c 20 2d 31 29 29 3b  gObj(zTbl, -1));
52b0: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
52c0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
52d0: 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65  Cmd, Tcl_NewWide
52e0: 49 6e 74 4f 62 6a 28 69 4b 65 79 31 29 29 3b 0a  IntObj(iKey1));.
52f0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
5300: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43  endElement(0, pC
5310: 6d 64 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49  md, Tcl_NewWideI
5320: 6e 74 4f 62 6a 28 69 4b 65 79 32 29 29 3b 0a 20  ntObj(iKey2));. 
5330: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70   Tcl_EvalObjEx(p
5340: 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64  Db->interp, pCmd
5350: 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43  , TCL_EVAL_DIREC
5360: 54 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65  T);.  Tcl_DecrRe
5370: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 7d 0a  fCount(pCmd);.}.
5380: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
5390: 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54  _ENABLE_PREUPDAT
53a0: 45 5f 48 4f 4f 4b 20 2a 2f 0a 0a 73 74 61 74 69  E_HOOK */..stati
53b0: 63 20 76 6f 69 64 20 44 62 55 70 64 61 74 65 48  c void DbUpdateH
53c0: 61 6e 64 6c 65 72 28 0a 20 20 76 6f 69 64 20 2a  andler(.  void *
53d0: 70 2c 20 0a 20 20 69 6e 74 20 6f 70 2c 0a 20 20  p, .  int op,.  
53e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c  const char *zDb,
53f0: 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
5400: 7a 54 62 6c 2c 20 0a 20 20 73 71 6c 69 74 65 5f  zTbl, .  sqlite_
5410: 69 6e 74 36 34 20 72 6f 77 69 64 0a 29 7b 0a 20  int64 rowid.){. 
5420: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
5430: 20 28 53 71 6c 69 74 65 44 62 20 2a 29 70 3b 0a   (SqliteDb *)p;.
5440: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b    Tcl_Obj *pCmd;
5450: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
5460: 63 68 61 72 20 2a 61 7a 53 74 72 5b 5d 20 3d 20  char *azStr[] = 
5470: 7b 22 44 45 4c 45 54 45 22 2c 20 22 49 4e 53 45  {"DELETE", "INSE
5480: 52 54 22 2c 20 22 55 50 44 41 54 45 22 7d 3b 0a  RT", "UPDATE"};.
5490: 0a 20 20 61 73 73 65 72 74 28 20 28 53 51 4c 49  .  assert( (SQLI
54a0: 54 45 5f 44 45 4c 45 54 45 2d 31 29 2f 39 20 3d  TE_DELETE-1)/9 =
54b0: 3d 20 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  = 0 );.  assert(
54c0: 20 28 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2d   (SQLITE_INSERT-
54d0: 31 29 2f 39 20 3d 3d 20 31 20 29 3b 0a 20 20 61  1)/9 == 1 );.  a
54e0: 73 73 65 72 74 28 20 28 53 51 4c 49 54 45 5f 55  ssert( (SQLITE_U
54f0: 50 44 41 54 45 2d 31 29 2f 39 20 3d 3d 20 32 20  PDATE-1)/9 == 2 
5500: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44  );..  assert( pD
5510: 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 20 29  b->pUpdateHook )
5520: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d  ;.  assert( op==
5530: 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 20 7c 7c  SQLITE_INSERT ||
5540: 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41   op==SQLITE_UPDA
5550: 54 45 20 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54 45  TE || op==SQLITE
5560: 5f 44 45 4c 45 54 45 20 29 3b 0a 0a 20 20 70 43  _DELETE );..  pC
5570: 6d 64 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  md = Tcl_Duplica
5580: 74 65 4f 62 6a 28 70 44 62 2d 3e 70 55 70 64 61  teObj(pDb->pUpda
5590: 74 65 48 6f 6f 6b 29 3b 0a 20 20 54 63 6c 5f 49  teHook);.  Tcl_I
55a0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64  ncrRefCount(pCmd
55b0: 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
55c0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
55d0: 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74   pCmd, Tcl_NewSt
55e0: 72 69 6e 67 4f 62 6a 28 61 7a 53 74 72 5b 28 6f  ringObj(azStr[(o
55f0: 70 2d 31 29 2f 39 5d 2c 20 2d 31 29 29 3b 0a 20  p-1)/9], -1));. 
5600: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
5610: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d  ndElement(0, pCm
5620: 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  d, Tcl_NewString
5630: 4f 62 6a 28 7a 44 62 2c 20 2d 31 29 29 3b 0a 20  Obj(zDb, -1));. 
5640: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
5650: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d  ndElement(0, pCm
5660: 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  d, Tcl_NewString
5670: 4f 62 6a 28 7a 54 62 6c 2c 20 2d 31 29 29 3b 0a  Obj(zTbl, -1));.
5680: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
5690: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43  endElement(0, pC
56a0: 6d 64 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49  md, Tcl_NewWideI
56b0: 6e 74 4f 62 6a 28 72 6f 77 69 64 29 29 3b 0a 20  ntObj(rowid));. 
56c0: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70   Tcl_EvalObjEx(p
56d0: 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64  Db->interp, pCmd
56e0: 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43  , TCL_EVAL_DIREC
56f0: 54 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65  T);.  Tcl_DecrRe
5700: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 7d 0a  fCount(pCmd);.}.
5710: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 63 6c  .static void tcl
5720: 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 28 0a 20  CollateNeeded(. 
5730: 20 76 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20 73   void *pCtx,.  s
5740: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 69 6e  qlite3 *db,.  in
5750: 74 20 65 6e 63 2c 0a 20 20 63 6f 6e 73 74 20 63  t enc,.  const c
5760: 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20  har *zName.){.  
5770: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
5780: 28 53 71 6c 69 74 65 44 62 20 2a 29 70 43 74 78  (SqliteDb *)pCtx
5790: 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63  ;.  Tcl_Obj *pSc
57a0: 72 69 70 74 20 3d 20 54 63 6c 5f 44 75 70 6c 69  ript = Tcl_Dupli
57b0: 63 61 74 65 4f 62 6a 28 70 44 62 2d 3e 70 43 6f  cateObj(pDb->pCo
57c0: 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20  llateNeeded);.  
57d0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
57e0: 28 70 53 63 72 69 70 74 29 3b 0a 20 20 54 63 6c  (pScript);.  Tcl
57f0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
5800: 65 6d 65 6e 74 28 30 2c 20 70 53 63 72 69 70 74  ement(0, pScript
5810: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
5820: 62 6a 28 7a 4e 61 6d 65 2c 20 2d 31 29 29 3b 0a  bj(zName, -1));.
5830: 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28    Tcl_EvalObjEx(
5840: 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 53 63  pDb->interp, pSc
5850: 72 69 70 74 2c 20 30 29 3b 0a 20 20 54 63 6c 5f  ript, 0);.  Tcl_
5860: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63  DecrRefCount(pSc
5870: 72 69 70 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ript);.}../*.** 
5880: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
5890: 63 61 6c 6c 65 64 20 74 6f 20 65 76 61 6c 75 61  called to evalua
58a0: 74 65 20 61 6e 20 53 51 4c 20 63 6f 6c 6c 61 74  te an SQL collat
58b0: 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70  ion function imp
58c0: 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 75 73 69 6e  lemented.** usin
58d0: 67 20 54 43 4c 20 73 63 72 69 70 74 2e 0a 2a 2f  g TCL script..*/
58e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 63 6c 53  .static int tclS
58f0: 71 6c 43 6f 6c 6c 61 74 65 28 0a 20 20 76 6f 69  qlCollate(.  voi
5900: 64 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e  d *pCtx,.  int n
5910: 41 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  A,.  const void 
5920: 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e 42 2c 0a 20  *zA,.  int nB,. 
5930: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 0a   const void *zB.
5940: 29 7b 0a 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20  ){.  SqlCollate 
5950: 2a 70 20 3d 20 28 53 71 6c 43 6f 6c 6c 61 74 65  *p = (SqlCollate
5960: 20 2a 29 70 43 74 78 3b 0a 20 20 54 63 6c 5f 4f   *)pCtx;.  Tcl_O
5970: 62 6a 20 2a 70 43 6d 64 3b 0a 0a 20 20 70 43 6d  bj *pCmd;..  pCm
5980: 64 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  d = Tcl_NewStrin
5990: 67 4f 62 6a 28 70 2d 3e 7a 53 63 72 69 70 74 2c  gObj(p->zScript,
59a0: 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72   -1);.  Tcl_Incr
59b0: 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a  RefCount(pCmd);.
59c0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
59d0: 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d 3e 69 6e  endElement(p->in
59e0: 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 63 6c 5f  terp, pCmd, Tcl_
59f0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 41 2c  NewStringObj(zA,
5a00: 20 6e 41 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73   nA));.  Tcl_Lis
5a10: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
5a20: 74 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d  t(p->interp, pCm
5a30: 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  d, Tcl_NewString
5a40: 4f 62 6a 28 7a 42 2c 20 6e 42 29 29 3b 0a 20 20  Obj(zB, nB));.  
5a50: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d  Tcl_EvalObjEx(p-
5a60: 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54  >interp, pCmd, T
5a70: 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b  CL_EVAL_DIRECT);
5a80: 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  .  Tcl_DecrRefCo
5a90: 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 72 65 74  unt(pCmd);.  ret
5aa0: 75 72 6e 20 28 61 74 6f 69 28 54 63 6c 5f 47 65  urn (atoi(Tcl_Ge
5ab0: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 2d  tStringResult(p-
5ac0: 3e 69 6e 74 65 72 70 29 29 29 3b 0a 7d 0a 0a 2f  >interp)));.}../
5ad0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
5ae0: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 65  e is called to e
5af0: 76 61 6c 75 61 74 65 20 61 6e 20 53 51 4c 20 66  valuate an SQL f
5b00: 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e  unction implemen
5b10: 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20 54 43 4c  ted.** using TCL
5b20: 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 73 74 61 74   script..*/.stat
5b30: 69 63 20 76 6f 69 64 20 74 63 6c 53 71 6c 46 75  ic void tclSqlFu
5b40: 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  nc(sqlite3_conte
5b50: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74  xt *context, int
5b60: 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
5b70: 61 6c 75 65 2a 2a 61 72 67 76 29 7b 0a 20 20 53  alue**argv){.  S
5b80: 71 6c 46 75 6e 63 20 2a 70 20 3d 20 73 71 6c 69  qlFunc *p = sqli
5b90: 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f  te3_user_data(co
5ba0: 6e 74 65 78 74 29 3b 0a 20 20 54 63 6c 5f 4f 62  ntext);.  Tcl_Ob
5bb0: 6a 20 2a 70 43 6d 64 3b 0a 20 20 69 6e 74 20 69  j *pCmd;.  int i
5bc0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
5bd0: 66 28 20 61 72 67 63 3d 3d 30 20 29 7b 0a 20 20  f( argc==0 ){.  
5be0: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
5bf0: 65 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20 74  e no arguments t
5c00: 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c 20  o the function, 
5c10: 63 61 6c 6c 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  call Tcl_EvalObj
5c20: 45 78 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  Ex on the.    **
5c30: 20 73 63 72 69 70 74 20 6f 62 6a 65 63 74 20 64   script object d
5c40: 69 72 65 63 74 6c 79 2e 20 20 54 68 69 73 20 61  irectly.  This a
5c50: 6c 6c 6f 77 73 20 74 68 65 20 54 43 4c 20 63 6f  llows the TCL co
5c60: 6d 70 69 6c 65 72 20 74 6f 20 67 65 6e 65 72 61  mpiler to genera
5c70: 74 65 0a 20 20 20 20 2a 2a 20 62 79 74 65 63 6f  te.    ** byteco
5c80: 64 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 61  de for the comma
5c90: 6e 64 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20  nd on the first 
5ca0: 69 6e 76 6f 63 61 74 69 6f 6e 20 61 6e 64 20 74  invocation and t
5cb0: 68 75 73 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20  hus make.    ** 
5cc0: 73 75 62 73 65 71 75 65 6e 74 20 69 6e 76 6f 63  subsequent invoc
5cd0: 61 74 69 6f 6e 73 20 6d 75 63 68 20 66 61 73 74  ations much fast
5ce0: 65 72 2e 20 2a 2f 0a 20 20 20 20 70 43 6d 64 20  er. */.    pCmd 
5cf0: 3d 20 70 2d 3e 70 53 63 72 69 70 74 3b 0a 20 20  = p->pScript;.  
5d00: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
5d10: 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20 20 72 63  nt(pCmd);.    rc
5d20: 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78   = Tcl_EvalObjEx
5d30: 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64  (p->interp, pCmd
5d40: 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65  , 0);.    Tcl_De
5d50: 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29  crRefCount(pCmd)
5d60: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
5d70: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  * If there are a
5d80: 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20  rguments to the 
5d90: 66 75 6e 63 74 69 6f 6e 2c 20 6d 61 6b 65 20 61  function, make a
5da0: 20 73 68 61 6c 6c 6f 77 20 63 6f 70 79 20 6f 66   shallow copy of
5db0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 63 72 69   the.    ** scri
5dc0: 70 74 20 6f 62 6a 65 63 74 2c 20 6c 61 70 70 65  pt object, lappe
5dd0: 6e 64 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73  nd the arguments
5de0: 2c 20 74 68 65 6e 20 65 76 61 6c 75 61 74 65 20  , then evaluate 
5df0: 74 68 65 20 63 6f 70 79 2e 0a 20 20 20 20 2a 2a  the copy..    **
5e00: 0a 20 20 20 20 2a 2a 20 42 79 20 22 73 68 61 6c  .    ** By "shal
5e10: 6c 6f 77 22 20 63 6f 70 79 2c 20 77 65 20 6d 65  low" copy, we me
5e20: 61 6e 20 61 20 6f 6e 6c 79 20 74 68 65 20 6f 75  an a only the ou
5e30: 74 65 72 20 6c 69 73 74 20 54 63 6c 5f 4f 62 6a  ter list Tcl_Obj
5e40: 20 69 73 20 64 75 70 6c 69 63 61 74 65 64 2e 0a   is duplicated..
5e50: 20 20 20 20 2a 2a 20 54 68 65 20 6e 65 77 20 54      ** The new T
5e60: 63 6c 5f 4f 62 6a 20 63 6f 6e 74 61 69 6e 73 20  cl_Obj contains 
5e70: 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65 20  pointers to the 
5e80: 6f 72 69 67 69 6e 61 6c 20 6c 69 73 74 20 65 6c  original list el
5e90: 65 6d 65 6e 74 73 2e 20 0a 20 20 20 20 2a 2a 20  ements. .    ** 
5ea0: 54 68 61 74 20 77 61 79 2c 20 77 68 65 6e 20 54  That way, when T
5eb0: 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 69 73  cl_EvalObjv() is
5ec0: 20 72 75 6e 20 61 6e 64 20 73 68 69 6d 6d 65 72   run and shimmer
5ed0: 73 20 74 68 65 20 66 69 72 73 74 20 65 6c 65 6d  s the first elem
5ee0: 65 6e 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  ent.    ** of th
5ef0: 65 20 6c 69 73 74 20 74 6f 20 74 63 6c 43 6d 64  e list to tclCmd
5f00: 4e 61 6d 65 54 79 70 65 2c 20 74 68 61 74 20 61  NameType, that a
5f10: 6c 74 65 72 6e 61 74 65 20 72 65 70 72 65 73 65  lternate represe
5f20: 6e 74 61 74 69 6f 6e 20 77 69 6c 6c 0a 20 20 20  ntation will.   
5f30: 20 2a 2a 20 62 65 20 70 72 65 73 65 72 76 65 64   ** be preserved
5f40: 20 61 6e 64 20 72 65 75 73 65 64 20 6f 6e 20 74   and reused on t
5f50: 68 65 20 6e 65 78 74 20 69 6e 76 6f 63 61 74 69  he next invocati
5f60: 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 54  on..    */.    T
5f70: 63 6c 5f 4f 62 6a 20 2a 2a 61 41 72 67 3b 0a 20  cl_Obj **aArg;. 
5f80: 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20     int nArg;.   
5f90: 20 69 66 28 20 54 63 6c 5f 4c 69 73 74 4f 62 6a   if( Tcl_ListObj
5fa0: 47 65 74 45 6c 65 6d 65 6e 74 73 28 70 2d 3e 69  GetElements(p->i
5fb0: 6e 74 65 72 70 2c 20 70 2d 3e 70 53 63 72 69 70  nterp, p->pScrip
5fc0: 74 2c 20 26 6e 41 72 67 2c 20 26 61 41 72 67 29  t, &nArg, &aArg)
5fd0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
5fe0: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63  3_result_error(c
5ff0: 6f 6e 74 65 78 74 2c 20 54 63 6c 5f 47 65 74 53  ontext, Tcl_GetS
6000: 74 72 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69  tringResult(p->i
6010: 6e 74 65 72 70 29 2c 20 2d 31 29 3b 20 0a 20 20  nterp), -1); .  
6020: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
6030: 7d 20 20 20 20 20 0a 20 20 20 20 70 43 6d 64 20  }     .    pCmd 
6040: 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a  = Tcl_NewListObj
6050: 28 6e 41 72 67 2c 20 61 41 72 67 29 3b 0a 20 20  (nArg, aArg);.  
6060: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
6070: 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20 20 66 6f  nt(pCmd);.    fo
6080: 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69  r(i=0; i<argc; i
6090: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
60a0: 65 33 5f 76 61 6c 75 65 20 2a 70 49 6e 20 3d 20  e3_value *pIn = 
60b0: 61 72 67 76 5b 69 5d 3b 0a 20 20 20 20 20 20 54  argv[i];.      T
60c0: 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b 0a 20 20  cl_Obj *pVal;.  
60d0: 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20            .     
60e0: 20 2f 2a 20 53 65 74 20 70 56 61 6c 20 74 6f 20   /* Set pVal to 
60f0: 63 6f 6e 74 61 69 6e 20 74 68 65 20 69 27 74 68  contain the i'th
6100: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 69 73 20   column of this 
6110: 72 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 73 77  row. */.      sw
6120: 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f 76 61  itch( sqlite3_va
6130: 6c 75 65 5f 74 79 70 65 28 70 49 6e 29 20 29 7b  lue_type(pIn) ){
6140: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51  .        case SQ
6150: 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20  LITE_BLOB: {.   
6160: 20 20 20 20 20 20 20 69 6e 74 20 62 79 74 65 73         int bytes
6170: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
6180: 5f 62 79 74 65 73 28 70 49 6e 29 3b 0a 20 20 20  _bytes(pIn);.   
6190: 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63         pVal = Tc
61a0: 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62  l_NewByteArrayOb
61b0: 6a 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  j(sqlite3_value_
61c0: 62 6c 6f 62 28 70 49 6e 29 2c 20 62 79 74 65 73  blob(pIn), bytes
61d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
61e0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
61f0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
6200: 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20  E_INTEGER: {.   
6210: 20 20 20 20 20 20 20 73 71 6c 69 74 65 5f 69 6e         sqlite_in
6220: 74 36 34 20 76 20 3d 20 73 71 6c 69 74 65 33 5f  t64 v = sqlite3_
6230: 76 61 6c 75 65 5f 69 6e 74 36 34 28 70 49 6e 29  value_int64(pIn)
6240: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
6250: 76 3e 3d 2d 32 31 34 37 34 38 33 36 34 37 20 26  v>=-2147483647 &
6260: 26 20 76 3c 3d 32 31 34 37 34 38 33 36 34 37 20  & v<=2147483647 
6270: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
6280: 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 49 6e 74  Val = Tcl_NewInt
6290: 4f 62 6a 28 28 69 6e 74 29 76 29 3b 0a 20 20 20  Obj((int)v);.   
62a0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
62b0: 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d            pVal =
62c0: 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f   Tcl_NewWideIntO
62d0: 62 6a 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  bj(v);.         
62e0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65   }.          bre
62f0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
6300: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
6310: 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20  E_FLOAT: {.     
6320: 20 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20       double r = 
6330: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f  sqlite3_value_do
6340: 75 62 6c 65 28 70 49 6e 29 3b 0a 20 20 20 20 20  uble(pIn);.     
6350: 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f       pVal = Tcl_
6360: 4e 65 77 44 6f 75 62 6c 65 4f 62 6a 28 72 29 3b  NewDoubleObj(r);
6370: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
6380: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6390: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
63a0: 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20  NULL: {.        
63b0: 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77    pVal = Tcl_New
63c0: 53 74 72 69 6e 67 4f 62 6a 28 70 2d 3e 70 44 62  StringObj(p->pDb
63d0: 2d 3e 7a 4e 75 6c 6c 2c 20 2d 31 29 3b 0a 20 20  ->zNull, -1);.  
63e0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
63f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6400: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
6410: 20 20 20 20 20 20 69 6e 74 20 62 79 74 65 73 20        int bytes 
6420: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
6430: 62 79 74 65 73 28 70 49 6e 29 3b 0a 20 20 20 20  bytes(pIn);.    
6440: 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c        pVal = Tcl
6450: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63  _NewStringObj((c
6460: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61  har *)sqlite3_va
6470: 6c 75 65 5f 74 65 78 74 28 70 49 6e 29 2c 20 62  lue_text(pIn), b
6480: 79 74 65 73 29 3b 0a 20 20 20 20 20 20 20 20 20  ytes);.         
6490: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
64a0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
64b0: 72 63 20 3d 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  rc = Tcl_ListObj
64c0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d  AppendElement(p-
64d0: 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 70  >interp, pCmd, p
64e0: 56 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Val);.      if( 
64f0: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  rc ){.        Tc
6500: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
6510: 43 6d 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Cmd);.        sq
6520: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
6530: 6f 72 28 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f  or(context, Tcl_
6540: 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
6550: 70 2d 3e 69 6e 74 65 72 70 29 2c 20 2d 31 29 3b  p->interp), -1);
6560: 20 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e   .        return
6570: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6580: 20 20 20 20 69 66 28 20 21 70 2d 3e 75 73 65 45      if( !p->useE
6590: 76 61 6c 4f 62 6a 76 20 29 7b 0a 20 20 20 20 20  valObjv ){.     
65a0: 20 2f 2a 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45   /* Tcl_EvalObjE
65b0: 78 28 29 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74  x() will automat
65c0: 69 63 61 6c 6c 79 20 63 61 6c 6c 20 54 63 6c 5f  ically call Tcl_
65d0: 45 76 61 6c 4f 62 6a 76 28 29 20 69 66 20 70 43  EvalObjv() if pC
65e0: 6d 64 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61  md.      ** is a
65f0: 20 6c 69 73 74 20 77 69 74 68 6f 75 74 20 61 20   list without a 
6600: 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74  string represent
6610: 61 74 69 6f 6e 2e 20 20 54 6f 20 70 72 65 76 65  ation.  To preve
6620: 6e 74 20 74 68 69 73 20 66 72 6f 6d 0a 20 20 20  nt this from.   
6630: 20 20 20 2a 2a 20 68 61 70 70 65 6e 69 6e 67 2c     ** happening,
6640: 20 6d 61 6b 65 20 73 75 72 65 20 70 43 6d 64 20   make sure pCmd 
6650: 68 61 73 20 61 20 76 61 6c 69 64 20 73 74 72 69  has a valid stri
6660: 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ng representatio
6670: 6e 20 2a 2f 0a 20 20 20 20 20 20 54 63 6c 5f 47  n */.      Tcl_G
6680: 65 74 53 74 72 69 6e 67 28 70 43 6d 64 29 3b 0a  etString(pCmd);.
6690: 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 54      }.    rc = T
66a0: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e  cl_EvalObjEx(p->
66b0: 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 43  interp, pCmd, TC
66c0: 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a  L_EVAL_DIRECT);.
66d0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
66e0: 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 7d 0a  ount(pCmd);.  }.
66f0: 0a 20 20 69 66 28 20 72 63 20 26 26 20 72 63 21  .  if( rc && rc!
6700: 3d 54 43 4c 5f 52 45 54 55 52 4e 20 29 7b 0a 20  =TCL_RETURN ){. 
6710: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
6720: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
6730: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65   Tcl_GetStringRe
6740: 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c  sult(p->interp),
6750: 20 2d 31 29 3b 20 0a 20 20 7d 65 6c 73 65 7b 0a   -1); .  }else{.
6760: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61      Tcl_Obj *pVa
6770: 72 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65  r = Tcl_GetObjRe
6780: 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 3b  sult(p->interp);
6790: 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
67a0: 75 38 20 2a 64 61 74 61 3b 0a 20 20 20 20 63 6f  u8 *data;.    co
67b0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20  nst char *zType 
67c0: 3d 20 28 70 56 61 72 2d 3e 74 79 70 65 50 74 72  = (pVar->typePtr
67d0: 20 3f 20 70 56 61 72 2d 3e 74 79 70 65 50 74 72   ? pVar->typePtr
67e0: 2d 3e 6e 61 6d 65 20 3a 20 22 22 29 3b 0a 20 20  ->name : "");.  
67f0: 20 20 63 68 61 72 20 63 20 3d 20 7a 54 79 70 65    char c = zType
6800: 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d  [0];.    if( c==
6810: 27 62 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54  'b' && strcmp(zT
6820: 79 70 65 2c 22 62 79 74 65 61 72 72 61 79 22 29  ype,"bytearray")
6830: 3d 3d 30 20 26 26 20 70 56 61 72 2d 3e 62 79 74  ==0 && pVar->byt
6840: 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  es==0 ){.      /
6850: 2a 20 4f 6e 6c 79 20 72 65 74 75 72 6e 20 61 20  * Only return a 
6860: 42 4c 4f 42 20 74 79 70 65 20 69 66 20 74 68 65  BLOB type if the
6870: 20 54 63 6c 20 76 61 72 69 61 62 6c 65 20 69 73   Tcl variable is
6880: 20 61 20 62 79 74 65 61 72 72 61 79 20 61 6e 64   a bytearray and
6890: 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f  .      ** has no
68a0: 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e   string represen
68b0: 74 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20  tation. */.     
68c0: 20 64 61 74 61 20 3d 20 54 63 6c 5f 47 65 74 42   data = Tcl_GetB
68d0: 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28  yteArrayFromObj(
68e0: 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20  pVar, &n);.     
68f0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
6900: 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20 64 61  blob(context, da
6910: 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 54 52  ta, n, SQLITE_TR
6920: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d 65  ANSIENT);.    }e
6930: 6c 73 65 20 69 66 28 20 63 3d 3d 27 62 27 20 26  lse if( c=='b' &
6940: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
6950: 62 6f 6f 6c 65 61 6e 22 29 3d 3d 30 20 29 7b 0a  boolean")==0 ){.
6960: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 49 6e 74        Tcl_GetInt
6970: 46 72 6f 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c  FromObj(0, pVar,
6980: 20 26 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   &n);.      sqli
6990: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63  te3_result_int(c
69a0: 6f 6e 74 65 78 74 2c 20 6e 29 3b 0a 20 20 20 20  ontext, n);.    
69b0: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 64 27  }else if( c=='d'
69c0: 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65   && strcmp(zType
69d0: 2c 22 64 6f 75 62 6c 65 22 29 3d 3d 30 20 29 7b  ,"double")==0 ){
69e0: 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 3b  .      double r;
69f0: 0a 20 20 20 20 20 20 54 63 6c 5f 47 65 74 44 6f  .      Tcl_GetDo
6a00: 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 30 2c 20 70  ubleFromObj(0, p
6a10: 56 61 72 2c 20 26 72 29 3b 0a 20 20 20 20 20 20  Var, &r);.      
6a20: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64  sqlite3_result_d
6a30: 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 72  ouble(context, r
6a40: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
6a50: 20 28 63 3d 3d 27 77 27 20 26 26 20 73 74 72 63   (c=='w' && strc
6a60: 6d 70 28 7a 54 79 70 65 2c 22 77 69 64 65 49 6e  mp(zType,"wideIn
6a70: 74 22 29 3d 3d 30 29 20 7c 7c 0a 20 20 20 20 20  t")==0) ||.     
6a80: 20 20 20 20 20 28 63 3d 3d 27 69 27 20 26 26 20       (c=='i' && 
6a90: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 69 6e  strcmp(zType,"in
6aa0: 74 22 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20  t")==0) ){.     
6ab0: 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 76 3b 0a   Tcl_WideInt v;.
6ac0: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 57 69 64        Tcl_GetWid
6ad0: 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 30 2c 20 70  eIntFromObj(0, p
6ae0: 56 61 72 2c 20 26 76 29 3b 0a 20 20 20 20 20 20  Var, &v);.      
6af0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
6b00: 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 76 29  nt64(context, v)
6b10: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
6b20: 20 20 20 64 61 74 61 20 3d 20 28 75 6e 73 69 67     data = (unsig
6b30: 6e 65 64 20 63 68 61 72 20 2a 29 54 63 6c 5f 47  ned char *)Tcl_G
6b40: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
6b50: 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20  pVar, &n);.     
6b60: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
6b70: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 28 63  text(context, (c
6b80: 68 61 72 20 2a 29 64 61 74 61 2c 20 6e 2c 20 53  har *)data, n, S
6b90: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
6ba0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23  ;.    }.  }.}..#
6bb0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
6bc0: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
6bd0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  ./*.** This is t
6be0: 68 65 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f  he authenticatio
6bf0: 6e 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49 74 20  n function.  It 
6c00: 61 70 70 65 6e 64 73 20 74 68 65 20 61 75 74 68  appends the auth
6c10: 65 6e 74 69 63 61 74 69 6f 6e 0a 2a 2a 20 74 79  entication.** ty
6c20: 70 65 20 63 6f 64 65 20 61 6e 64 20 74 68 65 20  pe code and the 
6c30: 74 77 6f 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  two arguments to
6c40: 20 7a 43 6d 64 5b 5d 20 74 68 65 6e 20 69 6e 76   zCmd[] then inv
6c50: 6f 6b 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a  okes the result.
6c60: 2a 2a 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 70  ** on the interp
6c70: 72 65 74 65 72 2e 20 20 54 68 65 20 72 65 70 6c  reter.  The repl
6c80: 79 20 69 73 20 65 78 61 6d 69 6e 65 64 20 74 6f  y is examined to
6c90: 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
6ca0: 65 0a 2a 2a 20 61 75 74 68 65 6e 74 69 63 61 74  e.** authenticat
6cb0: 69 6f 6e 20 66 61 69 6c 73 20 6f 72 20 73 75 63  ion fails or suc
6cc0: 63 65 65 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ceeds..*/.static
6cd0: 20 69 6e 74 20 61 75 74 68 5f 63 61 6c 6c 62 61   int auth_callba
6ce0: 63 6b 28 0a 20 20 76 6f 69 64 20 2a 70 41 72 67  ck(.  void *pArg
6cf0: 2c 0a 20 20 69 6e 74 20 63 6f 64 65 2c 0a 20 20  ,.  int code,.  
6d00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
6d10: 31 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  1,.  const char 
6d20: 2a 7a 41 72 67 32 2c 0a 20 20 63 6f 6e 73 74 20  *zArg2,.  const 
6d30: 63 68 61 72 20 2a 7a 41 72 67 33 2c 0a 20 20 63  char *zArg3,.  c
6d40: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 34  onst char *zArg4
6d50: 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 64  .){.  char *zCod
6d60: 65 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  e;.  Tcl_DString
6d70: 20 73 74 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   str;.  int rc;.
6d80: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52    const char *zR
6d90: 65 70 6c 79 3b 0a 20 20 53 71 6c 69 74 65 44 62  eply;.  SqliteDb
6da0: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
6db0: 62 2a 29 70 41 72 67 3b 0a 20 20 69 66 28 20 70  b*)pArg;.  if( p
6dc0: 44 62 2d 3e 64 69 73 61 62 6c 65 41 75 74 68 20  Db->disableAuth 
6dd0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
6de0: 4f 4b 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 63  OK;..  switch( c
6df0: 6f 64 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ode ){.    case 
6e00: 53 51 4c 49 54 45 5f 43 4f 50 59 20 20 20 20 20  SQLITE_COPY     
6e10: 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65           : zCode
6e20: 3d 22 53 51 4c 49 54 45 5f 43 4f 50 59 22 3b 20  ="SQLITE_COPY"; 
6e30: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
6e40: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e  SQLITE_CREATE_IN
6e50: 44 45 58 20 20 20 20 20 20 3a 20 7a 43 6f 64 65  DEX      : zCode
6e60: 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  ="SQLITE_CREATE_
6e70: 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20  INDEX"; break;. 
6e80: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
6e90: 52 45 41 54 45 5f 54 41 42 4c 45 20 20 20 20 20  REATE_TABLE     
6ea0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
6eb0: 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 22 3b 20  _CREATE_TABLE"; 
6ec0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
6ed0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
6ee0: 4d 50 5f 49 4e 44 45 58 20 3a 20 7a 43 6f 64 65  MP_INDEX : zCode
6ef0: 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  ="SQLITE_CREATE_
6f00: 54 45 4d 50 5f 49 4e 44 45 58 22 3b 20 62 72 65  TEMP_INDEX"; bre
6f10: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
6f20: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
6f30: 54 41 42 4c 45 20 3a 20 7a 43 6f 64 65 3d 22 53  TABLE : zCode="S
6f40: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
6f50: 50 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b  P_TABLE"; break;
6f60: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
6f70: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 52 49  _CREATE_TEMP_TRI
6f80: 47 47 45 52 3a 20 7a 43 6f 64 65 3d 22 53 51 4c  GGER: zCode="SQL
6f90: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
6fa0: 54 52 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b  TRIGGER"; break;
6fb0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
6fc0: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45  _CREATE_TEMP_VIE
6fd0: 57 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49  W  : zCode="SQLI
6fe0: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56  TE_CREATE_TEMP_V
6ff0: 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  IEW"; break;.   
7000: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45   case SQLITE_CRE
7010: 41 54 45 5f 54 52 49 47 47 45 52 20 20 20 20 3a  ATE_TRIGGER    :
7020: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43   zCode="SQLITE_C
7030: 52 45 41 54 45 5f 54 52 49 47 47 45 52 22 3b 20  REATE_TRIGGER"; 
7040: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
7050: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49  SQLITE_CREATE_VI
7060: 45 57 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65  EW       : zCode
7070: 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  ="SQLITE_CREATE_
7080: 56 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20  VIEW"; break;.  
7090: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 45    case SQLITE_DE
70a0: 4c 45 54 45 20 20 20 20 20 20 20 20 20 20 20 20  LETE            
70b0: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
70c0: 44 45 4c 45 54 45 22 3b 20 62 72 65 61 6b 3b 0a  DELETE"; break;.
70d0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
70e0: 44 52 4f 50 5f 49 4e 44 45 58 20 20 20 20 20 20  DROP_INDEX      
70f0: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
7100: 45 5f 44 52 4f 50 5f 49 4e 44 45 58 22 3b 20 62  E_DROP_INDEX"; b
7110: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
7120: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45  QLITE_DROP_TABLE
7130: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
7140: 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42  "SQLITE_DROP_TAB
7150: 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  LE"; break;.    
7160: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50  case SQLITE_DROP
7170: 5f 54 45 4d 50 5f 49 4e 44 45 58 20 20 20 3a 20  _TEMP_INDEX   : 
7180: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52  zCode="SQLITE_DR
7190: 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 22 3b 20  OP_TEMP_INDEX"; 
71a0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
71b0: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
71c0: 5f 54 41 42 4c 45 20 20 20 3a 20 7a 43 6f 64 65  _TABLE   : zCode
71d0: 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  ="SQLITE_DROP_TE
71e0: 4d 50 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b  MP_TABLE"; break
71f0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
7200: 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 52 49 47  E_DROP_TEMP_TRIG
7210: 47 45 52 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c  GER : zCode="SQL
7220: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 52  ITE_DROP_TEMP_TR
7230: 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20  IGGER"; break;. 
7240: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
7250: 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 20 20 20  ROP_TEMP_VIEW   
7260: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
7270: 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 22  _DROP_TEMP_VIEW"
7280: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
7290: 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 52  e SQLITE_DROP_TR
72a0: 49 47 47 45 52 20 20 20 20 20 20 3a 20 7a 43 6f  IGGER      : zCo
72b0: 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f  de="SQLITE_DROP_
72c0: 54 52 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b  TRIGGER"; break;
72d0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
72e0: 5f 44 52 4f 50 5f 56 49 45 57 20 20 20 20 20 20  _DROP_VIEW      
72f0: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
7300: 54 45 5f 44 52 4f 50 5f 56 49 45 57 22 3b 20 62  TE_DROP_VIEW"; b
7310: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
7320: 51 4c 49 54 45 5f 49 4e 53 45 52 54 20 20 20 20  QLITE_INSERT    
7330: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
7340: 22 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 22 3b  "SQLITE_INSERT";
7350: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
7360: 20 53 51 4c 49 54 45 5f 50 52 41 47 4d 41 20 20   SQLITE_PRAGMA  
7370: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
7380: 65 3d 22 53 51 4c 49 54 45 5f 50 52 41 47 4d 41  e="SQLITE_PRAGMA
7390: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
73a0: 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 20 20  se SQLITE_READ  
73b0: 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43              : zC
73c0: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 52 45 41 44  ode="SQLITE_READ
73d0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
73e0: 73 65 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54  se SQLITE_SELECT
73f0: 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43              : zC
7400: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 53 45 4c 45  ode="SQLITE_SELE
7410: 43 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  CT"; break;.    
7420: 63 61 73 65 20 53 51 4c 49 54 45 5f 54 52 41 4e  case SQLITE_TRAN
7430: 53 41 43 54 49 4f 4e 20 20 20 20 20 20 20 3a 20  SACTION       : 
7440: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 54 52  zCode="SQLITE_TR
7450: 41 4e 53 41 43 54 49 4f 4e 22 3b 20 62 72 65 61  ANSACTION"; brea
7460: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
7470: 54 45 5f 55 50 44 41 54 45 20 20 20 20 20 20 20  TE_UPDATE       
7480: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
7490: 4c 49 54 45 5f 55 50 44 41 54 45 22 3b 20 62 72  LITE_UPDATE"; br
74a0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
74b0: 4c 49 54 45 5f 41 54 54 41 43 48 20 20 20 20 20  LITE_ATTACH     
74c0: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
74d0: 53 51 4c 49 54 45 5f 41 54 54 41 43 48 22 3b 20  SQLITE_ATTACH"; 
74e0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
74f0: 53 51 4c 49 54 45 5f 44 45 54 41 43 48 20 20 20  SQLITE_DETACH   
7500: 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65           : zCode
7510: 3d 22 53 51 4c 49 54 45 5f 44 45 54 41 43 48 22  ="SQLITE_DETACH"
7520: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
7530: 65 20 53 51 4c 49 54 45 5f 41 4c 54 45 52 5f 54  e SQLITE_ALTER_T
7540: 41 42 4c 45 20 20 20 20 20 20 20 3a 20 7a 43 6f  ABLE       : zCo
7550: 64 65 3d 22 53 51 4c 49 54 45 5f 41 4c 54 45 52  de="SQLITE_ALTER
7560: 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a  _TABLE"; break;.
7570: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
7580: 52 45 49 4e 44 45 58 20 20 20 20 20 20 20 20 20  REINDEX         
7590: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
75a0: 45 5f 52 45 49 4e 44 45 58 22 3b 20 62 72 65 61  E_REINDEX"; brea
75b0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
75c0: 54 45 5f 41 4e 41 4c 59 5a 45 20 20 20 20 20 20  TE_ANALYZE      
75d0: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
75e0: 4c 49 54 45 5f 41 4e 41 4c 59 5a 45 22 3b 20 62  LITE_ANALYZE"; b
75f0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
7600: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 54 41  QLITE_CREATE_VTA
7610: 42 4c 45 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d  BLE     : zCode=
7620: 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56  "SQLITE_CREATE_V
7630: 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20  TABLE"; break;. 
7640: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
7650: 52 4f 50 5f 56 54 41 42 4c 45 20 20 20 20 20 20  ROP_VTABLE      
7660: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
7670: 5f 44 52 4f 50 5f 56 54 41 42 4c 45 22 3b 20 62  _DROP_VTABLE"; b
7680: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
7690: 51 4c 49 54 45 5f 46 55 4e 43 54 49 4f 4e 20 20  QLITE_FUNCTION  
76a0: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
76b0: 22 53 51 4c 49 54 45 5f 46 55 4e 43 54 49 4f 4e  "SQLITE_FUNCTION
76c0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
76d0: 73 65 20 53 51 4c 49 54 45 5f 53 41 56 45 50 4f  se SQLITE_SAVEPO
76e0: 49 4e 54 20 20 20 20 20 20 20 20 20 3a 20 7a 43  INT         : zC
76f0: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 53 41 56 45  ode="SQLITE_SAVE
7700: 50 4f 49 4e 54 22 3b 20 62 72 65 61 6b 3b 0a 20  POINT"; break;. 
7710: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52     case SQLITE_R
7720: 45 43 55 52 53 49 56 45 20 20 20 20 20 20 20 20  ECURSIVE        
7730: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
7740: 5f 52 45 43 55 52 53 49 56 45 22 3b 20 62 72 65  _RECURSIVE"; bre
7750: 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 20  ak;.    default 
7760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7770: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 3f        : zCode="?
7780: 3f 3f 3f 22 3b 20 62 72 65 61 6b 3b 0a 20 20 7d  ???"; break;.  }
7790: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e  .  Tcl_DStringIn
77a0: 69 74 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f  it(&str);.  Tcl_
77b0: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 73  DStringAppend(&s
77c0: 74 72 2c 20 70 44 62 2d 3e 7a 41 75 74 68 2c 20  tr, pDb->zAuth, 
77d0: 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  -1);.  Tcl_DStri
77e0: 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  ngAppendElement(
77f0: 26 73 74 72 2c 20 7a 43 6f 64 65 29 3b 0a 20 20  &str, zCode);.  
7800: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
7810: 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a  dElement(&str, z
7820: 41 72 67 31 20 3f 20 7a 41 72 67 31 20 3a 20 22  Arg1 ? zArg1 : "
7830: 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  ");.  Tcl_DStrin
7840: 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26  gAppendElement(&
7850: 73 74 72 2c 20 7a 41 72 67 32 20 3f 20 7a 41 72  str, zArg2 ? zAr
7860: 67 32 20 3a 20 22 22 29 3b 0a 20 20 54 63 6c 5f  g2 : "");.  Tcl_
7870: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65  DStringAppendEle
7880: 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41 72 67 33  ment(&str, zArg3
7890: 20 3f 20 7a 41 72 67 33 20 3a 20 22 22 29 3b 0a   ? zArg3 : "");.
78a0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
78b0: 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c  endElement(&str,
78c0: 20 7a 41 72 67 34 20 3f 20 7a 41 72 67 34 20 3a   zArg4 ? zArg4 :
78d0: 20 22 22 29 3b 0a 20 20 72 63 20 3d 20 54 63 6c   "");.  rc = Tcl
78e0: 5f 47 6c 6f 62 61 6c 45 76 61 6c 28 70 44 62 2d  _GlobalEval(pDb-
78f0: 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53 74  >interp, Tcl_DSt
7900: 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29 29  ringValue(&str))
7910: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46  ;.  Tcl_DStringF
7920: 72 65 65 28 26 73 74 72 29 3b 0a 20 20 7a 52 65  ree(&str);.  zRe
7930: 70 6c 79 20 3d 20 72 63 3d 3d 54 43 4c 5f 4f 4b  ply = rc==TCL_OK
7940: 20 3f 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   ? Tcl_GetString
7950: 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65  Result(pDb->inte
7960: 72 70 29 20 3a 20 22 53 51 4c 49 54 45 5f 44 45  rp) : "SQLITE_DE
7970: 4e 59 22 3b 0a 20 20 69 66 28 20 73 74 72 63 6d  NY";.  if( strcm
7980: 70 28 7a 52 65 70 6c 79 2c 22 53 51 4c 49 54 45  p(zReply,"SQLITE
7990: 5f 4f 4b 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  _OK")==0 ){.    
79a0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
79b0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
79c0: 6d 70 28 7a 52 65 70 6c 79 2c 22 53 51 4c 49 54  mp(zReply,"SQLIT
79d0: 45 5f 44 45 4e 59 22 29 3d 3d 30 20 29 7b 0a 20  E_DENY")==0 ){. 
79e0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
79f0: 45 4e 59 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ENY;.  }else if(
7a00: 20 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22   strcmp(zReply,"
7a10: 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 22 29 3d  SQLITE_IGNORE")=
7a20: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
7a30: 51 4c 49 54 45 5f 49 47 4e 4f 52 45 3b 0a 20 20  QLITE_IGNORE;.  
7a40: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
7a50: 39 39 39 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  999;.  }.  retur
7a60: 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
7a70: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  * SQLITE_OMIT_AU
7a80: 54 48 4f 52 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a  THORIZATION */..
7a90: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
7aa0: 6e 65 20 72 65 61 64 73 20 61 20 6c 69 6e 65 20  ne reads a line 
7ab0: 6f 66 20 74 65 78 74 20 66 72 6f 6d 20 46 49 4c  of text from FIL
7ac0: 45 20 69 6e 2c 20 73 74 6f 72 65 73 0a 2a 2a 20  E in, stores.** 
7ad0: 74 68 65 20 74 65 78 74 20 69 6e 20 6d 65 6d 6f  the text in memo
7ae0: 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
7af0: 20 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 72 65   malloc() and re
7b00: 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a  turns a pointer.
7b10: 2a 2a 20 74 6f 20 74 68 65 20 74 65 78 74 2e 20  ** to the text. 
7b20: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
7b30: 64 20 61 74 20 65 6e 64 20 6f 66 20 66 69 6c 65  d at end of file
7b40: 2c 20 6f 72 20 69 66 20 6d 61 6c 6c 6f 63 28 29  , or if malloc()
7b50: 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a  .** fails..**.**
7b60: 20 54 68 65 20 69 6e 74 65 72 66 61 63 65 20 69   The interface i
7b70: 73 20 6c 69 6b 65 20 22 72 65 61 64 6c 69 6e 65  s like "readline
7b80: 22 20 62 75 74 20 6e 6f 20 63 6f 6d 6d 61 6e 64  " but no command
7b90: 2d 6c 69 6e 65 20 65 64 69 74 69 6e 67 0a 2a 2a  -line editing.**
7ba0: 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20   is done..**.** 
7bb0: 63 6f 70 69 65 64 20 66 72 6f 6d 20 73 68 65 6c  copied from shel
7bc0: 6c 2e 63 20 66 72 6f 6d 20 27 2e 69 6d 70 6f 72  l.c from '.impor
7bd0: 74 27 20 63 6f 6d 6d 61 6e 64 0a 2a 2f 0a 73 74  t' command.*/.st
7be0: 61 74 69 63 20 63 68 61 72 20 2a 6c 6f 63 61 6c  atic char *local
7bf0: 5f 67 65 74 6c 69 6e 65 28 63 68 61 72 20 2a 7a  _getline(char *z
7c00: 50 72 6f 6d 70 74 2c 20 46 49 4c 45 20 2a 69 6e  Prompt, FILE *in
7c10: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 69 6e 65  ){.  char *zLine
7c20: 3b 0a 20 20 69 6e 74 20 6e 4c 69 6e 65 3b 0a 20  ;.  int nLine;. 
7c30: 20 69 6e 74 20 6e 3b 0a 0a 20 20 6e 4c 69 6e 65   int n;..  nLine
7c40: 20 3d 20 31 30 30 3b 0a 20 20 7a 4c 69 6e 65 20   = 100;.  zLine 
7c50: 3d 20 6d 61 6c 6c 6f 63 28 20 6e 4c 69 6e 65 20  = malloc( nLine 
7c60: 29 3b 0a 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d  );.  if( zLine==
7c70: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
7c80: 6e 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  n = 0;.  while( 
7c90: 31 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 2b 31  1 ){.    if( n+1
7ca0: 30 30 3e 6e 4c 69 6e 65 20 29 7b 0a 20 20 20 20  00>nLine ){.    
7cb0: 20 20 6e 4c 69 6e 65 20 3d 20 6e 4c 69 6e 65 2a    nLine = nLine*
7cc0: 32 20 2b 20 31 30 30 3b 0a 20 20 20 20 20 20 7a  2 + 100;.      z
7cd0: 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28 7a  Line = realloc(z
7ce0: 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29 3b 0a 20 20  Line, nLine);.  
7cf0: 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d 30      if( zLine==0
7d00: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
7d10: 20 7d 0a 20 20 20 20 69 66 28 20 66 67 65 74 73   }.    if( fgets
7d20: 28 26 7a 4c 69 6e 65 5b 6e 5d 2c 20 6e 4c 69 6e  (&zLine[n], nLin
7d30: 65 20 2d 20 6e 2c 20 69 6e 29 3d 3d 30 20 29 7b  e - n, in)==0 ){
7d40: 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20  .      if( n==0 
7d50: 29 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 28  ){.        free(
7d60: 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20  zLine);.        
7d70: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
7d80: 7d 0a 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d  }.      zLine[n]
7d90: 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   = 0;.      brea
7da0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69  k;.    }.    whi
7db0: 6c 65 28 20 7a 4c 69 6e 65 5b 6e 5d 20 29 7b 20  le( zLine[n] ){ 
7dc0: 6e 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 6e  n++; }.    if( n
7dd0: 3e 30 20 26 26 20 7a 4c 69 6e 65 5b 6e 2d 31 5d  >0 && zLine[n-1]
7de0: 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20  =='\n' ){.      
7df0: 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a 4c 69 6e 65  n--;.      zLine
7e00: 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 62  [n] = 0;.      b
7e10: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
7e20: 20 20 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f    zLine = reallo
7e30: 63 28 20 7a 4c 69 6e 65 2c 20 6e 2b 31 20 29 3b  c( zLine, n+1 );
7e40: 0a 20 20 72 65 74 75 72 6e 20 7a 4c 69 6e 65 3b  .  return zLine;
7e50: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
7e60: 66 75 6e 63 74 69 6f 6e 20 69 73 20 70 61 72 74  function is part
7e70: 20 6f 66 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e   of the implemen
7e80: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f  tation of the co
7e90: 6d 6d 61 6e 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 24  mmand:.**.**   $
7ea0: 64 62 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 5b  db transaction [
7eb0: 2d 64 65 66 65 72 72 65 64 7c 2d 69 6d 6d 65 64  -deferred|-immed
7ec0: 69 61 74 65 7c 2d 65 78 63 6c 75 73 69 76 65 5d  iate|-exclusive]
7ed0: 20 53 43 52 49 50 54 0a 2a 2a 0a 2a 2a 20 49 74   SCRIPT.**.** It
7ee0: 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 66 74 65   is invoked afte
7ef0: 72 20 65 76 61 6c 75 61 74 69 6e 67 20 74 68 65  r evaluating the
7f00: 20 73 63 72 69 70 74 20 53 43 52 49 50 54 20 74   script SCRIPT t
7f10: 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c  o commit or roll
7f20: 62 61 63 6b 0a 2a 2a 20 74 68 65 20 74 72 61 6e  back.** the tran
7f30: 73 61 63 74 69 6f 6e 20 6f 72 20 73 61 76 65 70  saction or savep
7f40: 6f 69 6e 74 20 6f 70 65 6e 65 64 20 62 79 20 74  oint opened by t
7f50: 68 65 20 5b 74 72 61 6e 73 61 63 74 69 6f 6e 5d  he [transaction]
7f60: 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61   command..*/.sta
7f70: 74 69 63 20 69 6e 74 20 44 62 54 72 61 6e 73 50  tic int DbTransP
7f80: 6f 73 74 43 6d 64 28 0a 20 20 43 6c 69 65 6e 74  ostCmd(.  Client
7f90: 44 61 74 61 20 64 61 74 61 5b 5d 2c 20 20 20 20  Data data[],    
7fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7fb0: 2a 20 64 61 74 61 5b 30 5d 20 69 73 20 74 68 65  * data[0] is the
7fc0: 20 53 71 6c 69 74 65 33 44 62 2a 20 66 6f 72 20   Sqlite3Db* for 
7fd0: 24 64 62 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  $db */.  Tcl_Int
7fe0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
7ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8000: 20 54 63 6c 20 69 6e 74 65 72 70 72 65 74 65 72   Tcl interpreter
8010: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 75 6c 74   */.  int result
8020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8030: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
8040: 73 75 6c 74 20 6f 66 20 65 76 61 6c 75 61 74 69  sult of evaluati
8050: 6e 67 20 53 43 52 49 50 54 20 2a 2f 0a 29 7b 0a  ng SCRIPT */.){.
8060: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
8070: 68 61 72 20 2a 61 7a 45 6e 64 5b 5d 20 3d 20 7b  har *azEnd[] = {
8080: 0a 20 20 20 20 22 52 45 4c 45 41 53 45 20 5f 74  .    "RELEASE _t
8090: 63 6c 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22 2c  cl_transaction",
80a0: 20 20 20 20 20 20 20 20 2f 2a 20 72 63 3d 3d 54          /* rc==T
80b0: 43 4c 5f 45 52 52 4f 52 2c 20 6e 54 72 61 6e 73  CL_ERROR, nTrans
80c0: 61 63 74 69 6f 6e 21 3d 30 20 2a 2f 0a 20 20 20  action!=0 */.   
80d0: 20 22 43 4f 4d 4d 49 54 22 2c 20 20 20 20 20 20   "COMMIT",      
80e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80f0: 20 20 20 20 2f 2a 20 72 63 21 3d 54 43 4c 5f 45      /* rc!=TCL_E
8100: 52 52 4f 52 2c 20 6e 54 72 61 6e 73 61 63 74 69  RROR, nTransacti
8110: 6f 6e 3d 3d 30 20 2a 2f 0a 20 20 20 20 22 52 4f  on==0 */.    "RO
8120: 4c 4c 42 41 43 4b 20 54 4f 20 5f 74 63 6c 5f 74  LLBACK TO _tcl_t
8130: 72 61 6e 73 61 63 74 69 6f 6e 20 3b 20 52 45 4c  ransaction ; REL
8140: 45 41 53 45 20 5f 74 63 6c 5f 74 72 61 6e 73 61  EASE _tcl_transa
8150: 63 74 69 6f 6e 22 2c 0a 20 20 20 20 22 52 4f 4c  ction",.    "ROL
8160: 4c 42 41 43 4b 22 20 20 20 20 20 20 20 20 20 20  LBACK"          
8170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8180: 2a 20 72 63 3d 3d 54 43 4c 5f 45 52 52 4f 52 2c  * rc==TCL_ERROR,
8190: 20 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 30   nTransaction==0
81a0: 20 2a 2f 0a 20 20 7d 3b 0a 20 20 53 71 6c 69 74   */.  };.  Sqlit
81b0: 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69  eDb *pDb = (Sqli
81c0: 74 65 44 62 2a 29 64 61 74 61 5b 30 5d 3b 0a 20  teDb*)data[0];. 
81d0: 20 69 6e 74 20 72 63 20 3d 20 72 65 73 75 6c 74   int rc = result
81e0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
81f0: 7a 45 6e 64 3b 0a 0a 20 20 70 44 62 2d 3e 6e 54  zEnd;..  pDb->nT
8200: 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20  ransaction--;.  
8210: 7a 45 6e 64 20 3d 20 61 7a 45 6e 64 5b 28 72 63  zEnd = azEnd[(rc
8220: 3d 3d 54 43 4c 5f 45 52 52 4f 52 29 2a 32 20 2b  ==TCL_ERROR)*2 +
8230: 20 28 70 44 62 2d 3e 6e 54 72 61 6e 73 61 63 74   (pDb->nTransact
8240: 69 6f 6e 3d 3d 30 29 5d 3b 0a 0a 20 20 70 44 62  ion==0)];..  pDb
8250: 2d 3e 64 69 73 61 62 6c 65 41 75 74 68 2b 2b 3b  ->disableAuth++;
8260: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 65  .  if( sqlite3_e
8270: 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a 45 6e  xec(pDb->db, zEn
8280: 64 2c 20 30 2c 20 30 2c 20 30 29 20 29 7b 0a 20  d, 0, 0, 0) ){. 
8290: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20       /* This is 
82a0: 61 20 74 72 69 63 6b 79 20 73 63 65 6e 61 72 69  a tricky scenari
82b0: 6f 20 74 6f 20 68 61 6e 64 6c 65 2e 20 54 68 65  o to handle. The
82c0: 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 63 61 75   most likely cau
82d0: 73 65 20 6f 66 20 61 6e 0a 20 20 20 20 20 20 2a  se of an.      *
82e0: 2a 20 65 72 72 6f 72 20 69 73 20 74 68 61 74 20  * error is that 
82f0: 74 68 65 20 65 78 65 63 28 29 20 61 62 6f 76 65  the exec() above
8300: 20 77 61 73 20 61 6e 20 61 74 74 65 6d 70 74 20   was an attempt 
8310: 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 0a 20  to commit the . 
8320: 20 20 20 20 20 2a 2a 20 74 6f 70 2d 6c 65 76 65       ** top-leve
8330: 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  l transaction th
8340: 61 74 20 72 65 74 75 72 6e 65 64 20 53 51 4c 49  at returned SQLI
8350: 54 45 5f 42 55 53 59 2e 20 4f 72 2c 20 6c 65 73  TE_BUSY. Or, les
8360: 73 20 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 20 20  s likely,.      
8370: 2a 2a 20 74 68 61 74 20 61 6e 20 49 4f 2d 65 72  ** that an IO-er
8380: 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64  ror has occurred
8390: 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65  . In either case
83a0: 2c 20 74 68 72 6f 77 20 61 20 54 63 6c 20 65 78  , throw a Tcl ex
83b0: 63 65 70 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  ception.      **
83c0: 20 61 6e 64 20 74 72 79 20 74 6f 20 72 6f 6c 6c   and try to roll
83d0: 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63  back the transac
83e0: 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  tion..      **. 
83f0: 20 20 20 20 20 2a 2a 20 42 75 74 20 69 74 20 63       ** But it c
8400: 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 74 68 61  ould also be tha
8410: 74 20 74 68 65 20 75 73 65 72 20 65 78 65 63 75  t the user execu
8420: 74 65 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ted one or more 
8430: 42 45 47 49 4e 2c 20 0a 20 20 20 20 20 20 2a 2a  BEGIN, .      **
8440: 20 43 4f 4d 4d 49 54 2c 20 53 41 56 45 50 4f 49   COMMIT, SAVEPOI
8450: 4e 54 2c 20 52 45 4c 45 41 53 45 20 6f 72 20 52  NT, RELEASE or R
8460: 4f 4c 4c 42 41 43 4b 20 63 6f 6d 6d 61 6e 64 73  OLLBACK commands
8470: 20 74 68 61 74 20 61 72 65 20 63 6f 6e 66 75 73   that are confus
8480: 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 69  ing.      ** thi
8490: 73 20 6d 65 74 68 6f 64 27 73 20 6c 6f 67 69 63  s method's logic
84a0: 2e 20 4e 6f 74 20 63 6c 65 61 72 20 68 6f 77 20  . Not clear how 
84b0: 74 68 69 73 20 77 6f 75 6c 64 20 62 65 20 62 65  this would be be
84c0: 73 74 20 68 61 6e 64 6c 65 64 2e 0a 20 20 20 20  st handled..    
84d0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 21    */.    if( rc!
84e0: 3d 54 43 4c 5f 45 52 52 4f 52 20 29 7b 0a 20 20  =TCL_ERROR ){.  
84f0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
8500: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c  sult(interp, sql
8510: 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d  ite3_errmsg(pDb-
8520: 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  >db), 0);.      
8530: 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  rc = TCL_ERROR;.
8540: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
8550: 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20  3_exec(pDb->db, 
8560: 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20 30  "ROLLBACK", 0, 0
8570: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 70 44 62 2d  , 0);.  }.  pDb-
8580: 3e 64 69 73 61 62 6c 65 41 75 74 68 2d 2d 3b 0a  >disableAuth--;.
8590: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
85a0: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 53 51  ./*.** Unless SQ
85b0: 4c 49 54 45 5f 54 45 53 54 20 69 73 20 64 65 66  LITE_TEST is def
85c0: 69 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  ined, this funct
85d0: 69 6f 6e 20 69 73 20 61 20 73 69 6d 70 6c 65 20  ion is a simple 
85e0: 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 0a 2a  wrapper around.*
85f0: 2a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  * sqlite3_prepar
8600: 65 5f 76 32 28 29 2e 20 49 66 20 53 51 4c 49 54  e_v2(). If SQLIT
8610: 45 5f 54 45 53 54 20 69 73 20 64 65 66 69 6e 65  E_TEST is define
8620: 64 2c 20 74 68 65 6e 20 69 74 20 75 73 65 73 20  d, then it uses 
8630: 65 69 74 68 65 72 0a 2a 2a 20 73 71 6c 69 74 65  either.** sqlite
8640: 33 5f 70 72 65 70 61 72 65 5f 76 32 28 29 20 6f  3_prepare_v2() o
8650: 72 20 6c 65 67 61 63 79 20 69 6e 74 65 72 66 61  r legacy interfa
8660: 63 65 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  ce sqlite3_prepa
8670: 72 65 28 29 2c 20 64 65 70 65 6e 64 69 6e 67 0a  re(), depending.
8680: 2a 2a 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72  ** on whether or
8690: 20 6e 6f 74 20 74 68 65 20 5b 64 62 5f 75 73 65   not the [db_use
86a0: 5f 6c 65 67 61 63 79 5f 70 72 65 70 61 72 65 5d  _legacy_prepare]
86b0: 20 63 6f 6d 6d 61 6e 64 20 68 61 73 20 62 65 65   command has bee
86c0: 6e 20 75 73 65 64 20 74 6f 20 0a 2a 2a 20 63 6f  n used to .** co
86d0: 6e 66 69 67 75 72 65 20 74 68 65 20 63 6f 6e 6e  nfigure the conn
86e0: 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ection..*/.stati
86f0: 63 20 69 6e 74 20 64 62 50 72 65 70 61 72 65 28  c int dbPrepare(
8700: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
8710: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
8720: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6f     /* Database o
8730: 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  bject */.  const
8740: 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 20 20 20   char *zSql,    
8750: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51             /* SQ
8760: 4c 20 74 6f 20 63 6f 6d 70 69 6c 65 20 2a 2f 0a  L to compile */.
8770: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
8780: 2a 70 70 53 74 6d 74 2c 20 20 20 20 20 20 20 20  *ppStmt,        
8790: 20 20 2f 2a 20 4f 55 54 3a 20 50 72 65 70 61 72    /* OUT: Prepar
87a0: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  ed statement */.
87b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70    const char **p
87c0: 7a 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20  zOut            
87d0: 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e 74 65    /* OUT: Pointe
87e0: 72 20 74 6f 20 6e 65 78 74 20 53 51 4c 20 73 74  r to next SQL st
87f0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 23 69  atement */.){.#i
8800: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
8810: 0a 20 20 69 66 28 20 70 44 62 2d 3e 62 4c 65 67  .  if( pDb->bLeg
8820: 61 63 79 50 72 65 70 61 72 65 20 29 7b 0a 20 20  acyPrepare ){.  
8830: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
8840: 5f 70 72 65 70 61 72 65 28 70 44 62 2d 3e 64 62  _prepare(pDb->db
8850: 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 70 70 53 74  , zSql, -1, ppSt
8860: 6d 74 2c 20 70 7a 4f 75 74 29 3b 0a 20 20 7d 0a  mt, pzOut);.  }.
8870: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
8880: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
8890: 76 32 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c  v2(pDb->db, zSql
88a0: 2c 20 2d 31 2c 20 70 70 53 74 6d 74 2c 20 70 7a  , -1, ppStmt, pz
88b0: 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  Out);.}../*.** S
88c0: 65 61 72 63 68 20 74 68 65 20 63 61 63 68 65 20  earch the cache 
88d0: 66 6f 72 20 61 20 70 72 65 70 61 72 65 64 2d 73  for a prepared-s
88e0: 74 61 74 65 6d 65 6e 74 20 6f 62 6a 65 63 74 20  tatement object 
88f0: 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
8900: 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 53 51 4c  the.** first SQL
8910: 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68   statement in th
8920: 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
8930: 20 74 6f 20 62 79 20 70 61 72 61 6d 65 74 65 72   to by parameter
8940: 20 7a 49 6e 2e 20 49 66 0a 2a 2a 20 6e 6f 20 73   zIn. If.** no s
8950: 75 63 68 20 70 72 65 70 61 72 65 64 2d 73 74 61  uch prepared-sta
8960: 74 65 6d 65 6e 74 20 63 61 6e 20 62 65 20 66 6f  tement can be fo
8970: 75 6e 64 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e  und, allocate an
8980: 64 20 70 72 65 70 61 72 65 20 61 20 6e 65 77 0a  d prepare a new.
8990: 2a 2a 20 6f 6e 65 2e 20 49 6e 20 65 69 74 68 65  ** one. In eithe
89a0: 72 20 63 61 73 65 2c 20 62 69 6e 64 20 74 68 65  r case, bind the
89b0: 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 73 20   current values 
89c0: 6f 66 20 74 68 65 20 72 65 6c 65 76 61 6e 74 20  of the relevant 
89d0: 54 63 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 73  Tcl.** variables
89e0: 20 74 6f 20 61 6e 79 20 24 76 61 72 2c 20 3a 76   to any $var, :v
89f0: 61 72 20 6f 72 20 40 76 61 72 20 76 61 72 69 61  ar or @var varia
8a00: 62 6c 65 73 20 69 6e 20 74 68 65 20 73 74 61 74  bles in the stat
8a10: 65 6d 65 6e 74 2e 20 42 65 66 6f 72 65 0a 2a 2a  ement. Before.**
8a20: 20 72 65 74 75 72 6e 69 6e 67 2c 20 73 65 74 20   returning, set 
8a30: 2a 70 70 50 72 65 53 74 6d 74 20 74 6f 20 70 6f  *ppPreStmt to po
8a40: 69 6e 74 20 74 6f 20 74 68 65 20 70 72 65 70 61  int to the prepa
8a50: 72 65 64 2d 73 74 61 74 65 6d 65 6e 74 20 6f 62  red-statement ob
8a60: 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 4f 75 74 70  ject..**.** Outp
8a70: 75 74 20 70 61 72 61 6d 65 74 65 72 20 2a 70 7a  ut parameter *pz
8a80: 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 70 6f  Out is set to po
8a90: 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20  int to the next 
8aa0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  SQL statement in
8ab0: 0a 2a 2a 20 62 75 66 66 65 72 20 7a 49 6e 2c 20  .** buffer zIn, 
8ac0: 6f 72 20 74 6f 20 74 68 65 20 27 5c 30 27 20 62  or to the '\0' b
8ad0: 79 74 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  yte at the end o
8ae0: 66 20 7a 49 6e 20 69 66 20 74 68 65 72 65 20 69  f zIn if there i
8af0: 73 20 6e 6f 0a 2a 2a 20 6e 65 78 74 20 73 74 61  s no.** next sta
8b00: 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  tement..**.** If
8b10: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 54 43 4c   successful, TCL
8b20: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
8b30: 20 4f 74 68 65 72 77 69 73 65 2c 20 54 43 4c 5f   Otherwise, TCL_
8b40: 45 52 52 4f 52 20 69 73 20 72 65 74 75 72 6e 65  ERROR is returne
8b50: 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f  d.** and an erro
8b60: 72 20 6d 65 73 73 61 67 65 20 6c 6f 61 64 65 64  r message loaded
8b70: 20 69 6e 74 6f 20 69 6e 74 65 72 70 72 65 74 65   into interprete
8b80: 72 20 70 44 62 2d 3e 69 6e 74 65 72 70 2e 0a 2a  r pDb->interp..*
8b90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 62 50  /.static int dbP
8ba0: 72 65 70 61 72 65 41 6e 64 42 69 6e 64 28 0a 20  repareAndBind(. 
8bb0: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 2c 20   SqliteDb *pDb, 
8bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bd0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6f 62 6a   /* Database obj
8be0: 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f  ect */.  char co
8bf0: 6e 73 74 20 2a 7a 49 6e 2c 20 20 20 20 20 20 20  nst *zIn,       
8c00: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20           /* SQL 
8c10: 74 6f 20 63 6f 6d 70 69 6c 65 20 2a 2f 0a 20 20  to compile */.  
8c20: 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 4f  char const **pzO
8c30: 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ut,             
8c40: 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20  /* OUT: Pointer 
8c50: 74 6f 20 6e 65 78 74 20 53 51 4c 20 73 74 61 74  to next SQL stat
8c60: 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 71 6c 50 72  ement */.  SqlPr
8c70: 65 70 61 72 65 64 53 74 6d 74 20 2a 2a 70 70 50  eparedStmt **ppP
8c80: 72 65 53 74 6d 74 20 20 20 20 20 2f 2a 20 4f 55  reStmt     /* OU
8c90: 54 3a 20 4f 62 6a 65 63 74 20 75 73 65 64 20 74  T: Object used t
8ca0: 6f 20 63 61 63 68 65 20 73 74 61 74 65 6d 65 6e  o cache statemen
8cb0: 74 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  t */.){.  const 
8cc0: 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 7a 49 6e  char *zSql = zIn
8cd0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  ;         /* Poi
8ce0: 6e 74 65 72 20 74 6f 20 66 69 72 73 74 20 53 51  nter to first SQ
8cf0: 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 7a  L statement in z
8d00: 49 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  In */.  sqlite3_
8d10: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20  stmt *pStmt;    
8d20: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 70 61          /* Prepa
8d30: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6f 62  red statement ob
8d40: 6a 65 63 74 20 2a 2f 0a 20 20 53 71 6c 50 72 65  ject */.  SqlPre
8d50: 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65 53  paredStmt *pPreS
8d60: 74 6d 74 3b 20 20 20 20 20 20 2f 2a 20 50 6f 69  tmt;      /* Poi
8d70: 6e 74 65 72 20 74 6f 20 63 61 63 68 65 64 20 73  nter to cached s
8d80: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
8d90: 74 20 6e 53 71 6c 3b 20 20 20 20 20 20 20 20 20  t nSql;         
8da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8db0: 20 4c 65 6e 67 74 68 20 6f 66 20 7a 53 71 6c 20   Length of zSql 
8dc0: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e  in bytes */.  in
8dd0: 74 20 6e 56 61 72 3b 20 20 20 20 20 20 20 20 20  t nVar;         
8de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8df0: 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 72 69 61   Number of varia
8e00: 62 6c 65 73 20 69 6e 20 73 74 61 74 65 6d 65 6e  bles in statemen
8e10: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d  t */.  int iParm
8e20: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
8e30: 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66         /* Next f
8e40: 72 65 65 20 65 6e 74 72 79 20 69 6e 20 61 70 50  ree entry in apP
8e50: 61 72 6d 20 2a 2f 0a 20 20 63 68 61 72 20 63 3b  arm */.  char c;
8e60: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 54 63 6c 5f  .  int i;.  Tcl_
8e70: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 20 3d  Interp *interp =
8e80: 20 70 44 62 2d 3e 69 6e 74 65 72 70 3b 0a 0a 20   pDb->interp;.. 
8e90: 20 2a 70 70 50 72 65 53 74 6d 74 20 3d 20 30 3b   *ppPreStmt = 0;
8ea0: 0a 0a 20 20 2f 2a 20 54 72 69 6d 20 73 70 61 63  ..  /* Trim spac
8eb0: 65 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72  es from the star
8ec0: 74 20 6f 66 20 7a 53 71 6c 20 61 6e 64 20 63 61  t of zSql and ca
8ed0: 6c 63 75 6c 61 74 65 20 74 68 65 20 72 65 6d 61  lculate the rema
8ee0: 69 6e 69 6e 67 20 6c 65 6e 67 74 68 2e 20 2a 2f  ining length. */
8ef0: 0a 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a  .  while( (c = z
8f00: 53 71 6c 5b 30 5d 29 3d 3d 27 20 27 20 7c 7c 20  Sql[0])==' ' || 
8f10: 63 3d 3d 27 5c 74 27 20 7c 7c 20 63 3d 3d 27 5c  c=='\t' || c=='\
8f20: 72 27 20 7c 7c 20 63 3d 3d 27 5c 6e 27 20 29 7b  r' || c=='\n' ){
8f30: 20 7a 53 71 6c 2b 2b 3b 20 7d 0a 20 20 6e 53 71   zSql++; }.  nSq
8f40: 6c 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 53 71  l = strlen30(zSq
8f50: 6c 29 3b 0a 0a 20 20 66 6f 72 28 70 50 72 65 53  l);..  for(pPreS
8f60: 74 6d 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c  tmt = pDb->stmtL
8f70: 69 73 74 3b 20 70 50 72 65 53 74 6d 74 3b 20 70  ist; pPreStmt; p
8f80: 50 72 65 53 74 6d 74 3d 70 50 72 65 53 74 6d 74  PreStmt=pPreStmt
8f90: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e  ->pNext){.    in
8fa0: 74 20 6e 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e  t n = pPreStmt->
8fb0: 6e 53 71 6c 3b 0a 20 20 20 20 69 66 28 20 6e 53  nSql;.    if( nS
8fc0: 71 6c 3e 3d 6e 20 0a 20 20 20 20 20 20 20 20 26  ql>=n .        &
8fd0: 26 20 6d 65 6d 63 6d 70 28 70 50 72 65 53 74 6d  & memcmp(pPreStm
8fe0: 74 2d 3e 7a 53 71 6c 2c 20 7a 53 71 6c 2c 20 6e  t->zSql, zSql, n
8ff0: 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20  )==0.        && 
9000: 28 7a 53 71 6c 5b 6e 5d 3d 3d 30 20 7c 7c 20 7a  (zSql[n]==0 || z
9010: 53 71 6c 5b 6e 2d 31 5d 3d 3d 27 3b 27 29 0a 20  Sql[n-1]==';'). 
9020: 20 20 20 29 7b 0a 20 20 20 20 20 20 70 53 74 6d     ){.      pStm
9030: 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 53  t = pPreStmt->pS
9040: 74 6d 74 3b 0a 20 20 20 20 20 20 2a 70 7a 4f 75  tmt;.      *pzOu
9050: 74 20 3d 20 26 7a 53 71 6c 5b 70 50 72 65 53 74  t = &zSql[pPreSt
9060: 6d 74 2d 3e 6e 53 71 6c 5d 3b 0a 0a 20 20 20 20  mt->nSql];..    
9070: 20 20 2f 2a 20 57 68 65 6e 20 61 20 70 72 65 70    /* When a prep
9080: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 69  ared statement i
9090: 73 20 66 6f 75 6e 64 2c 20 75 6e 6c 69 6e 6b 20  s found, unlink 
90a0: 69 74 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20  it from the.    
90b0: 20 20 2a 2a 20 63 61 63 68 65 20 6c 69 73 74 2e    ** cache list.
90c0: 20 20 49 74 20 77 69 6c 6c 20 6c 61 74 65 72 20    It will later 
90d0: 62 65 20 61 64 64 65 64 20 62 61 63 6b 20 74 6f  be added back to
90e0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20   the beginning. 
90f0: 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 63       ** of the c
9100: 61 63 68 65 20 6c 69 73 74 20 69 6e 20 6f 72 64  ache list in ord
9110: 65 72 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  er to implement 
9120: 4c 52 55 20 72 65 70 6c 61 63 65 6d 65 6e 74 2e  LRU replacement.
9130: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
9140: 69 66 28 20 70 50 72 65 53 74 6d 74 2d 3e 70 50  if( pPreStmt->pP
9150: 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 70  rev ){.        p
9160: 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 2d 3e  PreStmt->pPrev->
9170: 70 4e 65 78 74 20 3d 20 70 50 72 65 53 74 6d 74  pNext = pPreStmt
9180: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
9190: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44  else{.        pD
91a0: 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20 70 50  b->stmtList = pP
91b0: 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 3b 0a 20  reStmt->pNext;. 
91c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
91d0: 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74   pPreStmt->pNext
91e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 72 65   ){.        pPre
91f0: 53 74 6d 74 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  Stmt->pNext->pPr
9200: 65 76 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70  ev = pPreStmt->p
9210: 50 72 65 76 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Prev;.      }els
9220: 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  e{.        pDb->
9230: 73 74 6d 74 4c 61 73 74 20 3d 20 70 50 72 65 53  stmtLast = pPreS
9240: 74 6d 74 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20  tmt->pPrev;.    
9250: 20 20 7d 0a 20 20 20 20 20 20 70 44 62 2d 3e 6e    }.      pDb->n
9260: 53 74 6d 74 2d 2d 3b 0a 20 20 20 20 20 20 6e 56  Stmt--;.      nV
9270: 61 72 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e  ar = sqlite3_bin
9280: 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e  d_parameter_coun
9290: 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  t(pStmt);.      
92a0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
92b0: 0a 20 20 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 70  .  .  /* If no p
92c0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
92d0: 74 20 77 61 73 20 66 6f 75 6e 64 2e 20 43 6f 6d  t was found. Com
92e0: 70 69 6c 65 20 74 68 65 20 53 51 4c 20 74 65 78  pile the SQL tex
92f0: 74 2e 20 41 6c 73 6f 20 61 6c 6c 6f 63 61 74 65  t. Also allocate
9300: 0a 20 20 2a 2a 20 61 20 6e 65 77 20 53 71 6c 50  .  ** a new SqlP
9310: 72 65 70 61 72 65 64 53 74 6d 74 20 73 74 72 75  reparedStmt stru
9320: 63 74 75 72 65 2e 20 20 2a 2f 0a 20 20 69 66 28  cture.  */.  if(
9330: 20 70 50 72 65 53 74 6d 74 3d 3d 30 20 29 7b 0a   pPreStmt==0 ){.
9340: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 0a      int nByte;..
9350: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
9360: 4b 21 3d 64 62 50 72 65 70 61 72 65 28 70 44 62  K!=dbPrepare(pDb
9370: 2c 20 7a 53 71 6c 2c 20 26 70 53 74 6d 74 2c 20  , zSql, &pStmt, 
9380: 70 7a 4f 75 74 29 20 29 7b 0a 20 20 20 20 20 20  pzOut) ){.      
9390: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
93a0: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
93b0: 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65  StringObj(sqlite
93c0: 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
93d0: 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 20 20 72  ), -1));.      r
93e0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
93f0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
9400: 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Stmt==0 ){.     
9410: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
9420: 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
9430: 70 44 62 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20  pDb->db) ){.    
9440: 20 20 20 20 2f 2a 20 41 20 63 6f 6d 70 69 6c 65      /* A compile
9450: 2d 74 69 6d 65 20 65 72 72 6f 72 20 69 6e 20 74  -time error in t
9460: 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f  he statement. */
9470: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74  .        Tcl_Set
9480: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
9490: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
94a0: 62 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  bj(sqlite3_errms
94b0: 67 28 70 44 62 2d 3e 64 62 29 2c 20 2d 31 29 29  g(pDb->db), -1))
94c0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
94d0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
94e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
94f0: 20 2f 2a 20 54 68 65 20 73 74 61 74 65 6d 65 6e   /* The statemen
9500: 74 20 77 61 73 20 61 20 6e 6f 2d 6f 70 2e 20 20  t was a no-op.  
9510: 43 6f 6e 74 69 6e 75 65 20 74 6f 20 74 68 65 20  Continue to the 
9520: 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74 0a 20  next statement. 
9530: 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65         ** in the
9540: 20 53 51 4c 20 73 74 72 69 6e 67 2e 0a 20 20 20   SQL string..   
9550: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
9560: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20  return TCL_OK;. 
9570: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
9580: 20 20 61 73 73 65 72 74 28 20 70 50 72 65 53 74    assert( pPreSt
9590: 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 6e 56 61  mt==0 );.    nVa
95a0: 72 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  r = sqlite3_bind
95b0: 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74  _parameter_count
95c0: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 6e 42 79  (pStmt);.    nBy
95d0: 74 65 20 3d 20 73 69 7a 65 6f 66 28 53 71 6c 50  te = sizeof(SqlP
95e0: 72 65 70 61 72 65 64 53 74 6d 74 29 20 2b 20 6e  reparedStmt) + n
95f0: 56 61 72 2a 73 69 7a 65 6f 66 28 54 63 6c 5f 4f  Var*sizeof(Tcl_O
9600: 62 6a 20 2a 29 3b 0a 20 20 20 20 70 50 72 65 53  bj *);.    pPreS
9610: 74 6d 74 20 3d 20 28 53 71 6c 50 72 65 70 61 72  tmt = (SqlPrepar
9620: 65 64 53 74 6d 74 2a 29 54 63 6c 5f 41 6c 6c 6f  edStmt*)Tcl_Allo
9630: 63 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 6d 65  c(nByte);.    me
9640: 6d 73 65 74 28 70 50 72 65 53 74 6d 74 2c 20 30  mset(pPreStmt, 0
9650: 2c 20 6e 42 79 74 65 29 3b 0a 0a 20 20 20 20 70  , nByte);..    p
9660: 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 20 3d  PreStmt->pStmt =
9670: 20 70 53 74 6d 74 3b 0a 20 20 20 20 70 50 72 65   pStmt;.    pPre
9680: 53 74 6d 74 2d 3e 6e 53 71 6c 20 3d 20 28 69 6e  Stmt->nSql = (in
9690: 74 29 28 2a 70 7a 4f 75 74 20 2d 20 7a 53 71 6c  t)(*pzOut - zSql
96a0: 29 3b 0a 20 20 20 20 70 50 72 65 53 74 6d 74 2d  );.    pPreStmt-
96b0: 3e 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f  >zSql = sqlite3_
96c0: 73 71 6c 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  sql(pStmt);.    
96d0: 70 50 72 65 53 74 6d 74 2d 3e 61 70 50 61 72 6d  pPreStmt->apParm
96e0: 20 3d 20 28 54 63 6c 5f 4f 62 6a 20 2a 2a 29 26   = (Tcl_Obj **)&
96f0: 70 50 72 65 53 74 6d 74 5b 31 5d 3b 0a 23 69 66  pPreStmt[1];.#if
9700: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
9710: 20 20 20 20 69 66 28 20 70 50 72 65 53 74 6d 74      if( pPreStmt
9720: 2d 3e 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20  ->zSql==0 ){.   
9730: 20 20 20 63 68 61 72 20 2a 7a 43 6f 70 79 20 3d     char *zCopy =
9740: 20 54 63 6c 5f 41 6c 6c 6f 63 28 70 50 72 65 53   Tcl_Alloc(pPreS
9750: 74 6d 74 2d 3e 6e 53 71 6c 20 2b 20 31 29 3b 0a  tmt->nSql + 1);.
9760: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 43 6f        memcpy(zCo
9770: 70 79 2c 20 7a 53 71 6c 2c 20 70 50 72 65 53 74  py, zSql, pPreSt
9780: 6d 74 2d 3e 6e 53 71 6c 29 3b 0a 20 20 20 20 20  mt->nSql);.     
9790: 20 7a 43 6f 70 79 5b 70 50 72 65 53 74 6d 74 2d   zCopy[pPreStmt-
97a0: 3e 6e 53 71 6c 5d 20 3d 20 27 5c 30 27 3b 0a 20  >nSql] = '\0';. 
97b0: 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 7a       pPreStmt->z
97c0: 53 71 6c 20 3d 20 7a 43 6f 70 79 3b 0a 20 20 20  Sql = zCopy;.   
97d0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
97e0: 61 73 73 65 72 74 28 20 70 50 72 65 53 74 6d 74  assert( pPreStmt
97f0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74   );.  assert( st
9800: 72 6c 65 6e 33 30 28 70 50 72 65 53 74 6d 74 2d  rlen30(pPreStmt-
9810: 3e 7a 53 71 6c 29 3d 3d 70 50 72 65 53 74 6d 74  >zSql)==pPreStmt
9820: 2d 3e 6e 53 71 6c 20 29 3b 0a 20 20 61 73 73 65  ->nSql );.  asse
9830: 72 74 28 20 30 3d 3d 6d 65 6d 63 6d 70 28 70 50  rt( 0==memcmp(pP
9840: 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c 20 7a 53  reStmt->zSql, zS
9850: 71 6c 2c 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53  ql, pPreStmt->nS
9860: 71 6c 29 20 29 3b 0a 0a 20 20 2f 2a 20 42 69 6e  ql) );..  /* Bin
9870: 64 20 76 61 6c 75 65 73 20 74 6f 20 70 61 72 61  d values to para
9880: 6d 65 74 65 72 73 20 74 68 61 74 20 62 65 67 69  meters that begi
9890: 6e 20 77 69 74 68 20 24 20 6f 72 20 3a 20 2a 2f  n with $ or : */
98a0: 20 20 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c    .  for(i=1; i<
98b0: 3d 6e 56 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  =nVar; i++){.   
98c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61   const char *zVa
98d0: 72 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  r = sqlite3_bind
98e0: 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28  _parameter_name(
98f0: 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 69  pStmt, i);.    i
9900: 66 28 20 7a 56 61 72 21 3d 30 20 26 26 20 28 7a  f( zVar!=0 && (z
9910: 56 61 72 5b 30 5d 3d 3d 27 24 27 20 7c 7c 20 7a  Var[0]=='$' || z
9920: 56 61 72 5b 30 5d 3d 3d 27 3a 27 20 7c 7c 20 7a  Var[0]==':' || z
9930: 56 61 72 5b 30 5d 3d 3d 27 40 27 29 20 29 7b 0a  Var[0]=='@') ){.
9940: 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70        Tcl_Obj *p
9950: 56 61 72 20 3d 20 54 63 6c 5f 47 65 74 56 61 72  Var = Tcl_GetVar
9960: 32 45 78 28 69 6e 74 65 72 70 2c 20 26 7a 56 61  2Ex(interp, &zVa
9970: 72 5b 31 5d 2c 20 30 2c 20 30 29 3b 0a 20 20 20  r[1], 0, 0);.   
9980: 20 20 20 69 66 28 20 70 56 61 72 20 29 7b 0a 20     if( pVar ){. 
9990: 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20         int n;.  
99a0: 20 20 20 20 20 20 75 38 20 2a 64 61 74 61 3b 0a        u8 *data;.
99b0: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
99c0: 61 72 20 2a 7a 54 79 70 65 20 3d 20 28 70 56 61  ar *zType = (pVa
99d0: 72 2d 3e 74 79 70 65 50 74 72 20 3f 20 70 56 61  r->typePtr ? pVa
99e0: 72 2d 3e 74 79 70 65 50 74 72 2d 3e 6e 61 6d 65  r->typePtr->name
99f0: 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20   : "");.        
9a00: 63 68 61 72 20 63 20 3d 20 7a 54 79 70 65 5b 30  char c = zType[0
9a10: 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  ];.        if( z
9a20: 56 61 72 5b 30 5d 3d 3d 27 40 27 20 7c 7c 0a 20  Var[0]=='@' ||. 
9a30: 20 20 20 20 20 20 20 20 20 20 28 63 3d 3d 27 62            (c=='b
9a40: 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70  ' && strcmp(zTyp
9a50: 65 2c 22 62 79 74 65 61 72 72 61 79 22 29 3d 3d  e,"bytearray")==
9a60: 30 20 26 26 20 70 56 61 72 2d 3e 62 79 74 65 73  0 && pVar->bytes
9a70: 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ==0) ){.        
9a80: 20 20 2f 2a 20 4c 6f 61 64 20 61 20 42 4c 4f 42    /* Load a BLOB
9a90: 20 74 79 70 65 20 69 66 20 74 68 65 20 54 63 6c   type if the Tcl
9aa0: 20 76 61 72 69 61 62 6c 65 20 69 73 20 61 20 62   variable is a b
9ab0: 79 74 65 61 72 72 61 79 20 61 6e 64 0a 20 20 20  ytearray and.   
9ac0: 20 20 20 20 20 20 20 2a 2a 20 69 74 20 68 61 73         ** it has
9ad0: 20 6e 6f 20 73 74 72 69 6e 67 20 72 65 70 72 65   no string repre
9ae0: 73 65 6e 74 61 74 69 6f 6e 20 6f 72 20 74 68 65  sentation or the
9af0: 20 68 6f 73 74 0a 20 20 20 20 20 20 20 20 20 20   host.          
9b00: 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 6e 61 6d  ** parameter nam
9b10: 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 22 40  e begins with "@
9b20: 22 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ". */.          
9b30: 64 61 74 61 20 3d 20 54 63 6c 5f 47 65 74 42 79  data = Tcl_GetBy
9b40: 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 70  teArrayFromObj(p
9b50: 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20  Var, &n);.      
9b60: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
9b70: 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69 2c 20  _blob(pStmt, i, 
9b80: 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f  data, n, SQLITE_
9b90: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20  STATIC);.       
9ba0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
9bb0: 75 6e 74 28 70 56 61 72 29 3b 0a 20 20 20 20 20  unt(pVar);.     
9bc0: 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 61       pPreStmt->a
9bd0: 70 50 61 72 6d 5b 69 50 61 72 6d 2b 2b 5d 20 3d  pParm[iParm++] =
9be0: 20 70 56 61 72 3b 0a 20 20 20 20 20 20 20 20 7d   pVar;.        }
9bf0: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 62 27 20  else if( c=='b' 
9c00: 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c  && strcmp(zType,
9c10: 22 62 6f 6f 6c 65 61 6e 22 29 3d 3d 30 20 29 7b  "boolean")==0 ){
9c20: 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47  .          Tcl_G
9c30: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
9c40: 65 72 70 2c 20 70 56 61 72 2c 20 26 6e 29 3b 0a  erp, pVar, &n);.
9c50: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
9c60: 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74  3_bind_int(pStmt
9c70: 2c 20 69 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20  , i, n);.       
9c80: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 64   }else if( c=='d
9c90: 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70  ' && strcmp(zTyp
9ca0: 65 2c 22 64 6f 75 62 6c 65 22 29 3d 3d 30 20 29  e,"double")==0 )
9cb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 64 6f 75 62  {.          doub
9cc0: 6c 65 20 72 3b 0a 20 20 20 20 20 20 20 20 20 20  le r;.          
9cd0: 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f  Tcl_GetDoubleFro
9ce0: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 56 61  mObj(interp, pVa
9cf0: 72 2c 20 26 72 29 3b 0a 20 20 20 20 20 20 20 20  r, &r);.        
9d00: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64    sqlite3_bind_d
9d10: 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20 69 2c 20  ouble(pStmt, i, 
9d20: 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  r);.        }els
9d30: 65 20 69 66 28 20 28 63 3d 3d 27 77 27 20 26 26  e if( (c=='w' &&
9d40: 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 77   strcmp(zType,"w
9d50: 69 64 65 49 6e 74 22 29 3d 3d 30 29 20 7c 7c 0a  ideInt")==0) ||.
9d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
9d70: 3d 3d 27 69 27 20 26 26 20 73 74 72 63 6d 70 28  =='i' && strcmp(
9d80: 7a 54 79 70 65 2c 22 69 6e 74 22 29 3d 3d 30 29  zType,"int")==0)
9d90: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63   ){.          Tc
9da0: 6c 5f 57 69 64 65 49 6e 74 20 76 3b 0a 20 20 20  l_WideInt v;.   
9db0: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 57 69         Tcl_GetWi
9dc0: 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  deIntFromObj(int
9dd0: 65 72 70 2c 20 70 56 61 72 2c 20 26 76 29 3b 0a  erp, pVar, &v);.
9de0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
9df0: 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74  3_bind_int64(pSt
9e00: 6d 74 2c 20 69 2c 20 76 29 3b 0a 20 20 20 20 20  mt, i, v);.     
9e10: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9e20: 20 20 20 20 64 61 74 61 20 3d 20 28 75 6e 73 69      data = (unsi
9e30: 67 6e 65 64 20 63 68 61 72 20 2a 29 54 63 6c 5f  gned char *)Tcl_
9e40: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
9e50: 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20  (pVar, &n);.    
9e60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
9e70: 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69  nd_text(pStmt, i
9e80: 2c 20 28 63 68 61 72 20 2a 29 64 61 74 61 2c 20  , (char *)data, 
9e90: 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  n, SQLITE_STATIC
9ea0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  );.          Tcl
9eb0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 56  _IncrRefCount(pV
9ec0: 61 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ar);.          p
9ed0: 50 72 65 53 74 6d 74 2d 3e 61 70 50 61 72 6d 5b  PreStmt->apParm[
9ee0: 69 50 61 72 6d 2b 2b 5d 20 3d 20 70 56 61 72 3b  iParm++] = pVar;
9ef0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9f00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
9f10: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c  sqlite3_bind_nul
9f20: 6c 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20  l(pStmt, i);.   
9f30: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
9f40: 20 70 50 72 65 53 74 6d 74 2d 3e 6e 50 61 72 6d   pPreStmt->nParm
9f50: 20 3d 20 69 50 61 72 6d 3b 0a 20 20 2a 70 70 50   = iParm;.  *ppP
9f60: 72 65 53 74 6d 74 20 3d 20 70 50 72 65 53 74 6d  reStmt = pPreStm
9f70: 74 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  t;..  return TCL
9f80: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
9f90: 6c 65 61 73 65 20 61 20 73 74 61 74 65 6d 65 6e  lease a statemen
9fa0: 74 20 72 65 66 65 72 65 6e 63 65 20 6f 62 74 61  t reference obta
9fb0: 69 6e 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20  ined by calling 
9fc0: 64 62 50 72 65 70 61 72 65 41 6e 64 42 69 6e 64  dbPrepareAndBind
9fd0: 28 29 2e 0a 2a 2a 20 54 68 65 72 65 20 73 68 6f  ()..** There sho
9fe0: 75 6c 64 20 62 65 20 65 78 61 63 74 6c 79 20 6f  uld be exactly o
9ff0: 6e 65 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20  ne call to this 
a000: 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 65 61 63  function for eac
a010: 68 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 64 62 50  h call to.** dbP
a020: 72 65 70 61 72 65 41 6e 64 42 69 6e 64 28 29 2e  repareAndBind().
a030: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 69  .**.** If the di
a040: 73 63 61 72 64 20 70 61 72 61 6d 65 74 65 72 20  scard parameter 
a050: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
a060: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
a070: 69 73 20 64 65 6c 65 74 65 64 0a 2a 2a 20 69 6d  is deleted.** im
a080: 6d 65 64 69 61 74 65 6c 79 2e 20 4f 74 68 65 72  mediately. Other
a090: 77 69 73 65 20 69 74 20 69 73 20 61 64 64 65 64  wise it is added
a0a0: 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74   to the LRU list
a0b0: 20 61 6e 64 20 6d 61 79 20 62 65 20 72 65 74 75   and may be retu
a0c0: 72 6e 65 64 0a 2a 2a 20 62 79 20 61 20 73 75 62  rned.** by a sub
a0d0: 73 65 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20  sequent call to 
a0e0: 64 62 50 72 65 70 61 72 65 41 6e 64 42 69 6e 64  dbPrepareAndBind
a0f0: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
a100: 69 64 20 64 62 52 65 6c 65 61 73 65 53 74 6d 74  id dbReleaseStmt
a110: 28 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  (.  SqliteDb *pD
a120: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
a130: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
a140: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 53 71 6c 50  handle */.  SqlP
a150: 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72  reparedStmt *pPr
a160: 65 53 74 6d 74 2c 20 20 20 20 20 20 2f 2a 20 50  eStmt,      /* P
a170: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
a180: 74 20 68 61 6e 64 6c 65 20 74 6f 20 72 65 6c 65  t handle to rele
a190: 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73  ase */.  int dis
a1a0: 63 61 72 64 20 20 20 20 20 20 20 20 20 20 20 20  card            
a1b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
a1c0: 20 74 6f 20 64 65 6c 65 74 65 20 28 6e 6f 74 20   to delete (not 
a1d0: 63 61 63 68 65 29 20 74 68 65 20 70 50 72 65 53  cache) the pPreS
a1e0: 74 6d 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  tmt */.){.  int 
a1f0: 69 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68  i;..  /* Free th
a200: 65 20 62 6f 75 6e 64 20 73 74 72 69 6e 67 20 61  e bound string a
a210: 6e 64 20 62 6c 6f 62 20 70 61 72 61 6d 65 74 65  nd blob paramete
a220: 72 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  rs */.  for(i=0;
a230: 20 69 3c 70 50 72 65 53 74 6d 74 2d 3e 6e 50 61   i<pPreStmt->nPa
a240: 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63  rm; i++){.    Tc
a250: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
a260: 50 72 65 53 74 6d 74 2d 3e 61 70 50 61 72 6d 5b  PreStmt->apParm[
a270: 69 5d 29 3b 0a 20 20 7d 0a 20 20 70 50 72 65 53  i]);.  }.  pPreS
a280: 74 6d 74 2d 3e 6e 50 61 72 6d 20 3d 20 30 3b 0a  tmt->nParm = 0;.
a290: 0a 20 20 69 66 28 20 70 44 62 2d 3e 6d 61 78 53  .  if( pDb->maxS
a2a0: 74 6d 74 3c 3d 30 20 7c 7c 20 64 69 73 63 61 72  tmt<=0 || discar
a2b0: 64 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  d ){.    /* If t
a2c0: 68 65 20 63 61 63 68 65 20 69 73 20 74 75 72 6e  he cache is turn
a2d0: 65 64 20 6f 66 66 2c 20 64 65 61 6c 6c 6f 63 61  ed off, dealloca
a2e0: 74 65 64 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ted the statemen
a2f0: 74 20 2a 2f 0a 20 20 20 20 64 62 46 72 65 65 53  t */.    dbFreeS
a300: 74 6d 74 28 70 50 72 65 53 74 6d 74 29 3b 0a 20  tmt(pPreStmt);. 
a310: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 41   }else{.    /* A
a320: 64 64 20 74 68 65 20 70 72 65 70 61 72 65 64 20  dd the prepared 
a330: 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65  statement to the
a340: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
a350: 65 20 63 61 63 68 65 20 6c 69 73 74 2e 20 2a 2f  e cache list. */
a360: 0a 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70  .    pPreStmt->p
a370: 4e 65 78 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74  Next = pDb->stmt
a380: 4c 69 73 74 3b 0a 20 20 20 20 70 50 72 65 53 74  List;.    pPreSt
a390: 6d 74 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20  mt->pPrev = 0;. 
a3a0: 20 20 20 69 66 28 20 70 44 62 2d 3e 73 74 6d 74     if( pDb->stmt
a3b0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 70 44 62  List ){.     pDb
a3c0: 2d 3e 73 74 6d 74 4c 69 73 74 2d 3e 70 50 72 65  ->stmtList->pPre
a3d0: 76 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20 20  v = pPreStmt;.  
a3e0: 20 20 7d 0a 20 20 20 20 70 44 62 2d 3e 73 74 6d    }.    pDb->stm
a3f0: 74 4c 69 73 74 20 3d 20 70 50 72 65 53 74 6d 74  tList = pPreStmt
a400: 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 73  ;.    if( pDb->s
a410: 74 6d 74 4c 61 73 74 3d 3d 30 20 29 7b 0a 20 20  tmtLast==0 ){.  
a420: 20 20 20 20 61 73 73 65 72 74 28 20 70 44 62 2d      assert( pDb-
a430: 3e 6e 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20  >nStmt==0 );.   
a440: 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74     pDb->stmtLast
a450: 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20 20 20   = pPreStmt;.   
a460: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
a470: 73 65 72 74 28 20 70 44 62 2d 3e 6e 53 74 6d 74  sert( pDb->nStmt
a480: 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >0 );.    }.    
a490: 70 44 62 2d 3e 6e 53 74 6d 74 2b 2b 3b 0a 20 20  pDb->nStmt++;.  
a4a0: 20 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 68   .    /* If we h
a4b0: 61 76 65 20 74 6f 6f 20 6d 61 6e 79 20 73 74 61  ave too many sta
a4c0: 74 65 6d 65 6e 74 20 69 6e 20 63 61 63 68 65 2c  tement in cache,
a4d0: 20 72 65 6d 6f 76 65 20 74 68 65 20 73 75 72 70   remove the surp
a4e0: 6c 75 73 20 66 72 6f 6d 20 0a 20 20 20 20 2a 2a  lus from .    **
a4f0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
a500: 63 61 63 68 65 20 6c 69 73 74 2e 20 20 2a 2f 0a  cache list.  */.
a510: 20 20 20 20 77 68 69 6c 65 28 20 70 44 62 2d 3e      while( pDb->
a520: 6e 53 74 6d 74 3e 70 44 62 2d 3e 6d 61 78 53 74  nStmt>pDb->maxSt
a530: 6d 74 20 29 7b 0a 20 20 20 20 20 20 53 71 6c 50  mt ){.      SqlP
a540: 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70 4c 61  reparedStmt *pLa
a550: 73 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 61  st = pDb->stmtLa
a560: 73 74 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 73  st;.      pDb->s
a570: 74 6d 74 4c 61 73 74 20 3d 20 70 4c 61 73 74 2d  tmtLast = pLast-
a580: 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20 70 44  >pPrev;.      pD
a590: 62 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70 4e 65  b->stmtLast->pNe
a5a0: 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 44  xt = 0;.      pD
a5b0: 62 2d 3e 6e 53 74 6d 74 2d 2d 3b 0a 20 20 20 20  b->nStmt--;.    
a5c0: 20 20 64 62 46 72 65 65 53 74 6d 74 28 70 4c 61    dbFreeStmt(pLa
a5d0: 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  st);.    }.  }.}
a5e0: 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72  ../*.** Structur
a5f0: 65 20 75 73 65 64 20 77 69 74 68 20 64 62 45 76  e used with dbEv
a600: 61 6c 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e  alXXX() function
a610: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 64 62 45 76 61  s:.**.**   dbEva
a620: 6c 49 6e 69 74 28 29 0a 2a 2a 20 20 20 64 62 45  lInit().**   dbE
a630: 76 61 6c 53 74 65 70 28 29 0a 2a 2a 20 20 20 64  valStep().**   d
a640: 62 45 76 61 6c 46 69 6e 61 6c 69 7a 65 28 29 0a  bEvalFinalize().
a650: 2a 2a 20 20 20 64 62 45 76 61 6c 52 6f 77 49 6e  **   dbEvalRowIn
a660: 66 6f 28 29 0a 2a 2a 20 20 20 64 62 45 76 61 6c  fo().**   dbEval
a670: 43 6f 6c 75 6d 6e 56 61 6c 75 65 28 29 0a 2a 2f  ColumnValue().*/
a680: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
a690: 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 44 62  DbEvalContext Db
a6a0: 45 76 61 6c 43 6f 6e 74 65 78 74 3b 0a 73 74 72  EvalContext;.str
a6b0: 75 63 74 20 44 62 45 76 61 6c 43 6f 6e 74 65 78  uct DbEvalContex
a6c0: 74 20 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  t {.  SqliteDb *
a6d0: 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  pDb;            
a6e0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
a6f0: 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 54 63  e handle */.  Tc
a700: 6c 5f 4f 62 6a 20 2a 70 53 71 6c 3b 20 20 20 20  l_Obj *pSql;    
a710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a720: 20 4f 62 6a 65 63 74 20 68 6f 6c 64 69 6e 67 20   Object holding 
a730: 73 74 72 69 6e 67 20 7a 53 71 6c 20 2a 2f 0a 20  string zSql */. 
a740: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
a750: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
a760: 20 2f 2a 20 52 65 6d 61 69 6e 69 6e 67 20 53 51   /* Remaining SQ
a770: 4c 20 74 6f 20 65 78 65 63 75 74 65 20 2a 2f 0a  L to execute */.
a780: 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d    SqlPreparedStm
a790: 74 20 2a 70 50 72 65 53 74 6d 74 3b 20 20 20 20  t *pPreStmt;    
a7a0: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 74 61    /* Current sta
a7b0: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
a7c0: 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nCol;           
a7d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
a7e0: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
a7f0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 70 53 74   returned by pSt
a800: 6d 74 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  mt */.  Tcl_Obj 
a810: 2a 70 41 72 72 61 79 3b 20 20 20 20 20 20 20 20  *pArray;        
a820: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
a830: 6f 66 20 61 72 72 61 79 20 76 61 72 69 61 62 6c  of array variabl
a840: 65 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  e */.  Tcl_Obj *
a850: 2a 61 70 43 6f 6c 4e 61 6d 65 3b 20 20 20 20 20  *apColName;     
a860: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
a870: 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  of column names 
a880: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  */.};../*.** Rel
a890: 65 61 73 65 20 61 6e 79 20 63 61 63 68 65 20 6f  ease any cache o
a8a0: 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 63  f column names c
a8b0: 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 61 73  urrently held as
a8c0: 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20   part of.** the 
a8d0: 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 73 74  DbEvalContext st
a8e0: 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61  ructure passed a
a8f0: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
a900: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
a910: 76 6f 69 64 20 64 62 52 65 6c 65 61 73 65 43 6f  void dbReleaseCo
a920: 6c 75 6d 6e 4e 61 6d 65 73 28 44 62 45 76 61 6c  lumnNames(DbEval
a930: 43 6f 6e 74 65 78 74 20 2a 70 29 7b 0a 20 20 69  Context *p){.  i
a940: 66 28 20 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 20  f( p->apColName 
a950: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
a960: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
a970: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
a980: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
a990: 6e 74 28 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 5b  nt(p->apColName[
a9a0: 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  i]);.    }.    T
a9b0: 63 6c 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29  cl_Free((char *)
a9c0: 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 29 3b 0a 20  p->apColName);. 
a9d0: 20 20 20 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 20     p->apColName 
a9e0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 43  = 0;.  }.  p->nC
a9f0: 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ol = 0;.}../*.**
aa00: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 44 62   Initialize a Db
aa10: 45 76 61 6c 43 6f 6e 74 65 78 74 20 73 74 72 75  EvalContext stru
aa20: 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  cture..**.** If 
aa30: 70 41 72 72 61 79 20 69 73 20 6e 6f 74 20 4e 55  pArray is not NU
aa40: 4c 4c 2c 20 74 68 65 6e 20 69 74 20 63 6f 6e 74  LL, then it cont
aa50: 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  ains the name of
aa60: 20 61 20 54 63 6c 20 61 72 72 61 79 0a 2a 2a 20   a Tcl array.** 
aa70: 76 61 72 69 61 62 6c 65 2e 20 54 68 65 20 22 2a  variable. The "*
aa80: 22 20 6d 65 6d 62 65 72 20 6f 66 20 74 68 69 73  " member of this
aa90: 20 61 72 72 61 79 20 69 73 20 73 65 74 20 74 6f   array is set to
aaa0: 20 61 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69   a list containi
aab0: 6e 67 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 73 20  ng.** the names 
aac0: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 72  of the columns r
aad0: 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 73  eturned by the s
aae0: 74 61 74 65 6d 65 6e 74 20 61 73 20 70 61 72 74  tatement as part
aaf0: 20 6f 66 20 65 61 63 68 0a 2a 2a 20 63 61 6c 6c   of each.** call
ab00: 20 74 6f 20 64 62 45 76 61 6c 53 74 65 70 28 29   to dbEvalStep()
ab10: 2c 20 69 6e 20 6f 72 64 65 72 20 66 72 6f 6d 20  , in order from 
ab20: 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e 20 65  left to right. e
ab30: 2e 67 2e 20 69 66 20 74 68 65 20 6e 61 6d 65 73  .g. if the names
ab40: 20 0a 2a 2a 20 6f 66 20 74 68 65 20 72 65 74 75   .** of the retu
ab50: 72 6e 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65  rned columns are
ab60: 20 61 2c 20 62 20 61 6e 64 20 63 2c 20 69 74 20   a, b and c, it 
ab70: 64 6f 65 73 20 74 68 65 20 65 71 75 69 76 61 6c  does the equival
ab80: 65 6e 74 20 6f 66 20 74 68 65 20 0a 2a 2a 20 74  ent of the .** t
ab90: 63 6c 20 63 6f 6d 6d 61 6e 64 3a 0a 2a 2a 0a 2a  cl command:.**.*
aba0: 2a 20 20 20 20 20 73 65 74 20 24 7b 70 41 72 72  *     set ${pArr
abb0: 61 79 7d 28 2a 29 20 7b 61 20 62 20 63 7d 0a 2a  ay}(*) {a b c}.*
abc0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 62  /.static void db
abd0: 45 76 61 6c 49 6e 69 74 28 0a 20 20 44 62 45 76  EvalInit(.  DbEv
abe0: 61 6c 43 6f 6e 74 65 78 74 20 2a 70 2c 20 20 20  alContext *p,   
abf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
ac00: 6f 69 6e 74 65 72 20 74 6f 20 73 74 72 75 63 74  ointer to struct
ac10: 75 72 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ure to initializ
ac20: 65 20 2a 2f 0a 20 20 53 71 6c 69 74 65 44 62 20  e */.  SqliteDb 
ac30: 2a 70 44 62 2c 20 20 20 20 20 20 20 20 20 20 20  *pDb,           
ac40: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
ac50: 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 54  se handle */.  T
ac60: 63 6c 5f 4f 62 6a 20 2a 70 53 71 6c 2c 20 20 20  cl_Obj *pSql,   
ac70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ac80: 2a 20 4f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e  * Object contain
ac90: 69 6e 67 20 53 51 4c 20 73 63 72 69 70 74 20 2a  ing SQL script *
aca0: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72  /.  Tcl_Obj *pAr
acb0: 72 61 79 20 20 20 20 20 20 20 20 20 20 20 20 20  ray             
acc0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 54      /* Name of T
acd0: 63 6c 20 61 72 72 61 79 20 74 6f 20 73 65 74 20  cl array to set 
ace0: 28 2a 29 20 65 6c 65 6d 65 6e 74 20 6f 66 20 2a  (*) element of *
acf0: 2f 0a 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c  /.){.  memset(p,
ad00: 20 30 2c 20 73 69 7a 65 6f 66 28 44 62 45 76 61   0, sizeof(DbEva
ad10: 6c 43 6f 6e 74 65 78 74 29 29 3b 0a 20 20 70 2d  lContext));.  p-
ad20: 3e 70 44 62 20 3d 20 70 44 62 3b 0a 20 20 70 2d  >pDb = pDb;.  p-
ad30: 3e 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53  >zSql = Tcl_GetS
ad40: 74 72 69 6e 67 28 70 53 71 6c 29 3b 0a 20 20 70  tring(pSql);.  p
ad50: 2d 3e 70 53 71 6c 20 3d 20 70 53 71 6c 3b 0a 20  ->pSql = pSql;. 
ad60: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
ad70: 74 28 70 53 71 6c 29 3b 0a 20 20 69 66 28 20 70  t(pSql);.  if( p
ad80: 41 72 72 61 79 20 29 7b 0a 20 20 20 20 70 2d 3e  Array ){.    p->
ad90: 70 41 72 72 61 79 20 3d 20 70 41 72 72 61 79 3b  pArray = pArray;
ada0: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
adb0: 43 6f 75 6e 74 28 70 41 72 72 61 79 29 3b 0a 20  Count(pArray);. 
adc0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61   }.}../*.** Obta
add0: 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  in information a
ade0: 62 6f 75 74 20 74 68 65 20 72 6f 77 20 74 68 61  bout the row tha
adf0: 74 20 74 68 65 20 44 62 45 76 61 6c 43 6f 6e 74  t the DbEvalCont
ae00: 65 78 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ext passed as th
ae10: 65 0a 2a 2a 20 66 69 72 73 74 20 61 72 67 75 6d  e.** first argum
ae20: 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  ent currently po
ae30: 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74  ints to..*/.stat
ae40: 69 63 20 76 6f 69 64 20 64 62 45 76 61 6c 52 6f  ic void dbEvalRo
ae50: 77 49 6e 66 6f 28 0a 20 20 44 62 45 76 61 6c 43  wInfo(.  DbEvalC
ae60: 6f 6e 74 65 78 74 20 2a 70 2c 20 20 20 20 20 20  ontext *p,      
ae70: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 76 61 6c           /* Eval
ae80: 75 61 74 69 6f 6e 20 63 6f 6e 74 65 78 74 20 2a  uation context *
ae90: 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6f 6c 2c 20  /.  int *pnCol, 
aea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aeb0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d 62      /* OUT: Numb
aec0: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d  er of column nam
aed0: 65 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  es */.  Tcl_Obj 
aee0: 2a 2a 2a 70 61 70 43 6f 6c 4e 61 6d 65 20 20 20  ***papColName   
aef0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
af00: 41 72 72 61 79 20 6f 66 20 63 6f 6c 75 6d 6e 20  Array of column 
af10: 6e 61 6d 65 73 20 2a 2f 0a 29 7b 0a 20 20 2f 2a  names */.){.  /*
af20: 20 43 6f 6d 70 75 74 65 20 63 6f 6c 75 6d 6e 20   Compute column 
af30: 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 66 28 20 30  names */.  if( 0
af40: 3d 3d 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 20 29  ==p->apColName )
af50: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  {.    sqlite3_st
af60: 6d 74 20 2a 70 53 74 6d 74 20 3d 20 70 2d 3e 70  mt *pStmt = p->p
af70: 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a  PreStmt->pStmt;.
af80: 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
af90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
afa0: 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61    /* Iterator va
afb0: 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e  riable */.    in
afc0: 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
afd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
afe0: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
aff0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 70 53 74   returned by pSt
b000: 6d 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62  mt */.    Tcl_Ob
b010: 6a 20 2a 2a 61 70 43 6f 6c 4e 61 6d 65 20 3d 20  j **apColName = 
b020: 30 3b 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79  0;      /* Array
b030: 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73   of column names
b040: 20 2a 2f 0a 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c   */..    p->nCol
b050: 20 3d 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65   = nCol = sqlite
b060: 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70  3_column_count(p
b070: 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 6e  Stmt);.    if( n
b080: 43 6f 6c 3e 30 20 26 26 20 28 70 61 70 43 6f 6c  Col>0 && (papCol
b090: 4e 61 6d 65 20 7c 7c 20 70 2d 3e 70 41 72 72 61  Name || p->pArra
b0a0: 79 29 20 29 7b 0a 20 20 20 20 20 20 61 70 43 6f  y) ){.      apCo
b0b0: 6c 4e 61 6d 65 20 3d 20 28 54 63 6c 5f 4f 62 6a  lName = (Tcl_Obj
b0c0: 2a 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69  **)Tcl_Alloc( si
b0d0: 7a 65 6f 66 28 54 63 6c 5f 4f 62 6a 2a 29 2a 6e  zeof(Tcl_Obj*)*n
b0e0: 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 66 6f 72  Col );.      for
b0f0: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
b100: 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 70 43 6f  +){.        apCo
b110: 6c 4e 61 6d 65 5b 69 5d 20 3d 20 54 63 6c 5f 4e  lName[i] = Tcl_N
b120: 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69  ewStringObj(sqli
b130: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28  te3_column_name(
b140: 70 53 74 6d 74 2c 69 29 2c 20 2d 31 29 3b 0a 20  pStmt,i), -1);. 
b150: 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52         Tcl_IncrR
b160: 65 66 43 6f 75 6e 74 28 61 70 43 6f 6c 4e 61 6d  efCount(apColNam
b170: 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  e[i]);.      }. 
b180: 20 20 20 20 20 70 2d 3e 61 70 43 6f 6c 4e 61 6d       p->apColNam
b190: 65 20 3d 20 61 70 43 6f 6c 4e 61 6d 65 3b 0a 20  e = apColName;. 
b1a0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
b1b0: 72 65 73 75 6c 74 73 20 61 72 65 20 62 65 69 6e  results are bein
b1c0: 67 20 73 74 6f 72 65 64 20 69 6e 20 61 6e 20 61  g stored in an a
b1d0: 72 72 61 79 20 76 61 72 69 61 62 6c 65 2c 20 74  rray variable, t
b1e0: 68 65 6e 20 63 72 65 61 74 65 0a 20 20 20 20 2a  hen create.    *
b1f0: 2a 20 74 68 65 20 61 72 72 61 79 28 2a 29 20 65  * the array(*) e
b200: 6e 74 72 79 20 66 6f 72 20 74 68 61 74 20 61 72  ntry for that ar
b210: 72 61 79 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ray.    */.    i
b220: 66 28 20 70 2d 3e 70 41 72 72 61 79 20 29 7b 0a  f( p->pArray ){.
b230: 20 20 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70        Tcl_Interp
b240: 20 2a 69 6e 74 65 72 70 20 3d 20 70 2d 3e 70 44   *interp = p->pD
b250: 62 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 20  b->interp;.     
b260: 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f 6c 4c 69   Tcl_Obj *pColLi
b270: 73 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28  st = Tcl_NewObj(
b280: 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a  );.      Tcl_Obj
b290: 20 2a 70 53 74 61 72 20 3d 20 54 63 6c 5f 4e 65   *pStar = Tcl_Ne
b2a0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 2a 22 2c 20  wStringObj("*", 
b2b0: 2d 31 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28  -1);..      for(
b2c0: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
b2d0: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4c  ){.        Tcl_L
b2e0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
b2f0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 43 6f 6c  ent(interp, pCol
b300: 4c 69 73 74 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b  List, apColName[
b310: 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
b320: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
b330: 75 6e 74 28 70 53 74 61 72 29 3b 0a 20 20 20 20  unt(pStar);.    
b340: 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32    Tcl_ObjSetVar2
b350: 28 69 6e 74 65 72 70 2c 20 70 2d 3e 70 41 72 72  (interp, p->pArr
b360: 61 79 2c 20 70 53 74 61 72 2c 20 70 43 6f 6c 4c  ay, pStar, pColL
b370: 69 73 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 54  ist, 0);.      T
b380: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
b390: 70 53 74 61 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pStar);.    }.  
b3a0: 7d 0a 0a 20 20 69 66 28 20 70 61 70 43 6f 6c 4e  }..  if( papColN
b3b0: 61 6d 65 20 29 7b 0a 20 20 20 20 2a 70 61 70 43  ame ){.    *papC
b3c0: 6f 6c 4e 61 6d 65 20 3d 20 70 2d 3e 61 70 43 6f  olName = p->apCo
b3d0: 6c 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 69 66 28  lName;.  }.  if(
b3e0: 20 70 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 2a 70   pnCol ){.    *p
b3f0: 6e 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 3b 0a  nCol = p->nCol;.
b400: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
b410: 75 72 6e 20 6f 6e 65 20 6f 66 20 54 43 4c 5f 4f  urn one of TCL_O
b420: 4b 2c 20 54 43 4c 5f 42 52 45 41 4b 20 6f 72 20  K, TCL_BREAK or 
b430: 54 43 4c 5f 45 52 52 4f 52 2e 20 49 66 20 54 43  TCL_ERROR. If TC
b440: 4c 5f 45 52 52 4f 52 20 69 73 0a 2a 2a 20 72 65  L_ERROR is.** re
b450: 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 61 6e 20  turned, then an 
b460: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
b470: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 69   stored in the i
b480: 6e 74 65 72 70 72 65 74 65 72 20 62 65 66 6f 72  nterpreter befor
b490: 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2e 0a  e.** returning..
b4a0: 2a 2a 0a 2a 2a 20 41 20 72 65 74 75 72 6e 20 76  **.** A return v
b4b0: 61 6c 75 65 20 6f 66 20 54 43 4c 5f 4f 4b 20 6d  alue of TCL_OK m
b4c0: 65 61 6e 73 20 74 68 65 72 65 20 69 73 20 61 20  eans there is a 
b4d0: 72 6f 77 20 6f 66 20 64 61 74 61 20 61 76 61 69  row of data avai
b4e0: 6c 61 62 6c 65 2e 20 54 68 65 0a 2a 2a 20 64 61  lable. The.** da
b4f0: 74 61 20 6d 61 79 20 62 65 20 61 63 63 65 73 73  ta may be access
b500: 65 64 20 75 73 69 6e 67 20 64 62 45 76 61 6c 52  ed using dbEvalR
b510: 6f 77 49 6e 66 6f 28 29 20 61 6e 64 20 64 62 45  owInfo() and dbE
b520: 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65 28 29  valColumnValue()
b530: 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 61 6e 61  . This.** is ana
b540: 6c 6f 67 6f 75 73 20 74 6f 20 61 20 72 65 74 75  logous to a retu
b550: 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 52 4f 57  rn of SQLITE_ROW
b560: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 73 74   from sqlite3_st
b570: 65 70 28 29 2e 20 49 66 20 54 43 4c 5f 42 52 45  ep(). If TCL_BRE
b580: 41 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  AK.** is returne
b590: 64 2c 20 74 68 65 6e 20 74 68 65 20 53 51 4c 20  d, then the SQL 
b5a0: 73 63 72 69 70 74 20 68 61 73 20 66 69 6e 69 73  script has finis
b5b0: 68 65 64 20 65 78 65 63 75 74 69 6e 67 20 61 6e  hed executing an
b5c0: 64 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 6e  d there are.** n
b5d0: 6f 20 66 75 72 74 68 65 72 20 72 6f 77 73 20 61  o further rows a
b5e0: 76 61 69 6c 61 62 6c 65 2e 20 54 68 69 73 20 69  vailable. This i
b5f0: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 53 51 4c  s similar to SQL
b600: 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2f 0a 73 74 61  ITE_DONE..*/.sta
b610: 74 69 63 20 69 6e 74 20 64 62 45 76 61 6c 53 74  tic int dbEvalSt
b620: 65 70 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74  ep(DbEvalContext
b630: 20 2a 70 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68   *p){.  const ch
b640: 61 72 20 2a 7a 50 72 65 76 53 71 6c 20 3d 20 30  ar *zPrevSql = 0
b650: 3b 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69  ;       /* Previ
b660: 6f 75 73 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e  ous value of p->
b670: 7a 53 71 6c 20 2a 2f 0a 0a 20 20 77 68 69 6c 65  zSql */..  while
b680: 28 20 70 2d 3e 7a 53 71 6c 5b 30 5d 20 7c 7c 20  ( p->zSql[0] || 
b690: 70 2d 3e 70 50 72 65 53 74 6d 74 20 29 7b 0a 20  p->pPreStmt ){. 
b6a0: 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69     int rc;.    i
b6b0: 66 28 20 70 2d 3e 70 50 72 65 53 74 6d 74 3d 3d  f( p->pPreStmt==
b6c0: 30 20 29 7b 0a 20 20 20 20 20 20 7a 50 72 65 76  0 ){.      zPrev
b6d0: 53 71 6c 20 3d 20 28 70 2d 3e 7a 53 71 6c 3d 3d  Sql = (p->zSql==
b6e0: 7a 50 72 65 76 53 71 6c 20 3f 20 30 20 3a 20 70  zPrevSql ? 0 : p
b6f0: 2d 3e 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 72  ->zSql);.      r
b700: 63 20 3d 20 64 62 50 72 65 70 61 72 65 41 6e 64  c = dbPrepareAnd
b710: 42 69 6e 64 28 70 2d 3e 70 44 62 2c 20 70 2d 3e  Bind(p->pDb, p->
b720: 7a 53 71 6c 2c 20 26 70 2d 3e 7a 53 71 6c 2c 20  zSql, &p->zSql, 
b730: 26 70 2d 3e 70 50 72 65 53 74 6d 74 29 3b 0a 20  &p->pPreStmt);. 
b740: 20 20 20 20 20 69 66 28 20 72 63 21 3d 54 43 4c       if( rc!=TCL
b750: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
b760: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
b770: 20 20 69 6e 74 20 72 63 73 3b 0a 20 20 20 20 20    int rcs;.     
b780: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
b790: 20 70 2d 3e 70 44 62 3b 0a 20 20 20 20 20 20 53   p->pDb;.      S
b7a0: 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a  qlPreparedStmt *
b7b0: 70 50 72 65 53 74 6d 74 20 3d 20 70 2d 3e 70 50  pPreStmt = p->pP
b7c0: 72 65 53 74 6d 74 3b 0a 20 20 20 20 20 20 73 71  reStmt;.      sq
b7d0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
b7e0: 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 53  t = pPreStmt->pS
b7f0: 74 6d 74 3b 0a 0a 20 20 20 20 20 20 72 63 73 20  tmt;..      rcs 
b800: 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
b810: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28  Stmt);.      if(
b820: 20 72 63 73 3d 3d 53 51 4c 49 54 45 5f 52 4f 57   rcs==SQLITE_ROW
b830: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
b840: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20  rn TCL_OK;.     
b850: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   }.      if( p->
b860: 70 41 72 72 61 79 20 29 7b 0a 20 20 20 20 20 20  pArray ){.      
b870: 20 20 64 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28    dbEvalRowInfo(
b880: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 0, 0);.      
b890: 7d 0a 20 20 20 20 20 20 72 63 73 20 3d 20 73 71  }.      rcs = sq
b8a0: 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d  lite3_reset(pStm
b8b0: 74 29 3b 0a 0a 20 20 20 20 20 20 70 44 62 2d 3e  t);..      pDb->
b8c0: 6e 53 74 65 70 20 3d 20 73 71 6c 69 74 65 33 5f  nStep = sqlite3_
b8d0: 73 74 6d 74 5f 73 74 61 74 75 73 28 70 53 74 6d  stmt_status(pStm
b8e0: 74 2c 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  t,SQLITE_STMTSTA
b8f0: 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45  TUS_FULLSCAN_STE
b900: 50 2c 31 29 3b 0a 20 20 20 20 20 20 70 44 62 2d  P,1);.      pDb-
b910: 3e 6e 53 6f 72 74 20 3d 20 73 71 6c 69 74 65 33  >nSort = sqlite3
b920: 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 53 74  _stmt_status(pSt
b930: 6d 74 2c 53 51 4c 49 54 45 5f 53 54 4d 54 53 54  mt,SQLITE_STMTST
b940: 41 54 55 53 5f 53 4f 52 54 2c 31 29 3b 0a 20 20  ATUS_SORT,1);.  
b950: 20 20 20 20 70 44 62 2d 3e 6e 49 6e 64 65 78 20      pDb->nIndex 
b960: 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  = sqlite3_stmt_s
b970: 74 61 74 75 73 28 70 53 74 6d 74 2c 53 51 4c 49  tatus(pStmt,SQLI
b980: 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55  TE_STMTSTATUS_AU
b990: 54 4f 49 4e 44 45 58 2c 31 29 3b 0a 20 20 20 20  TOINDEX,1);.    
b9a0: 20 20 64 62 52 65 6c 65 61 73 65 43 6f 6c 75 6d    dbReleaseColum
b9b0: 6e 4e 61 6d 65 73 28 70 29 3b 0a 20 20 20 20 20  nNames(p);.     
b9c0: 20 70 2d 3e 70 50 72 65 53 74 6d 74 20 3d 20 30   p->pPreStmt = 0
b9d0: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 73  ;..      if( rcs
b9e0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
b9f0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 72         /* If a r
ba00: 75 6e 2d 74 69 6d 65 20 65 72 72 6f 72 20 6f 63  un-time error oc
ba10: 63 75 72 73 2c 20 72 65 70 6f 72 74 20 74 68 65  curs, report the
ba20: 20 65 72 72 6f 72 20 61 6e 64 20 73 74 6f 70 20   error and stop 
ba30: 72 65 61 64 69 6e 67 0a 20 20 20 20 20 20 20 20  reading.        
ba40: 2a 2a 20 74 68 65 20 53 51 4c 2e 20 20 2a 2f 0a  ** the SQL.  */.
ba50: 20 20 20 20 20 20 20 20 64 62 52 65 6c 65 61 73          dbReleas
ba60: 65 53 74 6d 74 28 70 44 62 2c 20 70 50 72 65 53  eStmt(pDb, pPreS
ba70: 74 6d 74 2c 20 31 29 3b 0a 23 69 66 20 53 51 4c  tmt, 1);.#if SQL
ba80: 49 54 45 5f 54 45 53 54 0a 20 20 20 20 20 20 20  ITE_TEST.       
ba90: 20 69 66 28 20 70 2d 3e 70 44 62 2d 3e 62 4c 65   if( p->pDb->bLe
baa0: 67 61 63 79 50 72 65 70 61 72 65 20 26 26 20 72  gacyPrepare && r
bab0: 63 73 3d 3d 53 51 4c 49 54 45 5f 53 43 48 45 4d  cs==SQLITE_SCHEM
bac0: 41 20 26 26 20 7a 50 72 65 76 53 71 6c 20 29 7b  A && zPrevSql ){
bad0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
bae0: 20 74 68 65 20 72 75 6e 74 69 6d 65 20 65 72 72   the runtime err
baf0: 6f 72 20 77 61 73 20 61 6e 20 53 51 4c 49 54 45  or was an SQLITE
bb00: 5f 53 43 48 45 4d 41 2c 20 61 6e 64 20 74 68 65  _SCHEMA, and the
bb10: 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20   database.      
bb20: 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 20 69 73      ** handle is
bb30: 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75   configured to u
bb40: 73 65 20 74 68 65 20 6c 65 67 61 63 79 20 73 71  se the legacy sq
bb50: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29 20  lite3_prepare() 
bb60: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  .          ** in
bb70: 74 65 72 66 61 63 65 2c 20 72 65 74 72 79 20 70  terface, retry p
bb80: 72 65 70 61 72 65 28 29 2f 73 74 65 70 28 29 20  repare()/step() 
bb90: 6f 6e 20 74 68 65 20 73 61 6d 65 20 53 51 4c 20  on the same SQL 
bba0: 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20  statement..     
bbb0: 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6f 6e 6c       ** This onl
bbc0: 79 20 68 61 70 70 65 6e 73 20 6f 6e 63 65 2e 20  y happens once. 
bbd0: 49 66 20 74 68 65 72 65 20 69 73 20 61 20 73 65  If there is a se
bbe0: 63 6f 6e 64 20 53 51 4c 49 54 45 5f 53 43 48 45  cond SQLITE_SCHE
bbf0: 4d 41 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  MA.          ** 
bc00: 65 72 72 6f 72 2c 20 74 68 65 20 65 72 72 6f 72  error, the error
bc10: 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
bc20: 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  d to the caller.
bc30: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 2d   */.          p-
bc40: 3e 7a 53 71 6c 20 3d 20 7a 50 72 65 76 53 71 6c  >zSql = zPrevSql
bc50: 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  ;.          cont
bc60: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
bc70: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 54  #endif.        T
bc80: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
bc90: 70 44 62 2d 3e 69 6e 74 65 72 70 2c 0a 20 20 20  pDb->interp,.   
bca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcb0: 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72        Tcl_NewStr
bcc0: 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65  ingObj(sqlite3_e
bcd0: 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20  rrmsg(pDb->db), 
bce0: 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65  -1));.        re
bcf0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
bd00: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
bd10: 20 20 20 20 20 64 62 52 65 6c 65 61 73 65 53 74       dbReleaseSt
bd20: 6d 74 28 70 44 62 2c 20 70 50 72 65 53 74 6d 74  mt(pDb, pPreStmt
bd30: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
bd40: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69    }.  }..  /* Fi
bd50: 6e 69 73 68 65 64 20 2a 2f 0a 20 20 72 65 74 75  nished */.  retu
bd60: 72 6e 20 54 43 4c 5f 42 52 45 41 4b 3b 0a 7d 0a  rn TCL_BREAK;.}.
bd70: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20  ./*.** Free all 
bd80: 72 65 73 6f 75 72 63 65 73 20 63 75 72 72 65 6e  resources curren
bd90: 74 6c 79 20 68 65 6c 64 20 62 79 20 74 68 65 20  tly held by the 
bda0: 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 73 74  DbEvalContext st
bdb0: 72 75 63 74 75 72 65 20 70 61 73 73 65 64 0a 2a  ructure passed.*
bdc0: 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  * as the first a
bdd0: 72 67 75 6d 65 6e 74 2e 20 54 68 65 72 65 20 73  rgument. There s
bde0: 68 6f 75 6c 64 20 62 65 20 65 78 61 63 74 6c 79  hould be exactly
bdf0: 20 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 74 68 69   one call to thi
be00: 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f  s function.** fo
be10: 72 20 65 61 63 68 20 63 61 6c 6c 20 74 6f 20 64  r each call to d
be20: 62 45 76 61 6c 49 6e 69 74 28 29 2e 0a 2a 2f 0a  bEvalInit()..*/.
be30: 73 74 61 74 69 63 20 76 6f 69 64 20 64 62 45 76  static void dbEv
be40: 61 6c 46 69 6e 61 6c 69 7a 65 28 44 62 45 76 61  alFinalize(DbEva
be50: 6c 43 6f 6e 74 65 78 74 20 2a 70 29 7b 0a 20 20  lContext *p){.  
be60: 69 66 28 20 70 2d 3e 70 50 72 65 53 74 6d 74 20  if( p->pPreStmt 
be70: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
be80: 65 73 65 74 28 70 2d 3e 70 50 72 65 53 74 6d 74  eset(p->pPreStmt
be90: 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 64 62  ->pStmt);.    db
bea0: 52 65 6c 65 61 73 65 53 74 6d 74 28 70 2d 3e 70  ReleaseStmt(p->p
beb0: 44 62 2c 20 70 2d 3e 70 50 72 65 53 74 6d 74 2c  Db, p->pPreStmt,
bec0: 20 30 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72 65   0);.    p->pPre
bed0: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Stmt = 0;.  }.  
bee0: 69 66 28 20 70 2d 3e 70 41 72 72 61 79 20 29 7b  if( p->pArray ){
bef0: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
bf00: 43 6f 75 6e 74 28 70 2d 3e 70 41 72 72 61 79 29  Count(p->pArray)
bf10: 3b 0a 20 20 20 20 70 2d 3e 70 41 72 72 61 79 20  ;.    p->pArray 
bf20: 3d 20 30 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 44  = 0;.  }.  Tcl_D
bf30: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70  ecrRefCount(p->p
bf40: 53 71 6c 29 3b 0a 20 20 64 62 52 65 6c 65 61 73  Sql);.  dbReleas
bf50: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 29 3b  eColumnNames(p);
bf60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
bf70: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
bf80: 54 63 6c 5f 4f 62 6a 20 73 74 72 75 63 74 75 72  Tcl_Obj structur
bf90: 65 20 77 69 74 68 20 72 65 66 2d 63 6f 75 6e 74  e with ref-count
bfa0: 20 30 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73   0 that contains
bfb0: 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 66 6f  .** the value fo
bfc0: 72 20 74 68 65 20 69 43 6f 6c 27 74 68 20 63 6f  r the iCol'th co
bfd0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 72 6f 77 20  lumn of the row 
bfe0: 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 65  currently pointe
bff0: 64 20 74 6f 20 62 79 0a 2a 2a 20 74 68 65 20 44  d to by.** the D
c000: 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 73 74 72  bEvalContext str
c010: 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73  ucture passed as
c020: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
c030: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54  ent..*/.static T
c040: 63 6c 5f 4f 62 6a 20 2a 64 62 45 76 61 6c 43 6f  cl_Obj *dbEvalCo
c050: 6c 75 6d 6e 56 61 6c 75 65 28 44 62 45 76 61 6c  lumnValue(DbEval
c060: 43 6f 6e 74 65 78 74 20 2a 70 2c 20 69 6e 74 20  Context *p, int 
c070: 69 43 6f 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33  iCol){.  sqlite3
c080: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 70  _stmt *pStmt = p
c090: 2d 3e 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d  ->pPreStmt->pStm
c0a0: 74 3b 0a 20 20 73 77 69 74 63 68 28 20 73 71 6c  t;.  switch( sql
c0b0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65  ite3_column_type
c0c0: 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29 20 29 7b  (pStmt, iCol) ){
c0d0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
c0e0: 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69  _BLOB: {.      i
c0f0: 6e 74 20 62 79 74 65 73 20 3d 20 73 71 6c 69 74  nt bytes = sqlit
c100: 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28  e3_column_bytes(
c110: 70 53 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20 20  pStmt, iCol);.  
c120: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
c130: 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f  zBlob = sqlite3_
c140: 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d  column_blob(pStm
c150: 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20  t, iCol);.      
c160: 69 66 28 20 21 7a 42 6c 6f 62 20 29 20 62 79 74  if( !zBlob ) byt
c170: 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  es = 0;.      re
c180: 74 75 72 6e 20 54 63 6c 5f 4e 65 77 42 79 74 65  turn Tcl_NewByte
c190: 41 72 72 61 79 4f 62 6a 28 28 75 38 2a 29 7a 42  ArrayObj((u8*)zB
c1a0: 6c 6f 62 2c 20 62 79 74 65 73 29 3b 0a 20 20 20  lob, bytes);.   
c1b0: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
c1c0: 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20  TE_INTEGER: {.  
c1d0: 20 20 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34      sqlite_int64
c1e0: 20 76 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c   v = sqlite3_col
c1f0: 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c  umn_int64(pStmt,
c200: 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 69 66   iCol);.      if
c210: 28 20 76 3e 3d 2d 32 31 34 37 34 38 33 36 34 37  ( v>=-2147483647
c220: 20 26 26 20 76 3c 3d 32 31 34 37 34 38 33 36 34   && v<=214748364
c230: 37 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  7 ){.        ret
c240: 75 72 6e 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  urn Tcl_NewIntOb
c250: 6a 28 28 69 6e 74 29 76 29 3b 0a 20 20 20 20 20  j((int)v);.     
c260: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
c270: 72 65 74 75 72 6e 20 54 63 6c 5f 4e 65 77 57 69  return Tcl_NewWi
c280: 64 65 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20  deIntObj(v);.   
c290: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 63     }.    }.    c
c2a0: 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54  ase SQLITE_FLOAT
c2b0: 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
c2c0: 20 54 63 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f 62   Tcl_NewDoubleOb
c2d0: 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  j(sqlite3_column
c2e0: 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20 69  _double(pStmt, i
c2f0: 43 6f 6c 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Col));.    }.   
c300: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c   case SQLITE_NUL
c310: 4c 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  L: {.      retur
c320: 6e 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  n Tcl_NewStringO
c330: 62 6a 28 70 2d 3e 70 44 62 2d 3e 7a 4e 75 6c 6c  bj(p->pDb->zNull
c340: 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  , -1);.    }.  }
c350: 0a 0a 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e  ..  return Tcl_N
c360: 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61  ewStringObj((cha
c370: 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
c380: 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 43  n_text(pStmt, iC
c390: 6f 6c 29 2c 20 2d 31 29 3b 0a 7d 0a 0a 2f 2a 0a  ol), -1);.}../*.
c3a0: 2a 2a 20 49 66 20 75 73 69 6e 67 20 54 63 6c 20  ** If using Tcl 
c3b0: 76 65 72 73 69 6f 6e 20 38 2e 36 20 6f 72 20 67  version 8.6 or g
c3c0: 72 65 61 74 65 72 2c 20 75 73 65 20 74 68 65 20  reater, use the 
c3d0: 4e 52 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20  NR functions to 
c3e0: 61 76 6f 69 64 0a 2a 2a 20 72 65 63 75 72 73 69  avoid.** recursi
c3f0: 76 65 20 65 76 61 6c 75 74 69 6f 6e 20 6f 66 20  ve evalution of 
c400: 73 63 72 69 70 74 73 20 62 79 20 74 68 65 20 5b  scripts by the [
c410: 64 62 20 65 76 61 6c 5d 20 61 6e 64 20 5b 64 62  db eval] and [db
c420: 20 74 72 61 6e 73 5d 0a 2a 2a 20 63 6f 6d 6d 61   trans].** comma
c430: 6e 64 73 2e 20 45 76 65 6e 20 69 66 20 74 68 65  nds. Even if the
c440: 20 68 65 61 64 65 72 73 20 75 73 65 64 20 77 68   headers used wh
c450: 69 6c 65 20 63 6f 6d 70 69 6c 69 6e 67 20 74 68  ile compiling th
c460: 65 20 65 78 74 65 6e 73 69 6f 6e 0a 2a 2a 20 61  e extension.** a
c470: 72 65 20 38 2e 36 20 6f 72 20 6e 65 77 65 72 2c  re 8.6 or newer,
c480: 20 74 68 65 20 63 6f 64 65 20 73 74 69 6c 6c 20   the code still 
c490: 74 65 73 74 73 20 74 68 65 20 54 63 6c 20 76 65  tests the Tcl ve
c4a0: 72 73 69 6f 6e 20 61 74 20 72 75 6e 74 69 6d 65  rsion at runtime
c4b0: 2e 0a 2a 2a 20 54 68 69 73 20 61 6c 6c 6f 77 73  ..** This allows
c4c0: 20 73 74 75 62 73 2d 65 6e 61 62 6c 65 64 20 62   stubs-enabled b
c4d0: 75 69 6c 64 73 20 74 6f 20 62 65 20 75 73 65 64  uilds to be used
c4e0: 20 77 69 74 68 20 6f 6c 64 65 72 20 54 63 6c 20   with older Tcl 
c4f0: 6c 69 62 72 61 72 69 65 73 2e 0a 2a 2f 0a 23 69  libraries..*/.#i
c500: 66 20 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53  f TCL_MAJOR_VERS
c510: 49 4f 4e 3e 38 20 7c 7c 20 28 54 43 4c 5f 4d 41  ION>8 || (TCL_MA
c520: 4a 4f 52 5f 56 45 52 53 49 4f 4e 3d 3d 38 20 26  JOR_VERSION==8 &
c530: 26 20 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53  & TCL_MINOR_VERS
c540: 49 4f 4e 3e 3d 36 29 0a 23 20 64 65 66 69 6e 65  ION>=6).# define
c550: 20 53 51 4c 49 54 45 5f 54 43 4c 5f 4e 52 45 20   SQLITE_TCL_NRE 
c560: 31 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 55  1.static int DbU
c570: 73 65 4e 72 65 28 76 6f 69 64 29 7b 0a 20 20 69  seNre(void){.  i
c580: 6e 74 20 6d 61 6a 6f 72 2c 20 6d 69 6e 6f 72 3b  nt major, minor;
c590: 0a 20 20 54 63 6c 5f 47 65 74 56 65 72 73 69 6f  .  Tcl_GetVersio
c5a0: 6e 28 26 6d 61 6a 6f 72 2c 20 26 6d 69 6e 6f 72  n(&major, &minor
c5b0: 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  , 0, 0);.  retur
c5c0: 6e 28 20 28 6d 61 6a 6f 72 3d 3d 38 20 26 26 20  n( (major==8 && 
c5d0: 6d 69 6e 6f 72 3e 3d 36 29 20 7c 7c 20 6d 61 6a  minor>=6) || maj
c5e0: 6f 72 3e 38 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a  or>8 );.}.#else.
c5f0: 2f 2a 20 0a 2a 2a 20 43 6f 6d 70 69 6c 69 6e 67  /* .** Compiling
c600: 20 75 73 69 6e 67 20 68 65 61 64 65 72 73 20 65   using headers e
c610: 61 72 6c 69 65 72 20 74 68 61 6e 20 38 2e 36 2e  arlier than 8.6.
c620: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 4e 52   In this case NR
c630: 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 75 73   cannot be.** us
c640: 65 64 2c 20 73 6f 20 44 62 55 73 65 4e 72 65 28  ed, so DbUseNre(
c650: 29 20 74 6f 20 61 6c 77 61 79 73 20 72 65 74 75  ) to always retu
c660: 72 6e 20 7a 65 72 6f 2e 20 41 64 64 20 23 64 65  rn zero. Add #de
c670: 66 69 6e 65 73 20 66 6f 72 20 74 68 65 20 6f 74  fines for the ot
c680: 68 65 72 0a 2a 2a 20 54 63 6c 5f 4e 52 78 78 78  her.** Tcl_NRxxx
c690: 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20  () functions to 
c6a0: 70 72 65 76 65 6e 74 20 74 68 65 6d 20 66 72 6f  prevent them fro
c6b0: 6d 20 63 61 75 73 69 6e 67 20 63 6f 6d 70 69 6c  m causing compil
c6c0: 61 74 69 6f 6e 20 65 72 72 6f 72 73 2c 0a 2a 2a  ation errors,.**
c6d0: 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65   even though the
c6e0: 20 6f 6e 6c 79 20 69 6e 76 6f 63 61 74 69 6f 6e   only invocation
c6f0: 73 20 6f 66 20 74 68 65 6d 20 61 72 65 20 77 69  s of them are wi
c700: 74 68 69 6e 20 63 6f 6e 64 69 74 69 6f 6e 61 6c  thin conditional
c710: 20 62 6c 6f 63 6b 73 20 0a 2a 2a 20 6f 66 20 74   blocks .** of t
c720: 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  he form:.**.**  
c730: 20 69 66 28 20 44 62 55 73 65 4e 72 65 28 29 20   if( DbUseNre() 
c740: 29 20 7b 20 2e 2e 2e 20 7d 0a 2a 2f 0a 23 20 64  ) { ... }.*/.# d
c750: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 43 4c  efine SQLITE_TCL
c760: 5f 4e 52 45 20 30 0a 23 20 64 65 66 69 6e 65 20  _NRE 0.# define 
c770: 44 62 55 73 65 4e 72 65 28 29 20 30 0a 23 20 64  DbUseNre() 0.# d
c780: 65 66 69 6e 65 20 54 63 6c 5f 4e 52 41 64 64 43  efine Tcl_NRAddC
c790: 61 6c 6c 62 61 63 6b 28 61 2c 62 2c 63 2c 64 2c  allback(a,b,c,d,
c7a0: 65 2c 66 29 20 28 76 6f 69 64 29 30 0a 23 20 64  e,f) (void)0.# d
c7b0: 65 66 69 6e 65 20 54 63 6c 5f 4e 52 45 76 61 6c  efine Tcl_NREval
c7c0: 4f 62 6a 28 61 2c 62 2c 63 29 20 30 0a 23 20 64  Obj(a,b,c) 0.# d
c7d0: 65 66 69 6e 65 20 54 63 6c 5f 4e 52 43 72 65 61  efine Tcl_NRCrea
c7e0: 74 65 43 6f 6d 6d 61 6e 64 28 61 2c 62 2c 63 2c  teCommand(a,b,c,
c7f0: 64 2c 65 2c 66 29 20 28 76 6f 69 64 29 30 0a 23  d,e,f) (void)0.#
c800: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
c810: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 70 61  s function is pa
c820: 72 74 20 6f 66 20 74 68 65 20 69 6d 70 6c 65 6d  rt of the implem
c830: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
c840: 63 6f 6d 6d 61 6e 64 3a 0a 2a 2a 0a 2a 2a 20 20  command:.**.**  
c850: 20 24 64 62 20 65 76 61 6c 20 53 51 4c 20 3f 41   $db eval SQL ?A
c860: 52 52 41 59 4e 41 4d 45 3f 20 53 43 52 49 50 54  RRAYNAME? SCRIPT
c870: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44  .*/.static int D
c880: 62 45 76 61 6c 4e 65 78 74 43 6d 64 28 0a 20 20  bEvalNextCmd(.  
c890: 43 6c 69 65 6e 74 44 61 74 61 20 64 61 74 61 5b  ClientData data[
c8a0: 5d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ],              
c8b0: 20 20 20 20 20 2f 2a 20 64 61 74 61 5b 30 5d 20       /* data[0] 
c8c0: 69 73 20 74 68 65 20 28 44 62 45 76 61 6c 43 6f  is the (DbEvalCo
c8d0: 6e 74 65 78 74 2a 29 20 2a 2f 0a 20 20 54 63 6c  ntext*) */.  Tcl
c8e0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
c8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c900: 20 20 2f 2a 20 54 63 6c 20 69 6e 74 65 72 70 72    /* Tcl interpr
c910: 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65  eter */.  int re
c920: 73 75 6c 74 20 20 20 20 20 20 20 20 20 20 20 20  sult            
c930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c940: 2a 20 52 65 73 75 6c 74 20 73 6f 20 66 61 72 20  * Result so far 
c950: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
c960: 20 72 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20   result;        
c970: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c980: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
c990: 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 65    /* The first e
c9a0: 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 64 61  lement of the da
c9b0: 74 61 5b 5d 20 61 72 72 61 79 20 69 73 20 61 20  ta[] array is a 
c9c0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 44 62 45  pointer to a DbE
c9d0: 76 61 6c 43 6f 6e 74 65 78 74 0a 20 20 2a 2a 20  valContext.  ** 
c9e0: 73 74 72 75 63 74 75 72 65 20 61 6c 6c 6f 63 61  structure alloca
c9f0: 74 65 64 20 75 73 69 6e 67 20 54 63 6c 5f 41 6c  ted using Tcl_Al
ca00: 6c 6f 63 28 29 2e 20 54 68 65 20 73 65 63 6f 6e  loc(). The secon
ca10: 64 20 65 6c 65 6d 65 6e 74 20 6f 66 20 64 61 74  d element of dat
ca20: 61 5b 5d 0a 20 20 2a 2a 20 69 73 20 61 20 70 6f  a[].  ** is a po
ca30: 69 6e 74 65 72 20 74 6f 20 61 20 54 63 6c 5f 4f  inter to a Tcl_O
ca40: 62 6a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  bj containing th
ca50: 65 20 73 63 72 69 70 74 20 74 6f 20 72 75 6e 20  e script to run 
ca60: 66 6f 72 20 65 61 63 68 20 72 6f 77 0a 20 20 2a  for each row.  *
ca70: 2a 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  * returned by th
ca80: 65 20 71 75 65 72 69 65 73 20 65 6e 63 61 70 73  e queries encaps
ca90: 75 6c 61 74 65 64 20 69 6e 20 64 61 74 61 5b 30  ulated in data[0
caa0: 5d 2e 20 2a 2f 0a 20 20 44 62 45 76 61 6c 43 6f  ]. */.  DbEvalCo
cab0: 6e 74 65 78 74 20 2a 70 20 3d 20 28 44 62 45 76  ntext *p = (DbEv
cac0: 61 6c 43 6f 6e 74 65 78 74 20 2a 29 64 61 74 61  alContext *)data
cad0: 5b 30 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  [0];.  Tcl_Obj *
cae0: 70 53 63 72 69 70 74 20 3d 20 28 54 63 6c 5f 4f  pScript = (Tcl_O
caf0: 62 6a 20 2a 29 64 61 74 61 5b 31 5d 3b 0a 20 20  bj *)data[1];.  
cb00: 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 72 61 79 20  Tcl_Obj *pArray 
cb10: 3d 20 70 2d 3e 70 41 72 72 61 79 3b 0a 0a 20 20  = p->pArray;..  
cb20: 77 68 69 6c 65 28 20 28 72 63 3d 3d 54 43 4c 5f  while( (rc==TCL_
cb30: 4f 4b 20 7c 7c 20 72 63 3d 3d 54 43 4c 5f 43 4f  OK || rc==TCL_CO
cb40: 4e 54 49 4e 55 45 29 20 26 26 20 54 43 4c 5f 4f  NTINUE) && TCL_O
cb50: 4b 3d 3d 28 72 63 20 3d 20 64 62 45 76 61 6c 53  K==(rc = dbEvalS
cb60: 74 65 70 28 70 29 29 20 29 7b 0a 20 20 20 20 69  tep(p)) ){.    i
cb70: 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43  nt i;.    int nC
cb80: 6f 6c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  ol;.    Tcl_Obj 
cb90: 2a 2a 61 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 20  **apColName;.   
cba0: 20 64 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28 70   dbEvalRowInfo(p
cbb0: 2c 20 26 6e 43 6f 6c 2c 20 26 61 70 43 6f 6c 4e  , &nCol, &apColN
cbc0: 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  ame);.    for(i=
cbd0: 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
cbe0: 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  .      Tcl_Obj *
cbf0: 70 56 61 6c 20 3d 20 64 62 45 76 61 6c 43 6f 6c  pVal = dbEvalCol
cc00: 75 6d 6e 56 61 6c 75 65 28 70 2c 20 69 29 3b 0a  umnValue(p, i);.
cc10: 20 20 20 20 20 20 69 66 28 20 70 41 72 72 61 79        if( pArray
cc20: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 54  ==0 ){.        T
cc30: 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e  cl_ObjSetVar2(in
cc40: 74 65 72 70 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b  terp, apColName[
cc50: 69 5d 2c 20 30 2c 20 70 56 61 6c 2c 20 30 29 3b  i], 0, pVal, 0);
cc60: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
cc70: 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74        Tcl_ObjSet
cc80: 56 61 72 32 28 69 6e 74 65 72 70 2c 20 70 41 72  Var2(interp, pAr
cc90: 72 61 79 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b 69  ray, apColName[i
cca0: 5d 2c 20 70 56 61 6c 2c 20 30 29 3b 0a 20 20 20  ], pVal, 0);.   
ccb0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
ccc0: 2f 2a 20 54 68 65 20 72 65 71 75 69 72 65 64 20  /* The required 
ccd0: 69 6e 74 65 72 70 72 65 74 65 72 20 76 61 72 69  interpreter vari
cce0: 61 62 6c 65 73 20 61 72 65 20 6e 6f 77 20 70 6f  ables are now po
ccf0: 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 65  pulated with the
cd00: 20 64 61 74 61 20 0a 20 20 20 20 2a 2a 20 66 72   data .    ** fr
cd10: 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  om the current r
cd20: 6f 77 2e 20 49 66 20 75 73 69 6e 67 20 4e 52 45  ow. If using NRE
cd30: 2c 20 73 63 68 65 64 75 6c 65 20 63 61 6c 6c 62  , schedule callb
cd40: 61 63 6b 73 20 74 6f 20 65 76 61 6c 75 61 74 65  acks to evaluate
cd50: 0a 20 20 20 20 2a 2a 20 73 63 72 69 70 74 20 70  .    ** script p
cd60: 53 63 72 69 70 74 2c 20 74 68 65 6e 20 74 6f 20  Script, then to 
cd70: 69 6e 76 6f 6b 65 20 74 68 69 73 20 66 75 6e 63  invoke this func
cd80: 74 69 6f 6e 20 61 67 61 69 6e 20 74 6f 20 66 65  tion again to fe
cd90: 74 63 68 20 74 68 65 20 6e 65 78 74 0a 20 20 20  tch the next.   
cda0: 20 2a 2a 20 72 6f 77 20 28 6f 72 20 63 6c 65 61   ** row (or clea
cdb0: 6e 20 75 70 20 69 66 20 74 68 65 72 65 20 69 73  n up if there is
cdc0: 20 6e 6f 20 6e 65 78 74 20 72 6f 77 20 6f 72 20   no next row or 
cdd0: 74 68 65 20 73 63 72 69 70 74 20 74 68 72 6f 77  the script throw
cde0: 73 20 61 6e 0a 20 20 20 20 2a 2a 20 65 78 63 65  s an.    ** exce
cdf0: 70 74 69 6f 6e 29 2e 20 41 66 74 65 72 20 73 63  ption). After sc
ce00: 68 65 64 75 6c 69 6e 67 20 74 68 65 20 63 61 6c  heduling the cal
ce10: 6c 62 61 63 6b 73 2c 20 72 65 74 75 72 6e 20 63  lbacks, return c
ce20: 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 0a 20  ontrol to the . 
ce30: 20 20 20 2a 2a 20 63 61 6c 6c 65 72 2e 0a 20 20     ** caller..  
ce40: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 6e    **.    ** If n
ce50: 6f 74 20 75 73 69 6e 67 20 4e 52 45 2c 20 65 76  ot using NRE, ev
ce60: 61 6c 75 61 74 65 20 70 53 63 72 69 70 74 20 64  aluate pScript d
ce70: 69 72 65 63 74 6c 79 20 61 6e 64 20 63 6f 6e 74  irectly and cont
ce80: 69 6e 75 65 20 77 69 74 68 20 74 68 65 0a 20 20  inue with the.  
ce90: 20 20 2a 2a 20 6e 65 78 74 20 69 74 65 72 61 74    ** next iterat
cea0: 69 6f 6e 20 6f 66 20 74 68 69 73 20 77 68 69 6c  ion of this whil
ceb0: 65 28 2e 2e 2e 29 20 6c 6f 6f 70 2e 20 20 2a 2f  e(...) loop.  */
cec0: 0a 20 20 20 20 69 66 28 20 44 62 55 73 65 4e 72  .    if( DbUseNr
ced0: 65 28 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  e() ){.      Tcl
cee0: 5f 4e 52 41 64 64 43 61 6c 6c 62 61 63 6b 28 69  _NRAddCallback(i
cef0: 6e 74 65 72 70 2c 20 44 62 45 76 61 6c 4e 65 78  nterp, DbEvalNex
cf00: 74 43 6d 64 2c 20 28 76 6f 69 64 2a 29 70 2c 20  tCmd, (void*)p, 
cf10: 28 76 6f 69 64 2a 29 70 53 63 72 69 70 74 2c 20  (void*)pScript, 
cf20: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74  0, 0);.      ret
cf30: 75 72 6e 20 54 63 6c 5f 4e 52 45 76 61 6c 4f 62  urn Tcl_NREvalOb
cf40: 6a 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70  j(interp, pScrip
cf50: 74 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t, 0);.    }else
cf60: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 63 6c  {.      rc = Tcl
cf70: 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72  _EvalObjEx(inter
cf80: 70 2c 20 70 53 63 72 69 70 74 2c 20 30 29 3b 0a  p, pScript, 0);.
cf90: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 54 63 6c      }.  }..  Tcl
cfa0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 53  _DecrRefCount(pS
cfb0: 63 72 69 70 74 29 3b 0a 20 20 64 62 45 76 61 6c  cript);.  dbEval
cfc0: 46 69 6e 61 6c 69 7a 65 28 70 29 3b 0a 20 20 54  Finalize(p);.  T
cfd0: 63 6c 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29  cl_Free((char *)
cfe0: 70 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 54  p);..  if( rc==T
cff0: 43 4c 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 54 43 4c  CL_OK || rc==TCL
d000: 5f 42 52 45 41 4b 20 29 7b 0a 20 20 20 20 54 63  _BREAK ){.    Tc
d010: 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e  l_ResetResult(in
d020: 74 65 72 70 29 3b 0a 20 20 20 20 72 63 20 3d 20  terp);.    rc = 
d030: 54 43 4c 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65  TCL_OK;.  }.  re
d040: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
d050: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
d060: 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 69  is used by the i
d070: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f  mplementations o
d080: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
d090: 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 68 61 6e  database .** han
d0a0: 64 6c 65 20 73 75 62 2d 63 6f 6d 6d 61 6e 64 73  dle sub-commands
d0b0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 24 64 62 20 75 70  :.**.**   $db up
d0c0: 64 61 74 65 5f 68 6f 6f 6b 20 3f 53 43 52 49 50  date_hook ?SCRIP
d0d0: 54 3f 0a 2a 2a 20 20 20 24 64 62 20 77 61 6c 5f  T?.**   $db wal_
d0e0: 68 6f 6f 6b 20 3f 53 43 52 49 50 54 3f 0a 2a 2a  hook ?SCRIPT?.**
d0f0: 20 20 20 24 64 62 20 63 6f 6d 6d 69 74 5f 68 6f     $db commit_ho
d100: 6f 6b 20 3f 53 43 52 49 50 54 3f 0a 2a 2a 20 20  ok ?SCRIPT?.**  
d110: 20 24 64 62 20 70 72 65 75 70 64 61 74 65 20 68   $db preupdate h
d120: 6f 6f 6b 20 3f 53 43 52 49 50 54 3f 0a 2a 2f 0a  ook ?SCRIPT?.*/.
d130: 73 74 61 74 69 63 20 76 6f 69 64 20 44 62 48 6f  static void DbHo
d140: 6f 6b 43 6d 64 28 0a 20 20 54 63 6c 5f 49 6e 74  okCmd(.  Tcl_Int
d150: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
d160: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 63 6c 20           /* Tcl 
d170: 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20  interpreter */. 
d180: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 2c 20   SqliteDb *pDb, 
d190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1a0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e   /* Database han
d1b0: 64 6c 65 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  dle */.  Tcl_Obj
d1c0: 20 2a 70 41 72 67 2c 20 20 20 20 20 20 20 20 20   *pArg,         
d1d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 43 52 49           /* SCRI
d1e0: 50 54 20 61 72 67 75 6d 65 6e 74 20 28 6f 72 20  PT argument (or 
d1f0: 4e 55 4c 4c 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f  NULL) */.  Tcl_O
d200: 62 6a 20 2a 2a 70 70 48 6f 6f 6b 20 20 20 20 20  bj **ppHook     
d210: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
d220: 69 6e 74 65 72 20 74 6f 20 6d 65 6d 62 65 72 20  inter to member 
d230: 6f 66 20 53 71 6c 69 74 65 44 62 20 2a 2f 0a 29  of SqliteDb */.)
d240: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
d250: 3d 20 70 44 62 2d 3e 64 62 3b 0a 0a 20 20 69 66  = pDb->db;..  if
d260: 28 20 2a 70 70 48 6f 6f 6b 20 29 7b 0a 20 20 20  ( *ppHook ){.   
d270: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
d280: 74 28 69 6e 74 65 72 70 2c 20 2a 70 70 48 6f 6f  t(interp, *ppHoo
d290: 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 41 72 67  k);.    if( pArg
d2a0: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44 65   ){.      Tcl_De
d2b0: 63 72 52 65 66 43 6f 75 6e 74 28 2a 70 70 48 6f  crRefCount(*ppHo
d2c0: 6f 6b 29 3b 0a 20 20 20 20 20 20 2a 70 70 48 6f  ok);.      *ppHo
d2d0: 6f 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ok = 0;.    }.  
d2e0: 7d 0a 20 20 69 66 28 20 70 41 72 67 20 29 7b 0a  }.  if( pArg ){.
d2f0: 20 20 20 20 61 73 73 65 72 74 28 20 21 28 2a 70      assert( !(*p
d300: 70 48 6f 6f 6b 29 20 29 3b 0a 20 20 20 20 69 66  pHook) );.    if
d310: 28 20 54 63 6c 5f 47 65 74 43 68 61 72 4c 65 6e  ( Tcl_GetCharLen
d320: 67 74 68 28 70 41 72 67 29 3e 30 20 29 7b 0a 20  gth(pArg)>0 ){. 
d330: 20 20 20 20 20 2a 70 70 48 6f 6f 6b 20 3d 20 70       *ppHook = p
d340: 41 72 67 3b 0a 20 20 20 20 20 20 54 63 6c 5f 49  Arg;.      Tcl_I
d350: 6e 63 72 52 65 66 43 6f 75 6e 74 28 2a 70 70 48  ncrRefCount(*ppH
d360: 6f 6f 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ook);.    }.  }.
d370: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
d380: 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f  NABLE_PREUPDATE_
d390: 48 4f 4f 4b 0a 20 20 73 71 6c 69 74 65 33 5f 70  HOOK.  sqlite3_p
d3a0: 72 65 75 70 64 61 74 65 5f 68 6f 6f 6b 28 64 62  reupdate_hook(db
d3b0: 2c 20 28 70 44 62 2d 3e 70 50 72 65 55 70 64 61  , (pDb->pPreUpda
d3c0: 74 65 48 6f 6f 6b 3f 44 62 50 72 65 55 70 64 61  teHook?DbPreUpda
d3d0: 74 65 48 61 6e 64 6c 65 72 3a 30 29 2c 20 70 44  teHandler:0), pD
d3e0: 62 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  b);.#endif.  sql
d3f0: 69 74 65 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b  ite3_update_hook
d400: 28 64 62 2c 20 28 70 44 62 2d 3e 70 55 70 64 61  (db, (pDb->pUpda
d410: 74 65 48 6f 6f 6b 3f 44 62 55 70 64 61 74 65 48  teHook?DbUpdateH
d420: 61 6e 64 6c 65 72 3a 30 29 2c 20 70 44 62 29 3b  andler:0), pDb);
d430: 0a 20 20 73 71 6c 69 74 65 33 5f 72 6f 6c 6c 62  .  sqlite3_rollb
d440: 61 63 6b 5f 68 6f 6f 6b 28 64 62 2c 20 28 70 44  ack_hook(db, (pD
d450: 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b  b->pRollbackHook
d460: 3f 44 62 52 6f 6c 6c 62 61 63 6b 48 61 6e 64 6c  ?DbRollbackHandl
d470: 65 72 3a 30 29 2c 20 70 44 62 29 3b 0a 20 20 73  er:0), pDb);.  s
d480: 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28  qlite3_wal_hook(
d490: 64 62 2c 20 28 70 44 62 2d 3e 70 57 61 6c 48 6f  db, (pDb->pWalHo
d4a0: 6f 6b 3f 44 62 57 61 6c 48 61 6e 64 6c 65 72 3a  ok?DbWalHandler:
d4b0: 30 29 2c 20 70 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a  0), pDb);.}../*.
d4c0: 2a 2a 20 54 68 65 20 22 73 71 6c 69 74 65 22 20  ** The "sqlite" 
d4d0: 63 6f 6d 6d 61 6e 64 20 62 65 6c 6f 77 20 63 72  command below cr
d4e0: 65 61 74 65 73 20 61 20 6e 65 77 20 54 63 6c 20  eates a new Tcl 
d4f0: 63 6f 6d 6d 61 6e 64 20 66 6f 72 20 65 61 63 68  command for each
d500: 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  .** connection i
d510: 74 20 6f 70 65 6e 73 20 74 6f 20 61 6e 20 53 51  t opens to an SQ
d520: 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e 20 20  Lite database.  
d530: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
d540: 69 6e 76 6f 6b 65 64 0a 2a 2a 20 77 68 65 6e 65  invoked.** whene
d550: 76 65 72 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65  ver one of those
d560: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2d 73 70 65 63   connection-spec
d570: 69 66 69 63 20 63 6f 6d 6d 61 6e 64 73 20 69 73  ific commands is
d580: 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 69 6e 20   executed.** in 
d590: 54 63 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  Tcl.  For exampl
d5a0: 65 2c 20 69 66 20 79 6f 75 20 72 75 6e 20 54 63  e, if you run Tc
d5b0: 6c 20 63 6f 64 65 20 6c 69 6b 65 20 74 68 69 73  l code like this
d5c0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 73 71  :.**.**       sq
d5d0: 6c 69 74 65 33 20 64 62 31 20 20 22 6d 79 5f 64  lite3 db1  "my_d
d5e0: 61 74 61 62 61 73 65 22 0a 2a 2a 20 20 20 20 20  atabase".**     
d5f0: 20 20 64 62 31 20 63 6c 6f 73 65 0a 2a 2a 0a 2a    db1 close.**.*
d600: 2a 20 54 68 65 20 66 69 72 73 74 20 63 6f 6d 6d  * The first comm
d610: 61 6e 64 20 6f 70 65 6e 73 20 61 20 63 6f 6e 6e  and opens a conn
d620: 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 22 6d  ection to the "m
d630: 79 5f 64 61 74 61 62 61 73 65 22 20 64 61 74 61  y_database" data
d640: 62 61 73 65 0a 2a 2a 20 61 6e 64 20 63 61 6c 6c  base.** and call
d650: 73 20 74 68 61 74 20 63 6f 6e 6e 65 63 74 69 6f  s that connectio
d660: 6e 20 22 64 62 31 22 2e 20 20 54 68 65 20 73 65  n "db1".  The se
d670: 63 6f 6e 64 20 63 6f 6d 6d 61 6e 64 20 63 61 75  cond command cau
d680: 73 65 73 20 74 68 69 73 0a 2a 2a 20 73 75 62 72  ses this.** subr
d690: 6f 75 74 69 6e 65 20 74 6f 20 62 65 20 69 6e 76  outine to be inv
d6a0: 6f 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oked..*/.static 
d6b0: 69 6e 74 20 44 62 4f 62 6a 43 6d 64 28 76 6f 69  int DbObjCmd(voi
d6c0: 64 20 2a 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72  d *cd, Tcl_Inter
d6d0: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
d6e0: 62 6a 63 2c 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  bjc,Tcl_Obj *con
d6f0: 73 74 2a 6f 62 6a 76 29 7b 0a 20 20 53 71 6c 69  st*objv){.  Sqli
d700: 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c  teDb *pDb = (Sql
d710: 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e 74  iteDb*)cd;.  int
d720: 20 63 68 6f 69 63 65 3b 0a 20 20 69 6e 74 20 72   choice;.  int r
d730: 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 73 74  c = TCL_OK;.  st
d740: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
d750: 2a 44 42 5f 73 74 72 73 5b 5d 20 3d 20 7b 0a 20  *DB_strs[] = {. 
d760: 20 20 20 22 61 75 74 68 6f 72 69 7a 65 72 22 2c     "authorizer",
d770: 20 20 20 20 20 20 20 20 20 22 62 61 63 6b 75 70           "backup
d780: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 22 62  ",            "b
d790: 75 73 79 22 2c 0a 20 20 20 20 22 63 61 63 68 65  usy",.    "cache
d7a0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
d7b0: 22 63 68 61 6e 67 65 73 22 2c 20 20 20 20 20 20  "changes",      
d7c0: 20 20 20 20 20 22 63 6c 6f 73 65 22 2c 0a 20 20       "close",.  
d7d0: 20 20 22 63 6f 6c 6c 61 74 65 22 2c 20 20 20 20    "collate",    
d7e0: 20 20 20 20 20 20 20 20 22 63 6f 6c 6c 61 74 69          "collati
d7f0: 6f 6e 5f 6e 65 65 64 65 64 22 2c 20 20 22 63 6f  on_needed",  "co
d800: 6d 6d 69 74 5f 68 6f 6f 6b 22 2c 0a 20 20 20 20  mmit_hook",.    
d810: 22 63 6f 6d 70 6c 65 74 65 22 2c 20 20 20 20 20  "complete",     
d820: 20 20 20 20 20 20 22 63 6f 70 79 22 2c 20 20 20        "copy",   
d830: 20 20 20 20 20 20 20 20 20 20 20 22 65 6e 61 62             "enab
d840: 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  le_load_extensio
d850: 6e 22 2c 0a 20 20 20 20 22 65 72 72 6f 72 63 6f  n",.    "errorco
d860: 64 65 22 2c 20 20 20 20 20 20 20 20 20 20 22 65  de",          "e
d870: 76 61 6c 22 2c 20 20 20 20 20 20 20 20 20 20 20  val",           
d880: 20 20 20 22 65 78 69 73 74 73 22 2c 0a 20 20 20     "exists",.   
d890: 20 22 66 75 6e 63 74 69 6f 6e 22 2c 20 20 20 20   "function",    
d8a0: 20 20 20 20 20 20 20 22 69 6e 63 72 62 6c 6f 62         "incrblob
d8b0: 22 2c 20 20 20 20 20 20 20 20 20 20 22 69 6e 74  ",          "int
d8c0: 65 72 72 75 70 74 22 2c 0a 20 20 20 20 22 6c 61  errupt",.    "la
d8d0: 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 22  st_insert_rowid"
d8e0: 2c 20 20 22 6e 75 6c 6c 76 61 6c 75 65 22 2c 20  ,  "nullvalue", 
d8f0: 20 20 20 20 20 20 20 20 22 6f 6e 65 63 6f 6c 75          "onecolu
d900: 6d 6e 22 2c 0a 20 20 20 20 22 70 72 65 75 70 64  mn",.    "preupd
d910: 61 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 22  ate",          "
d920: 70 72 6f 66 69 6c 65 22 2c 20 20 20 20 20 20 20  profile",       
d930: 20 20 20 20 22 70 72 6f 67 72 65 73 73 22 2c 0a      "progress",.
d940: 20 20 20 20 22 72 65 6b 65 79 22 2c 20 20 20 20      "rekey",    
d950: 20 20 20 20 20 20 20 20 20 20 22 72 65 73 74 6f            "resto
d960: 72 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 22  re",           "
d970: 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 22 2c 0a  rollback_hook",.
d980: 20 20 20 20 22 73 74 61 74 75 73 22 2c 20 20 20      "status",   
d990: 20 20 20 20 20 20 20 20 20 20 22 74 69 6d 65 6f            "timeo
d9a0: 75 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 22  ut",           "
d9b0: 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 22 2c 0a  total_changes",.
d9c0: 20 20 20 20 22 74 72 61 63 65 22 2c 20 20 20 20      "trace",    
d9d0: 20 20 20 20 20 20 20 20 20 20 22 74 72 61 6e 73            "trans
d9e0: 61 63 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 22  action",       "
d9f0: 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 22 2c 0a  unlock_notify",.
da00: 20 20 20 20 22 75 70 64 61 74 65 5f 68 6f 6f 6b      "update_hook
da10: 22 2c 20 20 20 20 20 20 20 20 22 76 65 72 73 69  ",        "versi
da20: 6f 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20 22  on",           "
da30: 77 61 6c 5f 68 6f 6f 6b 22 2c 0a 20 20 20 20 30  wal_hook",.    0
da40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da50: 20 20 20 20 0a 20 20 7d 3b 0a 20 20 65 6e 75 6d      .  };.  enum
da60: 20 44 42 5f 65 6e 75 6d 20 7b 0a 20 20 20 20 44   DB_enum {.    D
da70: 42 5f 41 55 54 48 4f 52 49 5a 45 52 2c 20 20 20  B_AUTHORIZER,   
da80: 20 20 20 20 20 44 42 5f 42 41 43 4b 55 50 2c 20       DB_BACKUP, 
da90: 20 20 20 20 20 20 20 20 20 20 44 42 5f 42 55 53            DB_BUS
daa0: 59 2c 0a 20 20 20 20 44 42 5f 43 41 43 48 45 2c  Y,.    DB_CACHE,
dab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f               DB_
dac0: 43 48 41 4e 47 45 53 2c 20 20 20 20 20 20 20 20  CHANGES,        
dad0: 20 20 44 42 5f 43 4c 4f 53 45 2c 0a 20 20 20 20    DB_CLOSE,.    
dae0: 44 42 5f 43 4f 4c 4c 41 54 45 2c 20 20 20 20 20  DB_COLLATE,     
daf0: 20 20 20 20 20 20 44 42 5f 43 4f 4c 4c 41 54 49        DB_COLLATI
db00: 4f 4e 5f 4e 45 45 44 45 44 2c 20 44 42 5f 43 4f  ON_NEEDED, DB_CO
db10: 4d 4d 49 54 5f 48 4f 4f 4b 2c 0a 20 20 20 20 44  MMIT_HOOK,.    D
db20: 42 5f 43 4f 4d 50 4c 45 54 45 2c 20 20 20 20 20  B_COMPLETE,     
db30: 20 20 20 20 20 44 42 5f 43 4f 50 59 2c 20 20 20       DB_COPY,   
db40: 20 20 20 20 20 20 20 20 20 20 44 42 5f 45 4e 41            DB_ENA
db50: 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  BLE_LOAD_EXTENSI
db60: 4f 4e 2c 0a 20 20 20 20 44 42 5f 45 52 52 4f 52  ON,.    DB_ERROR
db70: 43 4f 44 45 2c 20 20 20 20 20 20 20 20 20 44 42  CODE,         DB
db80: 5f 45 56 41 4c 2c 20 20 20 20 20 20 20 20 20 20  _EVAL,          
db90: 20 20 20 44 42 5f 45 58 49 53 54 53 2c 0a 20 20     DB_EXISTS,.  
dba0: 20 20 44 42 5f 46 55 4e 43 54 49 4f 4e 2c 20 20    DB_FUNCTION,  
dbb0: 20 20 20 20 20 20 20 20 44 42 5f 49 4e 43 52 42          DB_INCRB
dbc0: 4c 4f 42 2c 20 20 20 20 20 20 20 20 20 44 42 5f  LOB,         DB_
dbd0: 49 4e 54 45 52 52 55 50 54 2c 0a 20 20 20 20 44  INTERRUPT,.    D
dbe0: 42 5f 4c 41 53 54 5f 49 4e 53 45 52 54 5f 52 4f  B_LAST_INSERT_RO
dbf0: 57 49 44 2c 20 44 42 5f 4e 55 4c 4c 56 41 4c 55  WID, DB_NULLVALU
dc00: 45 2c 20 20 20 20 20 20 20 20 44 42 5f 4f 4e 45  E,        DB_ONE
dc10: 43 4f 4c 55 4d 4e 2c 0a 20 20 20 20 44 42 5f 50  COLUMN,.    DB_P
dc20: 52 45 55 50 44 41 54 45 2c 20 20 20 20 20 20 20  REUPDATE,       
dc30: 20 20 44 42 5f 50 52 4f 46 49 4c 45 2c 20 20 20    DB_PROFILE,   
dc40: 20 20 20 20 20 20 20 44 42 5f 50 52 4f 47 52 45         DB_PROGRE
dc50: 53 53 2c 0a 20 20 20 20 44 42 5f 52 45 4b 45 59  SS,.    DB_REKEY
dc60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 44 42  ,             DB
dc70: 5f 52 45 53 54 4f 52 45 2c 20 20 20 20 20 20 20  _RESTORE,       
dc80: 20 20 20 44 42 5f 52 4f 4c 4c 42 41 43 4b 5f 48     DB_ROLLBACK_H
dc90: 4f 4f 4b 2c 0a 20 20 20 20 44 42 5f 53 54 41 54  OOK,.    DB_STAT
dca0: 55 53 2c 20 20 20 20 20 20 20 20 20 20 20 20 44  US,            D
dcb0: 42 5f 54 49 4d 45 4f 55 54 2c 20 20 20 20 20 20  B_TIMEOUT,      
dcc0: 20 20 20 20 44 42 5f 54 4f 54 41 4c 5f 43 48 41      DB_TOTAL_CHA
dcd0: 4e 47 45 53 2c 0a 20 20 20 20 44 42 5f 54 52 41  NGES,.    DB_TRA
dce0: 43 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  CE,             
dcf0: 44 42 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20  DB_TRANSACTION, 
dd00: 20 20 20 20 20 44 42 5f 55 4e 4c 4f 43 4b 5f 4e       DB_UNLOCK_N
dd10: 4f 54 49 46 59 2c 0a 20 20 20 20 44 42 5f 55 50  OTIFY,.    DB_UP
dd20: 44 41 54 45 5f 48 4f 4f 4b 2c 20 20 20 20 20 20  DATE_HOOK,      
dd30: 20 44 42 5f 56 45 52 53 49 4f 4e 2c 20 20 20 20   DB_VERSION,    
dd40: 20 20 20 20 20 20 44 42 5f 57 41 4c 5f 48 4f 4f        DB_WAL_HOO
dd50: 4b 2c 0a 20 20 7d 3b 0a 20 20 2f 2a 20 64 6f 6e  K,.  };.  /* don
dd60: 27 74 20 6c 65 61 76 65 20 74 72 61 69 6c 69 6e  't leave trailin
dd70: 67 20 63 6f 6d 6d 61 73 20 6f 6e 20 44 42 5f 65  g commas on DB_e
dd80: 6e 75 6d 2c 20 69 74 20 63 6f 6e 66 75 73 65 73  num, it confuses
dd90: 20 74 68 65 20 41 49 58 20 78 6c 63 20 63 6f 6d   the AIX xlc com
dda0: 70 69 6c 65 72 20 2a 2f 0a 0a 20 20 69 66 28 20  piler */..  if( 
ddb0: 6f 62 6a 63 3c 32 20 29 7b 0a 20 20 20 20 54 63  objc<2 ){.    Tc
ddc0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
ddd0: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
dde0: 22 53 55 42 43 4f 4d 4d 41 4e 44 20 2e 2e 2e 22  "SUBCOMMAND ..."
ddf0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
de00: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
de10: 66 28 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46  f( Tcl_GetIndexF
de20: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
de30: 62 6a 76 5b 31 5d 2c 20 44 42 5f 73 74 72 73 2c  bjv[1], DB_strs,
de40: 20 22 6f 70 74 69 6f 6e 22 2c 20 30 2c 20 26 63   "option", 0, &c
de50: 68 6f 69 63 65 29 20 29 7b 0a 20 20 20 20 72 65  hoice) ){.    re
de60: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
de70: 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 28    }..  switch( (
de80: 65 6e 75 6d 20 44 42 5f 65 6e 75 6d 29 63 68 6f  enum DB_enum)cho
de90: 69 63 65 20 29 7b 0a 0a 20 20 2f 2a 20 20 20 20  ice ){..  /*    
dea0: 24 64 62 20 61 75 74 68 6f 72 69 7a 65 72 20 3f  $db authorizer ?
deb0: 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20  CALLBACK?.  **. 
dec0: 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67   ** Invoke the g
ded0: 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 74 6f  iven callback to
dee0: 20 61 75 74 68 6f 72 69 7a 65 20 65 61 63 68 20   authorize each 
def0: 53 51 4c 20 6f 70 65 72 61 74 69 6f 6e 20 61 73  SQL operation as
df00: 20 69 74 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70   it is.  ** comp
df10: 69 6c 65 64 2e 20 20 35 20 61 72 67 75 6d 65 6e  iled.  5 argumen
df20: 74 73 20 61 72 65 20 61 70 70 65 6e 64 65 64 20  ts are appended 
df30: 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  to the callback 
df40: 62 65 66 6f 72 65 20 69 74 20 69 73 0a 20 20 2a  before it is.  *
df50: 2a 20 69 6e 76 6f 6b 65 64 3a 0a 20 20 2a 2a 0a  * invoked:.  **.
df60: 20 20 2a 2a 20 20 20 28 31 29 20 54 68 65 20 61    **   (1) The a
df70: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 79 70  uthorization typ
df80: 65 20 28 65 78 3a 20 53 51 4c 49 54 45 5f 43 52  e (ex: SQLITE_CR
df90: 45 41 54 45 5f 54 41 42 4c 45 2c 20 53 51 4c 49  EATE_TABLE, SQLI
dfa0: 54 45 5f 49 4e 53 45 52 54 2c 20 2e 2e 2e 29 0a  TE_INSERT, ...).
dfb0: 20 20 2a 2a 20 20 20 28 32 29 20 46 69 72 73 74    **   (2) First
dfc0: 20 64 65 73 63 72 69 70 74 69 76 65 20 6e 61 6d   descriptive nam
dfd0: 65 20 28 64 65 70 65 6e 64 73 20 6f 6e 20 61 75  e (depends on au
dfe0: 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 79 70 65  thorization type
dff0: 29 0a 20 20 2a 2a 20 20 20 28 33 29 20 53 65 63  ).  **   (3) Sec
e000: 6f 6e 64 20 64 65 73 63 72 69 70 74 69 76 65 20  ond descriptive 
e010: 6e 61 6d 65 0a 20 20 2a 2a 20 20 20 28 34 29 20  name.  **   (4) 
e020: 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
e030: 62 61 73 65 20 28 65 78 3a 20 22 6d 61 69 6e 22  base (ex: "main"
e040: 2c 20 22 74 65 6d 70 22 29 0a 20 20 2a 2a 20 20  , "temp").  **  
e050: 20 28 35 29 20 4e 61 6d 65 20 6f 66 20 74 72 69   (5) Name of tri
e060: 67 67 65 72 20 74 68 61 74 20 69 73 20 64 6f 69  gger that is doi
e070: 6e 67 20 74 68 65 20 61 63 63 65 73 73 0a 20 20  ng the access.  
e080: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c  **.  ** The call
e090: 62 61 63 6b 20 73 68 6f 75 6c 64 20 72 65 74 75  back should retu
e0a0: 72 6e 20 6f 6e 20 6f 66 20 74 68 65 20 66 6f 6c  rn on of the fol
e0b0: 6c 6f 77 69 6e 67 20 73 74 72 69 6e 67 73 3a 20  lowing strings: 
e0c0: 53 51 4c 49 54 45 5f 4f 4b 2c 0a 20 20 2a 2a 20  SQLITE_OK,.  ** 
e0d0: 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 2c 20 6f  SQLITE_IGNORE, o
e0e0: 72 20 53 51 4c 49 54 45 5f 44 45 4e 59 2e 20 20  r SQLITE_DENY.  
e0f0: 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e  Any other return
e100: 20 76 61 6c 75 65 20 69 73 20 61 6e 20 65 72 72   value is an err
e110: 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  or..  **.  ** If
e120: 20 74 68 69 73 20 6d 65 74 68 6f 64 20 69 73 20   this method is 
e130: 69 6e 76 6f 6b 65 64 20 77 69 74 68 20 6e 6f 20  invoked with no 
e140: 61 72 67 75 6d 65 6e 74 73 2c 20 74 68 65 20 63  arguments, the c
e150: 75 72 72 65 6e 74 20 61 75 74 68 6f 72 69 7a 61  urrent authoriza
e160: 74 69 6f 6e 0a 20 20 2a 2a 20 63 61 6c 6c 62 61  tion.  ** callba
e170: 63 6b 20 73 74 72 69 6e 67 20 69 73 20 72 65 74  ck string is ret
e180: 75 72 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61  urned..  */.  ca
e190: 73 65 20 44 42 5f 41 55 54 48 4f 52 49 5a 45 52  se DB_AUTHORIZER
e1a0: 3a 20 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  : {.#ifdef SQLIT
e1b0: 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
e1c0: 54 49 4f 4e 0a 20 20 20 20 54 63 6c 5f 41 70 70  TION.    Tcl_App
e1d0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
e1e0: 2c 20 22 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  , "authorization
e1f0: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 69   not available i
e200: 6e 20 74 68 69 73 20 62 75 69 6c 64 22 2c 20 30  n this build", 0
e210: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
e220: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20  L_ERROR;.#else. 
e230: 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b     if( objc>3 ){
e240: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
e250: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
e260: 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42  2, objv, "?CALLB
e270: 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65  ACK?");.      re
e280: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
e290: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62      }else if( ob
e2a0: 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69  jc==2 ){.      i
e2b0: 66 28 20 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b  f( pDb->zAuth ){
e2c0: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70  .        Tcl_App
e2d0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
e2e0: 2c 20 70 44 62 2d 3e 7a 41 75 74 68 2c 20 30 29  , pDb->zAuth, 0)
e2f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
e300: 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20  lse{.      char 
e310: 2a 7a 41 75 74 68 3b 0a 20 20 20 20 20 20 69 6e  *zAuth;.      in
e320: 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28  t len;.      if(
e330: 20 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20   pDb->zAuth ){. 
e340: 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28         Tcl_Free(
e350: 70 44 62 2d 3e 7a 41 75 74 68 29 3b 0a 20 20 20  pDb->zAuth);.   
e360: 20 20 20 7d 0a 20 20 20 20 20 20 7a 41 75 74 68     }.      zAuth
e370: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
e380: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
e390: 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66   &len);.      if
e3a0: 28 20 7a 41 75 74 68 20 26 26 20 6c 65 6e 3e 30  ( zAuth && len>0
e3b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
e3c0: 3e 7a 41 75 74 68 20 3d 20 54 63 6c 5f 41 6c 6c  >zAuth = Tcl_All
e3d0: 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20  oc( len + 1 );. 
e3e0: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44         memcpy(pD
e3f0: 62 2d 3e 7a 41 75 74 68 2c 20 7a 41 75 74 68 2c  b->zAuth, zAuth,
e400: 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d   len+1);.      }
e410: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44  else{.        pD
e420: 62 2d 3e 7a 41 75 74 68 20 3d 20 30 3b 0a 20 20  b->zAuth = 0;.  
e430: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
e440: 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20  pDb->zAuth ){.  
e450: 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72        pDb->inter
e460: 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20  p = interp;.    
e470: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f      sqlite3_set_
e480: 61 75 74 68 6f 72 69 7a 65 72 28 70 44 62 2d 3e  authorizer(pDb->
e490: 64 62 2c 20 61 75 74 68 5f 63 61 6c 6c 62 61 63  db, auth_callbac
e4a0: 6b 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d  k, pDb);.      }
e4b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
e4c0: 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72  lite3_set_author
e4d0: 69 7a 65 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c  izer(pDb->db, 0,
e4e0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
e4f0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72   }.#endif.    br
e500: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
e510: 20 20 24 64 62 20 62 61 63 6b 75 70 20 3f 44 41    $db backup ?DA
e520: 54 41 42 41 53 45 3f 20 46 49 4c 45 4e 41 4d 45  TABASE? FILENAME
e530: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 70 65 6e 20  .  **.  ** Open 
e540: 6f 72 20 63 72 65 61 74 65 20 61 20 64 61 74 61  or create a data
e550: 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 64 20  base file named 
e560: 46 49 4c 45 4e 41 4d 45 2e 20 20 54 72 61 6e 73  FILENAME.  Trans
e570: 66 65 72 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6e  fer the.  ** con
e580: 74 65 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 64 61  tent of local da
e590: 74 61 62 61 73 65 20 44 41 54 41 42 41 53 45 20  tabase DATABASE 
e5a0: 28 64 65 66 61 75 6c 74 3a 20 22 6d 61 69 6e 22  (default: "main"
e5b0: 29 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  ) into the.  ** 
e5c0: 46 49 4c 45 4e 41 4d 45 20 64 61 74 61 62 61 73  FILENAME databas
e5d0: 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  e..  */.  case D
e5e0: 42 5f 42 41 43 4b 55 50 3a 20 7b 0a 20 20 20 20  B_BACKUP: {.    
e5f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 73  const char *zDes
e600: 74 46 69 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74  tFile;.    const
e610: 20 63 68 61 72 20 2a 7a 53 72 63 44 62 3b 0a 20   char *zSrcDb;. 
e620: 20 20 20 73 71 6c 69 74 65 33 20 2a 70 44 65 73     sqlite3 *pDes
e630: 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  t;.    sqlite3_b
e640: 61 63 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b 0a  ackup *pBackup;.
e650: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33  .    if( objc==3
e660: 20 29 7b 0a 20 20 20 20 20 20 7a 53 72 63 44 62   ){.      zSrcDb
e670: 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 20   = "main";.     
e680: 20 7a 44 65 73 74 46 69 6c 65 20 3d 20 54 63 6c   zDestFile = Tcl
e690: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
e6a0: 32 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  2]);.    }else i
e6b0: 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20  f( objc==4 ){.  
e6c0: 20 20 20 20 7a 53 72 63 44 62 20 3d 20 54 63 6c      zSrcDb = Tcl
e6d0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
e6e0: 32 5d 29 3b 0a 20 20 20 20 20 20 7a 44 65 73 74  2]);.      zDest
e6f0: 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  File = Tcl_GetSt
e700: 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20  ring(objv[3]);. 
e710: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e720: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
e730: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
e740: 2c 20 22 3f 44 41 54 41 42 41 53 45 3f 20 46 49  , "?DATABASE? FI
e750: 4c 45 4e 41 4d 45 22 29 3b 0a 20 20 20 20 20 20  LENAME");.      
e760: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
e770: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
e780: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 44   sqlite3_open(zD
e790: 65 73 74 46 69 6c 65 2c 20 26 70 44 65 73 74 29  estFile, &pDest)
e7a0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
e7b0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
e7c0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
e7d0: 74 28 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f  t(interp, "canno
e7e0: 74 20 6f 70 65 6e 20 74 61 72 67 65 74 20 64 61  t open target da
e7f0: 74 61 62 61 73 65 3a 20 22 2c 0a 20 20 20 20 20  tabase: ",.     
e800: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72        sqlite3_er
e810: 72 6d 73 67 28 70 44 65 73 74 29 2c 20 28 63 68  rmsg(pDest), (ch
e820: 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 73 71  ar*)0);.      sq
e830: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 44 65 73  lite3_close(pDes
e840: 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
e850: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
e860: 7d 0a 20 20 20 20 70 42 61 63 6b 75 70 20 3d 20  }.    pBackup = 
e870: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 69  sqlite3_backup_i
e880: 6e 69 74 28 70 44 65 73 74 2c 20 22 6d 61 69 6e  nit(pDest, "main
e890: 22 2c 20 70 44 62 2d 3e 64 62 2c 20 7a 53 72 63  ", pDb->db, zSrc
e8a0: 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70 42 61  Db);.    if( pBa
e8b0: 63 6b 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ckup==0 ){.     
e8c0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
e8d0: 74 28 69 6e 74 65 72 70 2c 20 22 62 61 63 6b 75  t(interp, "backu
e8e0: 70 20 66 61 69 6c 65 64 3a 20 22 2c 0a 20 20 20  p failed: ",.   
e8f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
e900: 65 72 72 6d 73 67 28 70 44 65 73 74 29 2c 20 28  errmsg(pDest), (
e910: 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
e920: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 44  sqlite3_close(pD
e930: 65 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  est);.      retu
e940: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
e950: 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 20    }.    while(  
e960: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 61  (rc = sqlite3_ba
e970: 63 6b 75 70 5f 73 74 65 70 28 70 42 61 63 6b 75  ckup_step(pBacku
e980: 70 2c 31 30 30 29 29 3d 3d 53 51 4c 49 54 45 5f  p,100))==SQLITE_
e990: 4f 4b 20 29 7b 7d 0a 20 20 20 20 73 71 6c 69 74  OK ){}.    sqlit
e9a0: 65 33 5f 62 61 63 6b 75 70 5f 66 69 6e 69 73 68  e3_backup_finish
e9b0: 28 70 42 61 63 6b 75 70 29 3b 0a 20 20 20 20 69  (pBackup);.    i
e9c0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
e9d0: 4e 45 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  NE ){.      rc =
e9e0: 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c   TCL_OK;.    }el
e9f0: 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  se{.      Tcl_Ap
ea00: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
ea10: 70 2c 20 22 62 61 63 6b 75 70 20 66 61 69 6c 65  p, "backup faile
ea20: 64 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d: ",.          
ea30: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
ea40: 70 44 65 73 74 29 2c 20 28 63 68 61 72 2a 29 30  pDest), (char*)0
ea50: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43  );.      rc = TC
ea60: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
ea70: 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
ea80: 28 70 44 65 73 74 29 3b 0a 20 20 20 20 62 72 65  (pDest);.    bre
ea90: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
eaa0: 20 24 64 62 20 62 75 73 79 20 3f 43 41 4c 4c 42   $db busy ?CALLB
eab0: 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ACK?.  **.  ** I
eac0: 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20  nvoke the given 
ead0: 63 61 6c 6c 62 61 63 6b 20 69 66 20 61 6e 20 53  callback if an S
eae0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 74 74  QL statement att
eaf0: 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 0a 20 20  empts to open.  
eb00: 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 64 61 74 61  ** a locked data
eb10: 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  base file..  */.
eb20: 20 20 63 61 73 65 20 44 42 5f 42 55 53 59 3a 20    case DB_BUSY: 
eb30: 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33  {.    if( objc>3
eb40: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
eb50: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
eb60: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 43 41 4c  p, 2, objv, "CAL
eb70: 4c 42 41 43 4b 22 29 3b 0a 20 20 20 20 20 20 72  LBACK");.      r
eb80: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
eb90: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
eba0: 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  bjc==2 ){.      
ebb0: 69 66 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29  if( pDb->zBusy )
ebc0: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  {.        Tcl_Ap
ebd0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
ebe0: 70 2c 20 70 44 62 2d 3e 7a 42 75 73 79 2c 20 30  p, pDb->zBusy, 0
ebf0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
ec00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72  else{.      char
ec10: 20 2a 7a 42 75 73 79 3b 0a 20 20 20 20 20 20 69   *zBusy;.      i
ec20: 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66  nt len;.      if
ec30: 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a  ( pDb->zBusy ){.
ec40: 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65          Tcl_Free
ec50: 28 70 44 62 2d 3e 7a 42 75 73 79 29 3b 0a 20 20  (pDb->zBusy);.  
ec60: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 42 75 73      }.      zBus
ec70: 79 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  y = Tcl_GetStrin
ec80: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
ec90: 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69  , &len);.      i
eca0: 66 28 20 7a 42 75 73 79 20 26 26 20 6c 65 6e 3e  f( zBusy && len>
ecb0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  0 ){.        pDb
ecc0: 2d 3e 7a 42 75 73 79 20 3d 20 54 63 6c 5f 41 6c  ->zBusy = Tcl_Al
ecd0: 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a  loc( len + 1 );.
ece0: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
ecf0: 44 62 2d 3e 7a 42 75 73 79 2c 20 7a 42 75 73 79  Db->zBusy, zBusy
ed00: 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20  , len+1);.      
ed10: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
ed20: 44 62 2d 3e 7a 42 75 73 79 20 3d 20 30 3b 0a 20  Db->zBusy = 0;. 
ed30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
ed40: 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20   pDb->zBusy ){. 
ed50: 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65         pDb->inte
ed60: 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp = interp;.   
ed70: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73       sqlite3_bus
ed80: 79 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64  y_handler(pDb->d
ed90: 62 2c 20 44 62 42 75 73 79 48 61 6e 64 6c 65 72  b, DbBusyHandler
eda0: 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65  , pDb);.      }e
edb0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
edc0: 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65  ite3_busy_handle
edd0: 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29  r(pDb->db, 0, 0)
ede0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
edf0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
ee00: 20 20 2f 2a 20 20 20 20 20 24 64 62 20 63 61 63    /*     $db cac
ee10: 68 65 20 66 6c 75 73 68 0a 20 20 2a 2a 20 20 20  he flush.  **   
ee20: 20 20 24 64 62 20 63 61 63 68 65 20 73 69 7a 65    $db cache size
ee30: 20 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6c 75   n.  **.  ** Flu
ee40: 73 68 20 74 68 65 20 70 72 65 70 61 72 65 64 20  sh the prepared 
ee50: 73 74 61 74 65 6d 65 6e 74 20 63 61 63 68 65 2c  statement cache,
ee60: 20 6f 72 20 73 65 74 20 74 68 65 20 6d 61 78 69   or set the maxi
ee70: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  mum number of.  
ee80: 2a 2a 20 63 61 63 68 65 64 20 73 74 61 74 65 6d  ** cached statem
ee90: 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  ents..  */.  cas
eea0: 65 20 44 42 5f 43 41 43 48 45 3a 20 7b 0a 20 20  e DB_CACHE: {.  
eeb0: 20 20 63 68 61 72 20 2a 73 75 62 43 6d 64 3b 0a    char *subCmd;.
eec0: 20 20 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 20 20      int n;..    
eed0: 69 66 28 20 6f 62 6a 63 3c 3d 32 20 29 7b 0a 20  if( objc<=2 ){. 
eee0: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
eef0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
ef00: 20 6f 62 6a 76 2c 20 22 63 61 63 68 65 20 6f 70   objv, "cache op
ef10: 74 69 6f 6e 20 3f 61 72 67 3f 22 29 3b 0a 20 20  tion ?arg?");.  
ef20: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
ef30: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
ef40: 73 75 62 43 6d 64 20 3d 20 54 63 6c 5f 47 65 74  subCmd = Tcl_Get
ef50: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 20 6f  StringFromObj( o
ef60: 62 6a 76 5b 32 5d 2c 20 30 20 29 3b 0a 20 20 20  bjv[2], 0 );.   
ef70: 20 69 66 28 20 2a 73 75 62 43 6d 64 3d 3d 27 66   if( *subCmd=='f
ef80: 27 20 26 26 20 73 74 72 63 6d 70 28 73 75 62 43  ' && strcmp(subC
ef90: 6d 64 2c 22 66 6c 75 73 68 22 29 3d 3d 30 20 29  md,"flush")==0 )
efa0: 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63  {.      if( objc
efb0: 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 54  !=3 ){.        T
efc0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
efd0: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
efe0: 20 22 66 6c 75 73 68 22 29 3b 0a 20 20 20 20 20   "flush");.     
eff0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
f000: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ROR;.      }else
f010: 7b 0a 20 20 20 20 20 20 20 20 66 6c 75 73 68 53  {.        flushS
f020: 74 6d 74 43 61 63 68 65 28 20 70 44 62 20 29 3b  tmtCache( pDb );
f030: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
f040: 73 65 20 69 66 28 20 2a 73 75 62 43 6d 64 3d 3d  se if( *subCmd==
f050: 27 73 27 20 26 26 20 73 74 72 63 6d 70 28 73 75  's' && strcmp(su
f060: 62 43 6d 64 2c 22 73 69 7a 65 22 29 3d 3d 30 20  bCmd,"size")==0 
f070: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a  ){.      if( obj
f080: 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20  c!=4 ){.        
f090: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
f0a0: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
f0b0: 2c 20 22 73 69 7a 65 20 6e 22 29 3b 0a 20 20 20  , "size n");.   
f0c0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
f0d0: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c  ERROR;.      }el
f0e0: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  se{.        if( 
f0f0: 54 43 4c 5f 45 52 52 4f 52 3d 3d 54 63 6c 5f 47  TCL_ERROR==Tcl_G
f100: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
f110: 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e  erp, objv[3], &n
f120: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  ) ){.          T
f130: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
f140: 20 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74   interp, "cannot
f150: 20 63 6f 6e 76 65 72 74 20 5c 22 22 2c 20 0a 20   convert \"", . 
f160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
f170: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
f180: 62 6a 28 6f 62 6a 76 5b 33 5d 2c 30 29 2c 20 22  bj(objv[3],0), "
f190: 5c 22 20 74 6f 20 69 6e 74 65 67 65 72 22 2c 20  \" to integer", 
f1a0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  0);.          re
f1b0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
f1c0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
f1d0: 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 3c 30           if( n<0
f1e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
f1f0: 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28 20  flushStmtCache( 
f200: 70 44 62 20 29 3b 0a 20 20 20 20 20 20 20 20 20  pDb );.         
f210: 20 20 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20     n = 0;.      
f220: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3e      }else if( n>
f230: 4d 41 58 5f 50 52 45 50 41 52 45 44 5f 53 54 4d  MAX_PREPARED_STM
f240: 54 53 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  TS ){.          
f250: 20 20 6e 20 3d 20 4d 41 58 5f 50 52 45 50 41 52    n = MAX_PREPAR
f260: 45 44 5f 53 54 4d 54 53 3b 0a 20 20 20 20 20 20  ED_STMTS;.      
f270: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
f280: 70 44 62 2d 3e 6d 61 78 53 74 6d 74 20 3d 20 6e  pDb->maxStmt = n
f290: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f2a0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
f2b0: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
f2c0: 65 73 75 6c 74 28 20 69 6e 74 65 72 70 2c 20 22  esult( interp, "
f2d0: 62 61 64 20 6f 70 74 69 6f 6e 20 5c 22 22 2c 20  bad option \"", 
f2e0: 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47  .          Tcl_G
f2f0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
f300: 6f 62 6a 76 5b 32 5d 2c 30 29 2c 20 22 5c 22 3a  objv[2],0), "\":
f310: 20 6d 75 73 74 20 62 65 20 66 6c 75 73 68 20 6f   must be flush o
f320: 72 20 73 69 7a 65 22 2c 20 30 29 3b 0a 20 20 20  r size", 0);.   
f330: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
f340: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  ROR;.    }.    b
f350: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
f360: 20 20 20 20 24 64 62 20 63 68 61 6e 67 65 73 0a      $db changes.
f370: 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e    **.  ** Return
f380: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
f390: 6f 77 73 20 74 68 61 74 20 77 65 72 65 20 6d 6f  ows that were mo
f3a0: 64 69 66 69 65 64 2c 20 69 6e 73 65 72 74 65 64  dified, inserted
f3b0: 2c 20 6f 72 20 64 65 6c 65 74 65 64 20 62 79 0a  , or deleted by.
f3c0: 20 20 2a 2a 20 74 68 65 20 6d 6f 73 74 20 72 65    ** the most re
f3d0: 63 65 6e 74 20 49 4e 53 45 52 54 2c 20 55 50 44  cent INSERT, UPD
f3e0: 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74  ATE or DELETE st
f3f0: 61 74 65 6d 65 6e 74 2c 20 6e 6f 74 20 69 6e 63  atement, not inc
f400: 6c 75 64 69 6e 67 20 0a 20 20 2a 2a 20 61 6e 79  luding .  ** any
f410: 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79   changes made by
f420: 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d   trigger program
f430: 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  s..  */.  case D
f440: 42 5f 43 48 41 4e 47 45 53 3a 20 7b 0a 20 20 20  B_CHANGES: {.   
f450: 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c   Tcl_Obj *pResul
f460: 74 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  t;.    if( objc!
f470: 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =2 ){.      Tcl_
f480: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
f490: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22  erp, 2, objv, ""
f4a0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
f4b0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
f4c0: 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54  .    pResult = T
f4d0: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_GetObjResult(
f4e0: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c  interp);.    Tcl
f4f0: 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52 65 73 75  _SetIntObj(pResu
f500: 6c 74 2c 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  lt, sqlite3_chan
f510: 67 65 73 28 70 44 62 2d 3e 64 62 29 29 3b 0a 20  ges(pDb->db));. 
f520: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
f530: 20 2f 2a 20 20 20 20 24 64 62 20 63 6c 6f 73 65   /*    $db close
f540: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 68 75 74 64  .  **.  ** Shutd
f550: 6f 77 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  own the database
f560: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
f570: 43 4c 4f 53 45 3a 20 7b 0a 20 20 20 20 54 63 6c  CLOSE: {.    Tcl
f580: 5f 44 65 6c 65 74 65 43 6f 6d 6d 61 6e 64 28 69  _DeleteCommand(i
f590: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
f5a0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
f5b0: 5b 30 5d 2c 20 30 29 29 3b 0a 20 20 20 20 62 72  [0], 0));.    br
f5c0: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
f5d0: 20 2a 2a 20 20 20 20 20 24 64 62 20 63 6f 6c 6c   **     $db coll
f5e0: 61 74 65 20 4e 41 4d 45 20 53 43 52 49 50 54 0a  ate NAME SCRIPT.
f5f0: 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65 61 74 65    **.  ** Create
f600: 20 61 20 6e 65 77 20 53 51 4c 20 63 6f 6c 6c 61   a new SQL colla
f610: 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 63 61  tion function ca
f620: 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 57 68 65 6e  lled NAME.  When
f630: 65 76 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 66  ever.  ** that f
f640: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
f650: 64 2c 20 69 6e 76 6f 6b 65 20 53 43 52 49 50 54  d, invoke SCRIPT
f660: 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65   to evaluate the
f670: 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a   function..  */.
f680: 20 20 63 61 73 65 20 44 42 5f 43 4f 4c 4c 41 54    case DB_COLLAT
f690: 45 3a 20 7b 0a 20 20 20 20 53 71 6c 43 6f 6c 6c  E: {.    SqlColl
f6a0: 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65 3b 0a 20  ate *pCollate;. 
f6b0: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a     char *zName;.
f6c0: 20 20 20 20 63 68 61 72 20 2a 7a 53 63 72 69 70      char *zScrip
f6d0: 74 3b 0a 20 20 20 20 69 6e 74 20 6e 53 63 72 69  t;.    int nScri
f6e0: 70 74 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  pt;.    if( objc
f6f0: 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=4 ){.      Tcl
f700: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
f710: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
f720: 4e 41 4d 45 20 53 43 52 49 50 54 22 29 3b 0a 20  NAME SCRIPT");. 
f730: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
f740: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
f750: 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74   zName = Tcl_Get
f760: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
f770: 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20 7a  jv[2], 0);.    z
f780: 53 63 72 69 70 74 20 3d 20 54 63 6c 5f 47 65 74  Script = Tcl_Get
f790: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
f7a0: 6a 76 5b 33 5d 2c 20 26 6e 53 63 72 69 70 74 29  jv[3], &nScript)
f7b0: 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 20 3d  ;.    pCollate =
f7c0: 20 28 53 71 6c 43 6f 6c 6c 61 74 65 2a 29 54 63   (SqlCollate*)Tc
f7d0: 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  l_Alloc( sizeof(
f7e0: 2a 70 43 6f 6c 6c 61 74 65 29 20 2b 20 6e 53 63  *pCollate) + nSc
f7f0: 72 69 70 74 20 2b 20 31 20 29 3b 0a 20 20 20 20  ript + 1 );.    
f800: 69 66 28 20 70 43 6f 6c 6c 61 74 65 3d 3d 30 20  if( pCollate==0 
f810: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
f820: 4f 52 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65  OR;.    pCollate
f830: 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  ->interp = inter
f840: 70 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d  p;.    pCollate-
f850: 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 70 43  >pNext = pDb->pC
f860: 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 70 43 6f 6c  ollate;.    pCol
f870: 6c 61 74 65 2d 3e 7a 53 63 72 69 70 74 20 3d 20  late->zScript = 
f880: 28 63 68 61 72 2a 29 26 70 43 6f 6c 6c 61 74 65  (char*)&pCollate
f890: 5b 31 5d 3b 0a 20 20 20 20 70 44 62 2d 3e 70 43  [1];.    pDb->pC
f8a0: 6f 6c 6c 61 74 65 20 3d 20 70 43 6f 6c 6c 61 74  ollate = pCollat
f8b0: 65 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 43  e;.    memcpy(pC
f8c0: 6f 6c 6c 61 74 65 2d 3e 7a 53 63 72 69 70 74 2c  ollate->zScript,
f8d0: 20 7a 53 63 72 69 70 74 2c 20 6e 53 63 72 69 70   zScript, nScrip
f8e0: 74 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 73 71  t+1);.    if( sq
f8f0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
f900: 6c 61 74 69 6f 6e 28 70 44 62 2d 3e 64 62 2c 20  lation(pDb->db, 
f910: 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54  zName, SQLITE_UT
f920: 46 38 2c 20 0a 20 20 20 20 20 20 20 20 70 43 6f  F8, .        pCo
f930: 6c 6c 61 74 65 2c 20 74 63 6c 53 71 6c 43 6f 6c  llate, tclSqlCol
f940: 6c 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20 54  late) ){.      T
f950: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
f960: 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c  erp, (char *)sql
f970: 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d  ite3_errmsg(pDb-
f980: 3e 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49  >db), TCL_VOLATI
f990: 4c 45 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  LE);.      retur
f9a0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
f9b0: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
f9c0: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
f9d0: 20 24 64 62 20 63 6f 6c 6c 61 74 69 6f 6e 5f 6e   $db collation_n
f9e0: 65 65 64 65 64 20 53 43 52 49 50 54 0a 20 20 2a  eeded SCRIPT.  *
f9f0: 2a 0a 20 20 2a 2a 20 43 72 65 61 74 65 20 61 20  *.  ** Create a 
fa00: 6e 65 77 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f  new SQL collatio
fa10: 6e 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65  n function calle
fa20: 64 20 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76 65  d NAME.  Wheneve
fa30: 72 0a 20 20 2a 2a 20 74 68 61 74 20 66 75 6e 63  r.  ** that func
fa40: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
fa50: 69 6e 76 6f 6b 65 20 53 43 52 49 50 54 20 74 6f  invoke SCRIPT to
fa60: 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 66 75   evaluate the fu
fa70: 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63  nction..  */.  c
fa80: 61 73 65 20 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e  ase DB_COLLATION
fa90: 5f 4e 45 45 44 45 44 3a 20 7b 0a 20 20 20 20 69  _NEEDED: {.    i
faa0: 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
fab0: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
fac0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
fad0: 6f 62 6a 76 2c 20 22 53 43 52 49 50 54 22 29 3b  objv, "SCRIPT");
fae0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
faf0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
fb00: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 43 6f 6c     if( pDb->pCol
fb10: 6c 61 74 65 4e 65 65 64 65 64 20 29 7b 0a 20 20  lateNeeded ){.  
fb20: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
fb30: 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c 61  ount(pDb->pColla
fb40: 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 7d  teNeeded);.    }
fb50: 0a 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61  .    pDb->pColla
fb60: 74 65 4e 65 65 64 65 64 20 3d 20 54 63 6c 5f 44  teNeeded = Tcl_D
fb70: 75 70 6c 69 63 61 74 65 4f 62 6a 28 6f 62 6a 76  uplicateObj(objv
fb80: 5b 32 5d 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e  [2]);.    Tcl_In
fb90: 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e  crRefCount(pDb->
fba0: 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b  pCollateNeeded);
fbb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c  .    sqlite3_col
fbc0: 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28 70 44  lation_needed(pD
fbd0: 62 2d 3e 64 62 2c 20 70 44 62 2c 20 74 63 6c 43  b->db, pDb, tclC
fbe0: 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20  ollateNeeded);. 
fbf0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
fc00: 20 2f 2a 20 20 20 20 24 64 62 20 63 6f 6d 6d 69   /*    $db commi
fc10: 74 5f 68 6f 6f 6b 20 3f 43 41 4c 4c 42 41 43 4b  t_hook ?CALLBACK
fc20: 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f  ?.  **.  ** Invo
fc30: 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c  ke the given cal
fc40: 6c 62 61 63 6b 20 6a 75 73 74 20 62 65 66 6f 72  lback just befor
fc50: 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 65 76 65  e committing eve
fc60: 72 79 20 53 51 4c 20 74 72 61 6e 73 61 63 74 69  ry SQL transacti
fc70: 6f 6e 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20  on..  ** If the 
fc80: 63 61 6c 6c 62 61 63 6b 20 74 68 72 6f 77 73 20  callback throws 
fc90: 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 6f 72 20  an exception or 
fca0: 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  returns non-zero
fcb0: 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20  , then the.  ** 
fcc0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
fcd0: 62 6f 72 74 65 64 2e 20 20 49 66 20 43 41 4c 4c  borted.  If CALL
fce0: 42 41 43 4b 20 69 73 20 61 6e 20 65 6d 70 74 79  BACK is an empty
fcf0: 20 73 74 72 69 6e 67 2c 20 74 68 65 20 63 61 6c   string, the cal
fd00: 6c 62 61 63 6b 0a 20 20 2a 2a 20 69 73 20 64 69  lback.  ** is di
fd10: 73 61 62 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 63  sabled..  */.  c
fd20: 61 73 65 20 44 42 5f 43 4f 4d 4d 49 54 5f 48 4f  ase DB_COMMIT_HO
fd30: 4f 4b 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62  OK: {.    if( ob
fd40: 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63  jc>3 ){.      Tc
fd50: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
fd60: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
fd70: 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20  "?CALLBACK?");. 
fd80: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
fd90: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65  ERROR;.    }else
fda0: 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a   if( objc==2 ){.
fdb0: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
fdc0: 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  Commit ){.      
fdd0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
fde0: 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e  lt(interp, pDb->
fdf0: 7a 43 6f 6d 6d 69 74 2c 20 30 29 3b 0a 20 20 20  zCommit, 0);.   
fe00: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
fe10: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6d        char *zCom
fe20: 6d 69 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c  mit;.      int l
fe30: 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44  en;.      if( pD
fe40: 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  b->zCommit ){.  
fe50: 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70        Tcl_Free(p
fe60: 44 62 2d 3e 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20  Db->zCommit);.  
fe70: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 43 6f 6d      }.      zCom
fe80: 6d 69 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  mit = Tcl_GetStr
fe90: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
fea0: 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20  2], &len);.     
feb0: 20 69 66 28 20 7a 43 6f 6d 6d 69 74 20 26 26 20   if( zCommit && 
fec0: 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  len>0 ){.       
fed0: 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20   pDb->zCommit = 
fee0: 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b  Tcl_Alloc( len +
fef0: 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65   1 );.        me
ff00: 6d 63 70 79 28 70 44 62 2d 3e 7a 43 6f 6d 6d 69  mcpy(pDb->zCommi
ff10: 74 2c 20 7a 43 6f 6d 6d 69 74 2c 20 6c 65 6e 2b  t, zCommit, len+
ff20: 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
ff30: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 43  .        pDb->zC
ff40: 6f 6d 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  ommit = 0;.     
ff50: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44 62   }.      if( pDb
ff60: 2d 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20  ->zCommit ){.   
ff70: 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70       pDb->interp
ff80: 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20   = interp;.     
ff90: 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69     sqlite3_commi
ffa0: 74 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20  t_hook(pDb->db, 
ffb0: 44 62 43 6f 6d 6d 69 74 48 61 6e 64 6c 65 72 2c  DbCommitHandler,
ffc0: 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c   pDb);.      }el
ffd0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
ffe0: 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28  te3_commit_hook(
fff0: 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a  pDb->db, 0, 0);.
10000 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
10010 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
10020 2f 2a 20 20 20 20 24 64 62 20 63 6f 6d 70 6c 65  /*    $db comple
10030 74 65 20 53 51 4c 0a 20 20 2a 2a 0a 20 20 2a 2a  te SQL.  **.  **
10040 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
10050 53 51 4c 20 69 73 20 61 20 63 6f 6d 70 6c 65 74  SQL is a complet
10060 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  e SQL statement.
10070 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69    Return FALSE i
10080 66 0a 20 20 2a 2a 20 61 64 64 69 74 69 6f 6e 61  f.  ** additiona
10090 6c 20 6c 69 6e 65 73 20 6f 66 20 69 6e 70 75 74  l lines of input
100a0 20 61 72 65 20 6e 65 65 64 65 64 2e 20 20 54 68   are needed.  Th
100b0 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  is is similar to
100c0 20 74 68 65 0a 20 20 2a 2a 20 62 75 69 6c 74 2d   the.  ** built-
100d0 69 6e 20 22 69 6e 66 6f 20 63 6f 6d 70 6c 65 74  in "info complet
100e0 65 22 20 63 6f 6d 6d 61 6e 64 20 6f 66 20 54 63  e" command of Tc
100f0 6c 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  l..  */.  case D
10100 42 5f 43 4f 4d 50 4c 45 54 45 3a 20 7b 0a 23 69  B_COMPLETE: {.#i
10110 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10120 54 5f 43 4f 4d 50 4c 45 54 45 0a 20 20 20 20 54  T_COMPLETE.    T
10130 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b  cl_Obj *pResult;
10140 0a 20 20 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c  .    int isCompl
10150 65 74 65 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a  ete;.    if( obj
10160 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=3 ){.      Tc
10170 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
10180 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
10190 22 53 51 4c 22 29 3b 0a 20 20 20 20 20 20 72 65  "SQL");.      re
101a0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
101b0 20 20 20 20 7d 0a 20 20 20 20 69 73 43 6f 6d 70      }.    isComp
101c0 6c 65 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63  lete = sqlite3_c
101d0 6f 6d 70 6c 65 74 65 28 20 54 63 6c 5f 47 65 74  omplete( Tcl_Get
101e0 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
101f0 6a 76 5b 32 5d 2c 20 30 29 20 29 3b 0a 20 20 20  jv[2], 0) );.   
10200 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47   pResult = Tcl_G
10210 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
10220 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  rp);.    Tcl_Set
10230 42 6f 6f 6c 65 61 6e 4f 62 6a 28 70 52 65 73 75  BooleanObj(pResu
10240 6c 74 2c 20 69 73 43 6f 6d 70 6c 65 74 65 29 3b  lt, isComplete);
10250 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61  .#endif.    brea
10260 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
10270 24 64 62 20 63 6f 70 79 20 63 6f 6e 66 6c 69 63  $db copy conflic
10280 74 2d 61 6c 67 6f 72 69 74 68 6d 20 74 61 62 6c  t-algorithm tabl
10290 65 20 66 69 6c 65 6e 61 6d 65 20 3f 53 45 50 41  e filename ?SEPA
102a0 52 41 54 4f 52 3f 20 3f 4e 55 4c 4c 49 4e 44 49  RATOR? ?NULLINDI
102b0 43 41 54 4f 52 3f 0a 20 20 2a 2a 0a 20 20 2a 2a  CATOR?.  **.  **
102c0 20 43 6f 70 79 20 64 61 74 61 20 69 6e 74 6f 20   Copy data into 
102d0 74 61 62 6c 65 20 66 72 6f 6d 20 66 69 6c 65 6e  table from filen
102e0 61 6d 65 2c 20 6f 70 74 69 6f 6e 61 6c 6c 79 20  ame, optionally 
102f0 75 73 69 6e 67 20 53 45 50 41 52 41 54 4f 52 0a  using SEPARATOR.
10300 20 20 2a 2a 20 61 73 20 63 6f 6c 75 6d 6e 20 73    ** as column s
10310 65 70 61 72 61 74 6f 72 73 2e 20 20 49 66 20 61  eparators.  If a
10320 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73   column contains
10330 20 61 20 6e 75 6c 6c 20 73 74 72 69 6e 67 2c 20   a null string, 
10340 6f 72 20 74 68 65 0a 20 20 2a 2a 20 76 61 6c 75  or the.  ** valu
10350 65 20 6f 66 20 4e 55 4c 4c 49 4e 44 49 43 41 54  e of NULLINDICAT
10360 4f 52 2c 20 61 20 4e 55 4c 4c 20 69 73 20 69 6e  OR, a NULL is in
10370 73 65 72 74 65 64 20 66 6f 72 20 74 68 65 20 63  serted for the c
10380 6f 6c 75 6d 6e 2e 0a 20 20 2a 2a 20 63 6f 6e 66  olumn..  ** conf
10390 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20 69  lict-algorithm i
103a0 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 71 6c  s one of the sql
103b0 69 74 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67  ite conflict alg
103c0 6f 72 69 74 68 6d 73 3a 0a 20 20 2a 2a 20 20 20  orithms:.  **   
103d0 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 62 6f 72 74   rollback, abort
103e0 2c 20 66 61 69 6c 2c 20 69 67 6e 6f 72 65 2c 20  , fail, ignore, 
103f0 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 4f 6e 20  replace.  ** On 
10400 73 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20  success, return 
10410 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 69  the number of li
10420 6e 65 73 20 70 72 6f 63 65 73 73 65 64 2c 20 6e  nes processed, n
10430 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 73  ot necessarily s
10440 61 6d 65 0a 20 20 2a 2a 20 61 73 20 27 64 62 20  ame.  ** as 'db 
10450 63 68 61 6e 67 65 73 27 20 64 75 65 20 74 6f 20  changes' due to 
10460 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74  conflict-algorit
10470 68 6d 20 73 65 6c 65 63 74 65 64 2e 0a 20 20 2a  hm selected..  *
10480 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65  *.  ** This code
10490 20 69 73 20 62 61 73 69 63 61 6c 6c 79 20 61 6e   is basically an
104a0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2f   implementation/
104b0 65 6e 68 61 6e 63 65 6d 65 6e 74 20 6f 66 0a 20  enhancement of. 
104c0 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 20   ** the sqlite3 
104d0 73 68 65 6c 6c 2e 63 20 22 2e 69 6d 70 6f 72 74  shell.c ".import
104e0 22 20 63 6f 6d 6d 61 6e 64 2e 0a 20 20 2a 2a 0a  " command..  **.
104f0 20 20 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e    ** This comman
10500 64 20 75 73 61 67 65 20 69 73 20 65 71 75 69 76  d usage is equiv
10510 61 6c 65 6e 74 20 74 6f 20 74 68 65 20 73 71 6c  alent to the sql
10520 69 74 65 32 2e 78 20 43 4f 50 59 20 73 74 61 74  ite2.x COPY stat
10530 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 77 68 69 63  ement,.  ** whic
10540 68 20 69 6d 70 6f 72 74 73 20 66 69 6c 65 20 64  h imports file d
10550 61 74 61 20 69 6e 74 6f 20 61 20 74 61 62 6c 65  ata into a table
10560 20 75 73 69 6e 67 20 74 68 65 20 50 6f 73 74 67   using the Postg
10570 72 65 53 51 4c 20 43 4f 50 59 20 66 69 6c 65 20  reSQL COPY file 
10580 66 6f 72 6d 61 74 3a 0a 20 20 2a 2a 20 20 20 24  format:.  **   $
10590 64 62 20 63 6f 70 79 20 24 63 6f 6e 66 6c 69 74  db copy $conflit
105a0 5f 61 6c 67 6f 20 24 74 61 62 6c 65 5f 6e 61 6d  _algo $table_nam
105b0 65 20 24 66 69 6c 65 6e 61 6d 65 20 5c 74 20 5c  e $filename \t \
105c0 5c 4e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  \N.  */.  case D
105d0 42 5f 43 4f 50 59 3a 20 7b 0a 20 20 20 20 63 68  B_COPY: {.    ch
105e0 61 72 20 2a 7a 54 61 62 6c 65 3b 20 20 20 20 20  ar *zTable;     
105f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73            /* Ins
10600 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68  ert data into th
10610 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  is table */.    
10620 63 68 61 72 20 2a 7a 46 69 6c 65 3b 20 20 20 20  char *zFile;    
10630 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
10640 68 65 20 66 69 6c 65 20 66 72 6f 6d 20 77 68 69  he file from whi
10650 63 68 20 74 6f 20 65 78 74 72 61 63 74 20 64 61  ch to extract da
10660 74 61 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  ta */.    char *
10670 7a 43 6f 6e 66 6c 69 63 74 3b 20 20 20 20 20 20  zConflict;      
10680 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
10690 66 6c 69 63 74 20 61 6c 67 6f 72 69 74 68 6d 20  flict algorithm 
106a0 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 73 71  to use */.    sq
106b0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
106c0 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73  t;        /* A s
106d0 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
106e0 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20  int nCol;       
106f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
10700 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
10710 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   in the table */
10720 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 20  .    int nByte; 
10730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10740 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
10750 74 65 73 20 69 6e 20 61 6e 20 53 51 4c 20 73 74  tes in an SQL st
10760 72 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ring */.    int 
10770 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
10780 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
10790 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 20 20  counters */.    
107a0 69 6e 74 20 6e 53 65 70 3b 20 20 20 20 20 20 20  int nSep;       
107b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
107c0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
107d0 6e 20 7a 53 65 70 5b 5d 20 2a 2f 0a 20 20 20 20  n zSep[] */.    
107e0 69 6e 74 20 6e 4e 75 6c 6c 3b 20 20 20 20 20 20  int nNull;      
107f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
10800 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
10810 6e 20 7a 4e 75 6c 6c 5b 5d 20 2a 2f 0a 20 20 20  n zNull[] */.   
10820 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20   char *zSql;    
10830 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10840 41 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  An SQL statement
10850 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c   */.    char *zL
10860 69 6e 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ine;            
10870 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
10880 6c 69 6e 65 20 6f 66 20 69 6e 70 75 74 20 66 72  line of input fr
10890 6f 6d 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20  om the file */. 
108a0 20 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 3b     char **azCol;
108b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
108c0 2a 20 7a 4c 69 6e 65 5b 5d 20 62 72 6f 6b 65 6e  * zLine[] broken
108d0 20 75 70 20 69 6e 74 6f 20 63 6f 6c 75 6d 6e 73   up into columns
108e0 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 43   */.    char *zC
108f0 6f 6d 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20  ommit;          
10900 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 63 6f      /* How to co
10910 6d 6d 69 74 20 63 68 61 6e 67 65 73 20 2a 2f 0a  mmit changes */.
10920 20 20 20 20 46 49 4c 45 20 2a 69 6e 3b 20 20 20      FILE *in;   
10930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10940 2f 2a 20 54 68 65 20 69 6e 70 75 74 20 66 69 6c  /* The input fil
10950 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 69 6e  e */.    int lin
10960 65 6e 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20  eno = 0;        
10970 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d       /* Line num
10980 62 65 72 20 6f 66 20 69 6e 70 75 74 20 66 69 6c  ber of input fil
10990 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 7a 4c  e */.    char zL
109a0 69 6e 65 4e 75 6d 5b 38 30 5d 3b 20 20 20 20 20  ineNum[80];     
109b0 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d       /* Line num
109c0 62 65 72 20 70 72 69 6e 74 20 62 75 66 66 65 72  ber print buffer
109d0 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20   */.    Tcl_Obj 
109e0 2a 70 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20  *pResult;       
109f0 20 20 20 20 2f 2a 20 69 6e 74 65 72 70 20 72 65      /* interp re
10a00 73 75 6c 74 20 2a 2f 0a 0a 20 20 20 20 63 68 61  sult */..    cha
10a10 72 20 2a 7a 53 65 70 3b 0a 20 20 20 20 63 68 61  r *zSep;.    cha
10a20 72 20 2a 7a 4e 75 6c 6c 3b 0a 20 20 20 20 69 66  r *zNull;.    if
10a30 28 20 6f 62 6a 63 3c 35 20 7c 7c 20 6f 62 6a 63  ( objc<5 || objc
10a40 3e 37 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  >7 ){.      Tcl_
10a50 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
10a60 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 0a 20  erp, 2, objv, . 
10a70 20 20 20 20 20 20 20 20 22 43 4f 4e 46 4c 49 43          "CONFLIC
10a80 54 2d 41 4c 47 4f 52 49 54 48 4d 20 54 41 42 4c  T-ALGORITHM TABL
10a90 45 20 46 49 4c 45 4e 41 4d 45 20 3f 53 45 50 41  E FILENAME ?SEPA
10aa0 52 41 54 4f 52 3f 20 3f 4e 55 4c 4c 49 4e 44 49  RATOR? ?NULLINDI
10ab0 43 41 54 4f 52 3f 22 29 3b 0a 20 20 20 20 20 20  CATOR?");.      
10ac0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
10ad0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
10ae0 6f 62 6a 63 3e 3d 36 20 29 7b 0a 20 20 20 20 20  objc>=6 ){.     
10af0 20 7a 53 65 70 20 3d 20 54 63 6c 5f 47 65 74 53   zSep = Tcl_GetS
10b00 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
10b10 76 5b 35 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 65  v[5], 0);.    }e
10b20 6c 73 65 7b 0a 20 20 20 20 20 20 7a 53 65 70 20  lse{.      zSep 
10b30 3d 20 22 5c 74 22 3b 0a 20 20 20 20 7d 0a 20 20  = "\t";.    }.  
10b40 20 20 69 66 28 20 6f 62 6a 63 3e 3d 37 20 29 7b    if( objc>=7 ){
10b50 0a 20 20 20 20 20 20 7a 4e 75 6c 6c 20 3d 20 54  .      zNull = T
10b60 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
10b70 4f 62 6a 28 6f 62 6a 76 5b 36 5d 2c 20 30 29 3b  Obj(objv[6], 0);
10b80 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10b90 20 20 7a 4e 75 6c 6c 20 3d 20 22 22 3b 0a 20 20    zNull = "";.  
10ba0 20 20 7d 0a 20 20 20 20 7a 43 6f 6e 66 6c 69 63    }.    zConflic
10bb0 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  t = Tcl_GetStrin
10bc0 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
10bd0 2c 20 30 29 3b 0a 20 20 20 20 7a 54 61 62 6c 65  , 0);.    zTable
10be0 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
10bf0 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c  FromObj(objv[3],
10c00 20 30 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d   0);.    zFile =
10c10 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
10c20 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 34 5d 2c 20 30  omObj(objv[4], 0
10c30 29 3b 0a 20 20 20 20 6e 53 65 70 20 3d 20 73 74  );.    nSep = st
10c40 72 6c 65 6e 33 30 28 7a 53 65 70 29 3b 0a 20 20  rlen30(zSep);.  
10c50 20 20 6e 4e 75 6c 6c 20 3d 20 73 74 72 6c 65 6e    nNull = strlen
10c60 33 30 28 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 69  30(zNull);.    i
10c70 66 28 20 6e 53 65 70 3d 3d 30 20 29 7b 0a 20 20  f( nSep==0 ){.  
10c80 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
10c90 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72  sult(interp,"Err
10ca0 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20 73 65 70  or: non-null sep
10cb0 61 72 61 74 6f 72 20 72 65 71 75 69 72 65 64 20  arator required 
10cc0 66 6f 72 20 63 6f 70 79 22 2c 30 29 3b 0a 20 20  for copy",0);.  
10cd0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
10ce0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
10cf0 69 66 28 73 74 72 63 6d 70 28 7a 43 6f 6e 66 6c  if(strcmp(zConfl
10d00 69 63 74 2c 20 22 72 6f 6c 6c 62 61 63 6b 22 29  ict, "rollback")
10d10 20 21 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20   != 0 &&.       
10d20 73 74 72 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74  strcmp(zConflict
10d30 2c 20 22 61 62 6f 72 74 22 20 20 20 29 20 21 3d  , "abort"   ) !=
10d40 20 30 20 26 26 0a 20 20 20 20 20 20 20 73 74 72   0 &&.       str
10d50 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22  cmp(zConflict, "
10d60 66 61 69 6c 22 20 20 20 20 29 20 21 3d 20 30 20  fail"    ) != 0 
10d70 26 26 0a 20 20 20 20 20 20 20 73 74 72 63 6d 70  &&.       strcmp
10d80 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 69 67 6e  (zConflict, "ign
10d90 6f 72 65 22 20 20 29 20 21 3d 20 30 20 26 26 0a  ore"  ) != 0 &&.
10da0 20 20 20 20 20 20 20 73 74 72 63 6d 70 28 7a 43         strcmp(zC
10db0 6f 6e 66 6c 69 63 74 2c 20 22 72 65 70 6c 61 63  onflict, "replac
10dc0 65 22 20 29 20 21 3d 20 30 20 29 20 7b 0a 20 20  e" ) != 0 ) {.  
10dd0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
10de0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72  sult(interp, "Er
10df0 72 6f 72 3a 20 5c 22 22 2c 20 7a 43 6f 6e 66 6c  ror: \"", zConfl
10e00 69 63 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ict, .          
10e10 20 20 22 5c 22 2c 20 63 6f 6e 66 6c 69 63 74 2d    "\", conflict-
10e20 61 6c 67 6f 72 69 74 68 6d 20 6d 75 73 74 20 62  algorithm must b
10e30 65 20 6f 6e 65 20 6f 66 3a 20 72 6f 6c 6c 62 61  e one of: rollba
10e40 63 6b 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20  ck, ".          
10e50 20 20 22 61 62 6f 72 74 2c 20 66 61 69 6c 2c 20    "abort, fail, 
10e60 69 67 6e 6f 72 65 2c 20 6f 72 20 72 65 70 6c 61  ignore, or repla
10e70 63 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  ce", 0);.      r
10e80 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10e90 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20  .    }.    zSql 
10ea0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
10eb0 66 28 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  f("SELECT * FROM
10ec0 20 27 25 71 27 22 2c 20 7a 54 61 62 6c 65 29 3b   '%q'", zTable);
10ed0 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  .    if( zSql==0
10ee0 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
10ef0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
10f00 70 2c 20 22 45 72 72 6f 72 3a 20 6e 6f 20 73 75  p, "Error: no su
10f10 63 68 20 74 61 62 6c 65 3a 20 22 2c 20 7a 54 61  ch table: ", zTa
10f20 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  ble, 0);.      r
10f30 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10f40 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65  .    }.    nByte
10f50 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c   = strlen30(zSql
10f60 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
10f70 74 65 33 5f 70 72 65 70 61 72 65 28 70 44 62 2d  te3_prepare(pDb-
10f80 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  >db, zSql, -1, &
10f90 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73  pStmt, 0);.    s
10fa0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
10fb0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
10fc0 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
10fd0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
10fe0 22 45 72 72 6f 72 3a 20 22 2c 20 73 71 6c 69 74  "Error: ", sqlit
10ff0 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64  e3_errmsg(pDb->d
11000 62 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 6e 43  b), 0);.      nC
11010 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ol = 0;.    }els
11020 65 7b 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20  e{.      nCol = 
11030 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
11040 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20  ount(pStmt);.   
11050 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
11060 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
11070 20 20 20 20 69 66 28 20 6e 43 6f 6c 3d 3d 30 20      if( nCol==0 
11080 29 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ) {.      return
11090 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
110a0 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20 6d 61 6c  }.    zSql = mal
110b0 6c 6f 63 28 20 6e 42 79 74 65 20 2b 20 35 30 20  loc( nByte + 50 
110c0 2b 20 6e 43 6f 6c 2a 32 20 29 3b 0a 20 20 20 20  + nCol*2 );.    
110d0 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20 7b 0a  if( zSql==0 ) {.
110e0 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
110f0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
11100 45 72 72 6f 72 3a 20 63 61 6e 27 74 20 6d 61 6c  Error: can't mal
11110 6c 6f 63 28 29 22 2c 20 30 29 3b 0a 20 20 20 20  loc()", 0);.    
11120 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
11130 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  OR;.    }.    sq
11140 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
11150 42 79 74 65 2b 35 30 2c 20 7a 53 71 6c 2c 20 22  Byte+50, zSql, "
11160 49 4e 53 45 52 54 20 4f 52 20 25 71 20 49 4e 54  INSERT OR %q INT
11170 4f 20 27 25 71 27 20 56 41 4c 55 45 53 28 3f 22  O '%q' VALUES(?"
11180 2c 0a 20 20 20 20 20 20 20 20 20 7a 43 6f 6e 66  ,.         zConf
11190 6c 69 63 74 2c 20 7a 54 61 62 6c 65 29 3b 0a 20  lict, zTable);. 
111a0 20 20 20 6a 20 3d 20 73 74 72 6c 65 6e 33 30 28     j = strlen30(
111b0 7a 53 71 6c 29 3b 0a 20 20 20 20 66 6f 72 28 69  zSql);.    for(i
111c0 3d 31 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =1; i<nCol; i++)
111d0 7b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b  {.      zSql[j++
111e0 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 7a  ] = ',';.      z
111f0 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 3f 27 3b 0a  Sql[j++] = '?';.
11200 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 5b 6a      }.    zSql[j
11210 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20 7a  ++] = ')';.    z
11220 53 71 6c 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20  Sql[j] = 0;.    
11230 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
11240 70 61 72 65 28 70 44 62 2d 3e 64 62 2c 20 7a 53  pare(pDb->db, zS
11250 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
11260 30 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 53 71  0);.    free(zSq
11270 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  l);.    if( rc )
11280 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
11290 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
112a0 20 22 45 72 72 6f 72 3a 20 22 2c 20 73 71 6c 69   "Error: ", sqli
112b0 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
112c0 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  db), 0);.      s
112d0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
112e0 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 65  pStmt);.      re
112f0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
11300 20 20 20 20 7d 0a 20 20 20 20 69 6e 20 3d 20 66      }.    in = f
11310 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 22 72 62 22  open(zFile, "rb"
11320 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 3d 3d 30  );.    if( in==0
11330 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
11340 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
11350 70 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f  p, "Error: canno
11360 74 20 6f 70 65 6e 20 66 69 6c 65 3a 20 22 2c 20  t open file: ", 
11370 7a 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 20 20  zFile, NULL);.  
11380 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
11390 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
113a0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
113b0 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ROR;.    }.    a
113c0 7a 43 6f 6c 20 3d 20 6d 61 6c 6c 6f 63 28 20 73  zCol = malloc( s
113d0 69 7a 65 6f 66 28 61 7a 43 6f 6c 5b 30 5d 29 2a  izeof(azCol[0])*
113e0 28 6e 43 6f 6c 2b 31 29 20 29 3b 0a 20 20 20 20  (nCol+1) );.    
113f0 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 20 7b  if( azCol==0 ) {
11400 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
11410 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
11420 22 45 72 72 6f 72 3a 20 63 61 6e 27 74 20 6d 61  "Error: can't ma
11430 6c 6c 6f 63 28 29 22 2c 20 30 29 3b 0a 20 20 20  lloc()", 0);.   
11440 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20     fclose(in);. 
11450 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
11460 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
11470 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f 65   (void)sqlite3_e
11480 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 22 42 45  xec(pDb->db, "BE
11490 47 49 4e 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  GIN", 0, 0, 0);.
114a0 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 43      zCommit = "C
114b0 4f 4d 4d 49 54 22 3b 0a 20 20 20 20 77 68 69 6c  OMMIT";.    whil
114c0 65 28 20 28 7a 4c 69 6e 65 20 3d 20 6c 6f 63 61  e( (zLine = loca
114d0 6c 5f 67 65 74 6c 69 6e 65 28 30 2c 20 69 6e 29  l_getline(0, in)
114e0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68  )!=0 ){.      ch
114f0 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 6c 69 6e  ar *z;.      lin
11500 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 61 7a 43  eno++;.      azC
11510 6f 6c 5b 30 5d 20 3d 20 7a 4c 69 6e 65 3b 0a 20  ol[0] = zLine;. 
11520 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 7a 3d       for(i=0, z=
11530 7a 4c 69 6e 65 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b  zLine; *z; z++){
11540 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 7a 3d  .        if( *z=
11550 3d 7a 53 65 70 5b 30 5d 20 26 26 20 73 74 72 6e  =zSep[0] && strn
11560 63 6d 70 28 7a 2c 20 7a 53 65 70 2c 20 6e 53 65  cmp(z, zSep, nSe
11570 70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  p)==0 ){.       
11580 20 20 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 20     *z = 0;.     
11590 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
115a0 20 20 20 20 69 66 28 20 69 3c 6e 43 6f 6c 20 29      if( i<nCol )
115b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 7a  {.            az
115c0 43 6f 6c 5b 69 5d 20 3d 20 26 7a 5b 6e 53 65 70  Col[i] = &z[nSep
115d0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  ];.            z
115e0 20 2b 3d 20 6e 53 65 70 2d 31 3b 0a 20 20 20 20   += nSep-1;.    
115f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
11600 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
11610 69 66 28 20 69 2b 31 21 3d 6e 43 6f 6c 20 29 7b  if( i+1!=nCol ){
11620 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
11630 45 72 72 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  Err;.        int
11640 20 6e 45 72 72 20 3d 20 73 74 72 6c 65 6e 33 30   nErr = strlen30
11650 28 7a 46 69 6c 65 29 20 2b 20 32 30 30 3b 0a 20  (zFile) + 200;. 
11660 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20 6d 61         zErr = ma
11670 6c 6c 6f 63 28 6e 45 72 72 29 3b 0a 20 20 20 20  lloc(nErr);.    
11680 20 20 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a      if( zErr ){.
11690 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
116a0 33 5f 73 6e 70 72 69 6e 74 66 28 6e 45 72 72 2c  3_snprintf(nErr,
116b0 20 7a 45 72 72 2c 0a 20 20 20 20 20 20 20 20 20   zErr,.         
116c0 20 20 20 20 22 45 72 72 6f 72 3a 20 25 73 20 6c      "Error: %s l
116d0 69 6e 65 20 25 64 3a 20 65 78 70 65 63 74 65 64  ine %d: expected
116e0 20 25 64 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64   %d columns of d
116f0 61 74 61 20 62 75 74 20 66 6f 75 6e 64 20 25 64  ata but found %d
11700 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
11710 7a 46 69 6c 65 2c 20 6c 69 6e 65 6e 6f 2c 20 6e  zFile, lineno, n
11720 43 6f 6c 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20  Col, i+1);.     
11730 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
11740 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45  esult(interp, zE
11750 72 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  rr, 0);.        
11760 20 20 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20    free(zErr);.  
11770 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
11780 7a 43 6f 6d 6d 69 74 20 3d 20 22 52 4f 4c 4c 42  zCommit = "ROLLB
11790 41 43 4b 22 3b 0a 20 20 20 20 20 20 20 20 62 72  ACK";.        br
117a0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
117b0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
117c0 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
117d0 20 20 2f 2a 20 63 68 65 63 6b 20 66 6f 72 20 6e    /* check for n
117e0 75 6c 6c 20 64 61 74 61 2c 20 69 66 20 73 6f 2c  ull data, if so,
117f0 20 62 69 6e 64 20 61 73 20 6e 75 6c 6c 20 2a 2f   bind as null */
11800 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6e 4e  .        if( (nN
11810 75 6c 6c 3e 30 20 26 26 20 73 74 72 63 6d 70 28  ull>0 && strcmp(
11820 61 7a 43 6f 6c 5b 69 5d 2c 20 7a 4e 75 6c 6c 29  azCol[i], zNull)
11830 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20 7c  ==0).          |
11840 7c 20 73 74 72 6c 65 6e 33 30 28 61 7a 43 6f 6c  | strlen30(azCol
11850 5b 69 5d 29 3d 3d 30 20 0a 20 20 20 20 20 20 20  [i])==0 .       
11860 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
11870 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28  lite3_bind_null(
11880 70 53 74 6d 74 2c 20 69 2b 31 29 3b 0a 20 20 20  pStmt, i+1);.   
11890 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
118a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
118b0 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69  nd_text(pStmt, i
118c0 2b 31 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 20 2d 31  +1, azCol[i], -1
118d0 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
118e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
118f0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
11900 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20  3_step(pStmt);. 
11910 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
11920 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a  3_reset(pStmt);.
11930 20 20 20 20 20 20 66 72 65 65 28 7a 4c 69 6e 65        free(zLine
11940 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
11950 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11960 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
11970 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45  Result(interp,"E
11980 72 72 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65 33  rror: ", sqlite3
11990 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29  _errmsg(pDb->db)
119a0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7a 43  , 0);.        zC
119b0 6f 6d 6d 69 74 20 3d 20 22 52 4f 4c 4c 42 41 43  ommit = "ROLLBAC
119c0 4b 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  K";.        brea
119d0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
119e0 0a 20 20 20 20 66 72 65 65 28 61 7a 43 6f 6c 29  .    free(azCol)
119f0 3b 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29  ;.    fclose(in)
11a00 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
11a10 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
11a20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33     (void)sqlite3
11a30 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a  _exec(pDb->db, z
11a40 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 2c 20 30 29  Commit, 0, 0, 0)
11a50 3b 0a 0a 20 20 20 20 69 66 28 20 7a 43 6f 6d 6d  ;..    if( zComm
11a60 69 74 5b 30 5d 20 3d 3d 20 27 43 27 20 29 7b 0a  it[0] == 'C' ){.
11a70 20 20 20 20 20 20 2f 2a 20 73 75 63 63 65 73 73        /* success
11a80 2c 20 73 65 74 20 72 65 73 75 6c 74 20 61 73 20  , set result as 
11a90 6e 75 6d 62 65 72 20 6f 66 20 6c 69 6e 65 73 20  number of lines 
11aa0 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20  processed */.   
11ab0 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c     pResult = Tcl
11ac0 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _GetObjResult(in
11ad0 74 65 72 70 29 3b 0a 20 20 20 20 20 20 54 63 6c  terp);.      Tcl
11ae0 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52 65 73 75  _SetIntObj(pResu
11af0 6c 74 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20  lt, lineno);.   
11b00 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a     rc = TCL_OK;.
11b10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11b20 20 2f 2a 20 66 61 69 6c 75 72 65 2c 20 61 70 70   /* failure, app
11b30 65 6e 64 20 6c 69 6e 65 6e 6f 20 77 68 65 72 65  end lineno where
11b40 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20   failed */.     
11b50 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
11b60 66 28 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 4e 75  f(sizeof(zLineNu
11b70 6d 29 2c 20 7a 4c 69 6e 65 4e 75 6d 2c 22 25 64  m), zLineNum,"%d
11b80 22 2c 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20  ",lineno);.     
11b90 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
11ba0 74 28 69 6e 74 65 72 70 2c 22 2c 20 66 61 69 6c  t(interp,", fail
11bb0 65 64 20 77 68 69 6c 65 20 70 72 6f 63 65 73 73  ed while process
11bc0 69 6e 67 20 6c 69 6e 65 3a 20 22 2c 7a 4c 69 6e  ing line: ",zLin
11bd0 65 4e 75 6d 2c 30 29 3b 0a 20 20 20 20 20 20 72  eNum,0);.      r
11be0 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  c = TCL_ERROR;. 
11bf0 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
11c00 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
11c10 20 20 24 64 62 20 65 6e 61 62 6c 65 5f 6c 6f 61    $db enable_loa
11c20 64 5f 65 78 74 65 6e 73 69 6f 6e 20 42 4f 4f 4c  d_extension BOOL
11c30 45 41 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 75  EAN.  **.  ** Tu
11c40 72 6e 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e  rn the extension
11c50 20 6c 6f 61 64 69 6e 67 20 66 65 61 74 75 72 65   loading feature
11c60 20 6f 6e 20 6f 72 20 6f 66 66 2e 20 20 49 74 20   on or off.  It 
11c70 69 66 20 6f 66 66 20 62 79 0a 20 20 2a 2a 20 64  if off by.  ** d
11c80 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 63  efault..  */.  c
11c90 61 73 65 20 44 42 5f 45 4e 41 42 4c 45 5f 4c 4f  ase DB_ENABLE_LO
11ca0 41 44 5f 45 58 54 45 4e 53 49 4f 4e 3a 20 7b 0a  AD_EXTENSION: {.
11cb0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11cc0 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
11cd0 4f 4e 0a 20 20 20 20 69 6e 74 20 6f 6e 6f 66 66  ON.    int onoff
11ce0 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
11cf0 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
11d00 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
11d10 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 42 4f  rp, 2, objv, "BO
11d20 4f 4c 45 41 4e 22 29 3b 0a 20 20 20 20 20 20 72  OLEAN");.      r
11d30 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
11d40 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 54  .    }.    if( T
11d50 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
11d60 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
11d70 76 5b 32 5d 2c 20 26 6f 6e 6f 66 66 29 20 29 7b  v[2], &onoff) ){
11d80 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
11d90 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
11da0 20 20 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c     sqlite3_enabl
11db0 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e  e_load_extension
11dc0 28 70 44 62 2d 3e 64 62 2c 20 6f 6e 6f 66 66 29  (pDb->db, onoff)
11dd0 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 23 65 6c  ;.    break;.#el
11de0 73 65 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  se.    Tcl_Appen
11df0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
11e00 22 65 78 74 65 6e 73 69 6f 6e 20 6c 6f 61 64 69  "extension loadi
11e10 6e 67 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66  ng is turned off
11e20 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
11e30 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
11e40 20 20 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20          0);.    
11e50 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
11e60 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  ;.#endif.  }..  
11e70 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 65  /*.  **    $db e
11e80 72 72 6f 72 63 6f 64 65 0a 20 20 2a 2a 0a 20 20  rrorcode.  **.  
11e90 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
11ea0 6d 65 72 69 63 20 65 72 72 6f 72 20 63 6f 64 65  meric error code
11eb0 20 74 68 61 74 20 77 61 73 20 72 65 74 75 72 6e   that was return
11ec0 65 64 20 62 79 20 74 68 65 20 6d 6f 73 74 20 72  ed by the most r
11ed0 65 63 65 6e 74 0a 20 20 2a 2a 20 63 61 6c 6c 20  ecent.  ** call 
11ee0 74 6f 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  to sqlite3_exec(
11ef0 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  )..  */.  case D
11f00 42 5f 45 52 52 4f 52 43 4f 44 45 3a 20 7b 0a 20  B_ERRORCODE: {. 
11f10 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
11f20 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
11f30 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65  NewIntObj(sqlite
11f40 33 5f 65 72 72 63 6f 64 65 28 70 44 62 2d 3e 64  3_errcode(pDb->d
11f50 62 29 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  b)));.    break;
11f60 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
11f70 20 20 20 24 64 62 20 65 78 69 73 74 73 20 24 73     $db exists $s
11f80 71 6c 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 6f  ql.  **    $db o
11f90 6e 65 63 6f 6c 75 6d 6e 20 24 73 71 6c 0a 20 20  necolumn $sql.  
11fa0 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65 63  **.  ** The onec
11fb0 6f 6c 75 6d 6e 20 6d 65 74 68 6f 64 20 69 73 20  olumn method is 
11fc0 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6f  the equivalent o
11fd0 66 3a 0a 20 20 2a 2a 20 20 20 20 20 6c 69 6e 64  f:.  **     lind
11fe0 65 78 20 5b 24 64 62 20 65 76 61 6c 20 24 73 71  ex [$db eval $sq
11ff0 6c 5d 20 30 0a 20 20 2a 2f 0a 20 20 63 61 73 65  l] 0.  */.  case
12000 20 44 42 5f 45 58 49 53 54 53 3a 20 0a 20 20 63   DB_EXISTS: .  c
12010 61 73 65 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e  ase DB_ONECOLUMN
12020 3a 20 7b 0a 20 20 20 20 44 62 45 76 61 6c 43 6f  : {.    DbEvalCo
12030 6e 74 65 78 74 20 73 45 76 61 6c 3b 0a 20 20 20  ntext sEval;.   
12040 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
12050 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
12060 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
12070 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 22 29 3b 0a  , objv, "SQL");.
12080 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
12090 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
120a0 20 20 20 64 62 45 76 61 6c 49 6e 69 74 28 26 73     dbEvalInit(&s
120b0 45 76 61 6c 2c 20 70 44 62 2c 20 6f 62 6a 76 5b  Eval, pDb, objv[
120c0 32 5d 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d  2], 0);.    rc =
120d0 20 64 62 45 76 61 6c 53 74 65 70 28 26 73 45 76   dbEvalStep(&sEv
120e0 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 63 68 6f  al);.    if( cho
120f0 69 63 65 3d 3d 44 42 5f 4f 4e 45 43 4f 4c 55 4d  ice==DB_ONECOLUM
12100 4e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72  N ){.      if( r
12110 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20  c==TCL_OK ){.   
12120 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52       Tcl_SetObjR
12130 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 64 62  esult(interp, db
12140 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65 28  EvalColumnValue(
12150 26 73 45 76 61 6c 2c 20 30 29 29 3b 0a 20 20 20  &sEval, 0));.   
12160 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d     }else if( rc=
12170 3d 54 43 4c 5f 42 52 45 41 4b 20 29 7b 0a 20 20  =TCL_BREAK ){.  
12180 20 20 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52        Tcl_ResetR
12190 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
121a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
121b0 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 42 52 45   if( rc==TCL_BRE
121c0 41 4b 20 7c 7c 20 72 63 3d 3d 54 43 4c 5f 4f 4b  AK || rc==TCL_OK
121d0 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65   ){.      Tcl_Se
121e0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
121f0 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61  p, Tcl_NewBoolea
12200 6e 4f 62 6a 28 72 63 3d 3d 54 43 4c 5f 4f 4b 29  nObj(rc==TCL_OK)
12210 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 45  );.    }.    dbE
12220 76 61 6c 46 69 6e 61 6c 69 7a 65 28 26 73 45 76  valFinalize(&sEv
12230 61 6c 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  al);..    if( rc
12240 3d 3d 54 43 4c 5f 42 52 45 41 4b 20 29 7b 0a 20  ==TCL_BREAK ){. 
12250 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b       rc = TCL_OK
12260 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  ;.    }.    brea
12270 6b 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 2f 2a 0a  k;.  }.   .  /*.
12280 20 20 2a 2a 20 20 20 20 24 64 62 20 65 76 61 6c    **    $db eval
12290 20 24 73 71 6c 20 3f 61 72 72 61 79 3f 20 3f 7b   $sql ?array? ?{
122a0 20 20 2e 2e 2e 63 6f 64 65 2e 2e 2e 20 7d 3f 0a    ...code... }?.
122b0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 53 51    **.  ** The SQ
122c0 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 24  L statement in $
122d0 73 71 6c 20 69 73 20 65 76 61 6c 75 61 74 65 64  sql is evaluated
122e0 2e 20 20 46 6f 72 20 65 61 63 68 20 72 6f 77 2c  .  For each row,
122f0 20 74 68 65 20 76 61 6c 75 65 73 20 61 72 65 0a   the values are.
12300 20 20 2a 2a 20 70 6c 61 63 65 64 20 69 6e 20 65    ** placed in e
12310 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 61  lements of the a
12320 72 72 61 79 20 6e 61 6d 65 64 20 22 61 72 72 61  rray named "arra
12330 79 22 20 61 6e 64 20 2e 2e 2e 63 6f 64 65 2e 2e  y" and ...code..
12340 2e 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a 20  . is executed.. 
12350 20 2a 2a 20 49 66 20 22 61 72 72 61 79 22 20 61   ** If "array" a
12360 6e 64 20 22 63 6f 64 65 22 20 61 72 65 20 6f 6d  nd "code" are om
12370 69 74 74 65 64 2c 20 74 68 65 6e 20 6e 6f 20 63  itted, then no c
12380 61 6c 6c 62 61 63 6b 20 69 73 20 65 76 65 72 79  allback is every
12390 20 69 6e 76 6f 6b 65 64 2e 0a 20 20 2a 2a 20 49   invoked..  ** I
123a0 66 20 22 61 72 72 61 79 22 20 69 73 20 61 6e 20  f "array" is an 
123b0 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 20 74 68  empty string, th
123c0 65 6e 20 74 68 65 20 76 61 6c 75 65 73 20 61 72  en the values ar
123d0 65 20 70 6c 61 63 65 64 20 69 6e 20 76 61 72 69  e placed in vari
123e0 61 62 6c 65 73 0a 20 20 2a 2a 20 74 68 61 74 20  ables.  ** that 
123f0 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 61  have the same na
12400 6d 65 20 61 73 20 74 68 65 20 66 69 65 6c 64 73  me as the fields
12410 20 65 78 74 72 61 63 74 65 64 20 62 79 20 74 68   extracted by th
12420 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  e query..  */.  
12430 63 61 73 65 20 44 42 5f 45 56 41 4c 3a 20 7b 0a  case DB_EVAL: {.
12440 20 20 20 20 69 66 28 20 6f 62 6a 63 3c 33 20 7c      if( objc<3 |
12450 7c 20 6f 62 6a 63 3e 35 20 29 7b 0a 20 20 20 20  | objc>5 ){.    
12460 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
12470 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
12480 6a 76 2c 20 22 53 51 4c 20 3f 41 52 52 41 59 2d  jv, "SQL ?ARRAY-
12490 4e 41 4d 45 3f 20 3f 53 43 52 49 50 54 3f 22 29  NAME? ?SCRIPT?")
124a0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
124b0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
124c0 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33  .    if( objc==3
124d0 20 29 7b 0a 20 20 20 20 20 20 44 62 45 76 61 6c   ){.      DbEval
124e0 43 6f 6e 74 65 78 74 20 73 45 76 61 6c 3b 0a 20  Context sEval;. 
124f0 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52       Tcl_Obj *pR
12500 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28  et = Tcl_NewObj(
12510 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63  );.      Tcl_Inc
12520 72 52 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b  rRefCount(pRet);
12530 0a 20 20 20 20 20 20 64 62 45 76 61 6c 49 6e 69  .      dbEvalIni
12540 74 28 26 73 45 76 61 6c 2c 20 70 44 62 2c 20 6f  t(&sEval, pDb, o
12550 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20  bjv[2], 0);.    
12560 20 20 77 68 69 6c 65 28 20 54 43 4c 5f 4f 4b 3d    while( TCL_OK=
12570 3d 28 72 63 20 3d 20 64 62 45 76 61 6c 53 74 65  =(rc = dbEvalSte
12580 70 28 26 73 45 76 61 6c 29 29 20 29 7b 0a 20 20  p(&sEval)) ){.  
12590 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
125a0 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20       int nCol;. 
125b0 20 20 20 20 20 20 20 64 62 45 76 61 6c 52 6f 77         dbEvalRow
125c0 49 6e 66 6f 28 26 73 45 76 61 6c 2c 20 26 6e 43  Info(&sEval, &nC
125d0 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ol, 0);.        
125e0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
125f0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
12600 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
12610 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
12620 2c 20 70 52 65 74 2c 20 64 62 45 76 61 6c 43 6f  , pRet, dbEvalCo
12630 6c 75 6d 6e 56 61 6c 75 65 28 26 73 45 76 61 6c  lumnValue(&sEval
12640 2c 20 69 29 29 3b 0a 20 20 20 20 20 20 20 20 7d  , i));.        }
12650 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64  .      }.      d
12660 62 45 76 61 6c 46 69 6e 61 6c 69 7a 65 28 26 73  bEvalFinalize(&s
12670 45 76 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  Eval);.      if(
12680 20 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20 29   rc==TCL_BREAK )
12690 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65  {.        Tcl_Se
126a0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
126b0 70 2c 20 70 52 65 74 29 3b 0a 20 20 20 20 20 20  p, pRet);.      
126c0 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20    rc = TCL_OK;. 
126d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 63 6c       }.      Tcl
126e0 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 52  _DecrRefCount(pR
126f0 65 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  et);.    }else{.
12700 20 20 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61        ClientData
12710 20 63 64 5b 32 5d 3b 0a 20 20 20 20 20 20 44 62   cd[2];.      Db
12720 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70 3b 0a  EvalContext *p;.
12730 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70        Tcl_Obj *p
12740 41 72 72 61 79 20 3d 20 30 3b 0a 20 20 20 20 20  Array = 0;.     
12750 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70   Tcl_Obj *pScrip
12760 74 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 62  t;..      if( ob
12770 6a 63 3d 3d 35 20 26 26 20 2a 28 63 68 61 72 20  jc==5 && *(char 
12780 2a 29 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  *)Tcl_GetString(
12790 6f 62 6a 76 5b 33 5d 29 20 29 7b 0a 20 20 20 20  objv[3]) ){.    
127a0 20 20 20 20 70 41 72 72 61 79 20 3d 20 6f 62 6a      pArray = obj
127b0 76 5b 33 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  v[3];.      }.  
127c0 20 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62      pScript = ob
127d0 6a 76 5b 6f 62 6a 63 2d 31 5d 3b 0a 20 20 20 20  jv[objc-1];.    
127e0 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
127f0 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 20 20 20  nt(pScript);.   
12800 20 20 20 0a 20 20 20 20 20 20 70 20 3d 20 28 44     .      p = (D
12810 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 29 54  bEvalContext *)T
12820 63 6c 5f 41 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  cl_Alloc(sizeof(
12830 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 29 29 3b  DbEvalContext));
12840 0a 20 20 20 20 20 20 64 62 45 76 61 6c 49 6e 69  .      dbEvalIni
12850 74 28 70 2c 20 70 44 62 2c 20 6f 62 6a 76 5b 32  t(p, pDb, objv[2
12860 5d 2c 20 70 41 72 72 61 79 29 3b 0a 0a 20 20 20  ], pArray);..   
12870 20 20 20 63 64 5b 30 5d 20 3d 20 28 76 6f 69 64     cd[0] = (void
12880 20 2a 29 70 3b 0a 20 20 20 20 20 20 63 64 5b 31   *)p;.      cd[1
12890 5d 20 3d 20 28 76 6f 69 64 20 2a 29 70 53 63 72  ] = (void *)pScr
128a0 69 70 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ipt;.      rc = 
128b0 44 62 45 76 61 6c 4e 65 78 74 43 6d 64 28 63 64  DbEvalNextCmd(cd
128c0 2c 20 69 6e 74 65 72 70 2c 20 54 43 4c 5f 4f 4b  , interp, TCL_OK
128d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  );.    }.    bre
128e0 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
128f0 2a 2a 20 20 20 20 20 24 64 62 20 66 75 6e 63 74  **     $db funct
12900 69 6f 6e 20 4e 41 4d 45 20 5b 2d 61 72 67 63 6f  ion NAME [-argco
12910 75 6e 74 20 4e 5d 20 53 43 52 49 50 54 0a 20 20  unt N] SCRIPT.  
12920 2a 2a 0a 20 20 2a 2a 20 43 72 65 61 74 65 20 61  **.  ** Create a
12930 20 6e 65 77 20 53 51 4c 20 66 75 6e 63 74 69 6f   new SQL functio
12940 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20  n called NAME.  
12950 57 68 65 6e 65 76 65 72 20 74 68 61 74 20 66 75  Whenever that fu
12960 6e 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63  nction is.  ** c
12970 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53 43  alled, invoke SC
12980 52 49 50 54 20 74 6f 20 65 76 61 6c 75 61 74 65  RIPT to evaluate
12990 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20   the function.. 
129a0 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 46 55   */.  case DB_FU
129b0 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 53 71  NCTION: {.    Sq
129c0 6c 46 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20  lFunc *pFunc;.  
129d0 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69    Tcl_Obj *pScri
129e0 70 74 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e  pt;.    char *zN
129f0 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 6e 41 72  ame;.    int nAr
12a00 67 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20  g = -1;.    if( 
12a10 6f 62 6a 63 3d 3d 36 20 29 7b 0a 20 20 20 20 20  objc==6 ){.     
12a20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
12a30 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
12a40 62 6a 76 5b 33 5d 29 3b 0a 20 20 20 20 20 20 69  bjv[3]);.      i
12a50 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28  nt n = strlen30(
12a60 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e  z);.      if( n>
12a70 32 20 26 26 20 73 74 72 6e 63 6d 70 28 7a 2c 20  2 && strncmp(z, 
12a80 22 2d 61 72 67 63 6f 75 6e 74 22 2c 6e 29 3d 3d  "-argcount",n)==
12a90 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
12aa0 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
12ab0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
12ac0 34 5d 2c 20 26 6e 41 72 67 29 20 29 20 72 65 74  4], &nArg) ) ret
12ad0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
12ae0 20 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3c         if( nArg<
12af0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  0 ){.          T
12b00 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
12b10 69 6e 74 65 72 70 2c 20 22 6e 75 6d 62 65 72 20  interp, "number 
12b20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 6d 75 73  of arguments mus
12b30 74 20 62 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  t be non-negativ
12b40 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e",.            
12b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
12b60 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
12b70 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
12b80 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a  RROR;.        }.
12b90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53        }.      pS
12ba0 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 35 5d 3b  cript = objv[5];
12bb0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
12bc0 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20  bjc!=4 ){.      
12bd0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
12be0 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
12bf0 2c 20 22 4e 41 4d 45 20 5b 2d 61 72 67 63 6f 75  , "NAME [-argcou
12c00 6e 74 20 4e 5d 20 53 43 52 49 50 54 22 29 3b 0a  nt N] SCRIPT");.
12c10 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
12c20 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73  _ERROR;.    }els
12c30 65 7b 0a 20 20 20 20 20 20 70 53 63 72 69 70 74  e{.      pScript
12c40 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20   = objv[3];.    
12c50 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 54 63  }.    zName = Tc
12c60 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
12c70 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a  bj(objv[2], 0);.
12c80 20 20 20 20 70 46 75 6e 63 20 3d 20 66 69 6e 64      pFunc = find
12c90 53 71 6c 46 75 6e 63 28 70 44 62 2c 20 7a 4e 61  SqlFunc(pDb, zNa
12ca0 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 46 75  me);.    if( pFu
12cb0 6e 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 54  nc==0 ) return T
12cc0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 69 66  CL_ERROR;.    if
12cd0 28 20 70 46 75 6e 63 2d 3e 70 53 63 72 69 70 74  ( pFunc->pScript
12ce0 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44 65   ){.      Tcl_De
12cf0 63 72 52 65 66 43 6f 75 6e 74 28 70 46 75 6e 63  crRefCount(pFunc
12d00 2d 3e 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20  ->pScript);.    
12d10 7d 0a 20 20 20 20 70 46 75 6e 63 2d 3e 70 53 63  }.    pFunc->pSc
12d20 72 69 70 74 20 3d 20 70 53 63 72 69 70 74 3b 0a  ript = pScript;.
12d30 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
12d40 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 20  ount(pScript);. 
12d50 20 20 20 70 46 75 6e 63 2d 3e 75 73 65 45 76 61     pFunc->useEva
12d60 6c 4f 62 6a 76 20 3d 20 73 61 66 65 54 6f 55 73  lObjv = safeToUs
12d70 65 45 76 61 6c 4f 62 6a 76 28 69 6e 74 65 72 70  eEvalObjv(interp
12d80 2c 20 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20  , pScript);.    
12d90 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
12da0 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 44 62  ate_function(pDb
12db0 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72  ->db, zName, nAr
12dc0 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a  g, SQLITE_UTF8,.
12dd0 20 20 20 20 20 20 20 20 70 46 75 6e 63 2c 20 74          pFunc, t
12de0 63 6c 53 71 6c 46 75 6e 63 2c 20 30 2c 20 30 29  clSqlFunc, 0, 0)
12df0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
12e00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12e10 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b   rc = TCL_ERROR;
12e20 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65  .      Tcl_SetRe
12e30 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
12e40 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72  ar *)sqlite3_err
12e50 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 54 43  msg(pDb->db), TC
12e60 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20  L_VOLATILE);.   
12e70 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
12e80 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
12e90 20 24 64 62 20 69 6e 63 72 62 6c 6f 62 20 3f 2d   $db incrblob ?-
12ea0 72 65 61 64 6f 6e 6c 79 3f 20 3f 44 42 3f 20 54  readonly? ?DB? T
12eb0 41 42 4c 45 20 43 4f 4c 55 4d 4e 20 52 4f 57 49  ABLE COLUMN ROWI
12ec0 44 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  D.  */.  case DB
12ed0 5f 49 4e 43 52 42 4c 4f 42 3a 20 7b 0a 23 69 66  _INCRBLOB: {.#if
12ee0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12ef0 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 54 63 6c  INCRBLOB.    Tcl
12f00 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
12f10 74 65 72 70 2c 20 22 69 6e 63 72 62 6c 6f 62 20  terp, "incrblob 
12f20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 69 6e  not available in
12f30 20 74 68 69 73 20 62 75 69 6c 64 22 2c 20 30 29   this build", 0)
12f40 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
12f50 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20  _ERROR;.#else.  
12f60 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79    int isReadonly
12f70 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   = 0;.    const 
12f80 63 68 61 72 20 2a 7a 44 62 20 3d 20 22 6d 61 69  char *zDb = "mai
12f90 6e 22 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  n";.    const ch
12fa0 61 72 20 2a 7a 54 61 62 6c 65 3b 0a 20 20 20 20  ar *zTable;.    
12fb0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
12fc0 75 6d 6e 3b 0a 20 20 20 20 54 63 6c 5f 57 69 64  umn;.    Tcl_Wid
12fd0 65 49 6e 74 20 69 52 6f 77 3b 0a 0a 20 20 20 20  eInt iRow;..    
12fe0 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 74 68 65  /* Check for the
12ff0 20 2d 72 65 61 64 6f 6e 6c 79 20 6f 70 74 69 6f   -readonly optio
13000 6e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 62 6a  n */.    if( obj
13010 63 3e 33 20 26 26 20 73 74 72 63 6d 70 28 54 63  c>3 && strcmp(Tc
13020 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
13030 5b 32 5d 29 2c 20 22 2d 72 65 61 64 6f 6e 6c 79  [2]), "-readonly
13040 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
13050 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20  sReadonly = 1;. 
13060 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62     }..    if( ob
13070 6a 63 21 3d 28 35 2b 69 73 52 65 61 64 6f 6e 6c  jc!=(5+isReadonl
13080 79 29 20 26 26 20 6f 62 6a 63 21 3d 28 36 2b 69  y) && objc!=(6+i
13090 73 52 65 61 64 6f 6e 6c 79 29 20 29 7b 0a 20 20  sReadonly) ){.  
130a0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
130b0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
130c0 6f 62 6a 76 2c 20 22 3f 2d 72 65 61 64 6f 6e 6c  objv, "?-readonl
130d0 79 3f 20 3f 44 42 3f 20 54 41 42 4c 45 20 43 4f  y? ?DB? TABLE CO
130e0 4c 55 4d 4e 20 52 4f 57 49 44 22 29 3b 0a 20 20  LUMN ROWID");.  
130f0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
13100 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
13110 20 69 66 28 20 6f 62 6a 63 3d 3d 28 36 2b 69 73   if( objc==(6+is
13120 52 65 61 64 6f 6e 6c 79 29 20 29 7b 0a 20 20 20  Readonly) ){.   
13130 20 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74     zDb = Tcl_Get
13140 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
13150 0a 20 20 20 20 7d 0a 20 20 20 20 7a 54 61 62 6c  .    }.    zTabl
13160 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
13170 67 28 6f 62 6a 76 5b 6f 62 6a 63 2d 33 5d 29 3b  g(objv[objc-3]);
13180 0a 20 20 20 20 7a 43 6f 6c 75 6d 6e 20 3d 20 54  .    zColumn = T
13190 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
131a0 76 5b 6f 62 6a 63 2d 32 5d 29 3b 0a 20 20 20 20  v[objc-2]);.    
131b0 72 63 20 3d 20 54 63 6c 5f 47 65 74 57 69 64 65  rc = Tcl_GetWide
131c0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
131d0 70 2c 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 2c  p, objv[objc-1],
131e0 20 26 69 52 6f 77 29 3b 0a 0a 20 20 20 20 69 66   &iRow);..    if
131f0 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a  ( rc==TCL_OK ){.
13200 20 20 20 20 20 20 72 63 20 3d 20 63 72 65 61 74        rc = creat
13210 65 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c  eIncrblobChannel
13220 28 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 65  (.          inte
13230 72 70 2c 20 70 44 62 2c 20 7a 44 62 2c 20 7a 54  rp, pDb, zDb, zT
13240 61 62 6c 65 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 69  able, zColumn, i
13250 52 6f 77 2c 20 69 73 52 65 61 64 6f 6e 6c 79 0a  Row, isReadonly.
13260 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 23        );.    }.#
13270 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b  endif.    break;
13280 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
13290 20 20 20 20 24 64 62 20 69 6e 74 65 72 72 75 70      $db interrup
132a0 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 74 65  t.  **.  ** Inte
132b0 72 72 75 70 74 20 74 68 65 20 65 78 65 63 75 74  rrupt the execut
132c0 69 6f 6e 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  ion of the inner
132d0 2d 6d 6f 73 74 20 53 51 4c 20 69 6e 74 65 72 70  -most SQL interp
132e0 72 65 74 65 72 2e 20 20 54 68 69 73 0a 20 20 2a  reter.  This.  *
132f0 2a 20 63 61 75 73 65 73 20 74 68 65 20 53 51 4c  * causes the SQL
13300 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 72 65   statement to re
13310 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 6f 66  turn an error of
13320 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
13330 54 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  T..  */.  case D
13340 42 5f 49 4e 54 45 52 52 55 50 54 3a 20 7b 0a 20  B_INTERRUPT: {. 
13350 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72     sqlite3_inter
13360 72 75 70 74 28 70 44 62 2d 3e 64 62 29 3b 0a 20  rupt(pDb->db);. 
13370 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
13380 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62   /*.  **     $db
13390 20 6e 75 6c 6c 76 61 6c 75 65 20 3f 53 54 52 49   nullvalue ?STRI
133a0 4e 47 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 68  NG?.  **.  ** Ch
133b0 61 6e 67 65 20 74 65 78 74 20 75 73 65 64 20 77  ange text used w
133c0 68 65 6e 20 61 20 4e 55 4c 4c 20 63 6f 6d 65 73  hen a NULL comes
133d0 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 64   back from the d
133e0 61 74 61 62 61 73 65 2e 20 49 66 20 3f 53 54 52  atabase. If ?STR
133f0 49 4e 47 3f 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  ING?.  ** is not
13400 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 74   present, then t
13410 68 65 20 63 75 72 72 65 6e 74 20 73 74 72 69 6e  he current strin
13420 67 20 75 73 65 64 20 66 6f 72 20 4e 55 4c 4c 20  g used for NULL 
13430 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a  is returned..  *
13440 2a 20 49 66 20 53 54 52 49 4e 47 20 69 73 20 70  * If STRING is p
13450 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 53 54 52  resent, then STR
13460 49 4e 47 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ING is returned.
13470 0a 20 20 2a 2a 0a 20 20 2a 2f 0a 20 20 63 61 73  .  **.  */.  cas
13480 65 20 44 42 5f 4e 55 4c 4c 56 41 4c 55 45 3a 20  e DB_NULLVALUE: 
13490 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  {.    if( objc!=
134a0 32 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a  2 && objc!=3 ){.
134b0 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
134c0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
134d0 2c 20 6f 62 6a 76 2c 20 22 4e 55 4c 4c 56 41 4c  , objv, "NULLVAL
134e0 55 45 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  UE");.      retu
134f0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
13500 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63    }.    if( objc
13510 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==3 ){.      int
13520 20 6c 65 6e 3b 0a 20 20 20 20 20 20 63 68 61 72   len;.      char
13530 20 2a 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 47 65   *zNull = Tcl_Ge
13540 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
13550 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20  bjv[2], &len);. 
13560 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 4e       if( pDb->zN
13570 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 54  ull ){.        T
13580 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 4e 75  cl_Free(pDb->zNu
13590 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ll);.      }.   
135a0 20 20 20 69 66 28 20 7a 4e 75 6c 6c 20 26 26 20     if( zNull && 
135b0 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  len>0 ){.       
135c0 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 3d 20 54 63   pDb->zNull = Tc
135d0 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31  l_Alloc( len + 1
135e0 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   );.        memc
135f0 70 79 28 70 44 62 2d 3e 7a 4e 75 6c 6c 2c 20 7a  py(pDb->zNull, z
13600 4e 75 6c 6c 2c 20 6c 65 6e 29 3b 0a 20 20 20 20  Null, len);.    
13610 20 20 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c 5b 6c      pDb->zNull[l
13620 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  en] = '\0';.    
13630 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13640 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 3d 20 30 3b   pDb->zNull = 0;
13650 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
13660 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
13670 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
13680 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 44 62  NewStringObj(pDb
13690 2d 3e 7a 4e 75 6c 6c 2c 20 2d 31 29 29 3b 0a 20  ->zNull, -1));. 
136a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
136b0 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62   /*.  **     $db
136c0 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77   last_insert_row
136d0 69 64 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  id .  **.  ** Re
136e0 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20  turn an integer 
136f0 77 68 69 63 68 20 69 73 20 74 68 65 20 52 4f 57  which is the ROW
13700 49 44 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20  ID for the most 
13710 72 65 63 65 6e 74 20 69 6e 73 65 72 74 2e 0a 20  recent insert.. 
13720 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 4c 41   */.  case DB_LA
13730 53 54 5f 49 4e 53 45 52 54 5f 52 4f 57 49 44 3a  ST_INSERT_ROWID:
13740 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a   {.    Tcl_Obj *
13750 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 54 63 6c  pResult;.    Tcl
13760 5f 57 69 64 65 49 6e 74 20 72 6f 77 69 64 3b 0a  _WideInt rowid;.
13770 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20      if( objc!=2 
13780 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
13790 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
137a0 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a  , 2, objv, "");.
137b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
137c0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
137d0 20 20 72 6f 77 69 64 20 3d 20 73 71 6c 69 74 65    rowid = sqlite
137e0 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f  3_last_insert_ro
137f0 77 69 64 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20  wid(pDb->db);.  
13800 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f    pResult = Tcl_
13810 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  GetObjResult(int
13820 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  erp);.    Tcl_Se
13830 74 57 69 64 65 49 6e 74 4f 62 6a 28 70 52 65 73  tWideIntObj(pRes
13840 75 6c 74 2c 20 72 6f 77 69 64 29 3b 0a 20 20 20  ult, rowid);.   
13850 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
13860 2a 0a 20 20 2a 2a 20 54 68 65 20 44 42 5f 4f 4e  *.  ** The DB_ON
13870 45 43 4f 4c 55 4d 4e 20 6d 65 74 68 6f 64 20 69  ECOLUMN method i
13880 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 74 6f  s implemented to
13890 67 65 74 68 65 72 20 77 69 74 68 20 44 42 5f 45  gether with DB_E
138a0 58 49 53 54 53 2e 0a 20 20 2a 2f 0a 0a 20 20 2f  XISTS..  */..  /
138b0 2a 20 20 20 20 24 64 62 20 70 72 6f 67 72 65 73  *    $db progres
138c0 73 20 3f 4e 20 43 41 4c 4c 42 41 43 4b 3f 0a 20  s ?N CALLBACK?. 
138d0 20 2a 2a 20 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65   ** .  ** Invoke
138e0 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62   the given callb
138f0 61 63 6b 20 65 76 65 72 79 20 4e 20 76 69 72 74  ack every N virt
13900 75 61 6c 20 6d 61 63 68 69 6e 65 20 6f 70 63 6f  ual machine opco
13910 64 65 73 20 77 68 69 6c 65 20 65 78 65 63 75 74  des while execut
13920 69 6e 67 0a 20 20 2a 2a 20 71 75 65 72 69 65 73  ing.  ** queries
13930 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
13940 5f 50 52 4f 47 52 45 53 53 3a 20 7b 0a 20 20 20  _PROGRESS: {.   
13950 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a   if( objc==2 ){.
13960 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
13970 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20  Progress ){.    
13980 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
13990 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62  sult(interp, pDb
139a0 2d 3e 7a 50 72 6f 67 72 65 73 73 2c 20 30 29 3b  ->zProgress, 0);
139b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
139c0 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29  se if( objc==4 )
139d0 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 50  {.      char *zP
139e0 72 6f 67 72 65 73 73 3b 0a 20 20 20 20 20 20 69  rogress;.      i
139f0 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 6e  nt len;.      in
13a00 74 20 4e 3b 0a 20 20 20 20 20 20 69 66 28 20 54  t N;.      if( T
13a10 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e  CL_OK!=Tcl_GetIn
13a20 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
13a30 20 6f 62 6a 76 5b 32 5d 2c 20 26 4e 29 20 29 7b   objv[2], &N) ){
13a40 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
13a50 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
13a60 20 7d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44   };.      if( pD
13a70 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a  b->zProgress ){.
13a80 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65          Tcl_Free
13a90 28 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 29  (pDb->zProgress)
13aa0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13ab0 7a 50 72 6f 67 72 65 73 73 20 3d 20 54 63 6c 5f  zProgress = Tcl_
13ac0 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
13ad0 28 6f 62 6a 76 5b 33 5d 2c 20 26 6c 65 6e 29 3b  (objv[3], &len);
13ae0 0a 20 20 20 20 20 20 69 66 28 20 7a 50 72 6f 67  .      if( zProg
13af0 72 65 73 73 20 26 26 20 6c 65 6e 3e 30 20 29 7b  ress && len>0 ){
13b00 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50  .        pDb->zP
13b10 72 6f 67 72 65 73 73 20 3d 20 54 63 6c 5f 41 6c  rogress = Tcl_Al
13b20 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a  loc( len + 1 );.
13b30 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
13b40 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 2c 20 7a  Db->zProgress, z
13b50 50 72 6f 67 72 65 73 73 2c 20 6c 65 6e 2b 31 29  Progress, len+1)
13b60 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
13b70 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f         pDb->zPro
13b80 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 20  gress = 0;.     
13b90 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
13ba0 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f  E_OMIT_PROGRESS_
13bb0 43 41 4c 4c 42 41 43 4b 0a 20 20 20 20 20 20 69  CALLBACK.      i
13bc0 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73  f( pDb->zProgres
13bd0 73 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  s ){.        pDb
13be0 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  ->interp = inter
13bf0 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  p;.        sqlit
13c00 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64  e3_progress_hand
13c10 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20 4e 2c 20  ler(pDb->db, N, 
13c20 44 62 50 72 6f 67 72 65 73 73 48 61 6e 64 6c 65  DbProgressHandle
13c30 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d  r, pDb);.      }
13c40 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
13c50 6c 69 74 65 33 5f 70 72 6f 67 72 65 73 73 5f 68  lite3_progress_h
13c60 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20  andler(pDb->db, 
13c70 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
13c80 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  }.#endif.    }el
13c90 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72  se{.      Tcl_Wr
13ca0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
13cb0 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 20 43  p, 2, objv, "N C
13cc0 41 4c 4c 42 41 43 4b 22 29 3b 0a 20 20 20 20 20  ALLBACK");.     
13cd0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
13ce0 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  R;.    }.    bre
13cf0 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
13d00 20 24 64 62 20 70 72 6f 66 69 6c 65 20 3f 43 41   $db profile ?CA
13d10 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a  LLBACK?.  **.  *
13d20 2a 20 4d 61 6b 65 20 61 72 72 61 6e 67 65 6d 65  * Make arrangeme
13d30 6e 74 73 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68  nts to invoke th
13d40 65 20 43 41 4c 4c 42 41 43 4b 20 72 6f 75 74 69  e CALLBACK routi
13d50 6e 65 20 61 66 74 65 72 20 65 61 63 68 20 53 51  ne after each SQ
13d60 4c 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  L statement.  **
13d70 20 74 68 61 74 20 68 61 73 20 72 75 6e 2e 20 20   that has run.  
13d80 54 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  The text of the 
13d90 53 51 4c 20 61 6e 64 20 74 68 65 20 61 6d 6f 75  SQL and the amou
13da0 6e 74 20 6f 66 20 65 6c 61 70 73 65 20 74 69 6d  nt of elapse tim
13db0 65 20 61 72 65 0a 20 20 2a 2a 20 61 70 70 65 6e  e are.  ** appen
13dc0 64 65 64 20 74 6f 20 43 41 4c 4c 42 41 43 4b 20  ded to CALLBACK 
13dd0 62 65 66 6f 72 65 20 74 68 65 20 73 63 72 69 70  before the scrip
13de0 74 20 69 73 20 72 75 6e 2e 0a 20 20 2a 2f 0a 20  t is run..  */. 
13df0 20 63 61 73 65 20 44 42 5f 50 52 4f 46 49 4c 45   case DB_PROFILE
13e00 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  : {.    if( objc
13e10 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  >3 ){.      Tcl_
13e20 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
13e30 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f  erp, 2, objv, "?
13e40 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20  CALLBACK?");.   
13e50 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
13e60 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ROR;.    }else i
13e70 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20  f( objc==2 ){.  
13e80 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72      if( pDb->zPr
13e90 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  ofile ){.       
13ea0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
13eb0 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a  t(interp, pDb->z
13ec0 50 72 6f 66 69 6c 65 2c 20 30 29 3b 0a 20 20 20  Profile, 0);.   
13ed0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
13ee0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 50 72 6f        char *zPro
13ef0 66 69 6c 65 3b 0a 20 20 20 20 20 20 69 6e 74 20  file;.      int 
13f00 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70  len;.      if( p
13f10 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a  Db->zProfile ){.
13f20 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65          Tcl_Free
13f30 28 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 29 3b  (pDb->zProfile);
13f40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
13f50 50 72 6f 66 69 6c 65 20 3d 20 54 63 6c 5f 47 65  Profile = Tcl_Ge
13f60 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
13f70 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20  bjv[2], &len);. 
13f80 20 20 20 20 20 69 66 28 20 7a 50 72 6f 66 69 6c       if( zProfil
13f90 65 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20  e && len>0 ){.  
13fa0 20 20 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f 66        pDb->zProf
13fb0 69 6c 65 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28  ile = Tcl_Alloc(
13fc0 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20   len + 1 );.    
13fd0 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e      memcpy(pDb->
13fe0 7a 50 72 6f 66 69 6c 65 2c 20 7a 50 72 6f 66 69  zProfile, zProfi
13ff0 6c 65 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20  le, len+1);.    
14000 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
14010 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 3d   pDb->zProfile =
14020 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20   0;.      }.#if 
14030 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
14040 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 21  OMIT_TRACE) && !
14050 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
14060 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
14070 4e 54 29 0a 20 20 20 20 20 20 69 66 28 20 70 44  NT).      if( pD
14080 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20  b->zProfile ){. 
14090 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65         pDb->inte
140a0 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp = interp;.   
140b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f       sqlite3_pro
140c0 66 69 6c 65 28 70 44 62 2d 3e 64 62 2c 20 44 62  file(pDb->db, Db
140d0 50 72 6f 66 69 6c 65 48 61 6e 64 6c 65 72 2c 20  ProfileHandler, 
140e0 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  pDb);.      }els
140f0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
14100 65 33 5f 70 72 6f 66 69 6c 65 28 70 44 62 2d 3e  e3_profile(pDb->
14110 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  db, 0, 0);.     
14120 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
14130 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
14140 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64    /*.  **     $d
14150 62 20 72 65 6b 65 79 20 4b 45 59 0a 20 20 2a 2a  b rekey KEY.  **
14160 0a 20 20 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  .  ** Change the
14170 20 65 6e 63 72 79 70 74 69 6f 6e 20 6b 65 79 20   encryption key 
14180 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79  on the currently
14190 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 2e 0a   open database..
141a0 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 52    */.  case DB_R
141b0 45 4b 45 59 3a 20 7b 0a 23 69 66 64 65 66 20 53  EKEY: {.#ifdef S
141c0 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
141d0 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20      int nKey;.  
141e0 20 20 76 6f 69 64 20 2a 70 4b 65 79 3b 0a 23 65    void *pKey;.#e
141f0 6e 64 69 66 0a 20 20 20 20 69 66 28 20 6f 62 6a  ndif.    if( obj
14200 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=3 ){.      Tc
14210 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
14220 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
14230 22 4b 45 59 22 29 3b 0a 20 20 20 20 20 20 72 65  "KEY");.      re
14240 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
14250 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
14260 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
14270 20 20 70 4b 65 79 20 3d 20 54 63 6c 5f 47 65 74    pKey = Tcl_Get
14280 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a  ByteArrayFromObj
14290 28 6f 62 6a 76 5b 32 5d 2c 20 26 6e 4b 65 79 29  (objv[2], &nKey)
142a0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
142b0 65 33 5f 72 65 6b 65 79 28 70 44 62 2d 3e 64 62  e3_rekey(pDb->db
142c0 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20  , pKey, nKey);. 
142d0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
142e0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
142f0 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69  ult(interp, sqli
14300 74 65 33 5f 65 72 72 73 74 72 28 72 63 29 2c 20  te3_errstr(rc), 
14310 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54  0);.      rc = T
14320 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
14330 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b  #endif.    break
14340 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24  ;.  }..  /*    $
14350 64 62 20 72 65 73 74 6f 72 65 20 3f 44 41 54 41  db restore ?DATA
14360 42 41 53 45 3f 20 46 49 4c 45 4e 41 4d 45 0a 20  BASE? FILENAME. 
14370 20 2a 2a 0a 20 20 2a 2a 20 4f 70 65 6e 20 61 20   **.  ** Open a 
14380 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61  database file na
14390 6d 65 64 20 46 49 4c 45 4e 41 4d 45 2e 20 20 54  med FILENAME.  T
143a0 72 61 6e 73 66 65 72 20 74 68 65 20 63 6f 6e 74  ransfer the cont
143b0 65 6e 74 20 0a 20 20 2a 2a 20 6f 66 20 46 49 4c  ent .  ** of FIL
143c0 45 4e 41 4d 45 20 69 6e 74 6f 20 74 68 65 20 6c  ENAME into the l
143d0 6f 63 61 6c 20 64 61 74 61 62 61 73 65 20 44 41  ocal database DA
143e0 54 41 42 41 53 45 20 28 64 65 66 61 75 6c 74 3a  TABASE (default:
143f0 20 22 6d 61 69 6e 22 29 2e 0a 20 20 2a 2f 0a 20   "main")..  */. 
14400 20 63 61 73 65 20 44 42 5f 52 45 53 54 4f 52 45   case DB_RESTORE
14410 3a 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  : {.    const ch
14420 61 72 20 2a 7a 53 72 63 46 69 6c 65 3b 0a 20 20  ar *zSrcFile;.  
14430 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
14440 65 73 74 44 62 3b 0a 20 20 20 20 73 71 6c 69 74  estDb;.    sqlit
14450 65 33 20 2a 70 53 72 63 3b 0a 20 20 20 20 73 71  e3 *pSrc;.    sq
14460 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42  lite3_backup *pB
14470 61 63 6b 75 70 3b 0a 20 20 20 20 69 6e 74 20 6e  ackup;.    int n
14480 54 69 6d 65 6f 75 74 20 3d 20 30 3b 0a 0a 20 20  Timeout = 0;..  
14490 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b    if( objc==3 ){
144a0 0a 20 20 20 20 20 20 7a 44 65 73 74 44 62 20 3d  .      zDestDb =
144b0 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 20 20 7a   "main";.      z
144c0 53 72 63 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65  SrcFile = Tcl_Ge
144d0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
144e0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
144f0 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20  objc==4 ){.     
14500 20 7a 44 65 73 74 44 62 20 3d 20 54 63 6c 5f 47   zDestDb = Tcl_G
14510 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
14520 29 3b 0a 20 20 20 20 20 20 7a 53 72 63 46 69 6c  );.      zSrcFil
14530 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
14540 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 20 20  g(objv[3]);.    
14550 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c  }else{.      Tcl
14560 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
14570 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
14580 3f 44 41 54 41 42 41 53 45 3f 20 46 49 4c 45 4e  ?DATABASE? FILEN
14590 41 4d 45 22 29 3b 0a 20 20 20 20 20 20 72 65 74  AME");.      ret
145a0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
145b0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
145c0 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 7a 53  lite3_open_v2(zS
145d0 72 63 46 69 6c 65 2c 20 26 70 53 72 63 2c 20 53  rcFile, &pSrc, S
145e0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
145f0 4e 4c 59 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  NLY, 0);.    if(
14600 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14610 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
14620 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
14630 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 73 6f   "cannot open so
14640 75 72 63 65 20 64 61 74 61 62 61 73 65 3a 20 22  urce database: "
14650 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  ,.           sql
14660 69 74 65 33 5f 65 72 72 6d 73 67 28 70 53 72 63  ite3_errmsg(pSrc
14670 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ), (char*)0);.  
14680 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
14690 65 28 70 53 72 63 29 3b 0a 20 20 20 20 20 20 72  e(pSrc);.      r
146a0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
146b0 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 61 63 6b  .    }.    pBack
146c0 75 70 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63  up = sqlite3_bac
146d0 6b 75 70 5f 69 6e 69 74 28 70 44 62 2d 3e 64 62  kup_init(pDb->db
146e0 2c 20 7a 44 65 73 74 44 62 2c 20 70 53 72 63 2c  , zDestDb, pSrc,
146f0 20 22 6d 61 69 6e 22 29 3b 0a 20 20 20 20 69 66   "main");.    if
14700 28 20 70 42 61 63 6b 75 70 3d 3d 30 20 29 7b 0a  ( pBackup==0 ){.
14710 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
14720 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
14730 72 65 73 74 6f 72 65 20 66 61 69 6c 65 64 3a 20  restore failed: 
14740 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71  ",.           sq
14750 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
14760 2d 3e 64 62 29 2c 20 28 63 68 61 72 2a 29 30 29  ->db), (char*)0)
14770 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
14780 63 6c 6f 73 65 28 70 53 72 63 29 3b 0a 20 20 20  close(pSrc);.   
14790 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
147a0 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77  ROR;.    }.    w
147b0 68 69 6c 65 28 20 28 72 63 20 3d 20 73 71 6c 69  hile( (rc = sqli
147c0 74 65 33 5f 62 61 63 6b 75 70 5f 73 74 65 70 28  te3_backup_step(
147d0 70 42 61 63 6b 75 70 2c 31 30 30 29 29 3d 3d 53  pBackup,100))==S
147e0 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20  QLITE_OK.       
147f0 20 20 20 20 20 20 20 7c 7c 20 72 63 3d 3d 53 51         || rc==SQ
14800 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
14810 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
14820 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20  E_BUSY ){.      
14830 20 20 69 66 28 20 6e 54 69 6d 65 6f 75 74 2b 2b    if( nTimeout++
14840 20 3e 3d 20 33 20 29 20 62 72 65 61 6b 3b 0a 20   >= 3 ) break;. 
14850 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
14860 6c 65 65 70 28 31 30 30 29 3b 0a 20 20 20 20 20  leep(100);.     
14870 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
14880 69 74 65 33 5f 62 61 63 6b 75 70 5f 66 69 6e 69  ite3_backup_fini
14890 73 68 28 70 42 61 63 6b 75 70 29 3b 0a 20 20 20  sh(pBackup);.   
148a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
148b0 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 72 63  DONE ){.      rc
148c0 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d   = TCL_OK;.    }
148d0 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
148e0 49 54 45 5f 42 55 53 59 20 7c 7c 20 72 63 3d 3d  ITE_BUSY || rc==
148f0 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 29 7b  SQLITE_LOCKED ){
14900 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
14910 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
14920 22 72 65 73 74 6f 72 65 20 66 61 69 6c 65 64 3a  "restore failed:
14930 20 73 6f 75 72 63 65 20 64 61 74 61 62 61 73 65   source database
14940 20 62 75 73 79 22 2c 0a 20 20 20 20 20 20 20 20   busy",.        
14950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
14960 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
14970 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  rc = TCL_ERROR;.
14980 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14990 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
149a0 74 28 69 6e 74 65 72 70 2c 20 22 72 65 73 74 6f  t(interp, "resto
149b0 72 65 20 66 61 69 6c 65 64 3a 20 22 2c 0a 20 20  re failed: ",.  
149c0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
149d0 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29  _errmsg(pDb->db)
149e0 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
149f0 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f     rc = TCL_ERRO
14a00 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  R;.    }.    sql
14a10 69 74 65 33 5f 63 6c 6f 73 65 28 70 53 72 63 29  ite3_close(pSrc)
14a20 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
14a30 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  /*.  **     
14a40 24 64 62 20 73 74 61 74 75 73 20 28 73 74 65 70  $db status (step
14a50 7c 73 6f 72 74 7c 61 75 74 6f 69 6e 64 65 78 29  |sort|autoindex)
14a60 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 69 73 70 6c  .  **.  ** Displ
14a70 61 79 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54  ay SQLITE_STMTST
14a80 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54  ATUS_FULLSCAN_ST
14a90 45 50 20 6f 72 20 0a 20 20 2a 2a 20 53 51 4c 49  EP or .  ** SQLI
14aa0 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 53 4f  TE_STMTSTATUS_SO
14ab0 52 54 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20  RT for the most 
14ac0 72 65 63 65 6e 74 20 65 76 61 6c 2e 0a 20 20 2a  recent eval..  *
14ad0 2f 0a 20 20 63 61 73 65 20 44 42 5f 53 54 41 54  /.  case DB_STAT
14ae0 55 53 3a 20 7b 0a 20 20 20 20 69 6e 74 20 76 3b  US: {.    int v;
14af0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
14b00 2a 7a 4f 70 3b 0a 20 20 20 20 69 66 28 20 6f 62  *zOp;.    if( ob
14b10 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54  jc!=3 ){.      T
14b20 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
14b30 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
14b40 20 22 28 73 74 65 70 7c 73 6f 72 74 7c 61 75 74   "(step|sort|aut
14b50 6f 69 6e 64 65 78 29 22 29 3b 0a 20 20 20 20 20  oindex)");.     
14b60 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
14b70 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4f 70  R;.    }.    zOp
14b80 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
14b90 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 69  (objv[2]);.    i
14ba0 66 28 20 73 74 72 63 6d 70 28 7a 4f 70 2c 20 22  f( strcmp(zOp, "
14bb0 73 74 65 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20  step")==0 ){.   
14bc0 20 20 20 76 20 3d 20 70 44 62 2d 3e 6e 53 74 65     v = pDb->nSte
14bd0 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  p;.    }else if(
14be0 20 73 74 72 63 6d 70 28 7a 4f 70 2c 20 22 73 6f   strcmp(zOp, "so
14bf0 72 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rt")==0 ){.     
14c00 20 76 20 3d 20 70 44 62 2d 3e 6e 53 6f 72 74 3b   v = pDb->nSort;
14c10 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
14c20 74 72 63 6d 70 28 7a 4f 70 2c 20 22 61 75 74 6f  trcmp(zOp, "auto
14c30 69 6e 64 65 78 22 29 3d 3d 30 20 29 7b 0a 20 20  index")==0 ){.  
14c40 20 20 20 20 76 20 3d 20 70 44 62 2d 3e 6e 49 6e      v = pDb->nIn
14c50 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  dex;.    }else{.
14c60 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
14c70 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a  Result(interp, .
14c80 20 20 20 20 20 20 20 20 20 20 20 20 22 62 61 64              "bad
14c90 20 61 72 67 75 6d 65 6e 74 3a 20 73 68 6f 75 6c   argument: shoul
14ca0 64 20 62 65 20 61 75 74 6f 69 6e 64 65 78 2c 20  d be autoindex, 
14cb0 73 74 65 70 2c 20 6f 72 20 73 6f 72 74 22 2c 20  step, or sort", 
14cc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68  .            (ch
14cd0 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65  ar*)0);.      re
14ce0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
14cf0 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 53 65      }.    Tcl_Se
14d00 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
14d10 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
14d20 28 76 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  (v));.    break;
14d30 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a  .  }.  .  /*.  *
14d40 2a 20 20 20 20 20 24 64 62 20 74 69 6d 65 6f 75  *     $db timeou
14d50 74 20 4d 49 4c 4c 45 53 45 43 4f 4e 44 53 0a 20  t MILLESECONDS. 
14d60 20 2a 2a 0a 20 20 2a 2a 20 44 65 6c 61 79 20 66   **.  ** Delay f
14d70 6f 72 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  or the number of
14d80 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 70   milliseconds sp
14d90 65 63 69 66 69 65 64 20 77 68 65 6e 20 61 20 66  ecified when a f
14da0 69 6c 65 20 69 73 20 6c 6f 63 6b 65 64 2e 0a 20  ile is locked.. 
14db0 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54 49   */.  case DB_TI
14dc0 4d 45 4f 55 54 3a 20 7b 0a 20 20 20 20 69 6e 74  MEOUT: {.    int
14dd0 20 6d 73 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a   ms;.    if( obj
14de0 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=3 ){.      Tc
14df0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
14e00 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
14e10 22 4d 49 4c 4c 49 53 45 43 4f 4e 44 53 22 29 3b  "MILLISECONDS");
14e20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
14e30 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
14e40 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e     if( Tcl_GetIn
14e50 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
14e60 20 6f 62 6a 76 5b 32 5d 2c 20 26 6d 73 29 20 29   objv[2], &ms) )
14e70 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
14e80 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  R;.    sqlite3_b
14e90 75 73 79 5f 74 69 6d 65 6f 75 74 28 70 44 62 2d  usy_timeout(pDb-
14ea0 3e 64 62 2c 20 6d 73 29 3b 0a 20 20 20 20 62 72  >db, ms);.    br
14eb0 65 61 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  eak;.  }.  .  /*
14ec0 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 74 6f  .  **     $db to
14ed0 74 61 6c 5f 63 68 61 6e 67 65 73 0a 20 20 2a 2a  tal_changes.  **
14ee0 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  .  ** Return the
14ef0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
14f00 74 68 61 74 20 77 65 72 65 20 6d 6f 64 69 66 69  that were modifi
14f10 65 64 2c 20 69 6e 73 65 72 74 65 64 2c 20 6f 72  ed, inserted, or
14f20 20 64 65 6c 65 74 65 64 20 0a 20 20 2a 2a 20 73   deleted .  ** s
14f30 69 6e 63 65 20 74 68 65 20 64 61 74 61 62 61 73  ince the databas
14f40 65 20 68 61 6e 64 6c 65 20 77 61 73 20 63 72 65  e handle was cre
14f50 61 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  ated..  */.  cas
14f60 65 20 44 42 5f 54 4f 54 41 4c 5f 43 48 41 4e 47  e DB_TOTAL_CHANG
14f70 45 53 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62  ES: {.    Tcl_Ob
14f80 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20  j *pResult;.    
14f90 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
14fa0 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
14fb0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
14fc0 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20   objv, "");.    
14fd0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
14fe0 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 52  OR;.    }.    pR
14ff0 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f  esult = Tcl_GetO
15000 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  bjResult(interp)
15010 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 49 6e 74  ;.    Tcl_SetInt
15020 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 73 71 6c  Obj(pResult, sql
15030 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67  ite3_total_chang
15040 65 73 28 70 44 62 2d 3e 64 62 29 29 3b 0a 20 20  es(pDb->db));.  
15050 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
15060 2f 2a 20 20 20 20 24 64 62 20 74 72 61 63 65 20  /*    $db trace 
15070 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a  ?CALLBACK?.  **.
15080 20 20 2a 2a 20 4d 61 6b 65 20 61 72 72 61 6e 67    ** Make arrang
15090 65 6d 65 6e 74 73 20 74 6f 20 69 6e 76 6f 6b 65  ements to invoke
150a0 20 74 68 65 20 43 41 4c 4c 42 41 43 4b 20 72 6f   the CALLBACK ro
150b0 75 74 69 6e 65 20 66 6f 72 20 65 61 63 68 20 53  utine for each S
150c0 51 4c 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a  QL statement.  *
150d0 2a 20 74 68 61 74 20 69 73 20 65 78 65 63 75 74  * that is execut
150e0 65 64 2e 20 20 54 68 65 20 74 65 78 74 20 6f 66  ed.  The text of
150f0 20 74 68 65 20 53 51 4c 20 69 73 20 61 70 70 65   the SQL is appe
15100 6e 64 65 64 20 74 6f 20 43 41 4c 4c 42 41 43 4b  nded to CALLBACK
15110 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 69 74 20   before.  ** it 
15120 69 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20 2a  is executed..  *
15130 2f 0a 20 20 63 61 73 65 20 44 42 5f 54 52 41 43  /.  case DB_TRAC
15140 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a  E: {.    if( obj
15150 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  c>3 ){.      Tcl
15160 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
15170 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
15180 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20  ?CALLBACK?");.  
15190 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
151a0 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20  RROR;.    }else 
151b0 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20  if( objc==2 ){. 
151c0 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54       if( pDb->zT
151d0 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  race ){.        
151e0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
151f0 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 54  (interp, pDb->zT
15200 72 61 63 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  race, 0);.      
15210 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
15220 20 20 20 63 68 61 72 20 2a 7a 54 72 61 63 65 3b     char *zTrace;
15230 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  .      int len;.
15240 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
15250 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20  Trace ){.       
15260 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
15270 54 72 61 63 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Trace);.      }.
15280 20 20 20 20 20 20 7a 54 72 61 63 65 20 3d 20 54        zTrace = T
15290 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
152a0 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65  Obj(objv[2], &le
152b0 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 54  n);.      if( zT
152c0 72 61 63 65 20 26 26 20 6c 65 6e 3e 30 20 29 7b  race && len>0 ){
152d0 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 54  .        pDb->zT
152e0 72 61 63 65 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63  race = Tcl_Alloc
152f0 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20  ( len + 1 );.   
15300 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d       memcpy(pDb-
15310 3e 7a 54 72 61 63 65 2c 20 7a 54 72 61 63 65 2c  >zTrace, zTrace,
15320 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d   len+1);.      }
15330 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44  else{.        pD
15340 62 2d 3e 7a 54 72 61 63 65 20 3d 20 30 3b 0a 20  b->zTrace = 0;. 
15350 20 20 20 20 20 7d 0a 23 69 66 20 21 64 65 66 69       }.#if !defi
15360 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
15370 54 52 41 43 45 29 20 26 26 20 21 64 65 66 69 6e  TRACE) && !defin
15380 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ed(SQLITE_OMIT_F
15390 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20  LOATING_POINT). 
153a0 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54       if( pDb->zT
153b0 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  race ){.        
153c0 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e  pDb->interp = in
153d0 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71  terp;.        sq
153e0 6c 69 74 65 33 5f 74 72 61 63 65 28 70 44 62 2d  lite3_trace(pDb-
153f0 3e 64 62 2c 20 44 62 54 72 61 63 65 48 61 6e 64  >db, DbTraceHand
15400 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20  ler, pDb);.     
15410 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
15420 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28 70 44  sqlite3_trace(pD
15430 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  b->db, 0, 0);.  
15440 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
15450 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
15460 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 74  }..  /*    $db t
15470 72 61 6e 73 61 63 74 69 6f 6e 20 5b 2d 64 65 66  ransaction [-def
15480 65 72 72 65 64 7c 2d 69 6d 6d 65 64 69 61 74 65  erred|-immediate
15490 7c 2d 65 78 63 6c 75 73 69 76 65 5d 20 53 43 52  |-exclusive] SCR
154a0 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 74  IPT.  **.  ** St
154b0 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61  art a new transa
154c0 63 74 69 6f 6e 20 28 69 66 20 77 65 20 61 72 65  ction (if we are
154d0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20   not already in 
154e0 74 68 65 20 6d 69 64 73 74 20 6f 66 20 61 0a 20  the midst of a. 
154f0 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 29   ** transaction)
15500 20 61 6e 64 20 65 78 65 63 75 74 65 20 74 68 65   and execute the
15510 20 54 43 4c 20 73 63 72 69 70 74 20 53 43 52 49   TCL script SCRI
15520 50 54 2e 20 20 41 66 74 65 72 20 53 43 52 49 50  PT.  After SCRIP
15530 54 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 73  T.  ** completes
15540 2c 20 65 69 74 68 65 72 20 63 6f 6d 6d 69 74 20  , either commit 
15550 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
15560 6f 72 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20  or roll it back 
15570 69 66 20 53 43 52 49 50 54 0a 20 20 2a 2a 20 74  if SCRIPT.  ** t
15580 68 72 6f 77 73 20 61 6e 20 65 78 63 65 70 74 69  hrows an excepti
15590 6f 6e 2e 20 20 4f 72 20 69 66 20 6e 6f 20 6e 65  on.  Or if no ne
155a0 77 20 74 72 61 6e 73 61 74 69 6f 6e 20 77 61 73  w transation was
155b0 20 73 74 61 72 74 65 64 2c 20 64 6f 20 6e 6f 74   started, do not
155c0 68 69 6e 67 2e 0a 20 20 2a 2a 20 70 61 73 73 20  hing..  ** pass 
155d0 74 68 65 20 65 78 63 65 70 74 69 6f 6e 20 6f 6e  the exception on
155e0 20 75 70 20 74 68 65 20 73 74 61 63 6b 2e 0a 20   up the stack.. 
155f0 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63 6f   **.  ** This co
15600 6d 6d 61 6e 64 20 77 61 73 20 69 6e 73 70 69 72  mmand was inspir
15610 65 64 20 62 79 20 44 61 76 65 20 54 68 6f 6d 61  ed by Dave Thoma
15620 73 27 73 20 74 61 6c 6b 20 6f 6e 20 52 75 62 79  s's talk on Ruby
15630 20 61 74 20 74 68 65 0a 20 20 2a 2a 20 32 30 30   at the.  ** 200
15640 35 20 4f 27 52 65 69 6c 6c 79 20 4f 70 65 6e 20  5 O'Reilly Open 
15650 53 6f 75 72 63 65 20 43 6f 6e 76 65 6e 74 69 6f  Source Conventio
15660 6e 20 28 4f 53 43 4f 4e 29 2e 0a 20 20 2a 2f 0a  n (OSCON)..  */.
15670 20 20 63 61 73 65 20 44 42 5f 54 52 41 4e 53 41    case DB_TRANSA
15680 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 54 63 6c  CTION: {.    Tcl
15690 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 0a 20  _Obj *pScript;. 
156a0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
156b0 42 65 67 69 6e 20 3d 20 22 53 41 56 45 50 4f 49  Begin = "SAVEPOI
156c0 4e 54 20 5f 74 63 6c 5f 74 72 61 6e 73 61 63 74  NT _tcl_transact
156d0 69 6f 6e 22 3b 0a 20 20 20 20 69 66 28 20 6f 62  ion";.    if( ob
156e0 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d 34  jc!=3 && objc!=4
156f0 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
15700 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
15710 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 5b 54 59  p, 2, objv, "[TY
15720 50 45 5d 20 53 43 52 49 50 54 22 29 3b 0a 20 20  PE] SCRIPT");.  
15730 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
15740 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
15750 20 69 66 28 20 70 44 62 2d 3e 6e 54 72 61 6e 73   if( pDb->nTrans
15760 61 63 74 69 6f 6e 3d 3d 30 20 26 26 20 6f 62 6a  action==0 && obj
15770 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 73 74  c==4 ){.      st
15780 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
15790 2a 54 54 59 50 45 5f 73 74 72 73 5b 5d 20 3d 20  *TTYPE_strs[] = 
157a0 7b 0a 20 20 20 20 20 20 20 20 22 64 65 66 65 72  {.        "defer
157b0 72 65 64 22 2c 20 20 20 22 65 78 63 6c 75 73 69  red",   "exclusi
157c0 76 65 22 2c 20 20 22 69 6d 6d 65 64 69 61 74 65  ve",  "immediate
157d0 22 2c 20 30 0a 20 20 20 20 20 20 7d 3b 0a 20 20  ", 0.      };.  
157e0 20 20 20 20 65 6e 75 6d 20 54 54 59 50 45 5f 65      enum TTYPE_e
157f0 6e 75 6d 20 7b 0a 20 20 20 20 20 20 20 20 54 54  num {.        TT
15800 59 50 45 5f 44 45 46 45 52 52 45 44 2c 20 54 54  YPE_DEFERRED, TT
15810 59 50 45 5f 45 58 43 4c 55 53 49 56 45 2c 20 54  YPE_EXCLUSIVE, T
15820 54 59 50 45 5f 49 4d 4d 45 44 49 41 54 45 0a 20  TYPE_IMMEDIATE. 
15830 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 69 6e       };.      in
15840 74 20 74 74 79 70 65 3b 0a 20 20 20 20 20 20 69  t ttype;.      i
15850 66 28 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46  f( Tcl_GetIndexF
15860 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
15870 62 6a 76 5b 32 5d 2c 20 54 54 59 50 45 5f 73 74  bjv[2], TTYPE_st
15880 72 73 2c 20 22 74 72 61 6e 73 61 63 74 69 6f 6e  rs, "transaction
15890 20 74 79 70 65 22 2c 0a 20 20 20 20 20 20 20 20   type",.        
158a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158b0 20 20 20 20 20 20 30 2c 20 26 74 74 79 70 65 29        0, &ttype)
158c0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
158d0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
158e0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 77 69 74      }.      swit
158f0 63 68 28 20 28 65 6e 75 6d 20 54 54 59 50 45 5f  ch( (enum TTYPE_
15900 65 6e 75 6d 29 74 74 79 70 65 20 29 7b 0a 20 20  enum)ttype ){.  
15910 20 20 20 20 20 20 63 61 73 65 20 54 54 59 50 45        case TTYPE
15920 5f 44 45 46 45 52 52 45 44 3a 20 20 20 20 2f 2a  _DEFERRED:    /*
15930 20 6e 6f 2d 6f 70 20 2a 2f 3b 20 20 20 20 20 20   no-op */;      
15940 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
15950 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 54  ;.        case T
15960 54 59 50 45 5f 45 58 43 4c 55 53 49 56 45 3a 20  TYPE_EXCLUSIVE: 
15970 20 20 7a 42 65 67 69 6e 20 3d 20 22 42 45 47 49    zBegin = "BEGI
15980 4e 20 45 58 43 4c 55 53 49 56 45 22 3b 20 20 62  N EXCLUSIVE";  b
15990 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
159a0 73 65 20 54 54 59 50 45 5f 49 4d 4d 45 44 49 41  se TTYPE_IMMEDIA
159b0 54 45 3a 20 20 20 7a 42 65 67 69 6e 20 3d 20 22  TE:   zBegin = "
159c0 42 45 47 49 4e 20 49 4d 4d 45 44 49 41 54 45 22  BEGIN IMMEDIATE"
159d0 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;  break;.      
159e0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 63 72  }.    }.    pScr
159f0 69 70 74 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d  ipt = objv[objc-
15a00 31 5d 3b 0a 0a 20 20 20 20 2f 2a 20 52 75 6e 20  1];..    /* Run 
15a10 74 68 65 20 53 51 4c 69 74 65 20 42 45 47 49 4e  the SQLite BEGIN
15a20 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 6f 70 65 6e   command to open
15a30 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f   a transaction o
15a40 72 20 73 61 76 65 70 6f 69 6e 74 2e 20 2a 2f 0a  r savepoint. */.
15a50 20 20 20 20 70 44 62 2d 3e 64 69 73 61 62 6c 65      pDb->disable
15a60 41 75 74 68 2b 2b 3b 0a 20 20 20 20 72 63 20 3d  Auth++;.    rc =
15a70 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44   sqlite3_exec(pD
15a80 62 2d 3e 64 62 2c 20 7a 42 65 67 69 6e 2c 20 30  b->db, zBegin, 0
15a90 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 44 62  , 0, 0);.    pDb
15aa0 2d 3e 64 69 73 61 62 6c 65 41 75 74 68 2d 2d 3b  ->disableAuth--;
15ab0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
15ac0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
15ad0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
15ae0 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33  (interp, sqlite3
15af0 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29  _errmsg(pDb->db)
15b00 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , 0);.      retu
15b10 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
15b20 20 20 7d 0a 20 20 20 20 70 44 62 2d 3e 6e 54 72    }.    pDb->nTr
15b30 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 0a 20 20  ansaction++;..  
15b40 20 20 2f 2a 20 49 66 20 75 73 69 6e 67 20 4e 52    /* If using NR
15b50 45 2c 20 73 63 68 65 64 75 6c 65 20 61 20 63 61  E, schedule a ca
15b60 6c 6c 62 61 63 6b 20 74 6f 20 69 6e 76 6f 6b 65  llback to invoke
15b70 20 74 68 65 20 73 63 72 69 70 74 20 70 53 63 72   the script pScr
15b80 69 70 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ipt, then.    **
15b90 20 61 20 73 65 63 6f 6e 64 20 63 61 6c 6c 62 61   a second callba
15ba0 63 6b 20 74 6f 20 63 6f 6d 6d 69 74 20 28 6f 72  ck to commit (or
15bb0 20 72 6f 6c 6c 62 61 63 6b 29 20 74 68 65 20 74   rollback) the t
15bc0 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 73 61  ransaction or sa
15bd0 76 65 70 6f 69 6e 74 0a 20 20 20 20 2a 2a 20 6f  vepoint.    ** o
15be0 70 65 6e 65 64 20 61 62 6f 76 65 2e 20 49 66 20  pened above. If 
15bf0 6e 6f 74 20 75 73 69 6e 67 20 4e 52 45 2c 20 65  not using NRE, e
15c00 76 61 6c 75 61 74 65 20 74 68 65 20 73 63 72 69  valuate the scri
15c10 70 74 20 64 69 72 65 63 74 6c 79 2c 20 74 68 65  pt directly, the
15c20 6e 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 66 75  n.    ** call fu
15c30 6e 63 74 69 6f 6e 20 44 62 54 72 61 6e 73 50 6f  nction DbTransPo
15c40 73 74 43 6d 64 28 29 20 74 6f 20 63 6f 6d 6d 69  stCmd() to commi
15c50 74 20 28 6f 72 20 72 6f 6c 6c 62 61 63 6b 29 20  t (or rollback) 
15c60 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
15c70 0a 20 20 20 20 2a 2a 20 6f 72 20 73 61 76 65 70  .    ** or savep
15c80 6f 69 6e 74 2e 20 20 2a 2f 0a 20 20 20 20 69 66  oint.  */.    if
15c90 28 20 44 62 55 73 65 4e 72 65 28 29 20 29 7b 0a  ( DbUseNre() ){.
15ca0 20 20 20 20 20 20 54 63 6c 5f 4e 52 41 64 64 43        Tcl_NRAddC
15cb0 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20  allback(interp, 
15cc0 44 62 54 72 61 6e 73 50 6f 73 74 43 6d 64 2c 20  DbTransPostCmd, 
15cd0 63 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  cd, 0, 0, 0);.  
15ce0 20 20 20 20 28 76 6f 69 64 29 54 63 6c 5f 4e 52      (void)Tcl_NR
15cf0 45 76 61 6c 4f 62 6a 28 69 6e 74 65 72 70 2c 20  EvalObj(interp, 
15d00 70 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20 20  pScript, 0);.   
15d10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
15d20 20 3d 20 44 62 54 72 61 6e 73 50 6f 73 74 43 6d   = DbTransPostCm
15d30 64 28 26 63 64 2c 20 69 6e 74 65 72 70 2c 20 54  d(&cd, interp, T
15d40 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74  cl_EvalObjEx(int
15d50 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20 30 29  erp, pScript, 0)
15d60 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  );.    }.    bre
15d70 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
15d80 2a 2a 20 20 20 20 24 64 62 20 75 6e 6c 6f 63 6b  **    $db unlock
15d90 5f 6e 6f 74 69 66 79 20 3f 73 63 72 69 70 74 3f  _notify ?script?
15da0 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
15db0 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 3a 20 7b  UNLOCK_NOTIFY: {
15dc0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15dd0 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f  ENABLE_UNLOCK_NO
15de0 54 49 46 59 0a 20 20 20 20 54 63 6c 5f 41 70 70  TIFY.    Tcl_App
15df0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
15e00 2c 20 22 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79  , "unlock_notify
15e10 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 69   not available i
15e20 6e 20 74 68 69 73 20 62 75 69 6c 64 22 2c 20 30  n this build", 0
15e30 29 3b 0a 20 20 20 20 72 63 20 3d 20 54 43 4c 5f  );.    rc = TCL_
15e40 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 20  ERROR;.#else.   
15e50 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20   if( objc!=2 && 
15e60 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20  objc!=3 ){.     
15e70 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
15e80 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
15e90 76 2c 20 22 3f 53 43 52 49 50 54 3f 22 29 3b 0a  v, "?SCRIPT?");.
15ea0 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45        rc = TCL_E
15eb0 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  RROR;.    }else{
15ec0 0a 20 20 20 20 20 20 76 6f 69 64 20 28 2a 78 4e  .      void (*xN
15ed0 6f 74 69 66 79 29 28 76 6f 69 64 20 2a 2a 2c 20  otify)(void **, 
15ee0 69 6e 74 29 20 3d 20 30 3b 0a 20 20 20 20 20 20  int) = 0;.      
15ef0 76 6f 69 64 20 2a 70 4e 6f 74 69 66 79 41 72 67  void *pNotifyArg
15f00 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69 66 28   = 0;..      if(
15f10 20 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74   pDb->pUnlockNot
15f20 69 66 79 20 29 7b 0a 20 20 20 20 20 20 20 20 54  ify ){.        T
15f30 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
15f40 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69  pDb->pUnlockNoti
15f50 66 79 29 3b 0a 20 20 20 20 20 20 20 20 70 44 62  fy);.        pDb
15f60 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 20  ->pUnlockNotify 
15f70 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a  = 0;.      }.  .
15f80 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d        if( objc==
15f90 33 20 29 7b 0a 20 20 20 20 20 20 20 20 78 4e 6f  3 ){.        xNo
15fa0 74 69 66 79 20 3d 20 44 62 55 6e 6c 6f 63 6b 4e  tify = DbUnlockN
15fb0 6f 74 69 66 79 3b 0a 20 20 20 20 20 20 20 20 70  otify;.        p
15fc0 4e 6f 74 69 66 79 41 72 67 20 3d 20 28 76 6f 69  NotifyArg = (voi
15fd0 64 20 2a 29 70 44 62 3b 0a 20 20 20 20 20 20 20  d *)pDb;.       
15fe0 20 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74   pDb->pUnlockNot
15ff0 69 66 79 20 3d 20 6f 62 6a 76 5b 32 5d 3b 0a 20  ify = objv[2];. 
16000 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52         Tcl_IncrR
16010 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 55 6e  efCount(pDb->pUn
16020 6c 6f 63 6b 4e 6f 74 69 66 79 29 3b 0a 20 20 20  lockNotify);.   
16030 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 69 66     }.  .      if
16040 28 20 73 71 6c 69 74 65 33 5f 75 6e 6c 6f 63 6b  ( sqlite3_unlock
16050 5f 6e 6f 74 69 66 79 28 70 44 62 2d 3e 64 62 2c  _notify(pDb->db,
16060 20 78 4e 6f 74 69 66 79 2c 20 70 4e 6f 74 69 66   xNotify, pNotif
16070 79 41 72 67 29 20 29 7b 0a 20 20 20 20 20 20 20  yArg) ){.       
16080 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
16090 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65  t(interp, sqlite
160a0 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
160b0 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72  ), 0);.        r
160c0 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  c = TCL_ERROR;. 
160d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
160e0 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  dif.    break;. 
160f0 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
16100 20 24 64 62 20 70 72 65 75 70 64 61 74 65 5f 68   $db preupdate_h
16110 6f 6f 6b 20 63 6f 75 6e 74 0a 20 20 2a 2a 20 20  ook count.  **  
16120 20 20 24 64 62 20 70 72 65 75 70 64 61 74 65 5f    $db preupdate_
16130 68 6f 6f 6b 20 68 6f 6f 6b 20 3f 53 43 52 49 50  hook hook ?SCRIP
16140 54 3f 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 70  T?.  **    $db p
16150 72 65 75 70 64 61 74 65 5f 68 6f 6f 6b 20 6e 65  reupdate_hook ne
16160 77 20 49 4e 44 45 58 0a 20 20 2a 2a 20 20 20 20  w INDEX.  **    
16170 24 64 62 20 70 72 65 75 70 64 61 74 65 5f 68 6f  $db preupdate_ho
16180 6f 6b 20 6f 6c 64 20 49 4e 44 45 58 0a 20 20 2a  ok old INDEX.  *
16190 2f 0a 20 20 63 61 73 65 20 44 42 5f 50 52 45 55  /.  case DB_PREU
161a0 50 44 41 54 45 3a 20 7b 0a 23 69 66 6e 64 65 66  PDATE: {.#ifndef
161b0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50   SQLITE_ENABLE_P
161c0 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 20 20  REUPDATE_HOOK.  
161d0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
161e0 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72 65 75  lt(interp, "preu
161f0 70 64 61 74 65 5f 68 6f 6f 6b 20 77 61 73 20 6f  pdate_hook was o
16200 6d 69 74 74 65 64 20 61 74 20 63 6f 6d 70 69 6c  mitted at compil
16210 65 2d 74 69 6d 65 22 29 3b 0a 20 20 20 20 72 63  e-time");.    rc
16220 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65   = TCL_ERROR;.#e
16230 6c 73 65 0a 20 20 20 20 73 74 61 74 69 63 20 63  lse.    static c
16240 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 53 75 62  onst char *azSub
16250 5b 5d 20 3d 20 7b 22 63 6f 75 6e 74 22 2c 20 22  [] = {"count", "
16260 64 65 70 74 68 22 2c 20 22 68 6f 6f 6b 22 2c 20  depth", "hook", 
16270 22 6e 65 77 22 2c 20 22 6f 6c 64 22 2c 20 30 7d  "new", "old", 0}
16280 3b 0a 20 20 20 20 65 6e 75 6d 20 44 62 50 72 65  ;.    enum DbPre
16290 75 70 64 61 74 65 53 75 62 43 6d 64 20 7b 0a 20  updateSubCmd {. 
162a0 20 20 20 20 20 50 52 45 5f 43 4f 55 4e 54 2c 20       PRE_COUNT, 
162b0 50 52 45 5f 44 45 50 54 48 2c 20 50 52 45 5f 48  PRE_DEPTH, PRE_H
162c0 4f 4f 4b 2c 20 50 52 45 5f 4e 45 57 2c 20 50 52  OOK, PRE_NEW, PR
162d0 45 5f 4f 4c 44 0a 20 20 20 20 7d 3b 0a 20 20 20  E_OLD.    };.   
162e0 20 69 6e 74 20 69 53 75 62 3b 0a 0a 20 20 20 20   int iSub;..    
162f0 69 66 28 20 6f 62 6a 63 3c 33 20 29 7b 0a 20 20  if( objc<3 ){.  
16300 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
16310 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
16320 6f 62 6a 76 2c 20 22 53 55 42 2d 43 4f 4d 4d 41  objv, "SUB-COMMA
16330 4e 44 20 3f 41 52 47 53 3f 22 29 3b 0a 20 20 20  ND ?ARGS?");.   
16340 20 7d 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47   }.    if( Tcl_G
16350 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69  etIndexFromObj(i
16360 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
16370 61 7a 53 75 62 2c 20 22 73 75 62 2d 63 6f 6d 6d  azSub, "sub-comm
16380 61 6e 64 22 2c 20 30 2c 20 26 69 53 75 62 29 20  and", 0, &iSub) 
16390 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
163a0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
163b0 0a 0a 20 20 20 20 73 77 69 74 63 68 28 20 28 65  ..    switch( (e
163c0 6e 75 6d 20 44 62 50 72 65 75 70 64 61 74 65 53  num DbPreupdateS
163d0 75 62 43 6d 64 29 69 53 75 62 20 29 7b 0a 20 20  ubCmd)iSub ){.  
163e0 20 20 20 20 63 61 73 65 20 50 52 45 5f 43 4f 55      case PRE_COU
163f0 4e 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 6e  NT: {.        in
16400 74 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33  t nCol = sqlite3
16410 5f 70 72 65 75 70 64 61 74 65 5f 63 6f 75 6e 74  _preupdate_count
16420 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20 20  (pDb->db);.     
16430 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
16440 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
16450 4e 65 77 49 6e 74 4f 62 6a 28 6e 43 6f 6c 29 29  NewIntObj(nCol))
16460 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
16470 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
16480 63 61 73 65 20 50 52 45 5f 48 4f 4f 4b 3a 20 7b  case PRE_HOOK: {
16490 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f 62 6a  .        if( obj
164a0 63 3e 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  c>4 ){.         
164b0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
164c0 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
164d0 76 2c 20 22 68 6f 6f 6b 20 3f 53 43 52 49 50 54  v, "hook ?SCRIPT
164e0 3f 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  ?");.          r
164f0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
16500 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16510 20 20 20 44 62 48 6f 6f 6b 43 6d 64 28 69 6e 74     DbHookCmd(int
16520 65 72 70 2c 20 70 44 62 2c 20 28 6f 62 6a 63 3d  erp, pDb, (objc=
16530 3d 34 20 3f 20 6f 62 6a 76 5b 33 5d 20 3a 20 30  =4 ? objv[3] : 0
16540 29 2c 20 26 70 44 62 2d 3e 70 50 72 65 55 70 64  ), &pDb->pPreUpd
16550 61 74 65 48 6f 6f 6b 29 3b 0a 20 20 20 20 20 20  ateHook);.      
16560 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
16570 0a 0a 20 20 20 20 20 20 63 61 73 65 20 50 52 45  ..      case PRE
16580 5f 44 45 50 54 48 3a 20 7b 0a 20 20 20 20 20 20  _DEPTH: {.      
16590 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b    Tcl_Obj *pRet;
165a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f 62 6a  .        if( obj
165b0 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20  c!=3 ){.        
165c0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
165d0 67 73 28 69 6e 74 65 72 70 2c 20 33 2c 20 6f 62  gs(interp, 3, ob
165e0 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 20  jv, "");.       
165f0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
16600 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ROR;.        }. 
16610 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 54 63         pRet = Tc
16620 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69  l_NewIntObj(sqli
16630 74 65 33 5f 70 72 65 75 70 64 61 74 65 5f 64 65  te3_preupdate_de
16640 70 74 68 28 70 44 62 2d 3e 64 62 29 29 3b 0a 20  pth(pDb->db));. 
16650 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62         Tcl_SetOb
16660 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
16670 70 52 65 74 29 3b 0a 20 20 20 20 20 20 20 20 62  pRet);.        b
16680 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
16690 20 20 20 20 20 63 61 73 65 20 50 52 45 5f 4e 45       case PRE_NE
166a0 57 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 52  W:.      case PR
166b0 45 5f 4f 4c 44 3a 20 7b 0a 20 20 20 20 20 20 20  E_OLD: {.       
166c0 20 69 6e 74 20 69 49 64 78 3b 0a 20 20 20 20 20   int iIdx;.     
166d0 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65     sqlite3_value
166e0 20 2a 70 56 61 6c 75 65 3b 0a 20 20 20 20 20 20   *pValue;.      
166f0 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b    if( objc!=4 ){
16700 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 57  .          Tcl_W
16710 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
16720 72 70 2c 20 33 2c 20 6f 62 6a 76 2c 20 22 49 4e  rp, 3, objv, "IN
16730 44 45 58 22 29 3b 0a 20 20 20 20 20 20 20 20 20  DEX");.         
16740 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
16750 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  R;.        }.   
16760 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74       if( Tcl_Get
16770 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
16780 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 69 49 64  p, objv[3], &iId
16790 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  x) ){.          
167a0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
167b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
167c0 20 20 20 20 20 69 66 28 20 69 53 75 62 3d 3d 50       if( iSub==P
167d0 52 45 5f 4f 4c 44 20 29 7b 0a 20 20 20 20 20 20  RE_OLD ){.      
167e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
167f0 5f 70 72 65 75 70 64 61 74 65 5f 6f 6c 64 28 70  _preupdate_old(p
16800 44 62 2d 3e 64 62 2c 20 69 49 64 78 2c 20 26 70  Db->db, iIdx, &p
16810 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20  Value);.        
16820 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
16830 20 61 73 73 65 72 74 28 20 69 53 75 62 3d 3d 50   assert( iSub==P
16840 52 45 5f 4e 45 57 20 29 3b 0a 20 20 20 20 20 20  RE_NEW );.      
16850 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
16860 5f 70 72 65 75 70 64 61 74 65 5f 6e 65 77 28 70  _preupdate_new(p
16870 44 62 2d 3e 64 62 2c 20 69 49 64 78 2c 20 26 70  Db->db, iIdx, &p
16880 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20  Value);.        
16890 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  }..        if( r
168a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
168b0 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62            Tcl_Ob
168c0 6a 20 2a 70 4f 62 6a 3b 0a 20 20 20 20 20 20 20  j *pObj;.       
168d0 20 20 20 70 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65     pObj = Tcl_Ne
168e0 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72  wStringObj((char
168f0 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
16900 74 65 78 74 28 70 56 61 6c 75 65 29 2c 20 2d 31  text(pValue), -1
16910 29 3b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  );.          Tcl
16920 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
16930 74 65 72 70 2c 20 70 4f 62 6a 29 3b 0a 20 20 20  terp, pObj);.   
16940 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
16950 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
16960 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73  Result(interp, s
16970 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44  qlite3_errmsg(pD
16980 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20 20  b->db), 0);.    
16990 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
169a0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
169b0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
169c0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
169d0 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54  _ENABLE_PREUPDAT
169e0 45 5f 48 4f 4f 4b 20 2a 2f 0a 20 20 20 20 62 72  E_HOOK */.    br
169f0 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
16a00 20 2a 2a 20 20 20 20 24 64 62 20 77 61 6c 5f 68   **    $db wal_h
16a10 6f 6f 6b 20 3f 73 63 72 69 70 74 3f 0a 20 20 2a  ook ?script?.  *
16a20 2a 20 20 20 20 24 64 62 20 75 70 64 61 74 65 5f  *    $db update_
16a30 68 6f 6f 6b 20 3f 73 63 72 69 70 74 3f 0a 20 20  hook ?script?.  
16a40 2a 2a 20 20 20 20 24 64 62 20 72 6f 6c 6c 62 61  **    $db rollba
16a50 63 6b 5f 68 6f 6f 6b 20 3f 73 63 72 69 70 74 3f  ck_hook ?script?
16a60 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
16a70 57 41 4c 5f 48 4f 4f 4b 3a 20 0a 20 20 63 61 73  WAL_HOOK: .  cas
16a80 65 20 44 42 5f 55 50 44 41 54 45 5f 48 4f 4f 4b  e DB_UPDATE_HOOK
16a90 3a 20 0a 20 20 63 61 73 65 20 44 42 5f 52 4f 4c  : .  case DB_ROL
16aa0 4c 42 41 43 4b 5f 48 4f 4f 4b 3a 20 7b 0a 20 20  LBACK_HOOK: {.  
16ab0 20 20 2f 2a 20 73 65 74 20 70 70 48 6f 6f 6b 20    /* set ppHook 
16ac0 74 6f 20 70 6f 69 6e 74 20 61 74 20 70 55 70 64  to point at pUpd
16ad0 61 74 65 48 6f 6f 6b 20 6f 72 20 70 52 6f 6c 6c  ateHook or pRoll
16ae0 62 61 63 6b 48 6f 6f 6b 2c 20 64 65 70 65 6e 64  backHook, depend
16af0 69 6e 67 20 6f 6e 20 0a 20 20 20 20 2a 2a 20 77  ing on .    ** w
16b00 68 65 74 68 65 72 20 5b 24 64 62 20 75 70 64 61  hether [$db upda
16b10 74 65 5f 68 6f 6f 6b 5d 20 6f 72 20 5b 24 64 62  te_hook] or [$db
16b20 20 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 5d 20   rollback_hook] 
16b30 77 61 73 20 69 6e 76 6f 6b 65 64 2e 0a 20 20 20  was invoked..   
16b40 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20   */.    Tcl_Obj 
16b50 2a 2a 70 70 48 6f 6f 6b 3b 20 0a 20 20 20 20 69  **ppHook; .    i
16b60 66 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f 57 41  f( choice==DB_WA
16b70 4c 5f 48 4f 4f 4b 20 29 20 70 70 48 6f 6f 6b 20  L_HOOK ) ppHook 
16b80 3d 20 26 70 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b  = &pDb->pWalHook
16b90 3b 0a 20 20 20 20 69 66 28 20 63 68 6f 69 63 65  ;.    if( choice
16ba0 3d 3d 44 42 5f 55 50 44 41 54 45 5f 48 4f 4f 4b  ==DB_UPDATE_HOOK
16bb0 20 29 20 70 70 48 6f 6f 6b 20 3d 20 26 70 44 62   ) ppHook = &pDb
16bc0 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 3b 0a 20  ->pUpdateHook;. 
16bd0 20 20 20 69 66 28 20 63 68 6f 69 63 65 3d 3d 44     if( choice==D
16be0 42 5f 52 4f 4c 4c 42 41 43 4b 5f 48 4f 4f 4b 20  B_ROLLBACK_HOOK 
16bf0 29 20 70 70 48 6f 6f 6b 20 3d 20 26 70 44 62 2d  ) ppHook = &pDb-
16c00 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3b 0a  >pRollbackHook;.
16c10 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29      if( objc>3 )
16c20 7b 0a 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  {.       Tcl_Wro
16c30 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
16c40 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 53 43 52  , 2, objv, "?SCR
16c50 49 50 54 3f 22 29 3b 0a 20 20 20 20 20 20 20 72  IPT?");.       r
16c60 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
16c70 0a 20 20 20 20 7d 0a 0a 20 20 20 20 44 62 48 6f  .    }..    DbHo
16c80 6f 6b 43 6d 64 28 69 6e 74 65 72 70 2c 20 70 44  okCmd(interp, pD
16c90 62 2c 20 28 6f 62 6a 63 3d 3d 33 20 3f 20 6f 62  b, (objc==3 ? ob
16ca0 6a 76 5b 32 5d 20 3a 20 30 29 2c 20 70 70 48 6f  jv[2] : 0), ppHo
16cb0 6f 6b 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  ok);.    break;.
16cc0 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62    }..  /*    $db
16cd0 20 76 65 72 73 69 6f 6e 0a 20 20 2a 2a 0a 20 20   version.  **.  
16ce0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 65  ** Return the ve
16cf0 72 73 69 6f 6e 20 73 74 72 69 6e 67 20 66 6f 72  rsion string for
16d00 20 74 68 69 73 20 64 61 74 61 62 61 73 65 2e 0a   this database..
16d10 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 56    */.  case DB_V
16d20 45 52 53 49 4f 4e 3a 20 7b 0a 20 20 20 20 54 63  ERSION: {.    Tc
16d30 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
16d40 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69  rp, (char *)sqli
16d50 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28 29  te3_libversion()
16d60 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
16d70 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 0a     break;.  }...
16d80 20 20 7d 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68    } /* End of th
16d90 65 20 53 57 49 54 43 48 20 73 74 61 74 65 6d 65  e SWITCH stateme
16da0 6e 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72  nt */.  return r
16db0 63 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  c;.}..#if SQLITE
16dc0 5f 54 43 4c 5f 4e 52 45 0a 2f 2a 0a 2a 2a 20 41  _TCL_NRE./*.** A
16dd0 64 61 70 74 6f 72 20 74 68 61 74 20 70 72 6f 76  daptor that prov
16de0 69 64 65 73 20 61 6e 20 6f 62 6a 43 6d 64 20 69  ides an objCmd i
16df0 6e 74 65 72 66 61 63 65 20 74 6f 20 74 68 65 20  nterface to the 
16e00 4e 52 45 2d 65 6e 61 62 6c 65 64 0a 2a 2a 20 69  NRE-enabled.** i
16e10 6e 74 65 72 66 61 63 65 20 69 6d 70 6c 65 6d 65  nterface impleme
16e20 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ntation..*/.stat
16e30 69 63 20 69 6e 74 20 44 62 4f 62 6a 43 6d 64 41  ic int DbObjCmdA
16e40 64 61 70 74 6f 72 28 0a 20 20 76 6f 69 64 20 2a  daptor(.  void *
16e50 63 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  cd,.  Tcl_Interp
16e60 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
16e70 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
16e80 2a 63 6f 6e 73 74 2a 6f 62 6a 76 0a 29 7b 0a 20  *const*objv.){. 
16e90 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 52 43 61   return Tcl_NRCa
16ea0 6c 6c 4f 62 6a 50 72 6f 63 28 69 6e 74 65 72 70  llObjProc(interp
16eb0 2c 20 44 62 4f 62 6a 43 6d 64 2c 20 63 64 2c 20  , DbObjCmd, cd, 
16ec0 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a 7d 0a 23  objc, objv);.}.#
16ed0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
16ee0 54 43 4c 5f 4e 52 45 20 2a 2f 0a 0a 2f 2a 0a 2a  TCL_NRE */../*.*
16ef0 2a 20 20 20 73 71 6c 69 74 65 33 20 44 42 4e 41  *   sqlite3 DBNA
16f00 4d 45 20 46 49 4c 45 4e 41 4d 45 20 3f 2d 76 66  ME FILENAME ?-vf
16f10 73 20 56 46 53 4e 41 4d 45 3f 20 3f 2d 6b 65 79  s VFSNAME? ?-key
16f20 20 4b 45 59 3f 20 3f 2d 72 65 61 64 6f 6e 6c 79   KEY? ?-readonly
16f30 20 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a 20 20 20 20   BOOLEAN?.**    
16f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f50 20 20 20 20 20 20 20 3f 2d 63 72 65 61 74 65 20         ?-create 
16f60 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 6e 6f 6d 75 74  BOOLEAN? ?-nomut
16f70 65 78 20 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a 0a 2a  ex BOOLEAN?.**.*
16f80 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 6d 61  * This is the ma
16f90 69 6e 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 2e 20  in Tcl command. 
16fa0 20 57 68 65 6e 20 74 68 65 20 22 73 71 6c 69 74   When the "sqlit
16fb0 65 22 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 69  e" Tcl command i
16fc0 73 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2c 20 74 68  s.** invoked, th
16fd0 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20  is routine runs 
16fe0 74 6f 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  to process that 
16ff0 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54  command..**.** T
17000 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
17010 74 2c 20 44 42 4e 41 4d 45 2c 20 69 73 20 61 6e  t, DBNAME, is an
17020 20 61 72 62 69 74 72 61 72 79 20 6e 61 6d 65 20   arbitrary name 
17030 66 6f 72 20 61 20 6e 65 77 0a 2a 2a 20 64 61 74  for a new.** dat
17040 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
17050 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20  .  This command 
17060 63 72 65 61 74 65 73 20 61 20 6e 65 77 20 63 6f  creates a new co
17070 6d 6d 61 6e 64 20 6e 61 6d 65 64 0a 2a 2a 20 44  mmand named.** D
17080 42 4e 41 4d 45 20 74 68 61 74 20 69 73 20 75 73  BNAME that is us
17090 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68  ed to control th
170a0 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20  at connection.  
170b0 54 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  The database.** 
170c0 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 64 65  connection is de
170d0 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 44  leted when the D
170e0 42 4e 41 4d 45 20 63 6f 6d 6d 61 6e 64 20 69 73  BNAME command is
170f0 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   deleted..**.** 
17100 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
17110 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ent is the name 
17120 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
17130 66 69 6c 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74  file..**.*/.stat
17140 69 63 20 69 6e 74 20 44 62 4d 61 69 6e 28 76 6f  ic int DbMain(vo
17150 69 64 20 2a 63 64 2c 20 54 63 6c 5f 49 6e 74 65  id *cd, Tcl_Inte
17160 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
17170 6f 62 6a 63 2c 54 63 6c 5f 4f 62 6a 20 2a 63 6f  objc,Tcl_Obj *co
17180 6e 73 74 2a 6f 62 6a 76 29 7b 0a 20 20 53 71 6c  nst*objv){.  Sql
17190 69 74 65 44 62 20 2a 70 3b 0a 20 20 63 6f 6e 73  iteDb *p;.  cons
171a0 74 20 63 68 61 72 20 2a 7a 41 72 67 3b 0a 20 20  t char *zArg;.  
171b0 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 3b 0a 20  char *zErrMsg;. 
171c0 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20   int i;.  const 
171d0 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 63  char *zFile;.  c
171e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20  onst char *zVfs 
171f0 3d 20 30 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73  = 0;.  int flags
17200 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20  ;.  Tcl_DString 
17210 74 72 61 6e 73 6c 61 74 65 64 46 69 6c 65 6e 61  translatedFilena
17220 6d 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  me;.#ifdef SQLIT
17230 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f  E_HAS_CODEC.  vo
17240 69 64 20 2a 70 4b 65 79 20 3d 20 30 3b 0a 20 20  id *pKey = 0;.  
17250 69 6e 74 20 6e 4b 65 79 20 3d 20 30 3b 0a 23 65  int nKey = 0;.#e
17260 6e 64 69 66 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ndif.  int rc;..
17270 20 20 2f 2a 20 49 6e 20 6e 6f 72 6d 61 6c 20 75    /* In normal u
17280 73 65 2c 20 65 61 63 68 20 54 43 4c 20 69 6e 74  se, each TCL int
17290 65 72 70 72 65 74 65 72 20 72 75 6e 73 20 69 6e  erpreter runs in
172a0 20 61 20 73 69 6e 67 6c 65 20 74 68 72 65 61 64   a single thread
172b0 2e 20 20 53 6f 0a 20 20 2a 2a 20 62 79 20 64 65  .  So.  ** by de
172c0 66 61 75 6c 74 2c 20 77 65 20 63 61 6e 20 74 75  fault, we can tu
172d0 72 6e 20 6f 66 20 6d 75 74 65 78 69 6e 67 20 6f  rn of mutexing o
172e0 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  n SQLite databas
172f0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20  e connections.. 
17300 20 2a 2a 20 48 6f 77 65 76 65 72 2c 20 66 6f 72   ** However, for
17310 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65   testing purpose
17320 73 20 69 74 20 69 73 20 75 73 65 66 75 6c 20 74  s it is useful t
17330 6f 20 68 61 76 65 20 6d 75 74 65 78 65 73 20 74  o have mutexes t
17340 75 72 6e 65 64 0a 20 20 2a 2a 20 6f 6e 2e 20 20  urned.  ** on.  
17350 53 6f 2c 20 62 79 20 64 65 66 61 75 6c 74 2c 20  So, by default, 
17360 6d 75 74 65 78 65 73 20 64 65 66 61 75 6c 74 20  mutexes default 
17370 6f 66 66 2e 20 20 42 75 74 20 69 66 20 63 6f 6d  off.  But if com
17380 70 69 6c 65 64 20 77 69 74 68 0a 20 20 2a 2a 20  piled with.  ** 
17390 53 51 4c 49 54 45 5f 54 43 4c 5f 44 45 46 41 55  SQLITE_TCL_DEFAU
173a0 4c 54 5f 46 55 4c 4c 4d 55 54 45 58 20 74 68 65  LT_FULLMUTEX the
173b0 6e 20 6d 75 74 65 78 65 73 20 64 65 66 61 75 6c  n mutexes defaul
173c0 74 20 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65  t on..  */.#ifde
173d0 66 20 53 51 4c 49 54 45 5f 54 43 4c 5f 44 45 46  f SQLITE_TCL_DEF
173e0 41 55 4c 54 5f 46 55 4c 4c 4d 55 54 45 58 0a 20  AULT_FULLMUTEX. 
173f0 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f   flags = SQLITE_
17400 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
17410 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
17420 41 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ATE | SQLITE_OPE
17430 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a 23 65 6c  N_FULLMUTEX;.#el
17440 73 65 0a 20 20 66 6c 61 67 73 20 3d 20 53 51 4c  se.  flags = SQL
17450 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
17460 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
17470 5f 43 52 45 41 54 45 20 7c 20 53 51 4c 49 54 45  _CREATE | SQLITE
17480 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 23  _OPEN_NOMUTEX;.#
17490 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6f 62 6a  endif..  if( obj
174a0 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a 41 72 67  c==2 ){.    zArg
174b0 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
174c0 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c  FromObj(objv[1],
174d0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72   0);.    if( str
174e0 63 6d 70 28 7a 41 72 67 2c 22 2d 76 65 72 73 69  cmp(zArg,"-versi
174f0 6f 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  on")==0 ){.     
17500 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
17510 74 28 69 6e 74 65 72 70 2c 73 71 6c 69 74 65 33  t(interp,sqlite3
17520 5f 76 65 72 73 69 6f 6e 2c 30 29 3b 0a 20 20 20  _version,0);.   
17530 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
17540 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
17550 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 68 61  strcmp(zArg,"-ha
17560 73 2d 63 6f 64 65 63 22 29 3d 3d 30 20 29 7b 0a  s-codec")==0 ){.
17570 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
17580 53 5f 43 4f 44 45 43 0a 20 20 20 20 20 20 54 63  S_CODEC.      Tc
17590 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
175a0 6e 74 65 72 70 2c 22 31 22 2c 30 29 3b 0a 23 65  nterp,"1",0);.#e
175b0 6c 73 65 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  lse.      Tcl_Ap
175c0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
175d0 70 2c 22 30 22 2c 30 29 3b 0a 23 65 6e 64 69 66  p,"0",0);.#endif
175e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
175f0 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  L_OK;.    }.  }.
17600 20 20 66 6f 72 28 69 3d 33 3b 20 69 2b 31 3c 6f    for(i=3; i+1<o
17610 62 6a 63 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20  bjc; i+=2){.    
17620 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74  zArg = Tcl_GetSt
17630 72 69 6e 67 28 6f 62 6a 76 5b 69 5d 29 3b 0a 20  ring(objv[i]);. 
17640 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41     if( strcmp(zA
17650 72 67 2c 22 2d 6b 65 79 22 29 3d 3d 30 20 29 7b  rg,"-key")==0 ){
17660 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
17670 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 20 20 70  AS_CODEC.      p
17680 4b 65 79 20 3d 20 54 63 6c 5f 47 65 74 42 79 74  Key = Tcl_GetByt
17690 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62  eArrayFromObj(ob
176a0 6a 76 5b 69 2b 31 5d 2c 20 26 6e 4b 65 79 29 3b  jv[i+1], &nKey);
176b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
176c0 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72  e if( strcmp(zAr
176d0 67 2c 20 22 2d 76 66 73 22 29 3d 3d 30 20 29 7b  g, "-vfs")==0 ){
176e0 0a 20 20 20 20 20 20 7a 56 66 73 20 3d 20 54 63  .      zVfs = Tc
176f0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
17700 5b 69 2b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  [i+1]);.    }els
17710 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72  e if( strcmp(zAr
17720 67 2c 20 22 2d 72 65 61 64 6f 6e 6c 79 22 29 3d  g, "-readonly")=
17730 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
17740 62 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c  b;.      if( Tcl
17750 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
17760 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
17770 69 2b 31 5d 2c 20 26 62 29 20 29 20 72 65 74 75  i+1], &b) ) retu
17780 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
17790 20 20 20 20 69 66 28 20 62 20 29 7b 0a 20 20 20      if( b ){.   
177a0 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 28       flags &= ~(
177b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
177c0 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
177d0 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 20 20 20  N_CREATE);.     
177e0 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49     flags |= SQLI
177f0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
17800 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
17810 20 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20         flags &= 
17820 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  ~SQLITE_OPEN_REA
17830 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 66  DONLY;.        f
17840 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
17850 50 45 4e 5f 52 45 41 44 57 52 49 54 45 3b 0a 20  PEN_READWRITE;. 
17860 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
17870 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67   if( strcmp(zArg
17880 2c 20 22 2d 63 72 65 61 74 65 22 29 3d 3d 30 20  , "-create")==0 
17890 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 3b 0a  ){.      int b;.
178a0 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65        if( Tcl_Ge
178b0 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
178c0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 2b 31  interp, objv[i+1
178d0 5d 2c 20 26 62 29 20 29 20 72 65 74 75 72 6e 20  ], &b) ) return 
178e0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
178f0 20 69 66 28 20 62 20 26 26 20 28 66 6c 61 67 73   if( b && (flags
17900 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   & SQLITE_OPEN_R
17910 45 41 44 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20  EADONLY)==0 ){. 
17920 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20         flags |= 
17930 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
17940 54 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  TE;.      }else{
17950 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 26  .        flags &
17960 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  = ~SQLITE_OPEN_C
17970 52 45 41 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20  REATE;.      }. 
17980 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
17990 63 6d 70 28 7a 41 72 67 2c 20 22 2d 6e 6f 6d 75  cmp(zArg, "-nomu
179a0 74 65 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  tex")==0 ){.    
179b0 20 20 69 6e 74 20 62 3b 0a 20 20 20 20 20 20 69    int b;.      i
179c0 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61  f( Tcl_GetBoolea
179d0 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  nFromObj(interp,
179e0 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 62 29 20   objv[i+1], &b) 
179f0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
17a00 4f 52 3b 0a 20 20 20 20 20 20 69 66 28 20 62 20  OR;.      if( b 
17a10 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  ){.        flags
17a20 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   |= SQLITE_OPEN_
17a30 4e 4f 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 20  NOMUTEX;.       
17a40 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54   flags &= ~SQLIT
17a50 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58  E_OPEN_FULLMUTEX
17a60 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
17a70 20 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20         flags &= 
17a80 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d  ~SQLITE_OPEN_NOM
17a90 55 54 45 58 3b 0a 20 20 20 20 20 20 7d 0a 20 20  UTEX;.      }.  
17aa0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
17ab0 6d 70 28 7a 41 72 67 2c 20 22 2d 66 75 6c 6c 6d  mp(zArg, "-fullm
17ac0 75 74 65 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20  utex")==0 ){.   
17ad0 20 20 20 69 6e 74 20 62 3b 0a 20 20 20 20 20 20     int b;.      
17ae0 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  if( Tcl_GetBoole
17af0 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
17b00 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 62 29  , objv[i+1], &b)
17b10 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
17b20 52 4f 52 3b 0a 20 20 20 20 20 20 69 66 28 20 62  ROR;.      if( b
17b30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67   ){.        flag
17b40 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s |= SQLITE_OPEN
17b50 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a 20 20 20 20  _FULLMUTEX;.    
17b60 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51      flags &= ~SQ
17b70 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45  LITE_OPEN_NOMUTE
17b80 58 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  X;.      }else{.
17b90 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d          flags &=
17ba0 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55   ~SQLITE_OPEN_FU
17bb0 4c 4c 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 7d  LLMUTEX;.      }
17bc0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
17bd0 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d 75 72  trcmp(zArg, "-ur
17be0 69 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  i")==0 ){.      
17bf0 69 6e 74 20 62 3b 0a 20 20 20 20 20 20 69 66 28  int b;.      if(
17c00 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46   Tcl_GetBooleanF
17c10 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
17c20 62 6a 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20  bjv[i+1], &b) ) 
17c30 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
17c40 3b 0a 20 20 20 20 20 20 69 66 28 20 62 20 29 7b  ;.      if( b ){
17c50 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c  .        flags |
17c60 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52  = SQLITE_OPEN_UR
17c70 49 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  I;.      }else{.
17c80 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d          flags &=
17c90 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52   ~SQLITE_OPEN_UR
17ca0 49 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  I;.      }.    }
17cb0 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f  else{.      Tcl_
17cc0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
17cd0 65 72 70 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70  erp, "unknown op
17ce0 74 69 6f 6e 3a 20 22 2c 20 7a 41 72 67 2c 20 28  tion: ", zArg, (
17cf0 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
17d00 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
17d10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
17d20 28 20 6f 62 6a 63 3c 33 20 7c 7c 20 28 6f 62 6a  ( objc<3 || (obj
17d30 63 26 31 29 21 3d 31 20 29 7b 0a 20 20 20 20 54  c&1)!=1 ){.    T
17d40 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
17d50 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
17d60 20 0a 20 20 20 20 20 20 22 48 41 4e 44 4c 45 20   .      "HANDLE 
17d70 46 49 4c 45 4e 41 4d 45 20 3f 2d 76 66 73 20 56  FILENAME ?-vfs V
17d80 46 53 4e 41 4d 45 3f 20 3f 2d 72 65 61 64 6f 6e  FSNAME? ?-readon
17d90 6c 79 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 63 72  ly BOOLEAN? ?-cr
17da0 65 61 74 65 20 42 4f 4f 4c 45 41 4e 3f 22 0a 20  eate BOOLEAN?". 
17db0 20 20 20 20 20 22 20 3f 2d 6e 6f 6d 75 74 65 78       " ?-nomutex
17dc0 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 66 75 6c 6c   BOOLEAN? ?-full
17dd0 6d 75 74 65 78 20 42 4f 4f 4c 45 41 4e 3f 20 3f  mutex BOOLEAN? ?
17de0 2d 75 72 69 20 42 4f 4f 4c 45 41 4e 3f 22 0a 23  -uri BOOLEAN?".#
17df0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
17e00 5f 43 4f 44 45 43 0a 20 20 20 20 20 20 22 20 3f  _CODEC.      " ?
17e10 2d 6b 65 79 20 43 4f 44 45 43 4b 45 59 3f 22 0a  -key CODECKEY?".
17e20 23 65 6e 64 69 66 0a 20 20 20 20 29 3b 0a 20 20  #endif.    );.  
17e30 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
17e40 4f 52 3b 0a 20 20 7d 0a 20 20 7a 45 72 72 4d 73  OR;.  }.  zErrMs
17e50 67 20 3d 20 30 3b 0a 20 20 70 20 3d 20 28 53 71  g = 0;.  p = (Sq
17e60 6c 69 74 65 44 62 2a 29 54 63 6c 5f 41 6c 6c 6f  liteDb*)Tcl_Allo
17e70 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b  c( sizeof(*p) );
17e80 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20  .  if( p==0 ){. 
17e90 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
17ea0 28 69 6e 74 65 72 70 2c 20 22 6d 61 6c 6c 6f 63  (interp, "malloc
17eb0 20 66 61 69 6c 65 64 22 2c 20 54 43 4c 5f 53 54   failed", TCL_ST
17ec0 41 54 49 43 29 3b 0a 20 20 20 20 72 65 74 75 72  ATIC);.    retur
17ed0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
17ee0 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20  .  memset(p, 0, 
17ef0 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 7a  sizeof(*p));.  z
17f00 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  File = Tcl_GetSt
17f10 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
17f20 5b 32 5d 2c 20 30 29 3b 0a 20 20 7a 46 69 6c 65  [2], 0);.  zFile
17f30 20 3d 20 54 63 6c 5f 54 72 61 6e 73 6c 61 74 65   = Tcl_Translate
17f40 46 69 6c 65 4e 61 6d 65 28 69 6e 74 65 72 70 2c  FileName(interp,
17f50 20 7a 46 69 6c 65 2c 20 26 74 72 61 6e 73 6c 61   zFile, &transla
17f60 74 65 64 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  tedFilename);.  
17f70 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65  rc = sqlite3_ope
17f80 6e 5f 76 32 28 7a 46 69 6c 65 2c 20 26 70 2d 3e  n_v2(zFile, &p->
17f90 64 62 2c 20 66 6c 61 67 73 2c 20 7a 56 66 73 29  db, flags, zVfs)
17fa0 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46  ;.  Tcl_DStringF
17fb0 72 65 65 28 26 74 72 61 6e 73 6c 61 74 65 64 46  ree(&translatedF
17fc0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ilename);.  if( 
17fd0 70 2d 3e 64 62 20 29 7b 0a 20 20 20 20 69 66 28  p->db ){.    if(
17fe0 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
17ff0 74 65 33 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64  te3_errcode(p->d
18000 62 29 20 29 7b 0a 20 20 20 20 20 20 7a 45 72 72  b) ){.      zErr
18010 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Msg = sqlite3_mp
18020 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69  rintf("%s", sqli
18030 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62  te3_errmsg(p->db
18040 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
18050 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 29 3b 0a  3_close(p->db);.
18060 20 20 20 20 20 20 70 2d 3e 64 62 20 3d 20 30 3b        p->db = 0;
18070 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
18080 20 20 20 20 7a 45 72 72 4d 73 67 20 3d 20 73 71      zErrMsg = sq
18090 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
180a0 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 73  s", sqlite3_errs
180b0 74 72 28 72 63 29 29 3b 0a 20 20 7d 0a 23 69 66  tr(rc));.  }.#if
180c0 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
180d0 4f 44 45 43 0a 20 20 69 66 28 20 70 2d 3e 64 62  ODEC.  if( p->db
180e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
180f0 6b 65 79 28 70 2d 3e 64 62 2c 20 70 4b 65 79 2c  key(p->db, pKey,
18100 20 6e 4b 65 79 29 3b 0a 20 20 7d 0a 23 65 6e 64   nKey);.  }.#end
18110 69 66 0a 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d  if.  if( p->db==
18120 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  0 ){.    Tcl_Set
18130 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
18140 45 72 72 4d 73 67 2c 20 54 43 4c 5f 56 4f 4c 41  ErrMsg, TCL_VOLA
18150 54 49 4c 45 29 3b 0a 20 20 20 20 54 63 6c 5f 46  TILE);.    Tcl_F
18160 72 65 65 28 28 63 68 61 72 2a 29 70 29 3b 0a 20  ree((char*)p);. 
18170 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
18180 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 72 65  zErrMsg);.    re
18190 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
181a0 20 20 7d 0a 20 20 70 2d 3e 6d 61 78 53 74 6d 74    }.  p->maxStmt
181b0 20 3d 20 4e 55 4d 5f 50 52 45 50 41 52 45 44 5f   = NUM_PREPARED_
181c0 53 54 4d 54 53 3b 0a 20 20 70 2d 3e 69 6e 74 65  STMTS;.  p->inte
181d0 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 7a  rp = interp;.  z
181e0 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Arg = Tcl_GetStr
181f0 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
18200 31 5d 2c 20 30 29 3b 0a 20 20 69 66 28 20 44 62  1], 0);.  if( Db
18210 55 73 65 4e 72 65 28 29 20 29 7b 0a 20 20 20 20  UseNre() ){.    
18220 54 63 6c 5f 4e 52 43 72 65 61 74 65 43 6f 6d 6d  Tcl_NRCreateComm
18230 61 6e 64 28 69 6e 74 65 72 70 2c 20 7a 41 72 67  and(interp, zArg
18240 2c 20 44 62 4f 62 6a 43 6d 64 41 64 61 70 74 6f  , DbObjCmdAdapto
18250 72 2c 20 44 62 4f 62 6a 43 6d 64 2c 0a 20 20 20  r, DbObjCmd,.   
18260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18270 20 20 20 20 20 28 63 68 61 72 2a 29 70 2c 20 44       (char*)p, D
18280 62 44 65 6c 65 74 65 43 6d 64 29 3b 0a 20 20 7d  bDeleteCmd);.  }
18290 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 43 72  else{.    Tcl_Cr
182a0 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
182b0 6e 74 65 72 70 2c 20 7a 41 72 67 2c 20 44 62 4f  nterp, zArg, DbO
182c0 62 6a 43 6d 64 2c 20 28 63 68 61 72 2a 29 70 2c  bjCmd, (char*)p,
182d0 20 44 62 44 65 6c 65 74 65 43 6d 64 29 3b 0a 20   DbDeleteCmd);. 
182e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
182f0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f  OK;.}../*.** Pro
18300 76 69 64 65 20 61 20 64 75 6d 6d 79 20 54 63 6c  vide a dummy Tcl
18310 5f 49 6e 69 74 53 74 75 62 73 20 69 66 20 77 65  _InitStubs if we
18320 20 61 72 65 20 75 73 69 6e 67 20 74 68 69 73 20   are using this 
18330 61 73 20 61 20 73 74 61 74 69 63 0a 2a 2a 20 6c  as a static.** l
18340 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64  ibrary..*/.#ifnd
18350 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53  ef USE_TCL_STUBS
18360 0a 23 20 75 6e 64 65 66 20 20 54 63 6c 5f 49 6e  .# undef  Tcl_In
18370 69 74 53 74 75 62 73 0a 23 20 64 65 66 69 6e 65  itStubs.# define
18380 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 61   Tcl_InitStubs(a
18390 2c 62 2c 63 29 20 54 43 4c 5f 56 45 52 53 49 4f  ,b,c) TCL_VERSIO
183a0 4e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  N.#endif../*.** 
183b0 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76  Make sure we hav
183c0 65 20 61 20 50 41 43 4b 41 47 45 5f 56 45 52 53  e a PACKAGE_VERS
183d0 49 4f 4e 20 6d 61 63 72 6f 20 64 65 66 69 6e 65  ION macro define
183e0 64 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 62 65  d.  This will be
183f0 0a 2a 2a 20 64 65 66 69 6e 65 64 20 61 75 74 6f  .** defined auto
18400 6d 61 74 69 63 61 6c 6c 79 20 62 79 20 74 68 65  matically by the
18410 20 54 45 41 20 6d 61 6b 65 66 69 6c 65 2e 20 20   TEA makefile.  
18420 42 75 74 20 6f 74 68 65 72 20 6d 61 6b 65 66 69  But other makefi
18430 6c 65 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 64 65  les.** do not de
18440 66 69 6e 65 20 69 74 2e 0a 2a 2f 0a 23 69 66 6e  fine it..*/.#ifn
18450 64 65 66 20 50 41 43 4b 41 47 45 5f 56 45 52 53  def PACKAGE_VERS
18460 49 4f 4e 0a 23 20 64 65 66 69 6e 65 20 50 41 43  ION.# define PAC
18470 4b 41 47 45 5f 56 45 52 53 49 4f 4e 20 53 51 4c  KAGE_VERSION SQL
18480 49 54 45 5f 56 45 52 53 49 4f 4e 0a 23 65 6e 64  ITE_VERSION.#end
18490 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  if../*.** Initia
184a0 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c 65  lize this module
184b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 63 6c  ..**.** This Tcl
184c0 20 6d 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73   module contains
184d0 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 6e   only a single n
184e0 65 77 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 6e  ew Tcl command n
184f0 61 6d 65 64 20 22 73 71 6c 69 74 65 22 2e 0a 2a  amed "sqlite"..*
18500 2a 20 28 48 65 6e 63 65 20 74 68 65 72 65 20 69  * (Hence there i
18510 73 20 6e 6f 20 6e 61 6d 65 73 70 61 63 65 2e 20  s no namespace. 
18520 20 54 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69   There is no poi
18530 6e 74 20 69 6e 20 75 73 69 6e 67 20 61 20 6e 61  nt in using a na
18540 6d 65 73 70 61 63 65 0a 2a 2a 20 69 66 20 74 68  mespace.** if th
18550 65 20 65 78 74 65 6e 73 69 6f 6e 20 6f 6e 6c 79  e extension only
18560 20 73 75 70 70 6c 69 65 73 20 6f 6e 65 20 6e 65   supplies one ne
18570 77 20 6e 61 6d 65 21 29 20 20 54 68 65 20 22 73  w name!)  The "s
18580 71 6c 69 74 65 22 20 63 6f 6d 6d 61 6e 64 20 69  qlite" command i
18590 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 6f 70 65  s.** used to ope
185a0 6e 20 61 20 6e 65 77 20 53 51 4c 69 74 65 20 64  n a new SQLite d
185b0 61 74 61 62 61 73 65 2e 20 20 53 65 65 20 74 68  atabase.  See th
185c0 65 20 44 62 4d 61 69 6e 28 29 20 72 6f 75 74 69  e DbMain() routi
185d0 6e 65 20 61 62 6f 76 65 0a 2a 2a 20 66 6f 72 20  ne above.** for 
185e0 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
185f0 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  mation..**.** Th
18600 65 20 45 58 54 45 52 4e 20 6d 61 63 72 6f 73 20  e EXTERN macros 
18610 61 72 65 20 72 65 71 75 69 72 65 64 20 62 79 20  are required by 
18620 54 43 4c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  TCL in order to 
18630 77 6f 72 6b 20 6f 6e 20 77 69 6e 64 6f 77 73 2e  work on windows.
18640 0a 2a 2f 0a 45 58 54 45 52 4e 20 69 6e 74 20 53  .*/.EXTERN int S
18650 71 6c 69 74 65 33 5f 49 6e 69 74 28 54 63 6c 5f  qlite3_Init(Tcl_
18660 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
18670 0a 20 20 69 6e 74 20 72 63 20 3d 20 54 63 6c 5f  .  int rc = Tcl_
18680 49 6e 69 74 53 74 75 62 73 28 69 6e 74 65 72 70  InitStubs(interp
18690 2c 20 22 38 2e 34 22 2c 20 30 29 3d 3d 30 20 3f  , "8.4", 0)==0 ?
186a0 20 54 43 4c 5f 45 52 52 4f 52 20 3a 20 54 43 4c   TCL_ERROR : TCL
186b0 5f 4f 4b 3b 0a 20 20 69 66 28 20 72 63 3d 3d 54  _OK;.  if( rc==T
186c0 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c  CL_OK ){.    Tcl
186d0 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
186e0 64 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  d(interp, "sqlit
186f0 65 33 22 2c 20 28 54 63 6c 5f 4f 62 6a 43 6d 64  e3", (Tcl_ObjCmd
18700 50 72 6f 63 2a 29 44 62 4d 61 69 6e 2c 20 30 2c  Proc*)DbMain, 0,
18710 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c   0);.#ifndef SQL
18720 49 54 45 5f 33 5f 53 55 46 46 49 58 5f 4f 4e 4c  ITE_3_SUFFIX_ONL
18730 59 0a 20 20 20 20 2f 2a 20 54 68 65 20 22 73 71  Y.    /* The "sq
18740 6c 69 74 65 22 20 61 6c 69 61 73 20 69 73 20 75  lite" alias is u
18750 6e 64 6f 63 75 6d 65 6e 74 65 64 2e 20 20 49 74  ndocumented.  It
18760 20 69 73 20 68 65 72 65 20 6f 6e 6c 79 20 74 6f   is here only to
18770 20 73 75 70 70 6f 72 74 0a 20 20 20 20 2a 2a 20   support.    ** 
18780 6c 65 67 61 63 79 20 73 63 72 69 70 74 73 2e 20  legacy scripts. 
18790 20 41 6c 6c 20 6e 65 77 20 73 63 72 69 70 74 73   All new scripts
187a0 20 73 68 6f 75 6c 64 20 75 73 65 20 6f 6e 6c 79   should use only
187b0 20 74 68 65 20 22 73 71 6c 69 74 65 33 22 0a 20   the "sqlite3". 
187c0 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 2a     ** command. *
187d0 2f 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  /.    Tcl_Create
187e0 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
187f0 70 2c 20 22 73 71 6c 69 74 65 22 2c 20 28 54 63  p, "sqlite", (Tc
18800 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a 29 44 62  l_ObjCmdProc*)Db
18810 4d 61 69 6e 2c 20 30 2c 20 30 29 3b 0a 23 65 6e  Main, 0, 0);.#en
18820 64 69 66 0a 20 20 20 20 72 63 20 3d 20 54 63 6c  dif.    rc = Tcl
18830 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65  _PkgProvide(inte
18840 72 70 2c 20 22 73 71 6c 69 74 65 33 22 2c 20 50  rp, "sqlite3", P
18850 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29 3b  ACKAGE_VERSION);
18860 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
18870 3b 0a 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 54  ;.}.EXTERN int T
18880 63 6c 73 71 6c 69 74 65 33 5f 49 6e 69 74 28 54  clsqlite3_Init(T
18890 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
188a0 70 29 7b 20 72 65 74 75 72 6e 20 53 71 6c 69 74  p){ return Sqlit
188b0 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  e3_Init(interp);
188c0 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 53 71   }.EXTERN int Sq
188d0 6c 69 74 65 33 5f 55 6e 6c 6f 61 64 28 54 63 6c  lite3_Unload(Tcl
188e0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
188f0 20 69 6e 74 20 66 6c 61 67 73 29 7b 20 72 65 74   int flags){ ret
18900 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58  urn TCL_OK; }.EX
18910 54 45 52 4e 20 69 6e 74 20 54 63 6c 73 71 6c 69  TERN int Tclsqli
18920 74 65 33 5f 55 6e 6c 6f 61 64 28 54 63 6c 5f 49  te3_Unload(Tcl_I
18930 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
18940 6e 74 20 66 6c 61 67 73 29 7b 20 72 65 74 75 72  nt flags){ retur
18950 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 0a 2f 2a 20  n TCL_OK; }../* 
18960 42 65 63 61 75 73 65 20 69 74 20 61 63 63 65 73  Because it acces
18970 73 65 73 20 74 68 65 20 66 69 6c 65 2d 73 79 73  ses the file-sys
18980 74 65 6d 20 61 6e 64 20 75 73 65 73 20 70 65 72  tem and uses per
18990 73 69 73 74 65 6e 74 20 73 74 61 74 65 2c 20 53  sistent state, S
189a0 51 4c 69 74 65 0a 2a 2a 20 69 73 20 6e 6f 74 20  QLite.** is not 
189b0 63 6f 6e 73 69 64 65 72 65 64 20 61 70 70 72 6f  considered appro
189c0 70 72 69 61 74 65 20 66 6f 72 20 73 61 66 65 20  priate for safe 
189d0 69 6e 74 65 72 70 72 65 74 65 72 73 2e 20 20 48  interpreters.  H
189e0 65 6e 63 65 2c 20 77 65 20 64 65 6c 69 62 65 72  ence, we deliber
189f0 61 74 65 6c 79 0a 2a 2a 20 6f 6d 69 74 20 74 68  ately.** omit th
18a00 65 20 5f 53 61 66 65 49 6e 69 74 28 29 20 69 6e  e _SafeInit() in
18a10 74 65 72 66 61 63 65 73 2e 0a 2a 2f 0a 0a 23 69  terfaces..*/..#i
18a20 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 33 5f 53  fndef SQLITE_3_S
18a30 55 46 46 49 58 5f 4f 4e 4c 59 0a 69 6e 74 20 53  UFFIX_ONLY.int S
18a40 71 6c 69 74 65 5f 49 6e 69 74 28 54 63 6c 5f 49  qlite_Init(Tcl_I
18a50 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20  nterp *interp){ 
18a60 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33 5f 49  return Sqlite3_I
18a70 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a 69  nit(interp); }.i
18a80 6e 74 20 54 63 6c 73 71 6c 69 74 65 5f 49 6e 69  nt Tclsqlite_Ini
18a90 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
18aa0 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 53 71  terp){ return Sq
18ab0 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72  lite3_Init(inter
18ac0 70 29 3b 20 7d 0a 69 6e 74 20 53 71 6c 69 74 65  p); }.int Sqlite
18ad0 5f 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65  _Unload(Tcl_Inte
18ae0 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
18af0 66 6c 61 67 73 29 7b 20 72 65 74 75 72 6e 20 54  flags){ return T
18b00 43 4c 5f 4f 4b 3b 20 7d 0a 69 6e 74 20 54 63 6c  CL_OK; }.int Tcl
18b10 73 71 6c 69 74 65 5f 55 6e 6c 6f 61 64 28 54 63  sqlite_Unload(Tc
18b20 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
18b30 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 20 72 65  , int flags){ re
18b40 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 23  turn TCL_OK; }.#
18b50 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 54 43  endif..#ifdef TC
18b60 4c 53 48 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  LSH./***********
18b70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18b80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18b90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18bb0 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65  **.** All of the
18bc0 20 63 6f 64 65 20 74 68 61 74 20 66 6f 6c 6c 6f   code that follo
18bd0 77 73 20 69 73 20 75 73 65 64 20 74 6f 20 62 75  ws is used to bu
18be0 69 6c 64 20 73 74 61 6e 64 61 6c 6f 6e 65 20 54  ild standalone T
18bf0 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 73 0a  CL interpreters.
18c00 2a 2a 20 74 68 61 74 20 61 72 65 20 73 74 61 74  ** that are stat
18c10 69 63 61 6c 6c 79 20 6c 69 6e 6b 65 64 20 77 69  ically linked wi
18c20 74 68 20 53 51 4c 69 74 65 2e 20 20 45 6e 61 62  th SQLite.  Enab
18c30 6c 65 20 74 68 65 73 65 20 62 79 20 63 6f 6d 70  le these by comp
18c40 69 6c 69 6e 67 0a 2a 2a 20 77 69 74 68 20 2d 44  iling.** with -D
18c50 54 43 4c 53 48 3d 6e 20 77 68 65 72 65 20 6e 20  TCLSH=n where n 
18c60 63 61 6e 20 62 65 20 31 20 6f 72 20 32 2e 20 20  can be 1 or 2.  
18c70 41 6e 20 6e 20 6f 66 20 31 20 67 65 6e 65 72 61  An n of 1 genera
18c80 74 65 73 20 61 20 73 74 61 6e 64 61 72 64 0a 2a  tes a standard.*
18c90 2a 20 74 63 6c 73 68 20 62 75 74 20 77 69 74 68  * tclsh but with
18ca0 20 53 51 4c 69 74 65 20 62 75 69 6c 74 20 69 6e   SQLite built in
18cb0 2e 20 20 41 6e 20 6e 20 6f 66 20 32 20 67 65 6e  .  An n of 2 gen
18cc0 65 72 61 74 65 73 20 74 68 65 20 53 51 4c 69 74  erates the SQLit
18cd0 65 20 73 70 61 63 65 0a 2a 2a 20 61 6e 61 6c 79  e space.** analy
18ce0 73 69 73 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  sis program..*/.
18cf0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
18d00 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66  ITE_TEST) || def
18d10 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 43 4c 4d  ined(SQLITE_TCLM
18d20 44 35 29 0a 2f 2a 0a 20 2a 20 54 68 69 73 20 63  D5)./*. * This c
18d30 6f 64 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  ode implements t
18d40 68 65 20 4d 44 35 20 6d 65 73 73 61 67 65 2d 64  he MD5 message-d
18d50 69 67 65 73 74 20 61 6c 67 6f 72 69 74 68 6d 2e  igest algorithm.
18d60 0a 20 2a 20 54 68 65 20 61 6c 67 6f 72 69 74 68  . * The algorith
18d70 6d 20 69 73 20 64 75 65 20 74 6f 20 52 6f 6e 20  m is due to Ron 
18d80 52 69 76 65 73 74 2e 20 20 54 68 69 73 20 63 6f  Rivest.  This co
18d90 64 65 20 77 61 73 0a 20 2a 20 77 72 69 74 74 65  de was. * writte
18da0 6e 20 62 79 20 43 6f 6c 69 6e 20 50 6c 75 6d 62  n by Colin Plumb
18db0 20 69 6e 20 31 39 39 33 2c 20 6e 6f 20 63 6f 70   in 1993, no cop
18dc0 79 72 69 67 68 74 20 69 73 20 63 6c 61 69 6d 65  yright is claime
18dd0 64 2e 0a 20 2a 20 54 68 69 73 20 63 6f 64 65 20  d.. * This code 
18de0 69 73 20 69 6e 20 74 68 65 20 70 75 62 6c 69 63  is in the public
18df0 20 64 6f 6d 61 69 6e 3b 20 64 6f 20 77 69 74 68   domain; do with
18e00 20 69 74 20 77 68 61 74 20 79 6f 75 20 77 69 73   it what you wis
18e10 68 2e 0a 20 2a 0a 20 2a 20 45 71 75 69 76 61 6c  h.. *. * Equival
18e20 65 6e 74 20 63 6f 64 65 20 69 73 20 61 76 61 69  ent code is avai
18e30 6c 61 62 6c 65 20 66 72 6f 6d 20 52 53 41 20 44  lable from RSA D
18e40 61 74 61 20 53 65 63 75 72 69 74 79 2c 20 49 6e  ata Security, In
18e50 63 2e 0a 20 2a 20 54 68 69 73 20 63 6f 64 65 20  c.. * This code 
18e60 68 61 73 20 62 65 65 6e 20 74 65 73 74 65 64 20  has been tested 
18e70 61 67 61 69 6e 73 74 20 74 68 61 74 2c 20 61 6e  against that, an
18e80 64 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 2c  d is equivalent,
18e90 0a 20 2a 20 65 78 63 65 70 74 20 74 68 61 74 20  . * except that 
18ea0 79 6f 75 20 64 6f 6e 27 74 20 6e 65 65 64 20 74  you don't need t
18eb0 6f 20 69 6e 63 6c 75 64 65 20 74 77 6f 20 70 61  o include two pa
18ec0 67 65 73 20 6f 66 20 6c 65 67 61 6c 65 73 65 0a  ges of legalese.
18ed0 20 2a 20 77 69 74 68 20 65 76 65 72 79 20 63 6f   * with every co
18ee0 70 79 2e 0a 20 2a 0a 20 2a 20 54 6f 20 63 6f 6d  py.. *. * To com
18ef0 70 75 74 65 20 74 68 65 20 6d 65 73 73 61 67 65  pute the message
18f00 20 64 69 67 65 73 74 20 6f 66 20 61 20 63 68 75   digest of a chu
18f10 6e 6b 20 6f 66 20 62 79 74 65 73 2c 20 64 65 63  nk of bytes, dec
18f20 6c 61 72 65 20 61 6e 0a 20 2a 20 4d 44 35 43 6f  lare an. * MD5Co
18f30 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65 2c  ntext structure,
18f40 20 70 61 73 73 20 69 74 20 74 6f 20 4d 44 35 49   pass it to MD5I
18f50 6e 69 74 2c 20 63 61 6c 6c 20 4d 44 35 55 70 64  nit, call MD5Upd
18f60 61 74 65 20 61 73 0a 20 2a 20 6e 65 65 64 65 64  ate as. * needed
18f70 20 6f 6e 20 62 75 66 66 65 72 73 20 66 75 6c 6c   on buffers full
18f80 20 6f 66 20 62 79 74 65 73 2c 20 61 6e 64 20 74   of bytes, and t
18f90 68 65 6e 20 63 61 6c 6c 20 4d 44 35 46 69 6e 61  hen call MD5Fina
18fa0 6c 2c 20 77 68 69 63 68 0a 20 2a 20 77 69 6c 6c  l, which. * will
18fb0 20 66 69 6c 6c 20 61 20 73 75 70 70 6c 69 65 64   fill a supplied
18fc0 20 31 36 2d 62 79 74 65 20 61 72 72 61 79 20 77   16-byte array w
18fd0 69 74 68 20 74 68 65 20 64 69 67 65 73 74 2e 0a  ith the digest..
18fe0 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 49 66 20 63 6f   */../*. * If co
18ff0 6d 70 69 6c 65 64 20 6f 6e 20 61 20 6d 61 63 68  mpiled on a mach
19000 69 6e 65 20 74 68 61 74 20 64 6f 65 73 6e 27 74  ine that doesn't
19010 20 68 61 76 65 20 61 20 33 32 2d 62 69 74 20 69   have a 32-bit i
19020 6e 74 65 67 65 72 2c 0a 20 2a 20 79 6f 75 20 6a  nteger,. * you j
19030 75 73 74 20 73 65 74 20 22 75 69 6e 74 33 32 22  ust set "uint32"
19040 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69   to the appropri
19050 61 74 65 20 64 61 74 61 74 79 70 65 20 66 6f 72  ate datatype for
19060 20 61 6e 0a 20 2a 20 75 6e 73 69 67 6e 65 64 20   an. * unsigned 
19070 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 20  32-bit integer. 
19080 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20 2a   For example:. *
19090 0a 20 2a 20 20 20 20 20 20 20 63 63 20 2d 44 75  . *       cc -Du
190a0 69 6e 74 33 32 3d 27 75 6e 73 69 67 6e 65 64 20  int32='unsigned 
190b0 6c 6f 6e 67 27 20 6d 64 35 2e 63 0a 20 2a 0a 20  long' md5.c. *. 
190c0 2a 2f 0a 23 69 66 6e 64 65 66 20 75 69 6e 74 33  */.#ifndef uint3
190d0 32 0a 23 20 20 64 65 66 69 6e 65 20 75 69 6e 74  2.#  define uint
190e0 33 32 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 0a  32 unsigned int.
190f0 23 65 6e 64 69 66 0a 0a 73 74 72 75 63 74 20 4d  #endif..struct M
19100 44 35 43 6f 6e 74 65 78 74 20 7b 0a 20 20 69 6e  D5Context {.  in
19110 74 20 69 73 49 6e 69 74 3b 0a 20 20 75 69 6e 74  t isInit;.  uint
19120 33 32 20 62 75 66 5b 34 5d 3b 0a 20 20 75 69 6e  32 buf[4];.  uin
19130 74 33 32 20 62 69 74 73 5b 32 5d 3b 0a 20 20 75  t32 bits[2];.  u
19140 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e 5b  nsigned char in[
19150 36 34 5d 3b 0a 7d 3b 0a 74 79 70 65 64 65 66 20  64];.};.typedef 
19160 73 74 72 75 63 74 20 4d 44 35 43 6f 6e 74 65 78  struct MD5Contex
19170 74 20 4d 44 35 43 6f 6e 74 65 78 74 3b 0a 0a 2f  t MD5Context;../
19180 2a 0a 20 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20  *. * Note: this 
19190 63 6f 64 65 20 69 73 20 68 61 72 6d 6c 65 73 73  code is harmless
191a0 20 6f 6e 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61   on little-endia
191b0 6e 20 6d 61 63 68 69 6e 65 73 2e 0a 20 2a 2f 0a  n machines.. */.
191c0 73 74 61 74 69 63 20 76 6f 69 64 20 62 79 74 65  static void byte
191d0 52 65 76 65 72 73 65 20 28 75 6e 73 69 67 6e 65  Reverse (unsigne
191e0 64 20 63 68 61 72 20 2a 62 75 66 2c 20 75 6e 73  d char *buf, uns
191f0 69 67 6e 65 64 20 6c 6f 6e 67 73 29 7b 0a 20 20  igned longs){.  
19200 20 20 20 20 20 20 75 69 6e 74 33 32 20 74 3b 0a        uint32 t;.
19210 20 20 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20          do {.   
19220 20 20 20 20 20 20 20 20 20 20 20 20 20 74 20 3d               t =
19230 20 28 75 69 6e 74 33 32 29 28 28 75 6e 73 69 67   (uint32)((unsig
19240 6e 65 64 29 62 75 66 5b 33 5d 3c 3c 38 20 7c 20  ned)buf[3]<<8 | 
19250 62 75 66 5b 32 5d 29 20 3c 3c 20 31 36 20 7c 0a  buf[2]) << 16 |.
19260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19270 20 20 20 20 20 20 20 20 20 20 20 20 28 28 75 6e              ((un
19280 73 69 67 6e 65 64 29 62 75 66 5b 31 5d 3c 3c 38  signed)buf[1]<<8
19290 20 7c 20 62 75 66 5b 30 5d 29 3b 0a 20 20 20 20   | buf[0]);.    
192a0 20 20 20 20 20 20 20 20 20 20 20 20 2a 28 75 69              *(ui
192b0 6e 74 33 32 20 2a 29 62 75 66 20 3d 20 74 3b 0a  nt32 *)buf = t;.
192c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
192d0 62 75 66 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20  buf += 4;.      
192e0 20 20 7d 20 77 68 69 6c 65 20 28 2d 2d 6c 6f 6e    } while (--lon
192f0 67 73 29 3b 0a 7d 0a 2f 2a 20 54 68 65 20 66 6f  gs);.}./* The fo
19300 75 72 20 63 6f 72 65 20 66 75 6e 63 74 69 6f 6e  ur core function
19310 73 20 2d 20 46 31 20 69 73 20 6f 70 74 69 6d 69  s - F1 is optimi
19320 7a 65 64 20 73 6f 6d 65 77 68 61 74 20 2a 2f 0a  zed somewhat */.
19330 0a 2f 2a 20 23 64 65 66 69 6e 65 20 46 31 28 78  ./* #define F1(x
19340 2c 20 79 2c 20 7a 29 20 28 78 20 26 20 79 20 7c  , y, z) (x & y |
19350 20 7e 78 20 26 20 7a 29 20 2a 2f 0a 23 64 65 66   ~x & z) */.#def
19360 69 6e 65 20 46 31 28 78 2c 20 79 2c 20 7a 29 20  ine F1(x, y, z) 
19370 28 7a 20 5e 20 28 78 20 26 20 28 79 20 5e 20 7a  (z ^ (x & (y ^ z
19380 29 29 29 0a 23 64 65 66 69 6e 65 20 46 32 28 78  ))).#define F2(x
19390 2c 20 79 2c 20 7a 29 20 46 31 28 7a 2c 20 78 2c  , y, z) F1(z, x,
193a0 20 79 29 0a 23 64 65 66 69 6e 65 20 46 33 28 78   y).#define F3(x
193b0 2c 20 79 2c 20 7a 29 20 28 78 20 5e 20 79 20 5e  , y, z) (x ^ y ^
193c0 20 7a 29 0a 23 64 65 66 69 6e 65 20 46 34 28 78   z).#define F4(x
193d0 2c 20 79 2c 20 7a 29 20 28 79 20 5e 20 28 78 20  , y, z) (y ^ (x 
193e0 7c 20 7e 7a 29 29 0a 0a 2f 2a 20 54 68 69 73 20  | ~z))../* This 
193f0 69 73 20 74 68 65 20 63 65 6e 74 72 61 6c 20 73  is the central s
19400 74 65 70 20 69 6e 20 74 68 65 20 4d 44 35 20 61  tep in the MD5 a
19410 6c 67 6f 72 69 74 68 6d 2e 20 2a 2f 0a 23 64 65  lgorithm. */.#de
19420 66 69 6e 65 20 4d 44 35 53 54 45 50 28 66 2c 20  fine MD5STEP(f, 
19430 77 2c 20 78 2c 20 79 2c 20 7a 2c 20 64 61 74 61  w, x, y, z, data
19440 2c 20 73 29 20 5c 0a 20 20 20 20 20 20 20 20 28  , s) \.        (
19450 20 77 20 2b 3d 20 66 28 78 2c 20 79 2c 20 7a 29   w += f(x, y, z)
19460 20 2b 20 64 61 74 61 2c 20 20 77 20 3d 20 77 3c   + data,  w = w<
19470 3c 73 20 7c 20 77 3e 3e 28 33 32 2d 73 29 2c 20  <s | w>>(32-s), 
19480 20 77 20 2b 3d 20 78 20 29 0a 0a 2f 2a 0a 20 2a   w += x )../*. *
19490 20 54 68 65 20 63 6f 72 65 20 6f 66 20 74 68 65   The core of the
194a0 20 4d 44 35 20 61 6c 67 6f 72 69 74 68 6d 2c 20   MD5 algorithm, 
194b0 74 68 69 73 20 61 6c 74 65 72 73 20 61 6e 20 65  this alters an e
194c0 78 69 73 74 69 6e 67 20 4d 44 35 20 68 61 73 68  xisting MD5 hash
194d0 20 74 6f 0a 20 2a 20 72 65 66 6c 65 63 74 20 74   to. * reflect t
194e0 68 65 20 61 64 64 69 74 69 6f 6e 20 6f 66 20 31  he addition of 1
194f0 36 20 6c 6f 6e 67 77 6f 72 64 73 20 6f 66 20 6e  6 longwords of n
19500 65 77 20 64 61 74 61 2e 20 20 4d 44 35 55 70 64  ew data.  MD5Upd
19510 61 74 65 20 62 6c 6f 63 6b 73 0a 20 2a 20 74 68  ate blocks. * th
19520 65 20 64 61 74 61 20 61 6e 64 20 63 6f 6e 76 65  e data and conve
19530 72 74 73 20 62 79 74 65 73 20 69 6e 74 6f 20 6c  rts bytes into l
19540 6f 6e 67 77 6f 72 64 73 20 66 6f 72 20 74 68 69  ongwords for thi
19550 73 20 72 6f 75 74 69 6e 65 2e 0a 20 2a 2f 0a 73  s routine.. */.s
19560 74 61 74 69 63 20 76 6f 69 64 20 4d 44 35 54 72  tatic void MD5Tr
19570 61 6e 73 66 6f 72 6d 28 75 69 6e 74 33 32 20 62  ansform(uint32 b
19580 75 66 5b 34 5d 2c 20 63 6f 6e 73 74 20 75 69 6e  uf[4], const uin
19590 74 33 32 20 69 6e 5b 31 36 5d 29 7b 0a 20 20 20  t32 in[16]){.   
195a0 20 20 20 20 20 72 65 67 69 73 74 65 72 20 75 69       register ui
195b0 6e 74 33 32 20 61 2c 20 62 2c 20 63 2c 20 64 3b  nt32 a, b, c, d;
195c0 0a 0a 20 20 20 20 20 20 20 20 61 20 3d 20 62 75  ..        a = bu
195d0 66 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 62 20  f[0];.        b 
195e0 3d 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20  = buf[1];.      
195f0 20 20 63 20 3d 20 62 75 66 5b 32 5d 3b 0a 20 20    c = buf[2];.  
19600 20 20 20 20 20 20 64 20 3d 20 62 75 66 5b 33 5d        d = buf[3]
19610 3b 0a 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  ;..        MD5ST
19620 45 50 28 46 31 2c 20 61 2c 20 62 2c 20 63 2c 20  EP(F1, a, b, c, 
19630 64 2c 20 69 6e 5b 20 30 5d 2b 30 78 64 37 36 61  d, in[ 0]+0xd76a
19640 61 34 37 38 2c 20 20 37 29 3b 0a 20 20 20 20 20  a478,  7);.     
19650 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 64     MD5STEP(F1, d
19660 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20 31  , a, b, c, in[ 1
19670 5d 2b 30 78 65 38 63 37 62 37 35 36 2c 20 31 32  ]+0xe8c7b756, 12
19680 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
19690 45 50 28 46 31 2c 20 63 2c 20 64 2c 20 61 2c 20  EP(F1, c, d, a, 
196a0 62 2c 20 69 6e 5b 20 32 5d 2b 30 78 32 34 32 30  b, in[ 2]+0x2420
196b0 37 30 64 62 2c 20 31 37 29 3b 0a 20 20 20 20 20  70db, 17);.     
196c0 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 62     MD5STEP(F1, b
196d0 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20 33  , c, d, a, in[ 3
196e0 5d 2b 30 78 63 31 62 64 63 65 65 65 2c 20 32 32  ]+0xc1bdceee, 22
196f0 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
19700 45 50 28 46 31 2c 20 61 2c 20 62 2c 20 63 2c 20  EP(F1, a, b, c, 
19710 64 2c 20 69 6e 5b 20 34 5d 2b 30 78 66 35 37 63  d, in[ 4]+0xf57c
19720 30 66 61 66 2c 20 20 37 29 3b 0a 20 20 20 20 20  0faf,  7);.     
19730 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 64     MD5STEP(F1, d
19740 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20 35  , a, b, c, in[ 5
19750 5d 2b 30 78 34 37 38 37 63 36 32 61 2c 20 31 32  ]+0x4787c62a, 12
19760 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
19770 45 50 28 46 31 2c 20 63 2c 20 64 2c 20 61 2c 20  EP(F1, c, d, a, 
19780 62 2c 20 69 6e 5b 20 36 5d 2b 30 78 61 38 33 30  b, in[ 6]+0xa830
19790 34 36 31 33 2c 20 31 37 29 3b 0a 20 20 20 20 20  4613, 17);.     
197a0 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 62     MD5STEP(F1, b
197b0 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20 37  , c, d, a, in[ 7
197c0 5d 2b 30 78 66 64 34 36 39 35 30 31 2c 20 32 32  ]+0xfd469501, 22
197d0 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
197e0 45 50 28 46 31 2c 20 61 2c 20 62 2c 20 63 2c 20  EP(F1, a, b, c, 
197f0 64 2c 20 69 6e 5b 20 38 5d 2b 30 78 36 39 38 30  d, in[ 8]+0x6980
19800 39 38 64 38 2c 20 20 37 29 3b 0a 20 20 20 20 20  98d8,  7);.     
19810 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 64     MD5STEP(F1, d
19820 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20 39  , a, b, c, in[ 9
19830 5d 2b 30 78 38 62 34 34 66 37 61 66 2c 20 31 32  ]+0x8b44f7af, 12
19840 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
19850 45 50 28 46 31 2c 20 63 2c 20 64 2c 20 61 2c 20  EP(F1, c, d, a, 
19860 62 2c 20 69 6e 5b 31 30 5d 2b 30 78 66 66 66 66  b, in[10]+0xffff
19870 35 62 62 31 2c 20 31 37 29 3b 0a 20 20 20 20 20  5bb1, 17);.     
19880 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 62     MD5STEP(F1, b
19890 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 31 31  , c, d, a, in[11
198a0 5d 2b 30 78 38 39 35 63 64 37 62 65 2c 20 32 32  ]+0x895cd7be, 22
198b0 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
198c0 45 50 28 46 31 2c 20 61 2c 20 62 2c 20 63 2c 20  EP(F1, a, b, c, 
198d0 64 2c 20 69 6e 5b 31 32 5d 2b 30 78 36 62 39 30  d, in[12]+0x6b90
198e0 31 31 32 32 2c 20 20 37 29 3b 0a 20 20 20 20 20  1122,  7);.     
198f0 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 64     MD5STEP(F1, d
19900 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 31 33  , a, b, c, in[13
19910 5d 2b 30 78 66 64 39 38 37 31 39 33 2c 20 31 32  ]+0xfd987193, 12
19920 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
19930 45 50 28 46 31 2c 20 63 2c 20 64 2c 20 61 2c 20  EP(F1, c, d, a, 
19940 62 2c 20 69 6e 5b 31 34 5d 2b 30 78 61 36 37 39  b, in[14]+0xa679
19950 34 33 38 65 2c 20 31 37 29 3b 0a 20 20 20 20 20  438e, 17);.     
19960 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 62     MD5STEP(F1, b
19970 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 31 35  , c, d, a, in[15
19980 5d 2b 30 78 34 39 62 34 30 38 32 31 2c 20 32 32  ]+0x49b40821, 22
19990 29 3b 0a 0a 20 20 20 20 20 20 20 20 4d 44 35 53  );..        MD5S
199a0 54 45 50 28 46 32 2c 20 61 2c 20 62 2c 20 63 2c  TEP(F2, a, b, c,
199b0 20 64 2c 20 69 6e 5b 20 31 5d 2b 30 78 66 36 31   d, in[ 1]+0xf61
199c0 65 32 35 36 32 2c 20 20 35 29 3b 0a 20 20 20 20  e2562,  5);.    
199d0 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20      MD5STEP(F2, 
199e0 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20  d, a, b, c, in[ 
199f0 36 5d 2b 30 78 63 30 34 30 62 33 34 30 2c 20 20  6]+0xc040b340,  
19a00 39 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  9);.        MD5S
19a10 54 45 50 28 46 32 2c 20 63 2c 20 64 2c 20 61 2c  TEP(F2, c, d, a,
19a20 20 62 2c 20 69 6e 5b 31 31 5d 2b 30 78 32 36 35   b, in[11]+0x265
19a30 65 35 61 35 31 2c 20 31 34 29 3b 0a 20 20 20 20  e5a51, 14);.    
19a40 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20      MD5STEP(F2, 
19a50 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20  b, c, d, a, in[ 
19a60 30 5d 2b 30 78 65 39 62 36 63 37 61 61 2c 20 32  0]+0xe9b6c7aa, 2
19a70 30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  0);.        MD5S
19a80 54 45 50 28 46 32 2c 20 61 2c 20 62 2c 20 63 2c  TEP(F2, a, b, c,
19a90 20 64 2c 20 69 6e 5b 20 35 5d 2b 30 78 64 36 32   d, in[ 5]+0xd62
19aa0 66 31 30 35 64 2c 20 20 35 29 3b 0a 20 20 20 20  f105d,  5);.    
19ab0 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20      MD5STEP(F2, 
19ac0 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 31  d, a, b, c, in[1
19ad0 30 5d 2b 30 78 30 32 34 34 31 34 35 33 2c 20 20  0]+0x02441453,  
19ae0 39 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  9);.        MD5S
19af0 54 45 50 28 46 32 2c 20 63 2c 20 64 2c 20 61 2c  TEP(F2, c, d, a,
19b00 20 62 2c 20 69 6e 5b 31 35 5d 2b 30 78 64 38 61   b, in[15]+0xd8a
19b10 31 65 36 38 31 2c 20 31 34 29 3b 0a 20 20 20 20  1e681, 14);.    
19b20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20      MD5STEP(F2, 
19b30 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20  b, c, d, a, in[ 
19b40 34 5d 2b 30 78 65 37 64 33 66 62 63 38 2c 20 32  4]+0xe7d3fbc8, 2
19b50 30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  0);.        MD5S
19b60 54 45 50 28 46 32 2c 20 61 2c 20 62 2c 20 63 2c  TEP(F2, a, b, c,
19b70 20 64 2c 20 69 6e 5b 20 39 5d 2b 30 78 32 31 65   d, in[ 9]+0x21e
19b80 31 63 64 65 36 2c 20 20 35 29 3b 0a 20 20 20 20  1cde6,  5);.    
19b90 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20      MD5STEP(F2, 
19ba0 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 31  d, a, b, c, in[1
19bb0 34 5d 2b 30 78 63 33 33 37 30 37 64 36 2c 20 20  4]+0xc33707d6,  
19bc0 39 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  9);.        MD5S
19bd0 54 45 50 28 46 32 2c 20 63 2c 20 64 2c 20 61 2c  TEP(F2, c, d, a,
19be0 20 62 2c 20 69 6e 5b 20 33 5d 2b 30 78 66 34 64   b, in[ 3]+0xf4d
19bf0 35 30 64 38 37 2c 20 31 34 29 3b 0a 20 20 20 20  50d87, 14);.    
19c00 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20      MD5STEP(F2, 
19c10 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20  b, c, d, a, in[ 
19c20 38 5d 2b 30 78 34 35 35 61 31 34 65 64 2c 20 32  8]+0x455a14ed, 2
19c30 30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  0);.        MD5S
19c40 54 45 50 28 46 32 2c 20 61 2c 20 62 2c 20 63 2c  TEP(F2, a, b, c,
19c50 20 64 2c 20 69 6e 5b 31 33 5d 2b 30 78 61 39 65   d, in[13]+0xa9e
19c60 33 65 39 30 35 2c 20 20 35 29 3b 0a 20 20 20 20  3e905,  5);.    
19c70 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20      MD5STEP(F2, 
19c80 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20  d, a, b, c, in[ 
19c90 32 5d 2b 30 78 66 63 65 66 61 33 66 38 2c 20 20  2]+0xfcefa3f8,  
19ca0 39 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  9);.        MD5S
19cb0 54 45 50 28 46 32 2c 20 63 2c 20 64 2c 20 61 2c  TEP(F2, c, d, a,
19cc0 20 62 2c 20 69 6e 5b 20 37 5d 2b 30 78 36 37 36   b, in[ 7]+0x676
19cd0 66 30 32 64 39 2c 20 31 34 29 3b 0a 20 20 20 20  f02d9, 14);.    
19ce0 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20      MD5STEP(F2, 
19cf0 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 31  b, c, d, a, in[1
19d00 32 5d 2b 30 78 38 64 32 61 34 63 38 61 2c 20 32  2]+0x8d2a4c8a, 2
19d10 30 29 3b 0a 0a 20 20 20 20 20 20 20 20 4d 44 35  0);..        MD5
19d20 53 54 45 50 28 46 33 2c 20 61 2c 20 62 2c 20 63  STEP(F3, a, b, c
19d30 2c 20 64 2c 20 69 6e 5b 20 35 5d 2b 30 78 66 66  , d, in[ 5]+0xff
19d40 66 61 33 39 34 32 2c 20 20 34 29 3b 0a 20 20 20  fa3942,  4);.   
19d50 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c       MD5STEP(F3,
19d60 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b   d, a, b, c, in[
19d70 20 38 5d 2b 30 78 38 37 37 31 66 36 38 31 2c 20   8]+0x8771f681, 
19d80 31 31 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  11);.        MD5
19d90 53 54 45 50 28 46 33 2c 20 63 2c 20 64 2c 20 61  STEP(F3, c, d, a
19da0 2c 20 62 2c 20 69 6e 5b 31 31 5d 2b 30 78 36 64  , b, in[11]+0x6d
19db0 39 64 36 31 32 32 2c 20 31 36 29 3b 0a 20 20 20  9d6122, 16);.   
19dc0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c       MD5STEP(F3,
19dd0 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
19de0 31 34 5d 2b 30 78 66 64 65 35 33 38 30 63 2c 20  14]+0xfde5380c, 
19df0 32 33 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  23);.        MD5
19e00 53 54 45 50 28 46 33 2c 20 61 2c 20 62 2c 20 63  STEP(F3, a, b, c
19e10 2c 20 64 2c 20 69 6e 5b 20 31 5d 2b 30 78 61 34  , d, in[ 1]+0xa4
19e20 62 65 65 61 34 34 2c 20 20 34 29 3b 0a 20 20 20  beea44,  4);.   
19e30 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c       MD5STEP(F3,
19e40 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b   d, a, b, c, in[
19e50 20 34 5d 2b 30 78 34 62 64 65 63 66 61 39 2c 20   4]+0x4bdecfa9, 
19e60 31 31 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  11);.        MD5
19e70 53 54 45 50 28 46 33 2c 20 63 2c 20 64 2c 20 61  STEP(F3, c, d, a
19e80 2c 20 62 2c 20 69 6e 5b 20 37 5d 2b 30 78 66 36  , b, in[ 7]+0xf6
19e90 62 62 34 62 36 30 2c 20 31 36 29 3b 0a 20 20 20  bb4b60, 16);.   
19ea0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c       MD5STEP(F3,
19eb0 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
19ec0 31 30 5d 2b 30 78 62 65 62 66 62 63 37 30 2c 20  10]+0xbebfbc70, 
19ed0 32 33 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  23);.        MD5
19ee0 53 54 45 50 28 46 33 2c 20 61 2c 20 62 2c 20 63  STEP(F3, a, b, c
19ef0 2c 20 64 2c 20 69 6e 5b 31 33 5d 2b 30 78 32 38  , d, in[13]+0x28
19f00 39 62 37 65 63 36 2c 20 20 34 29 3b 0a 20 20 20  9b7ec6,  4);.   
19f10 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c       MD5STEP(F3,
19f20 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b   d, a, b, c, in[
19f30 20 30 5d 2b 30 78 65 61 61 31 32 37 66 61 2c 20   0]+0xeaa127fa, 
19f40 31 31 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  11);.        MD5
19f50 53 54 45 50 28 46 33 2c 20 63 2c 20 64 2c 20 61  STEP(F3, c, d, a
19f60 2c 20 62 2c 20 69 6e 5b 20 33 5d 2b 30 78 64 34  , b, in[ 3]+0xd4
19f70 65 66 33 30 38 35 2c 20 31 36 29 3b 0a 20 20 20  ef3085, 16);.   
19f80 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c       MD5STEP(F3,
19f90 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
19fa0 20 36 5d 2b 30 78 30 34 38 38 31 64 30 35 2c 20   6]+0x04881d05, 
19fb0 32 33 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  23);.        MD5
19fc0 53 54 45 50 28 46 33 2c 20 61 2c 20 62 2c 20 63  STEP(F3, a, b, c
19fd0 2c 20 64 2c 20 69 6e 5b 20 39 5d 2b 30 78 64 39  , d, in[ 9]+0xd9
19fe0 64 34 64 30 33 39 2c 20 20 34 29 3b 0a 20 20 20  d4d039,  4);.   
19ff0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c       MD5STEP(F3,
1a000 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b   d, a, b, c, in[
1a010 31 32 5d 2b 30 78 65 36 64 62 39 39 65 35 2c 20  12]+0xe6db99e5, 
1a020 31 31 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  11);.        MD5
1a030 53 54 45 50 28 46 33 2c 20 63 2c 20 64 2c 20 61  STEP(F3, c, d, a
1a040 2c 20 62 2c 20 69 6e 5b 31 35 5d 2b 30 78 31 66  , b, in[15]+0x1f
1a050 61 32 37 63 66 38 2c 20 31 36 29 3b 0a 20 20 20  a27cf8, 16);.   
1a060 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c       MD5STEP(F3,
1a070 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
1a080 20 32 5d 2b 30 78 63 34 61 63 35 36 36 35 2c 20   2]+0xc4ac5665, 
1a090 32 33 29 3b 0a 0a 20 20 20 20 20 20 20 20 4d 44  23);..        MD
1a0a0 35 53 54 45 50 28 46 34 2c 20 61 2c 20 62 2c 20  5STEP(F4, a, b, 
1a0b0 63 2c 20 64 2c 20 69 6e 5b 20 30 5d 2b 30 78 66  c, d, in[ 0]+0xf
1a0c0 34 32 39 32 32 34 34 2c 20 20 36 29 3b 0a 20 20  4292244,  6);.  
1a0d0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34        MD5STEP(F4
1a0e0 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
1a0f0 5b 20 37 5d 2b 30 78 34 33 32 61 66 66 39 37 2c  [ 7]+0x432aff97,
1a100 20 31 30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   10);.        MD
1a110 35 53 54 45 50 28 46 34 2c 20 63 2c 20 64 2c 20  5STEP(F4, c, d, 
1a120 61 2c 20 62 2c 20 69 6e 5b 31 34 5d 2b 30 78 61  a, b, in[14]+0xa
1a130 62 39 34 32 33 61 37 2c 20 31 35 29 3b 0a 20 20  b9423a7, 15);.  
1a140 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34        MD5STEP(F4
1a150 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
1a160 5b 20 35 5d 2b 30 78 66 63 39 33 61 30 33 39 2c  [ 5]+0xfc93a039,
1a170 20 32 31 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   21);.        MD
1a180 35 53 54 45 50 28 46 34 2c 20 61 2c 20 62 2c 20  5STEP(F4, a, b, 
1a190 63 2c 20 64 2c 20 69 6e 5b 31 32 5d 2b 30 78 36  c, d, in[12]+0x6
1a1a0 35 35 62 35 39 63 33 2c 20 20 36 29 3b 0a 20 20  55b59c3,  6);.  
1a1b0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34        MD5STEP(F4
1a1c0 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
1a1d0 5b 20 33 5d 2b 30 78 38 66 30 63 63 63 39 32 2c  [ 3]+0x8f0ccc92,
1a1e0 20 31 30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   10);.        MD
1a1f0 35 53 54 45 50 28 46 34 2c 20 63 2c 20 64 2c 20  5STEP(F4, c, d, 
1a200 61 2c 20 62 2c 20 69 6e 5b 31 30 5d 2b 30 78 66  a, b, in[10]+0xf
1a210 66 65 66 66 34 37 64 2c 20 31 35 29 3b 0a 20 20  feff47d, 15);.  
1a220 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34        MD5STEP(F4
1a230 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
1a240 5b 20 31 5d 2b 30 78 38 35 38 34 35 64 64 31 2c  [ 1]+0x85845dd1,
1a250 20 32 31 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   21);.        MD
1a260 35 53 54 45 50 28 46 34 2c 20 61 2c 20 62 2c 20  5STEP(F4, a, b, 
1a270 63 2c 20 64 2c 20 69 6e 5b 20 38 5d 2b 30 78 36  c, d, in[ 8]+0x6
1a280 66 61 38 37 65 34 66 2c 20 20 36 29 3b 0a 20 20  fa87e4f,  6);.  
1a290 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34        MD5STEP(F4
1a2a0 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
1a2b0 5b 31 35 5d 2b 30 78 66 65 32 63 65 36 65 30 2c  [15]+0xfe2ce6e0,
1a2c0 20 31 30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   10);.        MD
1a2d0 35 53 54 45 50 28 46 34 2c 20 63 2c 20 64 2c 20  5STEP(F4, c, d, 
1a2e0 61 2c 20 62 2c 20 69 6e 5b 20 36 5d 2b 30 78 61  a, b, in[ 6]+0xa
1a2f0 33 30 31 34 33 31 34 2c 20 31 35 29 3b 0a 20 20  3014314, 15);.  
1a300 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34        MD5STEP(F4
1a310 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
1a320 5b 31 33 5d 2b 30 78 34 65 30 38 31 31 61 31 2c  [13]+0x4e0811a1,
1a330 20 32 31 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   21);.        MD
1a340 35 53 54 45 50 28 46 34 2c 20 61 2c 20 62 2c 20  5STEP(F4, a, b, 
1a350 63 2c 20 64 2c 20 69 6e 5b 20 34 5d 2b 30 78 66  c, d, in[ 4]+0xf
1a360 37 35 33 37 65 38 32 2c 20 20 36 29 3b 0a 20 20  7537e82,  6);.  
1a370 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34        MD5STEP(F4
1a380 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
1a390 5b 31 31 5d 2b 30 78 62 64 33 61 66 32 33 35 2c  [11]+0xbd3af235,
1a3a0 20 31 30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   10);.        MD
1a3b0 35 53 54 45 50 28 46 34 2c 20 63 2c 20 64 2c 20  5STEP(F4, c, d, 
1a3c0 61 2c 20 62 2c 20 69 6e 5b 20 32 5d 2b 30 78 32  a, b, in[ 2]+0x2
1a3d0 61 64 37 64 32 62 62 2c 20 31 35 29 3b 0a 20 20  ad7d2bb, 15);.  
1a3e0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34        MD5STEP(F4
1a3f0 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
1a400 5b 20 39 5d 2b 30 78 65 62 38 36 64 33 39 31 2c  [ 9]+0xeb86d391,
1a410 20 32 31 29 3b 0a 0a 20 20 20 20 20 20 20 20 62   21);..        b
1a420 75 66 5b 30 5d 20 2b 3d 20 61 3b 0a 20 20 20 20  uf[0] += a;.    
1a430 20 20 20 20 62 75 66 5b 31 5d 20 2b 3d 20 62 3b      buf[1] += b;
1a440 0a 20 20 20 20 20 20 20 20 62 75 66 5b 32 5d 20  .        buf[2] 
1a450 2b 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 62 75  += c;.        bu
1a460 66 5b 33 5d 20 2b 3d 20 64 3b 0a 7d 0a 0a 2f 2a  f[3] += d;.}../*
1a470 0a 20 2a 20 53 74 61 72 74 20 4d 44 35 20 61 63  . * Start MD5 ac
1a480 63 75 6d 75 6c 61 74 69 6f 6e 2e 20 20 53 65 74  cumulation.  Set
1a490 20 62 69 74 20 63 6f 75 6e 74 20 74 6f 20 30 20   bit count to 0 
1a4a0 61 6e 64 20 62 75 66 66 65 72 20 74 6f 20 6d 79  and buffer to my
1a4b0 73 74 65 72 69 6f 75 73 0a 20 2a 20 69 6e 69 74  sterious. * init
1a4c0 69 61 6c 69 7a 61 74 69 6f 6e 20 63 6f 6e 73 74  ialization const
1a4d0 61 6e 74 73 2e 0a 20 2a 2f 0a 73 74 61 74 69 63  ants.. */.static
1a4e0 20 76 6f 69 64 20 4d 44 35 49 6e 69 74 28 4d 44   void MD5Init(MD
1a4f0 35 43 6f 6e 74 65 78 74 20 2a 63 74 78 29 7b 0a  5Context *ctx){.
1a500 20 20 20 20 20 20 20 20 63 74 78 2d 3e 69 73 49          ctx->isI
1a510 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  nit = 1;.       
1a520 20 63 74 78 2d 3e 62 75 66 5b 30 5d 20 3d 20 30   ctx->buf[0] = 0
1a530 78 36 37 34 35 32 33 30 31 3b 0a 20 20 20 20 20  x67452301;.     
1a540 20 20 20 63 74 78 2d 3e 62 75 66 5b 31 5d 20 3d     ctx->buf[1] =
1a550 20 30 78 65 66 63 64 61 62 38 39 3b 0a 20 20 20   0xefcdab89;.   
1a560 20 20 20 20 20 63 74 78 2d 3e 62 75 66 5b 32 5d       ctx->buf[2]
1a570 20 3d 20 30 78 39 38 62 61 64 63 66 65 3b 0a 20   = 0x98badcfe;. 
1a580 20 20 20 20 20 20 20 63 74 78 2d 3e 62 75 66 5b         ctx->buf[
1a590 33 5d 20 3d 20 30 78 31 30 33 32 35 34 37 36 3b  3] = 0x10325476;
1a5a0 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62 69  .        ctx->bi
1a5b0 74 73 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20  ts[0] = 0;.     
1a5c0 20 20 20 63 74 78 2d 3e 62 69 74 73 5b 31 5d 20     ctx->bits[1] 
1a5d0 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 55 70  = 0;.}../*. * Up
1a5e0 64 61 74 65 20 63 6f 6e 74 65 78 74 20 74 6f 20  date context to 
1a5f0 72 65 66 6c 65 63 74 20 74 68 65 20 63 6f 6e 63  reflect the conc
1a600 61 74 65 6e 61 74 69 6f 6e 20 6f 66 20 61 6e 6f  atenation of ano
1a610 74 68 65 72 20 62 75 66 66 65 72 20 66 75 6c 6c  ther buffer full
1a620 0a 20 2a 20 6f 66 20 62 79 74 65 73 2e 0a 20 2a  . * of bytes.. *
1a630 2f 0a 73 74 61 74 69 63 20 0a 76 6f 69 64 20 4d  /.static .void M
1a640 44 35 55 70 64 61 74 65 28 4d 44 35 43 6f 6e 74  D5Update(MD5Cont
1a650 65 78 74 20 2a 63 74 78 2c 20 63 6f 6e 73 74 20  ext *ctx, const 
1a660 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62  unsigned char *b
1a670 75 66 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  uf, unsigned int
1a680 20 6c 65 6e 29 7b 0a 20 20 20 20 20 20 20 20 75   len){.        u
1a690 69 6e 74 33 32 20 74 3b 0a 0a 20 20 20 20 20 20  int32 t;..      
1a6a0 20 20 2f 2a 20 55 70 64 61 74 65 20 62 69 74 63    /* Update bitc
1a6b0 6f 75 6e 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20  ount */..       
1a6c0 20 74 20 3d 20 63 74 78 2d 3e 62 69 74 73 5b 30   t = ctx->bits[0
1a6d0 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28 28  ];.        if ((
1a6e0 63 74 78 2d 3e 62 69 74 73 5b 30 5d 20 3d 20 74  ctx->bits[0] = t
1a6f0 20 2b 20 28 28 75 69 6e 74 33 32 29 6c 65 6e 20   + ((uint32)len 
1a700 3c 3c 20 33 29 29 20 3c 20 74 29 0a 20 20 20 20  << 3)) < t).    
1a710 20 20 20 20 20 20 20 20 20 20 20 20 63 74 78 2d              ctx-
1a720 3e 62 69 74 73 5b 31 5d 2b 2b 3b 20 2f 2a 20 43  >bits[1]++; /* C
1a730 61 72 72 79 20 66 72 6f 6d 20 6c 6f 77 20 74 6f  arry from low to
1a740 20 68 69 67 68 20 2a 2f 0a 20 20 20 20 20 20 20   high */.       
1a750 20 63 74 78 2d 3e 62 69 74 73 5b 31 5d 20 2b 3d   ctx->bits[1] +=
1a760 20 6c 65 6e 20 3e 3e 20 32 39 3b 0a 0a 20 20 20   len >> 29;..   
1a770 20 20 20 20 20 74 20 3d 20 28 74 20 3e 3e 20 33       t = (t >> 3
1a780 29 20 26 20 30 78 33 66 3b 20 20 20 20 2f 2a 20  ) & 0x3f;    /* 
1a790 42 79 74 65 73 20 61 6c 72 65 61 64 79 20 69 6e  Bytes already in
1a7a0 20 73 68 73 49 6e 66 6f 2d 3e 64 61 74 61 20 2a   shsInfo->data *
1a7b0 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 48 61  /..        /* Ha
1a7c0 6e 64 6c 65 20 61 6e 79 20 6c 65 61 64 69 6e 67  ndle any leading
1a7d0 20 6f 64 64 2d 73 69 7a 65 64 20 63 68 75 6e 6b   odd-sized chunk
1a7e0 73 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 69 66  s */..        if
1a7f0 20 28 20 74 20 29 20 7b 0a 20 20 20 20 20 20 20   ( t ) {.       
1a800 20 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65           unsigne
1a810 64 20 63 68 61 72 20 2a 70 20 3d 20 28 75 6e 73  d char *p = (uns
1a820 69 67 6e 65 64 20 63 68 61 72 20 2a 29 63 74 78  igned char *)ctx
1a830 2d 3e 69 6e 20 2b 20 74 3b 0a 0a 20 20 20 20 20  ->in + t;..     
1a840 20 20 20 20 20 20 20 20 20 20 20 74 20 3d 20 36             t = 6
1a850 34 2d 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  4-t;.           
1a860 20 20 20 20 20 69 66 20 28 6c 65 6e 20 3c 20 74       if (len < t
1a870 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
1a880 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
1a890 70 79 28 70 2c 20 62 75 66 2c 20 6c 65 6e 29 3b  py(p, buf, len);
1a8a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a8b0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b           return;
1a8c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a8d0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
1a8e0 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 62 75 66     memcpy(p, buf
1a8f0 2c 20 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , t);.          
1a900 20 20 20 20 20 20 62 79 74 65 52 65 76 65 72 73        byteRevers
1a910 65 28 63 74 78 2d 3e 69 6e 2c 20 31 36 29 3b 0a  e(ctx->in, 16);.
1a920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a930 4d 44 35 54 72 61 6e 73 66 6f 72 6d 28 63 74 78  MD5Transform(ctx
1a940 2d 3e 62 75 66 2c 20 28 75 69 6e 74 33 32 20 2a  ->buf, (uint32 *
1a950 29 63 74 78 2d 3e 69 6e 29 3b 0a 20 20 20 20 20  )ctx->in);.     
1a960 20 20 20 20 20 20 20 20 20 20 20 62 75 66 20 2b             buf +
1a970 3d 20 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = t;.           
1a980 20 20 20 20 20 6c 65 6e 20 2d 3d 20 74 3b 0a 20       len -= t;. 
1a990 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1a9a0 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 64 61 74    /* Process dat
1a9b0 61 20 69 6e 20 36 34 2d 62 79 74 65 20 63 68 75  a in 64-byte chu
1a9c0 6e 6b 73 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  nks */..        
1a9d0 77 68 69 6c 65 20 28 6c 65 6e 20 3e 3d 20 36 34  while (len >= 64
1a9e0 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
1a9f0 20 20 20 20 6d 65 6d 63 70 79 28 63 74 78 2d 3e      memcpy(ctx->
1aa00 69 6e 2c 20 62 75 66 2c 20 36 34 29 3b 0a 20 20  in, buf, 64);.  
1aa10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 79                by
1aa20 74 65 52 65 76 65 72 73 65 28 63 74 78 2d 3e 69  teReverse(ctx->i
1aa30 6e 2c 20 31 36 29 3b 0a 20 20 20 20 20 20 20 20  n, 16);.        
1aa40 20 20 20 20 20 20 20 20 4d 44 35 54 72 61 6e 73          MD5Trans
1aa50 66 6f 72 6d 28 63 74 78 2d 3e 62 75 66 2c 20 28  form(ctx->buf, (
1aa60 75 69 6e 74 33 32 20 2a 29 63 74 78 2d 3e 69 6e  uint32 *)ctx->in
1aa70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1aa80 20 20 20 62 75 66 20 2b 3d 20 36 34 3b 0a 20 20     buf += 64;.  
1aa90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 65                le
1aaa0 6e 20 2d 3d 20 36 34 3b 0a 20 20 20 20 20 20 20  n -= 64;.       
1aab0 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 48   }..        /* H
1aac0 61 6e 64 6c 65 20 61 6e 79 20 72 65 6d 61 69 6e  andle any remain
1aad0 69 6e 67 20 62 79 74 65 73 20 6f 66 20 64 61 74  ing bytes of dat
1aae0 61 2e 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 6d  a. */..        m
1aaf0 65 6d 63 70 79 28 63 74 78 2d 3e 69 6e 2c 20 62  emcpy(ctx->in, b
1ab00 75 66 2c 20 6c 65 6e 29 3b 0a 7d 0a 0a 2f 2a 0a  uf, len);.}../*.
1ab10 20 2a 20 46 69 6e 61 6c 20 77 72 61 70 75 70 20   * Final wrapup 
1ab20 2d 20 70 61 64 20 74 6f 20 36 34 2d 62 79 74 65  - pad to 64-byte
1ab30 20 62 6f 75 6e 64 61 72 79 20 77 69 74 68 20 74   boundary with t
1ab40 68 65 20 62 69 74 20 70 61 74 74 65 72 6e 20 0a  he bit pattern .
1ab50 20 2a 20 31 20 30 2a 20 28 36 34 2d 62 69 74 20   * 1 0* (64-bit 
1ab60 63 6f 75 6e 74 20 6f 66 20 62 69 74 73 20 70 72  count of bits pr
1ab70 6f 63 65 73 73 65 64 2c 20 4d 53 42 2d 66 69 72  ocessed, MSB-fir
1ab80 73 74 29 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76  st). */.static v
1ab90 6f 69 64 20 4d 44 35 46 69 6e 61 6c 28 75 6e 73  oid MD5Final(uns
1aba0 69 67 6e 65 64 20 63 68 61 72 20 64 69 67 65 73  igned char diges
1abb0 74 5b 31 36 5d 2c 20 4d 44 35 43 6f 6e 74 65 78  t[16], MD5Contex
1abc0 74 20 2a 63 74 78 29 7b 0a 20 20 20 20 20 20 20  t *ctx){.       
1abd0 20 75 6e 73 69 67 6e 65 64 20 63 6f 75 6e 74 3b   unsigned count;
1abe0 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65  .        unsigne
1abf0 64 20 63 68 61 72 20 2a 70 3b 0a 0a 20 20 20 20  d char *p;..    
1ac00 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 6e      /* Compute n
1ac10 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6d  umber of bytes m
1ac20 6f 64 20 36 34 20 2a 2f 0a 20 20 20 20 20 20 20  od 64 */.       
1ac30 20 63 6f 75 6e 74 20 3d 20 28 63 74 78 2d 3e 62   count = (ctx->b
1ac40 69 74 73 5b 30 5d 20 3e 3e 20 33 29 20 26 20 30  its[0] >> 3) & 0
1ac50 78 33 46 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  x3F;..        /*
1ac60 20 53 65 74 20 74 68 65 20 66 69 72 73 74 20 63   Set the first c
1ac70 68 61 72 20 6f 66 20 70 61 64 64 69 6e 67 20 74  har of padding t
1ac80 6f 20 30 78 38 30 2e 20 20 54 68 69 73 20 69 73  o 0x80.  This is
1ac90 20 73 61 66 65 20 73 69 6e 63 65 20 74 68 65 72   safe since ther
1aca0 65 20 69 73 0a 20 20 20 20 20 20 20 20 20 20 20  e is.           
1acb0 61 6c 77 61 79 73 20 61 74 20 6c 65 61 73 74 20  always at least 
1acc0 6f 6e 65 20 62 79 74 65 20 66 72 65 65 20 2a 2f  one byte free */
1acd0 0a 20 20 20 20 20 20 20 20 70 20 3d 20 63 74 78  .        p = ctx
1ace0 2d 3e 69 6e 20 2b 20 63 6f 75 6e 74 3b 0a 20 20  ->in + count;.  
1acf0 20 20 20 20 20 20 2a 70 2b 2b 20 3d 20 30 78 38        *p++ = 0x8
1ad00 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 42  0;..        /* B
1ad10 79 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67 20  ytes of padding 
1ad20 6e 65 65 64 65 64 20 74 6f 20 6d 61 6b 65 20 36  needed to make 6
1ad30 34 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20  4 bytes */.     
1ad40 20 20 20 63 6f 75 6e 74 20 3d 20 36 34 20 2d 20     count = 64 - 
1ad50 31 20 2d 20 63 6f 75 6e 74 3b 0a 0a 20 20 20 20  1 - count;..    
1ad60 20 20 20 20 2f 2a 20 50 61 64 20 6f 75 74 20 74      /* Pad out t
1ad70 6f 20 35 36 20 6d 6f 64 20 36 34 20 2a 2f 0a 20  o 56 mod 64 */. 
1ad80 20 20 20 20 20 20 20 69 66 20 28 63 6f 75 6e 74         if (count
1ad90 20 3c 20 38 29 20 7b 0a 20 20 20 20 20 20 20 20   < 8) {.        
1ada0 20 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20 6c          /* Two l
1adb0 6f 74 73 20 6f 66 20 70 61 64 64 69 6e 67 3a 20  ots of padding: 
1adc0 20 50 61 64 20 74 68 65 20 66 69 72 73 74 20 62   Pad the first b
1add0 6c 6f 63 6b 20 74 6f 20 36 34 20 62 79 74 65 73  lock to 64 bytes
1ade0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1adf0 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c      memset(p, 0,
1ae00 20 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 20   count);.       
1ae10 20 20 20 20 20 20 20 20 20 62 79 74 65 52 65 76           byteRev
1ae20 65 72 73 65 28 63 74 78 2d 3e 69 6e 2c 20 31 36  erse(ctx->in, 16
1ae30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1ae40 20 20 20 4d 44 35 54 72 61 6e 73 66 6f 72 6d 28     MD5Transform(
1ae50 63 74 78 2d 3e 62 75 66 2c 20 28 75 69 6e 74 33  ctx->buf, (uint3
1ae60 32 20 2a 29 63 74 78 2d 3e 69 6e 29 3b 0a 0a 20  2 *)ctx->in);.. 
1ae70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ae80 2a 20 4e 6f 77 20 66 69 6c 6c 20 74 68 65 20 6e  * Now fill the n
1ae90 65 78 74 20 62 6c 6f 63 6b 20 77 69 74 68 20 35  ext block with 5
1aea0 36 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20  6 bytes */.     
1aeb0 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65             memse
1aec0 74 28 63 74 78 2d 3e 69 6e 2c 20 30 2c 20 35 36  t(ctx->in, 0, 56
1aed0 29 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  );.        } els
1aee0 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e {.            
1aef0 20 20 20 20 2f 2a 20 50 61 64 20 62 6c 6f 63 6b      /* Pad block
1af00 20 74 6f 20 35 36 20 62 79 74 65 73 20 2a 2f 0a   to 56 bytes */.
1af10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 63 6f 75  memset(p, 0, cou
1af30 6e 74 2d 38 29 3b 0a 20 20 20 20 20 20 20 20 7d  nt-8);.        }
1af40 0a 20 20 20 20 20 20 20 20 62 79 74 65 52 65 76  .        byteRev
1af50 65 72 73 65 28 63 74 78 2d 3e 69 6e 2c 20 31 34  erse(ctx->in, 14
1af60 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41  );..        /* A
1af70 70 70 65 6e 64 20 6c 65 6e 67 74 68 20 69 6e 20  ppend length in 
1af80 62 69 74 73 20 61 6e 64 20 74 72 61 6e 73 66 6f  bits and transfo
1af90 72 6d 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65  rm */.        me
1afa0 6d 63 70 79 28 63 74 78 2d 3e 69 6e 20 2b 20 31  mcpy(ctx->in + 1
1afb0 34 2a 34 2c 20 63 74 78 2d 3e 62 69 74 73 2c 20  4*4, ctx->bits, 
1afc0 38 29 3b 0a 0a 20 20 20 20 20 20 20 20 4d 44 35  8);..        MD5
1afd0 54 72 61 6e 73 66 6f 72 6d 28 63 74 78 2d 3e 62  Transform(ctx->b
1afe0 75 66 2c 20 28 75 69 6e 74 33 32 20 2a 29 63 74  uf, (uint32 *)ct
1aff0 78 2d 3e 69 6e 29 3b 0a 20 20 20 20 20 20 20 20  x->in);.        
1b000 62 79 74 65 52 65 76 65 72 73 65 28 28 75 6e 73  byteReverse((uns
1b010 69 67 6e 65 64 20 63 68 61 72 20 2a 29 63 74 78  igned char *)ctx
1b020 2d 3e 62 75 66 2c 20 34 29 3b 0a 20 20 20 20 20  ->buf, 4);.     
1b030 20 20 20 6d 65 6d 63 70 79 28 64 69 67 65 73 74     memcpy(digest
1b040 2c 20 63 74 78 2d 3e 62 75 66 2c 20 31 36 29 3b  , ctx->buf, 16);
1b050 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
1b060 74 20 61 20 31 32 38 2d 62 69 74 20 4d 44 35 20  t a 128-bit MD5 
1b070 64 69 67 65 73 74 20 69 6e 74 6f 20 61 20 33 32  digest into a 32
1b080 2d 64 69 67 69 74 20 62 61 73 65 2d 31 36 20 6e  -digit base-16 n
1b090 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  umber..*/.static
1b0a0 20 76 6f 69 64 20 4d 44 35 44 69 67 65 73 74 54   void MD5DigestT
1b0b0 6f 42 61 73 65 31 36 28 75 6e 73 69 67 6e 65 64  oBase16(unsigned
1b0c0 20 63 68 61 72 20 2a 64 69 67 65 73 74 2c 20 63   char *digest, c
1b0d0 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74  har *zBuf){.  st
1b0e0 61 74 69 63 20 63 68 61 72 20 63 6f 6e 73 74 20  atic char const 
1b0f0 7a 45 6e 63 6f 64 65 5b 5d 20 3d 20 22 30 31 32  zEncode[] = "012
1b100 33 34 35 36 37 38 39 61 62 63 64 65 66 22 3b 0a  3456789abcdef";.
1b110 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20 66    int i, j;..  f
1b120 6f 72 28 6a 3d 69 3d 30 3b 20 69 3c 31 36 3b 20  or(j=i=0; i<16; 
1b130 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 61 20  i++){.    int a 
1b140 3d 20 64 69 67 65 73 74 5b 69 5d 3b 0a 20 20 20  = digest[i];.   
1b150 20 7a 42 75 66 5b 6a 2b 2b 5d 20 3d 20 7a 45 6e   zBuf[j++] = zEn
1b160 63 6f 64 65 5b 28 61 3e 3e 34 29 26 30 78 66 5d  code[(a>>4)&0xf]
1b170 3b 0a 20 20 20 20 7a 42 75 66 5b 6a 2b 2b 5d 20  ;.    zBuf[j++] 
1b180 3d 20 7a 45 6e 63 6f 64 65 5b 61 20 26 20 30 78  = zEncode[a & 0x
1b190 66 5d 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 6a  f];.  }.  zBuf[j
1b1a0 5d 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  ] = 0;.}.../*.**
1b1b0 20 43 6f 6e 76 65 72 74 20 61 20 31 32 38 2d 62   Convert a 128-b
1b1c0 69 74 20 4d 44 35 20 64 69 67 65 73 74 20 69 6e  it MD5 digest in
1b1d0 74 6f 20 73 65 71 75 65 6e 63 79 20 6f 66 20 65  to sequency of e
1b1e0 69 67 68 74 20 35 2d 64 69 67 69 74 20 69 6e 74  ight 5-digit int
1b1f0 65 67 65 72 73 0a 2a 2a 20 65 61 63 68 20 72 65  egers.** each re
1b200 70 72 65 73 65 6e 74 69 6e 67 20 31 36 20 62 69  presenting 16 bi
1b210 74 73 20 6f 66 20 74 68 65 20 64 69 67 65 73 74  ts of the digest
1b220 20 61 6e 64 20 73 65 70 61 72 61 74 65 64 20 66   and separated f
1b230 72 6f 6d 20 65 61 63 68 0a 2a 2a 20 6f 74 68 65  rom each.** othe
1b240 72 20 62 79 20 61 20 22 2d 22 20 63 68 61 72 61  r by a "-" chara
1b250 63 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cter..*/.static 
1b260 76 6f 69 64 20 4d 44 35 44 69 67 65 73 74 54 6f  void MD5DigestTo
1b270 42 61 73 65 31 30 78 38 28 75 6e 73 69 67 6e 65  Base10x8(unsigne
1b280 64 20 63 68 61 72 20 64 69 67 65 73 74 5b 31 36  d char digest[16
1b290 5d 2c 20 63 68 61 72 20 7a 44 69 67 65 73 74 5b  ], char zDigest[
1b2a0 35 30 5d 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  50]){.  int i, j
1b2b0 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ;.  unsigned int
1b2c0 20 78 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b   x;.  for(i=j=0;
1b2d0 20 69 3c 31 36 3b 20 69 2b 3d 32 29 7b 0a 20 20   i<16; i+=2){.  
1b2e0 20 20 78 20 3d 20 64 69 67 65 73 74 5b 69 5d 2a    x = digest[i]*
1b2f0 32 35 36 20 2b 20 64 69 67 65 73 74 5b 69 2b 31  256 + digest[i+1
1b300 5d 3b 0a 20 20 20 20 69 66 28 20 69 3e 30 20 29  ];.    if( i>0 )
1b310 20 7a 44 69 67 65 73 74 5b 6a 2b 2b 5d 20 3d 20   zDigest[j++] = 
1b320 27 2d 27 3b 0a 20 20 20 20 73 70 72 69 6e 74 66  '-';.    sprintf
1b330 28 26 7a 44 69 67 65 73 74 5b 6a 5d 2c 20 22 25  (&zDigest[j], "%
1b340 30 35 75 22 2c 20 78 29 3b 0a 20 20 20 20 6a 20  05u", x);.    j 
1b350 2b 3d 20 35 3b 0a 20 20 7d 0a 20 20 7a 44 69 67  += 5;.  }.  zDig
1b360 65 73 74 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f  est[j] = 0;.}../
1b370 2a 0a 2a 2a 20 41 20 54 43 4c 20 63 6f 6d 6d 61  *.** A TCL comma
1b380 6e 64 20 66 6f 72 20 6d 64 35 2e 20 20 54 68 65  nd for md5.  The
1b390 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
1b3a0 20 74 65 78 74 20 74 6f 20 62 65 20 68 61 73 68   text to be hash
1b3b0 65 64 2e 20 20 54 68 65 0a 2a 2a 20 52 65 73 75  ed.  The.** Resu
1b3c0 6c 74 20 69 73 20 74 68 65 20 68 61 73 68 20 69  lt is the hash i
1b3d0 6e 20 62 61 73 65 36 34 2e 20 20 0a 2a 2f 0a 73  n base64.  .*/.s
1b3e0 74 61 74 69 63 20 69 6e 74 20 6d 64 35 5f 63 6d  tatic int md5_cm
1b3f0 64 28 76 6f 69 64 2a 63 64 2c 20 54 63 6c 5f 49  d(void*cd, Tcl_I
1b400 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
1b410 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63  nt argc, const c
1b420 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 4d  har **argv){.  M
1b430 44 35 43 6f 6e 74 65 78 74 20 63 74 78 3b 0a 20  D5Context ctx;. 
1b440 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64   unsigned char d
1b450 69 67 65 73 74 5b 31 36 5d 3b 0a 20 20 63 68 61  igest[16];.  cha
1b460 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 76 6f  r zBuf[50];.  vo
1b470 69 64 20 28 2a 63 6f 6e 76 65 72 74 65 72 29 28  id (*converter)(
1b480 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 2c 20  unsigned char*, 
1b490 63 68 61 72 2a 29 3b 0a 0a 20 20 69 66 28 20 61  char*);..  if( a
1b4a0 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  rgc!=2 ){.    Tc
1b4b0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1b4c0 6e 74 65 72 70 2c 22 77 72 6f 6e 67 20 23 20 61  nterp,"wrong # a
1b4d0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1b4e0 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20  "", argv[0], .  
1b4f0 20 20 20 20 20 20 22 20 54 45 58 54 5c 22 22 2c        " TEXT\"",
1b500 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1b510 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1b520 20 4d 44 35 49 6e 69 74 28 26 63 74 78 29 3b 0a   MD5Init(&ctx);.
1b530 20 20 4d 44 35 55 70 64 61 74 65 28 26 63 74 78    MD5Update(&ctx
1b540 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
1b550 2a 29 61 72 67 76 5b 31 5d 2c 20 28 75 6e 73 69  *)argv[1], (unsi
1b560 67 6e 65 64 29 73 74 72 6c 65 6e 28 61 72 67 76  gned)strlen(argv
1b570 5b 31 5d 29 29 3b 0a 20 20 4d 44 35 46 69 6e 61  [1]));.  MD5Fina
1b580 6c 28 64 69 67 65 73 74 2c 20 26 63 74 78 29 3b  l(digest, &ctx);
1b590 0a 20 20 63 6f 6e 76 65 72 74 65 72 20 3d 20 28  .  converter = (
1b5a0 76 6f 69 64 28 2a 29 28 75 6e 73 69 67 6e 65 64  void(*)(unsigned
1b5b0 20 63 68 61 72 2a 2c 63 68 61 72 2a 29 29 63 64   char*,char*))cd
1b5c0 3b 0a 20 20 63 6f 6e 76 65 72 74 65 72 28 64 69  ;.  converter(di
1b5d0 67 65 73 74 2c 20 7a 42 75 66 29 3b 0a 20 20 54  gest, zBuf);.  T
1b5e0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1b5f0 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 28 63  interp, zBuf, (c
1b600 68 61 72 2a 29 30 29 3b 0a 20 20 72 65 74 75 72  har*)0);.  retur
1b610 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1b620 2a 2a 20 41 20 54 43 4c 20 63 6f 6d 6d 61 6e 64  ** A TCL command
1b630 20 74 6f 20 74 61 6b 65 20 74 68 65 20 6d 64 35   to take the md5
1b640 20 68 61 73 68 20 6f 66 20 61 20 66 69 6c 65 2e   hash of a file.
1b650 20 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69    The argument i
1b660 73 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66  s the.** name of
1b670 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74   the file..*/.st
1b680 61 74 69 63 20 69 6e 74 20 6d 64 35 66 69 6c 65  atic int md5file
1b690 5f 63 6d 64 28 76 6f 69 64 2a 63 64 2c 20 54 63  _cmd(void*cd, Tc
1b6a0 6c 5f 49 6e 74 65 72 70 2a 69 6e 74 65 72 70 2c  l_Interp*interp,
1b6b0 20 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73 74   int argc, const
1b6c0 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20   char **argv){. 
1b6d0 20 46 49 4c 45 20 2a 69 6e 3b 0a 20 20 4d 44 35   FILE *in;.  MD5
1b6e0 43 6f 6e 74 65 78 74 20 63 74 78 3b 0a 20 20 76  Context ctx;.  v
1b6f0 6f 69 64 20 28 2a 63 6f 6e 76 65 72 74 65 72 29  oid (*converter)
1b700 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 2c  (unsigned char*,
1b710 20 63 68 61 72 2a 29 3b 0a 20 20 75 6e 73 69 67   char*);.  unsig
1b720 6e 65 64 20 63 68 61 72 20 64 69 67 65 73 74 5b  ned char digest[
1b730 31 36 5d 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  16];.  char zBuf
1b740 5b 31 30 32 34 30 5d 3b 0a 0a 20 20 69 66 28 20  [10240];..  if( 
1b750 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  argc!=2 ){.    T
1b760 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1b770 69 6e 74 65 72 70 2c 22 77 72 6f 6e 67 20 23 20  interp,"wrong # 
1b780 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1b790 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20  \"", argv[0], . 
1b7a0 20 20 20 20 20 20 20 22 20 46 49 4c 45 4e 41 4d         " FILENAM
1b7b0 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  E\"", 0);.    re
1b7c0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1b7d0 20 20 7d 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e    }.  in = fopen
1b7e0 28 61 72 67 76 5b 31 5d 2c 22 72 62 22 29 3b 0a  (argv[1],"rb");.
1b7f0 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20    if( in==0 ){. 
1b800 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1b810 75 6c 74 28 69 6e 74 65 72 70 2c 22 75 6e 61 62  ult(interp,"unab
1b820 6c 65 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65 20  le to open file 
1b830 5c 22 22 2c 20 61 72 67 76 5b 31 5d 2c 20 0a 20  \"", argv[1], . 
1b840 20 20 20 20 20 20 20 20 22 5c 22 20 66 6f 72 20          "\" for 
1b850 72 65 61 64 69 6e 67 22 2c 20 30 29 3b 0a 20 20  reading", 0);.  
1b860 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1b870 4f 52 3b 0a 20 20 7d 0a 20 20 4d 44 35 49 6e 69  OR;.  }.  MD5Ini
1b880 74 28 26 63 74 78 29 3b 0a 20 20 66 6f 72 28 3b  t(&ctx);.  for(;
1b890 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20  ;){.    int n;. 
1b8a0 20 20 20 6e 20 3d 20 28 69 6e 74 29 66 72 65 61     n = (int)frea
1b8b0 64 28 7a 42 75 66 2c 20 31 2c 20 73 69 7a 65 6f  d(zBuf, 1, sizeo
1b8c0 66 28 7a 42 75 66 29 2c 20 69 6e 29 3b 0a 20 20  f(zBuf), in);.  
1b8d0 20 20 69 66 28 20 6e 3c 3d 30 20 29 20 62 72 65    if( n<=0 ) bre
1b8e0 61 6b 3b 0a 20 20 20 20 4d 44 35 55 70 64 61 74  ak;.    MD5Updat
1b8f0 65 28 26 63 74 78 2c 20 28 75 6e 73 69 67 6e 65  e(&ctx, (unsigne
1b900 64 20 63 68 61 72 2a 29 7a 42 75 66 2c 20 28 75  d char*)zBuf, (u
1b910 6e 73 69 67 6e 65 64 29 6e 29 3b 0a 20 20 7d 0a  nsigned)n);.  }.
1b920 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20    fclose(in);.  
1b930 4d 44 35 46 69 6e 61 6c 28 64 69 67 65 73 74 2c  MD5Final(digest,
1b940 20 26 63 74 78 29 3b 0a 20 20 63 6f 6e 76 65 72   &ctx);.  conver
1b950 74 65 72 20 3d 20 28 76 6f 69 64 28 2a 29 28 75  ter = (void(*)(u
1b960 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 2c 63 68  nsigned char*,ch
1b970 61 72 2a 29 29 63 64 3b 0a 20 20 63 6f 6e 76 65  ar*))cd;.  conve
1b980 72 74 65 72 28 64 69 67 65 73 74 2c 20 7a 42 75  rter(digest, zBu
1b990 66 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  f);.  Tcl_Append
1b9a0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
1b9b0 42 75 66 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  Buf, (char*)0);.
1b9c0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1b9d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  .}../*.** Regist
1b9e0 65 72 20 74 68 65 20 66 6f 75 72 20 6e 65 77 20  er the four new 
1b9f0 54 43 4c 20 63 6f 6d 6d 61 6e 64 73 20 66 6f 72  TCL commands for
1ba00 20 67 65 6e 65 72 61 74 69 6e 67 20 4d 44 35 20   generating MD5 
1ba10 63 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 77 69 74  checksums.** wit
1ba20 68 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72 70  h the TCL interp
1ba30 72 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 4d 64  reter..*/.int Md
1ba40 35 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  5_Init(Tcl_Inter
1ba50 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 54 63  p *interp){.  Tc
1ba60 6c 5f 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28  l_CreateCommand(
1ba70 69 6e 74 65 72 70 2c 20 22 6d 64 35 22 2c 20 28  interp, "md5", (
1ba80 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 6d 64 35  Tcl_CmdProc*)md5
1ba90 5f 63 6d 64 2c 0a 20 20 20 20 20 20 20 20 20 20  _cmd,.          
1baa0 20 20 20 20 20 20 20 20 20 20 4d 44 35 44 69 67            MD5Dig
1bab0 65 73 74 54 6f 42 61 73 65 31 36 2c 20 30 29 3b  estToBase16, 0);
1bac0 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 43 6f 6d  .  Tcl_CreateCom
1bad0 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 6d 64  mand(interp, "md
1bae0 35 2d 31 30 78 38 22 2c 20 28 54 63 6c 5f 43 6d  5-10x8", (Tcl_Cm
1baf0 64 50 72 6f 63 2a 29 6d 64 35 5f 63 6d 64 2c 0a  dProc*)md5_cmd,.
1bb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb10 20 20 20 20 4d 44 35 44 69 67 65 73 74 54 6f 42      MD5DigestToB
1bb20 61 73 65 31 30 78 38 2c 20 30 29 3b 0a 20 20 54  ase10x8, 0);.  T
1bb30 63 6c 5f 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64  cl_CreateCommand
1bb40 28 69 6e 74 65 72 70 2c 20 22 6d 64 35 66 69 6c  (interp, "md5fil
1bb50 65 22 2c 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63  e", (Tcl_CmdProc
1bb60 2a 29 6d 64 35 66 69 6c 65 5f 63 6d 64 2c 0a 20  *)md5file_cmd,. 
1bb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb80 20 20 20 4d 44 35 44 69 67 65 73 74 54 6f 42 61     MD5DigestToBa
1bb90 73 65 31 36 2c 20 30 29 3b 0a 20 20 54 63 6c 5f  se16, 0);.  Tcl_
1bba0 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e  CreateCommand(in
1bbb0 74 65 72 70 2c 20 22 6d 64 35 66 69 6c 65 2d 31  terp, "md5file-1
1bbc0 30 78 38 22 2c 20 28 54 63 6c 5f 43 6d 64 50 72  0x8", (Tcl_CmdPr
1bbd0 6f 63 2a 29 6d 64 35 66 69 6c 65 5f 63 6d 64 2c  oc*)md5file_cmd,
1bbe0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1bbf0 20 20 20 20 20 4d 44 35 44 69 67 65 73 74 54 6f       MD5DigestTo
1bc00 42 61 73 65 31 30 78 38 2c 20 30 29 3b 0a 20 20  Base10x8, 0);.  
1bc10 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1bc20 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
1bc30 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20  ed(SQLITE_TEST) 
1bc40 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
1bc50 45 5f 54 43 4c 4d 44 35 29 20 2a 2f 0a 0a 23 69  E_TCLMD5) */..#i
1bc60 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1bc70 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 44 75 72  _TEST)./*.** Dur
1bc80 69 6e 67 20 74 65 73 74 69 6e 67 2c 20 74 68 65  ing testing, the
1bc90 20 73 70 65 63 69 61 6c 20 6d 64 35 73 75 6d 28   special md5sum(
1bca0 29 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  ) aggregate func
1bcb0 74 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c  tion is availabl
1bcc0 65 2e 0a 2a 2a 20 69 6e 73 69 64 65 20 53 51 4c  e..** inside SQL
1bcd0 69 74 65 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  ite.  The follow
1bce0 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 69 6d 70  ing routines imp
1bcf0 6c 65 6d 65 6e 74 20 74 68 61 74 20 66 75 6e 63  lement that func
1bd00 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
1bd10 76 6f 69 64 20 6d 64 35 73 74 65 70 28 73 71 6c  void md5step(sql
1bd20 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
1bd30 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
1bd40 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
1bd50 2a 61 72 67 76 29 7b 0a 20 20 4d 44 35 43 6f 6e  *argv){.  MD5Con
1bd60 74 65 78 74 20 2a 70 3b 0a 20 20 69 6e 74 20 69  text *p;.  int i
1bd70 3b 0a 20 20 69 66 28 20 61 72 67 63 3c 31 20 29  ;.  if( argc<1 )
1bd80 20 72 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20 73   return;.  p = s
1bd90 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
1bda0 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74  _context(context
1bdb0 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20  , sizeof(*p));. 
1bdc0 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
1bdd0 72 6e 3b 0a 20 20 69 66 28 20 21 70 2d 3e 69 73  rn;.  if( !p->is
1bde0 49 6e 69 74 20 29 7b 0a 20 20 20 20 4d 44 35 49  Init ){.    MD5I
1bdf0 6e 69 74 28 70 29 3b 0a 20 20 7d 0a 20 20 66 6f  nit(p);.  }.  fo
1be00 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69  r(i=0; i<argc; i
1be10 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ++){.    const c
1be20 68 61 72 20 2a 7a 44 61 74 61 20 3d 20 28 63 68  har *zData = (ch
1be30 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
1be40 65 5f 74 65 78 74 28 61 72 67 76 5b 69 5d 29 3b  e_text(argv[i]);
1be50 0a 20 20 20 20 69 66 28 20 7a 44 61 74 61 20 29  .    if( zData )
1be60 7b 0a 20 20 20 20 20 20 4d 44 35 55 70 64 61 74  {.      MD5Updat
1be70 65 28 70 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  e(p, (unsigned c
1be80 68 61 72 2a 29 7a 44 61 74 61 2c 20 28 69 6e 74  har*)zData, (int
1be90 29 73 74 72 6c 65 6e 28 7a 44 61 74 61 29 29 3b  )strlen(zData));
1bea0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61  .    }.  }.}.sta
1beb0 74 69 63 20 76 6f 69 64 20 6d 64 35 66 69 6e 61  tic void md5fina
1bec0 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e  lize(sqlite3_con
1bed0 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a  text *context){.
1bee0 20 20 4d 44 35 43 6f 6e 74 65 78 74 20 2a 70 3b    MD5Context *p;
1bef0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1bf00 20 64 69 67 65 73 74 5b 31 36 5d 3b 0a 20 20 63   digest[16];.  c
1bf10 68 61 72 20 7a 42 75 66 5b 33 33 5d 3b 0a 20 20  har zBuf[33];.  
1bf20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72  p = sqlite3_aggr
1bf30 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f  egate_context(co
1bf40 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70  ntext, sizeof(*p
1bf50 29 29 3b 0a 20 20 4d 44 35 46 69 6e 61 6c 28 64  ));.  MD5Final(d
1bf60 69 67 65 73 74 2c 70 29 3b 0a 20 20 4d 44 35 44  igest,p);.  MD5D
1bf70 69 67 65 73 74 54 6f 42 61 73 65 31 36 28 64 69  igestToBase16(di
1bf80 67 65 73 74 2c 20 7a 42 75 66 29 3b 0a 20 20 73  gest, zBuf);.  s
1bf90 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
1bfa0 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 42 75 66  xt(context, zBuf
1bfb0 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41  , -1, SQLITE_TRA
1bfc0 4e 53 49 45 4e 54 29 3b 0a 7d 0a 69 6e 74 20 4d  NSIENT);.}.int M
1bfd0 64 35 5f 52 65 67 69 73 74 65 72 28 73 71 6c 69  d5_Register(sqli
1bfe0 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20  te3 *db){.  int 
1bff0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
1c000 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
1c010 20 22 6d 64 35 73 75 6d 22 2c 20 2d 31 2c 20 53   "md5sum", -1, S
1c020 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 30  QLITE_UTF8, 0, 0
1c030 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
1c040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c050 20 20 20 20 6d 64 35 73 74 65 70 2c 20 6d 64 35      md5step, md5
1c060 66 69 6e 61 6c 69 7a 65 29 3b 0a 20 20 73 71 6c  finalize);.  sql
1c070 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75  ite3_overload_fu
1c080 6e 63 74 69 6f 6e 28 64 62 2c 20 22 6d 64 35 73  nction(db, "md5s
1c090 75 6d 22 2c 20 2d 31 29 3b 20 20 2f 2a 20 54 6f  um", -1);  /* To
1c0a0 20 65 78 65 72 63 69 73 65 20 74 68 69 73 20 41   exercise this A
1c0b0 50 49 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72  PI */.  return r
1c0c0 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64  c;.}.#endif /* d
1c0d0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
1c0e0 53 54 29 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 49  ST) */.../*.** I
1c0f0 66 20 74 68 65 20 6d 61 63 72 6f 20 54 43 4c 53  f the macro TCLS
1c100 48 20 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 70  H is one, then p
1c110 75 74 20 69 6e 20 63 6f 64 65 20 74 68 69 73 20  ut in code this 
1c120 66 6f 72 20 74 68 65 0a 2a 2a 20 22 6d 61 69 6e  for the.** "main
1c130 22 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77  " routine that w
1c140 69 6c 6c 20 69 6e 69 74 69 61 6c 69 7a 65 20 54  ill initialize T
1c150 63 6c 20 61 6e 64 20 74 61 6b 65 20 69 6e 70 75  cl and take inpu
1c160 74 20 66 72 6f 6d 0a 2a 2a 20 73 74 61 6e 64 61  t from.** standa
1c170 72 64 20 69 6e 70 75 74 2c 20 6f 72 20 69 66 20  rd input, or if 
1c180 61 20 66 69 6c 65 20 69 73 20 6e 61 6d 65 64 20  a file is named 
1c190 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c  on the command l
1c1a0 69 6e 65 0a 2a 2a 20 74 68 65 20 54 43 4c 20 69  ine.** the TCL i
1c1b0 6e 74 65 72 70 72 65 74 65 72 20 72 65 61 64 73  nterpreter reads
1c1c0 20 61 6e 64 20 65 76 61 6c 75 61 74 65 73 20 74   and evaluates t
1c1d0 68 61 74 20 66 69 6c 65 2e 0a 2a 2f 0a 23 69 66  hat file..*/.#if
1c1e0 20 54 43 4c 53 48 3d 3d 31 0a 73 74 61 74 69 63   TCLSH==1.static
1c1f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 74 63 6c   const char *tcl
1c200 73 68 5f 6d 61 69 6e 5f 6c 6f 6f 70 28 76 6f 69  sh_main_loop(voi
1c210 64 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  d){.  static con
1c220 73 74 20 63 68 61 72 20 7a 4d 61 69 6e 6c 6f 6f  st char zMainloo
1c230 70 5b 5d 20 3d 0a 20 20 20 20 22 73 65 74 20 6c  p[] =.    "set l
1c240 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20 20 20 22 77  ine {}\n".    "w
1c250 68 69 6c 65 20 7b 21 5b 65 6f 66 20 73 74 64 69  hile {![eof stdi
1c260 6e 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22  n]} {\n".      "
1c270 69 66 20 7b 24 6c 69 6e 65 21 3d 5c 22 5c 22 7d  if {$line!=\"\"}
1c280 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 70   {\n".        "p
1c290 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c  uts -nonewline \
1c2a0 22 3e 20 5c 22 5c 6e 22 0a 20 20 20 20 20 20 22  "> \"\n".      "
1c2b0 7d 20 65 6c 73 65 20 7b 5c 6e 22 0a 20 20 20 20  } else {\n".    
1c2c0 20 20 20 20 22 70 75 74 73 20 2d 6e 6f 6e 65 77      "puts -nonew
1c2d0 6c 69 6e 65 20 5c 22 25 20 5c 22 5c 6e 22 0a 20  line \"% \"\n". 
1c2e0 20 20 20 20 20 22 7d 5c 6e 22 0a 20 20 20 20 20       "}\n".     
1c2f0 20 22 66 6c 75 73 68 20 73 74 64 6f 75 74 5c 6e   "flush stdout\n
1c300 22 0a 20 20 20 20 20 20 22 61 70 70 65 6e 64 20  ".      "append 
1c310 6c 69 6e 65 20 5b 67 65 74 73 20 73 74 64 69 6e  line [gets stdin
1c320 5d 5c 6e 22 0a 20 20 20 20 20 20 22 69 66 20 7b  ]\n".      "if {
1c330 5b 69 6e 66 6f 20 63 6f 6d 70 6c 65 74 65 20 24  [info complete $
1c340 6c 69 6e 65 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20  line]} {\n".    
1c350 20 20 20 20 22 69 66 20 7b 5b 63 61 74 63 68 20      "if {[catch 
1c360 7b 75 70 6c 65 76 65 6c 20 23 30 20 24 6c 69 6e  {uplevel #0 $lin
1c370 65 7d 20 72 65 73 75 6c 74 5d 7d 20 7b 5c 6e 22  e} result]} {\n"
1c380 0a 20 20 20 20 20 20 20 20 20 20 22 70 75 74 73  .          "puts
1c390 20 73 74 64 65 72 72 20 5c 22 45 72 72 6f 72 3a   stderr \"Error:
1c3a0 20 24 72 65 73 75 6c 74 5c 22 5c 6e 22 0a 20 20   $result\"\n".  
1c3b0 20 20 20 20 20 20 22 7d 20 65 6c 73 65 69 66 20        "} elseif 
1c3c0 7b 24 72 65 73 75 6c 74 21 3d 5c 22 5c 22 7d 20  {$result!=\"\"} 
1c3d0 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 22  {\n".          "
1c3e0 70 75 74 73 20 24 72 65 73 75 6c 74 5c 6e 22 0a  puts $result\n".
1c3f0 20 20 20 20 20 20 20 20 22 7d 5c 6e 22 0a 20 20          "}\n".  
1c400 20 20 20 20 20 20 22 73 65 74 20 6c 69 6e 65 20        "set line 
1c410 7b 7d 5c 6e 22 0a 20 20 20 20 20 20 22 7d 20 65  {}\n".      "} e
1c420 6c 73 65 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20  lse {\n".       
1c430 20 22 61 70 70 65 6e 64 20 6c 69 6e 65 20 5c 5c   "append line \\
1c440 6e 5c 6e 22 0a 20 20 20 20 20 20 22 7d 5c 6e 22  n\n".      "}\n"
1c450 0a 20 20 20 20 22 7d 5c 6e 22 0a 20 20 3b 0a 20  .    "}\n".  ;. 
1c460 20 72 65 74 75 72 6e 20 7a 4d 61 69 6e 6c 6f 6f   return zMainloo
1c470 70 3b 0a 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20  p;.}.#endif.#if 
1c480 54 43 4c 53 48 3d 3d 32 0a 73 74 61 74 69 63 20  TCLSH==2.static 
1c490 63 6f 6e 73 74 20 63 68 61 72 20 2a 74 63 6c 73  const char *tcls
1c4a0 68 5f 6d 61 69 6e 5f 6c 6f 6f 70 28 76 6f 69 64  h_main_loop(void
1c4b0 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  );.#endif..#ifde
1c4c0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 73 74  f SQLITE_TEST.st
1c4d0 61 74 69 63 20 76 6f 69 64 20 69 6e 69 74 5f 61  atic void init_a
1c4e0 6c 6c 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29  ll(Tcl_Interp *)
1c4f0 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 69  ;.static int ini
1c500 74 5f 61 6c 6c 5f 63 6d 64 28 0a 20 20 43 6c 69  t_all_cmd(.  Cli
1c510 65 6e 74 44 61 74 61 20 63 64 2c 0a 20 20 54 63  entData cd,.  Tc
1c520 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1c530 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1c540 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1c550 62 6a 76 5b 5d 0a 29 7b 0a 0a 20 20 54 63 6c 5f  bjv[].){..  Tcl_
1c560 49 6e 74 65 72 70 20 2a 73 6c 61 76 65 3b 0a 20  Interp *slave;. 
1c570 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
1c580 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
1c590 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
1c5a0 6f 62 6a 76 2c 20 22 53 4c 41 56 45 22 29 3b 0a  objv, "SLAVE");.
1c5b0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1c5c0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 73 6c 61  RROR;.  }..  sla
1c5d0 76 65 20 3d 20 54 63 6c 5f 47 65 74 53 6c 61 76  ve = Tcl_GetSlav
1c5e0 65 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  e(interp, Tcl_Ge
1c5f0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1c600 29 3b 0a 20 20 69 66 28 20 21 73 6c 61 76 65 20  );.  if( !slave 
1c610 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
1c620 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
1c630 69 6e 69 74 5f 61 6c 6c 28 73 6c 61 76 65 29 3b  init_all(slave);
1c640 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1c650 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 63 6c 63 6d  ;.}../*.** Tclcm
1c660 64 3a 20 64 62 5f 75 73 65 5f 6c 65 67 61 63 79  d: db_use_legacy
1c670 5f 70 72 65 70 61 72 65 20 44 42 20 42 4f 4f 4c  _prepare DB BOOL
1c680 45 41 4e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  EAN.**.**   The 
1c690 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  first argument t
1c6a0 6f 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 6d  o this command m
1c6b0 75 73 74 20 62 65 20 61 20 64 61 74 61 62 61 73  ust be a databas
1c6c0 65 20 63 6f 6d 6d 61 6e 64 20 63 72 65 61 74 65  e command create
1c6d0 64 20 62 79 0a 2a 2a 20 20 20 5b 73 71 6c 69 74  d by.**   [sqlit
1c6e0 65 33 5d 2e 20 49 66 20 74 68 65 20 73 65 63 6f  e3]. If the seco
1c6f0 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  nd argument is t
1c700 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 68 61  rue, then the ha
1c710 6e 64 6c 65 20 69 73 20 63 6f 6e 66 69 67 75 72  ndle is configur
1c720 65 64 0a 2a 2a 20 20 20 74 6f 20 75 73 65 20 74  ed.**   to use t
1c730 68 65 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  he sqlite3_prepa
1c740 72 65 5f 76 32 28 29 20 66 75 6e 63 74 69 6f 6e  re_v2() function
1c750 20 74 6f 20 70 72 65 70 61 72 65 20 73 74 61 74   to prepare stat
1c760 65 6d 65 6e 74 73 2e 20 49 66 20 69 74 0a 2a 2a  ements. If it.**
1c770 20 20 20 69 73 20 66 61 6c 73 65 2c 20 73 71 6c     is false, sql
1c780 69 74 65 33 5f 70 72 65 70 61 72 65 28 29 2e 0a  ite3_prepare()..
1c790 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 62  */.static int db
1c7a0 5f 75 73 65 5f 6c 65 67 61 63 79 5f 70 72 65 70  _use_legacy_prep
1c7b0 61 72 65 5f 63 6d 64 28 0a 20 20 43 6c 69 65 6e  are_cmd(.  Clien
1c7c0 74 44 61 74 61 20 63 64 2c 0a 20 20 54 63 6c 5f  tData cd,.  Tcl_
1c7d0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1c7e0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1c7f0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1c800 76 5b 5d 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d 64  v[].){.  Tcl_Cmd
1c810 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20 20  Info cmdInfo;.  
1c820 53 71 6c 69 74 65 44 62 20 2a 70 44 62 3b 0a 20  SqliteDb *pDb;. 
1c830 20 69 6e 74 20 62 50 72 65 70 61 72 65 3b 0a 0a   int bPrepare;..
1c840 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
1c850 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
1c860 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
1c870 20 6f 62 6a 76 2c 20 22 44 42 20 42 4f 4f 4c 45   objv, "DB BOOLE
1c880 41 4e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  AN");.    return
1c890 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1c8a0 0a 20 20 69 66 28 20 21 54 63 6c 5f 47 65 74 43  .  if( !Tcl_GetC
1c8b0 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72  ommandInfo(inter
1c8c0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
1c8d0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 63 6d 64 49  (objv[1]), &cmdI
1c8e0 6e 66 6f 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f  nfo) ){.    Tcl_
1c8f0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1c900 65 72 70 2c 20 22 6e 6f 20 73 75 63 68 20 64 62  erp, "no such db
1c910 3a 20 22 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  : ", Tcl_GetStri
1c920 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 28 63 68  ng(objv[1]), (ch
1c930 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75  ar*)0);.    retu
1c940 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1c950 7d 0a 20 20 70 44 62 20 3d 20 28 53 71 6c 69 74  }.  pDb = (Sqlit
1c960 65 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f 62 6a  eDb*)cmdInfo.obj
1c970 43 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 69 66  ClientData;.  if
1c980 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  ( Tcl_GetBoolean
1c990 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
1c9a0 6f 62 6a 76 5b 32 5d 2c 20 26 62 50 72 65 70 61  objv[2], &bPrepa
1c9b0 72 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  re) ){.    retur
1c9c0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1c9d0 0a 0a 20 20 70 44 62 2d 3e 62 4c 65 67 61 63 79  ..  pDb->bLegacy
1c9e0 50 72 65 70 61 72 65 20 3d 20 62 50 72 65 70 61  Prepare = bPrepa
1c9f0 72 65 3b 0a 0a 20 20 54 63 6c 5f 52 65 73 65 74  re;..  Tcl_Reset
1ca00 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
1ca10 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1ca20 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1ca30 20 43 6f 6e 66 69 67 75 72 65 20 74 68 65 20 69   Configure the i
1ca40 6e 74 65 72 70 72 65 74 65 72 20 70 61 73 73 65  nterpreter passe
1ca50 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
1ca60 72 67 75 6d 65 6e 74 20 74 6f 20 68 61 76 65 20  rgument to have 
1ca70 61 63 63 65 73 73 0a 2a 2a 20 74 6f 20 74 68 65  access.** to the
1ca80 20 63 6f 6d 6d 61 6e 64 73 20 61 6e 64 20 6c 69   commands and li
1ca90 6e 6b 65 64 20 76 61 72 69 61 62 6c 65 73 20 74  nked variables t
1caa0 68 61 74 20 6d 61 6b 65 20 75 70 3a 0a 2a 2a 0a  hat make up:.**.
1cab0 2a 2a 20 20 20 2a 20 74 68 65 20 5b 73 71 6c 69  **   * the [sqli
1cac0 74 65 33 5d 20 65 78 74 65 6e 73 69 6f 6e 20 69  te3] extension i
1cad0 74 73 65 6c 66 2c 20 0a 2a 2a 0a 2a 2a 20 20 20  tself, .**.**   
1cae0 2a 20 49 66 20 53 51 4c 49 54 45 5f 54 43 4c 4d  * If SQLITE_TCLM
1caf0 44 35 20 6f 72 20 53 51 4c 49 54 45 5f 54 45 53  D5 or SQLITE_TES
1cb00 54 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68  T is defined, th
1cb10 65 20 4d 64 35 20 63 6f 6d 6d 61 6e 64 73 2c 20  e Md5 commands, 
1cb20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66  and.**.**   * If
1cb30 20 53 51 4c 49 54 45 5f 54 45 53 54 20 69 73 20   SQLITE_TEST is 
1cb40 73 65 74 2c 20 74 68 65 20 76 61 72 69 6f 75 73  set, the various
1cb50 20 74 65 73 74 20 69 6e 74 65 72 66 61 63 65 73   test interfaces
1cb60 20 75 73 65 64 20 62 79 20 74 68 65 20 54 63 6c   used by the Tcl
1cb70 0a 2a 2a 20 20 20 20 20 74 65 73 74 20 73 75 69  .**     test sui
1cb80 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  te..*/.static vo
1cb90 69 64 20 69 6e 69 74 5f 61 6c 6c 28 54 63 6c 5f  id init_all(Tcl_
1cba0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
1cbb0 0a 20 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28  .  Sqlite3_Init(
1cbc0 69 6e 74 65 72 70 29 3b 0a 0a 23 69 66 20 64 65  interp);..#if de
1cbd0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
1cbe0 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  T) || defined(SQ
1cbf0 4c 49 54 45 5f 54 43 4c 4d 44 35 29 0a 20 20 4d  LITE_TCLMD5).  M
1cc00 64 35 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  d5_Init(interp);
1cc10 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 6e  .#endif..  /* In
1cc20 73 74 61 6c 6c 20 74 68 65 20 5b 72 65 67 69 73  stall the [regis
1cc30 74 65 72 5f 64 62 73 74 61 74 5f 76 74 61 62 5d  ter_dbstat_vtab]
1cc40 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 61 63 63 65   command to acce
1cc50 73 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ss the implement
1cc60 61 74 69 6f 6e 0a 20 20 2a 2a 20 6f 66 20 76 69  ation.  ** of vi
1cc70 72 74 75 61 6c 20 74 61 62 6c 65 20 64 62 73 74  rtual table dbst
1cc80 61 74 20 28 73 6f 75 72 63 65 20 66 69 6c 65 20  at (source file 
1cc90 74 65 73 74 5f 73 74 61 74 2e 63 29 2e 20 54 68  test_stat.c). Th
1cca0 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 20 20  is command is.  
1ccb0 2a 2a 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  ** required for 
1ccc0 74 65 73 74 66 69 78 74 75 72 65 20 61 6e 64 20  testfixture and 
1ccd0 73 71 6c 69 74 65 33 5f 61 6e 61 6c 79 7a 65 72  sqlite3_analyzer
1cce0 2c 20 62 75 74 20 6e 6f 74 20 62 79 20 74 68 65  , but not by the
1ccf0 20 70 72 6f 64 75 63 74 69 6f 6e 0a 20 20 2a 2a   production.  **
1cd00 20 54 63 6c 20 65 78 74 65 6e 73 69 6f 6e 2e 20   Tcl extension. 
1cd10 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
1cd20 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20  SQLITE_TEST) || 
1cd30 54 43 4c 53 48 3d 3d 32 0a 20 20 7b 0a 20 20 20  TCLSH==2.  {.   
1cd40 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1cd50 74 65 74 65 73 74 53 74 61 74 5f 49 6e 69 74 28  tetestStat_Init(
1cd60 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1cd70 20 20 53 71 6c 69 74 65 74 65 73 74 53 74 61 74    SqlitetestStat
1cd80 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1cd90 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65   }.#endif..#ifde
1cda0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
1cdb0 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  {.    extern int
1cdc0 20 53 71 6c 69 74 65 63 6f 6e 66 69 67 5f 49 6e   Sqliteconfig_In
1cdd0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1cde0 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1cdf0 53 71 6c 69 74 65 74 65 73 74 31 5f 49 6e 69 74  Sqlitetest1_Init
1ce00 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1ce10 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1ce20 6c 69 74 65 74 65 73 74 32 5f 49 6e 69 74 28 54  litetest2_Init(T
1ce30 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1ce40 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1ce50 74 65 74 65 73 74 33 5f 49 6e 69 74 28 54 63 6c  tetest3_Init(Tcl
1ce60 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1ce70 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1ce80 74 65 73 74 34 5f 49 6e 69 74 28 54 63 6c 5f 49  test4_Init(Tcl_I
1ce90 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1cea0 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1ceb0 73 74 35 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  st5_Init(Tcl_Int
1cec0 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1ced0 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1cee0 36 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  6_Init(Tcl_Inter
1cef0 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1cf00 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 37 5f  int Sqlitetest7_
1cf10 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1cf20 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1cf30 74 20 53 71 6c 69 74 65 74 65 73 74 38 5f 49 6e  t Sqlitetest8_In
1cf40 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1cf50 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1cf60 53 71 6c 69 74 65 74 65 73 74 39 5f 49 6e 69 74  Sqlitetest9_Init
1cf70 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1cf80 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1cf90 6c 69 74 65 74 65 73 74 61 73 79 6e 63 5f 49 6e  litetestasync_In
1cfa0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1cfb0 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1cfc0 53 71 6c 69 74 65 74 65 73 74 5f 61 75 74 6f 65  Sqlitetest_autoe
1cfd0 78 74 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  xt_Init(Tcl_Inte
1cfe0 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
1cff0 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f   int Sqlitetest_
1d000 64 65 6d 6f 76 66 73 5f 49 6e 69 74 28 54 63 6c  demovfs_Init(Tcl
1d010 5f 49 6e 74 65 72 70 20 2a 29 3b 0a 20 20 20 20  _Interp *);.    
1d020 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1d030 65 74 65 73 74 5f 66 75 6e 63 5f 49 6e 69 74 28  etest_func_Init(
1d040 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1d050 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1d060 69 74 65 74 65 73 74 5f 68 65 78 69 6f 5f 49 6e  itetest_hexio_In
1d070 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1d080 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1d090 53 71 6c 69 74 65 74 65 73 74 5f 69 6e 69 74 5f  Sqlitetest_init_
1d0a0 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1d0b0 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1d0c0 74 20 53 71 6c 69 74 65 74 65 73 74 5f 6d 61 6c  t Sqlitetest_mal
1d0d0 6c 6f 63 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  loc_Init(Tcl_Int
1d0e0 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1d0f0 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1d100 5f 6d 75 74 65 78 5f 49 6e 69 74 28 54 63 6c 5f  _mutex_Init(Tcl_
1d110 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
1d120 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1d130 65 73 74 73 63 68 65 6d 61 5f 49 6e 69 74 28 54  estschema_Init(T
1d140 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1d150 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1d160 74 65 74 65 73 74 73 73 65 5f 49 6e 69 74 28 54  tetestsse_Init(T
1d170 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1d180 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1d190 74 65 74 65 73 74 74 63 6c 76 61 72 5f 49 6e 69  tetesttclvar_Ini
1d1a0 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1d1b0 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1d1c0 71 6c 69 74 65 74 65 73 74 66 73 5f 49 6e 69 74  qlitetestfs_Init
1d1d0 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1d1e0 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1d1f0 6c 69 74 65 74 65 73 74 54 68 72 65 61 64 5f 49  litetestThread_I
1d200 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1d210 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1d220 20 53 71 6c 69 74 65 74 65 73 74 4f 6e 65 66 69   SqlitetestOnefi
1d230 6c 65 5f 49 6e 69 74 28 29 3b 0a 20 20 20 20 65  le_Init();.    e
1d240 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1d250 74 65 73 74 4f 73 69 6e 73 74 5f 49 6e 69 74 28  testOsinst_Init(
1d260 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1d270 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1d280 69 74 65 74 65 73 74 62 61 63 6b 75 70 5f 49 6e  itetestbackup_In
1d290 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1d2a0 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1d2b0 53 71 6c 69 74 65 74 65 73 74 69 6e 74 61 72 72  Sqlitetestintarr
1d2c0 61 79 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  ay_Init(Tcl_Inte
1d2d0 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
1d2e0 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 76   int Sqlitetestv
1d2f0 66 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  fs_Init(Tcl_Inte
1d300 72 70 20 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  rp *);.    exter
1d310 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1d320 72 74 72 65 65 5f 49 6e 69 74 28 54 63 6c 5f 49  rtree_Init(Tcl_I
1d330 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1d340 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 71 75  ern int Sqlitequ
1d350 6f 74 61 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  ota_Init(Tcl_Int
1d360 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1d370 6e 20 69 6e 74 20 53 71 6c 69 74 65 6d 75 6c 74  n int Sqlitemult
1d380 69 70 6c 65 78 5f 49 6e 69 74 28 54 63 6c 5f 49  iplex_Init(Tcl_I
1d390 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1d3a0 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 53 75  ern int SqliteSu
1d3b0 70 65 72 6c 6f 63 6b 5f 49 6e 69 74 28 54 63 6c  perlock_Init(Tcl
1d3c0 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1d3d0 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1d3e0 74 65 73 74 53 79 73 63 61 6c 6c 5f 49 6e 69 74  testSyscall_Init
1d3f0 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 23  (Tcl_Interp*);.#
1d400 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1d410 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e  E_ENABLE_SESSION
1d420 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
1d430 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50  ITE_ENABLE_PREUP
1d440 44 41 54 45 5f 48 4f 4f 4b 29 0a 20 20 20 20 65  DATE_HOOK).    e
1d450 78 74 65 72 6e 20 69 6e 74 20 54 65 73 74 53 65  xtern int TestSe
1d460 73 73 69 6f 6e 5f 49 6e 69 74 28 54 63 6c 5f 49  ssion_Init(Tcl_I
1d470 6e 74 65 72 70 2a 29 3b 0a 23 65 6e 64 69 66 0a  nterp*);.#endif.
1d480 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
1d490 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 29  ITE_ENABLE_FTS3)
1d4a0 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
1d4b0 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 34 29 0a  TE_ENABLE_FTS4).
1d4c0 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1d4d0 71 6c 69 74 65 74 65 73 74 66 74 73 33 5f 49 6e  qlitetestfts3_In
1d4e0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
1d4f0 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69 66 0a 0a  nterp);.#endif..
1d500 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1d510 41 42 4c 45 5f 5a 49 50 56 46 53 0a 20 20 20 20  ABLE_ZIPVFS.    
1d520 65 78 74 65 72 6e 20 69 6e 74 20 5a 69 70 76 66  extern int Zipvf
1d530 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  s_Init(Tcl_Inter
1d540 70 2a 29 3b 0a 20 20 20 20 5a 69 70 76 66 73 5f  p*);.    Zipvfs_
1d550 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 23 65  Init(interp);.#e
1d560 6e 64 69 66 0a 0a 20 20 20 20 53 71 6c 69 74 65  ndif..    Sqlite
1d570 63 6f 6e 66 69 67 5f 49 6e 69 74 28 69 6e 74 65  config_Init(inte
1d580 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
1d590 65 73 74 31 5f 49 6e 69 74 28 69 6e 74 65 72 70  est1_Init(interp
1d5a0 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1d5b0 74 32 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  t2_Init(interp);
1d5c0 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 33  .    Sqlitetest3
1d5d0 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1d5e0 20 20 20 53 71 6c 69 74 65 74 65 73 74 34 5f 49     Sqlitetest4_I
1d5f0 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1d600 20 53 71 6c 69 74 65 74 65 73 74 35 5f 49 6e 69   Sqlitetest5_Ini
1d610 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
1d620 71 6c 69 74 65 74 65 73 74 36 5f 49 6e 69 74 28  qlitetest6_Init(
1d630 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
1d640 69 74 65 74 65 73 74 37 5f 49 6e 69 74 28 69 6e  itetest7_Init(in
1d650 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
1d660 65 74 65 73 74 38 5f 49 6e 69 74 28 69 6e 74 65  etest8_Init(inte
1d670 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
1d680 65 73 74 39 5f 49 6e 69 74 28 69 6e 74 65 72 70  est9_Init(interp
1d690 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1d6a0 74 61 73 79 6e 63 5f 49 6e 69 74 28 69 6e 74 65  tasync_Init(inte
1d6b0 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
1d6c0 65 73 74 5f 61 75 74 6f 65 78 74 5f 49 6e 69 74  est_autoext_Init
1d6d0 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1d6e0 6c 69 74 65 74 65 73 74 5f 64 65 6d 6f 76 66 73  litetest_demovfs
1d6f0 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1d700 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f 66 75     Sqlitetest_fu
1d710 6e 63 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  nc_Init(interp);
1d720 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f  .    Sqlitetest_
1d730 68 65 78 69 6f 5f 49 6e 69 74 28 69 6e 74 65 72  hexio_Init(inter
1d740 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
1d750 73 74 5f 69 6e 69 74 5f 49 6e 69 74 28 69 6e 74  st_init_Init(int
1d760 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1d770 74 65 73 74 5f 6d 61 6c 6c 6f 63 5f 49 6e 69 74  test_malloc_Init
1d780 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1d790 6c 69 74 65 74 65 73 74 5f 6d 75 74 65 78 5f 49  litetest_mutex_I
1d7a0 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1d7b0 20 53 71 6c 69 74 65 74 65 73 74 73 63 68 65 6d   Sqlitetestschem
1d7c0 61 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  a_Init(interp);.
1d7d0 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 74 63      Sqlitetesttc
1d7e0 6c 76 61 72 5f 49 6e 69 74 28 69 6e 74 65 72 70  lvar_Init(interp
1d7f0 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1d800 74 66 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  tfs_Init(interp)
1d810 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1d820 54 68 72 65 61 64 5f 49 6e 69 74 28 69 6e 74 65  Thread_Init(inte
1d830 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
1d840 65 73 74 4f 6e 65 66 69 6c 65 5f 49 6e 69 74 28  estOnefile_Init(
1d850 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
1d860 69 74 65 74 65 73 74 4f 73 69 6e 73 74 5f 49 6e  itetestOsinst_In
1d870 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1d880 53 71 6c 69 74 65 74 65 73 74 62 61 63 6b 75 70  Sqlitetestbackup
1d890 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1d8a0 20 20 20 53 71 6c 69 74 65 74 65 73 74 69 6e 74     Sqlitetestint
1d8b0 61 72 72 61 79 5f 49 6e 69 74 28 69 6e 74 65 72  array_Init(inter
1d8c0 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
1d8d0 73 74 76 66 73 5f 49 6e 69 74 28 69 6e 74 65 72  stvfs_Init(inter
1d8e0 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
1d8f0 73 74 72 74 72 65 65 5f 49 6e 69 74 28 69 6e 74  strtree_Init(int
1d900 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1d910 71 75 6f 74 61 5f 49 6e 69 74 28 69 6e 74 65 72  quota_Init(inter
1d920 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 6d 75  p);.    Sqlitemu
1d930 6c 74 69 70 6c 65 78 5f 49 6e 69 74 28 69 6e 74  ltiplex_Init(int
1d940 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1d950 53 75 70 65 72 6c 6f 63 6b 5f 49 6e 69 74 28 69  Superlock_Init(i
1d960 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1d970 74 65 74 65 73 74 53 79 73 63 61 6c 6c 5f 49 6e  tetestSyscall_In
1d980 69 74 28 69 6e 74 65 72 70 29 3b 0a 23 69 66 20  it(interp);.#if 
1d990 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
1d9a0 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 20 26  NABLE_SESSION) &
1d9b0 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
1d9c0 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54  _ENABLE_PREUPDAT
1d9d0 45 5f 48 4f 4f 4b 29 0a 20 20 20 20 54 65 73 74  E_HOOK).    Test
1d9e0 53 65 73 73 69 6f 6e 5f 49 6e 69 74 28 69 6e 74  Session_Init(int
1d9f0 65 72 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  erp);.#endif..#i
1da00 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1da10 5f 45 4e 41 42 4c 45 5f 46 54 53 33 29 20 7c 7c  _ENABLE_FTS3) ||
1da20 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1da30 45 4e 41 42 4c 45 5f 46 54 53 34 29 0a 20 20 20  ENABLE_FTS4).   
1da40 20 53 71 6c 69 74 65 74 65 73 74 66 74 73 33 5f   Sqlitetestfts3_
1da50 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 23 65  Init(interp);.#e
1da60 6e 64 69 66 0a 0a 20 20 20 20 54 63 6c 5f 43 72  ndif..    Tcl_Cr
1da70 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 0a  eateObjCommand(.
1da80 20 20 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20          interp, 
1da90 22 6c 6f 61 64 5f 74 65 73 74 66 69 78 74 75 72  "load_testfixtur
1daa0 65 5f 65 78 74 65 6e 73 69 6f 6e 73 22 2c 20 69  e_extensions", i
1dab0 6e 69 74 5f 61 6c 6c 5f 63 6d 64 2c 20 30 2c 20  nit_all_cmd, 0, 
1dac0 30 0a 20 20 20 20 29 3b 0a 20 20 20 20 54 63 6c  0.    );.    Tcl
1dad0 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
1dae0 64 28 0a 20 20 20 20 20 20 20 20 69 6e 74 65 72  d(.        inter
1daf0 70 2c 20 22 64 62 5f 75 73 65 5f 6c 65 67 61 63  p, "db_use_legac
1db00 79 5f 70 72 65 70 61 72 65 22 2c 20 64 62 5f 75  y_prepare", db_u
1db10 73 65 5f 6c 65 67 61 63 79 5f 70 72 65 70 61 72  se_legacy_prepar
1db20 65 5f 63 6d 64 2c 20 30 2c 20 30 0a 20 20 20 20  e_cmd, 0, 0.    
1db30 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  );..#ifdef SQLIT
1db40 45 5f 53 53 45 0a 20 20 20 20 53 71 6c 69 74 65  E_SSE.    Sqlite
1db50 74 65 73 74 73 73 65 5f 49 6e 69 74 28 69 6e 74  testsse_Init(int
1db60 65 72 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  erp);.#endif.  }
1db70 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 64 65 66 69  .#endif.}..#defi
1db80 6e 65 20 54 43 4c 53 48 5f 4d 41 49 4e 20 6d 61  ne TCLSH_MAIN ma
1db90 69 6e 20 20 20 2f 2a 20 4e 65 65 64 65 64 20 74  in   /* Needed t
1dba0 6f 20 66 61 6b 65 20 6f 75 74 20 6d 6b 74 63 6c  o fake out mktcl
1dbb0 61 70 70 20 2a 2f 0a 69 6e 74 20 54 43 4c 53 48  app */.int TCLSH
1dbc0 5f 4d 41 49 4e 28 69 6e 74 20 61 72 67 63 2c 20  _MAIN(int argc, 
1dbd0 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20  char **argv){.  
1dbe0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1dbf0 72 70 3b 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  rp;..#if !define
1dc00 64 28 5f 57 49 4e 33 32 5f 57 43 45 29 0a 20 20  d(_WIN32_WCE).  
1dc10 69 66 28 20 67 65 74 65 6e 76 28 22 42 52 45 41  if( getenv("BREA
1dc20 4b 22 29 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  K") ){.    fprin
1dc30 74 66 28 73 74 64 65 72 72 2c 0a 20 20 20 20 20  tf(stderr,.     
1dc40 20 20 20 22 61 74 74 61 63 68 20 64 65 62 75 67     "attach debug
1dc50 67 65 72 20 74 6f 20 70 72 6f 63 65 73 73 20 25  ger to process %
1dc60 64 20 61 6e 64 20 70 72 65 73 73 20 61 6e 79 20  d and press any 
1dc70 6b 65 79 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e  key to continue.
1dc80 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 47 45 54  \n",.        GET
1dc90 50 49 44 28 29 29 3b 0a 20 20 20 20 66 67 65 74  PID());.    fget
1dca0 63 28 73 74 64 69 6e 29 3b 0a 20 20 7d 0a 23 65  c(stdin);.  }.#e
1dcb0 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 61 6c 6c 20  ndif..  /* Call 
1dcc0 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e  sqlite3_shutdown
1dcd0 28 29 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 64  () once before d
1dce0 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c  oing anything el
1dcf0 73 65 2e 20 54 68 69 73 20 69 73 20 74 6f 0a 20  se. This is to. 
1dd00 20 2a 2a 20 74 65 73 74 20 74 68 61 74 20 73 71   ** test that sq
1dd10 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 29  lite3_shutdown()
1dd20 20 63 61 6e 20 62 65 20 73 61 66 65 6c 79 20 63   can be safely c
1dd30 61 6c 6c 65 64 20 62 79 20 61 20 70 72 6f 63 65  alled by a proce
1dd40 73 73 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 73  ss before.  ** s
1dd50 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a  qlite3_initializ
1dd60 65 28 29 20 69 73 2e 20 2a 2f 0a 20 20 73 71 6c  e() is. */.  sql
1dd70 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 29 3b  ite3_shutdown();
1dd80 0a 0a 20 20 54 63 6c 5f 46 69 6e 64 45 78 65 63  ..  Tcl_FindExec
1dd90 75 74 61 62 6c 65 28 61 72 67 76 5b 30 5d 29 3b  utable(argv[0]);
1dda0 0a 20 20 69 6e 74 65 72 70 20 3d 20 54 63 6c 5f  .  interp = Tcl_
1ddb0 43 72 65 61 74 65 49 6e 74 65 72 70 28 29 3b 0a  CreateInterp();.
1ddc0 0a 23 69 66 20 54 43 4c 53 48 3d 3d 32 0a 20 20  .#if TCLSH==2.  
1ddd0 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53  sqlite3_config(S
1dde0 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 49 4e  QLITE_CONFIG_SIN
1ddf0 47 4c 45 54 48 52 45 41 44 29 3b 0a 23 65 6e 64  GLETHREAD);.#end
1de00 69 66 0a 0a 20 20 69 6e 69 74 5f 61 6c 6c 28 69  if..  init_all(i
1de10 6e 74 65 72 70 29 3b 0a 20 20 69 66 28 20 61 72  nterp);.  if( ar
1de20 67 63 3e 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74  gc>=2 ){.    int
1de30 20 69 3b 0a 20 20 20 20 63 68 61 72 20 7a 41 72   i;.    char zAr
1de40 67 63 5b 33 32 5d 3b 0a 20 20 20 20 73 71 6c 69  gc[32];.    sqli
1de50 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
1de60 65 6f 66 28 7a 41 72 67 63 29 2c 20 7a 41 72 67  eof(zArgc), zArg
1de70 63 2c 20 22 25 64 22 2c 20 61 72 67 63 2d 28 33  c, "%d", argc-(3
1de80 2d 54 43 4c 53 48 29 29 3b 0a 20 20 20 20 54 63  -TCLSH));.    Tc
1de90 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c  l_SetVar(interp,
1dea0 22 61 72 67 63 22 2c 20 7a 41 72 67 63 2c 20 54  "argc", zArgc, T
1deb0 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
1dec0 0a 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28  .    Tcl_SetVar(
1ded0 69 6e 74 65 72 70 2c 22 61 72 67 76 30 22 2c 61  interp,"argv0",a
1dee0 72 67 76 5b 31 5d 2c 54 43 4c 5f 47 4c 4f 42 41  rgv[1],TCL_GLOBA
1def0 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 54 63 6c  L_ONLY);.    Tcl
1df00 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 22  _SetVar(interp,"
1df10 61 72 67 76 22 2c 20 22 22 2c 20 54 43 4c 5f 47  argv", "", TCL_G
1df20 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20  LOBAL_ONLY);.   
1df30 20 66 6f 72 28 69 3d 33 2d 54 43 4c 53 48 3b 20   for(i=3-TCLSH; 
1df40 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20  i<argc; i++){.  
1df50 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69      Tcl_SetVar(i
1df60 6e 74 65 72 70 2c 20 22 61 72 67 76 22 2c 20 61  nterp, "argv", a
1df70 72 67 76 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20  rgv[i],.        
1df80 20 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c    TCL_GLOBAL_ONL
1df90 59 20 7c 20 54 43 4c 5f 4c 49 53 54 5f 45 4c 45  Y | TCL_LIST_ELE
1dfa0 4d 45 4e 54 20 7c 20 54 43 4c 5f 41 50 50 45 4e  MENT | TCL_APPEN
1dfb0 44 5f 56 41 4c 55 45 29 3b 0a 20 20 20 20 7d 0a  D_VALUE);.    }.
1dfc0 20 20 20 20 69 66 28 20 54 43 4c 53 48 3d 3d 31      if( TCLSH==1
1dfd0 20 26 26 20 54 63 6c 5f 45 76 61 6c 46 69 6c 65   && Tcl_EvalFile
1dfe0 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
1dff0 29 21 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20  )!=TCL_OK ){.   
1e000 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1e010 49 6e 66 6f 20 3d 20 54 63 6c 5f 47 65 74 56 61  Info = Tcl_GetVa
1e020 72 28 69 6e 74 65 72 70 2c 20 22 65 72 72 6f 72  r(interp, "error
1e030 49 6e 66 6f 22 2c 20 54 43 4c 5f 47 4c 4f 42 41  Info", TCL_GLOBA
1e040 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 20 20 69  L_ONLY);.      i
1e050 66 28 20 7a 49 6e 66 6f 3d 3d 30 20 29 20 7a 49  f( zInfo==0 ) zI
1e060 6e 66 6f 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  nfo = Tcl_GetStr
1e070 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ingResult(interp
1e080 29 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  );.      fprintf
1e090 28 73 74 64 65 72 72 2c 22 25 73 3a 20 25 73 5c  (stderr,"%s: %s\
1e0a0 6e 22 2c 20 2a 61 72 67 76 2c 20 7a 49 6e 66 6f  n", *argv, zInfo
1e0b0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1e0c0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  1;.    }.  }.  i
1e0d0 66 28 20 54 43 4c 53 48 3d 3d 32 20 7c 7c 20 61  f( TCLSH==2 || a
1e0e0 72 67 63 3c 3d 31 20 29 7b 0a 20 20 20 20 54 63  rgc<=1 ){.    Tc
1e0f0 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 28 69 6e 74  l_GlobalEval(int
1e100 65 72 70 2c 20 74 63 6c 73 68 5f 6d 61 69 6e 5f  erp, tclsh_main_
1e110 6c 6f 6f 70 28 29 29 3b 0a 20 20 7d 0a 20 20 72  loop());.  }.  r
1e120 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
1e130 66 20 2f 2a 20 54 43 4c 53 48 20 2a 2f 0a        f /* TCLSH */.