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

Artifact 3b5f3716e320480659239abe887164521c575d83:


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 52 6f 6c  .  Tcl_Obj *pRol
1350: 6c 62 61 63 6b 48 6f 6f 6b 3b 20 20 20 20 2f 2a  lbackHook;    /*
1360: 20 52 6f 6c 6c 62 61 63 6b 20 68 6f 6f 6b 20 73   Rollback hook s
1370: 63 72 69 70 74 20 28 69 66 20 61 6e 79 29 20 2a  cript (if any) *
1380: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 57 61  /.  Tcl_Obj *pWa
1390: 6c 48 6f 6f 6b 3b 20 20 20 20 20 20 20 20 20 2f  lHook;         /
13a0: 2a 20 57 41 4c 20 68 6f 6f 6b 20 73 63 72 69 70  * WAL hook scrip
13b0: 74 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20 20  t (if any) */.  
13c0: 54 63 6c 5f 4f 62 6a 20 2a 70 55 6e 6c 6f 63 6b  Tcl_Obj *pUnlock
13d0: 4e 6f 74 69 66 79 3b 20 20 20 20 2f 2a 20 55 6e  Notify;    /* Un
13e0: 6c 6f 63 6b 20 6e 6f 74 69 66 79 20 73 63 72 69  lock notify scri
13f0: 70 74 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20  pt (if any) */. 
1400: 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43 6f   SqlCollate *pCo
1410: 6c 6c 61 74 65 3b 20 20 20 20 20 20 2f 2a 20 4c  llate;      /* L
1420: 69 73 74 20 6f 66 20 53 51 4c 20 63 6f 6c 6c 61  ist of SQL colla
1430: 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 73 20 2a  tion functions *
1440: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
1450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1460: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 6f 66  * Return code of
1470: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c   most recent sql
1480: 69 74 65 33 5f 65 78 65 63 28 29 20 2a 2f 0a 20  ite3_exec() */. 
1490: 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f 6c 6c 61   Tcl_Obj *pColla
14a0: 74 65 4e 65 65 64 65 64 3b 20 20 20 2f 2a 20 43  teNeeded;   /* C
14b0: 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65 64 65 64 20  ollation needed 
14c0: 73 63 72 69 70 74 20 2a 2f 0a 20 20 53 71 6c 50  script */.  SqlP
14d0: 72 65 70 61 72 65 64 53 74 6d 74 20 2a 73 74 6d  reparedStmt *stm
14e0: 74 4c 69 73 74 3b 20 2f 2a 20 4c 69 73 74 20 6f  tList; /* List o
14f0: 66 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  f prepared state
1500: 6d 65 6e 74 73 2a 2f 0a 20 20 53 71 6c 50 72 65  ments*/.  SqlPre
1510: 70 61 72 65 64 53 74 6d 74 20 2a 73 74 6d 74 4c  paredStmt *stmtL
1520: 61 73 74 3b 20 2f 2a 20 4c 61 73 74 20 73 74 61  ast; /* Last sta
1530: 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 6c 69  tement in the li
1540: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 53  st */.  int maxS
1550: 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tmt;            
1560: 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 6d     /* The next m
1570: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
1580: 20 73 74 6d 74 4c 69 73 74 20 2a 2f 0a 20 20 69   stmtList */.  i
1590: 6e 74 20 6e 53 74 6d 74 3b 20 20 20 20 20 20 20  nt nStmt;       
15a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
15b0: 62 65 72 20 6f 66 20 73 74 61 74 65 6d 65 6e 74  ber of statement
15c0: 73 20 69 6e 20 73 74 6d 74 4c 69 73 74 20 2a 2f  s in stmtList */
15d0: 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  .  IncrblobChann
15e0: 65 6c 20 2a 70 49 6e 63 72 62 6c 6f 62 3b 2f 2a  el *pIncrblob;/*
15f0: 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   Linked list of 
1600: 6f 70 65 6e 20 69 6e 63 72 62 6c 6f 62 20 63 68  open incrblob ch
1610: 61 6e 6e 65 6c 73 20 2a 2f 0a 20 20 69 6e 74 20  annels */.  int 
1620: 6e 53 74 65 70 2c 20 6e 53 6f 72 74 2c 20 6e 49  nStep, nSort, nI
1630: 6e 64 65 78 3b 20 20 2f 2a 20 53 74 61 74 69 73  ndex;  /* Statis
1640: 74 69 63 73 20 66 6f 72 20 6d 6f 73 74 20 72 65  tics for most re
1650: 63 65 6e 74 20 6f 70 65 72 61 74 69 6f 6e 20 2a  cent operation *
1660: 2f 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 61 63  /.  int nTransac
1670: 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 2f  tion;          /
1680: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 73 74  * Number of nest
1690: 65 64 20 5b 74 72 61 6e 73 61 63 74 69 6f 6e 5d  ed [transaction]
16a0: 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 69 66 64   methods */.#ifd
16b0: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
16c0: 20 69 6e 74 20 62 4c 65 67 61 63 79 50 72 65 70   int bLegacyPrep
16d0: 61 72 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  are;        /* T
16e0: 72 75 65 20 74 6f 20 75 73 65 20 73 71 6c 69 74  rue to use sqlit
16f0: 65 33 5f 70 72 65 70 61 72 65 28 29 20 2a 2f 0a  e3_prepare() */.
1700: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 73 74 72 75 63  #endif.};..struc
1710: 74 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65  t IncrblobChanne
1720: 6c 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c  l {.  sqlite3_bl
1730: 6f 62 20 2a 70 42 6c 6f 62 3b 20 20 20 20 20 20  ob *pBlob;      
1740: 2f 2a 20 73 71 6c 69 74 65 33 20 62 6c 6f 62 20  /* sqlite3 blob 
1750: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 53 71 6c 69  handle */.  Sqli
1760: 74 65 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20  teDb *pDb;      
1770: 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61        /* Associa
1780: 74 65 64 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ted database con
1790: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
17a0: 20 69 53 65 65 6b 3b 20 20 20 20 20 20 20 20 20   iSeek;         
17b0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
17c0: 74 20 73 65 65 6b 20 6f 66 66 73 65 74 20 2a 2f  t seek offset */
17d0: 0a 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63  .  Tcl_Channel c
17e0: 68 61 6e 6e 65 6c 3b 20 20 20 20 20 20 2f 2a 20  hannel;      /* 
17f0: 43 68 61 6e 6e 65 6c 20 69 64 65 6e 74 69 66 69  Channel identifi
1800: 65 72 20 2a 2f 0a 20 20 49 6e 63 72 62 6c 6f 62  er */.  Incrblob
1810: 43 68 61 6e 6e 65 6c 20 2a 70 4e 65 78 74 3b 20  Channel *pNext; 
1820: 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74    /* Linked list
1830: 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 69 6e 63   of all open inc
1840: 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 73 20 2a  rblob channels *
1850: 2f 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e  /.  IncrblobChan
1860: 6e 65 6c 20 2a 70 50 72 65 76 3b 20 20 20 2f 2a  nel *pPrev;   /*
1870: 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   Linked list of 
1880: 61 6c 6c 20 6f 70 65 6e 20 69 6e 63 72 62 6c 6f  all open incrblo
1890: 62 20 63 68 61 6e 6e 65 6c 73 20 2a 2f 0a 7d 3b  b channels */.};
18a0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
18b0: 61 20 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  a string length 
18c0: 74 68 61 74 20 69 73 20 6c 69 6d 69 74 65 64 20  that is limited 
18d0: 74 6f 20 77 68 61 74 20 63 61 6e 20 62 65 20 73  to what can be s
18e0: 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 6c 6f 77 65  tored in.** lowe
18f0: 72 20 33 30 20 62 69 74 73 20 6f 66 20 61 20 33  r 30 bits of a 3
1900: 32 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74  2-bit signed int
1910: 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eger..*/.static 
1920: 69 6e 74 20 73 74 72 6c 65 6e 33 30 28 63 6f 6e  int strlen30(con
1930: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63  st char *z){.  c
1940: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 20 3d 20  onst char *z2 = 
1950: 7a 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 32 20  z;.  while( *z2 
1960: 29 7b 20 7a 32 2b 2b 3b 20 7d 0a 20 20 72 65 74  ){ z2++; }.  ret
1970: 75 72 6e 20 30 78 33 66 66 66 66 66 66 66 20 26  urn 0x3fffffff &
1980: 20 28 69 6e 74 29 28 7a 32 20 2d 20 7a 29 3b 0a   (int)(z2 - z);.
1990: 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  }...#ifndef SQLI
19a0: 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
19b0: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c  ./*.** Close all
19c0: 20 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65   incrblob channe
19d0: 6c 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20  ls opened using 
19e0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
19f0: 69 6f 6e 20 70 44 62 2e 0a 2a 2a 20 54 68 69 73  ion pDb..** This
1a00: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
1a10: 73 68 75 74 74 69 6e 67 20 64 6f 77 6e 20 74 68  shutting down th
1a20: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
1a30: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
1a40: 20 76 6f 69 64 20 63 6c 6f 73 65 49 6e 63 72 62   void closeIncrb
1a50: 6c 6f 62 43 68 61 6e 6e 65 6c 73 28 53 71 6c 69  lobChannels(Sqli
1a60: 74 65 44 62 20 2a 70 44 62 29 7b 0a 20 20 49 6e  teDb *pDb){.  In
1a70: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70  crblobChannel *p
1a80: 3b 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e  ;.  IncrblobChan
1a90: 6e 65 6c 20 2a 70 4e 65 78 74 3b 0a 0a 20 20 66  nel *pNext;..  f
1aa0: 6f 72 28 70 3d 70 44 62 2d 3e 70 49 6e 63 72 62  or(p=pDb->pIncrb
1ab0: 6c 6f 62 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29  lob; p; p=pNext)
1ac0: 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d  {.    pNext = p-
1ad0: 3e 70 4e 65 78 74 3b 0a 0a 20 20 20 20 2f 2a 20  >pNext;..    /* 
1ae0: 4e 6f 74 65 3a 20 43 61 6c 6c 69 6e 67 20 75 6e  Note: Calling un
1af0: 72 65 67 69 73 74 65 72 20 68 65 72 65 20 63 61  register here ca
1b00: 6c 6c 20 54 63 6c 5f 43 6c 6f 73 65 20 6f 6e 20  ll Tcl_Close on 
1b10: 74 68 65 20 69 6e 63 72 62 6c 6f 62 20 63 68 61  the incrblob cha
1b20: 6e 6e 65 6c 2c 20 0a 20 20 20 20 2a 2a 20 77 68  nnel, .    ** wh
1b30: 69 63 68 20 64 65 6c 65 74 65 73 20 74 68 65 20  ich deletes the 
1b40: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20  IncrblobChannel 
1b50: 73 74 72 75 63 74 75 72 65 20 61 74 20 2a 70 2e  structure at *p.
1b60: 20 53 6f 20 64 6f 20 6e 6f 74 0a 20 20 20 20 2a   So do not.    *
1b70: 2a 20 63 61 6c 6c 20 54 63 6c 5f 46 72 65 65 28  * call Tcl_Free(
1b80: 29 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  ) here..    */. 
1b90: 20 20 20 54 63 6c 5f 55 6e 72 65 67 69 73 74 65     Tcl_Unregiste
1ba0: 72 43 68 61 6e 6e 65 6c 28 70 44 62 2d 3e 69 6e  rChannel(pDb->in
1bb0: 74 65 72 70 2c 20 70 2d 3e 63 68 61 6e 6e 65 6c  terp, p->channel
1bc0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1bd0: 43 6c 6f 73 65 20 61 6e 20 69 6e 63 72 65 6d 65  Close an increme
1be0: 6e 74 61 6c 20 62 6c 6f 62 20 63 68 61 6e 6e 65  ntal blob channe
1bf0: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
1c00: 20 69 6e 63 72 62 6c 6f 62 43 6c 6f 73 65 28 43   incrblobClose(C
1c10: 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e  lientData instan
1c20: 63 65 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65  ceData, Tcl_Inte
1c30: 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 49  rp *interp){.  I
1c40: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a  ncrblobChannel *
1c50: 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68 61  p = (IncrblobCha
1c60: 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e 63 65 44  nnel *)instanceD
1c70: 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ata;.  int rc = 
1c80: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f  sqlite3_blob_clo
1c90: 73 65 28 70 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20  se(p->pBlob);.  
1ca0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
1cb0: 3e 70 44 62 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20  >pDb->db;..  /* 
1cc0: 52 65 6d 6f 76 65 20 74 68 65 20 63 68 61 6e 6e  Remove the chann
1cd0: 65 6c 20 66 72 6f 6d 20 74 68 65 20 53 71 6c 69  el from the Sqli
1ce0: 74 65 44 62 2e 70 49 6e 63 72 62 6c 6f 62 20 6c  teDb.pIncrblob l
1cf0: 69 73 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d  ist. */.  if( p-
1d00: 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d  >pNext ){.    p-
1d10: 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
1d20: 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20  p->pPrev;.  }.  
1d30: 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a  if( p->pPrev ){.
1d40: 20 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e      p->pPrev->pN
1d50: 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
1d60: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 44 62    }.  if( p->pDb
1d70: 2d 3e 70 49 6e 63 72 62 6c 6f 62 3d 3d 70 20 29  ->pIncrblob==p )
1d80: 7b 0a 20 20 20 20 70 2d 3e 70 44 62 2d 3e 70 49  {.    p->pDb->pI
1d90: 6e 63 72 62 6c 6f 62 20 3d 20 70 2d 3e 70 4e 65  ncrblob = p->pNe
1da0: 78 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72  xt;.  }..  /* Fr
1db0: 65 65 20 74 68 65 20 49 6e 63 72 62 6c 6f 62 43  ee the IncrblobC
1dc0: 68 61 6e 6e 65 6c 20 73 74 72 75 63 74 75 72 65  hannel structure
1dd0: 20 2a 2f 0a 20 20 54 63 6c 5f 46 72 65 65 28 28   */.  Tcl_Free((
1de0: 63 68 61 72 20 2a 29 70 29 3b 0a 0a 20 20 69 66  char *)p);..  if
1df0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1e00: 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65  ){.    Tcl_SetRe
1e10: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
1e20: 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72  ar *)sqlite3_err
1e30: 6d 73 67 28 64 62 29 2c 20 54 43 4c 5f 56 4f 4c  msg(db), TCL_VOL
1e40: 41 54 49 4c 45 29 3b 0a 20 20 20 20 72 65 74 75  ATILE);.    retu
1e50: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1e60: 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
1e70: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  K;.}../*.** Read
1e80: 20 64 61 74 61 20 66 72 6f 6d 20 61 6e 20 69 6e   data from an in
1e90: 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63  cremental blob c
1ea0: 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69  hannel..*/.stati
1eb0: 63 20 69 6e 74 20 69 6e 63 72 62 6c 6f 62 49 6e  c int incrblobIn
1ec0: 70 75 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  put(.  ClientDat
1ed0: 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20  a instanceData, 
1ee0: 0a 20 20 63 68 61 72 20 2a 62 75 66 2c 20 0a 20  .  char *buf, . 
1ef0: 20 69 6e 74 20 62 75 66 53 69 7a 65 2c 0a 20 20   int bufSize,.  
1f00: 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 74  int *errorCodePt
1f10: 72 0a 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43  r.){.  IncrblobC
1f20: 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28 49 6e 63  hannel *p = (Inc
1f30: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 69  rblobChannel *)i
1f40: 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 69  nstanceData;.  i
1f50: 6e 74 20 6e 52 65 61 64 20 3d 20 62 75 66 53 69  nt nRead = bufSi
1f60: 7a 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ze;         /* N
1f70: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
1f80: 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20  o read */.  int 
1f90: 6e 42 6c 6f 62 3b 20 20 20 20 20 20 20 20 20 20  nBlob;          
1fa0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
1fb0: 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c  l size of the bl
1fc0: 6f 62 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ob */.  int rc; 
1fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe0: 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 20 65       /* sqlite e
1ff0: 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  rror code */..  
2000: 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f  nBlob = sqlite3_
2010: 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70 42  blob_bytes(p->pB
2020: 6c 6f 62 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e  lob);.  if( (p->
2030: 69 53 65 65 6b 2b 6e 52 65 61 64 29 3e 6e 42 6c  iSeek+nRead)>nBl
2040: 6f 62 20 29 7b 0a 20 20 20 20 6e 52 65 61 64 20  ob ){.    nRead 
2050: 3d 20 6e 42 6c 6f 62 2d 70 2d 3e 69 53 65 65 6b  = nBlob-p->iSeek
2060: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 61  ;.  }.  if( nRea
2070: 64 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  d<=0 ){.    retu
2080: 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  rn 0;.  }..  rc 
2090: 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72  = sqlite3_blob_r
20a0: 65 61 64 28 70 2d 3e 70 42 6c 6f 62 2c 20 28 76  ead(p->pBlob, (v
20b0: 6f 69 64 20 2a 29 62 75 66 2c 20 6e 52 65 61 64  oid *)buf, nRead
20c0: 2c 20 70 2d 3e 69 53 65 65 6b 29 3b 0a 20 20 69  , p->iSeek);.  i
20d0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
20e0: 20 29 7b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f   ){.    *errorCo
20f0: 64 65 50 74 72 20 3d 20 72 63 3b 0a 20 20 20 20  dePtr = rc;.    
2100: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 0a  return -1;.  }..
2110: 20 20 70 2d 3e 69 53 65 65 6b 20 2b 3d 20 6e 52    p->iSeek += nR
2120: 65 61 64 3b 0a 20 20 72 65 74 75 72 6e 20 6e 52  ead;.  return nR
2130: 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72  ead;.}../*.** Wr
2140: 69 74 65 20 64 61 74 61 20 74 6f 20 61 6e 20 69  ite data to an i
2150: 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20  ncremental blob 
2160: 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74  channel..*/.stat
2170: 69 63 20 69 6e 74 20 69 6e 63 72 62 6c 6f 62 4f  ic int incrblobO
2180: 75 74 70 75 74 28 0a 20 20 43 6c 69 65 6e 74 44  utput(.  ClientD
2190: 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61  ata instanceData
21a0: 2c 20 0a 20 20 43 4f 4e 53 54 20 63 68 61 72 20  , .  CONST char 
21b0: 2a 62 75 66 2c 20 0a 20 20 69 6e 74 20 74 6f 57  *buf, .  int toW
21c0: 72 69 74 65 2c 0a 20 20 69 6e 74 20 2a 65 72 72  rite,.  int *err
21d0: 6f 72 43 6f 64 65 50 74 72 0a 29 7b 0a 20 20 49  orCodePtr.){.  I
21e0: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a  ncrblobChannel *
21f0: 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68 61  p = (IncrblobCha
2200: 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e 63 65 44  nnel *)instanceD
2210: 61 74 61 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74  ata;.  int nWrit
2220: 65 20 3d 20 74 6f 57 72 69 74 65 3b 20 20 20 20  e = toWrite;    
2230: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2240: 20 62 79 74 65 73 20 74 6f 20 77 72 69 74 65 20   bytes to write 
2250: 2a 2f 0a 20 20 69 6e 74 20 6e 42 6c 6f 62 3b 20  */.  int nBlob; 
2260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2270: 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
2280: 6f 66 20 74 68 65 20 62 6c 6f 62 20 2a 2f 0a 20  of the blob */. 
2290: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
22a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22b0: 20 73 71 6c 69 74 65 20 65 72 72 6f 72 20 63 6f   sqlite error co
22c0: 64 65 20 2a 2f 0a 0a 20 20 6e 42 6c 6f 62 20 3d  de */..  nBlob =
22d0: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79   sqlite3_blob_by
22e0: 74 65 73 28 70 2d 3e 70 42 6c 6f 62 29 3b 0a 20  tes(p->pBlob);. 
22f0: 20 69 66 28 20 28 70 2d 3e 69 53 65 65 6b 2b 6e   if( (p->iSeek+n
2300: 57 72 69 74 65 29 3e 6e 42 6c 6f 62 20 29 7b 0a  Write)>nBlob ){.
2310: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74      *errorCodePt
2320: 72 20 3d 20 45 49 4e 56 41 4c 3b 0a 20 20 20 20  r = EINVAL;.    
2330: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20  return -1;.  }. 
2340: 20 69 66 28 20 6e 57 72 69 74 65 3c 3d 30 20 29   if( nWrite<=0 )
2350: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
2360: 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69    }..  rc = sqli
2370: 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65 28 70  te3_blob_write(p
2380: 2d 3e 70 42 6c 6f 62 2c 20 28 76 6f 69 64 20 2a  ->pBlob, (void *
2390: 29 62 75 66 2c 20 6e 57 72 69 74 65 2c 20 70 2d  )buf, nWrite, p-
23a0: 3e 69 53 65 65 6b 29 3b 0a 20 20 69 66 28 20 72  >iSeek);.  if( r
23b0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
23c0: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74      *errorCodePt
23d0: 72 20 3d 20 45 49 4f 3b 0a 20 20 20 20 72 65 74  r = EIO;.    ret
23e0: 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 70  urn -1;.  }..  p
23f0: 2d 3e 69 53 65 65 6b 20 2b 3d 20 6e 57 72 69 74  ->iSeek += nWrit
2400: 65 3b 0a 20 20 72 65 74 75 72 6e 20 6e 57 72 69  e;.  return nWri
2410: 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65  te;.}../*.** See
2420: 6b 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  k an incremental
2430: 20 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a   blob channel..*
2440: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63  /.static int inc
2450: 72 62 6c 6f 62 53 65 65 6b 28 0a 20 20 43 6c 69  rblobSeek(.  Cli
2460: 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65  entData instance
2470: 44 61 74 61 2c 20 0a 20 20 6c 6f 6e 67 20 6f 66  Data, .  long of
2480: 66 73 65 74 2c 0a 20 20 69 6e 74 20 73 65 65 6b  fset,.  int seek
2490: 4d 6f 64 65 2c 0a 20 20 69 6e 74 20 2a 65 72 72  Mode,.  int *err
24a0: 6f 72 43 6f 64 65 50 74 72 0a 29 7b 0a 20 20 49  orCodePtr.){.  I
24b0: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a  ncrblobChannel *
24c0: 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68 61  p = (IncrblobCha
24d0: 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e 63 65 44  nnel *)instanceD
24e0: 61 74 61 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  ata;..  switch( 
24f0: 73 65 65 6b 4d 6f 64 65 20 29 7b 0a 20 20 20 20  seekMode ){.    
2500: 63 61 73 65 20 53 45 45 4b 5f 53 45 54 3a 0a 20  case SEEK_SET:. 
2510: 20 20 20 20 20 70 2d 3e 69 53 65 65 6b 20 3d 20       p->iSeek = 
2520: 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 62 72  offset;.      br
2530: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 45  eak;.    case SE
2540: 45 4b 5f 43 55 52 3a 0a 20 20 20 20 20 20 70 2d  EK_CUR:.      p-
2550: 3e 69 53 65 65 6b 20 2b 3d 20 6f 66 66 73 65 74  >iSeek += offset
2560: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
2570: 20 20 20 63 61 73 65 20 53 45 45 4b 5f 45 4e 44     case SEEK_END
2580: 3a 0a 20 20 20 20 20 20 70 2d 3e 69 53 65 65 6b  :.      p->iSeek
2590: 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f   = sqlite3_blob_
25a0: 62 79 74 65 73 28 70 2d 3e 70 42 6c 6f 62 29 20  bytes(p->pBlob) 
25b0: 2b 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  + offset;.      
25c0: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61  break;..    defa
25d0: 75 6c 74 3a 20 61 73 73 65 72 74 28 21 22 42 61  ult: assert(!"Ba
25e0: 64 20 73 65 65 6b 4d 6f 64 65 22 29 3b 0a 20 20  d seekMode");.  
25f0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 69  }..  return p->i
2600: 53 65 65 6b 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63  Seek;.}...static
2610: 20 76 6f 69 64 20 69 6e 63 72 62 6c 6f 62 57 61   void incrblobWa
2620: 74 63 68 28 43 6c 69 65 6e 74 44 61 74 61 20 69  tch(ClientData i
2630: 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 69 6e 74  nstanceData, int
2640: 20 6d 6f 64 65 29 7b 20 0a 20 20 2f 2a 20 4e 4f   mode){ .  /* NO
2650: 2d 4f 50 20 2a 2f 20 0a 7d 0a 73 74 61 74 69 63  -OP */ .}.static
2660: 20 69 6e 74 20 69 6e 63 72 62 6c 6f 62 48 61 6e   int incrblobHan
2670: 64 6c 65 28 43 6c 69 65 6e 74 44 61 74 61 20 69  dle(ClientData i
2680: 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 69 6e 74  nstanceData, int
2690: 20 64 69 72 2c 20 43 6c 69 65 6e 74 44 61 74 61   dir, ClientData
26a0: 20 2a 68 50 74 72 29 7b 0a 20 20 72 65 74 75 72   *hPtr){.  retur
26b0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a  n TCL_ERROR;.}..
26c0: 73 74 61 74 69 63 20 54 63 6c 5f 43 68 61 6e 6e  static Tcl_Chann
26d0: 65 6c 54 79 70 65 20 49 6e 63 72 62 6c 6f 62 43  elType IncrblobC
26e0: 68 61 6e 6e 65 6c 54 79 70 65 20 3d 20 7b 0a 20  hannelType = {. 
26f0: 20 22 69 6e 63 72 62 6c 6f 62 22 2c 20 20 20 20   "incrblob",    
2700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2710: 20 20 20 20 2f 2a 20 74 79 70 65 4e 61 6d 65 20      /* typeName 
2720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2730: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2740: 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45 52   TCL_CHANNEL_VER
2750: 53 49 4f 4e 5f 32 2c 20 20 20 20 20 20 20 20 20  SION_2,         
2760: 20 20 20 20 2f 2a 20 76 65 72 73 69 6f 6e 20 20      /* version  
2770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2780: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2790: 20 69 6e 63 72 62 6c 6f 62 43 6c 6f 73 65 2c 20   incrblobClose, 
27a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b0: 20 20 20 20 2f 2a 20 63 6c 6f 73 65 50 72 6f 63      /* closeProc
27c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
27e0: 20 69 6e 63 72 62 6c 6f 62 49 6e 70 75 74 2c 20   incrblobInput, 
27f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2800: 20 20 20 20 2f 2a 20 69 6e 70 75 74 50 72 6f 63      /* inputProc
2810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2820: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2830: 20 69 6e 63 72 62 6c 6f 62 4f 75 74 70 75 74 2c   incrblobOutput,
2840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2850: 20 20 20 20 2f 2a 20 6f 75 74 70 75 74 50 72 6f      /* outputPro
2860: 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
2870: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2880: 20 69 6e 63 72 62 6c 6f 62 53 65 65 6b 2c 20 20   incrblobSeek,  
2890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a0: 20 20 20 20 2f 2a 20 73 65 65 6b 50 72 6f 63 20      /* seekProc 
28b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
28d0: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
28e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f0: 20 20 20 20 2f 2a 20 73 65 74 4f 70 74 69 6f 6e      /* setOption
2900: 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20  Proc            
2910: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2920: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
2930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2940: 20 20 20 20 2f 2a 20 67 65 74 4f 70 74 69 6f 6e      /* getOption
2950: 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20  Proc            
2960: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2970: 20 69 6e 63 72 62 6c 6f 62 57 61 74 63 68 2c 20   incrblobWatch, 
2980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2990: 20 20 20 20 2f 2a 20 77 61 74 63 68 50 72 6f 63      /* watchProc
29a0: 20 28 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f   (this is a no-o
29b0: 70 29 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  p)          */. 
29c0: 20 69 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 2c   incrblobHandle,
29d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e0: 20 20 20 20 2f 2a 20 67 65 74 48 61 6e 64 6c 65      /* getHandle
29f0: 50 72 6f 63 20 28 61 6c 77 61 79 73 20 72 65 74  Proc (always ret
2a00: 75 72 6e 73 20 65 72 72 6f 72 29 20 2a 2f 0a 20  urns error) */. 
2a10: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a30: 20 20 20 20 2f 2a 20 63 6c 6f 73 65 32 50 72 6f      /* close2Pro
2a40: 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2a60: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
2a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a80: 20 20 20 20 2f 2a 20 62 6c 6f 63 6b 4d 6f 64 65      /* blockMode
2a90: 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20  Proc            
2aa0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2ab0: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
2ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad0: 20 20 20 20 2f 2a 20 66 6c 75 73 68 50 72 6f 63      /* flushProc
2ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2b00: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
2b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b20: 20 20 20 20 2f 2a 20 68 61 6e 64 6c 65 72 50 72      /* handlerPr
2b30: 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  oc              
2b40: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2b50: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
2b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b70: 20 20 20 20 2f 2a 20 77 69 64 65 53 65 65 6b 50      /* wideSeekP
2b80: 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20  roc             
2b90: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 7d              */.}
2ba0: 3b 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  ;../*.** Create 
2bb0: 61 20 6e 65 77 20 69 6e 63 72 62 6c 6f 62 20 63  a new incrblob c
2bc0: 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69  hannel..*/.stati
2bd0: 63 20 69 6e 74 20 63 72 65 61 74 65 49 6e 63 72  c int createIncr
2be0: 62 6c 6f 62 43 68 61 6e 6e 65 6c 28 0a 20 20 54  blobChannel(.  T
2bf0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2c00: 70 2c 20 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  p, .  SqliteDb *
2c10: 70 44 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68  pDb, .  const ch
2c20: 61 72 20 2a 7a 44 62 2c 0a 20 20 63 6f 6e 73 74  ar *zDb,.  const
2c30: 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 2c 20 0a   char *zTable, .
2c40: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
2c50: 6f 6c 75 6d 6e 2c 20 0a 20 20 73 71 6c 69 74 65  olumn, .  sqlite
2c60: 5f 69 6e 74 36 34 20 69 52 6f 77 2c 0a 20 20 69  _int64 iRow,.  i
2c70: 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 0a 29 7b  nt isReadonly.){
2c80: 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  .  IncrblobChann
2c90: 65 6c 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33  el *p;.  sqlite3
2ca0: 20 2a 64 62 20 3d 20 70 44 62 2d 3e 64 62 3b 0a   *db = pDb->db;.
2cb0: 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a    sqlite3_blob *
2cc0: 70 42 6c 6f 62 3b 0a 20 20 69 6e 74 20 72 63 3b  pBlob;.  int rc;
2cd0: 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 54  .  int flags = T
2ce0: 43 4c 5f 52 45 41 44 41 42 4c 45 7c 28 69 73 52  CL_READABLE|(isR
2cf0: 65 61 64 6f 6e 6c 79 20 3f 20 30 20 3a 20 54 43  eadonly ? 0 : TC
2d00: 4c 5f 57 52 49 54 41 42 4c 45 29 3b 0a 0a 20 20  L_WRITABLE);..  
2d10: 2f 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65  /* This variable
2d20: 20 69 73 20 75 73 65 64 20 74 6f 20 6e 61 6d 65   is used to name
2d30: 20 74 68 65 20 63 68 61 6e 6e 65 6c 73 3a 20 22   the channels: "
2d40: 69 6e 63 72 62 6c 6f 62 5f 5b 69 6e 63 72 20 63  incrblob_[incr c
2d50: 6f 75 6e 74 5d 22 20 2a 2f 0a 20 20 73 74 61 74  ount]" */.  stat
2d60: 69 63 20 69 6e 74 20 63 6f 75 6e 74 20 3d 20 30  ic int count = 0
2d70: 3b 0a 20 20 63 68 61 72 20 7a 43 68 61 6e 6e 65  ;.  char zChanne
2d80: 6c 5b 36 34 5d 3b 0a 0a 20 20 72 63 20 3d 20 73  l[64];..  rc = s
2d90: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e  qlite3_blob_open
2da0: 28 64 62 2c 20 7a 44 62 2c 20 7a 54 61 62 6c 65  (db, zDb, zTable
2db0: 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 69 52 6f 77 2c  , zColumn, iRow,
2dc0: 20 21 69 73 52 65 61 64 6f 6e 6c 79 2c 20 26 70   !isReadonly, &p
2dd0: 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20 72 63 21  Blob);.  if( rc!
2de0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2df0: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
2e00: 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
2e10: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
2e20: 44 62 2d 3e 64 62 29 2c 20 54 43 4c 5f 56 4f 4c  Db->db), TCL_VOL
2e30: 41 54 49 4c 45 29 3b 0a 20 20 20 20 72 65 74 75  ATILE);.    retu
2e40: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2e50: 7d 0a 0a 20 20 70 20 3d 20 28 49 6e 63 72 62 6c  }..  p = (Incrbl
2e60: 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 54 63 6c 5f  obChannel *)Tcl_
2e70: 41 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 49 6e 63  Alloc(sizeof(Inc
2e80: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 29 29 3b 0a  rblobChannel));.
2e90: 20 20 70 2d 3e 69 53 65 65 6b 20 3d 20 30 3b 0a    p->iSeek = 0;.
2ea0: 20 20 70 2d 3e 70 42 6c 6f 62 20 3d 20 70 42 6c    p->pBlob = pBl
2eb0: 6f 62 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73  ob;..  sqlite3_s
2ec0: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
2ed0: 43 68 61 6e 6e 65 6c 29 2c 20 7a 43 68 61 6e 6e  Channel), zChann
2ee0: 65 6c 2c 20 22 69 6e 63 72 62 6c 6f 62 5f 25 64  el, "incrblob_%d
2ef0: 22 2c 20 2b 2b 63 6f 75 6e 74 29 3b 0a 20 20 70  ", ++count);.  p
2f00: 2d 3e 63 68 61 6e 6e 65 6c 20 3d 20 54 63 6c 5f  ->channel = Tcl_
2f10: 43 72 65 61 74 65 43 68 61 6e 6e 65 6c 28 26 49  CreateChannel(&I
2f20: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 54 79  ncrblobChannelTy
2f30: 70 65 2c 20 7a 43 68 61 6e 6e 65 6c 2c 20 70 2c  pe, zChannel, p,
2f40: 20 66 6c 61 67 73 29 3b 0a 20 20 54 63 6c 5f 52   flags);.  Tcl_R
2f50: 65 67 69 73 74 65 72 43 68 61 6e 6e 65 6c 28 69  egisterChannel(i
2f60: 6e 74 65 72 70 2c 20 70 2d 3e 63 68 61 6e 6e 65  nterp, p->channe
2f70: 6c 29 3b 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74  l);..  /* Link t
2f80: 68 65 20 6e 65 77 20 63 68 61 6e 6e 65 6c 20 69  he new channel i
2f90: 6e 74 6f 20 74 68 65 20 53 71 6c 69 74 65 44 62  nto the SqliteDb
2fa0: 2e 70 49 6e 63 72 62 6c 6f 62 20 6c 69 73 74 2e  .pIncrblob list.
2fb0: 20 2a 2f 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d   */.  p->pNext =
2fc0: 20 70 44 62 2d 3e 70 49 6e 63 72 62 6c 6f 62 3b   pDb->pIncrblob;
2fd0: 0a 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b  .  p->pPrev = 0;
2fe0: 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20  .  if( p->pNext 
2ff0: 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d  ){.    p->pNext-
3000: 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 7d 0a  >pPrev = p;.  }.
3010: 20 20 70 44 62 2d 3e 70 49 6e 63 72 62 6c 6f 62    pDb->pIncrblob
3020: 20 3d 20 70 3b 0a 20 20 70 2d 3e 70 44 62 20 3d   = p;.  p->pDb =
3030: 20 70 44 62 3b 0a 0a 20 20 54 63 6c 5f 53 65 74   pDb;..  Tcl_Set
3040: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
3050: 63 68 61 72 20 2a 29 54 63 6c 5f 47 65 74 43 68  char *)Tcl_GetCh
3060: 61 6e 6e 65 6c 4e 61 6d 65 28 70 2d 3e 63 68 61  annelName(p->cha
3070: 6e 6e 65 6c 29 2c 20 54 43 4c 5f 56 4f 4c 41 54  nnel), TCL_VOLAT
3080: 49 4c 45 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  ILE);.  return T
3090: 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6c 73 65 20 20  CL_OK;.}.#else  
30a0: 2f 2a 20 65 6c 73 65 20 63 6c 61 75 73 65 20 66  /* else clause f
30b0: 6f 72 20 22 23 69 66 6e 64 65 66 20 53 51 4c 49  or "#ifndef SQLI
30c0: 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
30d0: 22 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 63  " */.  #define c
30e0: 6c 6f 73 65 49 6e 63 72 62 6c 6f 62 43 68 61 6e  loseIncrblobChan
30f0: 6e 65 6c 73 28 70 44 62 29 0a 23 65 6e 64 69 66  nels(pDb).#endif
3100: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 61 74 20  ../*.** Look at 
3110: 74 68 65 20 73 63 72 69 70 74 20 70 72 65 66 69  the script prefi
3120: 78 20 69 6e 20 70 43 6d 64 2e 20 20 57 65 20 77  x in pCmd.  We w
3130: 69 6c 6c 20 62 65 20 65 78 65 63 75 74 69 6e 67  ill be executing
3140: 20 74 68 69 73 20 73 63 72 69 70 74 0a 2a 2a 20   this script.** 
3150: 61 66 74 65 72 20 66 69 72 73 74 20 61 70 70 65  after first appe
3160: 6e 64 69 6e 67 20 6f 6e 65 20 6f 72 20 6d 6f 72  nding one or mor
3170: 65 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 54 68  e arguments.  Th
3180: 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79  is routine analy
3190: 7a 65 73 0a 2a 2a 20 74 68 65 20 73 63 72 69 70  zes.** the scrip
31a0: 74 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 69  t to see if it i
31b0: 73 20 73 61 66 65 20 74 6f 20 75 73 65 20 54 63  s safe to use Tc
31c0: 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 6f 6e 20  l_EvalObjv() on 
31d0: 74 68 65 20 73 63 72 69 70 74 0a 2a 2a 20 72 61  the script.** ra
31e0: 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6d 6f  ther than the mo
31f0: 72 65 20 67 65 6e 65 72 61 6c 20 54 63 6c 5f 45  re general Tcl_E
3200: 76 61 6c 45 78 28 29 2e 20 20 54 63 6c 5f 45 76  valEx().  Tcl_Ev
3210: 61 6c 4f 62 6a 76 28 29 20 69 73 20 6d 75 63 68  alObjv() is much
3220: 0a 2a 2a 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a  .** faster..**.*
3230: 2a 20 53 63 72 69 70 74 73 20 74 68 61 74 20 61  * Scripts that a
3240: 72 65 20 73 61 66 65 20 74 6f 20 75 73 65 20 77  re safe to use w
3250: 69 74 68 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76  ith Tcl_EvalObjv
3260: 28 29 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  () consists of a
3270: 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65  .** command name
3280: 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 7a 65 72   followed by zer
3290: 6f 20 6f 72 20 6d 6f 72 65 20 61 72 67 75 6d 65  o or more argume
32a0: 6e 74 73 20 77 69 74 68 20 6e 6f 20 5b 2e 2e 2e  nts with no [...
32b0: 5d 20 6f 72 20 24 0a 2a 2a 20 6f 72 20 7b 2e 2e  ] or $.** or {..
32c0: 2e 7d 20 6f 72 20 3b 20 74 6f 20 62 65 20 73 65  .} or ; to be se
32d0: 65 6e 20 61 6e 79 77 68 65 72 65 2e 20 20 4d 6f  en anywhere.  Mo
32e0: 73 74 20 63 61 6c 6c 62 61 63 6b 20 73 63 72 69  st callback scri
32f0: 70 74 73 20 63 6f 6e 73 69 73 74 0a 2a 2a 20 6f  pts consist.** o
3300: 66 20 6a 75 73 74 20 61 20 73 69 6e 67 6c 65 20  f just a single 
3310: 70 72 6f 63 65 64 75 72 65 20 6e 61 6d 65 20 61  procedure name a
3320: 6e 64 20 74 68 65 79 20 6d 65 65 74 20 74 68 69  nd they meet thi
3330: 73 20 72 65 71 75 69 72 65 6d 65 6e 74 2e 0a 2a  s requirement..*
3340: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 66  /.static int saf
3350: 65 54 6f 55 73 65 45 76 61 6c 4f 62 6a 76 28 54  eToUseEvalObjv(T
3360: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
3370: 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64  p, Tcl_Obj *pCmd
3380: 29 7b 0a 20 20 2f 2a 20 57 65 20 63 6f 75 6c 64  ){.  /* We could
3390: 20 74 72 79 20 74 6f 20 64 6f 20 73 6f 6d 65 74   try to do somet
33a0: 68 69 6e 67 20 77 69 74 68 20 54 63 6c 5f 50 61  hing with Tcl_Pa
33b0: 72 73 65 28 29 2e 20 20 42 75 74 20 77 65 20 77  rse().  But we w
33c0: 69 6c 6c 20 69 6e 73 74 65 61 64 0a 20 20 2a 2a  ill instead.  **
33d0: 20 6a 75 73 74 20 64 6f 20 61 20 73 65 61 72 63   just do a searc
33e0: 68 20 66 6f 72 20 66 6f 72 62 69 64 64 65 6e 20  h for forbidden 
33f0: 63 68 61 72 61 63 74 65 72 73 2e 20 20 49 66 20  characters.  If 
3400: 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 72 62 69  any of the forbi
3410: 64 64 65 6e 0a 20 20 2a 2a 20 63 68 61 72 61 63  dden.  ** charac
3420: 74 65 72 73 20 61 70 70 65 61 72 20 69 6e 20 70  ters appear in p
3430: 43 6d 64 2c 20 77 65 20 77 69 6c 6c 20 72 65 70  Cmd, we will rep
3440: 6f 72 74 20 74 68 65 20 73 74 72 69 6e 67 20 61  ort the string a
3450: 73 20 75 6e 73 61 66 65 2e 0a 20 20 2a 2f 0a 20  s unsafe..  */. 
3460: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
3470: 20 20 69 6e 74 20 6e 3b 0a 20 20 7a 20 3d 20 54    int n;.  z = T
3480: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
3490: 4f 62 6a 28 70 43 6d 64 2c 20 26 6e 29 3b 0a 20  Obj(pCmd, &n);. 
34a0: 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20   while( n-- > 0 
34b0: 29 7b 0a 20 20 20 20 69 6e 74 20 63 20 3d 20 2a  ){.    int c = *
34c0: 28 7a 2b 2b 29 3b 0a 20 20 20 20 69 66 28 20 63  (z++);.    if( c
34d0: 3d 3d 27 24 27 20 7c 7c 20 63 3d 3d 27 5b 27 20  =='$' || c=='[' 
34e0: 7c 7c 20 63 3d 3d 27 3b 27 20 29 20 72 65 74 75  || c==';' ) retu
34f0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
3500: 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  rn 1;.}../*.** F
3510: 69 6e 64 20 61 6e 20 53 71 6c 46 75 6e 63 20 73  ind an SqlFunc s
3520: 74 72 75 63 74 75 72 65 20 77 69 74 68 20 74 68  tructure with th
3530: 65 20 67 69 76 65 6e 20 6e 61 6d 65 2e 20 20 4f  e given name.  O
3540: 72 20 63 72 65 61 74 65 20 61 20 6e 65 77 0a 2a  r create a new.*
3550: 2a 20 6f 6e 65 20 69 66 20 61 6e 20 65 78 69 73  * one if an exis
3560: 74 69 6e 67 20 6f 6e 65 20 63 61 6e 6e 6f 74 20  ting one cannot 
3570: 62 65 20 66 6f 75 6e 64 2e 20 20 52 65 74 75 72  be found.  Retur
3580: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
3590: 68 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  he.** structure.
35a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 53 71 6c 46 75  .*/.static SqlFu
35b0: 6e 63 20 2a 66 69 6e 64 53 71 6c 46 75 6e 63 28  nc *findSqlFunc(
35c0: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 2c 20 63  SqliteDb *pDb, c
35d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
35e0: 29 7b 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70 2c  ){.  SqlFunc *p,
35f0: 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b   *pNew;.  int i;
3600: 0a 20 20 70 4e 65 77 20 3d 20 28 53 71 6c 46 75  .  pNew = (SqlFu
3610: 6e 63 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73  nc*)Tcl_Alloc( s
3620: 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20 73  izeof(*pNew) + s
3630: 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 20 2b  trlen30(zName) +
3640: 20 31 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 7a 4e   1 );.  pNew->zN
3650: 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e  ame = (char*)&pN
3660: 65 77 5b 31 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  ew[1];.  for(i=0
3670: 3b 20 7a 4e 61 6d 65 5b 69 5d 3b 20 69 2b 2b 29  ; zName[i]; i++)
3680: 7b 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 5b 69 5d  { pNew->zName[i]
3690: 20 3d 20 74 6f 6c 6f 77 65 72 28 7a 4e 61 6d 65   = tolower(zName
36a0: 5b 69 5d 29 3b 20 7d 0a 20 20 70 4e 65 77 2d 3e  [i]); }.  pNew->
36b0: 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b 0a 20 20  zName[i] = 0;.  
36c0: 66 6f 72 28 70 3d 70 44 62 2d 3e 70 46 75 6e 63  for(p=pDb->pFunc
36d0: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
36e0: 7b 20 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  { .    if( strcm
36f0: 70 28 70 2d 3e 7a 4e 61 6d 65 2c 20 70 4e 65 77  p(p->zName, pNew
3700: 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ->zName)==0 ){. 
3710: 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63       Tcl_Free((c
3720: 68 61 72 2a 29 70 4e 65 77 29 3b 0a 20 20 20 20  har*)pNew);.    
3730: 20 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20 20    return p;.    
3740: 7d 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 69 6e  }.  }.  pNew->in
3750: 74 65 72 70 20 3d 20 70 44 62 2d 3e 69 6e 74 65  terp = pDb->inte
3760: 72 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 44 62 20  rp;.  pNew->pDb 
3770: 3d 20 70 44 62 3b 0a 20 20 70 4e 65 77 2d 3e 70  = pDb;.  pNew->p
3780: 53 63 72 69 70 74 20 3d 20 30 3b 0a 20 20 70 4e  Script = 0;.  pN
3790: 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d  ew->pNext = pDb-
37a0: 3e 70 46 75 6e 63 3b 0a 20 20 70 44 62 2d 3e 70  >pFunc;.  pDb->p
37b0: 46 75 6e 63 20 3d 20 70 4e 65 77 3b 0a 20 20 72  Func = pNew;.  r
37c0: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
37d0: 2a 0a 2a 2a 20 46 72 65 65 20 61 20 73 69 6e 67  *.** Free a sing
37e0: 6c 65 20 53 71 6c 50 72 65 70 61 72 65 64 53 74  le SqlPreparedSt
37f0: 6d 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  mt object..*/.st
3800: 61 74 69 63 20 76 6f 69 64 20 64 62 46 72 65 65  atic void dbFree
3810: 53 74 6d 74 28 53 71 6c 50 72 65 70 61 72 65 64  Stmt(SqlPrepared
3820: 53 74 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 23 69  Stmt *pStmt){.#i
3830: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
3840: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73  .  if( sqlite3_s
3850: 71 6c 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74 29  ql(pStmt->pStmt)
3860: 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46  ==0 ){.    Tcl_F
3870: 72 65 65 28 28 63 68 61 72 20 2a 29 70 53 74 6d  ree((char *)pStm
3880: 74 2d 3e 7a 53 71 6c 29 3b 0a 20 20 7d 0a 23 65  t->zSql);.  }.#e
3890: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 66  ndif.  sqlite3_f
38a0: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 2d 3e 70  inalize(pStmt->p
38b0: 53 74 6d 74 29 3b 0a 20 20 54 63 6c 5f 46 72 65  Stmt);.  Tcl_Fre
38c0: 65 28 28 63 68 61 72 20 2a 29 70 53 74 6d 74 29  e((char *)pStmt)
38d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 61 6c  ;.}../*.** Final
38e0: 69 7a 65 20 61 6e 64 20 66 72 65 65 20 61 20 6c  ize and free a l
38f0: 69 73 74 20 6f 66 20 70 72 65 70 61 72 65 64 20  ist of prepared 
3900: 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74  statements.*/.st
3910: 61 74 69 63 20 76 6f 69 64 20 66 6c 75 73 68 53  atic void flushS
3920: 74 6d 74 43 61 63 68 65 28 53 71 6c 69 74 65 44  tmtCache(SqliteD
3930: 62 20 2a 70 44 62 29 7b 0a 20 20 53 71 6c 50 72  b *pDb){.  SqlPr
3940: 65 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65  eparedStmt *pPre
3950: 53 74 6d 74 3b 0a 20 20 53 71 6c 50 72 65 70 61  Stmt;.  SqlPrepa
3960: 72 65 64 53 74 6d 74 20 2a 70 4e 65 78 74 3b 0a  redStmt *pNext;.
3970: 0a 20 20 66 6f 72 28 70 50 72 65 53 74 6d 74 20  .  for(pPreStmt 
3980: 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 3b  = pDb->stmtList;
3990: 20 70 50 72 65 53 74 6d 74 3b 20 70 50 72 65 53   pPreStmt; pPreS
39a0: 74 6d 74 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  tmt=pNext){.    
39b0: 70 4e 65 78 74 20 3d 20 70 50 72 65 53 74 6d 74  pNext = pPreStmt
39c0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 64 62 46  ->pNext;.    dbF
39d0: 72 65 65 53 74 6d 74 28 70 50 72 65 53 74 6d 74  reeStmt(pPreStmt
39e0: 29 3b 0a 20 20 7d 0a 20 20 70 44 62 2d 3e 6e 53  );.  }.  pDb->nS
39f0: 74 6d 74 20 3d 20 30 3b 0a 20 20 70 44 62 2d 3e  tmt = 0;.  pDb->
3a00: 73 74 6d 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20  stmtLast = 0;.  
3a10: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20  pDb->stmtList = 
3a20: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 43 4c 20  0;.}../*.** TCL 
3a30: 63 61 6c 6c 73 20 74 68 69 73 20 70 72 6f 63 65  calls this proce
3a40: 64 75 72 65 20 77 68 65 6e 20 61 6e 20 73 71 6c  dure when an sql
3a50: 69 74 65 33 20 64 61 74 61 62 61 73 65 20 63 6f  ite3 database co
3a60: 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 64 65 6c 65  mmand is.** dele
3a70: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ted..*/.static v
3a80: 6f 69 64 20 44 62 44 65 6c 65 74 65 43 6d 64 28  oid DbDeleteCmd(
3a90: 76 6f 69 64 20 2a 64 62 29 7b 0a 20 20 53 71 6c  void *db){.  Sql
3aa0: 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71  iteDb *pDb = (Sq
3ab0: 6c 69 74 65 44 62 2a 29 64 62 3b 0a 20 20 66 6c  liteDb*)db;.  fl
3ac0: 75 73 68 53 74 6d 74 43 61 63 68 65 28 70 44 62  ushStmtCache(pDb
3ad0: 29 3b 0a 20 20 63 6c 6f 73 65 49 6e 63 72 62 6c  );.  closeIncrbl
3ae0: 6f 62 43 68 61 6e 6e 65 6c 73 28 70 44 62 29 3b  obChannels(pDb);
3af0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  .  sqlite3_close
3b00: 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20 77 68 69  (pDb->db);.  whi
3b10: 6c 65 28 20 70 44 62 2d 3e 70 46 75 6e 63 20 29  le( pDb->pFunc )
3b20: 7b 0a 20 20 20 20 53 71 6c 46 75 6e 63 20 2a 70  {.    SqlFunc *p
3b30: 46 75 6e 63 20 3d 20 70 44 62 2d 3e 70 46 75 6e  Func = pDb->pFun
3b40: 63 3b 0a 20 20 20 20 70 44 62 2d 3e 70 46 75 6e  c;.    pDb->pFun
3b50: 63 20 3d 20 70 46 75 6e 63 2d 3e 70 4e 65 78 74  c = pFunc->pNext
3b60: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ;.    assert( pF
3b70: 75 6e 63 2d 3e 70 44 62 3d 3d 70 44 62 20 29 3b  unc->pDb==pDb );
3b80: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
3b90: 43 6f 75 6e 74 28 70 46 75 6e 63 2d 3e 70 53 63  Count(pFunc->pSc
3ba0: 72 69 70 74 29 3b 0a 20 20 20 20 54 63 6c 5f 46  ript);.    Tcl_F
3bb0: 72 65 65 28 28 63 68 61 72 2a 29 70 46 75 6e 63  ree((char*)pFunc
3bc0: 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  );.  }.  while( 
3bd0: 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20 29 7b  pDb->pCollate ){
3be0: 0a 20 20 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20  .    SqlCollate 
3bf0: 2a 70 43 6f 6c 6c 61 74 65 20 3d 20 70 44 62 2d  *pCollate = pDb-
3c00: 3e 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 70  >pCollate;.    p
3c10: 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20 3d 20 70  Db->pCollate = p
3c20: 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78 74 3b 0a  Collate->pNext;.
3c30: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68      Tcl_Free((ch
3c40: 61 72 2a 29 70 43 6f 6c 6c 61 74 65 29 3b 0a 20  ar*)pCollate);. 
3c50: 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 42   }.  if( pDb->zB
3c60: 75 73 79 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46  usy ){.    Tcl_F
3c70: 72 65 65 28 70 44 62 2d 3e 7a 42 75 73 79 29 3b  ree(pDb->zBusy);
3c80: 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e  .  }.  if( pDb->
3c90: 7a 54 72 61 63 65 20 29 7b 0a 20 20 20 20 54 63  zTrace ){.    Tc
3ca0: 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 54 72 61  l_Free(pDb->zTra
3cb0: 63 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ce);.  }.  if( p
3cc0: 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a  Db->zProfile ){.
3cd0: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
3ce0: 2d 3e 7a 50 72 6f 66 69 6c 65 29 3b 0a 20 20 7d  ->zProfile);.  }
3cf0: 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74  .  if( pDb->zAut
3d00: 68 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65  h ){.    Tcl_Fre
3d10: 65 28 70 44 62 2d 3e 7a 41 75 74 68 29 3b 0a 20  e(pDb->zAuth);. 
3d20: 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 4e   }.  if( pDb->zN
3d30: 75 6c 6c 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46  ull ){.    Tcl_F
3d40: 72 65 65 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29 3b  ree(pDb->zNull);
3d50: 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e  .  }.  if( pDb->
3d60: 70 55 70 64 61 74 65 48 6f 6f 6b 20 29 7b 0a 20  pUpdateHook ){. 
3d70: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
3d80: 75 6e 74 28 70 44 62 2d 3e 70 55 70 64 61 74 65  unt(pDb->pUpdate
3d90: 48 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Hook);.  }.  if(
3da0: 20 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48   pDb->pRollbackH
3db0: 6f 6f 6b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44  ook ){.    Tcl_D
3dc0: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d  ecrRefCount(pDb-
3dd0: 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 29 3b  >pRollbackHook);
3de0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e  .  }.  if( pDb->
3df0: 70 57 61 6c 48 6f 6f 6b 20 29 7b 0a 20 20 20 20  pWalHook ){.    
3e00: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
3e10: 28 70 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 29 3b  (pDb->pWalHook);
3e20: 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e  .  }.  if( pDb->
3e30: 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 20 29  pCollateNeeded )
3e40: 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  {.    Tcl_DecrRe
3e50: 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c  fCount(pDb->pCol
3e60: 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 7d  lateNeeded);.  }
3e70: 0a 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61  .  Tcl_Free((cha
3e80: 72 2a 29 70 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  r*)pDb);.}../*.*
3e90: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
3ea0: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
3eb0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
3ec0: 20 6c 6f 63 6b 65 64 20 77 68 69 6c 65 20 74 72   locked while tr
3ed0: 79 69 6e 67 0a 2a 2a 20 74 6f 20 65 78 65 63 75  ying.** to execu
3ee0: 74 65 20 53 51 4c 2e 0a 2a 2f 0a 73 74 61 74 69  te SQL..*/.stati
3ef0: 63 20 69 6e 74 20 44 62 42 75 73 79 48 61 6e 64  c int DbBusyHand
3f00: 6c 65 72 28 76 6f 69 64 20 2a 63 64 2c 20 69 6e  ler(void *cd, in
3f10: 74 20 6e 54 72 69 65 73 29 7b 0a 20 20 53 71 6c  t nTries){.  Sql
3f20: 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71  iteDb *pDb = (Sq
3f30: 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e  liteDb*)cd;.  in
3f40: 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 56 61  t rc;.  char zVa
3f50: 6c 5b 33 30 5d 3b 0a 0a 20 20 73 71 6c 69 74 65  l[30];..  sqlite
3f60: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
3f70: 66 28 7a 56 61 6c 29 2c 20 7a 56 61 6c 2c 20 22  f(zVal), zVal, "
3f80: 25 64 22 2c 20 6e 54 72 69 65 73 29 3b 0a 20 20  %d", nTries);.  
3f90: 72 63 20 3d 20 54 63 6c 5f 56 61 72 45 76 61 6c  rc = Tcl_VarEval
3fa0: 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44  (pDb->interp, pD
3fb0: 62 2d 3e 7a 42 75 73 79 2c 20 22 20 22 2c 20 7a  b->zBusy, " ", z
3fc0: 56 61 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  Val, (char*)0);.
3fd0: 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b    if( rc!=TCL_OK
3fe0: 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65 74   || atoi(Tcl_Get
3ff0: 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62  StringResult(pDb
4000: 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a 20 20  ->interp)) ){.  
4010: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
4020: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 23    return 1;.}..#
4030: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4040: 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c  IT_PROGRESS_CALL
4050: 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  BACK./*.** This 
4060: 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b  routine is invok
4070: 65 64 20 61 73 20 74 68 65 20 27 70 72 6f 67 72  ed as the 'progr
4080: 65 73 73 20 63 61 6c 6c 62 61 63 6b 27 20 66 6f  ess callback' fo
4090: 72 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  r the database..
40a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62  */.static int Db
40b0: 50 72 6f 67 72 65 73 73 48 61 6e 64 6c 65 72 28  ProgressHandler(
40c0: 76 6f 69 64 20 2a 63 64 29 7b 0a 20 20 53 71 6c  void *cd){.  Sql
40d0: 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71  iteDb *pDb = (Sq
40e0: 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e  liteDb*)cd;.  in
40f0: 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
4100: 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20   pDb->zProgress 
4110: 29 3b 0a 20 20 72 63 20 3d 20 54 63 6c 5f 45 76  );.  rc = Tcl_Ev
4120: 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  al(pDb->interp, 
4130: 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 29 3b  pDb->zProgress);
4140: 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f  .  if( rc!=TCL_O
4150: 4b 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65  K || atoi(Tcl_Ge
4160: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44  tStringResult(pD
4170: 62 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a 20  b->interp)) ){. 
4180: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
4190: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
41a0: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
41b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
41c0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
41d0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
41e0: 20 74 68 65 20 53 51 4c 69 74 65 20 74 72 61 63   the SQLite trac
41f0: 65 20 68 61 6e 64 6c 65 72 20 77 68 65 6e 65 76  e handler whenev
4200: 65 72 20 61 20 6e 65 77 0a 2a 2a 20 62 6c 6f 63  er a new.** bloc
4210: 6b 20 6f 66 20 53 51 4c 20 69 73 20 65 78 65 63  k of SQL is exec
4220: 75 74 65 64 2e 20 20 54 68 65 20 54 43 4c 20 73  uted.  The TCL s
4230: 63 72 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a 54  cript in pDb->zT
4240: 72 61 63 65 20 69 73 20 65 78 65 63 75 74 65 64  race is executed
4250: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4260: 20 44 62 54 72 61 63 65 48 61 6e 64 6c 65 72 28   DbTraceHandler(
4270: 76 6f 69 64 20 2a 63 64 2c 20 63 6f 6e 73 74 20  void *cd, const 
4280: 63 68 61 72 20 2a 7a 53 71 6c 29 7b 0a 20 20 53  char *zSql){.  S
4290: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
42a0: 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20  SqliteDb*)cd;.  
42b0: 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b  Tcl_DString str;
42c0: 0a 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49  ..  Tcl_DStringI
42d0: 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 54 63 6c  nit(&str);.  Tcl
42e0: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26  _DStringAppend(&
42f0: 73 74 72 2c 20 70 44 62 2d 3e 7a 54 72 61 63 65  str, pDb->zTrace
4300: 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74  , -1);.  Tcl_DSt
4310: 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e  ringAppendElemen
4320: 74 28 26 73 74 72 2c 20 7a 53 71 6c 29 3b 0a 20  t(&str, zSql);. 
4330: 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69   Tcl_Eval(pDb->i
4340: 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53 74 72 69  nterp, Tcl_DStri
4350: 6e 67 56 61 6c 75 65 28 26 73 74 72 29 29 3b 0a  ngValue(&str));.
4360: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
4370: 65 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f 52  e(&str);.  Tcl_R
4380: 65 73 65 74 52 65 73 75 6c 74 28 70 44 62 2d 3e  esetResult(pDb->
4390: 69 6e 74 65 72 70 29 3b 0a 7d 0a 23 65 6e 64 69  interp);.}.#endi
43a0: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
43b0: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a  E_OMIT_TRACE./*.
43c0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
43d0: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
43e0: 20 53 51 4c 69 74 65 20 70 72 6f 66 69 6c 65 20   SQLite profile 
43f0: 68 61 6e 64 6c 65 72 20 61 66 74 65 72 20 61 20  handler after a 
4400: 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 53 51 4c  statement.** SQL
4410: 20 68 61 73 20 65 78 65 63 75 74 65 64 2e 20 20   has executed.  
4420: 54 68 65 20 54 43 4c 20 73 63 72 69 70 74 20 69  The TCL script i
4430: 6e 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20  n pDb->zProfile 
4440: 69 73 20 65 76 61 6c 75 61 74 65 64 2e 0a 2a 2f  is evaluated..*/
4450: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44 62 50  .static void DbP
4460: 72 6f 66 69 6c 65 48 61 6e 64 6c 65 72 28 76 6f  rofileHandler(vo
4470: 69 64 20 2a 63 64 2c 20 63 6f 6e 73 74 20 63 68  id *cd, const ch
4480: 61 72 20 2a 7a 53 71 6c 2c 20 73 71 6c 69 74 65  ar *zSql, sqlite
4490: 5f 75 69 6e 74 36 34 20 74 6d 29 7b 0a 20 20 53  _uint64 tm){.  S
44a0: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
44b0: 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20  SqliteDb*)cd;.  
44c0: 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b  Tcl_DString str;
44d0: 0a 20 20 63 68 61 72 20 7a 54 6d 5b 31 30 30 5d  .  char zTm[100]
44e0: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ;..  sqlite3_snp
44f0: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 54 6d  rintf(sizeof(zTm
4500: 29 2d 31 2c 20 7a 54 6d 2c 20 22 25 6c 6c 64 22  )-1, zTm, "%lld"
4510: 2c 20 74 6d 29 3b 0a 20 20 54 63 6c 5f 44 53 74  , tm);.  Tcl_DSt
4520: 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a  ringInit(&str);.
4530: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
4540: 65 6e 64 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a  end(&str, pDb->z
4550: 50 72 6f 66 69 6c 65 2c 20 2d 31 29 3b 0a 20 20  Profile, -1);.  
4560: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
4570: 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a  dElement(&str, z
4580: 53 71 6c 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  Sql);.  Tcl_DStr
4590: 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ingAppendElement
45a0: 28 26 73 74 72 2c 20 7a 54 6d 29 3b 0a 20 20 54  (&str, zTm);.  T
45b0: 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74  cl_Eval(pDb->int
45c0: 65 72 70 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67  erp, Tcl_DString
45d0: 56 61 6c 75 65 28 26 73 74 72 29 29 3b 0a 20 20  Value(&str));.  
45e0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
45f0: 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f 52 65 73  &str);.  Tcl_Res
4600: 65 74 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e  etResult(pDb->in
4610: 74 65 72 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  terp);.}.#endif.
4620: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
4630: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
4640: 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  en a transaction
4650: 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20   is committed.  
4660: 54 68 65 0a 2a 2a 20 54 43 4c 20 73 63 72 69 70  The.** TCL scrip
4670: 74 20 69 6e 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69  t in pDb->zCommi
4680: 74 20 69 73 20 65 78 65 63 75 74 65 64 2e 20 20  t is executed.  
4690: 49 66 20 69 74 20 72 65 74 75 72 6e 73 20 6e 6f  If it returns no
46a0: 6e 2d 7a 65 72 6f 20 6f 72 0a 2a 2a 20 69 66 20  n-zero or.** if 
46b0: 69 74 20 74 68 72 6f 77 73 20 61 6e 20 65 78 63  it throws an exc
46c0: 65 70 74 69 6f 6e 2c 20 74 68 65 20 74 72 61 6e  eption, the tran
46d0: 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
46e0: 64 20 62 61 63 6b 20 69 6e 73 74 65 61 64 0a 2a  d back instead.*
46f0: 2a 20 6f 66 20 62 65 69 6e 67 20 63 6f 6d 6d 69  * of being commi
4700: 74 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tted..*/.static 
4710: 69 6e 74 20 44 62 43 6f 6d 6d 69 74 48 61 6e 64  int DbCommitHand
4720: 6c 65 72 28 76 6f 69 64 20 2a 63 64 29 7b 0a 20  ler(void *cd){. 
4730: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
4740: 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a   (SqliteDb*)cd;.
4750: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20    int rc;..  rc 
4760: 3d 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e  = Tcl_Eval(pDb->
4770: 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 43 6f  interp, pDb->zCo
4780: 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21  mmit);.  if( rc!
4790: 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28  =TCL_OK || atoi(
47a0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73  Tcl_GetStringRes
47b0: 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29  ult(pDb->interp)
47c0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
47d0: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
47e0: 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  0;.}..static voi
47f0: 64 20 44 62 52 6f 6c 6c 62 61 63 6b 48 61 6e 64  d DbRollbackHand
4800: 6c 65 72 28 76 6f 69 64 20 2a 63 6c 69 65 6e 74  ler(void *client
4810: 44 61 74 61 29 7b 0a 20 20 53 71 6c 69 74 65 44  Data){.  SqliteD
4820: 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65  b *pDb = (Sqlite
4830: 44 62 2a 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a  Db*)clientData;.
4840: 20 20 61 73 73 65 72 74 28 70 44 62 2d 3e 70 52    assert(pDb->pR
4850: 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 29 3b 0a 20 20  ollbackHook);.  
4860: 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f  if( TCL_OK!=Tcl_
4870: 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69  EvalObjEx(pDb->i
4880: 6e 74 65 72 70 2c 20 70 44 62 2d 3e 70 52 6f 6c  nterp, pDb->pRol
4890: 6c 62 61 63 6b 48 6f 6f 6b 2c 20 30 29 20 29 7b  lbackHook, 0) ){
48a0: 0a 20 20 20 20 54 63 6c 5f 42 61 63 6b 67 72 6f  .    Tcl_Backgro
48b0: 75 6e 64 45 72 72 6f 72 28 70 44 62 2d 3e 69 6e  undError(pDb->in
48c0: 74 65 72 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  terp);.  }.}../*
48d0: 0a 2a 2a 20 54 68 69 73 20 70 72 6f 63 65 64 75  .** This procedu
48e0: 72 65 20 68 61 6e 64 6c 65 73 20 77 61 6c 5f 68  re handles wal_h
48f0: 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 2a  ook callbacks..*
4900: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 57  /.static int DbW
4910: 61 6c 48 61 6e 64 6c 65 72 28 0a 20 20 76 6f 69  alHandler(.  voi
4920: 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c 20 0a  d *clientData, .
4930: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a    sqlite3 *db, .
4940: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
4950: 62 2c 20 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79  b, .  int nEntry
4960: 0a 29 7b 0a 20 20 69 6e 74 20 72 65 74 20 3d 20  .){.  int ret = 
4970: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 54 63 6c  SQLITE_OK;.  Tcl
4980: 5f 4f 62 6a 20 2a 70 3b 0a 20 20 53 71 6c 69 74  _Obj *p;.  Sqlit
4990: 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69  eDb *pDb = (Sqli
49a0: 74 65 44 62 2a 29 63 6c 69 65 6e 74 44 61 74 61  teDb*)clientData
49b0: 3b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ;.  Tcl_Interp *
49c0: 69 6e 74 65 72 70 20 3d 20 70 44 62 2d 3e 69 6e  interp = pDb->in
49d0: 74 65 72 70 3b 0a 20 20 61 73 73 65 72 74 28 70  terp;.  assert(p
49e0: 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 29 3b 0a 0a  Db->pWalHook);..
49f0: 20 20 70 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63    p = Tcl_Duplic
4a00: 61 74 65 4f 62 6a 28 70 44 62 2d 3e 70 57 61 6c  ateObj(pDb->pWal
4a10: 48 6f 6f 6b 29 3b 0a 20 20 54 63 6c 5f 49 6e 63  Hook);.  Tcl_Inc
4a20: 72 52 65 66 43 6f 75 6e 74 28 70 29 3b 0a 20 20  rRefCount(p);.  
4a30: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
4a40: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
4a50: 20 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e   p, Tcl_NewStrin
4a60: 67 4f 62 6a 28 7a 44 62 2c 20 2d 31 29 29 3b 0a  gObj(zDb, -1));.
4a70: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
4a80: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
4a90: 70 2c 20 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  p, p, Tcl_NewInt
4aa0: 4f 62 6a 28 6e 45 6e 74 72 79 29 29 3b 0a 20 20  Obj(nEntry));.  
4ab0: 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f  if( TCL_OK!=Tcl_
4ac0: 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70  EvalObjEx(interp
4ad0: 2c 20 70 2c 20 30 29 20 0a 20 20 20 7c 7c 20 54  , p, 0) .   || T
4ae0: 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e  CL_OK!=Tcl_GetIn
4af0: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
4b00: 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c   Tcl_GetObjResul
4b10: 74 28 69 6e 74 65 72 70 29 2c 20 26 72 65 74 29  t(interp), &ret)
4b20: 0a 20 20 29 7b 0a 20 20 20 20 54 63 6c 5f 42 61  .  ){.    Tcl_Ba
4b30: 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e  ckgroundError(in
4b40: 74 65 72 70 29 3b 0a 20 20 7d 0a 20 20 54 63 6c  terp);.  }.  Tcl
4b50: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 29  _DecrRefCount(p)
4b60: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b  ;..  return ret;
4b70: 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .}..#if defined(
4b80: 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20  SQLITE_TEST) && 
4b90: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
4ba0: 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54  NABLE_UNLOCK_NOT
4bb0: 49 46 59 29 0a 73 74 61 74 69 63 20 76 6f 69 64  IFY).static void
4bc0: 20 73 65 74 54 65 73 74 55 6e 6c 6f 63 6b 4e 6f   setTestUnlockNo
4bd0: 74 69 66 79 56 61 72 73 28 54 63 6c 5f 49 6e 74  tifyVars(Tcl_Int
4be0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
4bf0: 20 69 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 29   iArg, int nArg)
4c00: 7b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 36 34  {.  char zBuf[64
4c10: 5d 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75  ];.  sprintf(zBu
4c20: 66 2c 20 22 25 64 22 2c 20 69 41 72 67 29 3b 0a  f, "%d", iArg);.
4c30: 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74    Tcl_SetVar(int
4c40: 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 75 6e 6c  erp, "sqlite_unl
4c50: 6f 63 6b 5f 6e 6f 74 69 66 79 5f 61 72 67 22 2c  ock_notify_arg",
4c60: 20 7a 42 75 66 2c 20 54 43 4c 5f 47 4c 4f 42 41   zBuf, TCL_GLOBA
4c70: 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 73 70 72 69 6e  L_ONLY);.  sprin
4c80: 74 66 28 7a 42 75 66 2c 20 22 25 64 22 2c 20 6e  tf(zBuf, "%d", n
4c90: 41 72 67 29 3b 0a 20 20 54 63 6c 5f 53 65 74 56  Arg);.  Tcl_SetV
4ca0: 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
4cb0: 74 65 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79  te_unlock_notify
4cc0: 5f 61 72 67 63 6f 75 6e 74 22 2c 20 7a 42 75 66  _argcount", zBuf
4cd0: 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c  , TCL_GLOBAL_ONL
4ce0: 59 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  Y);.}.#else.# de
4cf0: 66 69 6e 65 20 73 65 74 54 65 73 74 55 6e 6c 6f  fine setTestUnlo
4d00: 63 6b 4e 6f 74 69 66 79 56 61 72 73 28 78 2c 79  ckNotifyVars(x,y
4d10: 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  ,z).#endif..#ifd
4d20: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
4d30: 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0a 73  _UNLOCK_NOTIFY.s
4d40: 74 61 74 69 63 20 76 6f 69 64 20 44 62 55 6e 6c  tatic void DbUnl
4d50: 6f 63 6b 4e 6f 74 69 66 79 28 76 6f 69 64 20 2a  ockNotify(void *
4d60: 2a 61 70 41 72 67 2c 20 69 6e 74 20 6e 41 72 67  *apArg, int nArg
4d70: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
4d80: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
4d90: 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69  ++){.    const i
4da0: 6e 74 20 66 6c 61 67 73 20 3d 20 28 54 43 4c 5f  nt flags = (TCL_
4db0: 45 56 41 4c 5f 47 4c 4f 42 41 4c 7c 54 43 4c 5f  EVAL_GLOBAL|TCL_
4dc0: 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20  EVAL_DIRECT);.  
4dd0: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
4de0: 3d 20 28 53 71 6c 69 74 65 44 62 20 2a 29 61 70  = (SqliteDb *)ap
4df0: 41 72 67 5b 69 5d 3b 0a 20 20 20 20 73 65 74 54  Arg[i];.    setT
4e00: 65 73 74 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 56  estUnlockNotifyV
4e10: 61 72 73 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  ars(pDb->interp,
4e20: 20 69 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 61   i, nArg);.    a
4e30: 73 73 65 72 74 28 20 70 44 62 2d 3e 70 55 6e 6c  ssert( pDb->pUnl
4e40: 6f 63 6b 4e 6f 74 69 66 79 29 3b 0a 20 20 20 20  ockNotify);.    
4e50: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44  Tcl_EvalObjEx(pD
4e60: 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e  b->interp, pDb->
4e70: 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 2c 20 66  pUnlockNotify, f
4e80: 6c 61 67 73 29 3b 0a 20 20 20 20 54 63 6c 5f 44  lags);.    Tcl_D
4e90: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d  ecrRefCount(pDb-
4ea0: 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 29 3b  >pUnlockNotify);
4eb0: 0a 20 20 20 20 70 44 62 2d 3e 70 55 6e 6c 6f 63  .    pDb->pUnloc
4ec0: 6b 4e 6f 74 69 66 79 20 3d 20 30 3b 0a 20 20 7d  kNotify = 0;.  }
4ed0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69  .}.#endif..stati
4ee0: 63 20 76 6f 69 64 20 44 62 55 70 64 61 74 65 48  c void DbUpdateH
4ef0: 61 6e 64 6c 65 72 28 0a 20 20 76 6f 69 64 20 2a  andler(.  void *
4f00: 70 2c 20 0a 20 20 69 6e 74 20 6f 70 2c 0a 20 20  p, .  int op,.  
4f10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c  const char *zDb,
4f20: 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
4f30: 7a 54 62 6c 2c 20 0a 20 20 73 71 6c 69 74 65 5f  zTbl, .  sqlite_
4f40: 69 6e 74 36 34 20 72 6f 77 69 64 0a 29 7b 0a 20  int64 rowid.){. 
4f50: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
4f60: 20 28 53 71 6c 69 74 65 44 62 20 2a 29 70 3b 0a   (SqliteDb *)p;.
4f70: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b    Tcl_Obj *pCmd;
4f80: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 2d  ..  assert( pDb-
4f90: 3e 70 55 70 64 61 74 65 48 6f 6f 6b 20 29 3b 0a  >pUpdateHook );.
4fa0: 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 51    assert( op==SQ
4fb0: 4c 49 54 45 5f 49 4e 53 45 52 54 20 7c 7c 20 6f  LITE_INSERT || o
4fc0: 70 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45  p==SQLITE_UPDATE
4fd0: 20 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 44   || op==SQLITE_D
4fe0: 45 4c 45 54 45 20 29 3b 0a 0a 20 20 70 43 6d 64  ELETE );..  pCmd
4ff0: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
5000: 4f 62 6a 28 70 44 62 2d 3e 70 55 70 64 61 74 65  Obj(pDb->pUpdate
5010: 48 6f 6f 6b 29 3b 0a 20 20 54 63 6c 5f 49 6e 63  Hook);.  Tcl_Inc
5020: 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b  rRefCount(pCmd);
5030: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
5040: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
5050: 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Cmd, Tcl_NewStri
5060: 6e 67 4f 62 6a 28 0a 20 20 20 20 28 20 28 6f 70  ngObj(.    ( (op
5070: 3d 3d 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 29  ==SQLITE_INSERT)
5080: 3f 22 49 4e 53 45 52 54 22 3a 28 6f 70 3d 3d 53  ?"INSERT":(op==S
5090: 51 4c 49 54 45 5f 55 50 44 41 54 45 29 3f 22 55  QLITE_UPDATE)?"U
50a0: 50 44 41 54 45 22 3a 22 44 45 4c 45 54 45 22 29  PDATE":"DELETE")
50b0: 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
50c0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
50d0: 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f  nt(0, pCmd, Tcl_
50e0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 44 62  NewStringObj(zDb
50f0: 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
5100: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
5110: 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f  nt(0, pCmd, Tcl_
5120: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54 62  NewStringObj(zTb
5130: 6c 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c  l, -1));.  Tcl_L
5140: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
5150: 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c  ent(0, pCmd, Tcl
5160: 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 72  _NewWideIntObj(r
5170: 6f 77 69 64 29 29 3b 0a 20 20 54 63 6c 5f 45 76  owid));.  Tcl_Ev
5180: 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69 6e 74  alObjEx(pDb->int
5190: 65 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c 5f 45  erp, pCmd, TCL_E
51a0: 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20 54  VAL_DIRECT);.  T
51b0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
51c0: 70 43 6d 64 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  pCmd);.}..static
51d0: 20 76 6f 69 64 20 74 63 6c 43 6f 6c 6c 61 74 65   void tclCollate
51e0: 4e 65 65 64 65 64 28 0a 20 20 76 6f 69 64 20 2a  Needed(.  void *
51f0: 70 43 74 78 2c 0a 20 20 73 71 6c 69 74 65 33 20  pCtx,.  sqlite3 
5200: 2a 64 62 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a  *db,.  int enc,.
5210: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
5220: 61 6d 65 0a 29 7b 0a 20 20 53 71 6c 69 74 65 44  ame.){.  SqliteD
5230: 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65  b *pDb = (Sqlite
5240: 44 62 20 2a 29 70 43 74 78 3b 0a 20 20 54 63 6c  Db *)pCtx;.  Tcl
5250: 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 20 3d 20  _Obj *pScript = 
5260: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
5270: 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65  (pDb->pCollateNe
5280: 65 64 65 64 29 3b 0a 20 20 54 63 6c 5f 49 6e 63  eded);.  Tcl_Inc
5290: 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70  rRefCount(pScrip
52a0: 74 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  t);.  Tcl_ListOb
52b0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
52c0: 2c 20 70 53 63 72 69 70 74 2c 20 54 63 6c 5f 4e  , pScript, Tcl_N
52d0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 4e 61 6d  ewStringObj(zNam
52e0: 65 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45  e, -1));.  Tcl_E
52f0: 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69 6e  valObjEx(pDb->in
5300: 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20 30  terp, pScript, 0
5310: 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66  );.  Tcl_DecrRef
5320: 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a  Count(pScript);.
5330: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
5340: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
5350: 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20 53  to evaluate an S
5360: 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e  QL collation fun
5370: 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 65  ction implemente
5380: 64 0a 2a 2a 20 75 73 69 6e 67 20 54 43 4c 20 73  d.** using TCL s
5390: 63 72 69 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  cript..*/.static
53a0: 20 69 6e 74 20 74 63 6c 53 71 6c 43 6f 6c 6c 61   int tclSqlColla
53b0: 74 65 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78  te(.  void *pCtx
53c0: 2c 0a 20 20 69 6e 74 20 6e 41 2c 0a 20 20 63 6f  ,.  int nA,.  co
53d0: 6e 73 74 20 76 6f 69 64 20 2a 7a 41 2c 0a 20 20  nst void *zA,.  
53e0: 69 6e 74 20 6e 42 2c 0a 20 20 63 6f 6e 73 74 20  int nB,.  const 
53f0: 76 6f 69 64 20 2a 7a 42 0a 29 7b 0a 20 20 53 71  void *zB.){.  Sq
5400: 6c 43 6f 6c 6c 61 74 65 20 2a 70 20 3d 20 28 53  lCollate *p = (S
5410: 71 6c 43 6f 6c 6c 61 74 65 20 2a 29 70 43 74 78  qlCollate *)pCtx
5420: 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d  ;.  Tcl_Obj *pCm
5430: 64 3b 0a 0a 20 20 70 43 6d 64 20 3d 20 54 63 6c  d;..  pCmd = Tcl
5440: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 2d  _NewStringObj(p-
5450: 3e 7a 53 63 72 69 70 74 2c 20 2d 31 29 3b 0a 20  >zScript, -1);. 
5460: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
5470: 74 28 70 43 6d 64 29 3b 0a 20 20 54 63 6c 5f 4c  t(pCmd);.  Tcl_L
5480: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
5490: 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70  ent(p->interp, p
54a0: 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Cmd, Tcl_NewStri
54b0: 6e 67 4f 62 6a 28 7a 41 2c 20 6e 41 29 29 3b 0a  ngObj(zA, nA));.
54c0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
54d0: 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d 3e 69 6e  endElement(p->in
54e0: 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 63 6c 5f  terp, pCmd, Tcl_
54f0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 42 2c  NewStringObj(zB,
5500: 20 6e 42 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61   nB));.  Tcl_Eva
5510: 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70  lObjEx(p->interp
5520: 2c 20 70 43 6d 64 2c 20 54 43 4c 5f 45 56 41 4c  , pCmd, TCL_EVAL
5530: 5f 44 49 52 45 43 54 29 3b 0a 20 20 54 63 6c 5f  _DIRECT);.  Tcl_
5540: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d  DecrRefCount(pCm
5550: 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 61 74  d);.  return (at
5560: 6f 69 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  oi(Tcl_GetString
5570: 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70  Result(p->interp
5580: 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  )));.}../*.** Th
5590: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
55a0: 6c 6c 65 64 20 74 6f 20 65 76 61 6c 75 61 74 65  lled to evaluate
55b0: 20 61 6e 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e   an SQL function
55c0: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20   implemented.** 
55d0: 75 73 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74  using TCL script
55e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
55f0: 20 74 63 6c 53 71 6c 46 75 6e 63 28 73 71 6c 69   tclSqlFunc(sqli
5600: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
5610: 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20  text, int argc, 
5620: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 61  sqlite3_value**a
5630: 72 67 76 29 7b 0a 20 20 53 71 6c 46 75 6e 63 20  rgv){.  SqlFunc 
5640: 2a 70 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65  *p = sqlite3_use
5650: 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29 3b  r_data(context);
5660: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64  .  Tcl_Obj *pCmd
5670: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
5680: 20 72 63 3b 0a 0a 20 20 69 66 28 20 61 72 67 63   rc;..  if( argc
5690: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ==0 ){.    /* If
56a0: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 61 72   there are no ar
56b0: 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 66  guments to the f
56c0: 75 6e 63 74 69 6f 6e 2c 20 63 61 6c 6c 20 54 63  unction, call Tc
56d0: 6c 5f 45 76 61 6c 4f 62 6a 45 78 20 6f 6e 20 74  l_EvalObjEx on t
56e0: 68 65 0a 20 20 20 20 2a 2a 20 73 63 72 69 70 74  he.    ** script
56f0: 20 6f 62 6a 65 63 74 20 64 69 72 65 63 74 6c 79   object directly
5700: 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74  .  This allows t
5710: 68 65 20 54 43 4c 20 63 6f 6d 70 69 6c 65 72 20  he TCL compiler 
5720: 74 6f 20 67 65 6e 65 72 61 74 65 0a 20 20 20 20  to generate.    
5730: 2a 2a 20 62 79 74 65 63 6f 64 65 20 66 6f 72 20  ** bytecode for 
5740: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6f 6e 20 74  the command on t
5750: 68 65 20 66 69 72 73 74 20 69 6e 76 6f 63 61 74  he first invocat
5760: 69 6f 6e 20 61 6e 64 20 74 68 75 73 20 6d 61 6b  ion and thus mak
5770: 65 0a 20 20 20 20 2a 2a 20 73 75 62 73 65 71 75  e.    ** subsequ
5780: 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73 20  ent invocations 
5790: 6d 75 63 68 20 66 61 73 74 65 72 2e 20 2a 2f 0a  much faster. */.
57a0: 20 20 20 20 70 43 6d 64 20 3d 20 70 2d 3e 70 53      pCmd = p->pS
57b0: 63 72 69 70 74 3b 0a 20 20 20 20 54 63 6c 5f 49  cript;.    Tcl_I
57c0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64  ncrRefCount(pCmd
57d0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 54 63 6c 5f  );.    rc = Tcl_
57e0: 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74  EvalObjEx(p->int
57f0: 65 72 70 2c 20 70 43 6d 64 2c 20 30 29 3b 0a 20  erp, pCmd, 0);. 
5800: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
5810: 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 7d 65 6c  unt(pCmd);.  }el
5820: 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  se{.    /* If th
5830: 65 72 65 20 61 72 65 20 61 72 67 75 6d 65 6e 74  ere are argument
5840: 73 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f  s to the functio
5850: 6e 2c 20 6d 61 6b 65 20 61 20 73 68 61 6c 6c 6f  n, make a shallo
5860: 77 20 63 6f 70 79 20 6f 66 20 74 68 65 0a 20 20  w copy of the.  
5870: 20 20 2a 2a 20 73 63 72 69 70 74 20 6f 62 6a 65    ** script obje
5880: 63 74 2c 20 6c 61 70 70 65 6e 64 20 74 68 65 20  ct, lappend the 
5890: 61 72 67 75 6d 65 6e 74 73 2c 20 74 68 65 6e 20  arguments, then 
58a0: 65 76 61 6c 75 61 74 65 20 74 68 65 20 63 6f 70  evaluate the cop
58b0: 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  y..    **.    **
58c0: 20 42 79 20 22 73 68 61 6c 6c 6f 77 22 20 63 6f   By "shallow" co
58d0: 70 79 2c 20 77 65 20 6d 65 61 6e 20 61 20 6f 6e  py, we mean a on
58e0: 6c 79 20 74 68 65 20 6f 75 74 65 72 20 6c 69 73  ly the outer lis
58f0: 74 20 54 63 6c 5f 4f 62 6a 20 69 73 20 64 75 70  t Tcl_Obj is dup
5900: 6c 69 63 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20  licated..    ** 
5910: 54 68 65 20 6e 65 77 20 54 63 6c 5f 4f 62 6a 20  The new Tcl_Obj 
5920: 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74 65 72  contains pointer
5930: 73 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  s to the origina
5940: 6c 20 6c 69 73 74 20 65 6c 65 6d 65 6e 74 73 2e  l list elements.
5950: 20 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 77 61   .    ** That wa
5960: 79 2c 20 77 68 65 6e 20 54 63 6c 5f 45 76 61 6c  y, when Tcl_Eval
5970: 4f 62 6a 76 28 29 20 69 73 20 72 75 6e 20 61 6e  Objv() is run an
5980: 64 20 73 68 69 6d 6d 65 72 73 20 74 68 65 20 66  d shimmers the f
5990: 69 72 73 74 20 65 6c 65 6d 65 6e 74 0a 20 20 20  irst element.   
59a0: 20 2a 2a 20 6f 66 20 74 68 65 20 6c 69 73 74 20   ** of the list 
59b0: 74 6f 20 74 63 6c 43 6d 64 4e 61 6d 65 54 79 70  to tclCmdNameTyp
59c0: 65 2c 20 74 68 61 74 20 61 6c 74 65 72 6e 61 74  e, that alternat
59d0: 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  e representation
59e0: 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20   will.    ** be 
59f0: 70 72 65 73 65 72 76 65 64 20 61 6e 64 20 72 65  preserved and re
5a00: 75 73 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74  used on the next
5a10: 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 20 20 20   invocation..   
5a20: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20   */.    Tcl_Obj 
5a30: 2a 2a 61 41 72 67 3b 0a 20 20 20 20 69 6e 74 20  **aArg;.    int 
5a40: 6e 41 72 67 3b 0a 20 20 20 20 69 66 28 20 54 63  nArg;.    if( Tc
5a50: 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d  l_ListObjGetElem
5a60: 65 6e 74 73 28 70 2d 3e 69 6e 74 65 72 70 2c 20  ents(p->interp, 
5a70: 70 2d 3e 70 53 63 72 69 70 74 2c 20 26 6e 41 72  p->pScript, &nAr
5a80: 67 2c 20 26 61 41 72 67 29 20 29 7b 0a 20 20 20  g, &aArg) ){.   
5a90: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
5aa0: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
5ab0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65   Tcl_GetStringRe
5ac0: 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c  sult(p->interp),
5ad0: 20 2d 31 29 3b 20 0a 20 20 20 20 20 20 72 65 74   -1); .      ret
5ae0: 75 72 6e 3b 0a 20 20 20 20 7d 20 20 20 20 20 0a  urn;.    }     .
5af0: 20 20 20 20 70 43 6d 64 20 3d 20 54 63 6c 5f 4e      pCmd = Tcl_N
5b00: 65 77 4c 69 73 74 4f 62 6a 28 6e 41 72 67 2c 20  ewListObj(nArg, 
5b10: 61 41 72 67 29 3b 0a 20 20 20 20 54 63 6c 5f 49  aArg);.    Tcl_I
5b20: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64  ncrRefCount(pCmd
5b30: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
5b40: 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20  i<argc; i++){.  
5b50: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
5b60: 65 20 2a 70 49 6e 20 3d 20 61 72 67 76 5b 69 5d  e *pIn = argv[i]
5b70: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20  ;.      Tcl_Obj 
5b80: 2a 70 56 61 6c 3b 0a 20 20 20 20 20 20 20 20 20  *pVal;.         
5b90: 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 53 65 74     .      /* Set
5ba0: 20 70 56 61 6c 20 74 6f 20 63 6f 6e 74 61 69 6e   pVal to contain
5bb0: 20 74 68 65 20 69 27 74 68 20 63 6f 6c 75 6d 6e   the i'th column
5bc0: 20 6f 66 20 74 68 69 73 20 72 6f 77 2e 20 2a 2f   of this row. */
5bd0: 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20 73  .      switch( s
5be0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
5bf0: 65 28 70 49 6e 29 20 29 7b 0a 20 20 20 20 20 20  e(pIn) ){.      
5c00: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 4c    case SQLITE_BL
5c10: 4f 42 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  OB: {.          
5c20: 69 6e 74 20 62 79 74 65 73 20 3d 20 73 71 6c 69  int bytes = sqli
5c30: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
5c40: 70 49 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pIn);.          
5c50: 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79  pVal = Tcl_NewBy
5c60: 74 65 41 72 72 61 79 4f 62 6a 28 73 71 6c 69 74  teArrayObj(sqlit
5c70: 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 70 49  e3_value_blob(pI
5c80: 6e 29 2c 20 62 79 74 65 73 29 3b 0a 20 20 20 20  n), bytes);.    
5c90: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5ca0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63       }.        c
5cb0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  ase SQLITE_INTEG
5cc0: 45 52 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ER: {.          
5cd0: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 76 20 3d  sqlite_int64 v =
5ce0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
5cf0: 6e 74 36 34 28 70 49 6e 29 3b 0a 20 20 20 20 20  nt64(pIn);.     
5d00: 20 20 20 20 20 69 66 28 20 76 3e 3d 2d 32 31 34       if( v>=-214
5d10: 37 34 38 33 36 34 37 20 26 26 20 76 3c 3d 32 31  7483647 && v<=21
5d20: 34 37 34 38 33 36 34 37 20 29 7b 0a 20 20 20 20  47483647 ){.    
5d30: 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54          pVal = T
5d40: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 28 69 6e  cl_NewIntObj((in
5d50: 74 29 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  t)v);.          
5d60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
5d70: 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65     pVal = Tcl_Ne
5d80: 77 57 69 64 65 49 6e 74 4f 62 6a 28 76 29 3b 0a  wWideIntObj(v);.
5d90: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
5da0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5db0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63       }.        c
5dc0: 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54  ase SQLITE_FLOAT
5dd0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 64 6f  : {.          do
5de0: 75 62 6c 65 20 72 20 3d 20 73 71 6c 69 74 65 33  uble r = sqlite3
5df0: 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 70 49  _value_double(pI
5e00: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 56  n);.          pV
5e10: 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 44 6f 75 62  al = Tcl_NewDoub
5e20: 6c 65 4f 62 6a 28 72 29 3b 0a 20 20 20 20 20 20  leObj(r);.      
5e30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
5e40: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73     }.        cas
5e50: 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b  e SQLITE_NULL: {
5e60: 0a 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20  .          pVal 
5e70: 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
5e80: 62 6a 28 70 2d 3e 70 44 62 2d 3e 7a 4e 75 6c 6c  bj(p->pDb->zNull
5e90: 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20  , -1);.         
5ea0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
5eb0: 7d 0a 20 20 20 20 20 20 20 20 64 65 66 61 75 6c  }.        defaul
5ec0: 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69  t: {.          i
5ed0: 6e 74 20 62 79 74 65 73 20 3d 20 73 71 6c 69 74  nt bytes = sqlit
5ee0: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70  e3_value_bytes(p
5ef0: 49 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  In);.          p
5f00: 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72  Val = Tcl_NewStr
5f10: 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29 73  ingObj((char *)s
5f20: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
5f30: 74 28 70 49 6e 29 2c 20 62 79 74 65 73 29 3b 0a  t(pIn), bytes);.
5f40: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
5f50: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5f60: 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 54 63   }.      rc = Tc
5f70: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
5f80: 6c 65 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70  lement(p->interp
5f90: 2c 20 70 43 6d 64 2c 20 70 56 61 6c 29 3b 0a 20  , pCmd, pVal);. 
5fa0: 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
5fb0: 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52         Tcl_DecrR
5fc0: 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20  efCount(pCmd);. 
5fd0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
5fe0: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
5ff0: 65 78 74 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  ext, Tcl_GetStri
6000: 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65  ngResult(p->inte
6010: 72 70 29 2c 20 2d 31 29 3b 20 0a 20 20 20 20 20  rp), -1); .     
6020: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
6030: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
6040: 20 21 70 2d 3e 75 73 65 45 76 61 6c 4f 62 6a 76   !p->useEvalObjv
6050: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 63 6c   ){.      /* Tcl
6060: 5f 45 76 61 6c 4f 62 6a 45 78 28 29 20 77 69 6c  _EvalObjEx() wil
6070: 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  l automatically 
6080: 63 61 6c 6c 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  call Tcl_EvalObj
6090: 76 28 29 20 69 66 20 70 43 6d 64 0a 20 20 20 20  v() if pCmd.    
60a0: 20 20 2a 2a 20 69 73 20 61 20 6c 69 73 74 20 77    ** is a list w
60b0: 69 74 68 6f 75 74 20 61 20 73 74 72 69 6e 67 20  ithout a string 
60c0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20  representation. 
60d0: 20 54 6f 20 70 72 65 76 65 6e 74 20 74 68 69 73   To prevent this
60e0: 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 68   from.      ** h
60f0: 61 70 70 65 6e 69 6e 67 2c 20 6d 61 6b 65 20 73  appening, make s
6100: 75 72 65 20 70 43 6d 64 20 68 61 73 20 61 20 76  ure pCmd has a v
6110: 61 6c 69 64 20 73 74 72 69 6e 67 20 72 65 70 72  alid string repr
6120: 65 73 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20  esentation */.  
6130: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
6140: 67 28 70 43 6d 64 29 3b 0a 20 20 20 20 7d 0a 20  g(pCmd);.    }. 
6150: 20 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c     rc = Tcl_Eval
6160: 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c  ObjEx(p->interp,
6170: 20 70 43 6d 64 2c 20 54 43 4c 5f 45 56 41 4c 5f   pCmd, TCL_EVAL_
6180: 44 49 52 45 43 54 29 3b 0a 20 20 20 20 54 63 6c  DIRECT);.    Tcl
6190: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43  _DecrRefCount(pC
61a0: 6d 64 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  md);.  }..  if( 
61b0: 72 63 20 26 26 20 72 63 21 3d 54 43 4c 5f 52 45  rc && rc!=TCL_RE
61c0: 54 55 52 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69  TURN ){.    sqli
61d0: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
61e0: 28 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f 47 65  (context, Tcl_Ge
61f0: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 2d  tStringResult(p-
6200: 3e 69 6e 74 65 72 70 29 2c 20 2d 31 29 3b 20 0a  >interp), -1); .
6210: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c    }else{.    Tcl
6220: 5f 4f 62 6a 20 2a 70 56 61 72 20 3d 20 54 63 6c  _Obj *pVar = Tcl
6230: 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 70 2d  _GetObjResult(p-
6240: 3e 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 69 6e  >interp);.    in
6250: 74 20 6e 3b 0a 20 20 20 20 75 38 20 2a 64 61 74  t n;.    u8 *dat
6260: 61 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  a;.    const cha
6270: 72 20 2a 7a 54 79 70 65 20 3d 20 28 70 56 61 72  r *zType = (pVar
6280: 2d 3e 74 79 70 65 50 74 72 20 3f 20 70 56 61 72  ->typePtr ? pVar
6290: 2d 3e 74 79 70 65 50 74 72 2d 3e 6e 61 6d 65 20  ->typePtr->name 
62a0: 3a 20 22 22 29 3b 0a 20 20 20 20 63 68 61 72 20  : "");.    char 
62b0: 63 20 3d 20 7a 54 79 70 65 5b 30 5d 3b 0a 20 20  c = zType[0];.  
62c0: 20 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20    if( c=='b' && 
62d0: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 62 79  strcmp(zType,"by
62e0: 74 65 61 72 72 61 79 22 29 3d 3d 30 20 26 26 20  tearray")==0 && 
62f0: 70 56 61 72 2d 3e 62 79 74 65 73 3d 3d 30 20 29  pVar->bytes==0 )
6300: 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20  {.      /* Only 
6310: 72 65 74 75 72 6e 20 61 20 42 4c 4f 42 20 74 79  return a BLOB ty
6320: 70 65 20 69 66 20 74 68 65 20 54 63 6c 20 76 61  pe if the Tcl va
6330: 72 69 61 62 6c 65 20 69 73 20 61 20 62 79 74 65  riable is a byte
6340: 61 72 72 61 79 20 61 6e 64 0a 20 20 20 20 20 20  array and.      
6350: 2a 2a 20 68 61 73 20 6e 6f 20 73 74 72 69 6e 67  ** has no string
6360: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e   representation.
6370: 20 2a 2f 0a 20 20 20 20 20 20 64 61 74 61 20 3d   */.      data =
6380: 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61   Tcl_GetByteArra
6390: 79 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26  yFromObj(pVar, &
63a0: 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
63b0: 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 28 63 6f  3_result_blob(co
63c0: 6e 74 65 78 74 2c 20 64 61 74 61 2c 20 6e 2c 20  ntext, data, n, 
63d0: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
63e0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
63f0: 20 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d   c=='b' && strcm
6400: 70 28 7a 54 79 70 65 2c 22 62 6f 6f 6c 65 61 6e  p(zType,"boolean
6410: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54  ")==0 ){.      T
6420: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
6430: 28 30 2c 20 70 56 61 72 2c 20 26 6e 29 3b 0a 20  (0, pVar, &n);. 
6440: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
6450: 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c  ult_int(context,
6460: 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69   n);.    }else i
6470: 66 28 20 63 3d 3d 27 64 27 20 26 26 20 73 74 72  f( c=='d' && str
6480: 63 6d 70 28 7a 54 79 70 65 2c 22 64 6f 75 62 6c  cmp(zType,"doubl
6490: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
64a0: 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20 20 20  double r;.      
64b0: 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f  Tcl_GetDoubleFro
64c0: 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c 20 26 72  mObj(0, pVar, &r
64d0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
64e0: 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63  _result_double(c
64f0: 6f 6e 74 65 78 74 2c 20 72 29 3b 0a 20 20 20 20  ontext, r);.    
6500: 7d 65 6c 73 65 20 69 66 28 20 28 63 3d 3d 27 77  }else if( (c=='w
6510: 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70  ' && strcmp(zTyp
6520: 65 2c 22 77 69 64 65 49 6e 74 22 29 3d 3d 30 29  e,"wideInt")==0)
6530: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 28 63   ||.          (c
6540: 3d 3d 27 69 27 20 26 26 20 73 74 72 63 6d 70 28  =='i' && strcmp(
6550: 7a 54 79 70 65 2c 22 69 6e 74 22 29 3d 3d 30 29  zType,"int")==0)
6560: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 69   ){.      Tcl_Wi
6570: 64 65 49 6e 74 20 76 3b 0a 20 20 20 20 20 20 54  deInt v;.      T
6580: 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f  cl_GetWideIntFro
6590: 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c 20 26 76  mObj(0, pVar, &v
65a0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
65b0: 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f  _result_int64(co
65c0: 6e 74 65 78 74 2c 20 76 29 3b 0a 20 20 20 20 7d  ntext, v);.    }
65d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 61 74 61  else{.      data
65e0: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
65f0: 72 20 2a 29 54 63 6c 5f 47 65 74 53 74 72 69 6e  r *)Tcl_GetStrin
6600: 67 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26  gFromObj(pVar, &
6610: 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
6620: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
6630: 6e 74 65 78 74 2c 20 28 63 68 61 72 20 2a 29 64  ntext, (char *)d
6640: 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 54  ata, n, SQLITE_T
6650: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d  RANSIENT);.    }
6660: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
6670: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
6680: 4f 52 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20  ORIZATION./*.** 
6690: 54 68 69 73 20 69 73 20 74 68 65 20 61 75 74 68  This is the auth
66a0: 65 6e 74 69 63 61 74 69 6f 6e 20 66 75 6e 63 74  entication funct
66b0: 69 6f 6e 2e 20 20 49 74 20 61 70 70 65 6e 64 73  ion.  It appends
66c0: 20 74 68 65 20 61 75 74 68 65 6e 74 69 63 61 74   the authenticat
66d0: 69 6f 6e 0a 2a 2a 20 74 79 70 65 20 63 6f 64 65  ion.** type code
66e0: 20 61 6e 64 20 74 68 65 20 74 77 6f 20 61 72 67   and the two arg
66f0: 75 6d 65 6e 74 73 20 74 6f 20 7a 43 6d 64 5b 5d  uments to zCmd[]
6700: 20 74 68 65 6e 20 69 6e 76 6f 6b 65 73 20 74 68   then invokes th
6710: 65 20 72 65 73 75 6c 74 0a 2a 2a 20 6f 6e 20 74  e result.** on t
6720: 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 20  he interpreter. 
6730: 20 54 68 65 20 72 65 70 6c 79 20 69 73 20 65 78   The reply is ex
6740: 61 6d 69 6e 65 64 20 74 6f 20 64 65 74 65 72 6d  amined to determ
6750: 69 6e 65 20 69 66 20 74 68 65 0a 2a 2a 20 61 75  ine if the.** au
6760: 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 66 61 69  thentication fai
6770: 6c 73 20 6f 72 20 73 75 63 63 65 65 64 73 2e 0a  ls or succeeds..
6780: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75  */.static int au
6790: 74 68 5f 63 61 6c 6c 62 61 63 6b 28 0a 20 20 76  th_callback(.  v
67a0: 6f 69 64 20 2a 70 41 72 67 2c 0a 20 20 69 6e 74  oid *pArg,.  int
67b0: 20 63 6f 64 65 2c 0a 20 20 63 6f 6e 73 74 20 63   code,.  const c
67c0: 68 61 72 20 2a 7a 41 72 67 31 2c 0a 20 20 63 6f  har *zArg1,.  co
67d0: 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 32 2c  nst char *zArg2,
67e0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
67f0: 41 72 67 33 2c 0a 20 20 63 6f 6e 73 74 20 63 68  Arg3,.  const ch
6800: 61 72 20 2a 7a 41 72 67 34 0a 29 7b 0a 20 20 63  ar *zArg4.){.  c
6810: 68 61 72 20 2a 7a 43 6f 64 65 3b 0a 20 20 54 63  har *zCode;.  Tc
6820: 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a 20  l_DString str;. 
6830: 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74   int rc;.  const
6840: 20 63 68 61 72 20 2a 7a 52 65 70 6c 79 3b 0a 20   char *zReply;. 
6850: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
6860: 20 28 53 71 6c 69 74 65 44 62 2a 29 70 41 72 67   (SqliteDb*)pArg
6870: 3b 0a 20 20 69 66 28 20 70 44 62 2d 3e 64 69 73  ;.  if( pDb->dis
6880: 61 62 6c 65 41 75 74 68 20 29 20 72 65 74 75 72  ableAuth ) retur
6890: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
68a0: 73 77 69 74 63 68 28 20 63 6f 64 65 20 29 7b 0a  switch( code ){.
68b0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
68c0: 43 4f 50 59 20 20 20 20 20 20 20 20 20 20 20 20  COPY            
68d0: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
68e0: 45 5f 43 4f 50 59 22 3b 20 62 72 65 61 6b 3b 0a  E_COPY"; break;.
68f0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
6900: 43 52 45 41 54 45 5f 49 4e 44 45 58 20 20 20 20  CREATE_INDEX    
6910: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
6920: 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 22 3b  E_CREATE_INDEX";
6930: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
6940: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
6950: 41 42 4c 45 20 20 20 20 20 20 3a 20 7a 43 6f 64  ABLE      : zCod
6960: 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45  e="SQLITE_CREATE
6970: 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a  _TABLE"; break;.
6980: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
6990: 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45  CREATE_TEMP_INDE
69a0: 58 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54  X : zCode="SQLIT
69b0: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e  E_CREATE_TEMP_IN
69c0: 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  DEX"; break;.   
69d0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45   case SQLITE_CRE
69e0: 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 20 3a  ATE_TEMP_TABLE :
69f0: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43   zCode="SQLITE_C
6a00: 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45  REATE_TEMP_TABLE
6a10: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
6a20: 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45  se SQLITE_CREATE
6a30: 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 3a 20 7a  _TEMP_TRIGGER: z
6a40: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45  Code="SQLITE_CRE
6a50: 41 54 45 5f 54 45 4d 50 5f 54 52 49 47 47 45 52  ATE_TEMP_TRIGGER
6a60: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
6a70: 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45  se SQLITE_CREATE
6a80: 5f 54 45 4d 50 5f 56 49 45 57 20 20 3a 20 7a 43  _TEMP_VIEW  : zC
6a90: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41  ode="SQLITE_CREA
6aa0: 54 45 5f 54 45 4d 50 5f 56 49 45 57 22 3b 20 62  TE_TEMP_VIEW"; b
6ab0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
6ac0: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 52 49  QLITE_CREATE_TRI
6ad0: 47 47 45 52 20 20 20 20 3a 20 7a 43 6f 64 65 3d  GGER    : zCode=
6ae0: 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54  "SQLITE_CREATE_T
6af0: 52 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a  RIGGER"; break;.
6b00: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
6b10: 43 52 45 41 54 45 5f 56 49 45 57 20 20 20 20 20  CREATE_VIEW     
6b20: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
6b30: 45 5f 43 52 45 41 54 45 5f 56 49 45 57 22 3b 20  E_CREATE_VIEW"; 
6b40: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
6b50: 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 20 20  SQLITE_DELETE   
6b60: 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65           : zCode
6b70: 3d 22 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 22  ="SQLITE_DELETE"
6b80: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
6b90: 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e  e SQLITE_DROP_IN
6ba0: 44 45 58 20 20 20 20 20 20 20 20 3a 20 7a 43 6f  DEX        : zCo
6bb0: 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f  de="SQLITE_DROP_
6bc0: 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20  INDEX"; break;. 
6bd0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
6be0: 52 4f 50 5f 54 41 42 4c 45 20 20 20 20 20 20 20  ROP_TABLE       
6bf0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
6c00: 5f 44 52 4f 50 5f 54 41 42 4c 45 22 3b 20 62 72  _DROP_TABLE"; br
6c10: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
6c20: 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49  LITE_DROP_TEMP_I
6c30: 4e 44 45 58 20 20 20 3a 20 7a 43 6f 64 65 3d 22  NDEX   : zCode="
6c40: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
6c50: 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a  _INDEX"; break;.
6c60: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
6c70: 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 20  DROP_TEMP_TABLE 
6c80: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
6c90: 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c  E_DROP_TEMP_TABL
6ca0: 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  E"; break;.    c
6cb0: 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  ase SQLITE_DROP_
6cc0: 54 45 4d 50 5f 54 52 49 47 47 45 52 20 3a 20 7a  TEMP_TRIGGER : z
6cd0: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f  Code="SQLITE_DRO
6ce0: 50 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 22 3b  P_TEMP_TRIGGER";
6cf0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
6d00: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d   SQLITE_DROP_TEM
6d10: 50 5f 56 49 45 57 20 20 20 20 3a 20 7a 43 6f 64  P_VIEW    : zCod
6d20: 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54  e="SQLITE_DROP_T
6d30: 45 4d 50 5f 56 49 45 57 22 3b 20 62 72 65 61 6b  EMP_VIEW"; break
6d40: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
6d50: 45 5f 44 52 4f 50 5f 54 52 49 47 47 45 52 20 20  E_DROP_TRIGGER  
6d60: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
6d70: 49 54 45 5f 44 52 4f 50 5f 54 52 49 47 47 45 52  ITE_DROP_TRIGGER
6d80: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
6d90: 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56  se SQLITE_DROP_V
6da0: 49 45 57 20 20 20 20 20 20 20 20 20 3a 20 7a 43  IEW         : zC
6db0: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50  ode="SQLITE_DROP
6dc0: 5f 56 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20  _VIEW"; break;. 
6dd0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
6de0: 4e 53 45 52 54 20 20 20 20 20 20 20 20 20 20 20  NSERT           
6df0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
6e00: 5f 49 4e 53 45 52 54 22 3b 20 62 72 65 61 6b 3b  _INSERT"; break;
6e10: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
6e20: 5f 50 52 41 47 4d 41 20 20 20 20 20 20 20 20 20  _PRAGMA         
6e30: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
6e40: 54 45 5f 50 52 41 47 4d 41 22 3b 20 62 72 65 61  TE_PRAGMA"; brea
6e50: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
6e60: 54 45 5f 52 45 41 44 20 20 20 20 20 20 20 20 20  TE_READ         
6e70: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
6e80: 4c 49 54 45 5f 52 45 41 44 22 3b 20 62 72 65 61  LITE_READ"; brea
6e90: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
6ea0: 54 45 5f 53 45 4c 45 43 54 20 20 20 20 20 20 20  TE_SELECT       
6eb0: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
6ec0: 4c 49 54 45 5f 53 45 4c 45 43 54 22 3b 20 62 72  LITE_SELECT"; br
6ed0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
6ee0: 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e  LITE_TRANSACTION
6ef0: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
6f00: 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49  SQLITE_TRANSACTI
6f10: 4f 4e 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  ON"; break;.    
6f20: 63 61 73 65 20 53 51 4c 49 54 45 5f 55 50 44 41  case SQLITE_UPDA
6f30: 54 45 20 20 20 20 20 20 20 20 20 20 20 20 3a 20  TE            : 
6f40: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 55 50  zCode="SQLITE_UP
6f50: 44 41 54 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  DATE"; break;.  
6f60: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 54    case SQLITE_AT
6f70: 54 41 43 48 20 20 20 20 20 20 20 20 20 20 20 20  TACH            
6f80: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
6f90: 41 54 54 41 43 48 22 3b 20 62 72 65 61 6b 3b 0a  ATTACH"; break;.
6fa0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
6fb0: 44 45 54 41 43 48 20 20 20 20 20 20 20 20 20 20  DETACH          
6fc0: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
6fd0: 45 5f 44 45 54 41 43 48 22 3b 20 62 72 65 61 6b  E_DETACH"; break
6fe0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
6ff0: 45 5f 41 4c 54 45 52 5f 54 41 42 4c 45 20 20 20  E_ALTER_TABLE   
7000: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
7010: 49 54 45 5f 41 4c 54 45 52 5f 54 41 42 4c 45 22  ITE_ALTER_TABLE"
7020: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
7030: 65 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58  e SQLITE_REINDEX
7040: 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f             : zCo
7050: 64 65 3d 22 53 51 4c 49 54 45 5f 52 45 49 4e 44  de="SQLITE_REIND
7060: 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  EX"; break;.    
7070: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 4e 41 4c  case SQLITE_ANAL
7080: 59 5a 45 20 20 20 20 20 20 20 20 20 20 20 3a 20  YZE           : 
7090: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 41 4e  zCode="SQLITE_AN
70a0: 41 4c 59 5a 45 22 3b 20 62 72 65 61 6b 3b 0a 20  ALYZE"; break;. 
70b0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
70c0: 52 45 41 54 45 5f 56 54 41 42 4c 45 20 20 20 20  REATE_VTABLE    
70d0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
70e0: 5f 43 52 45 41 54 45 5f 56 54 41 42 4c 45 22 3b  _CREATE_VTABLE";
70f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
7100: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54 41   SQLITE_DROP_VTA
7110: 42 4c 45 20 20 20 20 20 20 20 3a 20 7a 43 6f 64  BLE       : zCod
7120: 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56  e="SQLITE_DROP_V
7130: 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20  TABLE"; break;. 
7140: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
7150: 55 4e 43 54 49 4f 4e 20 20 20 20 20 20 20 20 20  UNCTION         
7160: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
7170: 5f 46 55 4e 43 54 49 4f 4e 22 3b 20 62 72 65 61  _FUNCTION"; brea
7180: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
7190: 54 45 5f 53 41 56 45 50 4f 49 4e 54 20 20 20 20  TE_SAVEPOINT    
71a0: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
71b0: 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e 54 22 3b  LITE_SAVEPOINT";
71c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
71d0: 75 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ult             
71e0: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
71f0: 65 3d 22 3f 3f 3f 3f 22 3b 20 62 72 65 61 6b 3b  e="????"; break;
7200: 0a 20 20 7d 0a 20 20 54 63 6c 5f 44 53 74 72 69  .  }.  Tcl_DStri
7210: 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20  ngInit(&str);.  
7220: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
7230: 64 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a 41 75  d(&str, pDb->zAu
7240: 74 68 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44  th, -1);.  Tcl_D
7250: 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d  StringAppendElem
7260: 65 6e 74 28 26 73 74 72 2c 20 7a 43 6f 64 65 29  ent(&str, zCode)
7270: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41  ;.  Tcl_DStringA
7280: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74  ppendElement(&st
7290: 72 2c 20 7a 41 72 67 31 20 3f 20 7a 41 72 67 31  r, zArg1 ? zArg1
72a0: 20 3a 20 22 22 29 3b 0a 20 20 54 63 6c 5f 44 53   : "");.  Tcl_DS
72b0: 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65  tringAppendEleme
72c0: 6e 74 28 26 73 74 72 2c 20 7a 41 72 67 32 20 3f  nt(&str, zArg2 ?
72d0: 20 7a 41 72 67 32 20 3a 20 22 22 29 3b 0a 20 20   zArg2 : "");.  
72e0: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
72f0: 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a  dElement(&str, z
7300: 41 72 67 33 20 3f 20 7a 41 72 67 33 20 3a 20 22  Arg3 ? zArg3 : "
7310: 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  ");.  Tcl_DStrin
7320: 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26  gAppendElement(&
7330: 73 74 72 2c 20 7a 41 72 67 34 20 3f 20 7a 41 72  str, zArg4 ? zAr
7340: 67 34 20 3a 20 22 22 29 3b 0a 20 20 72 63 20 3d  g4 : "");.  rc =
7350: 20 54 63 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 28   Tcl_GlobalEval(
7360: 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c  pDb->interp, Tcl
7370: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73  _DStringValue(&s
7380: 74 72 29 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  tr));.  Tcl_DStr
7390: 69 6e 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20  ingFree(&str);. 
73a0: 20 7a 52 65 70 6c 79 20 3d 20 72 63 3d 3d 54 43   zReply = rc==TC
73b0: 4c 5f 4f 4b 20 3f 20 54 63 6c 5f 47 65 74 53 74  L_OK ? Tcl_GetSt
73c0: 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62 2d 3e  ringResult(pDb->
73d0: 69 6e 74 65 72 70 29 20 3a 20 22 53 51 4c 49 54  interp) : "SQLIT
73e0: 45 5f 44 45 4e 59 22 3b 0a 20 20 69 66 28 20 73  E_DENY";.  if( s
73f0: 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22 53 51  trcmp(zReply,"SQ
7400: 4c 49 54 45 5f 4f 4b 22 29 3d 3d 30 20 29 7b 0a  LITE_OK")==0 ){.
7410: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
7420: 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  OK;.  }else if( 
7430: 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22 53  strcmp(zReply,"S
7440: 51 4c 49 54 45 5f 44 45 4e 59 22 29 3d 3d 30 20  QLITE_DENY")==0 
7450: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
7460: 54 45 5f 44 45 4e 59 3b 0a 20 20 7d 65 6c 73 65  TE_DENY;.  }else
7470: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 52 65 70   if( strcmp(zRep
7480: 6c 79 2c 22 53 51 4c 49 54 45 5f 49 47 4e 4f 52  ly,"SQLITE_IGNOR
7490: 45 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  E")==0 ){.    rc
74a0: 20 3d 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45   = SQLITE_IGNORE
74b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
74c0: 63 20 3d 20 39 39 39 3b 0a 20 20 7d 0a 20 20 72  c = 999;.  }.  r
74d0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
74e0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
74f0: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 20  T_AUTHORIZATION 
7500: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  */../*.** This r
7510: 6f 75 74 69 6e 65 20 72 65 61 64 73 20 61 20 6c  outine reads a l
7520: 69 6e 65 20 6f 66 20 74 65 78 74 20 66 72 6f 6d  ine of text from
7530: 20 46 49 4c 45 20 69 6e 2c 20 73 74 6f 72 65 73   FILE in, stores
7540: 0a 2a 2a 20 74 68 65 20 74 65 78 74 20 69 6e 20  .** the text in 
7550: 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
7560: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20 61 6e  from malloc() an
7570: 64 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  d returns a poin
7580: 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 74 65  ter.** to the te
7590: 78 74 2e 20 20 4e 55 4c 4c 20 69 73 20 72 65 74  xt.  NULL is ret
75a0: 75 72 6e 65 64 20 61 74 20 65 6e 64 20 6f 66 20  urned at end of 
75b0: 66 69 6c 65 2c 20 6f 72 20 69 66 20 6d 61 6c 6c  file, or if mall
75c0: 6f 63 28 29 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a  oc().** fails..*
75d0: 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61  *.** The interfa
75e0: 63 65 20 69 73 20 6c 69 6b 65 20 22 72 65 61 64  ce is like "read
75f0: 6c 69 6e 65 22 20 62 75 74 20 6e 6f 20 63 6f 6d  line" but no com
7600: 6d 61 6e 64 2d 6c 69 6e 65 20 65 64 69 74 69 6e  mand-line editin
7610: 67 0a 2a 2a 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a  g.** is done..**
7620: 0a 2a 2a 20 63 6f 70 69 65 64 20 66 72 6f 6d 20  .** copied from 
7630: 73 68 65 6c 6c 2e 63 20 66 72 6f 6d 20 27 2e 69  shell.c from '.i
7640: 6d 70 6f 72 74 27 20 63 6f 6d 6d 61 6e 64 0a 2a  mport' command.*
7650: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 6c  /.static char *l
7660: 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 63 68 61  ocal_getline(cha
7670: 72 20 2a 7a 50 72 6f 6d 70 74 2c 20 46 49 4c 45  r *zPrompt, FILE
7680: 20 2a 69 6e 29 7b 0a 20 20 63 68 61 72 20 2a 7a   *in){.  char *z
7690: 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 4c 69 6e  Line;.  int nLin
76a0: 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 6e  e;.  int n;..  n
76b0: 4c 69 6e 65 20 3d 20 31 30 30 3b 0a 20 20 7a 4c  Line = 100;.  zL
76c0: 69 6e 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 4c  ine = malloc( nL
76d0: 69 6e 65 20 29 3b 0a 20 20 69 66 28 20 7a 4c 69  ine );.  if( zLi
76e0: 6e 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ne==0 ) return 0
76f0: 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 77 68 69  ;.  n = 0;.  whi
7700: 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69 66 28  le( 1 ){.    if(
7710: 20 6e 2b 31 30 30 3e 6e 4c 69 6e 65 20 29 7b 0a   n+100>nLine ){.
7720: 20 20 20 20 20 20 6e 4c 69 6e 65 20 3d 20 6e 4c        nLine = nL
7730: 69 6e 65 2a 32 20 2b 20 31 30 30 3b 0a 20 20 20  ine*2 + 100;.   
7740: 20 20 20 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c     zLine = reall
7750: 6f 63 28 7a 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29  oc(zLine, nLine)
7760: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e  ;.      if( zLin
7770: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  e==0 ) return 0;
7780: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66  .    }.    if( f
7790: 67 65 74 73 28 26 7a 4c 69 6e 65 5b 6e 5d 2c 20  gets(&zLine[n], 
77a0: 6e 4c 69 6e 65 20 2d 20 6e 2c 20 69 6e 29 3d 3d  nLine - n, in)==
77b0: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  0 ){.      if( n
77c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ==0 ){.        f
77d0: 72 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20  ree(zLine);.    
77e0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
77f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4c 69 6e      }.      zLin
7800: 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  e[n] = 0;.      
7810: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
7820: 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 6e 5d   while( zLine[n]
7830: 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 20 20 69   ){ n++; }.    i
7840: 66 28 20 6e 3e 30 20 26 26 20 7a 4c 69 6e 65 5b  f( n>0 && zLine[
7850: 6e 2d 31 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20  n-1]=='\n' ){.  
7860: 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a      n--;.      z
7870: 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20  Line[n] = 0;.   
7880: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7890: 20 20 7d 0a 20 20 7a 4c 69 6e 65 20 3d 20 72 65    }.  zLine = re
78a0: 61 6c 6c 6f 63 28 20 7a 4c 69 6e 65 2c 20 6e 2b  alloc( zLine, n+
78b0: 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4c  1 );.  return zL
78c0: 69 6e 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  ine;.}.../*.** T
78d0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
78e0: 70 61 72 74 20 6f 66 20 74 68 65 20 69 6d 70 6c  part of the impl
78f0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
7900: 65 20 63 6f 6d 6d 61 6e 64 3a 0a 2a 2a 0a 2a 2a  e command:.**.**
7910: 20 20 20 24 64 62 20 74 72 61 6e 73 61 63 74 69     $db transacti
7920: 6f 6e 20 5b 2d 64 65 66 65 72 72 65 64 7c 2d 69  on [-deferred|-i
7930: 6d 6d 65 64 69 61 74 65 7c 2d 65 78 63 6c 75 73  mmediate|-exclus
7940: 69 76 65 5d 20 53 43 52 49 50 54 0a 2a 2a 0a 2a  ive] SCRIPT.**.*
7950: 2a 20 49 74 20 69 73 20 69 6e 76 6f 6b 65 64 20  * It is invoked 
7960: 61 66 74 65 72 20 65 76 61 6c 75 61 74 69 6e 67  after evaluating
7970: 20 74 68 65 20 73 63 72 69 70 74 20 53 43 52 49   the script SCRI
7980: 50 54 20 74 6f 20 63 6f 6d 6d 69 74 20 6f 72 20  PT to commit or 
7990: 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 74 68 65 20  rollback.** the 
79a0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 73  transaction or s
79b0: 61 76 65 70 6f 69 6e 74 20 6f 70 65 6e 65 64 20  avepoint opened 
79c0: 62 79 20 74 68 65 20 5b 74 72 61 6e 73 61 63 74  by the [transact
79d0: 69 6f 6e 5d 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f  ion] command..*/
79e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 54 72  .static int DbTr
79f0: 61 6e 73 50 6f 73 74 43 6d 64 28 0a 20 20 43 6c  ansPostCmd(.  Cl
7a00: 69 65 6e 74 44 61 74 61 20 64 61 74 61 5b 5d 2c  ientData data[],
7a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a20: 20 20 20 2f 2a 20 64 61 74 61 5b 30 5d 20 69 73     /* data[0] is
7a30: 20 74 68 65 20 53 71 6c 69 74 65 33 44 62 2a 20   the Sqlite3Db* 
7a40: 66 6f 72 20 24 64 62 20 2a 2f 0a 20 20 54 63 6c  for $db */.  Tcl
7a50: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
7a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a70: 20 20 2f 2a 20 54 63 6c 20 69 6e 74 65 72 70 72    /* Tcl interpr
7a80: 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65  eter */.  int re
7a90: 73 75 6c 74 20 20 20 20 20 20 20 20 20 20 20 20  sult            
7aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7ab0: 2a 20 52 65 73 75 6c 74 20 6f 66 20 65 76 61 6c  * Result of eval
7ac0: 75 61 74 69 6e 67 20 53 43 52 49 50 54 20 2a 2f  uating SCRIPT */
7ad0: 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  .){.  static con
7ae0: 73 74 20 63 68 61 72 20 2a 61 7a 45 6e 64 5b 5d  st char *azEnd[]
7af0: 20 3d 20 7b 0a 20 20 20 20 22 52 45 4c 45 41 53   = {.    "RELEAS
7b00: 45 20 5f 74 63 6c 5f 74 72 61 6e 73 61 63 74 69  E _tcl_transacti
7b10: 6f 6e 22 2c 20 20 20 20 20 20 20 20 2f 2a 20 72  on",        /* r
7b20: 63 3d 3d 54 43 4c 5f 45 52 52 4f 52 2c 20 6e 54  c==TCL_ERROR, nT
7b30: 72 61 6e 73 61 63 74 69 6f 6e 21 3d 30 20 2a 2f  ransaction!=0 */
7b40: 0a 20 20 20 20 22 43 4f 4d 4d 49 54 22 2c 20 20  .    "COMMIT",  
7b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b60: 20 20 20 20 20 20 20 20 2f 2a 20 72 63 21 3d 54          /* rc!=T
7b70: 43 4c 5f 45 52 52 4f 52 2c 20 6e 54 72 61 6e 73  CL_ERROR, nTrans
7b80: 61 63 74 69 6f 6e 3d 3d 30 20 2a 2f 0a 20 20 20  action==0 */.   
7b90: 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 5f 74   "ROLLBACK TO _t
7ba0: 63 6c 5f 74 72 61 6e 73 61 63 74 69 6f 6e 20 3b  cl_transaction ;
7bb0: 20 52 45 4c 45 41 53 45 20 5f 74 63 6c 5f 74 72   RELEASE _tcl_tr
7bc0: 61 6e 73 61 63 74 69 6f 6e 22 2c 0a 20 20 20 20  ansaction",.    
7bd0: 22 52 4f 4c 4c 42 41 43 4b 22 20 20 20 20 20 20  "ROLLBACK"      
7be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bf0: 20 20 20 2f 2a 20 72 63 3d 3d 54 43 4c 5f 45 52     /* rc==TCL_ER
7c00: 52 4f 52 2c 20 6e 54 72 61 6e 73 61 63 74 69 6f  ROR, nTransactio
7c10: 6e 3d 3d 30 20 2a 2f 0a 20 20 7d 3b 0a 20 20 53  n==0 */.  };.  S
7c20: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
7c30: 53 71 6c 69 74 65 44 62 2a 29 64 61 74 61 5b 30  SqliteDb*)data[0
7c40: 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 72 65  ];.  int rc = re
7c50: 73 75 6c 74 3b 0a 20 20 63 6f 6e 73 74 20 63 68  sult;.  const ch
7c60: 61 72 20 2a 7a 45 6e 64 3b 0a 0a 20 20 70 44 62  ar *zEnd;..  pDb
7c70: 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d  ->nTransaction--
7c80: 3b 0a 20 20 7a 45 6e 64 20 3d 20 61 7a 45 6e 64  ;.  zEnd = azEnd
7c90: 5b 28 72 63 3d 3d 54 43 4c 5f 45 52 52 4f 52 29  [(rc==TCL_ERROR)
7ca0: 2a 32 20 2b 20 28 70 44 62 2d 3e 6e 54 72 61 6e  *2 + (pDb->nTran
7cb0: 73 61 63 74 69 6f 6e 3d 3d 30 29 5d 3b 0a 0a 20  saction==0)];.. 
7cc0: 20 70 44 62 2d 3e 64 69 73 61 62 6c 65 41 75 74   pDb->disableAut
7cd0: 68 2b 2b 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  h++;.  if( sqlit
7ce0: 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c  e3_exec(pDb->db,
7cf0: 20 7a 45 6e 64 2c 20 30 2c 20 30 2c 20 30 29 20   zEnd, 0, 0, 0) 
7d00: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
7d10: 20 69 73 20 61 20 74 72 69 63 6b 79 20 73 63 65   is a tricky sce
7d20: 6e 61 72 69 6f 20 74 6f 20 68 61 6e 64 6c 65 2e  nario to handle.
7d30: 20 54 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79   The most likely
7d40: 20 63 61 75 73 65 20 6f 66 20 61 6e 0a 20 20 20   cause of an.   
7d50: 20 20 20 2a 2a 20 65 72 72 6f 72 20 69 73 20 74     ** error is t
7d60: 68 61 74 20 74 68 65 20 65 78 65 63 28 29 20 61  hat the exec() a
7d70: 62 6f 76 65 20 77 61 73 20 61 6e 20 61 74 74 65  bove was an atte
7d80: 6d 70 74 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68  mpt to commit th
7d90: 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 70 2d  e .      ** top-
7da0: 6c 65 76 65 6c 20 74 72 61 6e 73 61 63 74 69 6f  level transactio
7db0: 6e 20 74 68 61 74 20 72 65 74 75 72 6e 65 64 20  n that returned 
7dc0: 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 4f 72 2c  SQLITE_BUSY. Or,
7dd0: 20 6c 65 73 73 20 6c 69 6b 65 6c 79 2c 0a 20 20   less likely,.  
7de0: 20 20 20 20 2a 2a 20 74 68 61 74 20 61 6e 20 49      ** that an I
7df0: 4f 2d 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  O-error has occu
7e00: 72 72 65 64 2e 20 49 6e 20 65 69 74 68 65 72 20  rred. In either 
7e10: 63 61 73 65 2c 20 74 68 72 6f 77 20 61 20 54 63  case, throw a Tc
7e20: 6c 20 65 78 63 65 70 74 69 6f 6e 0a 20 20 20 20  l exception.    
7e30: 20 20 2a 2a 20 61 6e 64 20 74 72 79 20 74 6f 20    ** and try to 
7e40: 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61  rollback the tra
7e50: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  nsaction..      
7e60: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20  **.      ** But 
7e70: 69 74 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65  it could also be
7e80: 20 74 68 61 74 20 74 68 65 20 75 73 65 72 20 65   that the user e
7e90: 78 65 63 75 74 65 64 20 6f 6e 65 20 6f 72 20 6d  xecuted one or m
7ea0: 6f 72 65 20 42 45 47 49 4e 2c 20 0a 20 20 20 20  ore BEGIN, .    
7eb0: 20 20 2a 2a 20 43 4f 4d 4d 49 54 2c 20 53 41 56    ** COMMIT, SAV
7ec0: 45 50 4f 49 4e 54 2c 20 52 45 4c 45 41 53 45 20  EPOINT, RELEASE 
7ed0: 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 63 6f 6d 6d  or ROLLBACK comm
7ee0: 61 6e 64 73 20 74 68 61 74 20 61 72 65 20 63 6f  ands that are co
7ef0: 6e 66 75 73 69 6e 67 0a 20 20 20 20 20 20 2a 2a  nfusing.      **
7f00: 20 74 68 69 73 20 6d 65 74 68 6f 64 27 73 20 6c   this method's l
7f10: 6f 67 69 63 2e 20 4e 6f 74 20 63 6c 65 61 72 20  ogic. Not clear 
7f20: 68 6f 77 20 74 68 69 73 20 77 6f 75 6c 64 20 62  how this would b
7f30: 65 20 62 65 73 74 20 68 61 6e 64 6c 65 64 2e 0a  e best handled..
7f40: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28        */.    if(
7f50: 20 72 63 21 3d 54 43 4c 5f 45 52 52 4f 52 20 29   rc!=TCL_ERROR )
7f60: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
7f70: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
7f80: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
7f90: 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20  pDb->db), 0);.  
7fa0: 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52      rc = TCL_ERR
7fb0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  OR;.    }.    sq
7fc0: 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e  lite3_exec(pDb->
7fd0: 64 62 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20  db, "ROLLBACK", 
7fe0: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  0, 0, 0);.  }.  
7ff0: 70 44 62 2d 3e 64 69 73 61 62 6c 65 41 75 74 68  pDb->disableAuth
8000: 2d 2d 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  --;..  return rc
8010: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73  ;.}../*.** Unles
8020: 73 20 53 51 4c 49 54 45 5f 54 45 53 54 20 69 73  s SQLITE_TEST is
8030: 20 64 65 66 69 6e 65 64 2c 20 74 68 69 73 20 66   defined, this f
8040: 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 73 69 6d  unction is a sim
8050: 70 6c 65 20 77 72 61 70 70 65 72 20 61 72 6f 75  ple wrapper arou
8060: 6e 64 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 70 72  nd.** sqlite3_pr
8070: 65 70 61 72 65 5f 76 32 28 29 2e 20 49 66 20 53  epare_v2(). If S
8080: 51 4c 49 54 45 5f 54 45 53 54 20 69 73 20 64 65  QLITE_TEST is de
8090: 66 69 6e 65 64 2c 20 74 68 65 6e 20 69 74 20 75  fined, then it u
80a0: 73 65 73 20 65 69 74 68 65 72 0a 2a 2a 20 73 71  ses either.** sq
80b0: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
80c0: 28 29 20 6f 72 20 6c 65 67 61 63 79 20 69 6e 74  () or legacy int
80d0: 65 72 66 61 63 65 20 73 71 6c 69 74 65 33 5f 70  erface sqlite3_p
80e0: 72 65 70 61 72 65 28 29 2c 20 64 65 70 65 6e 64  repare(), depend
80f0: 69 6e 67 0a 2a 2a 20 6f 6e 20 77 68 65 74 68 65  ing.** on whethe
8100: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 5b 64 62  r or not the [db
8110: 5f 75 73 65 5f 6c 65 67 61 63 79 5f 70 72 65 70  _use_legacy_prep
8120: 61 72 65 5d 20 63 6f 6d 6d 61 6e 64 20 68 61 73  are] command has
8130: 20 62 65 65 6e 20 75 73 65 64 20 74 6f 20 0a 2a   been used to .*
8140: 2a 20 63 6f 6e 66 69 67 75 72 65 20 74 68 65 20  * configure the 
8150: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  connection..*/.s
8160: 74 61 74 69 63 20 69 6e 74 20 64 62 50 72 65 70  tatic int dbPrep
8170: 61 72 65 28 0a 20 20 53 71 6c 69 74 65 44 62 20  are(.  SqliteDb 
8180: 2a 70 44 62 2c 20 20 20 20 20 20 20 20 20 20 20  *pDb,           
8190: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
81a0: 73 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  se object */.  c
81b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c  onst char *zSql,
81c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
81d0: 2a 20 53 51 4c 20 74 6f 20 63 6f 6d 70 69 6c 65  * SQL to compile
81e0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
81f0: 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 20 20 20 20  mt **ppStmt,    
8200: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 72        /* OUT: Pr
8210: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
8220: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
8230: 20 2a 2a 70 7a 4f 75 74 20 20 20 20 20 20 20 20   **pzOut        
8240: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f        /* OUT: Po
8250: 69 6e 74 65 72 20 74 6f 20 6e 65 78 74 20 53 51  inter to next SQ
8260: 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29  L statement */.)
8270: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
8280: 54 45 53 54 0a 20 20 69 66 28 20 70 44 62 2d 3e  TEST.  if( pDb->
8290: 62 4c 65 67 61 63 79 50 72 65 70 61 72 65 20 29  bLegacyPrepare )
82a0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  {.    return sql
82b0: 69 74 65 33 5f 70 72 65 70 61 72 65 28 70 44 62  ite3_prepare(pDb
82c0: 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  ->db, zSql, -1, 
82d0: 70 70 53 74 6d 74 2c 20 70 7a 4f 75 74 29 3b 0a  ppStmt, pzOut);.
82e0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
82f0: 75 72 6e 20 73 71 6c 69 74 65 33 5f 70 72 65 70  urn sqlite3_prep
8300: 61 72 65 5f 76 32 28 70 44 62 2d 3e 64 62 2c 20  are_v2(pDb->db, 
8310: 7a 53 71 6c 2c 20 2d 31 2c 20 70 70 53 74 6d 74  zSql, -1, ppStmt
8320: 2c 20 70 7a 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a  , pzOut);.}../*.
8330: 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20 63 61  ** Search the ca
8340: 63 68 65 20 66 6f 72 20 61 20 70 72 65 70 61 72  che for a prepar
8350: 65 64 2d 73 74 61 74 65 6d 65 6e 74 20 6f 62 6a  ed-statement obj
8360: 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ect that impleme
8370: 6e 74 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74  nts the.** first
8380: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69   SQL statement i
8390: 6e 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69  n the buffer poi
83a0: 6e 74 65 64 20 74 6f 20 62 79 20 70 61 72 61 6d  nted to by param
83b0: 65 74 65 72 20 7a 49 6e 2e 20 49 66 0a 2a 2a 20  eter zIn. If.** 
83c0: 6e 6f 20 73 75 63 68 20 70 72 65 70 61 72 65 64  no such prepared
83d0: 2d 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 20 62  -statement can b
83e0: 65 20 66 6f 75 6e 64 2c 20 61 6c 6c 6f 63 61 74  e found, allocat
83f0: 65 20 61 6e 64 20 70 72 65 70 61 72 65 20 61 20  e and prepare a 
8400: 6e 65 77 0a 2a 2a 20 6f 6e 65 2e 20 49 6e 20 65  new.** one. In e
8410: 69 74 68 65 72 20 63 61 73 65 2c 20 62 69 6e 64  ither case, bind
8420: 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
8430: 75 65 73 20 6f 66 20 74 68 65 20 72 65 6c 65 76  ues of the relev
8440: 61 6e 74 20 54 63 6c 0a 2a 2a 20 76 61 72 69 61  ant Tcl.** varia
8450: 62 6c 65 73 20 74 6f 20 61 6e 79 20 24 76 61 72  bles to any $var
8460: 2c 20 3a 76 61 72 20 6f 72 20 40 76 61 72 20 76  , :var or @var v
8470: 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20  ariables in the 
8480: 73 74 61 74 65 6d 65 6e 74 2e 20 42 65 66 6f 72  statement. Befor
8490: 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2c 20  e.** returning, 
84a0: 73 65 74 20 2a 70 70 50 72 65 53 74 6d 74 20 74  set *ppPreStmt t
84b0: 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70  o point to the p
84c0: 72 65 70 61 72 65 64 2d 73 74 61 74 65 6d 65 6e  repared-statemen
84d0: 74 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  t object..**.** 
84e0: 4f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72  Output parameter
84f0: 20 2a 70 7a 4f 75 74 20 69 73 20 73 65 74 20 74   *pzOut is set t
8500: 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e  o point to the n
8510: 65 78 74 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ext SQL statemen
8520: 74 20 69 6e 0a 2a 2a 20 62 75 66 66 65 72 20 7a  t in.** buffer z
8530: 49 6e 2c 20 6f 72 20 74 6f 20 74 68 65 20 27 5c  In, or to the '\
8540: 30 27 20 62 79 74 65 20 61 74 20 74 68 65 20 65  0' byte at the e
8550: 6e 64 20 6f 66 20 7a 49 6e 20 69 66 20 74 68 65  nd of zIn if the
8560: 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 6e 65 78 74  re is no.** next
8570: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
8580: 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
8590: 20 54 43 4c 5f 4f 4b 20 69 73 20 72 65 74 75 72   TCL_OK is retur
85a0: 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
85b0: 54 43 4c 5f 45 52 52 4f 52 20 69 73 20 72 65 74  TCL_ERROR is ret
85c0: 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20  urned.** and an 
85d0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6c 6f  error message lo
85e0: 61 64 65 64 20 69 6e 74 6f 20 69 6e 74 65 72 70  aded into interp
85f0: 72 65 74 65 72 20 70 44 62 2d 3e 69 6e 74 65 72  reter pDb->inter
8600: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
8610: 20 64 62 50 72 65 70 61 72 65 41 6e 64 42 69 6e   dbPrepareAndBin
8620: 64 28 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  d(.  SqliteDb *p
8630: 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Db,             
8640: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
8650: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61   object */.  cha
8660: 72 20 63 6f 6e 73 74 20 2a 7a 49 6e 2c 20 20 20  r const *zIn,   
8670: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8680: 53 51 4c 20 74 6f 20 63 6f 6d 70 69 6c 65 20 2a  SQL to compile *
8690: 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  /.  char const *
86a0: 2a 70 7a 4f 75 74 2c 20 20 20 20 20 20 20 20 20  *pzOut,         
86b0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e      /* OUT: Poin
86c0: 74 65 72 20 74 6f 20 6e 65 78 74 20 53 51 4c 20  ter to next SQL 
86d0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53  statement */.  S
86e0: 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a  qlPreparedStmt *
86f0: 2a 70 70 50 72 65 53 74 6d 74 20 20 20 20 20 2f  *ppPreStmt     /
8700: 2a 20 4f 55 54 3a 20 4f 62 6a 65 63 74 20 75 73  * OUT: Object us
8710: 65 64 20 74 6f 20 63 61 63 68 65 20 73 74 61 74  ed to cache stat
8720: 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 6f  ement */.){.  co
8730: 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d  nst char *zSql =
8740: 20 7a 49 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a   zIn;         /*
8750: 20 50 6f 69 6e 74 65 72 20 74 6f 20 66 69 72 73   Pointer to firs
8760: 74 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  t SQL statement 
8770: 69 6e 20 7a 49 6e 20 2a 2f 0a 20 20 73 71 6c 69  in zIn */.  sqli
8780: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
8790: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
87a0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
87b0: 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 53 71  t object */.  Sq
87c0: 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70  lPreparedStmt *p
87d0: 50 72 65 53 74 6d 74 3b 20 20 20 20 20 20 2f 2a  PreStmt;      /*
87e0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 61 63 68   Pointer to cach
87f0: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  ed statement */.
8800: 20 20 69 6e 74 20 6e 53 71 6c 3b 20 20 20 20 20    int nSql;     
8810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8820: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a    /* Length of z
8830: 53 71 6c 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  Sql in bytes */.
8840: 20 20 69 6e 74 20 6e 56 61 72 3b 20 20 20 20 20    int nVar;     
8850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8860: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76    /* Number of v
8870: 61 72 69 61 62 6c 65 73 20 69 6e 20 73 74 61 74  ariables in stat
8880: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ement */.  int i
8890: 50 61 72 6d 20 3d 20 30 3b 20 20 20 20 20 20 20  Parm = 0;       
88a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
88b0: 78 74 20 66 72 65 65 20 65 6e 74 72 79 20 69 6e  xt free entry in
88c0: 20 61 70 50 61 72 6d 20 2a 2f 0a 20 20 69 6e 74   apParm */.  int
88d0: 20 69 3b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   i;.  Tcl_Interp
88e0: 20 2a 69 6e 74 65 72 70 20 3d 20 70 44 62 2d 3e   *interp = pDb->
88f0: 69 6e 74 65 72 70 3b 0a 0a 20 20 2a 70 70 50 72  interp;..  *ppPr
8900: 65 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a  eStmt = 0;..  /*
8910: 20 54 72 69 6d 20 73 70 61 63 65 73 20 66 72 6f   Trim spaces fro
8920: 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 7a  m the start of z
8930: 53 71 6c 20 61 6e 64 20 63 61 6c 63 75 6c 61 74  Sql and calculat
8940: 65 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 20  e the remaining 
8950: 6c 65 6e 67 74 68 2e 20 2a 2f 0a 20 20 77 68 69  length. */.  whi
8960: 6c 65 28 20 69 73 73 70 61 63 65 28 7a 53 71 6c  le( isspace(zSql
8970: 5b 30 5d 29 20 29 7b 20 7a 53 71 6c 2b 2b 3b 20  [0]) ){ zSql++; 
8980: 7d 0a 20 20 6e 53 71 6c 20 3d 20 73 74 72 6c 65  }.  nSql = strle
8990: 6e 33 30 28 7a 53 71 6c 29 3b 0a 0a 20 20 66 6f  n30(zSql);..  fo
89a0: 72 28 70 50 72 65 53 74 6d 74 20 3d 20 70 44 62  r(pPreStmt = pDb
89b0: 2d 3e 73 74 6d 74 4c 69 73 74 3b 20 70 50 72 65  ->stmtList; pPre
89c0: 53 74 6d 74 3b 20 70 50 72 65 53 74 6d 74 3d 70  Stmt; pPreStmt=p
89d0: 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 29 7b  PreStmt->pNext){
89e0: 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 50 72  .    int n = pPr
89f0: 65 53 74 6d 74 2d 3e 6e 53 71 6c 3b 0a 20 20 20  eStmt->nSql;.   
8a00: 20 69 66 28 20 6e 53 71 6c 3e 3d 6e 20 0a 20 20   if( nSql>=n .  
8a10: 20 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28        && memcmp(
8a20: 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c 20  pPreStmt->zSql, 
8a30: 7a 53 71 6c 2c 20 6e 29 3d 3d 30 0a 20 20 20 20  zSql, n)==0.    
8a40: 20 20 20 20 26 26 20 28 7a 53 71 6c 5b 6e 5d 3d      && (zSql[n]=
8a50: 3d 30 20 7c 7c 20 7a 53 71 6c 5b 6e 2d 31 5d 3d  =0 || zSql[n-1]=
8a60: 3d 27 3b 27 29 0a 20 20 20 20 29 7b 0a 20 20 20  =';').    ){.   
8a70: 20 20 20 70 53 74 6d 74 20 3d 20 70 50 72 65 53     pStmt = pPreS
8a80: 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20  tmt->pStmt;.    
8a90: 20 20 2a 70 7a 4f 75 74 20 3d 20 26 7a 53 71 6c    *pzOut = &zSql
8aa0: 5b 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 5d  [pPreStmt->nSql]
8ab0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 6e  ;..      /* When
8ac0: 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
8ad0: 65 6d 65 6e 74 20 69 73 20 66 6f 75 6e 64 2c 20  ement is found, 
8ae0: 75 6e 6c 69 6e 6b 20 69 74 20 66 72 6f 6d 20 74  unlink it from t
8af0: 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 63 68  he.      ** cach
8b00: 65 20 6c 69 73 74 2e 20 20 49 74 20 77 69 6c 6c  e list.  It will
8b10: 20 6c 61 74 65 72 20 62 65 20 61 64 64 65 64 20   later be added 
8b20: 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65 67 69  back to the begi
8b30: 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 6f  nning.      ** o
8b40: 66 20 74 68 65 20 63 61 63 68 65 20 6c 69 73 74  f the cache list
8b50: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6d 70   in order to imp
8b60: 6c 65 6d 65 6e 74 20 4c 52 55 20 72 65 70 6c 61  lement LRU repla
8b70: 63 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f  cement..      */
8b80: 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65 53  .      if( pPreS
8b90: 74 6d 74 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  tmt->pPrev ){.  
8ba0: 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e        pPreStmt->
8bb0: 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
8bc0: 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 3b 0a  PreStmt->pNext;.
8bd0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8be0: 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69       pDb->stmtLi
8bf0: 73 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70  st = pPreStmt->p
8c00: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
8c10: 20 20 20 20 69 66 28 20 70 50 72 65 53 74 6d 74      if( pPreStmt
8c20: 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
8c30: 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65     pPreStmt->pNe
8c40: 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 50 72 65  xt->pPrev = pPre
8c50: 53 74 6d 74 2d 3e 70 50 72 65 76 3b 0a 20 20 20  Stmt->pPrev;.   
8c60: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8c70: 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20    pDb->stmtLast 
8c80: 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65  = pPreStmt->pPre
8c90: 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  v;.      }.     
8ca0: 20 70 44 62 2d 3e 6e 53 74 6d 74 2d 2d 3b 0a 20   pDb->nStmt--;. 
8cb0: 20 20 20 20 20 6e 56 61 72 20 3d 20 73 71 6c 69       nVar = sqli
8cc0: 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
8cd0: 65 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b  er_count(pStmt);
8ce0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8cf0: 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20    }.  }.  .  /* 
8d00: 49 66 20 6e 6f 20 70 72 65 70 61 72 65 64 20 73  If no prepared s
8d10: 74 61 74 65 6d 65 6e 74 20 77 61 73 20 66 6f 75  tatement was fou
8d20: 6e 64 2e 20 43 6f 6d 70 69 6c 65 20 74 68 65 20  nd. Compile the 
8d30: 53 51 4c 20 74 65 78 74 2e 20 41 6c 73 6f 20 61  SQL text. Also a
8d40: 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 61 20 6e  llocate.  ** a n
8d50: 65 77 20 53 71 6c 50 72 65 70 61 72 65 64 53 74  ew SqlPreparedSt
8d60: 6d 74 20 73 74 72 75 63 74 75 72 65 2e 20 20 2a  mt structure.  *
8d70: 2f 0a 20 20 69 66 28 20 70 50 72 65 53 74 6d 74  /.  if( pPreStmt
8d80: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  ==0 ){.    int n
8d90: 42 79 74 65 3b 0a 0a 20 20 20 20 69 66 28 20 53  Byte;..    if( S
8da0: 51 4c 49 54 45 5f 4f 4b 21 3d 64 62 50 72 65 70  QLITE_OK!=dbPrep
8db0: 61 72 65 28 70 44 62 2c 20 7a 53 71 6c 2c 20 26  are(pDb, zSql, &
8dc0: 70 53 74 6d 74 2c 20 70 7a 4f 75 74 29 20 29 7b  pStmt, pzOut) ){
8dd0: 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  .      Tcl_SetOb
8de0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
8df0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
8e00: 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28  (sqlite3_errmsg(
8e10: 70 44 62 2d 3e 64 62 29 2c 20 2d 31 29 29 3b 0a  pDb->db), -1));.
8e20: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
8e30: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
8e40: 20 20 69 66 28 20 70 53 74 6d 74 3d 3d 30 20 29    if( pStmt==0 )
8e50: 7b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  {.      if( SQLI
8e60: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 65  TE_OK!=sqlite3_e
8e70: 72 72 63 6f 64 65 28 70 44 62 2d 3e 64 62 29 20  rrcode(pDb->db) 
8e80: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ){.        /* A 
8e90: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 65 72 72  compile-time err
8ea0: 6f 72 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  or in the statem
8eb0: 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ent. */.        
8ec0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
8ed0: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
8ee0: 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65  StringObj(sqlite
8ef0: 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
8f00: 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 20 20 20  ), -1));.       
8f10: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
8f20: 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  R;.      }else{.
8f30: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
8f40: 74 61 74 65 6d 65 6e 74 20 77 61 73 20 61 20 6e  tatement was a n
8f50: 6f 2d 6f 70 2e 20 20 43 6f 6e 74 69 6e 75 65 20  o-op.  Continue 
8f60: 74 6f 20 74 68 65 20 6e 65 78 74 20 73 74 61 74  to the next stat
8f70: 65 6d 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a  ement.        **
8f80: 20 69 6e 20 74 68 65 20 53 51 4c 20 73 74 72 69   in the SQL stri
8f90: 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ng..        */. 
8fa0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
8fb0: 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  L_OK;.      }.  
8fc0: 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28    }..    assert(
8fd0: 20 70 50 72 65 53 74 6d 74 3d 3d 30 20 29 3b 0a   pPreStmt==0 );.
8fe0: 20 20 20 20 6e 56 61 72 20 3d 20 73 71 6c 69 74      nVar = sqlit
8ff0: 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
9000: 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a  r_count(pStmt);.
9010: 20 20 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65      nByte = size
9020: 6f 66 28 53 71 6c 50 72 65 70 61 72 65 64 53 74  of(SqlPreparedSt
9030: 6d 74 29 20 2b 20 6e 56 61 72 2a 73 69 7a 65 6f  mt) + nVar*sizeo
9040: 66 28 54 63 6c 5f 4f 62 6a 20 2a 29 3b 0a 20 20  f(Tcl_Obj *);.  
9050: 20 20 70 50 72 65 53 74 6d 74 20 3d 20 28 53 71    pPreStmt = (Sq
9060: 6c 50 72 65 70 61 72 65 64 53 74 6d 74 2a 29 54  lPreparedStmt*)T
9070: 63 6c 5f 41 6c 6c 6f 63 28 6e 42 79 74 65 29 3b  cl_Alloc(nByte);
9080: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 72 65  .    memset(pPre
9090: 53 74 6d 74 2c 20 30 2c 20 6e 42 79 74 65 29 3b  Stmt, 0, nByte);
90a0: 0a 0a 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e  ..    pPreStmt->
90b0: 70 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20  pStmt = pStmt;. 
90c0: 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71     pPreStmt->nSq
90d0: 6c 20 3d 20 28 69 6e 74 29 28 2a 70 7a 4f 75 74  l = (int)(*pzOut
90e0: 20 2d 20 7a 53 71 6c 29 3b 0a 20 20 20 20 70 50   - zSql);.    pP
90f0: 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 20 3d 20 73  reStmt->zSql = s
9100: 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d 74  qlite3_sql(pStmt
9110: 29 3b 0a 20 20 20 20 70 50 72 65 53 74 6d 74 2d  );.    pPreStmt-
9120: 3e 61 70 50 61 72 6d 20 3d 20 28 54 63 6c 5f 4f  >apParm = (Tcl_O
9130: 62 6a 20 2a 2a 29 26 70 50 72 65 53 74 6d 74 5b  bj **)&pPreStmt[
9140: 31 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  1];.#ifdef SQLIT
9150: 45 5f 54 45 53 54 0a 20 20 20 20 69 66 28 20 70  E_TEST.    if( p
9160: 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 3d 3d 30  PreStmt->zSql==0
9170: 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
9180: 7a 43 6f 70 79 20 3d 20 54 63 6c 5f 41 6c 6c 6f  zCopy = Tcl_Allo
9190: 63 28 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c  c(pPreStmt->nSql
91a0: 20 2b 20 31 29 3b 0a 20 20 20 20 20 20 6d 65 6d   + 1);.      mem
91b0: 63 70 79 28 7a 43 6f 70 79 2c 20 7a 53 71 6c 2c  cpy(zCopy, zSql,
91c0: 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 29   pPreStmt->nSql)
91d0: 3b 0a 20 20 20 20 20 20 7a 43 6f 70 79 5b 70 50  ;.      zCopy[pP
91e0: 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 5d 20 3d 20  reStmt->nSql] = 
91f0: 27 5c 30 27 3b 0a 20 20 20 20 20 20 70 50 72 65  '\0';.      pPre
9200: 53 74 6d 74 2d 3e 7a 53 71 6c 20 3d 20 7a 43 6f  Stmt->zSql = zCo
9210: 70 79 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  py;.    }.#endif
9220: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
9230: 50 72 65 53 74 6d 74 20 29 3b 0a 20 20 61 73 73  PreStmt );.  ass
9240: 65 72 74 28 20 73 74 72 6c 65 6e 33 30 28 70 50  ert( strlen30(pP
9250: 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 29 3d 3d 70  reStmt->zSql)==p
9260: 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 20 29 3b  PreStmt->nSql );
9270: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 6d 65  .  assert( 0==me
9280: 6d 63 6d 70 28 70 50 72 65 53 74 6d 74 2d 3e 7a  mcmp(pPreStmt->z
9290: 53 71 6c 2c 20 7a 53 71 6c 2c 20 70 50 72 65 53  Sql, zSql, pPreS
92a0: 74 6d 74 2d 3e 6e 53 71 6c 29 20 29 3b 0a 0a 20  tmt->nSql) );.. 
92b0: 20 2f 2a 20 42 69 6e 64 20 76 61 6c 75 65 73 20   /* Bind values 
92c0: 74 6f 20 70 61 72 61 6d 65 74 65 72 73 20 74 68  to parameters th
92d0: 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 24 20  at begin with $ 
92e0: 6f 72 20 3a 20 2a 2f 20 20 0a 20 20 66 6f 72 28  or : */  .  for(
92f0: 69 3d 31 3b 20 69 3c 3d 6e 56 61 72 3b 20 69 2b  i=1; i<=nVar; i+
9300: 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  +){.    const ch
9310: 61 72 20 2a 7a 56 61 72 20 3d 20 73 71 6c 69 74  ar *zVar = sqlit
9320: 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
9330: 72 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20 69 29  r_name(pStmt, i)
9340: 3b 0a 20 20 20 20 69 66 28 20 7a 56 61 72 21 3d  ;.    if( zVar!=
9350: 30 20 26 26 20 28 7a 56 61 72 5b 30 5d 3d 3d 27  0 && (zVar[0]=='
9360: 24 27 20 7c 7c 20 7a 56 61 72 5b 30 5d 3d 3d 27  $' || zVar[0]=='
9370: 3a 27 20 7c 7c 20 7a 56 61 72 5b 30 5d 3d 3d 27  :' || zVar[0]=='
9380: 40 27 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  @') ){.      Tcl
9390: 5f 4f 62 6a 20 2a 70 56 61 72 20 3d 20 54 63 6c  _Obj *pVar = Tcl
93a0: 5f 47 65 74 56 61 72 32 45 78 28 69 6e 74 65 72  _GetVar2Ex(inter
93b0: 70 2c 20 26 7a 56 61 72 5b 31 5d 2c 20 30 2c 20  p, &zVar[1], 0, 
93c0: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 56  0);.      if( pV
93d0: 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ar ){.        in
93e0: 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 75 38 20  t n;.        u8 
93f0: 2a 64 61 74 61 3b 0a 20 20 20 20 20 20 20 20 63  *data;.        c
9400: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
9410: 20 3d 20 28 70 56 61 72 2d 3e 74 79 70 65 50 74   = (pVar->typePt
9420: 72 20 3f 20 70 56 61 72 2d 3e 74 79 70 65 50 74  r ? pVar->typePt
9430: 72 2d 3e 6e 61 6d 65 20 3a 20 22 22 29 3b 0a 20  r->name : "");. 
9440: 20 20 20 20 20 20 20 63 68 61 72 20 63 20 3d 20         char c = 
9450: 7a 54 79 70 65 5b 30 5d 3b 0a 20 20 20 20 20 20  zType[0];.      
9460: 20 20 69 66 28 20 7a 56 61 72 5b 30 5d 3d 3d 27    if( zVar[0]=='
9470: 40 27 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  @' ||.          
9480: 20 28 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63   (c=='b' && strc
9490: 6d 70 28 7a 54 79 70 65 2c 22 62 79 74 65 61 72  mp(zType,"bytear
94a0: 72 61 79 22 29 3d 3d 30 20 26 26 20 70 56 61 72  ray")==0 && pVar
94b0: 2d 3e 62 79 74 65 73 3d 3d 30 29 20 29 7b 0a 20  ->bytes==0) ){. 
94c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 61 64           /* Load
94d0: 20 61 20 42 4c 4f 42 20 74 79 70 65 20 69 66 20   a BLOB type if 
94e0: 74 68 65 20 54 63 6c 20 76 61 72 69 61 62 6c 65  the Tcl variable
94f0: 20 69 73 20 61 20 62 79 74 65 61 72 72 61 79 20   is a bytearray 
9500: 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  and.          **
9510: 20 69 74 20 68 61 73 20 6e 6f 20 73 74 72 69 6e   it has no strin
9520: 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  g representation
9530: 20 6f 72 20 74 68 65 20 68 6f 73 74 0a 20 20 20   or the host.   
9540: 20 20 20 20 20 20 20 2a 2a 20 70 61 72 61 6d 65         ** parame
9550: 74 65 72 20 6e 61 6d 65 20 62 65 67 69 6e 73 20  ter name begins 
9560: 77 69 74 68 20 22 40 22 2e 20 2a 2f 0a 20 20 20  with "@". */.   
9570: 20 20 20 20 20 20 20 64 61 74 61 20 3d 20 54 63         data = Tc
9580: 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72  l_GetByteArrayFr
9590: 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b  omObj(pVar, &n);
95a0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
95b0: 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74  e3_bind_blob(pSt
95c0: 6d 74 2c 20 69 2c 20 64 61 74 61 2c 20 6e 2c 20  mt, i, data, n, 
95d0: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
95e0: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e            Tcl_In
95f0: 63 72 52 65 66 43 6f 75 6e 74 28 70 56 61 72 29  crRefCount(pVar)
9600: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 72 65  ;.          pPre
9610: 53 74 6d 74 2d 3e 61 70 50 61 72 6d 5b 69 50 61  Stmt->apParm[iPa
9620: 72 6d 2b 2b 5d 20 3d 20 70 56 61 72 3b 0a 20 20  rm++] = pVar;.  
9630: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
9640: 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d 70  c=='b' && strcmp
9650: 28 7a 54 79 70 65 2c 22 62 6f 6f 6c 65 61 6e 22  (zType,"boolean"
9660: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
9670: 20 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d    Tcl_GetIntFrom
9680: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 56 61 72  Obj(interp, pVar
9690: 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  , &n);.         
96a0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
96b0: 74 28 70 53 74 6d 74 2c 20 69 2c 20 6e 29 3b 0a  t(pStmt, i, n);.
96c0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
96d0: 28 20 63 3d 3d 27 64 27 20 26 26 20 73 74 72 63  ( c=='d' && strc
96e0: 6d 70 28 7a 54 79 70 65 2c 22 64 6f 75 62 6c 65  mp(zType,"double
96f0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
9700: 20 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20     double r;.   
9710: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 44 6f         Tcl_GetDo
9720: 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  ubleFromObj(inte
9730: 72 70 2c 20 70 56 61 72 2c 20 26 72 29 3b 0a 20  rp, pVar, &r);. 
9740: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
9750: 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28 70 53 74  _bind_double(pSt
9760: 6d 74 2c 20 69 2c 20 72 29 3b 0a 20 20 20 20 20  mt, i, r);.     
9770: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63 3d     }else if( (c=
9780: 3d 27 77 27 20 26 26 20 73 74 72 63 6d 70 28 7a  ='w' && strcmp(z
9790: 54 79 70 65 2c 22 77 69 64 65 49 6e 74 22 29 3d  Type,"wideInt")=
97a0: 3d 30 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  =0) ||.         
97b0: 20 20 20 20 20 28 63 3d 3d 27 69 27 20 26 26 20       (c=='i' && 
97c0: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 69 6e  strcmp(zType,"in
97d0: 74 22 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20  t")==0) ){.     
97e0: 20 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74       Tcl_WideInt
97f0: 20 76 3b 0a 20 20 20 20 20 20 20 20 20 20 54 63   v;.          Tc
9800: 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d  l_GetWideIntFrom
9810: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 56 61 72  Obj(interp, pVar
9820: 2c 20 26 76 29 3b 0a 20 20 20 20 20 20 20 20 20  , &v);.         
9830: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
9840: 74 36 34 28 70 53 74 6d 74 2c 20 69 2c 20 76 29  t64(pStmt, i, v)
9850: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
9860: 0a 20 20 20 20 20 20 20 20 20 20 64 61 74 61 20  .          data 
9870: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
9880: 20 2a 29 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   *)Tcl_GetString
9890: 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e  FromObj(pVar, &n
98a0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
98b0: 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70  ite3_bind_text(p
98c0: 53 74 6d 74 2c 20 69 2c 20 28 63 68 61 72 20 2a  Stmt, i, (char *
98d0: 29 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45  )data, n, SQLITE
98e0: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
98f0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
9900: 6f 75 6e 74 28 70 56 61 72 29 3b 0a 20 20 20 20  ount(pVar);.    
9910: 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e        pPreStmt->
9920: 61 70 50 61 72 6d 5b 69 50 61 72 6d 2b 2b 5d 20  apParm[iParm++] 
9930: 3d 20 70 56 61 72 3b 0a 20 20 20 20 20 20 20 20  = pVar;.        
9940: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
9950: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
9960: 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20  ind_null(pStmt, 
9970: 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i);.      }.    
9980: 7d 0a 20 20 7d 0a 20 20 70 50 72 65 53 74 6d 74  }.  }.  pPreStmt
9990: 2d 3e 6e 50 61 72 6d 20 3d 20 69 50 61 72 6d 3b  ->nParm = iParm;
99a0: 0a 20 20 2a 70 70 50 72 65 53 74 6d 74 20 3d 20  .  *ppPreStmt = 
99b0: 70 50 72 65 53 74 6d 74 3b 0a 0a 20 20 72 65 74  pPreStmt;..  ret
99c0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
99d0: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 73  *.** Release a s
99e0: 74 61 74 65 6d 65 6e 74 20 72 65 66 65 72 65 6e  tatement referen
99f0: 63 65 20 6f 62 74 61 69 6e 65 64 20 62 79 20 63  ce obtained by c
9a00: 61 6c 6c 69 6e 67 20 64 62 50 72 65 70 61 72 65  alling dbPrepare
9a10: 41 6e 64 42 69 6e 64 28 29 2e 0a 2a 2a 20 54 68  AndBind()..** Th
9a20: 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 65 78  ere should be ex
9a30: 61 63 74 6c 79 20 6f 6e 65 20 63 61 6c 6c 20 74  actly one call t
9a40: 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
9a50: 66 6f 72 20 65 61 63 68 20 63 61 6c 6c 20 74 6f  for each call to
9a60: 0a 2a 2a 20 64 62 50 72 65 70 61 72 65 41 6e 64  .** dbPrepareAnd
9a70: 42 69 6e 64 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  Bind()..**.** If
9a80: 20 74 68 65 20 64 69 73 63 61 72 64 20 70 61 72   the discard par
9a90: 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65  ameter is non-ze
9aa0: 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 73 74 61  ro, then the sta
9ab0: 74 65 6d 65 6e 74 20 69 73 20 64 65 6c 65 74 65  tement is delete
9ac0: 64 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79  d.** immediately
9ad0: 2e 20 4f 74 68 65 72 77 69 73 65 20 69 74 20 69  . Otherwise it i
9ae0: 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c  s added to the L
9af0: 52 55 20 6c 69 73 74 20 61 6e 64 20 6d 61 79 20  RU list and may 
9b00: 62 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 62  be returned.** b
9b10: 79 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 63  y a subsequent c
9b20: 61 6c 6c 20 74 6f 20 64 62 50 72 65 70 61 72 65  all to dbPrepare
9b30: 41 6e 64 42 69 6e 64 28 29 2e 0a 2a 2f 0a 73 74  AndBind()..*/.st
9b40: 61 74 69 63 20 76 6f 69 64 20 64 62 52 65 6c 65  atic void dbRele
9b50: 61 73 65 53 74 6d 74 28 0a 20 20 53 71 6c 69 74  aseStmt(.  Sqlit
9b60: 65 44 62 20 2a 70 44 62 2c 20 20 20 20 20 20 20  eDb *pDb,       
9b70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
9b80: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
9b90: 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74  .  SqlPreparedSt
9ba0: 6d 74 20 2a 70 50 72 65 53 74 6d 74 2c 20 20 20  mt *pPreStmt,   
9bb0: 20 20 20 2f 2a 20 50 72 65 70 61 72 65 64 20 73     /* Prepared s
9bc0: 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20  tatement handle 
9bd0: 74 6f 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  to release */.  
9be0: 69 6e 74 20 64 69 73 63 61 72 64 20 20 20 20 20  int discard     
9bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c00: 2f 2a 20 54 72 75 65 20 74 6f 20 64 65 6c 65 74  /* True to delet
9c10: 65 20 28 6e 6f 74 20 63 61 63 68 65 29 20 74 68  e (not cache) th
9c20: 65 20 70 50 72 65 53 74 6d 74 20 2a 2f 0a 29 7b  e pPreStmt */.){
9c30: 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20  .  int i;..  /* 
9c40: 46 72 65 65 20 74 68 65 20 62 6f 75 6e 64 20 73  Free the bound s
9c50: 74 72 69 6e 67 20 61 6e 64 20 62 6c 6f 62 20 70  tring and blob p
9c60: 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 66  arameters */.  f
9c70: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 72 65 53 74  or(i=0; i<pPreSt
9c80: 6d 74 2d 3e 6e 50 61 72 6d 3b 20 69 2b 2b 29 7b  mt->nParm; i++){
9c90: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
9ca0: 43 6f 75 6e 74 28 70 50 72 65 53 74 6d 74 2d 3e  Count(pPreStmt->
9cb0: 61 70 50 61 72 6d 5b 69 5d 29 3b 0a 20 20 7d 0a  apParm[i]);.  }.
9cc0: 20 20 70 50 72 65 53 74 6d 74 2d 3e 6e 50 61 72    pPreStmt->nPar
9cd0: 6d 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 44  m = 0;..  if( pD
9ce0: 62 2d 3e 6d 61 78 53 74 6d 74 3c 3d 30 20 7c 7c  b->maxStmt<=0 ||
9cf0: 20 64 69 73 63 61 72 64 20 29 7b 0a 20 20 20 20   discard ){.    
9d00: 2f 2a 20 49 66 20 74 68 65 20 63 61 63 68 65 20  /* If the cache 
9d10: 69 73 20 74 75 72 6e 65 64 20 6f 66 66 2c 20 64  is turned off, d
9d20: 65 61 6c 6c 6f 63 61 74 65 64 20 74 68 65 20 73  eallocated the s
9d30: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
9d40: 64 62 46 72 65 65 53 74 6d 74 28 70 50 72 65 53  dbFreeStmt(pPreS
9d50: 74 6d 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  tmt);.  }else{. 
9d60: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 70 72     /* Add the pr
9d70: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
9d80: 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   to the beginnin
9d90: 67 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 6c  g of the cache l
9da0: 69 73 74 2e 20 2a 2f 0a 20 20 20 20 70 50 72 65  ist. */.    pPre
9db0: 53 74 6d 74 2d 3e 70 4e 65 78 74 20 3d 20 70 44  Stmt->pNext = pD
9dc0: 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 0a 20 20 20  b->stmtList;.   
9dd0: 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76   pPreStmt->pPrev
9de0: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 44   = 0;.    if( pD
9df0: 62 2d 3e 73 74 6d 74 4c 69 73 74 20 29 7b 0a 20  b->stmtList ){. 
9e00: 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73      pDb->stmtLis
9e10: 74 2d 3e 70 50 72 65 76 20 3d 20 70 50 72 65 53  t->pPrev = pPreS
9e20: 74 6d 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  tmt;.    }.    p
9e30: 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20 70  Db->stmtList = p
9e40: 50 72 65 53 74 6d 74 3b 0a 20 20 20 20 69 66 28  PreStmt;.    if(
9e50: 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 3d 3d   pDb->stmtLast==
9e60: 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
9e70: 74 28 20 70 44 62 2d 3e 6e 53 74 6d 74 3d 3d 30  t( pDb->nStmt==0
9e80: 20 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 73   );.      pDb->s
9e90: 74 6d 74 4c 61 73 74 20 3d 20 70 50 72 65 53 74  tmtLast = pPreSt
9ea0: 6d 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  mt;.    }else{. 
9eb0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44 62       assert( pDb
9ec0: 2d 3e 6e 53 74 6d 74 3e 30 20 29 3b 0a 20 20 20  ->nStmt>0 );.   
9ed0: 20 7d 0a 20 20 20 20 70 44 62 2d 3e 6e 53 74 6d   }.    pDb->nStm
9ee0: 74 2b 2b 3b 0a 20 20 20 0a 20 20 20 20 2f 2a 20  t++;.   .    /* 
9ef0: 49 66 20 77 65 20 68 61 76 65 20 74 6f 6f 20 6d  If we have too m
9f00: 61 6e 79 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  any statement in
9f10: 20 63 61 63 68 65 2c 20 72 65 6d 6f 76 65 20 74   cache, remove t
9f20: 68 65 20 73 75 72 70 6c 75 73 20 66 72 6f 6d 20  he surplus from 
9f30: 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 64 20  .    ** the end 
9f40: 6f 66 20 74 68 65 20 63 61 63 68 65 20 6c 69 73  of the cache lis
9f50: 74 2e 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65  t.  */.    while
9f60: 28 20 70 44 62 2d 3e 6e 53 74 6d 74 3e 70 44 62  ( pDb->nStmt>pDb
9f70: 2d 3e 6d 61 78 53 74 6d 74 20 29 7b 0a 20 20 20  ->maxStmt ){.   
9f80: 20 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74     SqlPreparedSt
9f90: 6d 74 20 2a 70 4c 61 73 74 20 3d 20 70 44 62 2d  mt *pLast = pDb-
9fa0: 3e 73 74 6d 74 4c 61 73 74 3b 0a 20 20 20 20 20  >stmtLast;.     
9fb0: 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d   pDb->stmtLast =
9fc0: 20 70 4c 61 73 74 2d 3e 70 50 72 65 76 3b 0a 20   pLast->pPrev;. 
9fd0: 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61       pDb->stmtLa
9fe0: 73 74 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  st->pNext = 0;. 
9ff0: 20 20 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74 2d       pDb->nStmt-
a000: 2d 3b 0a 20 20 20 20 20 20 64 62 46 72 65 65 53  -;.      dbFreeS
a010: 74 6d 74 28 70 4c 61 73 74 29 3b 0a 20 20 20 20  tmt(pLast);.    
a020: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  }.  }.}../*.** S
a030: 74 72 75 63 74 75 72 65 20 75 73 65 64 20 77 69  tructure used wi
a040: 74 68 20 64 62 45 76 61 6c 58 58 58 28 29 20 66  th dbEvalXXX() f
a050: 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20  unctions:.**.** 
a060: 20 20 64 62 45 76 61 6c 49 6e 69 74 28 29 0a 2a    dbEvalInit().*
a070: 2a 20 20 20 64 62 45 76 61 6c 53 74 65 70 28 29  *   dbEvalStep()
a080: 0a 2a 2a 20 20 20 64 62 45 76 61 6c 46 69 6e 61  .**   dbEvalFina
a090: 6c 69 7a 65 28 29 0a 2a 2a 20 20 20 64 62 45 76  lize().**   dbEv
a0a0: 61 6c 52 6f 77 49 6e 66 6f 28 29 0a 2a 2a 20 20  alRowInfo().**  
a0b0: 20 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c   dbEvalColumnVal
a0c0: 75 65 28 29 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ue().*/.typedef 
a0d0: 73 74 72 75 63 74 20 44 62 45 76 61 6c 43 6f 6e  struct DbEvalCon
a0e0: 74 65 78 74 20 44 62 45 76 61 6c 43 6f 6e 74 65  text DbEvalConte
a0f0: 78 74 3b 0a 73 74 72 75 63 74 20 44 62 45 76 61  xt;.struct DbEva
a100: 6c 43 6f 6e 74 65 78 74 20 7b 0a 20 20 53 71 6c  lContext {.  Sql
a110: 69 74 65 44 62 20 2a 70 44 62 3b 20 20 20 20 20  iteDb *pDb;     
a120: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a130: 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  Database handle 
a140: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53  */.  Tcl_Obj *pS
a150: 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ql;             
a160: 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 68       /* Object h
a170: 6f 6c 64 69 6e 67 20 73 74 72 69 6e 67 20 7a 53  olding string zS
a180: 71 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ql */.  const ch
a190: 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20  ar *zSql;       
a1a0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 61 69          /* Remai
a1b0: 6e 69 6e 67 20 53 51 4c 20 74 6f 20 65 78 65 63  ning SQL to exec
a1c0: 75 74 65 20 2a 2f 0a 20 20 53 71 6c 50 72 65 70  ute */.  SqlPrep
a1d0: 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65 53 74  aredStmt *pPreSt
a1e0: 6d 74 3b 20 20 20 20 20 20 2f 2a 20 43 75 72 72  mt;      /* Curr
a1f0: 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ent statement */
a200: 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20  .  int nCol;    
a210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a220: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
a230: 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64  columns returned
a240: 20 62 79 20 70 53 74 6d 74 20 2a 2f 0a 20 20 54   by pStmt */.  T
a250: 63 6c 5f 4f 62 6a 20 2a 70 41 72 72 61 79 3b 20  cl_Obj *pArray; 
a260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a270: 2a 20 4e 61 6d 65 20 6f 66 20 61 72 72 61 79 20  * Name of array 
a280: 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 54 63  variable */.  Tc
a290: 6c 5f 4f 62 6a 20 2a 2a 61 70 43 6f 6c 4e 61 6d  l_Obj **apColNam
a2a0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
a2b0: 20 41 72 72 61 79 20 6f 66 20 63 6f 6c 75 6d 6e   Array of column
a2c0: 20 6e 61 6d 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a   names */.};../*
a2d0: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e 79 20  .** Release any 
a2e0: 63 61 63 68 65 20 6f 66 20 63 6f 6c 75 6d 6e 20  cache of column 
a2f0: 6e 61 6d 65 73 20 63 75 72 72 65 6e 74 6c 79 20  names currently 
a300: 68 65 6c 64 20 61 73 20 70 61 72 74 20 6f 66 0a  held as part of.
a310: 2a 2a 20 74 68 65 20 44 62 45 76 61 6c 43 6f 6e  ** the DbEvalCon
a320: 74 65 78 74 20 73 74 72 75 63 74 75 72 65 20 70  text structure p
a330: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
a340: 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  st argument..*/.
a350: 73 74 61 74 69 63 20 76 6f 69 64 20 64 62 52 65  static void dbRe
a360: 6c 65 61 73 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  leaseColumnNames
a370: 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a  (DbEvalContext *
a380: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43  p){.  if( p->apC
a390: 6f 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 69 6e  olName ){.    in
a3a0: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
a3b0: 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  ; i<p->nCol; i++
a3c0: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63  ){.      Tcl_Dec
a3d0: 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 61 70 43  rRefCount(p->apC
a3e0: 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20  olName[i]);.    
a3f0: 7d 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28  }.    Tcl_Free((
a400: 63 68 61 72 20 2a 29 70 2d 3e 61 70 43 6f 6c 4e  char *)p->apColN
a410: 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 61 70 43  ame);.    p->apC
a420: 6f 6c 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a  olName = 0;.  }.
a430: 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 7d    p->nCol = 0;.}
a440: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
a450: 7a 65 20 61 20 44 62 45 76 61 6c 43 6f 6e 74 65  ze a DbEvalConte
a460: 78 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  xt structure..**
a470: 0a 2a 2a 20 49 66 20 70 41 72 72 61 79 20 69 73  .** If pArray is
a480: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
a490: 69 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  it contains the 
a4a0: 6e 61 6d 65 20 6f 66 20 61 20 54 63 6c 20 61 72  name of a Tcl ar
a4b0: 72 61 79 0a 2a 2a 20 76 61 72 69 61 62 6c 65 2e  ray.** variable.
a4c0: 20 54 68 65 20 22 2a 22 20 6d 65 6d 62 65 72 20   The "*" member 
a4d0: 6f 66 20 74 68 69 73 20 61 72 72 61 79 20 69 73  of this array is
a4e0: 20 73 65 74 20 74 6f 20 61 20 6c 69 73 74 20 63   set to a list c
a4f0: 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 74 68 65  ontaining.** the
a500: 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f   names of the co
a510: 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62  lumns returned b
a520: 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  y the statement 
a530: 61 73 20 70 61 72 74 20 6f 66 20 65 61 63 68 0a  as part of each.
a540: 2a 2a 20 63 61 6c 6c 20 74 6f 20 64 62 45 76 61  ** call to dbEva
a550: 6c 53 74 65 70 28 29 2c 20 69 6e 20 6f 72 64 65  lStep(), in orde
a560: 72 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72  r from left to r
a570: 69 67 68 74 2e 20 65 2e 67 2e 20 69 66 20 74 68  ight. e.g. if th
a580: 65 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 74  e names .** of t
a590: 68 65 20 72 65 74 75 72 6e 65 64 20 63 6f 6c 75  he returned colu
a5a0: 6d 6e 73 20 61 72 65 20 61 2c 20 62 20 61 6e 64  mns are a, b and
a5b0: 20 63 2c 20 69 74 20 64 6f 65 73 20 74 68 65 20   c, it does the 
a5c0: 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 20 74 68  equivalent of th
a5d0: 65 20 0a 2a 2a 20 74 63 6c 20 63 6f 6d 6d 61 6e  e .** tcl comman
a5e0: 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 65 74  d:.**.**     set
a5f0: 20 24 7b 70 41 72 72 61 79 7d 28 2a 29 20 7b 61   ${pArray}(*) {a
a600: 20 62 20 63 7d 0a 2a 2f 0a 73 74 61 74 69 63 20   b c}.*/.static 
a610: 76 6f 69 64 20 64 62 45 76 61 6c 49 6e 69 74 28  void dbEvalInit(
a620: 0a 20 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74  .  DbEvalContext
a630: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
a640: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
a650: 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69 6e   structure to in
a660: 69 74 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 53 71  itialize */.  Sq
a670: 6c 69 74 65 44 62 20 2a 70 44 62 2c 20 20 20 20  liteDb *pDb,    
a680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a690: 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   Database handle
a6a0: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70   */.  Tcl_Obj *p
a6b0: 53 71 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Sql,            
a6c0: 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20        /* Object 
a6d0: 63 6f 6e 74 61 69 6e 69 6e 67 20 53 51 4c 20 73  containing SQL s
a6e0: 63 72 69 70 74 20 2a 2f 0a 20 20 54 63 6c 5f 4f  cript */.  Tcl_O
a6f0: 62 6a 20 2a 70 41 72 72 61 79 20 20 20 20 20 20  bj *pArray      
a700: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
a710: 6d 65 20 6f 66 20 54 63 6c 20 61 72 72 61 79 20  me of Tcl array 
a720: 74 6f 20 73 65 74 20 28 2a 29 20 65 6c 65 6d 65  to set (*) eleme
a730: 6e 74 20 6f 66 20 2a 2f 0a 29 7b 0a 20 20 6d 65  nt of */.){.  me
a740: 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f  mset(p, 0, sizeo
a750: 66 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 29  f(DbEvalContext)
a760: 29 3b 0a 20 20 70 2d 3e 70 44 62 20 3d 20 70 44  );.  p->pDb = pD
a770: 62 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20 3d 20 54  b;.  p->zSql = T
a780: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 70 53 71  cl_GetString(pSq
a790: 6c 29 3b 0a 20 20 70 2d 3e 70 53 71 6c 20 3d 20  l);.  p->pSql = 
a7a0: 70 53 71 6c 3b 0a 20 20 54 63 6c 5f 49 6e 63 72  pSql;.  Tcl_Incr
a7b0: 52 65 66 43 6f 75 6e 74 28 70 53 71 6c 29 3b 0a  RefCount(pSql);.
a7c0: 20 20 69 66 28 20 70 41 72 72 61 79 20 29 7b 0a    if( pArray ){.
a7d0: 20 20 20 20 70 2d 3e 70 41 72 72 61 79 20 3d 20      p->pArray = 
a7e0: 70 41 72 72 61 79 3b 0a 20 20 20 20 54 63 6c 5f  pArray;.    Tcl_
a7f0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 41 72  IncrRefCount(pAr
a800: 72 61 79 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ray);.  }.}../*.
a810: 2a 2a 20 4f 62 74 61 69 6e 20 69 6e 66 6f 72 6d  ** Obtain inform
a820: 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
a830: 72 6f 77 20 74 68 61 74 20 74 68 65 20 44 62 45  row that the DbE
a840: 76 61 6c 43 6f 6e 74 65 78 74 20 70 61 73 73 65  valContext passe
a850: 64 20 61 73 20 74 68 65 0a 2a 2a 20 66 69 72 73  d as the.** firs
a860: 74 20 61 72 67 75 6d 65 6e 74 20 63 75 72 72 65  t argument curre
a870: 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a  ntly points to..
a880: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
a890: 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28 0a 20 20  bEvalRowInfo(.  
a8a0: 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70  DbEvalContext *p
a8b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
a8c0: 2f 2a 20 45 76 61 6c 75 61 74 69 6f 6e 20 63 6f  /* Evaluation co
a8d0: 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 2a  ntext */.  int *
a8e0: 70 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20  pnCol,          
a8f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
a900: 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  T: Number of col
a910: 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 54  umn names */.  T
a920: 63 6c 5f 4f 62 6a 20 2a 2a 2a 70 61 70 43 6f 6c  cl_Obj ***papCol
a930: 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 2f  Name           /
a940: 2a 20 4f 55 54 3a 20 41 72 72 61 79 20 6f 66 20  * OUT: Array of 
a950: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a  column names */.
a960: 29 7b 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  ){.  /* Compute 
a970: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a  column names */.
a980: 20 20 69 66 28 20 30 3d 3d 70 2d 3e 61 70 43 6f    if( 0==p->apCo
a990: 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 71 6c  lName ){.    sql
a9a0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
a9b0: 20 3d 20 70 2d 3e 70 50 72 65 53 74 6d 74 2d 3e   = p->pPreStmt->
a9c0: 70 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20 69  pStmt;.    int i
a9d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a9e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
a9f0: 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  ator variable */
aa00: 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20  .    int nCol;  
aa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa20: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
aa30: 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64  columns returned
aa40: 20 62 79 20 70 53 74 6d 74 20 2a 2f 0a 20 20 20   by pStmt */.   
aa50: 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 43 6f 6c   Tcl_Obj **apCol
aa60: 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 2f  Name = 0;      /
aa70: 2a 20 41 72 72 61 79 20 6f 66 20 63 6f 6c 75 6d  * Array of colum
aa80: 6e 20 6e 61 6d 65 73 20 2a 2f 0a 0a 20 20 20 20  n names */..    
aa90: 70 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 20 3d  p->nCol = nCol =
aaa0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
aab0: 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20  count(pStmt);.  
aac0: 20 20 69 66 28 20 6e 43 6f 6c 3e 30 20 26 26 20    if( nCol>0 && 
aad0: 28 70 61 70 43 6f 6c 4e 61 6d 65 20 7c 7c 20 70  (papColName || p
aae0: 2d 3e 70 41 72 72 61 79 29 20 29 7b 0a 20 20 20  ->pArray) ){.   
aaf0: 20 20 20 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 28     apColName = (
ab00: 54 63 6c 5f 4f 62 6a 2a 2a 29 54 63 6c 5f 41 6c  Tcl_Obj**)Tcl_Al
ab10: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54 63 6c 5f  loc( sizeof(Tcl_
ab20: 4f 62 6a 2a 29 2a 6e 43 6f 6c 20 29 3b 0a 20 20  Obj*)*nCol );.  
ab30: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
ab40: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
ab50: 20 20 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 20     apColName[i] 
ab60: 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
ab70: 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  bj(sqlite3_colum
ab80: 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29 2c  n_name(pStmt,i),
ab90: 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 54 63   -1);.        Tc
aba0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 61  l_IncrRefCount(a
abb0: 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20  pColName[i]);.  
abc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 61      }.      p->a
abd0: 70 43 6f 6c 4e 61 6d 65 20 3d 20 61 70 43 6f 6c  pColName = apCol
abe0: 4e 61 6d 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Name;.    }..   
abf0: 20 2f 2a 20 49 66 20 72 65 73 75 6c 74 73 20 61   /* If results a
ac00: 72 65 20 62 65 69 6e 67 20 73 74 6f 72 65 64 20  re being stored 
ac10: 69 6e 20 61 6e 20 61 72 72 61 79 20 76 61 72 69  in an array vari
ac20: 61 62 6c 65 2c 20 74 68 65 6e 20 63 72 65 61 74  able, then creat
ac30: 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 61 72 72  e.    ** the arr
ac40: 61 79 28 2a 29 20 65 6e 74 72 79 20 66 6f 72 20  ay(*) entry for 
ac50: 74 68 61 74 20 61 72 72 61 79 0a 20 20 20 20 2a  that array.    *
ac60: 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 41 72  /.    if( p->pAr
ac70: 72 61 79 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  ray ){.      Tcl
ac80: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 20  _Interp *interp 
ac90: 3d 20 70 2d 3e 70 44 62 2d 3e 69 6e 74 65 72 70  = p->pDb->interp
aca0: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20  ;.      Tcl_Obj 
acb0: 2a 70 43 6f 6c 4c 69 73 74 20 3d 20 54 63 6c 5f  *pColList = Tcl_
acc0: 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20 20 20  NewObj();.      
acd0: 54 63 6c 5f 4f 62 6a 20 2a 70 53 74 61 72 20 3d  Tcl_Obj *pStar =
ace0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
acf0: 6a 28 22 2a 22 2c 20 2d 31 29 3b 0a 0a 20 20 20  j("*", -1);..   
ad00: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
ad10: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
ad20: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
ad30: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
ad40: 70 2c 20 70 43 6f 6c 4c 69 73 74 2c 20 61 70 43  p, pColList, apC
ad50: 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20  olName[i]);.    
ad60: 20 20 7d 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e    }.      Tcl_In
ad70: 63 72 52 65 66 43 6f 75 6e 74 28 70 53 74 61 72  crRefCount(pStar
ad80: 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a  );.      Tcl_Obj
ad90: 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20  SetVar2(interp, 
ada0: 70 2d 3e 70 41 72 72 61 79 2c 20 70 53 74 61 72  p->pArray, pStar
adb0: 2c 20 70 43 6f 6c 4c 69 73 74 2c 20 30 29 3b 0a  , pColList, 0);.
adc0: 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65        Tcl_DecrRe
add0: 66 43 6f 75 6e 74 28 70 53 74 61 72 29 3b 0a 20  fCount(pStar);. 
ade0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
adf0: 70 61 70 43 6f 6c 4e 61 6d 65 20 29 7b 0a 20 20  papColName ){.  
ae00: 20 20 2a 70 61 70 43 6f 6c 4e 61 6d 65 20 3d 20    *papColName = 
ae10: 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20  p->apColName;.  
ae20: 7d 0a 20 20 69 66 28 20 70 6e 43 6f 6c 20 29 7b  }.  if( pnCol ){
ae30: 0a 20 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 70 2d  .    *pnCol = p-
ae40: 3e 6e 43 6f 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  >nCol;.  }.}../*
ae50: 0a 2a 2a 20 52 65 74 75 72 6e 20 6f 6e 65 20 6f  .** Return one o
ae60: 66 20 54 43 4c 5f 4f 4b 2c 20 54 43 4c 5f 42 52  f TCL_OK, TCL_BR
ae70: 45 41 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52  EAK or TCL_ERROR
ae80: 2e 20 49 66 20 54 43 4c 5f 45 52 52 4f 52 20 69  . If TCL_ERROR i
ae90: 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2c 20 74  s.** returned, t
aea0: 68 65 6e 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  hen an error mes
aeb0: 73 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69  sage is stored i
aec0: 6e 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65  n the interprete
aed0: 72 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75  r before.** retu
aee0: 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 20 72  rning..**.** A r
aef0: 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 54  eturn value of T
af00: 43 4c 5f 4f 4b 20 6d 65 61 6e 73 20 74 68 65 72  CL_OK means ther
af10: 65 20 69 73 20 61 20 72 6f 77 20 6f 66 20 64 61  e is a row of da
af20: 74 61 20 61 76 61 69 6c 61 62 6c 65 2e 20 54 68  ta available. Th
af30: 65 0a 2a 2a 20 64 61 74 61 20 6d 61 79 20 62 65  e.** data may be
af40: 20 61 63 63 65 73 73 65 64 20 75 73 69 6e 67 20   accessed using 
af50: 64 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28 29 20  dbEvalRowInfo() 
af60: 61 6e 64 20 64 62 45 76 61 6c 43 6f 6c 75 6d 6e  and dbEvalColumn
af70: 56 61 6c 75 65 28 29 2e 20 54 68 69 73 0a 2a 2a  Value(). This.**
af80: 20 69 73 20 61 6e 61 6c 6f 67 6f 75 73 20 74 6f   is analogous to
af90: 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c   a return of SQL
afa0: 49 54 45 5f 52 4f 57 20 66 72 6f 6d 20 73 71 6c  ITE_ROW from sql
afb0: 69 74 65 33 5f 73 74 65 70 28 29 2e 20 49 66 20  ite3_step(). If 
afc0: 54 43 4c 5f 42 52 45 41 4b 0a 2a 2a 20 69 73 20  TCL_BREAK.** is 
afd0: 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 74  returned, then t
afe0: 68 65 20 53 51 4c 20 73 63 72 69 70 74 20 68 61  he SQL script ha
aff0: 73 20 66 69 6e 69 73 68 65 64 20 65 78 65 63 75  s finished execu
b000: 74 69 6e 67 20 61 6e 64 20 74 68 65 72 65 20 61  ting and there a
b010: 72 65 0a 2a 2a 20 6e 6f 20 66 75 72 74 68 65 72  re.** no further
b020: 20 72 6f 77 73 20 61 76 61 69 6c 61 62 6c 65 2e   rows available.
b030: 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72   This is similar
b040: 20 74 6f 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e   to SQLITE_DONE.
b050: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
b060: 62 45 76 61 6c 53 74 65 70 28 44 62 45 76 61 6c  bEvalStep(DbEval
b070: 43 6f 6e 74 65 78 74 20 2a 70 29 7b 0a 20 20 63  Context *p){.  c
b080: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 72 65 76  onst char *zPrev
b090: 53 71 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  Sql = 0;       /
b0a0: 2a 20 50 72 65 76 69 6f 75 73 20 76 61 6c 75 65  * Previous value
b0b0: 20 6f 66 20 70 2d 3e 7a 53 71 6c 20 2a 2f 0a 0a   of p->zSql */..
b0c0: 20 20 77 68 69 6c 65 28 20 70 2d 3e 7a 53 71 6c    while( p->zSql
b0d0: 5b 30 5d 20 7c 7c 20 70 2d 3e 70 50 72 65 53 74  [0] || p->pPreSt
b0e0: 6d 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  mt ){.    int rc
b0f0: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 50 72  ;.    if( p->pPr
b100: 65 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20  eStmt==0 ){.    
b110: 20 20 7a 50 72 65 76 53 71 6c 20 3d 20 28 70 2d    zPrevSql = (p-
b120: 3e 7a 53 71 6c 3d 3d 7a 50 72 65 76 53 71 6c 20  >zSql==zPrevSql 
b130: 3f 20 30 20 3a 20 70 2d 3e 7a 53 71 6c 29 3b 0a  ? 0 : p->zSql);.
b140: 20 20 20 20 20 20 72 63 20 3d 20 64 62 50 72 65        rc = dbPre
b150: 70 61 72 65 41 6e 64 42 69 6e 64 28 70 2d 3e 70  pareAndBind(p->p
b160: 44 62 2c 20 70 2d 3e 7a 53 71 6c 2c 20 26 70 2d  Db, p->zSql, &p-
b170: 3e 7a 53 71 6c 2c 20 26 70 2d 3e 70 50 72 65 53  >zSql, &p->pPreS
b180: 74 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tmt);.      if( 
b190: 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 20 72 65 74  rc!=TCL_OK ) ret
b1a0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 65 6c 73  urn rc;.    }els
b1b0: 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 73  e{.      int rcs
b1c0: 3b 0a 20 20 20 20 20 20 53 71 6c 69 74 65 44 62  ;.      SqliteDb
b1d0: 20 2a 70 44 62 20 3d 20 70 2d 3e 70 44 62 3b 0a   *pDb = p->pDb;.
b1e0: 20 20 20 20 20 20 53 71 6c 50 72 65 70 61 72 65        SqlPrepare
b1f0: 64 53 74 6d 74 20 2a 70 50 72 65 53 74 6d 74 20  dStmt *pPreStmt 
b200: 3d 20 70 2d 3e 70 50 72 65 53 74 6d 74 3b 0a 20  = p->pPreStmt;. 
b210: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d       sqlite3_stm
b220: 74 20 2a 70 53 74 6d 74 20 3d 20 70 50 72 65 53  t *pStmt = pPreS
b230: 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a 0a 20 20 20  tmt->pStmt;..   
b240: 20 20 20 72 63 73 20 3d 20 73 71 6c 69 74 65 33     rcs = sqlite3
b250: 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20  _step(pStmt);.  
b260: 20 20 20 20 69 66 28 20 72 63 73 3d 3d 53 51 4c      if( rcs==SQL
b270: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20  ITE_ROW ){.     
b280: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
b290: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b2a0: 69 66 28 20 70 2d 3e 70 41 72 72 61 79 20 29 7b  if( p->pArray ){
b2b0: 0a 20 20 20 20 20 20 20 20 64 62 45 76 61 6c 52  .        dbEvalR
b2c0: 6f 77 49 6e 66 6f 28 70 2c 20 30 2c 20 30 29 3b  owInfo(p, 0, 0);
b2d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
b2e0: 63 73 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  cs = sqlite3_res
b2f0: 65 74 28 70 53 74 6d 74 29 3b 0a 0a 20 20 20 20  et(pStmt);..    
b300: 20 20 70 44 62 2d 3e 6e 53 74 65 70 20 3d 20 73    pDb->nStep = s
b310: 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74  qlite3_stmt_stat
b320: 75 73 28 70 53 74 6d 74 2c 53 51 4c 49 54 45 5f  us(pStmt,SQLITE_
b330: 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53  STMTSTATUS_FULLS
b340: 43 41 4e 5f 53 54 45 50 2c 31 29 3b 0a 20 20 20  CAN_STEP,1);.   
b350: 20 20 20 70 44 62 2d 3e 6e 53 6f 72 74 20 3d 20     pDb->nSort = 
b360: 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61  sqlite3_stmt_sta
b370: 74 75 73 28 70 53 74 6d 74 2c 53 51 4c 49 54 45  tus(pStmt,SQLITE
b380: 5f 53 54 4d 54 53 54 41 54 55 53 5f 53 4f 52 54  _STMTSTATUS_SORT
b390: 2c 31 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e  ,1);.      pDb->
b3a0: 6e 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  nIndex = sqlite3
b3b0: 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 53 74  _stmt_status(pSt
b3c0: 6d 74 2c 53 51 4c 49 54 45 5f 53 54 4d 54 53 54  mt,SQLITE_STMTST
b3d0: 41 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 2c 31  ATUS_AUTOINDEX,1
b3e0: 29 3b 0a 20 20 20 20 20 20 64 62 52 65 6c 65 61  );.      dbRelea
b3f0: 73 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 29  seColumnNames(p)
b400: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 65 53  ;.      p->pPreS
b410: 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  tmt = 0;..      
b420: 69 66 28 20 72 63 73 21 3d 53 51 4c 49 54 45 5f  if( rcs!=SQLITE_
b430: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  OK ){.        /*
b440: 20 49 66 20 61 20 72 75 6e 2d 74 69 6d 65 20 65   If a run-time e
b450: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 70  rror occurs, rep
b460: 6f 72 74 20 74 68 65 20 65 72 72 6f 72 20 61 6e  ort the error an
b470: 64 20 73 74 6f 70 20 72 65 61 64 69 6e 67 0a 20  d stop reading. 
b480: 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51         ** the SQ
b490: 4c 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 64  L.  */.        d
b4a0: 62 52 65 6c 65 61 73 65 53 74 6d 74 28 70 44 62  bReleaseStmt(pDb
b4b0: 2c 20 70 50 72 65 53 74 6d 74 2c 20 31 29 3b 0a  , pPreStmt, 1);.
b4c0: 23 69 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  #if SQLITE_TEST.
b4d0: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
b4e0: 44 62 2d 3e 62 4c 65 67 61 63 79 50 72 65 70 61  Db->bLegacyPrepa
b4f0: 72 65 20 26 26 20 72 63 73 3d 3d 53 51 4c 49 54  re && rcs==SQLIT
b500: 45 5f 53 43 48 45 4d 41 20 26 26 20 7a 50 72 65  E_SCHEMA && zPre
b510: 76 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  vSql ){.        
b520: 20 20 2f 2a 20 49 66 20 74 68 65 20 72 75 6e 74    /* If the runt
b530: 69 6d 65 20 65 72 72 6f 72 20 77 61 73 20 61 6e  ime error was an
b540: 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 2c 20   SQLITE_SCHEMA, 
b550: 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
b560: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61  .          ** ha
b570: 6e 64 6c 65 20 69 73 20 63 6f 6e 66 69 67 75 72  ndle is configur
b580: 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 6c 65  ed to use the le
b590: 67 61 63 79 20 73 71 6c 69 74 65 33 5f 70 72 65  gacy sqlite3_pre
b5a0: 70 61 72 65 28 29 20 0a 20 20 20 20 20 20 20 20  pare() .        
b5b0: 20 20 2a 2a 20 69 6e 74 65 72 66 61 63 65 2c 20    ** interface, 
b5c0: 72 65 74 72 79 20 70 72 65 70 61 72 65 28 29 2f  retry prepare()/
b5d0: 73 74 65 70 28 29 20 6f 6e 20 74 68 65 20 73 61  step() on the sa
b5e0: 6d 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  me SQL statement
b5f0: 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54  ..          ** T
b600: 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73  his only happens
b610: 20 6f 6e 63 65 2e 20 49 66 20 74 68 65 72 65 20   once. If there 
b620: 69 73 20 61 20 73 65 63 6f 6e 64 20 53 51 4c 49  is a second SQLI
b630: 54 45 5f 53 43 48 45 4d 41 0a 20 20 20 20 20 20  TE_SCHEMA.      
b640: 20 20 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68      ** error, th
b650: 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20  e error will be 
b660: 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
b670: 63 61 6c 6c 65 72 2e 20 2a 2f 0a 20 20 20 20 20  caller. */.     
b680: 20 20 20 20 20 70 2d 3e 7a 53 71 6c 20 3d 20 7a       p->zSql = z
b690: 50 72 65 76 53 71 6c 3b 0a 20 20 20 20 20 20 20  PrevSql;.       
b6a0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
b6b0: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
b6c0: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a        Tcl_SetObj
b6d0: 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65  Result(pDb->inte
b6e0: 72 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rp,.            
b6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c               Tcl
b700: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71  _NewStringObj(sq
b710: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
b720: 2d 3e 64 62 29 2c 20 2d 31 29 29 3b 0a 20 20 20  ->db), -1));.   
b730: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
b740: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c  ERROR;.      }el
b750: 73 65 7b 0a 20 20 20 20 20 20 20 20 64 62 52 65  se{.        dbRe
b760: 6c 65 61 73 65 53 74 6d 74 28 70 44 62 2c 20 70  leaseStmt(pDb, p
b770: 50 72 65 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20  PreStmt, 0);.   
b780: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
b790: 20 20 2f 2a 20 46 69 6e 69 73 68 65 64 20 2a 2f    /* Finished */
b7a0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 42 52  .  return TCL_BR
b7b0: 45 41 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  EAK;.}../*.** Fr
b7c0: 65 65 20 61 6c 6c 20 72 65 73 6f 75 72 63 65 73  ee all resources
b7d0: 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20   currently held 
b7e0: 62 79 20 74 68 65 20 44 62 45 76 61 6c 43 6f 6e  by the DbEvalCon
b7f0: 74 65 78 74 20 73 74 72 75 63 74 75 72 65 20 70  text structure p
b800: 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20  assed.** as the 
b810: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20  first argument. 
b820: 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  There should be 
b830: 65 78 61 63 74 6c 79 20 6f 6e 65 20 63 61 6c 6c  exactly one call
b840: 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
b850: 6e 0a 2a 2a 20 66 6f 72 20 65 61 63 68 20 63 61  n.** for each ca
b860: 6c 6c 20 74 6f 20 64 62 45 76 61 6c 49 6e 69 74  ll to dbEvalInit
b870: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
b880: 69 64 20 64 62 45 76 61 6c 46 69 6e 61 6c 69 7a  id dbEvalFinaliz
b890: 65 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20  e(DbEvalContext 
b8a0: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 50  *p){.  if( p->pP
b8b0: 72 65 53 74 6d 74 20 29 7b 0a 20 20 20 20 73 71  reStmt ){.    sq
b8c0: 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70  lite3_reset(p->p
b8d0: 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 29 3b  PreStmt->pStmt);
b8e0: 0a 20 20 20 20 64 62 52 65 6c 65 61 73 65 53 74  .    dbReleaseSt
b8f0: 6d 74 28 70 2d 3e 70 44 62 2c 20 70 2d 3e 70 50  mt(p->pDb, p->pP
b900: 72 65 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  reStmt, 0);.    
b910: 70 2d 3e 70 50 72 65 53 74 6d 74 20 3d 20 30 3b  p->pPreStmt = 0;
b920: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 41  .  }.  if( p->pA
b930: 72 72 61 79 20 29 7b 0a 20 20 20 20 54 63 6c 5f  rray ){.    Tcl_
b940: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e  DecrRefCount(p->
b950: 70 41 72 72 61 79 29 3b 0a 20 20 20 20 70 2d 3e  pArray);.    p->
b960: 70 41 72 72 61 79 20 3d 20 30 3b 0a 20 20 7d 0a  pArray = 0;.  }.
b970: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
b980: 6e 74 28 70 2d 3e 70 53 71 6c 29 3b 0a 20 20 64  nt(p->pSql);.  d
b990: 62 52 65 6c 65 61 73 65 43 6f 6c 75 6d 6e 4e 61  bReleaseColumnNa
b9a0: 6d 65 73 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mes(p);.}../*.**
b9b0: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
b9c0: 72 20 74 6f 20 61 20 54 63 6c 5f 4f 62 6a 20 73  r to a Tcl_Obj s
b9d0: 74 72 75 63 74 75 72 65 20 77 69 74 68 20 72 65  tructure with re
b9e0: 66 2d 63 6f 75 6e 74 20 30 20 74 68 61 74 20 63  f-count 0 that c
b9f0: 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 76  ontains.** the v
ba00: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 69 43 6f  alue for the iCo
ba10: 6c 27 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  l'th column of t
ba20: 68 65 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79  he row currently
ba30: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 0a 2a   pointed to by.*
ba40: 2a 20 74 68 65 20 44 62 45 76 61 6c 43 6f 6e 74  * the DbEvalCont
ba50: 65 78 74 20 73 74 72 75 63 74 75 72 65 20 70 61  ext structure pa
ba60: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
ba70: 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  t argument..*/.s
ba80: 74 61 74 69 63 20 54 63 6c 5f 4f 62 6a 20 2a 64  tatic Tcl_Obj *d
ba90: 62 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65  bEvalColumnValue
baa0: 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a  (DbEvalContext *
bab0: 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20  p, int iCol){.  
bac0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
bad0: 74 6d 74 20 3d 20 70 2d 3e 70 50 72 65 53 74 6d  tmt = p->pPreStm
bae0: 74 2d 3e 70 53 74 6d 74 3b 0a 20 20 73 77 69 74  t->pStmt;.  swit
baf0: 63 68 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ch( sqlite3_colu
bb00: 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c 20 69  mn_type(pStmt, i
bb10: 43 6f 6c 29 20 29 7b 0a 20 20 20 20 63 61 73 65  Col) ){.    case
bb20: 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a   SQLITE_BLOB: {.
bb30: 20 20 20 20 20 20 69 6e 74 20 62 79 74 65 73 20        int bytes 
bb40: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
bb50: 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20 69 43  _bytes(pStmt, iC
bb60: 6f 6c 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  ol);.      const
bb70: 20 63 68 61 72 20 2a 7a 42 6c 6f 62 20 3d 20 73   char *zBlob = s
bb80: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c  qlite3_column_bl
bb90: 6f 62 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29 3b  ob(pStmt, iCol);
bba0: 0a 20 20 20 20 20 20 69 66 28 20 21 7a 42 6c 6f  .      if( !zBlo
bbb0: 62 20 29 20 62 79 74 65 73 20 3d 20 30 3b 0a 20  b ) bytes = 0;. 
bbc0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f       return Tcl_
bbd0: 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28  NewByteArrayObj(
bbe0: 28 75 38 2a 29 7a 42 6c 6f 62 2c 20 62 79 74 65  (u8*)zBlob, byte
bbf0: 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  s);.    }.    ca
bc00: 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  se SQLITE_INTEGE
bc10: 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  R: {.      sqlit
bc20: 65 5f 69 6e 74 36 34 20 76 20 3d 20 73 71 6c 69  e_int64 v = sqli
bc30: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
bc40: 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20  (pStmt, iCol);. 
bc50: 20 20 20 20 20 69 66 28 20 76 3e 3d 2d 32 31 34       if( v>=-214
bc60: 37 34 38 33 36 34 37 20 26 26 20 76 3c 3d 32 31  7483647 && v<=21
bc70: 34 37 34 38 33 36 34 37 20 29 7b 0a 20 20 20 20  47483647 ){.    
bc80: 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e      return Tcl_N
bc90: 65 77 49 6e 74 4f 62 6a 28 28 69 6e 74 29 76 29  ewIntObj((int)v)
bca0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
bcb0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 63         return Tc
bcc0: 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28  l_NewWideIntObj(
bcd0: 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  v);.      }.    
bce0: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
bcf0: 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20  E_FLOAT: {.     
bd00: 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 65 77 44   return Tcl_NewD
bd10: 6f 75 62 6c 65 4f 62 6a 28 73 71 6c 69 74 65 33  oubleObj(sqlite3
bd20: 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70  _column_double(p
bd30: 53 74 6d 74 2c 20 69 43 6f 6c 29 29 3b 0a 20 20  Stmt, iCol));.  
bd40: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
bd50: 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  ITE_NULL: {.    
bd60: 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 65 77    return Tcl_New
bd70: 53 74 72 69 6e 67 4f 62 6a 28 70 2d 3e 70 44 62  StringObj(p->pDb
bd80: 2d 3e 7a 4e 75 6c 6c 2c 20 2d 31 29 3b 0a 20 20  ->zNull, -1);.  
bd90: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
bda0: 6e 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  n Tcl_NewStringO
bdb0: 62 6a 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65  bj((char*)sqlite
bdc0: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
bdd0: 74 6d 74 2c 20 69 43 6f 6c 29 2c 20 2d 31 29 3b  tmt, iCol), -1);
bde0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 75 73 69  .}../*.** If usi
bdf0: 6e 67 20 54 63 6c 20 76 65 72 73 69 6f 6e 20 38  ng Tcl version 8
be00: 2e 36 20 6f 72 20 67 72 65 61 74 65 72 2c 20 75  .6 or greater, u
be10: 73 65 20 74 68 65 20 4e 52 20 66 75 6e 63 74 69  se the NR functi
be20: 6f 6e 73 20 74 6f 20 61 76 6f 69 64 0a 2a 2a 20  ons to avoid.** 
be30: 72 65 63 75 72 73 69 76 65 20 65 76 61 6c 75 74  recursive evalut
be40: 69 6f 6e 20 6f 66 20 73 63 72 69 70 74 73 20 62  ion of scripts b
be50: 79 20 74 68 65 20 5b 64 62 20 65 76 61 6c 5d 20  y the [db eval] 
be60: 61 6e 64 20 5b 64 62 20 74 72 61 6e 73 5d 0a 2a  and [db trans].*
be70: 2a 20 63 6f 6d 6d 61 6e 64 73 2e 20 45 76 65 6e  * commands. Even
be80: 20 69 66 20 74 68 65 20 68 65 61 64 65 72 73 20   if the headers 
be90: 75 73 65 64 20 77 68 69 6c 65 20 63 6f 6d 70 69  used while compi
bea0: 6c 69 6e 67 20 74 68 65 20 65 78 74 65 6e 73 69  ling the extensi
beb0: 6f 6e 0a 2a 2a 20 61 72 65 20 38 2e 36 20 6f 72  on.** are 8.6 or
bec0: 20 6e 65 77 65 72 2c 20 74 68 65 20 63 6f 64 65   newer, the code
bed0: 20 73 74 69 6c 6c 20 74 65 73 74 73 20 74 68 65   still tests the
bee0: 20 54 63 6c 20 76 65 72 73 69 6f 6e 20 61 74 20   Tcl version at 
bef0: 72 75 6e 74 69 6d 65 2e 0a 2a 2a 20 54 68 69 73  runtime..** This
bf00: 20 61 6c 6c 6f 77 73 20 73 74 75 62 73 2d 65 6e   allows stubs-en
bf10: 61 62 6c 65 64 20 62 75 69 6c 64 73 20 74 6f 20  abled builds to 
bf20: 62 65 20 75 73 65 64 20 77 69 74 68 20 6f 6c 64  be used with old
bf30: 65 72 20 54 63 6c 20 6c 69 62 72 61 72 69 65 73  er Tcl libraries
bf40: 2e 0a 2a 2f 0a 23 69 66 20 54 43 4c 5f 4d 41 4a  ..*/.#if TCL_MAJ
bf50: 4f 52 5f 56 45 52 53 49 4f 4e 3e 38 20 7c 7c 20  OR_VERSION>8 || 
bf60: 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49  (TCL_MAJOR_VERSI
bf70: 4f 4e 3d 3d 38 20 26 26 20 54 43 4c 5f 4d 49 4e  ON==8 && TCL_MIN
bf80: 4f 52 5f 56 45 52 53 49 4f 4e 3e 3d 36 29 0a 23  OR_VERSION>=6).#
bf90: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 54   define SQLITE_T
bfa0: 43 4c 5f 4e 52 45 20 31 0a 73 74 61 74 69 63 20  CL_NRE 1.static 
bfb0: 69 6e 74 20 44 62 55 73 65 4e 72 65 28 76 6f 69  int DbUseNre(voi
bfc0: 64 29 7b 0a 20 20 69 6e 74 20 6d 61 6a 6f 72 2c  d){.  int major,
bfd0: 20 6d 69 6e 6f 72 3b 0a 20 20 54 63 6c 5f 47 65   minor;.  Tcl_Ge
bfe0: 74 56 65 72 73 69 6f 6e 28 26 6d 61 6a 6f 72 2c  tVersion(&major,
bff0: 20 26 6d 69 6e 6f 72 2c 20 30 2c 20 30 29 3b 0a   &minor, 0, 0);.
c000: 20 20 72 65 74 75 72 6e 28 20 28 6d 61 6a 6f 72    return( (major
c010: 3d 3d 38 20 26 26 20 6d 69 6e 6f 72 3e 3d 36 29  ==8 && minor>=6)
c020: 20 7c 7c 20 6d 61 6a 6f 72 3e 38 20 29 3b 0a 7d   || major>8 );.}
c030: 0a 23 65 6c 73 65 0a 2f 2a 20 0a 2a 2a 20 43 6f  .#else./* .** Co
c040: 6d 70 69 6c 69 6e 67 20 75 73 69 6e 67 20 68 65  mpiling using he
c050: 61 64 65 72 73 20 65 61 72 6c 69 65 72 20 74 68  aders earlier th
c060: 61 6e 20 38 2e 36 2e 20 49 6e 20 74 68 69 73 20  an 8.6. In this 
c070: 63 61 73 65 20 4e 52 20 63 61 6e 6e 6f 74 20 62  case NR cannot b
c080: 65 0a 2a 2a 20 75 73 65 64 2c 20 73 6f 20 44 62  e.** used, so Db
c090: 55 73 65 4e 72 65 28 29 20 74 6f 20 61 6c 77 61  UseNre() to alwa
c0a0: 79 73 20 72 65 74 75 72 6e 20 7a 65 72 6f 2e 20  ys return zero. 
c0b0: 41 64 64 20 23 64 65 66 69 6e 65 73 20 66 6f 72  Add #defines for
c0c0: 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 54 63   the other.** Tc
c0d0: 6c 5f 4e 52 78 78 78 28 29 20 66 75 6e 63 74 69  l_NRxxx() functi
c0e0: 6f 6e 73 20 74 6f 20 70 72 65 76 65 6e 74 20 74  ons to prevent t
c0f0: 68 65 6d 20 66 72 6f 6d 20 63 61 75 73 69 6e 67  hem from causing
c100: 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 65 72 72   compilation err
c110: 6f 72 73 2c 0a 2a 2a 20 65 76 65 6e 20 74 68 6f  ors,.** even tho
c120: 75 67 68 20 74 68 65 20 6f 6e 6c 79 20 69 6e 76  ugh the only inv
c130: 6f 63 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 6d  ocations of them
c140: 20 61 72 65 20 77 69 74 68 69 6e 20 63 6f 6e 64   are within cond
c150: 69 74 69 6f 6e 61 6c 20 62 6c 6f 63 6b 73 20 0a  itional blocks .
c160: 2a 2a 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  ** of the form:.
c170: 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 44 62 55 73  **.**   if( DbUs
c180: 65 4e 72 65 28 29 20 29 20 7b 20 2e 2e 2e 20 7d  eNre() ) { ... }
c190: 0a 2a 2f 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  .*/.# define SQL
c1a0: 49 54 45 5f 54 43 4c 5f 4e 52 45 20 30 0a 23 20  ITE_TCL_NRE 0.# 
c1b0: 64 65 66 69 6e 65 20 44 62 55 73 65 4e 72 65 28  define DbUseNre(
c1c0: 29 20 30 0a 23 20 64 65 66 69 6e 65 20 54 63 6c  ) 0.# define Tcl
c1d0: 5f 4e 52 41 64 64 43 61 6c 6c 62 61 63 6b 28 61  _NRAddCallback(a
c1e0: 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 30 0a 23 20  ,b,c,d,e,f) 0.# 
c1f0: 64 65 66 69 6e 65 20 54 63 6c 5f 4e 52 45 76 61  define Tcl_NREva
c200: 6c 4f 62 6a 28 61 2c 62 2c 63 29 20 30 0a 23 20  lObj(a,b,c) 0.# 
c210: 64 65 66 69 6e 65 20 54 63 6c 5f 4e 52 43 72 65  define Tcl_NRCre
c220: 61 74 65 43 6f 6d 6d 61 6e 64 28 61 2c 62 2c 63  ateCommand(a,b,c
c230: 2c 64 2c 65 2c 66 29 20 30 0a 23 65 6e 64 69 66  ,d,e,f) 0.#endif
c240: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
c250: 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66  ction is part of
c260: 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
c270: 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6d 6d 61  ion of the comma
c280: 6e 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 24 64 62 20  nd:.**.**   $db 
c290: 65 76 61 6c 20 53 51 4c 20 3f 41 52 52 41 59 4e  eval SQL ?ARRAYN
c2a0: 41 4d 45 3f 20 53 43 52 49 50 54 0a 2a 2f 0a 73  AME? SCRIPT.*/.s
c2b0: 74 61 74 69 63 20 69 6e 74 20 44 62 45 76 61 6c  tatic int DbEval
c2c0: 4e 65 78 74 43 6d 64 28 0a 20 20 43 6c 69 65 6e  NextCmd(.  Clien
c2d0: 74 44 61 74 61 20 64 61 74 61 5b 5d 2c 20 20 20  tData data[],   
c2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2f0: 2f 2a 20 64 61 74 61 5b 30 5d 20 69 73 20 74 68  /* data[0] is th
c300: 65 20 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74  e (DbEvalContext
c310: 2a 29 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  *) */.  Tcl_Inte
c320: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 20  rp *interp,     
c330: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c340: 54 63 6c 20 69 6e 74 65 72 70 72 65 74 65 72 20  Tcl interpreter 
c350: 2a 2f 0a 20 20 69 6e 74 20 72 65 73 75 6c 74 20  */.  int result 
c360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c370: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
c380: 75 6c 74 20 73 6f 20 66 61 72 20 2a 2f 0a 29 7b  ult so far */.){
c390: 0a 20 20 69 6e 74 20 72 63 20 3d 20 72 65 73 75  .  int rc = resu
c3a0: 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  lt;             
c3b0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
c3c0: 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20  n code */..  /* 
c3d0: 54 68 65 20 66 69 72 73 74 20 65 6c 65 6d 65 6e  The first elemen
c3e0: 74 20 6f 66 20 74 68 65 20 64 61 74 61 5b 5d 20  t of the data[] 
c3f0: 61 72 72 61 79 20 69 73 20 61 20 70 6f 69 6e 74  array is a point
c400: 65 72 20 74 6f 20 61 20 44 62 45 76 61 6c 43 6f  er to a DbEvalCo
c410: 6e 74 65 78 74 0a 20 20 2a 2a 20 73 74 72 75 63  ntext.  ** struc
c420: 74 75 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 75  ture allocated u
c430: 73 69 6e 67 20 54 63 6c 5f 41 6c 6c 6f 63 28 29  sing Tcl_Alloc()
c440: 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 65 6c 65  . The second ele
c450: 6d 65 6e 74 20 6f 66 20 64 61 74 61 5b 5d 0a 20  ment of data[]. 
c460: 20 2a 2a 20 69 73 20 61 20 70 6f 69 6e 74 65 72   ** is a pointer
c470: 20 74 6f 20 61 20 54 63 6c 5f 4f 62 6a 20 63 6f   to a Tcl_Obj co
c480: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 63 72  ntaining the scr
c490: 69 70 74 20 74 6f 20 72 75 6e 20 66 6f 72 20 65  ipt to run for e
c4a0: 61 63 68 20 72 6f 77 0a 20 20 2a 2a 20 72 65 74  ach row.  ** ret
c4b0: 75 72 6e 65 64 20 62 79 20 74 68 65 20 71 75 65  urned by the que
c4c0: 72 69 65 73 20 65 6e 63 61 70 73 75 6c 61 74 65  ries encapsulate
c4d0: 64 20 69 6e 20 64 61 74 61 5b 30 5d 2e 20 2a 2f  d in data[0]. */
c4e0: 0a 20 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74  .  DbEvalContext
c4f0: 20 2a 70 20 3d 20 28 44 62 45 76 61 6c 43 6f 6e   *p = (DbEvalCon
c500: 74 65 78 74 20 2a 29 64 61 74 61 5b 30 5d 3b 0a  text *)data[0];.
c510: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69    Tcl_Obj *pScri
c520: 70 74 20 3d 20 28 54 63 6c 5f 4f 62 6a 20 2a 29  pt = (Tcl_Obj *)
c530: 64 61 74 61 5b 31 5d 3b 0a 20 20 54 63 6c 5f 4f  data[1];.  Tcl_O
c540: 62 6a 20 2a 70 41 72 72 61 79 20 3d 20 70 2d 3e  bj *pArray = p->
c550: 70 41 72 72 61 79 3b 0a 0a 20 20 77 68 69 6c 65  pArray;..  while
c560: 28 20 28 72 63 3d 3d 54 43 4c 5f 4f 4b 20 7c 7c  ( (rc==TCL_OK ||
c570: 20 72 63 3d 3d 54 43 4c 5f 43 4f 4e 54 49 4e 55   rc==TCL_CONTINU
c580: 45 29 20 26 26 20 54 43 4c 5f 4f 4b 3d 3d 28 72  E) && TCL_OK==(r
c590: 63 20 3d 20 64 62 45 76 61 6c 53 74 65 70 28 70  c = dbEvalStep(p
c5a0: 29 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  )) ){.    int i;
c5b0: 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20  .    int nCol;. 
c5c0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 43     Tcl_Obj **apC
c5d0: 6f 6c 4e 61 6d 65 3b 0a 20 20 20 20 64 62 45 76  olName;.    dbEv
c5e0: 61 6c 52 6f 77 49 6e 66 6f 28 70 2c 20 26 6e 43  alRowInfo(p, &nC
c5f0: 6f 6c 2c 20 26 61 70 43 6f 6c 4e 61 6d 65 29 3b  ol, &apColName);
c600: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
c610: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
c620: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 20    Tcl_Obj *pVal 
c630: 3d 20 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56 61  = dbEvalColumnVa
c640: 6c 75 65 28 70 2c 20 69 29 3b 0a 20 20 20 20 20  lue(p, i);.     
c650: 20 69 66 28 20 70 41 72 72 61 79 3d 3d 30 20 29   if( pArray==0 )
c660: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62  {.        Tcl_Ob
c670: 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c  jSetVar2(interp,
c680: 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 30   apColName[i], 0
c690: 2c 20 70 56 61 6c 2c 20 30 29 3b 0a 20 20 20 20  , pVal, 0);.    
c6a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
c6b0: 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28   Tcl_ObjSetVar2(
c6c0: 69 6e 74 65 72 70 2c 20 70 41 72 72 61 79 2c 20  interp, pArray, 
c6d0: 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 70 56  apColName[i], pV
c6e0: 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  al, 0);.      }.
c6f0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
c700: 65 20 72 65 71 75 69 72 65 64 20 69 6e 74 65 72  e required inter
c710: 70 72 65 74 65 72 20 76 61 72 69 61 62 6c 65 73  preter variables
c720: 20 61 72 65 20 6e 6f 77 20 70 6f 70 75 6c 61 74   are now populat
c730: 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ed with the data
c740: 20 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68   .    ** from th
c750: 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2e 20 49  e current row. I
c760: 66 20 75 73 69 6e 67 20 4e 52 45 2c 20 73 63 68  f using NRE, sch
c770: 65 64 75 6c 65 20 63 61 6c 6c 62 61 63 6b 73 20  edule callbacks 
c780: 74 6f 20 65 76 61 6c 75 61 74 65 0a 20 20 20 20  to evaluate.    
c790: 2a 2a 20 73 63 72 69 70 74 20 70 53 63 72 69 70  ** script pScrip
c7a0: 74 2c 20 74 68 65 6e 20 74 6f 20 69 6e 76 6f 6b  t, then to invok
c7b0: 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
c7c0: 61 67 61 69 6e 20 74 6f 20 66 65 74 63 68 20 74  again to fetch t
c7d0: 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 72  he next.    ** r
c7e0: 6f 77 20 28 6f 72 20 63 6c 65 61 6e 20 75 70 20  ow (or clean up 
c7f0: 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  if there is no n
c800: 65 78 74 20 72 6f 77 20 6f 72 20 74 68 65 20 73  ext row or the s
c810: 63 72 69 70 74 20 74 68 72 6f 77 73 20 61 6e 0a  cript throws an.
c820: 20 20 20 20 2a 2a 20 65 78 63 65 70 74 69 6f 6e      ** exception
c830: 29 2e 20 41 66 74 65 72 20 73 63 68 65 64 75 6c  ). After schedul
c840: 69 6e 67 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  ing the callback
c850: 73 2c 20 72 65 74 75 72 6e 20 63 6f 6e 74 72 6f  s, return contro
c860: 6c 20 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a  l to the .    **
c870: 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 2a 2a 0a   caller..    **.
c880: 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 20 75 73      ** If not us
c890: 69 6e 67 20 4e 52 45 2c 20 65 76 61 6c 75 61 74  ing NRE, evaluat
c8a0: 65 20 70 53 63 72 69 70 74 20 64 69 72 65 63 74  e pScript direct
c8b0: 6c 79 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65 20  ly and continue 
c8c0: 77 69 74 68 20 74 68 65 0a 20 20 20 20 2a 2a 20  with the.    ** 
c8d0: 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  next iteration o
c8e0: 66 20 74 68 69 73 20 77 68 69 6c 65 28 2e 2e 2e  f this while(...
c8f0: 29 20 6c 6f 6f 70 2e 20 20 2a 2f 0a 20 20 20 20  ) loop.  */.    
c900: 69 66 28 20 44 62 55 73 65 4e 72 65 28 29 20 29  if( DbUseNre() )
c910: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 4e 52 41 64  {.      Tcl_NRAd
c920: 64 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70  dCallback(interp
c930: 2c 20 44 62 45 76 61 6c 4e 65 78 74 43 6d 64 2c  , DbEvalNextCmd,
c940: 20 28 76 6f 69 64 2a 29 70 2c 20 28 76 6f 69 64   (void*)p, (void
c950: 2a 29 70 53 63 72 69 70 74 2c 20 30 2c 20 30 29  *)pScript, 0, 0)
c960: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
c970: 63 6c 5f 4e 52 45 76 61 6c 4f 62 6a 28 69 6e 74  cl_NREvalObj(int
c980: 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20 30 29  erp, pScript, 0)
c990: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
c9a0: 20 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c     rc = Tcl_Eval
c9b0: 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 70 53  ObjEx(interp, pS
c9c0: 63 72 69 70 74 2c 20 30 29 3b 0a 20 20 20 20 7d  cript, 0);.    }
c9d0: 0a 20 20 7d 0a 0a 20 20 54 63 6c 5f 44 65 63 72  .  }..  Tcl_Decr
c9e0: 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74  RefCount(pScript
c9f0: 29 3b 0a 20 20 64 62 45 76 61 6c 46 69 6e 61 6c  );.  dbEvalFinal
ca00: 69 7a 65 28 70 29 3b 0a 20 20 54 63 6c 5f 46 72  ize(p);.  Tcl_Fr
ca10: 65 65 28 28 63 68 61 72 20 2a 29 70 29 3b 0a 0a  ee((char *)p);..
ca20: 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b    if( rc==TCL_OK
ca30: 20 7c 7c 20 72 63 3d 3d 54 43 4c 5f 42 52 45 41   || rc==TCL_BREA
ca40: 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 52 65 73  K ){.    Tcl_Res
ca50: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  etResult(interp)
ca60: 3b 0a 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f  ;.    rc = TCL_O
ca70: 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  K;.  }.  return 
ca80: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
ca90: 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d 61 6e   "sqlite" comman
caa0: 64 20 62 65 6c 6f 77 20 63 72 65 61 74 65 73 20  d below creates 
cab0: 61 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d 61 6e  a new Tcl comman
cac0: 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f  d for each.** co
cad0: 6e 6e 65 63 74 69 6f 6e 20 69 74 20 6f 70 65 6e  nnection it open
cae0: 73 20 74 6f 20 61 6e 20 53 51 4c 69 74 65 20 64  s to an SQLite d
caf0: 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 72  atabase.  This r
cb00: 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65  outine is invoke
cb10: 64 0a 2a 2a 20 77 68 65 6e 65 76 65 72 20 6f 6e  d.** whenever on
cb20: 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65  e of those conne
cb30: 63 74 69 6f 6e 2d 73 70 65 63 69 66 69 63 20 63  ction-specific c
cb40: 6f 6d 6d 61 6e 64 73 20 69 73 20 65 78 65 63 75  ommands is execu
cb50: 74 65 64 0a 2a 2a 20 69 6e 20 54 63 6c 2e 20 20  ted.** in Tcl.  
cb60: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
cb70: 79 6f 75 20 72 75 6e 20 54 63 6c 20 63 6f 64 65  you run Tcl code
cb80: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
cb90: 2a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 20  *       sqlite3 
cba0: 64 62 31 20 20 22 6d 79 5f 64 61 74 61 62 61 73  db1  "my_databas
cbb0: 65 22 0a 2a 2a 20 20 20 20 20 20 20 64 62 31 20  e".**       db1 
cbc0: 63 6c 6f 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20  close.**.** The 
cbd0: 66 69 72 73 74 20 63 6f 6d 6d 61 6e 64 20 6f 70  first command op
cbe0: 65 6e 73 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e  ens a connection
cbf0: 20 74 6f 20 74 68 65 20 22 6d 79 5f 64 61 74 61   to the "my_data
cc00: 62 61 73 65 22 20 64 61 74 61 62 61 73 65 0a 2a  base" database.*
cc10: 2a 20 61 6e 64 20 63 61 6c 6c 73 20 74 68 61 74  * and calls that
cc20: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 22 64 62 31   connection "db1
cc30: 22 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20 63  ".  The second c
cc40: 6f 6d 6d 61 6e 64 20 63 61 75 73 65 73 20 74 68  ommand causes th
cc50: 69 73 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65  is.** subroutine
cc60: 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 2e 0a   to be invoked..
cc70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62  */.static int Db
cc80: 4f 62 6a 43 6d 64 28 76 6f 69 64 20 2a 63 64 2c  ObjCmd(void *cd,
cc90: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
cca0: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 54 63  erp, int objc,Tc
ccb0: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a  l_Obj *const*obj
ccc0: 76 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  v){.  SqliteDb *
ccd0: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a  pDb = (SqliteDb*
cce0: 29 63 64 3b 0a 20 20 69 6e 74 20 63 68 6f 69 63  )cd;.  int choic
ccf0: 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 54 43  e;.  int rc = TC
cd00: 4c 5f 4f 4b 3b 0a 20 20 73 74 61 74 69 63 20 63  L_OK;.  static c
cd10: 6f 6e 73 74 20 63 68 61 72 20 2a 44 42 5f 73 74  onst char *DB_st
cd20: 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 61 75  rs[] = {.    "au
cd30: 74 68 6f 72 69 7a 65 72 22 2c 20 20 20 20 20 20  thorizer",      
cd40: 20 20 20 22 62 61 63 6b 75 70 22 2c 20 20 20 20     "backup",    
cd50: 20 20 20 20 20 20 20 20 22 62 75 73 79 22 2c 0a          "busy",.
cd60: 20 20 20 20 22 63 61 63 68 65 22 2c 20 20 20 20      "cache",    
cd70: 20 20 20 20 20 20 20 20 20 20 22 63 68 61 6e 67            "chang
cd80: 65 73 22 2c 20 20 20 20 20 20 20 20 20 20 20 22  es",           "
cd90: 63 6c 6f 73 65 22 2c 0a 20 20 20 20 22 63 6f 6c  close",.    "col
cda0: 6c 61 74 65 22 2c 20 20 20 20 20 20 20 20 20 20  late",          
cdb0: 20 20 22 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65    "collation_nee
cdc0: 64 65 64 22 2c 20 20 22 63 6f 6d 6d 69 74 5f 68  ded",  "commit_h
cdd0: 6f 6f 6b 22 2c 0a 20 20 20 20 22 63 6f 6d 70 6c  ook",.    "compl
cde0: 65 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ete",           
cdf0: 22 63 6f 70 79 22 2c 20 20 20 20 20 20 20 20 20  "copy",         
ce00: 20 20 20 20 20 22 65 6e 61 62 6c 65 5f 6c 6f 61       "enable_loa
ce10: 64 5f 65 78 74 65 6e 73 69 6f 6e 22 2c 0a 20 20  d_extension",.  
ce20: 20 20 22 65 72 72 6f 72 63 6f 64 65 22 2c 20 20    "errorcode",  
ce30: 20 20 20 20 20 20 20 20 22 65 76 61 6c 22 2c 20          "eval", 
ce40: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 65 78               "ex
ce50: 69 73 74 73 22 2c 0a 20 20 20 20 22 66 75 6e 63  ists",.    "func
ce60: 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 20 20  tion",          
ce70: 20 22 69 6e 63 72 62 6c 6f 62 22 2c 20 20 20 20   "incrblob",    
ce80: 20 20 20 20 20 20 22 69 6e 74 65 72 72 75 70 74        "interrupt
ce90: 22 2c 0a 20 20 20 20 22 6c 61 73 74 5f 69 6e 73  ",.    "last_ins
cea0: 65 72 74 5f 72 6f 77 69 64 22 2c 20 20 22 6e 75  ert_rowid",  "nu
ceb0: 6c 6c 76 61 6c 75 65 22 2c 20 20 20 20 20 20 20  llvalue",       
cec0: 20 20 22 6f 6e 65 63 6f 6c 75 6d 6e 22 2c 0a 20    "onecolumn",. 
ced0: 20 20 20 22 70 72 6f 66 69 6c 65 22 2c 20 20 20     "profile",   
cee0: 20 20 20 20 20 20 20 20 20 22 70 72 6f 67 72 65           "progre
cef0: 73 73 22 2c 20 20 20 20 20 20 20 20 20 20 22 72  ss",          "r
cf00: 65 6b 65 79 22 2c 0a 20 20 20 20 22 72 65 73 74  ekey",.    "rest
cf10: 6f 72 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ore",           
cf20: 20 22 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 22   "rollback_hook"
cf30: 2c 20 20 20 20 20 22 73 74 61 74 75 73 22 2c 0a  ,     "status",.
cf40: 20 20 20 20 22 74 69 6d 65 6f 75 74 22 2c 20 20      "timeout",  
cf50: 20 20 20 20 20 20 20 20 20 20 22 74 6f 74 61 6c            "total
cf60: 5f 63 68 61 6e 67 65 73 22 2c 20 20 20 20 20 22  _changes",     "
cf70: 74 72 61 63 65 22 2c 0a 20 20 20 20 22 74 72 61  trace",.    "tra
cf80: 6e 73 61 63 74 69 6f 6e 22 2c 20 20 20 20 20 20  nsaction",      
cf90: 20 20 22 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79    "unlock_notify
cfa0: 22 2c 20 20 20 20 20 22 75 70 64 61 74 65 5f 68  ",     "update_h
cfb0: 6f 6f 6b 22 2c 0a 20 20 20 20 22 76 65 72 73 69  ook",.    "versi
cfc0: 6f 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  on",            
cfd0: 22 77 61 6c 5f 68 6f 6f 6b 22 2c 20 20 20 20 20  "wal_hook",     
cfe0: 20 20 20 20 20 30 0a 20 20 7d 3b 0a 20 20 65 6e       0.  };.  en
cff0: 75 6d 20 44 42 5f 65 6e 75 6d 20 7b 0a 20 20 20  um DB_enum {.   
d000: 20 44 42 5f 41 55 54 48 4f 52 49 5a 45 52 2c 20   DB_AUTHORIZER, 
d010: 20 20 20 20 20 20 20 44 42 5f 42 41 43 4b 55 50         DB_BACKUP
d020: 2c 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 42  ,           DB_B
d030: 55 53 59 2c 0a 20 20 20 20 44 42 5f 43 41 43 48  USY,.    DB_CACH
d040: 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 44  E,             D
d050: 42 5f 43 48 41 4e 47 45 53 2c 20 20 20 20 20 20  B_CHANGES,      
d060: 20 20 20 20 44 42 5f 43 4c 4f 53 45 2c 0a 20 20      DB_CLOSE,.  
d070: 20 20 44 42 5f 43 4f 4c 4c 41 54 45 2c 20 20 20    DB_COLLATE,   
d080: 20 20 20 20 20 20 20 20 44 42 5f 43 4f 4c 4c 41          DB_COLLA
d090: 54 49 4f 4e 5f 4e 45 45 44 45 44 2c 20 44 42 5f  TION_NEEDED, DB_
d0a0: 43 4f 4d 4d 49 54 5f 48 4f 4f 4b 2c 0a 20 20 20  COMMIT_HOOK,.   
d0b0: 20 44 42 5f 43 4f 4d 50 4c 45 54 45 2c 20 20 20   DB_COMPLETE,   
d0c0: 20 20 20 20 20 20 20 44 42 5f 43 4f 50 59 2c 20         DB_COPY, 
d0d0: 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 45              DB_E
d0e0: 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e  NABLE_LOAD_EXTEN
d0f0: 53 49 4f 4e 2c 0a 20 20 20 20 44 42 5f 45 52 52  SION,.    DB_ERR
d100: 4f 52 43 4f 44 45 2c 20 20 20 20 20 20 20 20 20  ORCODE,         
d110: 44 42 5f 45 56 41 4c 2c 20 20 20 20 20 20 20 20  DB_EVAL,        
d120: 20 20 20 20 20 44 42 5f 45 58 49 53 54 53 2c 0a       DB_EXISTS,.
d130: 20 20 20 20 44 42 5f 46 55 4e 43 54 49 4f 4e 2c      DB_FUNCTION,
d140: 20 20 20 20 20 20 20 20 20 20 44 42 5f 49 4e 43            DB_INC
d150: 52 42 4c 4f 42 2c 20 20 20 20 20 20 20 20 20 44  RBLOB,         D
d160: 42 5f 49 4e 54 45 52 52 55 50 54 2c 0a 20 20 20  B_INTERRUPT,.   
d170: 20 44 42 5f 4c 41 53 54 5f 49 4e 53 45 52 54 5f   DB_LAST_INSERT_
d180: 52 4f 57 49 44 2c 20 44 42 5f 4e 55 4c 4c 56 41  ROWID, DB_NULLVA
d190: 4c 55 45 2c 20 20 20 20 20 20 20 20 44 42 5f 4f  LUE,        DB_O
d1a0: 4e 45 43 4f 4c 55 4d 4e 2c 0a 20 20 20 20 44 42  NECOLUMN,.    DB
d1b0: 5f 50 52 4f 46 49 4c 45 2c 20 20 20 20 20 20 20  _PROFILE,       
d1c0: 20 20 20 20 44 42 5f 50 52 4f 47 52 45 53 53 2c      DB_PROGRESS,
d1d0: 20 20 20 20 20 20 20 20 20 44 42 5f 52 45 4b 45           DB_REKE
d1e0: 59 2c 0a 20 20 20 20 44 42 5f 52 45 53 54 4f 52  Y,.    DB_RESTOR
d1f0: 45 2c 20 20 20 20 20 20 20 20 20 20 20 44 42 5f  E,           DB_
d200: 52 4f 4c 4c 42 41 43 4b 5f 48 4f 4f 4b 2c 20 20  ROLLBACK_HOOK,  
d210: 20 20 44 42 5f 53 54 41 54 55 53 2c 0a 20 20 20    DB_STATUS,.   
d220: 20 44 42 5f 54 49 4d 45 4f 55 54 2c 20 20 20 20   DB_TIMEOUT,    
d230: 20 20 20 20 20 20 20 44 42 5f 54 4f 54 41 4c 5f         DB_TOTAL_
d240: 43 48 41 4e 47 45 53 2c 20 20 20 20 44 42 5f 54  CHANGES,    DB_T
d250: 52 41 43 45 2c 0a 20 20 20 20 44 42 5f 54 52 41  RACE,.    DB_TRA
d260: 4e 53 41 43 54 49 4f 4e 2c 20 20 20 20 20 20 20  NSACTION,       
d270: 44 42 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59  DB_UNLOCK_NOTIFY
d280: 2c 20 20 20 20 44 42 5f 55 50 44 41 54 45 5f 48  ,    DB_UPDATE_H
d290: 4f 4f 4b 2c 0a 20 20 20 20 44 42 5f 56 45 52 53  OOK,.    DB_VERS
d2a0: 49 4f 4e 2c 20 20 20 20 20 20 20 20 20 20 20 44  ION,           D
d2b0: 42 5f 57 41 4c 5f 48 4f 4f 4b 0a 20 20 7d 3b 0a  B_WAL_HOOK.  };.
d2c0: 20 20 2f 2a 20 64 6f 6e 27 74 20 6c 65 61 76 65    /* don't leave
d2d0: 20 74 72 61 69 6c 69 6e 67 20 63 6f 6d 6d 61 73   trailing commas
d2e0: 20 6f 6e 20 44 42 5f 65 6e 75 6d 2c 20 69 74 20   on DB_enum, it 
d2f0: 63 6f 6e 66 75 73 65 73 20 74 68 65 20 41 49 58  confuses the AIX
d300: 20 78 6c 63 20 63 6f 6d 70 69 6c 65 72 20 2a 2f   xlc compiler */
d310: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3c 32 20 29  ..  if( objc<2 )
d320: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
d330: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
d340: 2c 20 6f 62 6a 76 2c 20 22 53 55 42 43 4f 4d 4d  , objv, "SUBCOMM
d350: 41 4e 44 20 2e 2e 2e 22 29 3b 0a 20 20 20 20 72  AND ...");.    r
d360: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
d370: 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47  .  }.  if( Tcl_G
d380: 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69  etIndexFromObj(i
d390: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20  nterp, objv[1], 
d3a0: 44 42 5f 73 74 72 73 2c 20 22 6f 70 74 69 6f 6e  DB_strs, "option
d3b0: 22 2c 20 30 2c 20 26 63 68 6f 69 63 65 29 20 29  ", 0, &choice) )
d3c0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
d3d0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 73  _ERROR;.  }..  s
d3e0: 77 69 74 63 68 28 20 28 65 6e 75 6d 20 44 42 5f  witch( (enum DB_
d3f0: 65 6e 75 6d 29 63 68 6f 69 63 65 20 29 7b 0a 0a  enum)choice ){..
d400: 20 20 2f 2a 20 20 20 20 24 64 62 20 61 75 74 68    /*    $db auth
d410: 6f 72 69 7a 65 72 20 3f 43 41 4c 4c 42 41 43 4b  orizer ?CALLBACK
d420: 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f  ?.  **.  ** Invo
d430: 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c  ke the given cal
d440: 6c 62 61 63 6b 20 74 6f 20 61 75 74 68 6f 72 69  lback to authori
d450: 7a 65 20 65 61 63 68 20 53 51 4c 20 6f 70 65 72  ze each SQL oper
d460: 61 74 69 6f 6e 20 61 73 20 69 74 20 69 73 0a 20  ation as it is. 
d470: 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 2e 20 20 35   ** compiled.  5
d480: 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 61   arguments are a
d490: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 63  ppended to the c
d4a0: 61 6c 6c 62 61 63 6b 20 62 65 66 6f 72 65 20 69  allback before i
d4b0: 74 20 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6b 65  t is.  ** invoke
d4c0: 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28  d:.  **.  **   (
d4d0: 31 29 20 54 68 65 20 61 75 74 68 6f 72 69 7a 61  1) The authoriza
d4e0: 74 69 6f 6e 20 74 79 70 65 20 28 65 78 3a 20 53  tion type (ex: S
d4f0: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42  QLITE_CREATE_TAB
d500: 4c 45 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52  LE, SQLITE_INSER
d510: 54 2c 20 2e 2e 2e 29 0a 20 20 2a 2a 20 20 20 28  T, ...).  **   (
d520: 32 29 20 46 69 72 73 74 20 64 65 73 63 72 69 70  2) First descrip
d530: 74 69 76 65 20 6e 61 6d 65 20 28 64 65 70 65 6e  tive name (depen
d540: 64 73 20 6f 6e 20 61 75 74 68 6f 72 69 7a 61 74  ds on authorizat
d550: 69 6f 6e 20 74 79 70 65 29 0a 20 20 2a 2a 20 20  ion type).  **  
d560: 20 28 33 29 20 53 65 63 6f 6e 64 20 64 65 73 63   (3) Second desc
d570: 72 69 70 74 69 76 65 20 6e 61 6d 65 0a 20 20 2a  riptive name.  *
d580: 2a 20 20 20 28 34 29 20 4e 61 6d 65 20 6f 66 20  *   (4) Name of 
d590: 74 68 65 20 64 61 74 61 62 61 73 65 20 28 65 78  the database (ex
d5a0: 3a 20 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22  : "main", "temp"
d5b0: 29 0a 20 20 2a 2a 20 20 20 28 35 29 20 4e 61 6d  ).  **   (5) Nam
d5c0: 65 20 6f 66 20 74 72 69 67 67 65 72 20 74 68 61  e of trigger tha
d5d0: 74 20 69 73 20 64 6f 69 6e 67 20 74 68 65 20 61  t is doing the a
d5e0: 63 63 65 73 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ccess.  **.  ** 
d5f0: 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 73 68 6f  The callback sho
d600: 75 6c 64 20 72 65 74 75 72 6e 20 6f 6e 20 6f 66  uld return on of
d610: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
d620: 74 72 69 6e 67 73 3a 20 53 51 4c 49 54 45 5f 4f  trings: SQLITE_O
d630: 4b 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 49  K,.  ** SQLITE_I
d640: 47 4e 4f 52 45 2c 20 6f 72 20 53 51 4c 49 54 45  GNORE, or SQLITE
d650: 5f 44 45 4e 59 2e 20 20 41 6e 79 20 6f 74 68 65  _DENY.  Any othe
d660: 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  r return value i
d670: 73 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2a  s an error..  **
d680: 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 6d 65  .  ** If this me
d690: 74 68 6f 64 20 69 73 20 69 6e 76 6f 6b 65 64 20  thod is invoked 
d6a0: 77 69 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74  with no argument
d6b0: 73 2c 20 74 68 65 20 63 75 72 72 65 6e 74 20 61  s, the current a
d6c0: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 0a 20 20 2a  uthorization.  *
d6d0: 2a 20 63 61 6c 6c 62 61 63 6b 20 73 74 72 69 6e  * callback strin
d6e0: 67 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 20  g is returned.. 
d6f0: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 41 55   */.  case DB_AU
d700: 54 48 4f 52 49 5a 45 52 3a 20 7b 0a 23 69 66 64  THORIZER: {.#ifd
d710: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
d720: 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20  UTHORIZATION.   
d730: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
d740: 74 28 69 6e 74 65 72 70 2c 20 22 61 75 74 68 6f  t(interp, "autho
d750: 72 69 7a 61 74 69 6f 6e 20 6e 6f 74 20 61 76 61  rization not ava
d760: 69 6c 61 62 6c 65 20 69 6e 20 74 68 69 73 20 62  ilable in this b
d770: 75 69 6c 64 22 2c 20 30 29 3b 0a 20 20 20 20 72  uild", 0);.    r
d780: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
d790: 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 6f  .#else.    if( o
d7a0: 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54  bjc>3 ){.      T
d7b0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
d7c0: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
d7d0: 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a   "?CALLBACK?");.
d7e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
d7f0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73  _ERROR;.    }els
d800: 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b  e if( objc==2 ){
d810: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
d820: 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 20 20 20  zAuth ){.       
d830: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
d840: 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a  t(interp, pDb->z
d850: 41 75 74 68 2c 20 30 29 3b 0a 20 20 20 20 20 20  Auth, 0);.      
d860: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
d870: 20 20 20 63 68 61 72 20 2a 7a 41 75 74 68 3b 0a     char *zAuth;.
d880: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20        int len;. 
d890: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 41       if( pDb->zA
d8a0: 75 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 54  uth ){.        T
d8b0: 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 41 75  cl_Free(pDb->zAu
d8c0: 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  th);.      }.   
d8d0: 20 20 20 7a 41 75 74 68 20 3d 20 54 63 6c 5f 47     zAuth = Tcl_G
d8e0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
d8f0: 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a  objv[2], &len);.
d900: 20 20 20 20 20 20 69 66 28 20 7a 41 75 74 68 20        if( zAuth 
d910: 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20  && len>0 ){.    
d920: 20 20 20 20 70 44 62 2d 3e 7a 41 75 74 68 20 3d      pDb->zAuth =
d930: 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20   Tcl_Alloc( len 
d940: 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d  + 1 );.        m
d950: 65 6d 63 70 79 28 70 44 62 2d 3e 7a 41 75 74 68  emcpy(pDb->zAuth
d960: 2c 20 7a 41 75 74 68 2c 20 6c 65 6e 2b 31 29 3b  , zAuth, len+1);
d970: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
d980: 20 20 20 20 20 20 70 44 62 2d 3e 7a 41 75 74 68        pDb->zAuth
d990: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
d9a0: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75      if( pDb->zAu
d9b0: 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  th ){.        pD
d9c0: 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65  b->interp = inte
d9d0: 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  rp;.        sqli
d9e0: 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a  te3_set_authoriz
d9f0: 65 72 28 70 44 62 2d 3e 64 62 2c 20 61 75 74 68  er(pDb->db, auth
da00: 5f 63 61 6c 6c 62 61 63 6b 2c 20 70 44 62 29 3b  _callback, pDb);
da10: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
da20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65        sqlite3_se
da30: 74 5f 61 75 74 68 6f 72 69 7a 65 72 28 70 44 62  t_authorizer(pDb
da40: 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ->db, 0, 0);.   
da50: 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
da60: 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  f.    break;.  }
da70: 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 62 61  ..  /*    $db ba
da80: 63 6b 75 70 20 3f 44 41 54 41 42 41 53 45 3f 20  ckup ?DATABASE? 
da90: 46 49 4c 45 4e 41 4d 45 0a 20 20 2a 2a 0a 20 20  FILENAME.  **.  
daa0: 2a 2a 20 4f 70 65 6e 20 6f 72 20 63 72 65 61 74  ** Open or creat
dab0: 65 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  e a database fil
dac0: 65 20 6e 61 6d 65 64 20 46 49 4c 45 4e 41 4d 45  e named FILENAME
dad0: 2e 20 20 54 72 61 6e 73 66 65 72 20 74 68 65 0a  .  Transfer the.
dae0: 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20    ** content of 
daf0: 6c 6f 63 61 6c 20 64 61 74 61 62 61 73 65 20 44  local database D
db00: 41 54 41 42 41 53 45 20 28 64 65 66 61 75 6c 74  ATABASE (default
db10: 3a 20 22 6d 61 69 6e 22 29 20 69 6e 74 6f 20 74  : "main") into t
db20: 68 65 0a 20 20 2a 2a 20 46 49 4c 45 4e 41 4d 45  he.  ** FILENAME
db30: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
db40: 20 20 63 61 73 65 20 44 42 5f 42 41 43 4b 55 50    case DB_BACKUP
db50: 3a 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  : {.    const ch
db60: 61 72 20 2a 7a 44 65 73 74 46 69 6c 65 3b 0a 20  ar *zDestFile;. 
db70: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
db80: 53 72 63 44 62 3b 0a 20 20 20 20 73 71 6c 69 74  SrcDb;.    sqlit
db90: 65 33 20 2a 70 44 65 73 74 3b 0a 20 20 20 20 73  e3 *pDest;.    s
dba0: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 70  qlite3_backup *p
dbb0: 42 61 63 6b 75 70 3b 0a 0a 20 20 20 20 69 66 28  Backup;..    if(
dbc0: 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20   objc==3 ){.    
dbd0: 20 20 7a 53 72 63 44 62 20 3d 20 22 6d 61 69 6e    zSrcDb = "main
dbe0: 22 3b 0a 20 20 20 20 20 20 7a 44 65 73 74 46 69  ";.      zDestFi
dbf0: 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  le = Tcl_GetStri
dc00: 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20  ng(objv[2]);.   
dc10: 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d   }else if( objc=
dc20: 3d 34 20 29 7b 0a 20 20 20 20 20 20 7a 53 72 63  =4 ){.      zSrc
dc30: 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  Db = Tcl_GetStri
dc40: 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20  ng(objv[2]);.   
dc50: 20 20 20 7a 44 65 73 74 46 69 6c 65 20 3d 20 54     zDestFile = T
dc60: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
dc70: 76 5b 33 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  v[3]);.    }else
dc80: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
dc90: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
dca0: 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 44 41 54 41   2, objv, "?DATA
dcb0: 42 41 53 45 3f 20 46 49 4c 45 4e 41 4d 45 22 29  BASE? FILENAME")
dcc0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
dcd0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
dce0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
dcf0: 5f 6f 70 65 6e 28 7a 44 65 73 74 46 69 6c 65 2c  _open(zDestFile,
dd00: 20 26 70 44 65 73 74 29 3b 0a 20 20 20 20 69 66   &pDest);.    if
dd10: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
dd20: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
dd30: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
dd40: 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74  , "cannot open t
dd50: 61 72 67 65 74 20 64 61 74 61 62 61 73 65 3a 20  arget database: 
dd60: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71  ",.           sq
dd70: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 65  lite3_errmsg(pDe
dd80: 73 74 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  st), (char*)0);.
dd90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c        sqlite3_cl
dda0: 6f 73 65 28 70 44 65 73 74 29 3b 0a 20 20 20 20  ose(pDest);.    
ddb0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
ddc0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  OR;.    }.    pB
ddd0: 61 63 6b 75 70 20 3d 20 73 71 6c 69 74 65 33 5f  ackup = sqlite3_
dde0: 62 61 63 6b 75 70 5f 69 6e 69 74 28 70 44 65 73  backup_init(pDes
ddf0: 74 2c 20 22 6d 61 69 6e 22 2c 20 70 44 62 2d 3e  t, "main", pDb->
de00: 64 62 2c 20 7a 53 72 63 44 62 29 3b 0a 20 20 20  db, zSrcDb);.   
de10: 20 69 66 28 20 70 42 61 63 6b 75 70 3d 3d 30 20   if( pBackup==0 
de20: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
de30: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
de40: 2c 20 22 62 61 63 6b 75 70 20 66 61 69 6c 65 64  , "backup failed
de50: 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  : ",.           
de60: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
de70: 44 65 73 74 29 2c 20 28 63 68 61 72 2a 29 30 29  Dest), (char*)0)
de80: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
de90: 63 6c 6f 73 65 28 70 44 65 73 74 29 3b 0a 20 20  close(pDest);.  
dea0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
deb0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
dec0: 77 68 69 6c 65 28 20 20 28 72 63 20 3d 20 73 71  while(  (rc = sq
ded0: 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 73 74 65  lite3_backup_ste
dee0: 70 28 70 42 61 63 6b 75 70 2c 31 30 30 29 29 3d  p(pBackup,100))=
def0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 7d 0a 20  =SQLITE_OK ){}. 
df00: 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75     sqlite3_backu
df10: 70 5f 66 69 6e 69 73 68 28 70 42 61 63 6b 75 70  p_finish(pBackup
df20: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
df30: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
df40: 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b      rc = TCL_OK;
df50: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
df60: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
df70: 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 63 6b  lt(interp, "back
df80: 75 70 20 66 61 69 6c 65 64 3a 20 22 2c 0a 20 20  up failed: ",.  
df90: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
dfa0: 5f 65 72 72 6d 73 67 28 70 44 65 73 74 29 2c 20  _errmsg(pDest), 
dfb0: 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
dfc0: 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b   rc = TCL_ERROR;
dfd0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
dfe0: 65 33 5f 63 6c 6f 73 65 28 70 44 65 73 74 29 3b  e3_close(pDest);
dff0: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
e000: 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 62 75 73  .  /*    $db bus
e010: 79 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a  y ?CALLBACK?.  *
e020: 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  *.  ** Invoke th
e030: 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b  e given callback
e040: 20 69 66 20 61 6e 20 53 51 4c 20 73 74 61 74 65   if an SQL state
e050: 6d 65 6e 74 20 61 74 74 65 6d 70 74 73 20 74 6f  ment attempts to
e060: 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 6c 6f 63   open.  ** a loc
e070: 6b 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  ked database fil
e080: 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  e..  */.  case D
e090: 42 5f 42 55 53 59 3a 20 7b 0a 20 20 20 20 69 66  B_BUSY: {.    if
e0a0: 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20  ( objc>3 ){.    
e0b0: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
e0c0: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
e0d0: 6a 76 2c 20 22 43 41 4c 4c 42 41 43 4b 22 29 3b  jv, "CALLBACK");
e0e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
e0f0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c  L_ERROR;.    }el
e100: 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29  se if( objc==2 )
e110: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  {.      if( pDb-
e120: 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 20 20  >zBusy ){.      
e130: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
e140: 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e  lt(interp, pDb->
e150: 7a 42 75 73 79 2c 20 30 29 3b 0a 20 20 20 20 20  zBusy, 0);.     
e160: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
e170: 20 20 20 20 63 68 61 72 20 2a 7a 42 75 73 79 3b      char *zBusy;
e180: 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  .      int len;.
e190: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
e1a0: 42 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Busy ){.        
e1b0: 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 42  Tcl_Free(pDb->zB
e1c0: 75 73 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  usy);.      }.  
e1d0: 20 20 20 20 7a 42 75 73 79 20 3d 20 54 63 6c 5f      zBusy = Tcl_
e1e0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
e1f0: 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b  (objv[2], &len);
e200: 0a 20 20 20 20 20 20 69 66 28 20 7a 42 75 73 79  .      if( zBusy
e210: 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20   && len>0 ){.   
e220: 20 20 20 20 20 70 44 62 2d 3e 7a 42 75 73 79 20       pDb->zBusy 
e230: 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e  = Tcl_Alloc( len
e240: 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20   + 1 );.        
e250: 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 42 75 73  memcpy(pDb->zBus
e260: 79 2c 20 7a 42 75 73 79 2c 20 6c 65 6e 2b 31 29  y, zBusy, len+1)
e270: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
e280: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 42 75 73         pDb->zBus
e290: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  y = 0;.      }. 
e2a0: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 42       if( pDb->zB
e2b0: 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70  usy ){.        p
e2c0: 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74  Db->interp = int
e2d0: 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  erp;.        sql
e2e0: 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65  ite3_busy_handle
e2f0: 72 28 70 44 62 2d 3e 64 62 2c 20 44 62 42 75 73  r(pDb->db, DbBus
e300: 79 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a  yHandler, pDb);.
e310: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e320: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73       sqlite3_bus
e330: 79 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64  y_handler(pDb->d
e340: 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  b, 0, 0);.      
e350: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  }.    }.    brea
e360: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
e370: 20 24 64 62 20 63 61 63 68 65 20 66 6c 75 73 68   $db cache flush
e380: 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63 61  .  **     $db ca
e390: 63 68 65 20 73 69 7a 65 20 6e 0a 20 20 2a 2a 0a  che size n.  **.
e3a0: 20 20 2a 2a 20 46 6c 75 73 68 20 74 68 65 20 70    ** Flush the p
e3b0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
e3c0: 74 20 63 61 63 68 65 2c 20 6f 72 20 73 65 74 20  t cache, or set 
e3d0: 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
e3e0: 65 72 20 6f 66 0a 20 20 2a 2a 20 63 61 63 68 65  er of.  ** cache
e3f0: 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20  d statements..  
e400: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 41 43  */.  case DB_CAC
e410: 48 45 3a 20 7b 0a 20 20 20 20 63 68 61 72 20 2a  HE: {.    char *
e420: 73 75 62 43 6d 64 3b 0a 20 20 20 20 69 6e 74 20  subCmd;.    int 
e430: 6e 3b 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  n;..    if( objc
e440: 3c 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  <=2 ){.      Tcl
e450: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
e460: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
e470: 63 61 63 68 65 20 6f 70 74 69 6f 6e 20 3f 61 72  cache option ?ar
e480: 67 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  g?");.      retu
e490: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
e4a0: 20 20 7d 0a 20 20 20 20 73 75 62 43 6d 64 20 3d    }.    subCmd =
e4b0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
e4c0: 6f 6d 4f 62 6a 28 20 6f 62 6a 76 5b 32 5d 2c 20  omObj( objv[2], 
e4d0: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 2a 73 75  0 );.    if( *su
e4e0: 62 43 6d 64 3d 3d 27 66 27 20 26 26 20 73 74 72  bCmd=='f' && str
e4f0: 63 6d 70 28 73 75 62 43 6d 64 2c 22 66 6c 75 73  cmp(subCmd,"flus
e500: 68 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  h")==0 ){.      
e510: 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
e520: 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67         Tcl_Wrong
e530: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
e540: 32 2c 20 6f 62 6a 76 2c 20 22 66 6c 75 73 68 22  2, objv, "flush"
e550: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
e560: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
e570: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e580: 20 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65    flushStmtCache
e590: 28 20 70 44 62 20 29 3b 0a 20 20 20 20 20 20 7d  ( pDb );.      }
e5a0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 2a  .    }else if( *
e5b0: 73 75 62 43 6d 64 3d 3d 27 73 27 20 26 26 20 73  subCmd=='s' && s
e5c0: 74 72 63 6d 70 28 73 75 62 43 6d 64 2c 22 73 69  trcmp(subCmd,"si
e5d0: 7a 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ze")==0 ){.     
e5e0: 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a   if( objc!=4 ){.
e5f0: 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e          Tcl_Wron
e600: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
e610: 20 32 2c 20 6f 62 6a 76 2c 20 22 73 69 7a 65 20   2, objv, "size 
e620: 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  n");.        ret
e630: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
e640: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
e650: 20 20 20 20 69 66 28 20 54 43 4c 5f 45 52 52 4f      if( TCL_ERRO
e660: 52 3d 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  R==Tcl_GetIntFro
e670: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
e680: 76 5b 33 5d 2c 20 26 6e 29 20 29 7b 0a 20 20 20  v[3], &n) ){.   
e690: 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
e6a0: 64 52 65 73 75 6c 74 28 20 69 6e 74 65 72 70 2c  dResult( interp,
e6b0: 20 22 63 61 6e 6e 6f 74 20 63 6f 6e 76 65 72 74   "cannot convert
e6c0: 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 20 20   \"", .         
e6d0: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
e6e0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
e6f0: 33 5d 2c 30 29 2c 20 22 5c 22 20 74 6f 20 69 6e  3],0), "\" to in
e700: 74 65 67 65 72 22 2c 20 30 29 3b 0a 20 20 20 20  teger", 0);.    
e710: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
e720: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
e730: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
e740: 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20   if( n<0 ){.    
e750: 20 20 20 20 20 20 20 20 66 6c 75 73 68 53 74 6d          flushStm
e760: 74 43 61 63 68 65 28 20 70 44 62 20 29 3b 0a 20  tCache( pDb );. 
e770: 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 30             n = 0
e780: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
e790: 65 20 69 66 28 20 6e 3e 4d 41 58 5f 50 52 45 50  e if( n>MAX_PREP
e7a0: 41 52 45 44 5f 53 54 4d 54 53 20 29 7b 0a 20 20  ARED_STMTS ){.  
e7b0: 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 4d 41            n = MA
e7c0: 58 5f 50 52 45 50 41 52 45 44 5f 53 54 4d 54 53  X_PREPARED_STMTS
e7d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
e7e0: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 6d 61 78          pDb->max
e7f0: 53 74 6d 74 20 3d 20 6e 3b 0a 20 20 20 20 20 20  Stmt = n;.      
e800: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
e810: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c  }else{.      Tcl
e820: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 20 69  _AppendResult( i
e830: 6e 74 65 72 70 2c 20 22 62 61 64 20 6f 70 74 69  nterp, "bad opti
e840: 6f 6e 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  on \"", .       
e850: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
e860: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
e870: 30 29 2c 20 22 5c 22 3a 20 6d 75 73 74 20 62 65  0), "\": must be
e880: 20 66 6c 75 73 68 20 6f 72 20 73 69 7a 65 22 2c   flush or size",
e890: 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   0);.      retur
e8a0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
e8b0: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
e8c0: 7d 0a 0a 20 20 2f 2a 20 20 20 20 20 24 64 62 20  }..  /*     $db 
e8d0: 63 68 61 6e 67 65 73 0a 20 20 2a 2a 0a 20 20 2a  changes.  **.  *
e8e0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
e8f0: 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
e900: 20 77 65 72 65 20 6d 6f 64 69 66 69 65 64 2c 20   were modified, 
e910: 69 6e 73 65 72 74 65 64 2c 20 6f 72 20 64 65 6c  inserted, or del
e920: 65 74 65 64 20 62 79 0a 20 20 2a 2a 20 74 68 65  eted by.  ** the
e930: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 49 4e 53   most recent INS
e940: 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44  ERT, UPDATE or D
e950: 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c  ELETE statement,
e960: 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67 20 0a   not including .
e970: 20 20 2a 2a 20 61 6e 79 20 63 68 61 6e 67 65 73    ** any changes
e980: 20 6d 61 64 65 20 62 79 20 74 72 69 67 67 65 72   made by trigger
e990: 20 70 72 6f 67 72 61 6d 73 2e 0a 20 20 2a 2f 0a   programs..  */.
e9a0: 20 20 63 61 73 65 20 44 42 5f 43 48 41 4e 47 45    case DB_CHANGE
e9b0: 53 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  S: {.    Tcl_Obj
e9c0: 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 69   *pResult;.    i
e9d0: 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
e9e0: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
e9f0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
ea00: 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 20  objv, "");.     
ea10: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
ea20: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 52 65  R;.    }.    pRe
ea30: 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62  sult = Tcl_GetOb
ea40: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  jResult(interp);
ea50: 0a 20 20 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f  .    Tcl_SetIntO
ea60: 62 6a 28 70 52 65 73 75 6c 74 2c 20 73 71 6c 69  bj(pResult, sqli
ea70: 74 65 33 5f 63 68 61 6e 67 65 73 28 70 44 62 2d  te3_changes(pDb-
ea80: 3e 64 62 29 29 3b 0a 20 20 20 20 62 72 65 61 6b  >db));.    break
ea90: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24  ;.  }..  /*    $
eaa0: 64 62 20 63 6c 6f 73 65 0a 20 20 2a 2a 0a 20 20  db close.  **.  
eab0: 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20  ** Shutdown the 
eac0: 64 61 74 61 62 61 73 65 0a 20 20 2a 2f 0a 20 20  database.  */.  
ead0: 63 61 73 65 20 44 42 5f 43 4c 4f 53 45 3a 20 7b  case DB_CLOSE: {
eae0: 0a 20 20 20 20 54 63 6c 5f 44 65 6c 65 74 65 43  .    Tcl_DeleteC
eaf0: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 54  ommand(interp, T
eb00: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
eb10: 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 29  Obj(objv[0], 0))
eb20: 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
eb30: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  /*.  **     
eb40: 24 64 62 20 63 6f 6c 6c 61 74 65 20 4e 41 4d 45  $db collate NAME
eb50: 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a   SCRIPT.  **.  *
eb60: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53  * Create a new S
eb70: 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e  QL collation fun
eb80: 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d  ction called NAM
eb90: 45 2e 20 20 57 68 65 6e 65 76 65 72 0a 20 20 2a  E.  Whenever.  *
eba0: 2a 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20  * that function 
ebb0: 69 73 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b  is called, invok
ebc0: 65 20 53 43 52 49 50 54 20 74 6f 20 65 76 61 6c  e SCRIPT to eval
ebd0: 75 61 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f  uate the functio
ebe0: 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  n..  */.  case D
ebf0: 42 5f 43 4f 4c 4c 41 54 45 3a 20 7b 0a 20 20 20  B_COLLATE: {.   
ec00: 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43 6f   SqlCollate *pCo
ec10: 6c 6c 61 74 65 3b 0a 20 20 20 20 63 68 61 72 20  llate;.    char 
ec20: 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 68 61 72  *zName;.    char
ec30: 20 2a 7a 53 63 72 69 70 74 3b 0a 20 20 20 20 69   *zScript;.    i
ec40: 6e 74 20 6e 53 63 72 69 70 74 3b 0a 20 20 20 20  nt nScript;.    
ec50: 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
ec60: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
ec70: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
ec80: 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20 53 43 52   objv, "NAME SCR
ec90: 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74  IPT");.      ret
eca0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
ecb0: 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d     }.    zName =
ecc0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
ecd0: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30  omObj(objv[2], 0
ece0: 29 3b 0a 20 20 20 20 7a 53 63 72 69 70 74 20 3d  );.    zScript =
ecf0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
ed00: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26  omObj(objv[3], &
ed10: 6e 53 63 72 69 70 74 29 3b 0a 20 20 20 20 70 43  nScript);.    pC
ed20: 6f 6c 6c 61 74 65 20 3d 20 28 53 71 6c 43 6f 6c  ollate = (SqlCol
ed30: 6c 61 74 65 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28  late*)Tcl_Alloc(
ed40: 20 73 69 7a 65 6f 66 28 2a 70 43 6f 6c 6c 61 74   sizeof(*pCollat
ed50: 65 29 20 2b 20 6e 53 63 72 69 70 74 20 2b 20 31  e) + nScript + 1
ed60: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c   );.    if( pCol
ed70: 6c 61 74 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  late==0 ) return
ed80: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
ed90: 70 43 6f 6c 6c 61 74 65 2d 3e 69 6e 74 65 72 70  pCollate->interp
eda0: 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 70   = interp;.    p
edb0: 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78 74 20 3d  Collate->pNext =
edc0: 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 3b 0a   pDb->pCollate;.
edd0: 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 7a 53      pCollate->zS
ede0: 63 72 69 70 74 20 3d 20 28 63 68 61 72 2a 29 26  cript = (char*)&
edf0: 70 43 6f 6c 6c 61 74 65 5b 31 5d 3b 0a 20 20 20  pCollate[1];.   
ee00: 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20 3d   pDb->pCollate =
ee10: 20 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 6d   pCollate;.    m
ee20: 65 6d 63 70 79 28 70 43 6f 6c 6c 61 74 65 2d 3e  emcpy(pCollate->
ee30: 7a 53 63 72 69 70 74 2c 20 7a 53 63 72 69 70 74  zScript, zScript
ee40: 2c 20 6e 53 63 72 69 70 74 2b 31 29 3b 0a 20 20  , nScript+1);.  
ee50: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 72    if( sqlite3_cr
ee60: 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 70  eate_collation(p
ee70: 44 62 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 53  Db->db, zName, S
ee80: 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20 20 20  QLITE_UTF8, .   
ee90: 20 20 20 20 20 70 43 6f 6c 6c 61 74 65 2c 20 74       pCollate, t
eea0: 63 6c 53 71 6c 43 6f 6c 6c 61 74 65 29 20 29 7b  clSqlCollate) ){
eeb0: 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65  .      Tcl_SetRe
eec0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
eed0: 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72  ar *)sqlite3_err
eee0: 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 54 43  msg(pDb->db), TC
eef0: 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20  L_VOLATILE);.   
ef00: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
ef10: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  ROR;.    }.    b
ef20: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
ef30: 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63 6f 6c    **     $db col
ef40: 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 20 53 43  lation_needed SC
ef50: 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43  RIPT.  **.  ** C
ef60: 72 65 61 74 65 20 61 20 6e 65 77 20 53 51 4c 20  reate a new SQL 
ef70: 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69  collation functi
ef80: 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20  on called NAME. 
ef90: 20 57 68 65 6e 65 76 65 72 0a 20 20 2a 2a 20 74   Whenever.  ** t
efa0: 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  hat function is 
efb0: 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53  called, invoke S
efc0: 43 52 49 50 54 20 74 6f 20 65 76 61 6c 75 61 74  CRIPT to evaluat
efd0: 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a  e the function..
efe0: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43    */.  case DB_C
eff0: 4f 4c 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 3a  OLLATION_NEEDED:
f000: 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21   {.    if( objc!
f010: 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =3 ){.      Tcl_
f020: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
f030: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53  erp, 2, objv, "S
f040: 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72  CRIPT");.      r
f050: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
f060: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
f070: 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64  Db->pCollateNeed
f080: 65 64 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  ed ){.      Tcl_
f090: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62  DecrRefCount(pDb
f0a0: 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64  ->pCollateNeeded
f0b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 62  );.    }.    pDb
f0c0: 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64  ->pCollateNeeded
f0d0: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
f0e0: 4f 62 6a 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  Obj(objv[2]);.  
f0f0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
f100: 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65  nt(pDb->pCollate
f110: 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 73 71 6c  Needed);.    sql
f120: 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e  ite3_collation_n
f130: 65 65 64 65 64 28 70 44 62 2d 3e 64 62 2c 20 70  eeded(pDb->db, p
f140: 44 62 2c 20 74 63 6c 43 6f 6c 6c 61 74 65 4e 65  Db, tclCollateNe
f150: 65 64 65 64 29 3b 0a 20 20 20 20 62 72 65 61 6b  eded);.    break
f160: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24  ;.  }..  /*    $
f170: 64 62 20 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 20 3f  db commit_hook ?
f180: 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20  CALLBACK?.  **. 
f190: 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67   ** Invoke the g
f1a0: 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 6a 75  iven callback ju
f1b0: 73 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74  st before commit
f1c0: 74 69 6e 67 20 65 76 65 72 79 20 53 51 4c 20 74  ting every SQL t
f1d0: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a  ransaction..  **
f1e0: 20 49 66 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   If the callback
f1f0: 20 74 68 72 6f 77 73 20 61 6e 20 65 78 63 65 70   throws an excep
f200: 74 69 6f 6e 20 6f 72 20 72 65 74 75 72 6e 73 20  tion or returns 
f210: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74  non-zero, then t
f220: 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  he.  ** transact
f230: 69 6f 6e 20 69 73 20 61 62 6f 72 74 65 64 2e 20  ion is aborted. 
f240: 20 49 66 20 43 41 4c 4c 42 41 43 4b 20 69 73 20   If CALLBACK is 
f250: 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c  an empty string,
f260: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 0a 20 20   the callback.  
f270: 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e 0a  ** is disabled..
f280: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43    */.  case DB_C
f290: 4f 4d 4d 49 54 5f 48 4f 4f 4b 3a 20 7b 0a 20 20  OMMIT_HOOK: {.  
f2a0: 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a    if( objc>3 ){.
f2b0: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
f2c0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
f2d0: 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41  , objv, "?CALLBA
f2e0: 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74  CK?");.      ret
f2f0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
f300: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a     }else if( obj
f310: 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66  c==2 ){.      if
f320: 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29  ( pDb->zCommit )
f330: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  {.        Tcl_Ap
f340: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
f350: 70 2c 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 2c  p, pDb->zCommit,
f360: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
f370: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
f380: 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 0a 20 20 20  ar *zCommit;.   
f390: 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
f3a0: 20 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d    if( pDb->zComm
f3b0: 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  it ){.        Tc
f3c0: 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 43 6f 6d  l_Free(pDb->zCom
f3d0: 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mit);.      }.  
f3e0: 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 54 63      zCommit = Tc
f3f0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
f400: 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e  bj(objv[2], &len
f410: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6f  );.      if( zCo
f420: 6d 6d 69 74 20 26 26 20 6c 65 6e 3e 30 20 29 7b  mmit && len>0 ){
f430: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 43  .        pDb->zC
f440: 6f 6d 6d 69 74 20 3d 20 54 63 6c 5f 41 6c 6c 6f  ommit = Tcl_Allo
f450: 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20  c( len + 1 );.  
f460: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62        memcpy(pDb
f470: 2d 3e 7a 43 6f 6d 6d 69 74 2c 20 7a 43 6f 6d 6d  ->zCommit, zComm
f480: 69 74 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20  it, len+1);.    
f490: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f4a0: 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20   pDb->zCommit = 
f4b0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
f4c0: 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69   if( pDb->zCommi
f4d0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  t ){.        pDb
f4e0: 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  ->interp = inter
f4f0: 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  p;.        sqlit
f500: 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 70  e3_commit_hook(p
f510: 44 62 2d 3e 64 62 2c 20 44 62 43 6f 6d 6d 69 74  Db->db, DbCommit
f520: 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20  Handler, pDb);. 
f530: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f540: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d      sqlite3_comm
f550: 69 74 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c  it_hook(pDb->db,
f560: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
f570: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
f580: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
f590: 62 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c 0a 20  b complete SQL. 
f5a0: 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
f5b0: 54 52 55 45 20 69 66 20 53 51 4c 20 69 73 20 61  TRUE if SQL is a
f5c0: 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c 20 73 74   complete SQL st
f5d0: 61 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e  atement.  Return
f5e0: 20 46 41 4c 53 45 20 69 66 0a 20 20 2a 2a 20 61   FALSE if.  ** a
f5f0: 64 64 69 74 69 6f 6e 61 6c 20 6c 69 6e 65 73 20  dditional lines 
f600: 6f 66 20 69 6e 70 75 74 20 61 72 65 20 6e 65 65  of input are nee
f610: 64 65 64 2e 20 20 54 68 69 73 20 69 73 20 73 69  ded.  This is si
f620: 6d 69 6c 61 72 20 74 6f 20 74 68 65 0a 20 20 2a  milar to the.  *
f630: 2a 20 62 75 69 6c 74 2d 69 6e 20 22 69 6e 66 6f  * built-in "info
f640: 20 63 6f 6d 70 6c 65 74 65 22 20 63 6f 6d 6d 61   complete" comma
f650: 6e 64 20 6f 66 20 54 63 6c 2e 0a 20 20 2a 2f 0a  nd of Tcl..  */.
f660: 20 20 63 61 73 65 20 44 42 5f 43 4f 4d 50 4c 45    case DB_COMPLE
f670: 54 45 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53 51  TE: {.#ifndef SQ
f680: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45  LITE_OMIT_COMPLE
f690: 54 45 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  TE.    Tcl_Obj *
f6a0: 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74  pResult;.    int
f6b0: 20 69 73 43 6f 6d 70 6c 65 74 65 3b 0a 20 20 20   isComplete;.   
f6c0: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
f6d0: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
f6e0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
f6f0: 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 22 29 3b 0a  , objv, "SQL");.
f700: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
f710: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
f720: 20 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 73    isComplete = s
f730: 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 28  qlite3_complete(
f740: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
f750: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30  omObj(objv[2], 0
f760: 29 20 29 3b 0a 20 20 20 20 70 52 65 73 75 6c 74  ) );.    pResult
f770: 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73   = Tcl_GetObjRes
f780: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  ult(interp);.   
f790: 20 54 63 6c 5f 53 65 74 42 6f 6f 6c 65 61 6e 4f   Tcl_SetBooleanO
f7a0: 62 6a 28 70 52 65 73 75 6c 74 2c 20 69 73 43 6f  bj(pResult, isCo
f7b0: 6d 70 6c 65 74 65 29 3b 0a 23 65 6e 64 69 66 0a  mplete);.#endif.
f7c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
f7d0: 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6f 70 79    /*    $db copy
f7e0: 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69   conflict-algori
f7f0: 74 68 6d 20 74 61 62 6c 65 20 66 69 6c 65 6e 61  thm table filena
f800: 6d 65 20 3f 53 45 50 41 52 41 54 4f 52 3f 20 3f  me ?SEPARATOR? ?
f810: 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f 0a 20  NULLINDICATOR?. 
f820: 20 2a 2a 0a 20 20 2a 2a 20 43 6f 70 79 20 64 61   **.  ** Copy da
f830: 74 61 20 69 6e 74 6f 20 74 61 62 6c 65 20 66 72  ta into table fr
f840: 6f 6d 20 66 69 6c 65 6e 61 6d 65 2c 20 6f 70 74  om filename, opt
f850: 69 6f 6e 61 6c 6c 79 20 75 73 69 6e 67 20 53 45  ionally using SE
f860: 50 41 52 41 54 4f 52 0a 20 20 2a 2a 20 61 73 20  PARATOR.  ** as 
f870: 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72  column separator
f880: 73 2e 20 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20  s.  If a column 
f890: 63 6f 6e 74 61 69 6e 73 20 61 20 6e 75 6c 6c 20  contains a null 
f8a0: 73 74 72 69 6e 67 2c 20 6f 72 20 74 68 65 0a 20  string, or the. 
f8b0: 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 4e 55 4c   ** value of NUL
f8c0: 4c 49 4e 44 49 43 41 54 4f 52 2c 20 61 20 4e 55  LINDICATOR, a NU
f8d0: 4c 4c 20 69 73 20 69 6e 73 65 72 74 65 64 20 66  LL is inserted f
f8e0: 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 20  or the column.. 
f8f0: 20 2a 2a 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67   ** conflict-alg
f900: 6f 72 69 74 68 6d 20 69 73 20 6f 6e 65 20 6f 66  orithm is one of
f910: 20 74 68 65 20 73 71 6c 69 74 65 20 63 6f 6e 66   the sqlite conf
f920: 6c 69 63 74 20 61 6c 67 6f 72 69 74 68 6d 73 3a  lict algorithms:
f930: 0a 20 20 2a 2a 20 20 20 20 72 6f 6c 6c 62 61 63  .  **    rollbac
f940: 6b 2c 20 61 62 6f 72 74 2c 20 66 61 69 6c 2c 20  k, abort, fail, 
f950: 69 67 6e 6f 72 65 2c 20 72 65 70 6c 61 63 65 0a  ignore, replace.
f960: 20 20 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c    ** On success,
f970: 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   return the numb
f980: 65 72 20 6f 66 20 6c 69 6e 65 73 20 70 72 6f 63  er of lines proc
f990: 65 73 73 65 64 2c 20 6e 6f 74 20 6e 65 63 65 73  essed, not neces
f9a0: 73 61 72 69 6c 79 20 73 61 6d 65 0a 20 20 2a 2a  sarily same.  **
f9b0: 20 61 73 20 27 64 62 20 63 68 61 6e 67 65 73 27   as 'db changes'
f9c0: 20 64 75 65 20 74 6f 20 63 6f 6e 66 6c 69 63 74   due to conflict
f9d0: 2d 61 6c 67 6f 72 69 74 68 6d 20 73 65 6c 65 63  -algorithm selec
f9e0: 74 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ted..  **.  ** T
f9f0: 68 69 73 20 63 6f 64 65 20 69 73 20 62 61 73 69  his code is basi
fa00: 63 61 6c 6c 79 20 61 6e 20 69 6d 70 6c 65 6d 65  cally an impleme
fa10: 6e 74 61 74 69 6f 6e 2f 65 6e 68 61 6e 63 65 6d  ntation/enhancem
fa20: 65 6e 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  ent of.  ** the 
fa30: 73 71 6c 69 74 65 33 20 73 68 65 6c 6c 2e 63 20  sqlite3 shell.c 
fa40: 22 2e 69 6d 70 6f 72 74 22 20 63 6f 6d 6d 61 6e  ".import" comman
fa50: 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  d..  **.  ** Thi
fa60: 73 20 63 6f 6d 6d 61 6e 64 20 75 73 61 67 65 20  s command usage 
fa70: 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
fa80: 20 74 68 65 20 73 71 6c 69 74 65 32 2e 78 20 43   the sqlite2.x C
fa90: 4f 50 59 20 73 74 61 74 65 6d 65 6e 74 2c 0a 20  OPY statement,. 
faa0: 20 2a 2a 20 77 68 69 63 68 20 69 6d 70 6f 72 74   ** which import
fab0: 73 20 66 69 6c 65 20 64 61 74 61 20 69 6e 74 6f  s file data into
fac0: 20 61 20 74 61 62 6c 65 20 75 73 69 6e 67 20 74   a table using t
fad0: 68 65 20 50 6f 73 74 67 72 65 53 51 4c 20 43 4f  he PostgreSQL CO
fae0: 50 59 20 66 69 6c 65 20 66 6f 72 6d 61 74 3a 0a  PY file format:.
faf0: 20 20 2a 2a 20 20 20 24 64 62 20 63 6f 70 79 20    **   $db copy 
fb00: 24 63 6f 6e 66 6c 69 74 5f 61 6c 67 6f 20 24 74  $conflit_algo $t
fb10: 61 62 6c 65 5f 6e 61 6d 65 20 24 66 69 6c 65 6e  able_name $filen
fb20: 61 6d 65 20 5c 74 20 5c 5c 4e 0a 20 20 2a 2f 0a  ame \t \\N.  */.
fb30: 20 20 63 61 73 65 20 44 42 5f 43 4f 50 59 3a 20    case DB_COPY: 
fb40: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62  {.    char *zTab
fb50: 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
fb60: 20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61 74 61    /* Insert data
fb70: 20 69 6e 74 6f 20 74 68 69 73 20 74 61 62 6c 65   into this table
fb80: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 46   */.    char *zF
fb90: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
fba0: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
fbb0: 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 65 78  from which to ex
fbc0: 74 72 61 63 74 20 64 61 74 61 20 2a 2f 0a 20 20  tract data */.  
fbd0: 20 20 63 68 61 72 20 2a 7a 43 6f 6e 66 6c 69 63    char *zConflic
fbe0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
fbf0: 20 54 68 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c   The conflict al
fc00: 67 6f 72 69 74 68 6d 20 74 6f 20 75 73 65 20 2a  gorithm to use *
fc10: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  /.    sqlite3_st
fc20: 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20  mt *pStmt;      
fc30: 20 20 2f 2a 20 41 20 73 74 61 74 65 6d 65 6e 74    /* A statement
fc40: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c   */.    int nCol
fc50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
fc60: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
fc70: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
fc80: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74  table */.    int
fc90: 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20   nByte;         
fca0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
fcb0: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61  er of bytes in a
fcc0: 6e 20 53 51 4c 20 73 74 72 69 6e 67 20 2a 2f 0a  n SQL string */.
fcd0: 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20      int i, j;   
fce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fcf0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
fd00: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 70   */.    int nSep
fd10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
fd20: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
fd30: 20 62 79 74 65 73 20 69 6e 20 7a 53 65 70 5b 5d   bytes in zSep[]
fd40: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4e 75 6c   */.    int nNul
fd50: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
fd60: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
fd70: 20 62 79 74 65 73 20 69 6e 20 7a 4e 75 6c 6c 5b   bytes in zNull[
fd80: 5d 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  ] */.    char *z
fd90: 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sql;            
fda0: 20 20 20 20 20 2f 2a 20 41 6e 20 53 51 4c 20 73       /* An SQL s
fdb0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
fdc0: 63 68 61 72 20 2a 7a 4c 69 6e 65 3b 20 20 20 20  char *zLine;    
fdd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
fde0: 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f 66 20   single line of 
fdf0: 69 6e 70 75 74 20 66 72 6f 6d 20 74 68 65 20 66  input from the f
fe00: 69 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  ile */.    char 
fe10: 2a 2a 61 7a 43 6f 6c 3b 20 20 20 20 20 20 20 20  **azCol;        
fe20: 20 20 20 20 20 20 20 2f 2a 20 7a 4c 69 6e 65 5b         /* zLine[
fe30: 5d 20 62 72 6f 6b 65 6e 20 75 70 20 69 6e 74 6f  ] broken up into
fe40: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20   columns */.    
fe50: 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 20 20  char *zCommit;  
fe60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
fe70: 6f 77 20 74 6f 20 63 6f 6d 6d 69 74 20 63 68 61  ow to commit cha
fe80: 6e 67 65 73 20 2a 2f 0a 20 20 20 20 46 49 4c 45  nges */.    FILE
fe90: 20 2a 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20   *in;           
fea0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
feb0: 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 20  nput file */.   
fec0: 20 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20 30 3b   int lineno = 0;
fed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fee0: 4c 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 69  Line number of i
fef0: 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 20  nput file */.   
ff00: 20 63 68 61 72 20 7a 4c 69 6e 65 4e 75 6d 5b 38   char zLineNum[8
ff10: 30 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0];          /* 
ff20: 4c 69 6e 65 20 6e 75 6d 62 65 72 20 70 72 69 6e  Line number prin
ff30: 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20  t buffer */.    
ff40: 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74  Tcl_Obj *pResult
ff50: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69  ;           /* i
ff60: 6e 74 65 72 70 20 72 65 73 75 6c 74 20 2a 2f 0a  nterp result */.
ff70: 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 65 70 3b  .    char *zSep;
ff80: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c  .    char *zNull
ff90: 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3c 35  ;.    if( objc<5
ffa0: 20 7c 7c 20 6f 62 6a 63 3e 37 20 29 7b 0a 20 20   || objc>7 ){.  
ffb0: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
ffc0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
ffd0: 6f 62 6a 76 2c 20 0a 20 20 20 20 20 20 20 20 20  objv, .         
ffe0: 22 43 4f 4e 46 4c 49 43 54 2d 41 4c 47 4f 52 49  "CONFLICT-ALGORI
fff0: 54 48 4d 20 54 41 42 4c 45 20 46 49 4c 45 4e 41  THM TABLE FILENA
10000 4d 45 20 3f 53 45 50 41 52 41 54 4f 52 3f 20 3f  ME ?SEPARATOR? ?
10010 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f 22 29  NULLINDICATOR?")
10020 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
10030 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
10040 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 3d 36 20      if( objc>=6 
10050 29 7b 0a 20 20 20 20 20 20 7a 53 65 70 20 3d 20  ){.      zSep = 
10060 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
10070 6d 4f 62 6a 28 6f 62 6a 76 5b 35 5d 2c 20 30 29  mObj(objv[5], 0)
10080 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
10090 20 20 20 7a 53 65 70 20 3d 20 22 5c 74 22 3b 0a     zSep = "\t";.
100a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62      }.    if( ob
100b0 6a 63 3e 3d 37 20 29 7b 0a 20 20 20 20 20 20 7a  jc>=7 ){.      z
100c0 4e 75 6c 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74  Null = Tcl_GetSt
100d0 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
100e0 5b 36 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  [6], 0);.    }el
100f0 73 65 7b 0a 20 20 20 20 20 20 7a 4e 75 6c 6c 20  se{.      zNull 
10100 3d 20 22 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = "";.    }.    
10110 7a 43 6f 6e 66 6c 69 63 74 20 3d 20 54 63 6c 5f  zConflict = Tcl_
10120 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
10130 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20  (objv[2], 0);.  
10140 20 20 7a 54 61 62 6c 65 20 3d 20 54 63 6c 5f 47    zTable = Tcl_G
10150 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
10160 6f 62 6a 76 5b 33 5d 2c 20 30 29 3b 0a 20 20 20  objv[3], 0);.   
10170 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74   zFile = Tcl_Get
10180 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
10190 6a 76 5b 34 5d 2c 20 30 29 3b 0a 20 20 20 20 6e  jv[4], 0);.    n
101a0 53 65 70 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a  Sep = strlen30(z
101b0 53 65 70 29 3b 0a 20 20 20 20 6e 4e 75 6c 6c 20  Sep);.    nNull 
101c0 3d 20 73 74 72 6c 65 6e 33 30 28 7a 4e 75 6c 6c  = strlen30(zNull
101d0 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 65 70 3d  );.    if( nSep=
101e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =0 ){.      Tcl_
101f0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
10200 65 72 70 2c 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d  erp,"Error: non-
10210 6e 75 6c 6c 20 73 65 70 61 72 61 74 6f 72 20 72  null separator r
10220 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 70 79  equired for copy
10230 22 2c 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ",0);.      retu
10240 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
10250 20 20 7d 0a 20 20 20 20 69 66 28 73 74 72 63 6d    }.    if(strcm
10260 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 72 6f  p(zConflict, "ro
10270 6c 6c 62 61 63 6b 22 29 20 21 3d 20 30 20 26 26  llback") != 0 &&
10280 0a 20 20 20 20 20 20 20 73 74 72 63 6d 70 28 7a  .       strcmp(z
10290 43 6f 6e 66 6c 69 63 74 2c 20 22 61 62 6f 72 74  Conflict, "abort
102a0 22 20 20 20 29 20 21 3d 20 30 20 26 26 0a 20 20  "   ) != 0 &&.  
102b0 20 20 20 20 20 73 74 72 63 6d 70 28 7a 43 6f 6e       strcmp(zCon
102c0 66 6c 69 63 74 2c 20 22 66 61 69 6c 22 20 20 20  flict, "fail"   
102d0 20 29 20 21 3d 20 30 20 26 26 0a 20 20 20 20 20   ) != 0 &&.     
102e0 20 20 73 74 72 63 6d 70 28 7a 43 6f 6e 66 6c 69    strcmp(zConfli
102f0 63 74 2c 20 22 69 67 6e 6f 72 65 22 20 20 29 20  ct, "ignore"  ) 
10300 21 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20 73  != 0 &&.       s
10310 74 72 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c  trcmp(zConflict,
10320 20 22 72 65 70 6c 61 63 65 22 20 29 20 21 3d 20   "replace" ) != 
10330 30 20 29 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f  0 ) {.      Tcl_
10340 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
10350 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 5c 22 22  erp, "Error: \""
10360 2c 20 7a 43 6f 6e 66 6c 69 63 74 2c 20 0a 20 20  , zConflict, .  
10370 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 63            "\", c
10380 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68  onflict-algorith
10390 6d 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66  m must be one of
103a0 3a 20 72 6f 6c 6c 62 61 63 6b 2c 20 22 0a 20 20  : rollback, ".  
103b0 20 20 20 20 20 20 20 20 20 20 22 61 62 6f 72 74            "abort
103c0 2c 20 66 61 69 6c 2c 20 69 67 6e 6f 72 65 2c 20  , fail, ignore, 
103d0 6f 72 20 72 65 70 6c 61 63 65 22 2c 20 30 29 3b  or replace", 0);
103e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
103f0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
10400 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
10410 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43  3_mprintf("SELEC
10420 54 20 2a 20 46 52 4f 4d 20 27 25 71 27 22 2c 20  T * FROM '%q'", 
10430 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 69 66 28  zTable);.    if(
10440 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   zSql==0 ){.    
10450 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
10460 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f  lt(interp, "Erro
10470 72 3a 20 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  r: no such table
10480 3a 20 22 2c 20 7a 54 61 62 6c 65 2c 20 30 29 3b  : ", zTable, 0);
10490 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
104a0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
104b0 20 20 20 6e 42 79 74 65 20 3d 20 73 74 72 6c 65     nByte = strle
104c0 6e 33 30 28 7a 53 71 6c 29 3b 0a 20 20 20 20 72  n30(zSql);.    r
104d0 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
104e0 61 72 65 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71  are(pDb->db, zSq
104f0 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30  l, -1, &pStmt, 0
10500 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
10510 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69  ree(zSql);.    i
10520 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54  f( rc ){.      T
10530 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
10540 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20  interp, "Error: 
10550 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
10560 67 28 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a  g(pDb->db), 0);.
10570 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a        nCol = 0;.
10580 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10590 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f   nCol = sqlite3_
105a0 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74  column_count(pSt
105b0 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  mt);.    }.    s
105c0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
105d0 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20  pStmt);.    if( 
105e0 6e 43 6f 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20  nCol==0 ) {.    
105f0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
10600 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53  OR;.    }.    zS
10610 71 6c 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79  ql = malloc( nBy
10620 74 65 20 2b 20 35 30 20 2b 20 6e 43 6f 6c 2a 32  te + 50 + nCol*2
10630 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c   );.    if( zSql
10640 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20 20 54 63  ==0 ) {.      Tc
10650 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
10660 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 63  nterp, "Error: c
10670 61 6e 27 74 20 6d 61 6c 6c 6f 63 28 29 22 2c 20  an't malloc()", 
10680 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
10690 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
106a0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  }.    sqlite3_sn
106b0 70 72 69 6e 74 66 28 6e 42 79 74 65 2b 35 30 2c  printf(nByte+50,
106c0 20 7a 53 71 6c 2c 20 22 49 4e 53 45 52 54 20 4f   zSql, "INSERT O
106d0 52 20 25 71 20 49 4e 54 4f 20 27 25 71 27 20 56  R %q INTO '%q' V
106e0 41 4c 55 45 53 28 3f 22 2c 0a 20 20 20 20 20 20  ALUES(?",.      
106f0 20 20 20 7a 43 6f 6e 66 6c 69 63 74 2c 20 7a 54     zConflict, zT
10700 61 62 6c 65 29 3b 0a 20 20 20 20 6a 20 3d 20 73  able);.    j = s
10710 74 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 20  trlen30(zSql);. 
10720 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 43     for(i=1; i<nC
10730 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
10740 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 2c 27 3b  zSql[j++] = ',';
10750 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d  .      zSql[j++]
10760 20 3d 20 27 3f 27 3b 0a 20 20 20 20 7d 0a 20 20   = '?';.    }.  
10770 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 29    zSql[j++] = ')
10780 27 3b 0a 20 20 20 20 7a 53 71 6c 5b 6a 5d 20 3d  ';.    zSql[j] =
10790 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   0;.    rc = sql
107a0 69 74 65 33 5f 70 72 65 70 61 72 65 28 70 44 62  ite3_prepare(pDb
107b0 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  ->db, zSql, -1, 
107c0 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  &pStmt, 0);.    
107d0 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20  free(zSql);.    
107e0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
107f0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
10800 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a  (interp, "Error:
10810 20 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d   ", sqlite3_errm
10820 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b  sg(pDb->db), 0);
10830 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
10840 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
10850 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
10860 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
10870 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 46 69    in = fopen(zFi
10880 6c 65 2c 20 22 72 62 22 29 3b 0a 20 20 20 20 69  le, "rb");.    i
10890 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  f( in==0 ){.    
108a0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
108b0 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f  lt(interp, "Erro
108c0 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66  r: cannot open f
108d0 69 6c 65 3a 20 22 2c 20 7a 46 69 6c 65 2c 20 4e  ile: ", zFile, N
108e0 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ULL);.      sqli
108f0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
10900 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  mt);.      retur
10910 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
10920 20 7d 0a 20 20 20 20 61 7a 43 6f 6c 20 3d 20 6d   }.    azCol = m
10930 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 61 7a  alloc( sizeof(az
10940 43 6f 6c 5b 30 5d 29 2a 28 6e 43 6f 6c 2b 31 29  Col[0])*(nCol+1)
10950 20 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 43 6f   );.    if( azCo
10960 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20 20 54  l==0 ) {.      T
10970 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
10980 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20  interp, "Error: 
10990 63 61 6e 27 74 20 6d 61 6c 6c 6f 63 28 29 22 2c  can't malloc()",
109a0 20 30 29 3b 0a 20 20 20 20 20 20 66 63 6c 6f 73   0);.      fclos
109b0 65 28 69 6e 29 3b 0a 20 20 20 20 20 20 72 65 74  e(in);.      ret
109c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
109d0 20 20 20 7d 0a 20 20 20 20 28 76 6f 69 64 29 73     }.    (void)s
109e0 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d  qlite3_exec(pDb-
109f0 3e 64 62 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c  >db, "BEGIN", 0,
10a00 20 30 2c 20 30 29 3b 0a 20 20 20 20 7a 43 6f 6d   0, 0);.    zCom
10a10 6d 69 74 20 3d 20 22 43 4f 4d 4d 49 54 22 3b 0a  mit = "COMMIT";.
10a20 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4c 69 6e      while( (zLin
10a30 65 20 3d 20 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e  e = local_getlin
10a40 65 28 30 2c 20 69 6e 29 29 21 3d 30 20 29 7b 0a  e(0, in))!=0 ){.
10a50 20 20 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20        char *z;. 
10a60 20 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20       lineno++;. 
10a70 20 20 20 20 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20       azCol[0] = 
10a80 7a 4c 69 6e 65 3b 0a 20 20 20 20 20 20 66 6f 72  zLine;.      for
10a90 28 69 3d 30 2c 20 7a 3d 7a 4c 69 6e 65 3b 20 2a  (i=0, z=zLine; *
10aa0 7a 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  z; z++){.       
10ab0 20 69 66 28 20 2a 7a 3d 3d 7a 53 65 70 5b 30 5d   if( *z==zSep[0]
10ac0 20 26 26 20 73 74 72 6e 63 6d 70 28 7a 2c 20 7a   && strncmp(z, z
10ad0 53 65 70 2c 20 6e 53 65 70 29 3d 3d 30 20 29 7b  Sep, nSep)==0 ){
10ae0 0a 20 20 20 20 20 20 20 20 20 20 2a 7a 20 3d 20  .          *z = 
10af0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 2b 2b  0;.          i++
10b00 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
10b10 69 3c 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  i<nCol ){.      
10b20 20 20 20 20 20 20 61 7a 43 6f 6c 5b 69 5d 20 3d        azCol[i] =
10b30 20 26 7a 5b 6e 53 65 70 5d 3b 0a 20 20 20 20 20   &z[nSep];.     
10b40 20 20 20 20 20 20 20 7a 20 2b 3d 20 6e 53 65 70         z += nSep
10b50 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  -1;.          }.
10b60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10b70 7d 0a 20 20 20 20 20 20 69 66 28 20 69 2b 31 21  }.      if( i+1!
10b80 3d 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  =nCol ){.       
10b90 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20   char *zErr;.   
10ba0 20 20 20 20 20 69 6e 74 20 6e 45 72 72 20 3d 20       int nErr = 
10bb0 73 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 20  strlen30(zFile) 
10bc0 2b 20 32 30 30 3b 0a 20 20 20 20 20 20 20 20 7a  + 200;.        z
10bd0 45 72 72 20 3d 20 6d 61 6c 6c 6f 63 28 6e 45 72  Err = malloc(nEr
10be0 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
10bf0 7a 45 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20  zErr ){.        
10c00 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
10c10 74 66 28 6e 45 72 72 2c 20 7a 45 72 72 2c 0a 20  tf(nErr, zErr,. 
10c20 20 20 20 20 20 20 20 20 20 20 20 20 22 45 72 72              "Err
10c30 6f 72 3a 20 25 73 20 6c 69 6e 65 20 25 64 3a 20  or: %s line %d: 
10c40 65 78 70 65 63 74 65 64 20 25 64 20 63 6f 6c 75  expected %d colu
10c50 6d 6e 73 20 6f 66 20 64 61 74 61 20 62 75 74 20  mns of data but 
10c60 66 6f 75 6e 64 20 25 64 22 2c 0a 20 20 20 20 20  found %d",.     
10c70 20 20 20 20 20 20 20 20 7a 46 69 6c 65 2c 20 6c          zFile, l
10c80 69 6e 65 6e 6f 2c 20 6e 43 6f 6c 2c 20 69 2b 31  ineno, nCol, i+1
10c90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  );.          Tcl
10ca0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
10cb0 74 65 72 70 2c 20 7a 45 72 72 2c 20 30 29 3b 0a  terp, zErr, 0);.
10cc0 20 20 20 20 20 20 20 20 20 20 66 72 65 65 28 7a            free(z
10cd0 45 72 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Err);.        }.
10ce0 20 20 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20          zCommit 
10cf0 3d 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20  = "ROLLBACK";.  
10d00 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10d10 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
10d20 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
10d30 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 68 65  {.        /* che
10d40 63 6b 20 66 6f 72 20 6e 75 6c 6c 20 64 61 74 61  ck for null data
10d50 2c 20 69 66 20 73 6f 2c 20 62 69 6e 64 20 61 73  , if so, bind as
10d60 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20   null */.       
10d70 20 69 66 28 20 28 6e 4e 75 6c 6c 3e 30 20 26 26   if( (nNull>0 &&
10d80 20 73 74 72 63 6d 70 28 61 7a 43 6f 6c 5b 69 5d   strcmp(azCol[i]
10d90 2c 20 7a 4e 75 6c 6c 29 3d 3d 30 29 0a 20 20 20  , zNull)==0).   
10da0 20 20 20 20 20 20 20 7c 7c 20 73 74 72 6c 65 6e         || strlen
10db0 33 30 28 61 7a 43 6f 6c 5b 69 5d 29 3d 3d 30 20  30(azCol[i])==0 
10dc0 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
10dd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
10de0 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69  nd_null(pStmt, i
10df0 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  +1);.        }el
10e00 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  se{.          sq
10e10 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28  lite3_bind_text(
10e20 70 53 74 6d 74 2c 20 69 2b 31 2c 20 61 7a 43 6f  pStmt, i+1, azCo
10e30 6c 5b 69 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45  l[i], -1, SQLITE
10e40 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
10e50 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
10e60 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70    sqlite3_step(p
10e70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 63 20  Stmt);.      rc 
10e80 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
10e90 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 66 72  pStmt);.      fr
10ea0 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20  ee(zLine);.     
10eb0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10ec0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  OK ){.        Tc
10ed0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
10ee0 6e 74 65 72 70 2c 22 45 72 72 6f 72 3a 20 22 2c  nterp,"Error: ",
10ef0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
10f00 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20  pDb->db), 0);.  
10f10 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20        zCommit = 
10f20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20  "ROLLBACK";.    
10f30 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
10f40 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65   }.    }.    fre
10f50 65 28 61 7a 43 6f 6c 29 3b 0a 20 20 20 20 66 63  e(azCol);.    fc
10f60 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 73 71  lose(in);.    sq
10f70 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
10f80 53 74 6d 74 29 3b 0a 20 20 20 20 28 76 6f 69 64  Stmt);.    (void
10f90 29 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44  )sqlite3_exec(pD
10fa0 62 2d 3e 64 62 2c 20 7a 43 6f 6d 6d 69 74 2c 20  b->db, zCommit, 
10fb0 30 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 69  0, 0, 0);..    i
10fc0 66 28 20 7a 43 6f 6d 6d 69 74 5b 30 5d 20 3d 3d  f( zCommit[0] ==
10fd0 20 27 43 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a   'C' ){.      /*
10fe0 20 73 75 63 63 65 73 73 2c 20 73 65 74 20 72 65   success, set re
10ff0 73 75 6c 74 20 61 73 20 6e 75 6d 62 65 72 20 6f  sult as number o
11000 66 20 6c 69 6e 65 73 20 70 72 6f 63 65 73 73 65  f lines processe
11010 64 20 2a 2f 0a 20 20 20 20 20 20 70 52 65 73 75  d */.      pResu
11020 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52  lt = Tcl_GetObjR
11030 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
11040 20 20 20 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f       Tcl_SetIntO
11050 62 6a 28 70 52 65 73 75 6c 74 2c 20 6c 69 6e 65  bj(pResult, line
11060 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  no);.      rc = 
11070 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  TCL_OK;.    }els
11080 65 7b 0a 20 20 20 20 20 20 2f 2a 20 66 61 69 6c  e{.      /* fail
11090 75 72 65 2c 20 61 70 70 65 6e 64 20 6c 69 6e 65  ure, append line
110a0 6e 6f 20 77 68 65 72 65 20 66 61 69 6c 65 64 20  no where failed 
110b0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
110c0 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
110d0 28 7a 4c 69 6e 65 4e 75 6d 29 2c 20 7a 4c 69 6e  (zLineNum), zLin
110e0 65 4e 75 6d 2c 22 25 64 22 2c 6c 69 6e 65 6e 6f  eNum,"%d",lineno
110f0 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  );.      Tcl_App
11100 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
11110 2c 22 2c 20 66 61 69 6c 65 64 20 77 68 69 6c 65  ,", failed while
11120 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 69 6e 65   processing line
11130 3a 20 22 2c 7a 4c 69 6e 65 4e 75 6d 2c 30 29 3b  : ",zLineNum,0);
11140 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f  .      rc = TCL_
11150 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
11160 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
11170 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 65 6e  *.  **    $db en
11180 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73  able_load_extens
11190 69 6f 6e 20 42 4f 4f 4c 45 41 4e 0a 20 20 2a 2a  ion BOOLEAN.  **
111a0 0a 20 20 2a 2a 20 54 75 72 6e 20 74 68 65 20 65  .  ** Turn the e
111b0 78 74 65 6e 73 69 6f 6e 20 6c 6f 61 64 69 6e 67  xtension loading
111c0 20 66 65 61 74 75 72 65 20 6f 6e 20 6f 72 20 6f   feature on or o
111d0 66 66 2e 20 20 49 74 20 69 66 20 6f 66 66 20 62  ff.  It if off b
111e0 79 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74 2e 0a  y.  ** default..
111f0 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 45    */.  case DB_E
11200 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e  NABLE_LOAD_EXTEN
11210 53 49 4f 4e 3a 20 7b 0a 23 69 66 6e 64 65 66 20  SION: {.#ifndef 
11220 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
11230 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 69  _EXTENSION.    i
11240 6e 74 20 6f 6e 6f 66 66 3b 0a 20 20 20 20 69 66  nt onoff;.    if
11250 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
11260 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
11270 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
11280 62 6a 76 2c 20 22 42 4f 4f 4c 45 41 4e 22 29 3b  bjv, "BOOLEAN");
11290 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
112a0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
112b0 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f     if( Tcl_GetBo
112c0 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
112d0 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6f  erp, objv[2], &o
112e0 6e 6f 66 66 29 20 29 7b 0a 20 20 20 20 20 20 72  noff) ){.      r
112f0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
11300 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
11310 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65  e3_enable_load_e
11320 78 74 65 6e 73 69 6f 6e 28 70 44 62 2d 3e 64 62  xtension(pDb->db
11330 2c 20 6f 6e 6f 66 66 29 3b 0a 20 20 20 20 62 72  , onoff);.    br
11340 65 61 6b 3b 0a 23 65 6c 73 65 0a 20 20 20 20 54  eak;.#else.    T
11350 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
11360 69 6e 74 65 72 70 2c 20 22 65 78 74 65 6e 73 69  interp, "extensi
11370 6f 6e 20 6c 6f 61 64 69 6e 67 20 69 73 20 74 75  on loading is tu
11380 72 6e 65 64 20 6f 66 66 20 61 74 20 63 6f 6d 70  rned off at comp
11390 69 6c 65 2d 74 69 6d 65 22 2c 0a 20 20 20 20 20  ile-time",.     
113a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113b0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
113c0 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6e 64 69 66  CL_ERROR;.#endif
113d0 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
113e0 20 20 20 24 64 62 20 65 72 72 6f 72 63 6f 64 65     $db errorcode
113f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72  .  **.  ** Retur
11400 6e 20 74 68 65 20 6e 75 6d 65 72 69 63 20 65 72  n the numeric er
11410 72 6f 72 20 63 6f 64 65 20 74 68 61 74 20 77 61  ror code that wa
11420 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  s returned by th
11430 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 20 20  e most recent.  
11440 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  ** call to sqlit
11450 65 33 5f 65 78 65 63 28 29 2e 0a 20 20 2a 2f 0a  e3_exec()..  */.
11460 20 20 63 61 73 65 20 44 42 5f 45 52 52 4f 52 43    case DB_ERRORC
11470 4f 44 45 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 53  ODE: {.    Tcl_S
11480 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
11490 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
114a0 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  j(sqlite3_errcod
114b0 65 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20  e(pDb->db)));.  
114c0 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
114d0 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 65  /*.  **    $db e
114e0 78 69 73 74 73 20 24 73 71 6c 0a 20 20 2a 2a 20  xists $sql.  ** 
114f0 20 20 20 24 64 62 20 6f 6e 65 63 6f 6c 75 6d 6e     $db onecolumn
11500 20 24 73 71 6c 0a 20 20 2a 2a 0a 20 20 2a 2a 20   $sql.  **.  ** 
11510 54 68 65 20 6f 6e 65 63 6f 6c 75 6d 6e 20 6d 65  The onecolumn me
11520 74 68 6f 64 20 69 73 20 74 68 65 20 65 71 75 69  thod is the equi
11530 76 61 6c 65 6e 74 20 6f 66 3a 0a 20 20 2a 2a 20  valent of:.  ** 
11540 20 20 20 20 6c 69 6e 64 65 78 20 5b 24 64 62 20      lindex [$db 
11550 65 76 61 6c 20 24 73 71 6c 5d 20 30 0a 20 20 2a  eval $sql] 0.  *
11560 2f 0a 20 20 63 61 73 65 20 44 42 5f 45 58 49 53  /.  case DB_EXIS
11570 54 53 3a 20 0a 20 20 63 61 73 65 20 44 42 5f 4f  TS: .  case DB_O
11580 4e 45 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  NECOLUMN: {.    
11590 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 73 45  DbEvalContext sE
115a0 76 61 6c 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a  val;.    if( obj
115b0 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=3 ){.      Tc
115c0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
115d0 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
115e0 22 53 51 4c 22 29 3b 0a 20 20 20 20 20 20 72 65  "SQL");.      re
115f0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
11600 20 20 20 20 7d 0a 0a 20 20 20 20 64 62 45 76 61      }..    dbEva
11610 6c 49 6e 69 74 28 26 73 45 76 61 6c 2c 20 70 44  lInit(&sEval, pD
11620 62 2c 20 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a  b, objv[2], 0);.
11630 20 20 20 20 72 63 20 3d 20 64 62 45 76 61 6c 53      rc = dbEvalS
11640 74 65 70 28 26 73 45 76 61 6c 29 3b 0a 20 20 20  tep(&sEval);.   
11650 20 69 66 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f   if( choice==DB_
11660 4f 4e 45 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  ONECOLUMN ){.   
11670 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 4f     if( rc==TCL_O
11680 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  K ){.        Tcl
11690 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
116a0 74 65 72 70 2c 20 64 62 45 76 61 6c 43 6f 6c 75  terp, dbEvalColu
116b0 6d 6e 56 61 6c 75 65 28 26 73 45 76 61 6c 2c 20  mnValue(&sEval, 
116c0 30 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  0));.      }else
116d0 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 42 52 45   if( rc==TCL_BRE
116e0 41 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  AK ){.        Tc
116f0 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e  l_ResetResult(in
11700 74 65 72 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20  terp);.      }. 
11710 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d     }else if( rc=
11720 3d 54 43 4c 5f 42 52 45 41 4b 20 7c 7c 20 72 63  =TCL_BREAK || rc
11730 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20  ==TCL_OK ){.    
11740 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
11750 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
11760 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72 63 3d  ewBooleanObj(rc=
11770 3d 54 43 4c 5f 4f 4b 29 29 3b 0a 20 20 20 20 7d  =TCL_OK));.    }
11780 0a 20 20 20 20 64 62 45 76 61 6c 46 69 6e 61 6c  .    dbEvalFinal
11790 69 7a 65 28 26 73 45 76 61 6c 29 3b 0a 0a 20 20  ize(&sEval);..  
117a0 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 42 52    if( rc==TCL_BR
117b0 45 41 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  EAK ){.      rc 
117c0 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  = TCL_OK;.    }.
117d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
117e0 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20    .  /*.  **    
117f0 24 64 62 20 65 76 61 6c 20 24 73 71 6c 20 3f 61  $db eval $sql ?a
11800 72 72 61 79 3f 20 3f 7b 20 20 2e 2e 2e 63 6f 64  rray? ?{  ...cod
11810 65 2e 2e 2e 20 7d 3f 0a 20 20 2a 2a 0a 20 20 2a  e... }?.  **.  *
11820 2a 20 54 68 65 20 53 51 4c 20 73 74 61 74 65 6d  * The SQL statem
11830 65 6e 74 20 69 6e 20 24 73 71 6c 20 69 73 20 65  ent in $sql is e
11840 76 61 6c 75 61 74 65 64 2e 20 20 46 6f 72 20 65  valuated.  For e
11850 61 63 68 20 72 6f 77 2c 20 74 68 65 20 76 61 6c  ach row, the val
11860 75 65 73 20 61 72 65 0a 20 20 2a 2a 20 70 6c 61  ues are.  ** pla
11870 63 65 64 20 69 6e 20 65 6c 65 6d 65 6e 74 73 20  ced in elements 
11880 6f 66 20 74 68 65 20 61 72 72 61 79 20 6e 61 6d  of the array nam
11890 65 64 20 22 61 72 72 61 79 22 20 61 6e 64 20 2e  ed "array" and .
118a0 2e 2e 63 6f 64 65 2e 2e 2e 20 69 73 20 65 78 65  ..code... is exe
118b0 63 75 74 65 64 2e 0a 20 20 2a 2a 20 49 66 20 22  cuted..  ** If "
118c0 61 72 72 61 79 22 20 61 6e 64 20 22 63 6f 64 65  array" and "code
118d0 22 20 61 72 65 20 6f 6d 69 74 74 65 64 2c 20 74  " are omitted, t
118e0 68 65 6e 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 20  hen no callback 
118f0 69 73 20 65 76 65 72 79 20 69 6e 76 6f 6b 65 64  is every invoked
11900 2e 0a 20 20 2a 2a 20 49 66 20 22 61 72 72 61 79  ..  ** If "array
11910 22 20 69 73 20 61 6e 20 65 6d 70 74 79 20 73 74  " is an empty st
11920 72 69 6e 67 2c 20 74 68 65 6e 20 74 68 65 20 76  ring, then the v
11930 61 6c 75 65 73 20 61 72 65 20 70 6c 61 63 65 64  alues are placed
11940 20 69 6e 20 76 61 72 69 61 62 6c 65 73 0a 20 20   in variables.  
11950 2a 2a 20 74 68 61 74 20 68 61 76 65 20 74 68 65  ** that have the
11960 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68   same name as th
11970 65 20 66 69 65 6c 64 73 20 65 78 74 72 61 63 74  e fields extract
11980 65 64 20 62 79 20 74 68 65 20 71 75 65 72 79 2e  ed by the query.
11990 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
119a0 45 56 41 4c 3a 20 7b 0a 20 20 20 20 69 66 28 20  EVAL: {.    if( 
119b0 6f 62 6a 63 3c 33 20 7c 7c 20 6f 62 6a 63 3e 35  objc<3 || objc>5
119c0 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
119d0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
119e0 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c  p, 2, objv, "SQL
119f0 20 3f 41 52 52 41 59 2d 4e 41 4d 45 3f 20 3f 53   ?ARRAY-NAME? ?S
11a00 43 52 49 50 54 3f 22 29 3b 0a 20 20 20 20 20 20  CRIPT?");.      
11a10 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
11a20 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
11a30 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20   objc==3 ){.    
11a40 20 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20    DbEvalContext 
11a50 73 45 76 61 6c 3b 0a 20 20 20 20 20 20 54 63 6c  sEval;.      Tcl
11a60 5f 4f 62 6a 20 2a 70 52 65 74 20 3d 20 54 63 6c  _Obj *pRet = Tcl
11a70 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20 20  _NewObj();.     
11a80 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
11a90 74 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20 64  t(pRet);.      d
11aa0 62 45 76 61 6c 49 6e 69 74 28 26 73 45 76 61 6c  bEvalInit(&sEval
11ab0 2c 20 70 44 62 2c 20 6f 62 6a 76 5b 32 5d 2c 20  , pDb, objv[2], 
11ac0 30 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  0);.      while(
11ad0 20 54 43 4c 5f 4f 4b 3d 3d 28 72 63 20 3d 20 64   TCL_OK==(rc = d
11ae0 62 45 76 61 6c 53 74 65 70 28 26 73 45 76 61 6c  bEvalStep(&sEval
11af0 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  )) ){.        in
11b00 74 20 69 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  t i;.        int
11b10 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 64   nCol;.        d
11b20 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28 26 73 45  bEvalRowInfo(&sE
11b30 76 61 6c 2c 20 26 6e 43 6f 6c 2c 20 30 29 3b 0a  val, &nCol, 0);.
11b40 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
11b50 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
11b60 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4c 69 73           Tcl_Lis
11b70 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
11b80 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20  t(interp, pRet, 
11b90 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75  dbEvalColumnValu
11ba0 65 28 26 73 45 76 61 6c 2c 20 69 29 29 3b 0a 20  e(&sEval, i));. 
11bb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
11bc0 0a 20 20 20 20 20 20 64 62 45 76 61 6c 46 69 6e  .      dbEvalFin
11bd0 61 6c 69 7a 65 28 26 73 45 76 61 6c 29 3b 0a 20  alize(&sEval);. 
11be0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c       if( rc==TCL
11bf0 5f 42 52 45 41 4b 20 29 7b 0a 20 20 20 20 20 20  _BREAK ){.      
11c00 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
11c10 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29  lt(interp, pRet)
11c20 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 54  ;.        rc = T
11c30 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  CL_OK;.      }. 
11c40 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
11c50 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20  Count(pRet);.   
11c60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 43 6c   }else{.      Cl
11c70 69 65 6e 74 44 61 74 61 20 63 64 5b 32 5d 3b 0a  ientData cd[2];.
11c80 20 20 20 20 20 20 44 62 45 76 61 6c 43 6f 6e 74        DbEvalCont
11c90 65 78 74 20 2a 70 3b 0a 20 20 20 20 20 20 54 63  ext *p;.      Tc
11ca0 6c 5f 4f 62 6a 20 2a 70 41 72 72 61 79 20 3d 20  l_Obj *pArray = 
11cb0 30 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a  0;.      Tcl_Obj
11cc0 20 2a 70 53 63 72 69 70 74 3b 0a 0a 20 20 20 20   *pScript;..    
11cd0 20 20 69 66 28 20 6f 62 6a 63 3d 3d 35 20 26 26    if( objc==5 &&
11ce0 20 2a 28 63 68 61 72 20 2a 29 54 63 6c 5f 47 65   *(char *)Tcl_Ge
11cf0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29  tString(objv[3])
11d00 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 72 72   ){.        pArr
11d10 61 79 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20  ay = objv[3];.  
11d20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 63 72      }.      pScr
11d30 69 70 74 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d  ipt = objv[objc-
11d40 31 5d 3b 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e  1];.      Tcl_In
11d50 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69  crRefCount(pScri
11d60 70 74 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20  pt);.      .    
11d70 20 20 70 20 3d 20 28 44 62 45 76 61 6c 43 6f 6e    p = (DbEvalCon
11d80 74 65 78 74 20 2a 29 54 63 6c 5f 41 6c 6c 6f 63  text *)Tcl_Alloc
11d90 28 73 69 7a 65 6f 66 28 44 62 45 76 61 6c 43 6f  (sizeof(DbEvalCo
11da0 6e 74 65 78 74 29 29 3b 0a 20 20 20 20 20 20 64  ntext));.      d
11db0 62 45 76 61 6c 49 6e 69 74 28 70 2c 20 70 44 62  bEvalInit(p, pDb
11dc0 2c 20 6f 62 6a 76 5b 32 5d 2c 20 70 41 72 72 61  , objv[2], pArra
11dd0 79 29 3b 0a 0a 20 20 20 20 20 20 63 64 5b 30 5d  y);..      cd[0]
11de0 20 3d 20 28 76 6f 69 64 20 2a 29 70 3b 0a 20 20   = (void *)p;.  
11df0 20 20 20 20 63 64 5b 31 5d 20 3d 20 28 76 6f 69      cd[1] = (voi
11e00 64 20 2a 29 70 53 63 72 69 70 74 3b 0a 20 20 20  d *)pScript;.   
11e10 20 20 20 72 63 20 3d 20 44 62 45 76 61 6c 4e 65     rc = DbEvalNe
11e20 78 74 43 6d 64 28 63 64 2c 20 69 6e 74 65 72 70  xtCmd(cd, interp
11e30 2c 20 54 43 4c 5f 4f 4b 29 3b 0a 20 20 20 20 7d  , TCL_OK);.    }
11e40 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
11e50 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24  .  /*.  **     $
11e60 64 62 20 66 75 6e 63 74 69 6f 6e 20 4e 41 4d 45  db function NAME
11e70 20 5b 2d 61 72 67 63 6f 75 6e 74 20 4e 5d 20 53   [-argcount N] S
11e80 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20  CRIPT.  **.  ** 
11e90 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 51 4c  Create a new SQL
11ea0 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64   function called
11eb0 20 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76 65 72   NAME.  Whenever
11ec0 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 69   that function i
11ed0 73 0a 20 20 2a 2a 20 63 61 6c 6c 65 64 2c 20 69  s.  ** called, i
11ee0 6e 76 6f 6b 65 20 53 43 52 49 50 54 20 74 6f 20  nvoke SCRIPT to 
11ef0 65 76 61 6c 75 61 74 65 20 74 68 65 20 66 75 6e  evaluate the fun
11f00 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61  ction..  */.  ca
11f10 73 65 20 44 42 5f 46 55 4e 43 54 49 4f 4e 3a 20  se DB_FUNCTION: 
11f20 7b 0a 20 20 20 20 53 71 6c 46 75 6e 63 20 2a 70  {.    SqlFunc *p
11f30 46 75 6e 63 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  Func;.    Tcl_Ob
11f40 6a 20 2a 70 53 63 72 69 70 74 3b 0a 20 20 20 20  j *pScript;.    
11f50 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
11f60 20 69 6e 74 20 6e 41 72 67 20 3d 20 2d 31 3b 0a   int nArg = -1;.
11f70 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 36 20      if( objc==6 
11f80 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
11f90 68 61 72 20 2a 7a 20 3d 20 54 63 6c 5f 47 65 74  har *z = Tcl_Get
11fa0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b  String(objv[3]);
11fb0 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73  .      int n = s
11fc0 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20  trlen30(z);.    
11fd0 20 20 69 66 28 20 6e 3e 32 20 26 26 20 73 74 72    if( n>2 && str
11fe0 6e 63 6d 70 28 7a 2c 20 22 2d 61 72 67 63 6f 75  ncmp(z, "-argcou
11ff0 6e 74 22 2c 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  nt",n)==0 ){.   
12000 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74       if( Tcl_Get
12010 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
12020 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 6e 41 72  p, objv[4], &nAr
12030 67 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  g) ) return TCL_
12040 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 69  ERROR;.        i
12050 66 28 20 6e 41 72 67 3c 30 20 29 7b 0a 20 20 20  f( nArg<0 ){.   
12060 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
12070 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
12080 22 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d  "number of argum
12090 65 6e 74 73 20 6d 75 73 74 20 62 65 20 6e 6f 6e  ents must be non
120a0 2d 6e 65 67 61 74 69 76 65 22 2c 0a 20 20 20 20  -negative",.    
120b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120c0 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 30 29         (char*)0)
120d0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
120e0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
120f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
12100 20 20 20 20 20 20 70 53 63 72 69 70 74 20 3d 20        pScript = 
12110 6f 62 6a 76 5b 35 5d 3b 0a 20 20 20 20 7d 65 6c  objv[5];.    }el
12120 73 65 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29  se if( objc!=4 )
12130 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
12140 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
12150 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20   2, objv, "NAME 
12160 5b 2d 61 72 67 63 6f 75 6e 74 20 4e 5d 20 53 43  [-argcount N] SC
12170 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65  RIPT");.      re
12180 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
12190 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
121a0 20 70 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b   pScript = objv[
121b0 33 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e  3];.    }.    zN
121c0 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ame = Tcl_GetStr
121d0 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
121e0 32 5d 2c 20 30 29 3b 0a 20 20 20 20 70 46 75 6e  2], 0);.    pFun
121f0 63 20 3d 20 66 69 6e 64 53 71 6c 46 75 6e 63 28  c = findSqlFunc(
12200 70 44 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  pDb, zName);.   
12210 20 69 66 28 20 70 46 75 6e 63 3d 3d 30 20 29 20   if( pFunc==0 ) 
12220 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
12230 3b 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d  ;.    if( pFunc-
12240 3e 70 53 63 72 69 70 74 20 29 7b 0a 20 20 20 20  >pScript ){.    
12250 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
12260 6e 74 28 70 46 75 6e 63 2d 3e 70 53 63 72 69 70  nt(pFunc->pScrip
12270 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46  t);.    }.    pF
12280 75 6e 63 2d 3e 70 53 63 72 69 70 74 20 3d 20 70  unc->pScript = p
12290 53 63 72 69 70 74 3b 0a 20 20 20 20 54 63 6c 5f  Script;.    Tcl_
122a0 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63  IncrRefCount(pSc
122b0 72 69 70 74 29 3b 0a 20 20 20 20 70 46 75 6e 63  ript);.    pFunc
122c0 2d 3e 75 73 65 45 76 61 6c 4f 62 6a 76 20 3d 20  ->useEvalObjv = 
122d0 73 61 66 65 54 6f 55 73 65 45 76 61 6c 4f 62 6a  safeToUseEvalObj
122e0 76 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70  v(interp, pScrip
122f0 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  t);.    rc = sql
12300 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
12310 74 69 6f 6e 28 70 44 62 2d 3e 64 62 2c 20 7a 4e  tion(pDb->db, zN
12320 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54  ame, nArg, SQLIT
12330 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20 20  E_UTF8,.        
12340 70 46 75 6e 63 2c 20 74 63 6c 53 71 6c 46 75 6e  pFunc, tclSqlFun
12350 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  c, 0, 0);.    if
12360 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
12370 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43  ){.      rc = TC
12380 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 54  L_ERROR;.      T
12390 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
123a0 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c  erp, (char *)sql
123b0 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d  ite3_errmsg(pDb-
123c0 3e 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49  >db), TCL_VOLATI
123d0 4c 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  LE);.    }.    b
123e0 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
123f0 20 20 2a 2a 20 20 20 20 20 24 64 62 20 69 6e 63    **     $db inc
12400 72 62 6c 6f 62 20 3f 2d 72 65 61 64 6f 6e 6c 79  rblob ?-readonly
12410 3f 20 3f 44 42 3f 20 54 41 42 4c 45 20 43 4f 4c  ? ?DB? TABLE COL
12420 55 4d 4e 20 52 4f 57 49 44 0a 20 20 2a 2f 0a 20  UMN ROWID.  */. 
12430 20 63 61 73 65 20 44 42 5f 49 4e 43 52 42 4c 4f   case DB_INCRBLO
12440 42 3a 20 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  B: {.#ifdef SQLI
12450 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
12460 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
12470 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 69  esult(interp, "i
12480 6e 63 72 62 6c 6f 62 20 6e 6f 74 20 61 76 61 69  ncrblob not avai
12490 6c 61 62 6c 65 20 69 6e 20 74 68 69 73 20 62 75  lable in this bu
124a0 69 6c 64 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  ild", 0);.    re
124b0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
124c0 23 65 6c 73 65 0a 20 20 20 20 69 6e 74 20 69 73  #else.    int is
124d0 52 65 61 64 6f 6e 6c 79 20 3d 20 30 3b 0a 20 20  Readonly = 0;.  
124e0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
124f0 62 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20  b = "main";.    
12500 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
12510 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  le;.    const ch
12520 61 72 20 2a 7a 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ar *zColumn;.   
12530 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 69 52 6f   Tcl_WideInt iRo
12540 77 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  w;..    /* Check
12550 20 66 6f 72 20 74 68 65 20 2d 72 65 61 64 6f 6e   for the -readon
12560 6c 79 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  ly option */.   
12570 20 69 66 28 20 6f 62 6a 63 3e 33 20 26 26 20 73   if( objc>3 && s
12580 74 72 63 6d 70 28 54 63 6c 5f 47 65 74 53 74 72  trcmp(Tcl_GetStr
12590 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 22 2d  ing(objv[2]), "-
125a0 72 65 61 64 6f 6e 6c 79 22 29 3d 3d 30 20 29 7b  readonly")==0 ){
125b0 0a 20 20 20 20 20 20 69 73 52 65 61 64 6f 6e 6c  .      isReadonl
125c0 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  y = 1;.    }..  
125d0 20 20 69 66 28 20 6f 62 6a 63 21 3d 28 35 2b 69    if( objc!=(5+i
125e0 73 52 65 61 64 6f 6e 6c 79 29 20 26 26 20 6f 62  sReadonly) && ob
125f0 6a 63 21 3d 28 36 2b 69 73 52 65 61 64 6f 6e 6c  jc!=(6+isReadonl
12600 79 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  y) ){.      Tcl_
12610 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
12620 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f  erp, 2, objv, "?
12630 2d 72 65 61 64 6f 6e 6c 79 3f 20 3f 44 42 3f 20  -readonly? ?DB? 
12640 54 41 42 4c 45 20 43 4f 4c 55 4d 4e 20 52 4f 57  TABLE COLUMN ROW
12650 49 44 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ID");.      retu
12660 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
12670 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a    }..    if( obj
12680 63 3d 3d 28 36 2b 69 73 52 65 61 64 6f 6e 6c 79  c==(6+isReadonly
12690 29 20 29 7b 0a 20 20 20 20 20 20 7a 44 62 20 3d  ) ){.      zDb =
126a0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
126b0 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 7d 0a 20  bjv[2]);.    }. 
126c0 20 20 20 7a 54 61 62 6c 65 20 3d 20 54 63 6c 5f     zTable = Tcl_
126d0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 6f  GetString(objv[o
126e0 62 6a 63 2d 33 5d 29 3b 0a 20 20 20 20 7a 43 6f  bjc-3]);.    zCo
126f0 6c 75 6d 6e 20 3d 20 54 63 6c 5f 47 65 74 53 74  lumn = Tcl_GetSt
12700 72 69 6e 67 28 6f 62 6a 76 5b 6f 62 6a 63 2d 32  ring(objv[objc-2
12710 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 54 63 6c  ]);.    rc = Tcl
12720 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f  _GetWideIntFromO
12730 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
12740 6f 62 6a 63 2d 31 5d 2c 20 26 69 52 6f 77 29 3b  objc-1], &iRow);
12750 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43  ..    if( rc==TC
12760 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  L_OK ){.      rc
12770 20 3d 20 63 72 65 61 74 65 49 6e 63 72 62 6c 6f   = createIncrblo
12780 62 43 68 61 6e 6e 65 6c 28 0a 20 20 20 20 20 20  bChannel(.      
12790 20 20 20 20 69 6e 74 65 72 70 2c 20 70 44 62 2c      interp, pDb,
127a0 20 7a 44 62 2c 20 7a 54 61 62 6c 65 2c 20 7a 43   zDb, zTable, zC
127b0 6f 6c 75 6d 6e 2c 20 69 52 6f 77 2c 20 69 73 52  olumn, iRow, isR
127c0 65 61 64 6f 6e 6c 79 0a 20 20 20 20 20 20 29 3b  eadonly.      );
127d0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
127e0 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
127f0 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20  /*.  **     $db 
12800 69 6e 74 65 72 72 75 70 74 0a 20 20 2a 2a 0a 20  interrupt.  **. 
12810 20 2a 2a 20 49 6e 74 65 72 72 75 70 74 20 74 68   ** Interrupt th
12820 65 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74  e execution of t
12830 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 53 51  he inner-most SQ
12840 4c 20 69 6e 74 65 72 70 72 65 74 65 72 2e 20 20  L interpreter.  
12850 54 68 69 73 0a 20 20 2a 2a 20 63 61 75 73 65 73  This.  ** causes
12860 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
12870 6e 74 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20  nt to return an 
12880 65 72 72 6f 72 20 6f 66 20 53 51 4c 49 54 45 5f  error of SQLITE_
12890 49 4e 54 45 52 52 55 50 54 2e 0a 20 20 2a 2f 0a  INTERRUPT..  */.
128a0 20 20 63 61 73 65 20 44 42 5f 49 4e 54 45 52 52    case DB_INTERR
128b0 55 50 54 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74  UPT: {.    sqlit
128c0 65 33 5f 69 6e 74 65 72 72 75 70 74 28 70 44 62  e3_interrupt(pDb
128d0 2d 3e 64 62 29 3b 0a 20 20 20 20 62 72 65 61 6b  ->db);.    break
128e0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
128f0 20 20 20 20 20 24 64 62 20 6e 75 6c 6c 76 61 6c       $db nullval
12900 75 65 20 3f 53 54 52 49 4e 47 3f 0a 20 20 2a 2a  ue ?STRING?.  **
12910 0a 20 20 2a 2a 20 43 68 61 6e 67 65 20 74 65 78  .  ** Change tex
12920 74 20 75 73 65 64 20 77 68 65 6e 20 61 20 4e 55  t used when a NU
12930 4c 4c 20 63 6f 6d 65 73 20 62 61 63 6b 20 66 72  LL comes back fr
12940 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  om the database.
12950 20 49 66 20 3f 53 54 52 49 4e 47 3f 0a 20 20 2a   If ?STRING?.  *
12960 2a 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74  * is not present
12970 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 72 65  , then the curre
12980 6e 74 20 73 74 72 69 6e 67 20 75 73 65 64 20 66  nt string used f
12990 6f 72 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  or NULL is retur
129a0 6e 65 64 2e 0a 20 20 2a 2a 20 49 66 20 53 54 52  ned..  ** If STR
129b0 49 4e 47 20 69 73 20 70 72 65 73 65 6e 74 2c 20  ING is present, 
129c0 74 68 65 6e 20 53 54 52 49 4e 47 20 69 73 20 72  then STRING is r
129d0 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2a 0a 20 20  eturned..  **.  
129e0 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 4e 55 4c  */.  case DB_NUL
129f0 4c 56 41 4c 55 45 3a 20 7b 0a 20 20 20 20 69 66  LVALUE: {.    if
12a00 28 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a  ( objc!=2 && obj
12a10 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=3 ){.      Tc
12a20 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
12a30 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
12a40 22 4e 55 4c 4c 56 41 4c 55 45 22 29 3b 0a 20 20  "NULLVALUE");.  
12a50 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
12a60 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
12a70 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20  if( objc==3 ){. 
12a80 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20       int len;.  
12a90 20 20 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c 20      char *zNull 
12aa0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
12ab0 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
12ac0 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  &len);.      if(
12ad0 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 29 7b 0a 20   pDb->zNull ){. 
12ae0 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28         Tcl_Free(
12af0 70 44 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 20  pDb->zNull);.   
12b00 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a     }.      if( z
12b10 4e 75 6c 6c 20 26 26 20 6c 65 6e 3e 30 20 29 7b  Null && len>0 ){
12b20 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e  .        pDb->zN
12b30 75 6c 6c 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28  ull = Tcl_Alloc(
12b40 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20   len + 1 );.    
12b50 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e      memcpy(pDb->
12b60 7a 4e 75 6c 6c 2c 20 7a 4e 75 6c 6c 2c 20 6c 65  zNull, zNull, le
12b70 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  n);.        pDb-
12b80 3e 7a 4e 75 6c 6c 5b 6c 65 6e 5d 20 3d 20 27 5c  >zNull[len] = '\
12b90 30 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  0';.      }else{
12ba0 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e  .        pDb->zN
12bb0 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ull = 0;.      }
12bc0 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 53  .    }.    Tcl_S
12bd0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
12be0 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  rp, Tcl_NewStrin
12bf0 67 4f 62 6a 28 70 44 62 2d 3e 7a 4e 75 6c 6c 2c  gObj(pDb->zNull,
12c00 20 2d 31 29 29 3b 0a 20 20 20 20 62 72 65 61 6b   -1));.    break
12c10 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
12c20 20 20 20 20 20 24 64 62 20 6c 61 73 74 5f 69 6e       $db last_in
12c30 73 65 72 74 5f 72 6f 77 69 64 20 0a 20 20 2a 2a  sert_rowid .  **
12c40 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20  .  ** Return an 
12c50 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
12c60 20 74 68 65 20 52 4f 57 49 44 20 66 6f 72 20 74   the ROWID for t
12c70 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 69  he most recent i
12c80 6e 73 65 72 74 2e 0a 20 20 2a 2f 0a 20 20 63 61  nsert..  */.  ca
12c90 73 65 20 44 42 5f 4c 41 53 54 5f 49 4e 53 45 52  se DB_LAST_INSER
12ca0 54 5f 52 4f 57 49 44 3a 20 7b 0a 20 20 20 20 54  T_ROWID: {.    T
12cb0 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b  cl_Obj *pResult;
12cc0 0a 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74  .    Tcl_WideInt
12cd0 20 72 6f 77 69 64 3b 0a 20 20 20 20 69 66 28 20   rowid;.    if( 
12ce0 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 20  objc!=2 ){.     
12cf0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
12d00 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
12d10 76 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 72 65  v, "");.      re
12d20 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
12d30 20 20 20 20 7d 0a 20 20 20 20 72 6f 77 69 64 20      }.    rowid 
12d40 3d 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69  = sqlite3_last_i
12d50 6e 73 65 72 74 5f 72 6f 77 69 64 28 70 44 62 2d  nsert_rowid(pDb-
12d60 3e 64 62 29 3b 0a 20 20 20 20 70 52 65 73 75 6c  >db);.    pResul
12d70 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65  t = Tcl_GetObjRe
12d80 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
12d90 20 20 54 63 6c 5f 53 65 74 57 69 64 65 49 6e 74    Tcl_SetWideInt
12da0 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 72 6f 77  Obj(pResult, row
12db0 69 64 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  id);.    break;.
12dc0 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54    }..  /*.  ** T
12dd0 68 65 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 20  he DB_ONECOLUMN 
12de0 6d 65 74 68 6f 64 20 69 73 20 69 6d 70 6c 65 6d  method is implem
12df0 65 6e 74 65 64 20 74 6f 67 65 74 68 65 72 20 77  ented together w
12e00 69 74 68 20 44 42 5f 45 58 49 53 54 53 2e 0a 20  ith DB_EXISTS.. 
12e10 20 2a 2f 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62   */..  /*    $db
12e20 20 70 72 6f 67 72 65 73 73 20 3f 4e 20 43 41 4c   progress ?N CAL
12e30 4c 42 41 43 4b 3f 0a 20 20 2a 2a 20 0a 20 20 2a  LBACK?.  ** .  *
12e40 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76  * Invoke the giv
12e50 65 6e 20 63 61 6c 6c 62 61 63 6b 20 65 76 65 72  en callback ever
12e60 79 20 4e 20 76 69 72 74 75 61 6c 20 6d 61 63 68  y N virtual mach
12e70 69 6e 65 20 6f 70 63 6f 64 65 73 20 77 68 69 6c  ine opcodes whil
12e80 65 20 65 78 65 63 75 74 69 6e 67 0a 20 20 2a 2a  e executing.  **
12e90 20 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20   queries..  */. 
12ea0 20 63 61 73 65 20 44 42 5f 50 52 4f 47 52 45 53   case DB_PROGRES
12eb0 53 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a  S: {.    if( obj
12ec0 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66  c==2 ){.      if
12ed0 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73  ( pDb->zProgress
12ee0 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
12ef0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
12f00 65 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f 67 72  erp, pDb->zProgr
12f10 65 73 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ess, 0);.      }
12f20 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
12f30 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20  bjc==4 ){.      
12f40 63 68 61 72 20 2a 7a 50 72 6f 67 72 65 73 73 3b  char *zProgress;
12f50 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  .      int len;.
12f60 20 20 20 20 20 20 69 6e 74 20 4e 3b 0a 20 20 20        int N;.   
12f70 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54     if( TCL_OK!=T
12f80 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
12f90 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
12fa0 2c 20 26 4e 29 20 29 7b 0a 20 20 20 20 20 20 20  , &N) ){.       
12fb0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
12fc0 52 3b 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  R;.      };.    
12fd0 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67    if( pDb->zProg
12fe0 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ress ){.        
12ff0 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 50  Tcl_Free(pDb->zP
13000 72 6f 67 72 65 73 73 29 3b 0a 20 20 20 20 20 20  rogress);.      
13010 7d 0a 20 20 20 20 20 20 7a 50 72 6f 67 72 65 73  }.      zProgres
13020 73 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  s = Tcl_GetStrin
13030 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d  gFromObj(objv[3]
13040 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69  , &len);.      i
13050 66 28 20 7a 50 72 6f 67 72 65 73 73 20 26 26 20  f( zProgress && 
13060 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  len>0 ){.       
13070 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20   pDb->zProgress 
13080 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e  = Tcl_Alloc( len
13090 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20   + 1 );.        
130a0 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 50 72 6f  memcpy(pDb->zPro
130b0 67 72 65 73 73 2c 20 7a 50 72 6f 67 72 65 73 73  gress, zProgress
130c0 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20  , len+1);.      
130d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
130e0 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 3d 20  Db->zProgress = 
130f0 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64  0;.      }.#ifnd
13100 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
13110 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b  ROGRESS_CALLBACK
13120 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
13130 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20  zProgress ){.   
13140 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70       pDb->interp
13150 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20   = interp;.     
13160 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 67 72     sqlite3_progr
13170 65 73 73 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d  ess_handler(pDb-
13180 3e 64 62 2c 20 4e 2c 20 44 62 50 72 6f 67 72 65  >db, N, DbProgre
13190 73 73 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b  ssHandler, pDb);
131a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
131b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72        sqlite3_pr
131c0 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 70  ogress_handler(p
131d0 44 62 2d 3e 64 62 2c 20 30 2c 20 30 2c 20 30 29  Db->db, 0, 0, 0)
131e0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
131f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
13200 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
13210 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
13220 6a 76 2c 20 22 4e 20 43 41 4c 4c 42 41 43 4b 22  jv, "N CALLBACK"
13230 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
13240 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
13250 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
13260 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 70 72 6f  .  /*    $db pro
13270 66 69 6c 65 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a  file ?CALLBACK?.
13280 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 61    **.  ** Make a
13290 72 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20 69  rrangements to i
132a0 6e 76 6f 6b 65 20 74 68 65 20 43 41 4c 4c 42 41  nvoke the CALLBA
132b0 43 4b 20 72 6f 75 74 69 6e 65 20 61 66 74 65 72  CK routine after
132c0 20 65 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d   each SQL statem
132d0 65 6e 74 0a 20 20 2a 2a 20 74 68 61 74 20 68 61  ent.  ** that ha
132e0 73 20 72 75 6e 2e 20 20 54 68 65 20 74 65 78 74  s run.  The text
132f0 20 6f 66 20 74 68 65 20 53 51 4c 20 61 6e 64 20   of the SQL and 
13300 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 65 6c  the amount of el
13310 61 70 73 65 20 74 69 6d 65 20 61 72 65 0a 20 20  apse time are.  
13320 2a 2a 20 61 70 70 65 6e 64 65 64 20 74 6f 20 43  ** appended to C
13330 41 4c 4c 42 41 43 4b 20 62 65 66 6f 72 65 20 74  ALLBACK before t
13340 68 65 20 73 63 72 69 70 74 20 69 73 20 72 75 6e  he script is run
13350 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
13360 5f 50 52 4f 46 49 4c 45 3a 20 7b 0a 20 20 20 20  _PROFILE: {.    
13370 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20  if( objc>3 ){.  
13380 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
13390 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
133a0 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b  objv, "?CALLBACK
133b0 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ?");.      retur
133c0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
133d0 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d   }else if( objc=
133e0 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =2 ){.      if( 
133f0 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b  pDb->zProfile ){
13400 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70  .        Tcl_App
13410 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
13420 2c 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c  , pDb->zProfile,
13430 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
13440 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
13450 61 72 20 2a 7a 50 72 6f 66 69 6c 65 3b 0a 20 20  ar *zProfile;.  
13460 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
13470 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f     if( pDb->zPro
13480 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  file ){.        
13490 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 50  Tcl_Free(pDb->zP
134a0 72 6f 66 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d  rofile);.      }
134b0 0a 20 20 20 20 20 20 7a 50 72 6f 66 69 6c 65 20  .      zProfile 
134c0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
134d0 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
134e0 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  &len);.      if(
134f0 20 7a 50 72 6f 66 69 6c 65 20 26 26 20 6c 65 6e   zProfile && len
13500 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  >0 ){.        pD
13510 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 3d 20 54 63  b->zProfile = Tc
13520 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31  l_Alloc( len + 1
13530 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   );.        memc
13540 70 79 28 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65  py(pDb->zProfile
13550 2c 20 7a 50 72 6f 66 69 6c 65 2c 20 6c 65 6e 2b  , zProfile, len+
13560 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
13570 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50  .        pDb->zP
13580 72 6f 66 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20  rofile = 0;.    
13590 20 20 7d 0a 23 69 66 20 21 64 65 66 69 6e 65 64    }.#if !defined
135a0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41  (SQLITE_OMIT_TRA
135b0 43 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  CE) && !defined(
135c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
135d0 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20  TING_POINT).    
135e0 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66    if( pDb->zProf
135f0 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ile ){.        p
13600 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74  Db->interp = int
13610 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  erp;.        sql
13620 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 70 44 62  ite3_profile(pDb
13630 2d 3e 64 62 2c 20 44 62 50 72 6f 66 69 6c 65 48  ->db, DbProfileH
13640 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20  andler, pDb);.  
13650 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13660 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 66 69     sqlite3_profi
13670 6c 65 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30  le(pDb->db, 0, 0
13680 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
13690 66 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  f.    }.    brea
136a0 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
136b0 2a 20 20 20 20 20 24 64 62 20 72 65 6b 65 79 20  *     $db rekey 
136c0 4b 45 59 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 68  KEY.  **.  ** Ch
136d0 61 6e 67 65 20 74 68 65 20 65 6e 63 72 79 70 74  ange the encrypt
136e0 69 6f 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 63  ion key on the c
136f0 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 64 61  urrently open da
13700 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63  tabase..  */.  c
13710 61 73 65 20 44 42 5f 52 45 4b 45 59 3a 20 7b 0a  ase DB_REKEY: {.
13720 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
13730 53 5f 43 4f 44 45 43 0a 20 20 20 20 69 6e 74 20  S_CODEC.    int 
13740 6e 4b 65 79 3b 0a 20 20 20 20 76 6f 69 64 20 2a  nKey;.    void *
13750 70 4b 65 79 3b 0a 23 65 6e 64 69 66 0a 20 20 20  pKey;.#endif.   
13760 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
13770 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
13780 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
13790 2c 20 6f 62 6a 76 2c 20 22 4b 45 59 22 29 3b 0a  , objv, "KEY");.
137a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
137b0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 69  _ERROR;.    }.#i
137c0 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
137d0 43 4f 44 45 43 0a 20 20 20 20 70 4b 65 79 20 3d  CODEC.    pKey =
137e0 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61   Tcl_GetByteArra
137f0 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  yFromObj(objv[2]
13800 2c 20 26 6e 4b 65 79 29 3b 0a 20 20 20 20 72 63  , &nKey);.    rc
13810 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 6b 65 79   = sqlite3_rekey
13820 28 70 44 62 2d 3e 64 62 2c 20 70 4b 65 79 2c 20  (pDb->db, pKey, 
13830 6e 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20 72  nKey);.    if( r
13840 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  c ){.      Tcl_A
13850 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
13860 72 70 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 73  rp, sqlite3_errs
13870 74 72 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20  tr(rc), 0);.    
13880 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52    rc = TCL_ERROR
13890 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
138a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
138b0 20 2f 2a 20 20 20 20 24 64 62 20 72 65 73 74 6f   /*    $db resto
138c0 72 65 20 3f 44 41 54 41 42 41 53 45 3f 20 46 49  re ?DATABASE? FI
138d0 4c 45 4e 41 4d 45 0a 20 20 2a 2a 0a 20 20 2a 2a  LENAME.  **.  **
138e0 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73 65   Open a database
138f0 20 66 69 6c 65 20 6e 61 6d 65 64 20 46 49 4c 45   file named FILE
13900 4e 41 4d 45 2e 20 20 54 72 61 6e 73 66 65 72 20  NAME.  Transfer 
13910 74 68 65 20 63 6f 6e 74 65 6e 74 20 0a 20 20 2a  the content .  *
13920 2a 20 6f 66 20 46 49 4c 45 4e 41 4d 45 20 69 6e  * of FILENAME in
13930 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 64 61 74  to the local dat
13940 61 62 61 73 65 20 44 41 54 41 42 41 53 45 20 28  abase DATABASE (
13950 64 65 66 61 75 6c 74 3a 20 22 6d 61 69 6e 22 29  default: "main")
13960 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
13970 5f 52 45 53 54 4f 52 45 3a 20 7b 0a 20 20 20 20  _RESTORE: {.    
13980 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 72 63  const char *zSrc
13990 46 69 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  File;.    const 
139a0 63 68 61 72 20 2a 7a 44 65 73 74 44 62 3b 0a 20  char *zDestDb;. 
139b0 20 20 20 73 71 6c 69 74 65 33 20 2a 70 53 72 63     sqlite3 *pSrc
139c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61  ;.    sqlite3_ba
139d0 63 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b 0a 20  ckup *pBackup;. 
139e0 20 20 20 69 6e 74 20 6e 54 69 6d 65 6f 75 74 20     int nTimeout 
139f0 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 6f 62  = 0;..    if( ob
13a00 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 7a  jc==3 ){.      z
13a10 44 65 73 74 44 62 20 3d 20 22 6d 61 69 6e 22 3b  DestDb = "main";
13a20 0a 20 20 20 20 20 20 7a 53 72 63 46 69 6c 65 20  .      zSrcFile 
13a30 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
13a40 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 7d 65  objv[2]);.    }e
13a50 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20  lse if( objc==4 
13a60 29 7b 0a 20 20 20 20 20 20 7a 44 65 73 74 44 62  ){.      zDestDb
13a70 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
13a80 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 20  (objv[2]);.     
13a90 20 7a 53 72 63 46 69 6c 65 20 3d 20 54 63 6c 5f   zSrcFile = Tcl_
13aa0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33  GetString(objv[3
13ab0 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
13ac0 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
13ad0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
13ae0 20 6f 62 6a 76 2c 20 22 3f 44 41 54 41 42 41 53   objv, "?DATABAS
13af0 45 3f 20 46 49 4c 45 4e 41 4d 45 22 29 3b 0a 20  E? FILENAME");. 
13b00 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
13b10 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
13b20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70   rc = sqlite3_op
13b30 65 6e 5f 76 32 28 7a 53 72 63 46 69 6c 65 2c 20  en_v2(zSrcFile, 
13b40 26 70 53 72 63 2c 20 53 51 4c 49 54 45 5f 4f 50  &pSrc, SQLITE_OP
13b50 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c 20 30 29 3b  EN_READONLY, 0);
13b60 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
13b70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
13b80 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
13b90 28 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74  (interp, "cannot
13ba0 20 6f 70 65 6e 20 73 6f 75 72 63 65 20 64 61 74   open source dat
13bb0 61 62 61 73 65 3a 20 22 2c 0a 20 20 20 20 20 20  abase: ",.      
13bc0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72       sqlite3_err
13bd0 6d 73 67 28 70 53 72 63 29 2c 20 28 63 68 61 72  msg(pSrc), (char
13be0 2a 29 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  *)0);.      sqli
13bf0 74 65 33 5f 63 6c 6f 73 65 28 70 53 72 63 29 3b  te3_close(pSrc);
13c00 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
13c10 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
13c20 20 20 20 70 42 61 63 6b 75 70 20 3d 20 73 71 6c     pBackup = sql
13c30 69 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69 74  ite3_backup_init
13c40 28 70 44 62 2d 3e 64 62 2c 20 7a 44 65 73 74 44  (pDb->db, zDestD
13c50 62 2c 20 70 53 72 63 2c 20 22 6d 61 69 6e 22 29  b, pSrc, "main")
13c60 3b 0a 20 20 20 20 69 66 28 20 70 42 61 63 6b 75  ;.    if( pBacku
13c70 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63  p==0 ){.      Tc
13c80 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
13c90 6e 74 65 72 70 2c 20 22 72 65 73 74 6f 72 65 20  nterp, "restore 
13ca0 66 61 69 6c 65 64 3a 20 22 2c 0a 20 20 20 20 20  failed: ",.     
13cb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72        sqlite3_er
13cc0 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 28  rmsg(pDb->db), (
13cd0 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
13ce0 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 53  sqlite3_close(pS
13cf0 72 63 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  rc);.      retur
13d00 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
13d10 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 28 72   }.    while( (r
13d20 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  c = sqlite3_back
13d30 75 70 5f 73 74 65 70 28 70 42 61 63 6b 75 70 2c  up_step(pBackup,
13d40 31 30 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  100))==SQLITE_OK
13d50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  .              |
13d60 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  | rc==SQLITE_BUS
13d70 59 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72  Y ){.      if( r
13d80 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c==SQLITE_BUSY )
13d90 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 54  {.        if( nT
13da0 69 6d 65 6f 75 74 2b 2b 20 3e 3d 20 33 20 29 20  imeout++ >= 3 ) 
13db0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 73  break;.        s
13dc0 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 31 30 30  qlite3_sleep(100
13dd0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
13de0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63  .    sqlite3_bac
13df0 6b 75 70 5f 66 69 6e 69 73 68 28 70 42 61 63 6b  kup_finish(pBack
13e00 75 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  up);.    if( rc=
13e10 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
13e20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f        rc = TCL_O
13e30 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  K;.    }else if(
13e40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
13e50 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4c   || rc==SQLITE_L
13e60 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 20 20 54  OCKED ){.      T
13e70 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
13e80 69 6e 74 65 72 70 2c 20 22 72 65 73 74 6f 72 65  interp, "restore
13e90 20 66 61 69 6c 65 64 3a 20 73 6f 75 72 63 65 20   failed: source 
13ea0 64 61 74 61 62 61 73 65 20 62 75 73 79 22 2c 0a  database busy",.
13eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ec0 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 30 29         (char*)0)
13ed0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c  ;.      rc = TCL
13ee0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73  _ERROR;.    }els
13ef0 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  e{.      Tcl_App
13f00 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
13f10 2c 20 22 72 65 73 74 6f 72 65 20 66 61 69 6c 65  , "restore faile
13f20 64 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d: ",.          
13f30 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
13f40 70 44 62 2d 3e 64 62 29 2c 20 28 63 68 61 72 2a  pDb->db), (char*
13f50 29 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  )0);.      rc = 
13f60 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
13f70 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f  .    sqlite3_clo
13f80 73 65 28 70 53 72 63 29 3b 0a 20 20 20 20 62 72  se(pSrc);.    br
13f90 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
13fa0 20 2a 2a 20 20 20 20 20 24 64 62 20 73 74 61 74   **     $db stat
13fb0 75 73 20 28 73 74 65 70 7c 73 6f 72 74 7c 61 75  us (step|sort|au
13fc0 74 6f 69 6e 64 65 78 29 0a 20 20 2a 2a 0a 20 20  toindex).  **.  
13fd0 2a 2a 20 44 69 73 70 6c 61 79 20 53 51 4c 49 54  ** Display SQLIT
13fe0 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c  E_STMTSTATUS_FUL
13ff0 4c 53 43 41 4e 5f 53 54 45 50 20 6f 72 20 0a 20  LSCAN_STEP or . 
14000 20 2a 2a 20 53 51 4c 49 54 45 5f 53 54 4d 54 53   ** SQLITE_STMTS
14010 54 41 54 55 53 5f 53 4f 52 54 20 66 6f 72 20 74  TATUS_SORT for t
14020 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 65  he most recent e
14030 76 61 6c 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  val..  */.  case
14040 20 44 42 5f 53 54 41 54 55 53 3a 20 7b 0a 20 20   DB_STATUS: {.  
14050 20 20 69 6e 74 20 76 3b 0a 20 20 20 20 63 6f 6e    int v;.    con
14060 73 74 20 63 68 61 72 20 2a 7a 4f 70 3b 0a 20 20  st char *zOp;.  
14070 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
14080 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
14090 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
140a0 32 2c 20 6f 62 6a 76 2c 20 22 28 73 74 65 70 7c  2, objv, "(step|
140b0 73 6f 72 74 7c 61 75 74 6f 69 6e 64 65 78 29 22  sort|autoindex)"
140c0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
140d0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
140e0 0a 20 20 20 20 7a 4f 70 20 3d 20 54 63 6c 5f 47  .    zOp = Tcl_G
140f0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
14100 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  );.    if( strcm
14110 70 28 7a 4f 70 2c 20 22 73 74 65 70 22 29 3d 3d  p(zOp, "step")==
14120 30 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 70  0 ){.      v = p
14130 44 62 2d 3e 6e 53 74 65 70 3b 0a 20 20 20 20 7d  Db->nStep;.    }
14140 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
14150 7a 4f 70 2c 20 22 73 6f 72 74 22 29 3d 3d 30 20  zOp, "sort")==0 
14160 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 44 62  ){.      v = pDb
14170 2d 3e 6e 53 6f 72 74 3b 0a 20 20 20 20 7d 65 6c  ->nSort;.    }el
14180 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4f  se if( strcmp(zO
14190 70 2c 20 22 61 75 74 6f 69 6e 64 65 78 22 29 3d  p, "autoindex")=
141a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20  =0 ){.      v = 
141b0 70 44 62 2d 3e 6e 49 6e 64 65 78 3b 0a 20 20 20  pDb->nIndex;.   
141c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63   }else{.      Tc
141d0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
141e0 6e 74 65 72 70 2c 20 0a 20 20 20 20 20 20 20 20  nterp, .        
141f0 20 20 20 20 22 62 61 64 20 61 72 67 75 6d 65 6e      "bad argumen
14200 74 3a 20 73 68 6f 75 6c 64 20 62 65 20 61 75 74  t: should be aut
14210 6f 69 6e 64 65 78 2c 20 73 74 65 70 2c 20 6f 72  oindex, step, or
14220 20 73 6f 72 74 22 2c 20 0a 20 20 20 20 20 20 20   sort", .       
14230 20 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a       (char*)0);.
14240 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
14250 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
14260 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
14270 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
14280 65 77 49 6e 74 4f 62 6a 28 76 29 29 3b 0a 20 20  ewIntObj(v));.  
14290 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 0a    break;.  }.  .
142a0 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64    /*.  **     $d
142b0 62 20 74 69 6d 65 6f 75 74 20 4d 49 4c 4c 45 53  b timeout MILLES
142c0 45 43 4f 4e 44 53 0a 20 20 2a 2a 0a 20 20 2a 2a  ECONDS.  **.  **
142d0 20 44 65 6c 61 79 20 66 6f 72 20 74 68 65 20 6e   Delay for the n
142e0 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65  umber of millise
142f0 63 6f 6e 64 73 20 73 70 65 63 69 66 69 65 64 20  conds specified 
14300 77 68 65 6e 20 61 20 66 69 6c 65 20 69 73 20 6c  when a file is l
14310 6f 63 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61  ocked..  */.  ca
14320 73 65 20 44 42 5f 54 49 4d 45 4f 55 54 3a 20 7b  se DB_TIMEOUT: {
14330 0a 20 20 20 20 69 6e 74 20 6d 73 3b 0a 20 20 20  .    int ms;.   
14340 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
14350 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
14360 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
14370 2c 20 6f 62 6a 76 2c 20 22 4d 49 4c 4c 49 53 45  , objv, "MILLISE
14380 43 4f 4e 44 53 22 29 3b 0a 20 20 20 20 20 20 72  CONDS");.      r
14390 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
143a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 54  .    }.    if( T
143b0 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
143c0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
143d0 2c 20 26 6d 73 29 20 29 20 72 65 74 75 72 6e 20  , &ms) ) return 
143e0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73  TCL_ERROR;.    s
143f0 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65  qlite3_busy_time
14400 6f 75 74 28 70 44 62 2d 3e 64 62 2c 20 6d 73 29  out(pDb->db, ms)
14410 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
14420 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20  .  .  /*.  **   
14430 20 20 24 64 62 20 74 6f 74 61 6c 5f 63 68 61 6e    $db total_chan
14440 67 65 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  ges.  **.  ** Re
14450 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
14460 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 65 72  of rows that wer
14470 65 20 6d 6f 64 69 66 69 65 64 2c 20 69 6e 73 65  e modified, inse
14480 72 74 65 64 2c 20 6f 72 20 64 65 6c 65 74 65 64  rted, or deleted
14490 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65   .  ** since the
144a0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
144b0 20 77 61 73 20 63 72 65 61 74 65 64 2e 0a 20 20   was created..  
144c0 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54 4f 54  */.  case DB_TOT
144d0 41 4c 5f 43 48 41 4e 47 45 53 3a 20 7b 0a 20 20  AL_CHANGES: {.  
144e0 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75    Tcl_Obj *pResu
144f0 6c 74 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  lt;.    if( objc
14500 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=2 ){.      Tcl
14510 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
14520 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
14530 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
14540 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
14550 7d 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20  }.    pResult = 
14560 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_GetObjResult
14570 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63  (interp);.    Tc
14580 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52 65 73  l_SetIntObj(pRes
14590 75 6c 74 2c 20 73 71 6c 69 74 65 33 5f 74 6f 74  ult, sqlite3_tot
145a0 61 6c 5f 63 68 61 6e 67 65 73 28 70 44 62 2d 3e  al_changes(pDb->
145b0 64 62 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  db));.    break;
145c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
145d0 62 20 74 72 61 63 65 20 3f 43 41 4c 4c 42 41 43  b trace ?CALLBAC
145e0 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b  K?.  **.  ** Mak
145f0 65 20 61 72 72 61 6e 67 65 6d 65 6e 74 73 20 74  e arrangements t
14600 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 43 41 4c  o invoke the CAL
14610 4c 42 41 43 4b 20 72 6f 75 74 69 6e 65 20 66 6f  LBACK routine fo
14620 72 20 65 61 63 68 20 53 51 4c 20 73 74 61 74 65  r each SQL state
14630 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 61 74 20 69  ment.  ** that i
14640 73 20 65 78 65 63 75 74 65 64 2e 20 20 54 68 65  s executed.  The
14650 20 74 65 78 74 20 6f 66 20 74 68 65 20 53 51 4c   text of the SQL
14660 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20   is appended to 
14670 43 41 4c 4c 42 41 43 4b 20 62 65 66 6f 72 65 0a  CALLBACK before.
14680 20 20 2a 2a 20 69 74 20 69 73 20 65 78 65 63 75    ** it is execu
14690 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ted..  */.  case
146a0 20 44 42 5f 54 52 41 43 45 3a 20 7b 0a 20 20 20   DB_TRACE: {.   
146b0 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20   if( objc>3 ){. 
146c0 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
146d0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
146e0 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43   objv, "?CALLBAC
146f0 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  K?");.      retu
14700 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
14710 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63    }else if( objc
14720 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==2 ){.      if(
14730 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a   pDb->zTrace ){.
14740 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
14750 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
14760 20 70 44 62 2d 3e 7a 54 72 61 63 65 2c 20 30 29   pDb->zTrace, 0)
14770 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
14780 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20  lse{.      char 
14790 2a 7a 54 72 61 63 65 3b 0a 20 20 20 20 20 20 69  *zTrace;.      i
147a0 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66  nt len;.      if
147b0 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b  ( pDb->zTrace ){
147c0 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65  .        Tcl_Fre
147d0 65 28 70 44 62 2d 3e 7a 54 72 61 63 65 29 3b 0a  e(pDb->zTrace);.
147e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54        }.      zT
147f0 72 61 63 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  race = Tcl_GetSt
14800 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
14810 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20  [2], &len);.    
14820 20 20 69 66 28 20 7a 54 72 61 63 65 20 26 26 20    if( zTrace && 
14830 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  len>0 ){.       
14840 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 3d 20 54   pDb->zTrace = T
14850 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20  cl_Alloc( len + 
14860 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  1 );.        mem
14870 63 70 79 28 70 44 62 2d 3e 7a 54 72 61 63 65 2c  cpy(pDb->zTrace,
14880 20 7a 54 72 61 63 65 2c 20 6c 65 6e 2b 31 29 3b   zTrace, len+1);
14890 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
148a0 20 20 20 20 20 20 70 44 62 2d 3e 7a 54 72 61 63        pDb->zTrac
148b0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23  e = 0;.      }.#
148c0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
148d0 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26  TE_OMIT_TRACE) &
148e0 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
148f0 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
14900 50 4f 49 4e 54 29 0a 20 20 20 20 20 20 69 66 28  POINT).      if(
14910 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a   pDb->zTrace ){.
14920 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74          pDb->int
14930 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20  erp = interp;.  
14940 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 72        sqlite3_tr
14950 61 63 65 28 70 44 62 2d 3e 64 62 2c 20 44 62 54  ace(pDb->db, DbT
14960 72 61 63 65 48 61 6e 64 6c 65 72 2c 20 70 44 62  raceHandler, pDb
14970 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
14980 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
14990 74 72 61 63 65 28 70 44 62 2d 3e 64 62 2c 20 30  trace(pDb->db, 0
149a0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  , 0);.      }.#e
149b0 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 62  ndif.    }.    b
149c0 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
149d0 20 20 20 24 64 62 20 74 72 61 6e 73 61 63 74 69     $db transacti
149e0 6f 6e 20 5b 2d 64 65 66 65 72 72 65 64 7c 2d 69  on [-deferred|-i
149f0 6d 6d 65 64 69 61 74 65 7c 2d 65 78 63 6c 75 73  mmediate|-exclus
14a00 69 76 65 5d 20 53 43 52 49 50 54 0a 20 20 2a 2a  ive] SCRIPT.  **
14a10 0a 20 20 2a 2a 20 53 74 61 72 74 20 61 20 6e 65  .  ** Start a ne
14a20 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69  w transaction (i
14a30 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72  f we are not alr
14a40 65 61 64 79 20 69 6e 20 74 68 65 20 6d 69 64 73  eady in the mids
14a50 74 20 6f 66 20 61 0a 20 20 2a 2a 20 74 72 61 6e  t of a.  ** tran
14a60 73 61 63 74 69 6f 6e 29 20 61 6e 64 20 65 78 65  saction) and exe
14a70 63 75 74 65 20 74 68 65 20 54 43 4c 20 73 63 72  cute the TCL scr
14a80 69 70 74 20 53 43 52 49 50 54 2e 20 20 41 66 74  ipt SCRIPT.  Aft
14a90 65 72 20 53 43 52 49 50 54 0a 20 20 2a 2a 20 63  er SCRIPT.  ** c
14aa0 6f 6d 70 6c 65 74 65 73 2c 20 65 69 74 68 65 72  ompletes, either
14ab0 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   commit the tran
14ac0 73 61 63 74 69 6f 6e 20 6f 72 20 72 6f 6c 6c 20  saction or roll 
14ad0 69 74 20 62 61 63 6b 20 69 66 20 53 43 52 49 50  it back if SCRIP
14ae0 54 0a 20 20 2a 2a 20 74 68 72 6f 77 73 20 61 6e  T.  ** throws an
14af0 20 65 78 63 65 70 74 69 6f 6e 2e 20 20 4f 72 20   exception.  Or 
14b00 69 66 20 6e 6f 20 6e 65 77 20 74 72 61 6e 73 61  if no new transa
14b10 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64  tion was started
14b20 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 20 20  , do nothing..  
14b30 2a 2a 20 70 61 73 73 20 74 68 65 20 65 78 63 65  ** pass the exce
14b40 70 74 69 6f 6e 20 6f 6e 20 75 70 20 74 68 65 20  ption on up the 
14b50 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  stack..  **.  **
14b60 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 77 61   This command wa
14b70 73 20 69 6e 73 70 69 72 65 64 20 62 79 20 44 61  s inspired by Da
14b80 76 65 20 54 68 6f 6d 61 73 27 73 20 74 61 6c 6b  ve Thomas's talk
14b90 20 6f 6e 20 52 75 62 79 20 61 74 20 74 68 65 0a   on Ruby at the.
14ba0 20 20 2a 2a 20 32 30 30 35 20 4f 27 52 65 69 6c    ** 2005 O'Reil
14bb0 6c 79 20 4f 70 65 6e 20 53 6f 75 72 63 65 20 43  ly Open Source C
14bc0 6f 6e 76 65 6e 74 69 6f 6e 20 28 4f 53 43 4f 4e  onvention (OSCON
14bd0 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  )..  */.  case D
14be0 42 5f 54 52 41 4e 53 41 43 54 49 4f 4e 3a 20 7b  B_TRANSACTION: {
14bf0 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53  .    Tcl_Obj *pS
14c00 63 72 69 70 74 3b 0a 20 20 20 20 63 6f 6e 73 74  cript;.    const
14c10 20 63 68 61 72 20 2a 7a 42 65 67 69 6e 20 3d 20   char *zBegin = 
14c20 22 53 41 56 45 50 4f 49 4e 54 20 5f 74 63 6c 5f  "SAVEPOINT _tcl_
14c30 74 72 61 6e 73 61 63 74 69 6f 6e 22 3b 0a 20 20  transaction";.  
14c40 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26    if( objc!=3 &&
14c50 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
14c60 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
14c70 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
14c80 6a 76 2c 20 22 5b 54 59 50 45 5d 20 53 43 52 49  jv, "[TYPE] SCRI
14c90 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  PT");.      retu
14ca0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
14cb0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 44 62    }..    if( pDb
14cc0 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  ->nTransaction==
14cd0 30 20 26 26 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a  0 && objc==4 ){.
14ce0 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
14cf0 73 74 20 63 68 61 72 20 2a 54 54 59 50 45 5f 73  st char *TTYPE_s
14d00 74 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  trs[] = {.      
14d10 20 20 22 64 65 66 65 72 72 65 64 22 2c 20 20 20    "deferred",   
14d20 22 65 78 63 6c 75 73 69 76 65 22 2c 20 20 22 69  "exclusive",  "i
14d30 6d 6d 65 64 69 61 74 65 22 2c 20 30 0a 20 20 20  mmediate", 0.   
14d40 20 20 20 7d 3b 0a 20 20 20 20 20 20 65 6e 75 6d     };.      enum
14d50 20 54 54 59 50 45 5f 65 6e 75 6d 20 7b 0a 20 20   TTYPE_enum {.  
14d60 20 20 20 20 20 20 54 54 59 50 45 5f 44 45 46 45        TTYPE_DEFE
14d70 52 52 45 44 2c 20 54 54 59 50 45 5f 45 58 43 4c  RRED, TTYPE_EXCL
14d80 55 53 49 56 45 2c 20 54 54 59 50 45 5f 49 4d 4d  USIVE, TTYPE_IMM
14d90 45 44 49 41 54 45 0a 20 20 20 20 20 20 7d 3b 0a  EDIATE.      };.
14da0 20 20 20 20 20 20 69 6e 74 20 74 74 79 70 65 3b        int ttype;
14db0 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47  .      if( Tcl_G
14dc0 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69  etIndexFromObj(i
14dd0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
14de0 54 54 59 50 45 5f 73 74 72 73 2c 20 22 74 72 61  TTYPE_strs, "tra
14df0 6e 73 61 63 74 69 6f 6e 20 74 79 70 65 22 2c 0a  nsaction type",.
14e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
14e20 20 26 74 74 79 70 65 29 20 29 7b 0a 20 20 20 20   &ttype) ){.    
14e30 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
14e40 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
14e50 20 20 20 20 73 77 69 74 63 68 28 20 28 65 6e 75      switch( (enu
14e60 6d 20 54 54 59 50 45 5f 65 6e 75 6d 29 74 74 79  m TTYPE_enum)tty
14e70 70 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61  pe ){.        ca
14e80 73 65 20 54 54 59 50 45 5f 44 45 46 45 52 52 45  se TTYPE_DEFERRE
14e90 44 3a 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a  D:    /* no-op *
14ea0 2f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /;              
14eb0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
14ec0 20 20 63 61 73 65 20 54 54 59 50 45 5f 45 58 43    case TTYPE_EXC
14ed0 4c 55 53 49 56 45 3a 20 20 20 7a 42 65 67 69 6e  LUSIVE:   zBegin
14ee0 20 3d 20 22 42 45 47 49 4e 20 45 58 43 4c 55 53   = "BEGIN EXCLUS
14ef0 49 56 45 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  IVE";  break;.  
14f00 20 20 20 20 20 20 63 61 73 65 20 54 54 59 50 45        case TTYPE
14f10 5f 49 4d 4d 45 44 49 41 54 45 3a 20 20 20 7a 42  _IMMEDIATE:   zB
14f20 65 67 69 6e 20 3d 20 22 42 45 47 49 4e 20 49 4d  egin = "BEGIN IM
14f30 4d 45 44 49 41 54 45 22 3b 20 20 62 72 65 61 6b  MEDIATE";  break
14f40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14f50 20 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62      pScript = ob
14f60 6a 76 5b 6f 62 6a 63 2d 31 5d 3b 0a 0a 20 20 20  jv[objc-1];..   
14f70 20 2f 2a 20 52 75 6e 20 74 68 65 20 53 51 4c 69   /* Run the SQLi
14f80 74 65 20 42 45 47 49 4e 20 63 6f 6d 6d 61 6e 64  te BEGIN command
14f90 20 74 6f 20 6f 70 65 6e 20 61 20 74 72 61 6e 73   to open a trans
14fa0 61 63 74 69 6f 6e 20 6f 72 20 73 61 76 65 70 6f  action or savepo
14fb0 69 6e 74 2e 20 2a 2f 0a 20 20 20 20 70 44 62 2d  int. */.    pDb-
14fc0 3e 64 69 73 61 62 6c 65 41 75 74 68 2b 2b 3b 0a  >disableAuth++;.
14fd0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14fe0 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a  _exec(pDb->db, z
14ff0 42 65 67 69 6e 2c 20 30 2c 20 30 2c 20 30 29 3b  Begin, 0, 0, 0);
15000 0a 20 20 20 20 70 44 62 2d 3e 64 69 73 61 62 6c  .    pDb->disabl
15010 65 41 75 74 68 2d 2d 3b 0a 20 20 20 20 69 66 28  eAuth--;.    if(
15020 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
15030 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
15040 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
15050 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
15060 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20  pDb->db), 0);.  
15070 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
15080 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
15090 70 44 62 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pDb->nTransactio
150a0 6e 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  n++;..    /* If 
150b0 75 73 69 6e 67 20 4e 52 45 2c 20 73 63 68 65 64  using NRE, sched
150c0 75 6c 65 20 61 20 63 61 6c 6c 62 61 63 6b 20 74  ule a callback t
150d0 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 73 63 72  o invoke the scr
150e0 69 70 74 20 70 53 63 72 69 70 74 2c 20 74 68 65  ipt pScript, the
150f0 6e 0a 20 20 20 20 2a 2a 20 61 20 73 65 63 6f 6e  n.    ** a secon
15100 64 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 63 6f  d callback to co
15110 6d 6d 69 74 20 28 6f 72 20 72 6f 6c 6c 62 61 63  mmit (or rollbac
15120 6b 29 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  k) the transacti
15130 6f 6e 20 6f 72 20 73 61 76 65 70 6f 69 6e 74 0a  on or savepoint.
15140 20 20 20 20 2a 2a 20 6f 70 65 6e 65 64 20 61 62      ** opened ab
15150 6f 76 65 2e 20 49 66 20 6e 6f 74 20 75 73 69 6e  ove. If not usin
15160 67 20 4e 52 45 2c 20 65 76 61 6c 75 61 74 65 20  g NRE, evaluate 
15170 74 68 65 20 73 63 72 69 70 74 20 64 69 72 65 63  the script direc
15180 74 6c 79 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  tly, then.    **
15190 20 63 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 20 44   call function D
151a0 62 54 72 61 6e 73 50 6f 73 74 43 6d 64 28 29 20  bTransPostCmd() 
151b0 74 6f 20 63 6f 6d 6d 69 74 20 28 6f 72 20 72 6f  to commit (or ro
151c0 6c 6c 62 61 63 6b 29 20 74 68 65 20 74 72 61 6e  llback) the tran
151d0 73 61 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20  saction .    ** 
151e0 6f 72 20 73 61 76 65 70 6f 69 6e 74 2e 20 20 2a  or savepoint.  *
151f0 2f 0a 20 20 20 20 69 66 28 20 44 62 55 73 65 4e  /.    if( DbUseN
15200 72 65 28 29 20 29 7b 0a 20 20 20 20 20 20 54 63  re() ){.      Tc
15210 6c 5f 4e 52 41 64 64 43 61 6c 6c 62 61 63 6b 28  l_NRAddCallback(
15220 69 6e 74 65 72 70 2c 20 44 62 54 72 61 6e 73 50  interp, DbTransP
15230 6f 73 74 43 6d 64 2c 20 63 64 2c 20 30 2c 20 30  ostCmd, cd, 0, 0
15240 2c 20 30 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f  , 0);.      Tcl_
15250 4e 52 45 76 61 6c 4f 62 6a 28 69 6e 74 65 72 70  NREvalObj(interp
15260 2c 20 70 53 63 72 69 70 74 2c 20 30 29 3b 0a 20  , pScript, 0);. 
15270 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15280 72 63 20 3d 20 44 62 54 72 61 6e 73 50 6f 73 74  rc = DbTransPost
15290 43 6d 64 28 26 63 64 2c 20 69 6e 74 65 72 70 2c  Cmd(&cd, interp,
152a0 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69   Tcl_EvalObjEx(i
152b0 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20  nterp, pScript, 
152c0 30 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  0));.    }.    b
152d0 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
152e0 20 20 2a 2a 20 20 20 20 24 64 62 20 75 6e 6c 6f    **    $db unlo
152f0 63 6b 5f 6e 6f 74 69 66 79 20 3f 73 63 72 69 70  ck_notify ?scrip
15300 74 3f 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  t?.  */.  case D
15310 42 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 3a  B_UNLOCK_NOTIFY:
15320 20 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   {.#ifndef SQLIT
15330 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f  E_ENABLE_UNLOCK_
15340 4e 4f 54 49 46 59 0a 20 20 20 20 54 63 6c 5f 41  NOTIFY.    Tcl_A
15350 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
15360 72 70 2c 20 22 75 6e 6c 6f 63 6b 5f 6e 6f 74 69  rp, "unlock_noti
15370 66 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  fy not available
15380 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64 22 2c   in this build",
15390 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 54 43   0);.    rc = TC
153a0 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20  L_ERROR;.#else. 
153b0 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26     if( objc!=2 &
153c0 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  & objc!=3 ){.   
153d0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
153e0 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
153f0 62 6a 76 2c 20 22 3f 53 43 52 49 50 54 3f 22 29  bjv, "?SCRIPT?")
15400 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c  ;.      rc = TCL
15410 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73  _ERROR;.    }els
15420 65 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 28 2a  e{.      void (*
15430 78 4e 6f 74 69 66 79 29 28 76 6f 69 64 20 2a 2a  xNotify)(void **
15440 2c 20 69 6e 74 29 20 3d 20 30 3b 0a 20 20 20 20  , int) = 0;.    
15450 20 20 76 6f 69 64 20 2a 70 4e 6f 74 69 66 79 41    void *pNotifyA
15460 72 67 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69  rg = 0;..      i
15470 66 28 20 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e  f( pDb->pUnlockN
15480 6f 74 69 66 79 20 29 7b 0a 20 20 20 20 20 20 20  otify ){.       
15490 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
154a0 74 28 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f  t(pDb->pUnlockNo
154b0 74 69 66 79 29 3b 0a 20 20 20 20 20 20 20 20 70  tify);.        p
154c0 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66  Db->pUnlockNotif
154d0 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  y = 0;.      }. 
154e0 20 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63   .      if( objc
154f0 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 78  ==3 ){.        x
15500 4e 6f 74 69 66 79 20 3d 20 44 62 55 6e 6c 6f 63  Notify = DbUnloc
15510 6b 4e 6f 74 69 66 79 3b 0a 20 20 20 20 20 20 20  kNotify;.       
15520 20 70 4e 6f 74 69 66 79 41 72 67 20 3d 20 28 76   pNotifyArg = (v
15530 6f 69 64 20 2a 29 70 44 62 3b 0a 20 20 20 20 20  oid *)pDb;.     
15540 20 20 20 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e     pDb->pUnlockN
15550 6f 74 69 66 79 20 3d 20 6f 62 6a 76 5b 32 5d 3b  otify = objv[2];
15560 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63  .        Tcl_Inc
15570 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70  rRefCount(pDb->p
15580 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 29 3b 0a 20  UnlockNotify);. 
15590 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
155a0 69 66 28 20 73 71 6c 69 74 65 33 5f 75 6e 6c 6f  if( sqlite3_unlo
155b0 63 6b 5f 6e 6f 74 69 66 79 28 70 44 62 2d 3e 64  ck_notify(pDb->d
155c0 62 2c 20 78 4e 6f 74 69 66 79 2c 20 70 4e 6f 74  b, xNotify, pNot
155d0 69 66 79 41 72 67 29 20 29 7b 0a 20 20 20 20 20  ifyArg) ){.     
155e0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
155f0 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69  ult(interp, sqli
15600 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
15610 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  db), 0);.       
15620 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b   rc = TCL_ERROR;
15630 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
15640 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b  endif.    break;
15650 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
15660 20 20 20 24 64 62 20 77 61 6c 5f 68 6f 6f 6b 20     $db wal_hook 
15670 3f 73 63 72 69 70 74 3f 0a 20 20 2a 2a 20 20 20  ?script?.  **   
15680 20 24 64 62 20 75 70 64 61 74 65 5f 68 6f 6f 6b   $db update_hook
15690 20 3f 73 63 72 69 70 74 3f 0a 20 20 2a 2a 20 20   ?script?.  **  
156a0 20 20 24 64 62 20 72 6f 6c 6c 62 61 63 6b 5f 68    $db rollback_h
156b0 6f 6f 6b 20 3f 73 63 72 69 70 74 3f 0a 20 20 2a  ook ?script?.  *
156c0 2f 0a 20 20 63 61 73 65 20 44 42 5f 57 41 4c 5f  /.  case DB_WAL_
156d0 48 4f 4f 4b 3a 20 0a 20 20 63 61 73 65 20 44 42  HOOK: .  case DB
156e0 5f 55 50 44 41 54 45 5f 48 4f 4f 4b 3a 20 0a 20  _UPDATE_HOOK: . 
156f0 20 63 61 73 65 20 44 42 5f 52 4f 4c 4c 42 41 43   case DB_ROLLBAC
15700 4b 5f 48 4f 4f 4b 3a 20 7b 0a 0a 20 20 20 20 2f  K_HOOK: {..    /
15710 2a 20 73 65 74 20 70 70 48 6f 6f 6b 20 74 6f 20  * set ppHook to 
15720 70 6f 69 6e 74 20 61 74 20 70 55 70 64 61 74 65  point at pUpdate
15730 48 6f 6f 6b 20 6f 72 20 70 52 6f 6c 6c 62 61 63  Hook or pRollbac
15740 6b 48 6f 6f 6b 2c 20 64 65 70 65 6e 64 69 6e 67  kHook, depending
15750 20 6f 6e 20 0a 20 20 20 20 2a 2a 20 77 68 65 74   on .    ** whet
15760 68 65 72 20 5b 24 64 62 20 75 70 64 61 74 65 5f  her [$db update_
15770 68 6f 6f 6b 5d 20 6f 72 20 5b 24 64 62 20 72 6f  hook] or [$db ro
15780 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 5d 20 77 61 73  llback_hook] was
15790 20 69 6e 76 6f 6b 65 64 2e 0a 20 20 20 20 2a 2f   invoked..    */
157a0 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 70  .    Tcl_Obj **p
157b0 70 48 6f 6f 6b 3b 20 0a 20 20 20 20 69 66 28 20  pHook; .    if( 
157c0 63 68 6f 69 63 65 3d 3d 44 42 5f 55 50 44 41 54  choice==DB_UPDAT
157d0 45 5f 48 4f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  E_HOOK ){.      
157e0 70 70 48 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e 70  ppHook = &pDb->p
157f0 55 70 64 61 74 65 48 6f 6f 6b 3b 0a 20 20 20 20  UpdateHook;.    
15800 7d 65 6c 73 65 20 69 66 28 20 63 68 6f 69 63 65  }else if( choice
15810 3d 3d 44 42 5f 57 41 4c 5f 48 4f 4f 4b 20 29 7b  ==DB_WAL_HOOK ){
15820 0a 20 20 20 20 20 20 70 70 48 6f 6f 6b 20 3d 20  .      ppHook = 
15830 26 70 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 3b 0a  &pDb->pWalHook;.
15840 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15850 20 70 70 48 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e   ppHook = &pDb->
15860 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3b 0a 20  pRollbackHook;. 
15870 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62     }..    if( ob
15880 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33  jc!=2 && objc!=3
15890 20 29 7b 0a 20 20 20 20 20 20 20 54 63 6c 5f 57   ){.       Tcl_W
158a0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
158b0 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 53  rp, 2, objv, "?S
158c0 43 52 49 50 54 3f 22 29 3b 0a 20 20 20 20 20 20  CRIPT?");.      
158d0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
158e0 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  R;.    }.    if(
158f0 20 2a 70 70 48 6f 6f 6b 20 29 7b 0a 20 20 20 20   *ppHook ){.    
15900 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
15910 6c 74 28 69 6e 74 65 72 70 2c 20 2a 70 70 48 6f  lt(interp, *ppHo
15920 6f 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  ok);.      if( o
15930 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc==3 ){.      
15940 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
15950 6e 74 28 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20  nt(*ppHook);.   
15960 20 20 20 20 20 2a 70 70 48 6f 6f 6b 20 3d 20 30       *ppHook = 0
15970 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
15980 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20      if( objc==3 
15990 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
159a0 20 21 28 2a 70 70 48 6f 6f 6b 29 20 29 3b 0a 20   !(*ppHook) );. 
159b0 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74       if( Tcl_Get
159c0 43 68 61 72 4c 65 6e 67 74 68 28 6f 62 6a 76 5b  CharLength(objv[
159d0 32 5d 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  2])>0 ){.       
159e0 20 2a 70 70 48 6f 6f 6b 20 3d 20 6f 62 6a 76 5b   *ppHook = objv[
159f0 32 5d 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  2];.        Tcl_
15a00 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 2a 70 70  IncrRefCount(*pp
15a10 48 6f 6f 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Hook);.      }. 
15a20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65     }..    sqlite
15a30 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28 70 44  3_update_hook(pD
15a40 62 2d 3e 64 62 2c 20 28 70 44 62 2d 3e 70 55 70  b->db, (pDb->pUp
15a50 64 61 74 65 48 6f 6f 6b 3f 44 62 55 70 64 61 74  dateHook?DbUpdat
15a60 65 48 61 6e 64 6c 65 72 3a 30 29 2c 20 70 44 62  eHandler:0), pDb
15a70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  );.    sqlite3_r
15a80 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28 70 44 62  ollback_hook(pDb
15a90 2d 3e 64 62 2c 28 70 44 62 2d 3e 70 52 6f 6c 6c  ->db,(pDb->pRoll
15aa0 62 61 63 6b 48 6f 6f 6b 3f 44 62 52 6f 6c 6c 62  backHook?DbRollb
15ab0 61 63 6b 48 61 6e 64 6c 65 72 3a 30 29 2c 70 44  ackHandler:0),pD
15ac0 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  b);.    sqlite3_
15ad0 77 61 6c 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62  wal_hook(pDb->db
15ae0 2c 28 70 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 3f  ,(pDb->pWalHook?
15af0 44 62 57 61 6c 48 61 6e 64 6c 65 72 3a 30 29 2c  DbWalHandler:0),
15b00 70 44 62 29 3b 0a 0a 20 20 20 20 62 72 65 61 6b  pDb);..    break
15b10 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24  ;.  }..  /*    $
15b20 64 62 20 76 65 72 73 69 6f 6e 0a 20 20 2a 2a 0a  db version.  **.
15b30 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20    ** Return the 
15b40 76 65 72 73 69 6f 6e 20 73 74 72 69 6e 67 20 66  version string f
15b50 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65  or this database
15b60 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
15b70 5f 56 45 52 53 49 4f 4e 3a 20 7b 0a 20 20 20 20  _VERSION: {.    
15b80 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
15b90 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71  terp, (char *)sq
15ba0 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e  lite3_libversion
15bb0 28 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  (), TCL_STATIC);
15bc0 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
15bd0 0a 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 6f 66 20  ..  } /* End of 
15be0 74 68 65 20 53 57 49 54 43 48 20 73 74 61 74 65  the SWITCH state
15bf0 6d 65 6e 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e  ment */.  return
15c00 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49   rc;.}..#if SQLI
15c10 54 45 5f 54 43 4c 5f 4e 52 45 0a 2f 2a 0a 2a 2a  TE_TCL_NRE./*.**
15c20 20 41 64 61 70 74 6f 72 20 74 68 61 74 20 70 72   Adaptor that pr
15c30 6f 76 69 64 65 73 20 61 6e 20 6f 62 6a 43 6d 64  ovides an objCmd
15c40 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20 74 68   interface to th
15c50 65 20 4e 52 45 2d 65 6e 61 62 6c 65 64 0a 2a 2a  e NRE-enabled.**
15c60 20 69 6e 74 65 72 66 61 63 65 20 69 6d 70 6c 65   interface imple
15c70 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  mentation..*/.st
15c80 61 74 69 63 20 69 6e 74 20 44 62 4f 62 6a 43 6d  atic int DbObjCm
15c90 64 41 64 61 70 74 6f 72 28 0a 20 20 76 6f 69 64  dAdaptor(.  void
15ca0 20 2a 63 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65   *cd,.  Tcl_Inte
15cb0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
15cc0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
15cd0 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 0a 29 7b  j *const*objv.){
15ce0 0a 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 52  .  return Tcl_NR
15cf0 43 61 6c 6c 4f 62 6a 50 72 6f 63 28 69 6e 74 65  CallObjProc(inte
15d00 72 70 2c 20 44 62 4f 62 6a 43 6d 64 2c 20 63 64  rp, DbObjCmd, cd
15d10 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a 7d  , objc, objv);.}
15d20 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
15d30 45 5f 54 43 4c 5f 4e 52 45 20 2a 2f 0a 0a 2f 2a  E_TCL_NRE */../*
15d40 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 20 44 42  .**   sqlite3 DB
15d50 4e 41 4d 45 20 46 49 4c 45 4e 41 4d 45 20 3f 2d  NAME FILENAME ?-
15d60 76 66 73 20 56 46 53 4e 41 4d 45 3f 20 3f 2d 6b  vfs VFSNAME? ?-k
15d70 65 79 20 4b 45 59 3f 20 3f 2d 72 65 61 64 6f 6e  ey KEY? ?-readon
15d80 6c 79 20 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a 20 20  ly BOOLEAN?.**  
15d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15da0 20 20 20 20 20 20 20 20 20 3f 2d 63 72 65 61 74           ?-creat
15db0 65 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 6e 6f 6d  e BOOLEAN? ?-nom
15dc0 75 74 65 78 20 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a  utex BOOLEAN?.**
15dd0 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
15de0 6d 61 69 6e 20 54 63 6c 20 63 6f 6d 6d 61 6e 64  main Tcl command
15df0 2e 20 20 57 68 65 6e 20 74 68 65 20 22 73 71 6c  .  When the "sql
15e00 69 74 65 22 20 54 63 6c 20 63 6f 6d 6d 61 6e 64  ite" Tcl command
15e10 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2c 20   is.** invoked, 
15e20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e  this routine run
15e30 73 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 61  s to process tha
15e40 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  t command..**.**
15e50 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
15e60 65 6e 74 2c 20 44 42 4e 41 4d 45 2c 20 69 73 20  ent, DBNAME, is 
15e70 61 6e 20 61 72 62 69 74 72 61 72 79 20 6e 61 6d  an arbitrary nam
15e80 65 20 66 6f 72 20 61 20 6e 65 77 0a 2a 2a 20 64  e for a new.** d
15e90 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
15ea0 6f 6e 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e  on.  This comman
15eb0 64 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 20  d creates a new 
15ec0 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64 0a 2a 2a  command named.**
15ed0 20 44 42 4e 41 4d 45 20 74 68 61 74 20 69 73 20   DBNAME that is 
15ee0 75 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20  used to control 
15ef0 74 68 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  that connection.
15f00 20 20 54 68 65 20 64 61 74 61 62 61 73 65 0a 2a    The database.*
15f10 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  * connection is 
15f20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65  deleted when the
15f30 20 44 42 4e 41 4d 45 20 63 6f 6d 6d 61 6e 64 20   DBNAME command 
15f40 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a  is deleted..**.*
15f50 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67  * The second arg
15f60 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d  ument is the nam
15f70 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
15f80 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74  e file..**.*/.st
15f90 61 74 69 63 20 69 6e 74 20 44 62 4d 61 69 6e 28  atic int DbMain(
15fa0 76 6f 69 64 20 2a 63 64 2c 20 54 63 6c 5f 49 6e  void *cd, Tcl_In
15fb0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
15fc0 74 20 6f 62 6a 63 2c 54 63 6c 5f 4f 62 6a 20 2a  t objc,Tcl_Obj *
15fd0 63 6f 6e 73 74 2a 6f 62 6a 76 29 7b 0a 20 20 53  const*objv){.  S
15fe0 71 6c 69 74 65 44 62 20 2a 70 3b 0a 20 20 63 6f  qliteDb *p;.  co
15ff0 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 3b 0a  nst char *zArg;.
16000 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 3b    char *zErrMsg;
16010 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73  .  int i;.  cons
16020 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20  t char *zFile;. 
16030 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66   const char *zVf
16040 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 66 6c 61  s = 0;.  int fla
16050 67 73 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  gs;.  Tcl_DStrin
16060 67 20 74 72 61 6e 73 6c 61 74 65 64 46 69 6c 65  g translatedFile
16070 6e 61 6d 65 3b 0a 23 69 66 64 65 66 20 53 51 4c  name;.#ifdef SQL
16080 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
16090 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20 30 3b 0a  void *pKey = 0;.
160a0 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 30 3b 0a    int nKey = 0;.
160b0 23 65 6e 64 69 66 0a 20 20 69 6e 74 20 72 63 3b  #endif.  int rc;
160c0 0a 0a 20 20 2f 2a 20 49 6e 20 6e 6f 72 6d 61 6c  ..  /* In normal
160d0 20 75 73 65 2c 20 65 61 63 68 20 54 43 4c 20 69   use, each TCL i
160e0 6e 74 65 72 70 72 65 74 65 72 20 72 75 6e 73 20  nterpreter runs 
160f0 69 6e 20 61 20 73 69 6e 67 6c 65 20 74 68 72 65  in a single thre
16100 61 64 2e 20 20 53 6f 0a 20 20 2a 2a 20 62 79 20  ad.  So.  ** by 
16110 64 65 66 61 75 6c 74 2c 20 77 65 20 63 61 6e 20  default, we can 
16120 74 75 72 6e 20 6f 66 20 6d 75 74 65 78 69 6e 67  turn of mutexing
16130 20 6f 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62   on SQLite datab
16140 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e  ase connections.
16150 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 2c 20 66  .  ** However, f
16160 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f  or testing purpo
16170 73 65 73 20 69 74 20 69 73 20 75 73 65 66 75 6c  ses it is useful
16180 20 74 6f 20 68 61 76 65 20 6d 75 74 65 78 65 73   to have mutexes
16190 20 74 75 72 6e 65 64 0a 20 20 2a 2a 20 6f 6e 2e   turned.  ** on.
161a0 20 20 53 6f 2c 20 62 79 20 64 65 66 61 75 6c 74    So, by default
161b0 2c 20 6d 75 74 65 78 65 73 20 64 65 66 61 75 6c  , mutexes defaul
161c0 74 20 6f 66 66 2e 20 20 42 75 74 20 69 66 20 63  t off.  But if c
161d0 6f 6d 70 69 6c 65 64 20 77 69 74 68 0a 20 20 2a  ompiled with.  *
161e0 2a 20 53 51 4c 49 54 45 5f 54 43 4c 5f 44 45 46  * SQLITE_TCL_DEF
161f0 41 55 4c 54 5f 46 55 4c 4c 4d 55 54 45 58 20 74  AULT_FULLMUTEX t
16200 68 65 6e 20 6d 75 74 65 78 65 73 20 64 65 66 61  hen mutexes defa
16210 75 6c 74 20 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66  ult on..  */.#if
16220 64 65 66 20 53 51 4c 49 54 45 5f 54 43 4c 5f 44  def SQLITE_TCL_D
16230 45 46 41 55 4c 54 5f 46 55 4c 4c 4d 55 54 45 58  EFAULT_FULLMUTEX
16240 0a 20 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54  .  flags = SQLIT
16250 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
16260 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
16270 52 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  REATE | SQLITE_O
16280 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a 23  PEN_FULLMUTEX;.#
16290 65 6c 73 65 0a 20 20 66 6c 61 67 73 20 3d 20 53  else.  flags = S
162a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
162b0 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
162c0 45 4e 5f 43 52 45 41 54 45 20 7c 20 53 51 4c 49  EN_CREATE | SQLI
162d0 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b  TE_OPEN_NOMUTEX;
162e0 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6f  .#endif..  if( o
162f0 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a 41  bjc==2 ){.    zA
16300 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  rg = Tcl_GetStri
16310 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31  ngFromObj(objv[1
16320 5d 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 73  ], 0);.    if( s
16330 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 76 65 72  trcmp(zArg,"-ver
16340 73 69 6f 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20  sion")==0 ){.   
16350 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
16360 75 6c 74 28 69 6e 74 65 72 70 2c 73 71 6c 69 74  ult(interp,sqlit
16370 65 33 5f 76 65 72 73 69 6f 6e 2c 30 29 3b 0a 20  e3_version,0);. 
16380 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
16390 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OK;.    }.    if
163a0 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d  ( strcmp(zArg,"-
163b0 68 61 73 2d 63 6f 64 65 63 22 29 3d 3d 30 20 29  has-codec")==0 )
163c0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
163d0 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 20 20  HAS_CODEC.      
163e0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
163f0 28 69 6e 74 65 72 70 2c 22 31 22 2c 30 29 3b 0a  (interp,"1",0);.
16400 23 65 6c 73 65 0a 20 20 20 20 20 20 54 63 6c 5f  #else.      Tcl_
16410 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
16420 65 72 70 2c 22 30 22 2c 30 29 3b 0a 23 65 6e 64  erp,"0",0);.#end
16430 69 66 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  if.      return 
16440 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  TCL_OK;.    }.  
16450 7d 0a 20 20 66 6f 72 28 69 3d 33 3b 20 69 2b 31  }.  for(i=3; i+1
16460 3c 6f 62 6a 63 3b 20 69 2b 3d 32 29 7b 0a 20 20  <objc; i+=2){.  
16470 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65 74    zArg = Tcl_Get
16480 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69 5d 29 3b  String(objv[i]);
16490 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
164a0 7a 41 72 67 2c 22 2d 6b 65 79 22 29 3d 3d 30 20  zArg,"-key")==0 
164b0 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
164c0 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 20  _HAS_CODEC.     
164d0 20 70 4b 65 79 20 3d 20 54 63 6c 5f 47 65 74 42   pKey = Tcl_GetB
164e0 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28  yteArrayFromObj(
164f0 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 6e 4b 65 79  objv[i+1], &nKey
16500 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65  );.#endif.    }e
16510 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
16520 41 72 67 2c 20 22 2d 76 66 73 22 29 3d 3d 30 20  Arg, "-vfs")==0 
16530 29 7b 0a 20 20 20 20 20 20 7a 56 66 73 20 3d 20  ){.      zVfs = 
16540 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
16550 6a 76 5b 69 2b 31 5d 29 3b 0a 20 20 20 20 7d 65  jv[i+1]);.    }e
16560 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
16570 41 72 67 2c 20 22 2d 72 65 61 64 6f 6e 6c 79 22  Arg, "-readonly"
16580 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
16590 74 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20 54  t b;.      if( T
165a0 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
165b0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
165c0 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20 72 65  v[i+1], &b) ) re
165d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
165e0 20 20 20 20 20 20 69 66 28 20 62 20 29 7b 0a 20        if( b ){. 
165f0 20 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20         flags &= 
16600 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  ~(SQLITE_OPEN_RE
16610 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
16620 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 20  PEN_CREATE);.   
16630 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51       flags |= SQ
16640 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
16650 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  LY;.      }else{
16660 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 26  .        flags &
16670 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  = ~SQLITE_OPEN_R
16680 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20  EADONLY;.       
16690 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45   flags |= SQLITE
166a0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 3b  _OPEN_READWRITE;
166b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
166c0 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41  se if( strcmp(zA
166d0 72 67 2c 20 22 2d 63 72 65 61 74 65 22 29 3d 3d  rg, "-create")==
166e0 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62  0 ){.      int b
166f0 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f  ;.      if( Tcl_
16700 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62  GetBooleanFromOb
16710 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69  j(interp, objv[i
16720 2b 31 5d 2c 20 26 62 29 20 29 20 72 65 74 75 72  +1], &b) ) retur
16730 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
16740 20 20 20 69 66 28 20 62 20 26 26 20 28 66 6c 61     if( b && (fla
16750 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
16760 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d 30 20 29 7b  _READONLY)==0 ){
16770 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c  .        flags |
16780 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  = SQLITE_OPEN_CR
16790 45 41 54 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  EATE;.      }els
167a0 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  e{.        flags
167b0 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e   &= ~SQLITE_OPEN
167c0 5f 43 52 45 41 54 45 3b 0a 20 20 20 20 20 20 7d  _CREATE;.      }
167d0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
167e0 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d 6e 6f  trcmp(zArg, "-no
167f0 6d 75 74 65 78 22 29 3d 3d 30 20 29 7b 0a 20 20  mutex")==0 ){.  
16800 20 20 20 20 69 6e 74 20 62 3b 0a 20 20 20 20 20      int b;.     
16810 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c   if( Tcl_GetBool
16820 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
16830 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 62  p, objv[i+1], &b
16840 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
16850 52 52 4f 52 3b 0a 20 20 20 20 20 20 69 66 28 20  RROR;.      if( 
16860 62 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61  b ){.        fla
16870 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
16880 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 20 20 20 20 20  N_NOMUTEX;.     
16890 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c     flags &= ~SQL
168a0 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54  ITE_OPEN_FULLMUT
168b0 45 58 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EX;.      }else{
168c0 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 26  .        flags &
168d0 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e  = ~SQLITE_OPEN_N
168e0 4f 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 7d 0a  OMUTEX;.      }.
168f0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
16900 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d 66 75 6c  rcmp(zArg, "-ful
16910 6c 6d 75 74 65 78 22 29 3d 3d 30 20 29 7b 0a 20  lmutex")==0 ){. 
16920 20 20 20 20 20 69 6e 74 20 62 3b 0a 20 20 20 20       int b;.    
16930 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f    if( Tcl_GetBoo
16940 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
16950 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26  rp, objv[i+1], &
16960 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
16970 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 69 66 28  ERROR;.      if(
16980 20 62 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c   b ){.        fl
16990 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50  ags |= SQLITE_OP
169a0 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a 20 20  EN_FULLMUTEX;.  
169b0 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e        flags &= ~
169c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55  SQLITE_OPEN_NOMU
169d0 54 45 58 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  TEX;.      }else
169e0 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  {.        flags 
169f0 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  &= ~SQLITE_OPEN_
16a00 46 55 4c 4c 4d 55 54 45 58 3b 0a 20 20 20 20 20  FULLMUTEX;.     
16a10 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
16a20 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d   strcmp(zArg, "-
16a30 75 72 69 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  uri")==0 ){.    
16a40 20 20 69 6e 74 20 62 3b 0a 20 20 20 20 20 20 69    int b;.      i
16a50 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61  f( Tcl_GetBoolea
16a60 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  nFromObj(interp,
16a70 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 62 29 20   objv[i+1], &b) 
16a80 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
16a90 4f 52 3b 0a 20 20 20 20 20 20 69 66 28 20 62 20  OR;.      if( b 
16aa0 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  ){.        flags
16ab0 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   |= SQLITE_OPEN_
16ac0 55 52 49 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  URI;.      }else
16ad0 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  {.        flags 
16ae0 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  &= ~SQLITE_OPEN_
16af0 55 52 49 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  URI;.      }.   
16b00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63   }else{.      Tc
16b10 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
16b20 6e 74 65 72 70 2c 20 22 75 6e 6b 6e 6f 77 6e 20  nterp, "unknown 
16b30 6f 70 74 69 6f 6e 3a 20 22 2c 20 7a 41 72 67 2c  option: ", zArg,
16b40 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
16b50 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
16b60 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OR;.    }.  }.  
16b70 69 66 28 20 6f 62 6a 63 3c 33 20 7c 7c 20 28 6f  if( objc<3 || (o
16b80 62 6a 63 26 31 29 21 3d 31 20 29 7b 0a 20 20 20  bjc&1)!=1 ){.   
16b90 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
16ba0 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
16bb0 76 2c 20 0a 20 20 20 20 20 20 22 48 41 4e 44 4c  v, .      "HANDL
16bc0 45 20 46 49 4c 45 4e 41 4d 45 20 3f 2d 76 66 73  E FILENAME ?-vfs
16bd0 20 56 46 53 4e 41 4d 45 3f 20 3f 2d 72 65 61 64   VFSNAME? ?-read
16be0 6f 6e 6c 79 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d  only BOOLEAN? ?-
16bf0 63 72 65 61 74 65 20 42 4f 4f 4c 45 41 4e 3f 22  create BOOLEAN?"
16c00 0a 20 20 20 20 20 20 22 20 3f 2d 6e 6f 6d 75 74  .      " ?-nomut
16c10 65 78 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 66 75  ex BOOLEAN? ?-fu
16c20 6c 6c 6d 75 74 65 78 20 42 4f 4f 4c 45 41 4e 3f  llmutex BOOLEAN?
16c30 20 3f 2d 75 72 69 20 42 4f 4f 4c 45 41 4e 3f 22   ?-uri BOOLEAN?"
16c40 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
16c50 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 20 20 22  AS_CODEC.      "
16c60 20 3f 2d 6b 65 79 20 43 4f 44 45 43 4b 45 59 3f   ?-key CODECKEY?
16c70 22 0a 23 65 6e 64 69 66 0a 20 20 20 20 29 3b 0a  ".#endif.    );.
16c80 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
16c90 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 45 72 72  RROR;.  }.  zErr
16ca0 4d 73 67 20 3d 20 30 3b 0a 20 20 70 20 3d 20 28  Msg = 0;.  p = (
16cb0 53 71 6c 69 74 65 44 62 2a 29 54 63 6c 5f 41 6c  SqliteDb*)Tcl_Al
16cc0 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 20  loc( sizeof(*p) 
16cd0 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  );.  if( p==0 ){
16ce0 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
16cf0 6c 74 28 69 6e 74 65 72 70 2c 20 22 6d 61 6c 6c  lt(interp, "mall
16d00 6f 63 20 66 61 69 6c 65 64 22 2c 20 54 43 4c 5f  oc failed", TCL_
16d10 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65 74  STATIC);.    ret
16d20 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
16d30 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30   }.  memset(p, 0
16d40 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20  , sizeof(*p));. 
16d50 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74   zFile = Tcl_Get
16d60 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
16d70 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 7a 46 69  jv[2], 0);.  zFi
16d80 6c 65 20 3d 20 54 63 6c 5f 54 72 61 6e 73 6c 61  le = Tcl_Transla
16d90 74 65 46 69 6c 65 4e 61 6d 65 28 69 6e 74 65 72  teFileName(inter
16da0 70 2c 20 7a 46 69 6c 65 2c 20 26 74 72 61 6e 73  p, zFile, &trans
16db0 6c 61 74 65 64 46 69 6c 65 6e 61 6d 65 29 3b 0a  latedFilename);.
16dc0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f    rc = sqlite3_o
16dd0 70 65 6e 5f 76 32 28 7a 46 69 6c 65 2c 20 26 70  pen_v2(zFile, &p
16de0 2d 3e 64 62 2c 20 66 6c 61 67 73 2c 20 7a 56 66  ->db, flags, zVf
16df0 73 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  s);.  Tcl_DStrin
16e00 67 46 72 65 65 28 26 74 72 61 6e 73 6c 61 74 65  gFree(&translate
16e10 64 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66  dFilename);.  if
16e20 28 20 70 2d 3e 64 62 20 29 7b 0a 20 20 20 20 69  ( p->db ){.    i
16e30 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
16e40 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70 2d  lite3_errcode(p-
16e50 3e 64 62 29 20 29 7b 0a 20 20 20 20 20 20 7a 45  >db) ){.      zE
16e60 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
16e70 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71  mprintf("%s", sq
16e80 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e  lite3_errmsg(p->
16e90 64 62 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  db));.      sqli
16ea0 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 29  te3_close(p->db)
16eb0 3b 0a 20 20 20 20 20 20 70 2d 3e 64 62 20 3d 20  ;.      p->db = 
16ec0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  0;.    }.  }else
16ed0 7b 0a 20 20 20 20 7a 45 72 72 4d 73 67 20 3d 20  {.    zErrMsg = 
16ee0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
16ef0 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  "%s", sqlite3_er
16f00 72 73 74 72 28 72 63 29 29 3b 0a 20 20 7d 0a 23  rstr(rc));.  }.#
16f10 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
16f20 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 70 2d 3e  _CODEC.  if( p->
16f30 64 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  db ){.    sqlite
16f40 33 5f 6b 65 79 28 70 2d 3e 64 62 2c 20 70 4b 65  3_key(p->db, pKe
16f50 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 7d 0a 23 65  y, nKey);.  }.#e
16f60 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 64 62  ndif.  if( p->db
16f70 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53  ==0 ){.    Tcl_S
16f80 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
16f90 20 7a 45 72 72 4d 73 67 2c 20 54 43 4c 5f 56 4f   zErrMsg, TCL_VO
16fa0 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 54 63 6c  LATILE);.    Tcl
16fb0 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 29 3b  _Free((char*)p);
16fc0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
16fd0 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  e(zErrMsg);.    
16fe0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
16ff0 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 78 53 74  ;.  }.  p->maxSt
17000 6d 74 20 3d 20 4e 55 4d 5f 50 52 45 50 41 52 45  mt = NUM_PREPARE
17010 44 5f 53 54 4d 54 53 3b 0a 20 20 70 2d 3e 69 6e  D_STMTS;.  p->in
17020 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20  terp = interp;. 
17030 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53   zArg = Tcl_GetS
17040 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
17050 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 69 66 28 20  v[1], 0);.  if( 
17060 44 62 55 73 65 4e 72 65 28 29 20 29 7b 0a 20 20  DbUseNre() ){.  
17070 20 20 54 63 6c 5f 4e 52 43 72 65 61 74 65 43 6f    Tcl_NRCreateCo
17080 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 7a 41  mmand(interp, zA
17090 72 67 2c 20 44 62 4f 62 6a 43 6d 64 41 64 61 70  rg, DbObjCmdAdap
170a0 74 6f 72 2c 20 44 62 4f 62 6a 43 6d 64 2c 0a 20  tor, DbObjCmd,. 
170b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
170c0 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 2c         (char*)p,
170d0 20 44 62 44 65 6c 65 74 65 43 6d 64 29 3b 0a 20   DbDeleteCmd);. 
170e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f   }else{.    Tcl_
170f0 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
17100 28 69 6e 74 65 72 70 2c 20 7a 41 72 67 2c 20 44  (interp, zArg, D
17110 62 4f 62 6a 43 6d 64 2c 20 28 63 68 61 72 2a 29  bObjCmd, (char*)
17120 70 2c 20 44 62 44 65 6c 65 74 65 43 6d 64 29 3b  p, DbDeleteCmd);
17130 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
17140 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  L_OK;.}../*.** P
17150 72 6f 76 69 64 65 20 61 20 64 75 6d 6d 79 20 54  rovide a dummy T
17160 63 6c 5f 49 6e 69 74 53 74 75 62 73 20 69 66 20  cl_InitStubs if 
17170 77 65 20 61 72 65 20 75 73 69 6e 67 20 74 68 69  we are using thi
17180 73 20 61 73 20 61 20 73 74 61 74 69 63 0a 2a 2a  s as a static.**
17190 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66   library..*/.#if
171a0 6e 64 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55  ndef USE_TCL_STU
171b0 42 53 0a 23 20 75 6e 64 65 66 20 20 54 63 6c 5f  BS.# undef  Tcl_
171c0 49 6e 69 74 53 74 75 62 73 0a 23 20 64 65 66 69  InitStubs.# defi
171d0 6e 65 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73  ne Tcl_InitStubs
171e0 28 61 2c 62 2c 63 29 20 54 43 4c 5f 56 45 52 53  (a,b,c) TCL_VERS
171f0 49 4f 4e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ION.#endif../*.*
17200 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68  * Make sure we h
17210 61 76 65 20 61 20 50 41 43 4b 41 47 45 5f 56 45  ave a PACKAGE_VE
17220 52 53 49 4f 4e 20 6d 61 63 72 6f 20 64 65 66 69  RSION macro defi
17230 6e 65 64 2e 20 20 54 68 69 73 20 77 69 6c 6c 20  ned.  This will 
17240 62 65 0a 2a 2a 20 64 65 66 69 6e 65 64 20 61 75  be.** defined au
17250 74 6f 6d 61 74 69 63 61 6c 6c 79 20 62 79 20 74  tomatically by t
17260 68 65 20 54 45 41 20 6d 61 6b 65 66 69 6c 65 2e  he TEA makefile.
17270 20 20 42 75 74 20 6f 74 68 65 72 20 6d 61 6b 65    But other make
17280 66 69 6c 65 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20  files.** do not 
17290 64 65 66 69 6e 65 20 69 74 2e 0a 2a 2f 0a 23 69  define it..*/.#i
172a0 66 6e 64 65 66 20 50 41 43 4b 41 47 45 5f 56 45  fndef PACKAGE_VE
172b0 52 53 49 4f 4e 0a 23 20 64 65 66 69 6e 65 20 50  RSION.# define P
172c0 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 20 53  ACKAGE_VERSION S
172d0 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 0a 23 65  QLITE_VERSION.#e
172e0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  ndif../*.** Init
172f0 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64 75  ialize this modu
17300 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54  le..**.** This T
17310 63 6c 20 6d 6f 64 75 6c 65 20 63 6f 6e 74 61 69  cl module contai
17320 6e 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  ns only a single
17330 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d 61 6e 64   new Tcl command
17340 20 6e 61 6d 65 64 20 22 73 71 6c 69 74 65 22 2e   named "sqlite".
17350 0a 2a 2a 20 28 48 65 6e 63 65 20 74 68 65 72 65  .** (Hence there
17360 20 69 73 20 6e 6f 20 6e 61 6d 65 73 70 61 63 65   is no namespace
17370 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 70  .  There is no p
17380 6f 69 6e 74 20 69 6e 20 75 73 69 6e 67 20 61 20  oint in using a 
17390 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69 66 20  namespace.** if 
173a0 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 20 6f 6e  the extension on
173b0 6c 79 20 73 75 70 70 6c 69 65 73 20 6f 6e 65 20  ly supplies one 
173c0 6e 65 77 20 6e 61 6d 65 21 29 20 20 54 68 65 20  new name!)  The 
173d0 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d 61 6e 64  "sqlite" command
173e0 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 6f   is.** used to o
173f0 70 65 6e 20 61 20 6e 65 77 20 53 51 4c 69 74 65  pen a new SQLite
17400 20 64 61 74 61 62 61 73 65 2e 20 20 53 65 65 20   database.  See 
17410 74 68 65 20 44 62 4d 61 69 6e 28 29 20 72 6f 75  the DbMain() rou
17420 74 69 6e 65 20 61 62 6f 76 65 0a 2a 2a 20 66 6f  tine above.** fo
17430 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
17440 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  ormation..**.** 
17450 54 68 65 20 45 58 54 45 52 4e 20 6d 61 63 72 6f  The EXTERN macro
17460 73 20 61 72 65 20 72 65 71 75 69 72 65 64 20 62  s are required b
17470 79 20 54 43 4c 20 69 6e 20 6f 72 64 65 72 20 74  y TCL in order t
17480 6f 20 77 6f 72 6b 20 6f 6e 20 77 69 6e 64 6f 77  o work on window
17490 73 2e 0a 2a 2f 0a 45 58 54 45 52 4e 20 69 6e 74  s..*/.EXTERN int
174a0 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 54 63   Sqlite3_Init(Tc
174b0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
174c0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 54 63  ){.  int rc = Tc
174d0 6c 5f 49 6e 69 74 53 74 75 62 73 28 69 6e 74 65  l_InitStubs(inte
174e0 72 70 2c 20 22 38 2e 34 22 2c 20 30 29 3d 3d 30  rp, "8.4", 0)==0
174f0 20 3f 20 54 43 4c 5f 45 52 52 4f 52 20 3a 20 54   ? TCL_ERROR : T
17500 43 4c 5f 4f 4b 3b 0a 20 20 69 66 28 20 72 63 3d  CL_OK;.  if( rc=
17510 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  =TCL_OK ){.    T
17520 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
17530 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  and(interp, "sql
17540 69 74 65 33 22 2c 20 28 54 63 6c 5f 4f 62 6a 43  ite3", (Tcl_ObjC
17550 6d 64 50 72 6f 63 2a 29 44 62 4d 61 69 6e 2c 20  mdProc*)DbMain, 
17560 30 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53  0, 0);.#ifndef S
17570 51 4c 49 54 45 5f 33 5f 53 55 46 46 49 58 5f 4f  QLITE_3_SUFFIX_O
17580 4e 4c 59 0a 20 20 20 20 2f 2a 20 54 68 65 20 22  NLY.    /* The "
17590 73 71 6c 69 74 65 22 20 61 6c 69 61 73 20 69 73  sqlite" alias is
175a0 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64 2e 20 20   undocumented.  
175b0 49 74 20 69 73 20 68 65 72 65 20 6f 6e 6c 79 20  It is here only 
175c0 74 6f 20 73 75 70 70 6f 72 74 0a 20 20 20 20 2a  to support.    *
175d0 2a 20 6c 65 67 61 63 79 20 73 63 72 69 70 74 73  * legacy scripts
175e0 2e 20 20 41 6c 6c 20 6e 65 77 20 73 63 72 69 70  .  All new scrip
175f0 74 73 20 73 68 6f 75 6c 64 20 75 73 65 20 6f 6e  ts should use on
17600 6c 79 20 74 68 65 20 22 73 71 6c 69 74 65 33 22  ly the "sqlite3"
17610 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e  .    ** command.
17620 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 43 72 65 61   */.    Tcl_Crea
17630 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
17640 65 72 70 2c 20 22 73 71 6c 69 74 65 22 2c 20 28  erp, "sqlite", (
17650 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a 29  Tcl_ObjCmdProc*)
17660 44 62 4d 61 69 6e 2c 20 30 2c 20 30 29 3b 0a 23  DbMain, 0, 0);.#
17670 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20 54  endif.    rc = T
17680 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e  cl_PkgProvide(in
17690 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33 22 2c  terp, "sqlite3",
176a0 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e   PACKAGE_VERSION
176b0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
176c0 72 63 3b 0a 7d 0a 45 58 54 45 52 4e 20 69 6e 74  rc;.}.EXTERN int
176d0 20 54 63 6c 73 71 6c 69 74 65 33 5f 49 6e 69 74   Tclsqlite3_Init
176e0 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
176f0 65 72 70 29 7b 20 72 65 74 75 72 6e 20 53 71 6c  erp){ return Sql
17700 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70  ite3_Init(interp
17710 29 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20  ); }.EXTERN int 
17720 53 71 6c 69 74 65 33 5f 55 6e 6c 6f 61 64 28 54  Sqlite3_Unload(T
17730 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
17740 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 20 72  p, int flags){ r
17750 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a  eturn TCL_OK; }.
17760 45 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73 71  EXTERN int Tclsq
17770 6c 69 74 65 33 5f 55 6e 6c 6f 61 64 28 54 63 6c  lite3_Unload(Tcl
17780 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
17790 20 69 6e 74 20 66 6c 61 67 73 29 7b 20 72 65 74   int flags){ ret
177a0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 0a 2f  urn TCL_OK; }../
177b0 2a 20 42 65 63 61 75 73 65 20 69 74 20 61 63 63  * Because it acc
177c0 65 73 73 65 73 20 74 68 65 20 66 69 6c 65 2d 73  esses the file-s
177d0 79 73 74 65 6d 20 61 6e 64 20 75 73 65 73 20 70  ystem and uses p
177e0 65 72 73 69 73 74 65 6e 74 20 73 74 61 74 65 2c  ersistent state,
177f0 20 53 51 4c 69 74 65 0a 2a 2a 20 69 73 20 6e 6f   SQLite.** is no
17800 74 20 63 6f 6e 73 69 64 65 72 65 64 20 61 70 70  t considered app
17810 72 6f 70 72 69 61 74 65 20 66 6f 72 20 73 61 66  ropriate for saf
17820 65 20 69 6e 74 65 72 70 72 65 74 65 72 73 2e 20  e interpreters. 
17830 20 48 65 6e 63 65 2c 20 77 65 20 64 65 6c 69 62   Hence, we delib
17840 65 72 61 74 65 6c 79 0a 2a 2a 20 6f 6d 69 74 20  erately.** omit 
17850 74 68 65 20 5f 53 61 66 65 49 6e 69 74 28 29 20  the _SafeInit() 
17860 69 6e 74 65 72 66 61 63 65 73 2e 0a 2a 2f 0a 0a  interfaces..*/..
17870 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 33  #ifndef SQLITE_3
17880 5f 53 55 46 46 49 58 5f 4f 4e 4c 59 0a 69 6e 74  _SUFFIX_ONLY.int
17890 20 53 71 6c 69 74 65 5f 49 6e 69 74 28 54 63 6c   Sqlite_Init(Tcl
178a0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
178b0 7b 20 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33  { return Sqlite3
178c0 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d  _Init(interp); }
178d0 0a 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 5f 49  .int Tclsqlite_I
178e0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
178f0 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20  interp){ return 
17900 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74  Sqlite3_Init(int
17910 65 72 70 29 3b 20 7d 0a 69 6e 74 20 53 71 6c 69  erp); }.int Sqli
17920 74 65 5f 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e  te_Unload(Tcl_In
17930 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
17940 74 20 66 6c 61 67 73 29 7b 20 72 65 74 75 72 6e  t flags){ return
17950 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 69 6e 74 20 54   TCL_OK; }.int T
17960 63 6c 73 71 6c 69 74 65 5f 55 6e 6c 6f 61 64 28  clsqlite_Unload(
17970 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
17980 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 20  rp, int flags){ 
17990 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d  return TCL_OK; }
179a0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
179b0 54 43 4c 53 48 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  TCLSH./*********
179c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
179d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
179e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
179f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17a00 2a 2a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74  ****.** All of t
17a10 68 65 20 63 6f 64 65 20 74 68 61 74 20 66 6f 6c  he code that fol
17a20 6c 6f 77 73 20 69 73 20 75 73 65 64 20 74 6f 20  lows is used to 
17a30 62 75 69 6c 64 20 73 74 61 6e 64 61 6c 6f 6e 65  build standalone
17a40 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
17a50 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 73 74  s.** that are st
17a60 61 74 69 63 61 6c 6c 79 20 6c 69 6e 6b 65 64 20  atically linked 
17a70 77 69 74 68 20 53 51 4c 69 74 65 2e 20 20 45 6e  with SQLite.  En
17a80 61 62 6c 65 20 74 68 65 73 65 20 62 79 20 63 6f  able these by co
17a90 6d 70 69 6c 69 6e 67 0a 2a 2a 20 77 69 74 68 20  mpiling.** with 
17aa0 2d 44 54 43 4c 53 48 3d 6e 20 77 68 65 72 65 20  -DTCLSH=n where 
17ab0 6e 20 63 61 6e 20 62 65 20 31 20 6f 72 20 32 2e  n can be 1 or 2.
17ac0 20 20 41 6e 20 6e 20 6f 66 20 31 20 67 65 6e 65    An n of 1 gene
17ad0 72 61 74 65 73 20 61 20 73 74 61 6e 64 61 72 64  rates a standard
17ae0 0a 2a 2a 20 74 63 6c 73 68 20 62 75 74 20 77 69  .** tclsh but wi
17af0 74 68 20 53 51 4c 69 74 65 20 62 75 69 6c 74 20  th SQLite built 
17b00 69 6e 2e 20 20 41 6e 20 6e 20 6f 66 20 32 20 67  in.  An n of 2 g
17b10 65 6e 65 72 61 74 65 73 20 74 68 65 20 53 51 4c  enerates the SQL
17b20 69 74 65 20 73 70 61 63 65 0a 2a 2a 20 61 6e 61  ite space.** ana
17b30 6c 79 73 69 73 20 70 72 6f 67 72 61 6d 2e 0a 2a  lysis program..*
17b40 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  /..#if defined(S
17b50 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64  QLITE_TEST) || d
17b60 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 43  efined(SQLITE_TC
17b70 4c 4d 44 35 29 0a 2f 2a 0a 20 2a 20 54 68 69 73  LMD5)./*. * This
17b80 20 63 6f 64 65 20 69 6d 70 6c 65 6d 65 6e 74 73   code implements
17b90 20 74 68 65 20 4d 44 35 20 6d 65 73 73 61 67 65   the MD5 message
17ba0 2d 64 69 67 65 73 74 20 61 6c 67 6f 72 69 74 68  -digest algorith
17bb0 6d 2e 0a 20 2a 20 54 68 65 20 61 6c 67 6f 72 69  m.. * The algori
17bc0 74 68 6d 20 69 73 20 64 75 65 20 74 6f 20 52 6f  thm is due to Ro
17bd0 6e 20 52 69 76 65 73 74 2e 20 20 54 68 69 73 20  n Rivest.  This 
17be0 63 6f 64 65 20 77 61 73 0a 20 2a 20 77 72 69 74  code was. * writ
17bf0 74 65 6e 20 62 79 20 43 6f 6c 69 6e 20 50 6c 75  ten by Colin Plu
17c00 6d 62 20 69 6e 20 31 39 39 33 2c 20 6e 6f 20 63  mb in 1993, no c
17c10 6f 70 79 72 69 67 68 74 20 69 73 20 63 6c 61 69  opyright is clai
17c20 6d 65 64 2e 0a 20 2a 20 54 68 69 73 20 63 6f 64  med.. * This cod
17c30 65 20 69 73 20 69 6e 20 74 68 65 20 70 75 62 6c  e is in the publ
17c40 69 63 20 64 6f 6d 61 69 6e 3b 20 64 6f 20 77 69  ic domain; do wi
17c50 74 68 20 69 74 20 77 68 61 74 20 79 6f 75 20 77  th it what you w
17c60 69 73 68 2e 0a 20 2a 0a 20 2a 20 45 71 75 69 76  ish.. *. * Equiv
17c70 61 6c 65 6e 74 20 63 6f 64 65 20 69 73 20 61 76  alent code is av
17c80 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20 52 53 41  ailable from RSA
17c90 20 44 61 74 61 20 53 65 63 75 72 69 74 79 2c 20   Data Security, 
17ca0 49 6e 63 2e 0a 20 2a 20 54 68 69 73 20 63 6f 64  Inc.. * This cod
17cb0 65 20 68 61 73 20 62 65 65 6e 20 74 65 73 74 65  e has been teste
17cc0 64 20 61 67 61 69 6e 73 74 20 74 68 61 74 2c 20  d against that, 
17cd0 61 6e 64 20 69 73 20 65 71 75 69 76 61 6c 65 6e  and is equivalen
17ce0 74 2c 0a 20 2a 20 65 78 63 65 70 74 20 74 68 61  t,. * except tha
17cf0 74 20 79 6f 75 20 64 6f 6e 27 74 20 6e 65 65 64  t you don't need
17d00 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 77 6f 20   to include two 
17d10 70 61 67 65 73 20 6f 66 20 6c 65 67 61 6c 65 73  pages of legales
17d20 65 0a 20 2a 20 77 69 74 68 20 65 76 65 72 79 20  e. * with every 
17d30 63 6f 70 79 2e 0a 20 2a 0a 20 2a 20 54 6f 20 63  copy.. *. * To c
17d40 6f 6d 70 75 74 65 20 74 68 65 20 6d 65 73 73 61  ompute the messa
17d50 67 65 20 64 69 67 65 73 74 20 6f 66 20 61 20 63  ge digest of a c
17d60 68 75 6e 6b 20 6f 66 20 62 79 74 65 73 2c 20 64  hunk of bytes, d
17d70 65 63 6c 61 72 65 20 61 6e 0a 20 2a 20 4d 44 35  eclare an. * MD5
17d80 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72  Context structur
17d90 65 2c 20 70 61 73 73 20 69 74 20 74 6f 20 4d 44  e, pass it to MD
17da0 35 49 6e 69 74 2c 20 63 61 6c 6c 20 4d 44 35 55  5Init, call MD5U
17db0 70 64 61 74 65 20 61 73 0a 20 2a 20 6e 65 65 64  pdate as. * need
17dc0 65 64 20 6f 6e 20 62 75 66 66 65 72 73 20 66 75  ed on buffers fu
17dd0 6c 6c 20 6f 66 20 62 79 74 65 73 2c 20 61 6e 64  ll of bytes, and
17de0 20 74 68 65 6e 20 63 61 6c 6c 20 4d 44 35 46 69   then call MD5Fi
17df0 6e 61 6c 2c 20 77 68 69 63 68 0a 20 2a 20 77 69  nal, which. * wi
17e00 6c 6c 20 66 69 6c 6c 20 61 20 73 75 70 70 6c 69  ll fill a suppli
17e10 65 64 20 31 36 2d 62 79 74 65 20 61 72 72 61 79  ed 16-byte array
17e20 20 77 69 74 68 20 74 68 65 20 64 69 67 65 73 74   with the digest
17e30 2e 0a 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 49 66 20  .. */../*. * If 
17e40 63 6f 6d 70 69 6c 65 64 20 6f 6e 20 61 20 6d 61  compiled on a ma
17e50 63 68 69 6e 65 20 74 68 61 74 20 64 6f 65 73 6e  chine that doesn
17e60 27 74 20 68 61 76 65 20 61 20 33 32 2d 62 69 74  't have a 32-bit
17e70 20 69 6e 74 65 67 65 72 2c 0a 20 2a 20 79 6f 75   integer,. * you
17e80 20 6a 75 73 74 20 73 65 74 20 22 75 69 6e 74 33   just set "uint3
17e90 32 22 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70  2" to the approp
17ea0 72 69 61 74 65 20 64 61 74 61 74 79 70 65 20 66  riate datatype f
17eb0 6f 72 20 61 6e 0a 20 2a 20 75 6e 73 69 67 6e 65  or an. * unsigne
17ec0 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  d 32-bit integer
17ed0 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  .  For example:.
17ee0 20 2a 0a 20 2a 20 20 20 20 20 20 20 63 63 20 2d   *. *       cc -
17ef0 44 75 69 6e 74 33 32 3d 27 75 6e 73 69 67 6e 65  Duint32='unsigne
17f00 64 20 6c 6f 6e 67 27 20 6d 64 35 2e 63 0a 20 2a  d long' md5.c. *
17f10 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 75 69 6e  . */.#ifndef uin
17f20 74 33 32 0a 23 20 20 64 65 66 69 6e 65 20 75 69  t32.#  define ui
17f30 6e 74 33 32 20 75 6e 73 69 67 6e 65 64 20 69 6e  nt32 unsigned in
17f40 74 0a 23 65 6e 64 69 66 0a 0a 73 74 72 75 63 74  t.#endif..struct
17f50 20 4d 44 35 43 6f 6e 74 65 78 74 20 7b 0a 20 20   MD5Context {.  
17f60 69 6e 74 20 69 73 49 6e 69 74 3b 0a 20 20 75 69  int isInit;.  ui
17f70 6e 74 33 32 20 62 75 66 5b 34 5d 3b 0a 20 20 75  nt32 buf[4];.  u
17f80 69 6e 74 33 32 20 62 69 74 73 5b 32 5d 3b 0a 20  int32 bits[2];. 
17f90 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69   unsigned char i
17fa0 6e 5b 36 34 5d 3b 0a 7d 3b 0a 74 79 70 65 64 65  n[64];.};.typede
17fb0 66 20 73 74 72 75 63 74 20 4d 44 35 43 6f 6e 74  f struct MD5Cont
17fc0 65 78 74 20 4d 44 35 43 6f 6e 74 65 78 74 3b 0a  ext MD5Context;.
17fd0 0a 2f 2a 0a 20 2a 20 4e 6f 74 65 3a 20 74 68 69  ./*. * Note: thi
17fe0 73 20 63 6f 64 65 20 69 73 20 68 61 72 6d 6c 65  s code is harmle
17ff0 73 73 20 6f 6e 20 6c 69 74 74 6c 65 2d 65 6e 64  ss on little-end
18000 69 61 6e 20 6d 61 63 68 69 6e 65 73 2e 0a 20 2a  ian machines.. *
18010 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 79  /.static void by
18020 74 65 52 65 76 65 72 73 65 20 28 75 6e 73 69 67  teReverse (unsig
18030 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 75  ned char *buf, u
18040 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 73 29 7b 0a  nsigned longs){.
18050 20 20 20 20 20 20 20 20 75 69 6e 74 33 32 20 74          uint32 t
18060 3b 0a 20 20 20 20 20 20 20 20 64 6f 20 7b 0a 20  ;.        do {. 
18070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
18080 20 3d 20 28 75 69 6e 74 33 32 29 28 28 75 6e 73   = (uint32)((uns
18090 69 67 6e 65 64 29 62 75 66 5b 33 5d 3c 3c 38 20  igned)buf[3]<<8 
180a0 7c 20 62 75 66 5b 32 5d 29 20 3c 3c 20 31 36 20  | buf[2]) << 16 
180b0 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
180c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28                ((
180d0 75 6e 73 69 67 6e 65 64 29 62 75 66 5b 31 5d 3c  unsigned)buf[1]<
180e0 3c 38 20 7c 20 62 75 66 5b 30 5d 29 3b 0a 20 20  <8 | buf[0]);.  
180f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 28                *(
18100 75 69 6e 74 33 32 20 2a 29 62 75 66 20 3d 20 74  uint32 *)buf = t
18110 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
18120 20 20 62 75 66 20 2b 3d 20 34 3b 0a 20 20 20 20    buf += 4;.    
18130 20 20 20 20 7d 20 77 68 69 6c 65 20 28 2d 2d 6c      } while (--l
18140 6f 6e 67 73 29 3b 0a 7d 0a 2f 2a 20 54 68 65 20  ongs);.}./* The 
18150 66 6f 75 72 20 63 6f 72 65 20 66 75 6e 63 74 69  four core functi
18160 6f 6e 73 20 2d 20 46 31 20 69 73 20 6f 70 74 69  ons - F1 is opti
18170 6d 69 7a 65 64 20 73 6f 6d 65 77 68 61 74 20 2a  mized somewhat *
18180 2f 0a 0a 2f 2a 20 23 64 65 66 69 6e 65 20 46 31  /../* #define F1
18190 28 78 2c 20 79 2c 20 7a 29 20 28 78 20 26 20 79  (x, y, z) (x & y
181a0 20 7c 20 7e 78 20 26 20 7a 29 20 2a 2f 0a 23 64   | ~x & z) */.#d
181b0 65 66 69 6e 65 20 46 31 28 78 2c 20 79 2c 20 7a  efine F1(x, y, z
181c0 29 20 28 7a 20 5e 20 28 78 20 26 20 28 79 20 5e  ) (z ^ (x & (y ^
181d0 20 7a 29 29 29 0a 23 64 65 66 69 6e 65 20 46 32   z))).#define F2
181e0 28 78 2c 20 79 2c 20 7a 29 20 46 31 28 7a 2c 20  (x, y, z) F1(z, 
181f0 78 2c 20 79 29 0a 23 64 65 66 69 6e 65 20 46 33  x, y).#define F3
18200 28 78 2c 20 79 2c 20 7a 29 20 28 78 20 5e 20 79  (x, y, z) (x ^ y
18210 20 5e 20 7a 29 0a 23 64 65 66 69 6e 65 20 46 34   ^ z).#define F4
18220 28 78 2c 20 79 2c 20 7a 29 20 28 79 20 5e 20 28  (x, y, z) (y ^ (
18230 78 20 7c 20 7e 7a 29 29 0a 0a 2f 2a 20 54 68 69  x | ~z))../* Thi
18240 73 20 69 73 20 74 68 65 20 63 65 6e 74 72 61 6c  s is the central
18250 20 73 74 65 70 20 69 6e 20 74 68 65 20 4d 44 35   step in the MD5
18260 20 61 6c 67 6f 72 69 74 68 6d 2e 20 2a 2f 0a 23   algorithm. */.#
18270 64 65 66 69 6e 65 20 4d 44 35 53 54 45 50 28 66  define MD5STEP(f
18280 2c 20 77 2c 20 78 2c 20 79 2c 20 7a 2c 20 64 61  , w, x, y, z, da
18290 74 61 2c 20 73 29 20 5c 0a 20 20 20 20 20 20 20  ta, s) \.       
182a0 20 28 20 77 20 2b 3d 20 66 28 78 2c 20 79 2c 20   ( w += f(x, y, 
182b0 7a 29 20 2b 20 64 61 74 61 2c 20 20 77 20 3d 20  z) + data,  w = 
182c0 77 3c 3c 73 20 7c 20 77 3e 3e 28 33 32 2d 73 29  w<<s | w>>(32-s)
182d0 2c 20 20 77 20 2b 3d 20 78 20 29 0a 0a 2f 2a 0a  ,  w += x )../*.
182e0 20 2a 20 54 68 65 20 63 6f 72 65 20 6f 66 20 74   * The core of t
182f0 68 65 20 4d 44 35 20 61 6c 67 6f 72 69 74 68 6d  he MD5 algorithm
18300 2c 20 74 68 69 73 20 61 6c 74 65 72 73 20 61 6e  , this alters an
18310 20 65 78 69 73 74 69 6e 67 20 4d 44 35 20 68 61   existing MD5 ha
18320 73 68 20 74 6f 0a 20 2a 20 72 65 66 6c 65 63 74  sh to. * reflect
18330 20 74 68 65 20 61 64 64 69 74 69 6f 6e 20 6f 66   the addition of
18340 20 31 36 20 6c 6f 6e 67 77 6f 72 64 73 20 6f 66   16 longwords of
18350 20 6e 65 77 20 64 61 74 61 2e 20 20 4d 44 35 55   new data.  MD5U
18360 70 64 61 74 65 20 62 6c 6f 63 6b 73 0a 20 2a 20  pdate blocks. * 
18370 74 68 65 20 64 61 74 61 20 61 6e 64 20 63 6f 6e  the data and con
18380 76 65 72 74 73 20 62 79 74 65 73 20 69 6e 74 6f  verts bytes into
18390 20 6c 6f 6e 67 77 6f 72 64 73 20 66 6f 72 20 74   longwords for t
183a0 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 20 2a 2f  his routine.. */
183b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 4d 44 35  .static void MD5
183c0 54 72 61 6e 73 66 6f 72 6d 28 75 69 6e 74 33 32  Transform(uint32
183d0 20 62 75 66 5b 34 5d 2c 20 63 6f 6e 73 74 20 75   buf[4], const u
183e0 69 6e 74 33 32 20 69 6e 5b 31 36 5d 29 7b 0a 20  int32 in[16]){. 
183f0 20 20 20 20 20 20 20 72 65 67 69 73 74 65 72 20         register 
18400 75 69 6e 74 33 32 20 61 2c 20 62 2c 20 63 2c 20  uint32 a, b, c, 
18410 64 3b 0a 0a 20 20 20 20 20 20 20 20 61 20 3d 20  d;..        a = 
18420 62 75 66 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20  buf[0];.        
18430 62 20 3d 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20  b = buf[1];.    
18440 20 20 20 20 63 20 3d 20 62 75 66 5b 32 5d 3b 0a      c = buf[2];.
18450 20 20 20 20 20 20 20 20 64 20 3d 20 62 75 66 5b          d = buf[
18460 33 5d 3b 0a 0a 20 20 20 20 20 20 20 20 4d 44 35  3];..        MD5
18470 53 54 45 50 28 46 31 2c 20 61 2c 20 62 2c 20 63  STEP(F1, a, b, c
18480 2c 20 64 2c 20 69 6e 5b 20 30 5d 2b 30 78 64 37  , d, in[ 0]+0xd7
18490 36 61 61 34 37 38 2c 20 20 37 29 3b 0a 20 20 20  6aa478,  7);.   
184a0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c       MD5STEP(F1,
184b0 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b   d, a, b, c, in[
184c0 20 31 5d 2b 30 78 65 38 63 37 62 37 35 36 2c 20   1]+0xe8c7b756, 
184d0 31 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  12);.        MD5
184e0 53 54 45 50 28 46 31 2c 20 63 2c 20 64 2c 20 61  STEP(F1, c, d, a
184f0 2c 20 62 2c 20 69 6e 5b 20 32 5d 2b 30 78 32 34  , b, in[ 2]+0x24
18500 32 30 37 30 64 62 2c 20 31 37 29 3b 0a 20 20 20  2070db, 17);.   
18510 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c       MD5STEP(F1,
18520 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
18530 20 33 5d 2b 30 78 63 31 62 64 63 65 65 65 2c 20   3]+0xc1bdceee, 
18540 32 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  22);.        MD5
18550 53 54 45 50 28 46 31 2c 20 61 2c 20 62 2c 20 63  STEP(F1, a, b, c
18560 2c 20 64 2c 20 69 6e 5b 20 34 5d 2b 30 78 66 35  , d, in[ 4]+0xf5
18570 37 63 30 66 61 66 2c 20 20 37 29 3b 0a 20 20 20  7c0faf,  7);.   
18580 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c       MD5STEP(F1,
18590 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b   d, a, b, c, in[
185a0 20 35 5d 2b 30 78 34 37 38 37 63 36 32 61 2c 20   5]+0x4787c62a, 
185b0 31 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  12);.        MD5
185c0 53 54 45 50 28 46 31 2c 20 63 2c 20 64 2c 20 61  STEP(F1, c, d, a
185d0 2c 20 62 2c 20 69 6e 5b 20 36 5d 2b 30 78 61 38  , b, in[ 6]+0xa8
185e0 33 30 34 36 31 33 2c 20 31 37 29 3b 0a 20 20 20  304613, 17);.   
185f0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c       MD5STEP(F1,
18600 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
18610 20 37 5d 2b 30 78 66 64 34 36 39 35 30 31 2c 20   7]+0xfd469501, 
18620 32 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  22);.        MD5
18630 53 54 45 50 28 46 31 2c 20 61 2c 20 62 2c 20 63  STEP(F1, a, b, c
18640 2c 20 64 2c 20 69 6e 5b 20 38 5d 2b 30 78 36 39  , d, in[ 8]+0x69
18650 38 30 39 38 64 38 2c 20 20 37 29 3b 0a 20 20 20  8098d8,  7);.   
18660 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c       MD5STEP(F1,
18670 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b   d, a, b, c, in[
18680 20 39 5d 2b 30 78 38 62 34 34 66 37 61 66 2c 20   9]+0x8b44f7af, 
18690 31 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  12);.        MD5
186a0 53 54 45 50 28 46 31 2c 20 63 2c 20 64 2c 20 61  STEP(F1, c, d, a
186b0 2c 20 62 2c 20 69 6e 5b 31 30 5d 2b 30 78 66 66  , b, in[10]+0xff
186c0 66 66 35 62 62 31 2c 20 31 37 29 3b 0a 20 20 20  ff5bb1, 17);.   
186d0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c       MD5STEP(F1,
186e0 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
186f0 31 31 5d 2b 30 78 38 39 35 63 64 37 62 65 2c 20  11]+0x895cd7be, 
18700 32 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  22);.        MD5
18710 53 54 45 50 28 46 31 2c 20 61 2c 20 62 2c 20 63  STEP(F1, a, b, c
18720 2c 20 64 2c 20 69 6e 5b 31 32 5d 2b 30 78 36 62  , d, in[12]+0x6b
18730 39 30 31 31 32 32 2c 20 20 37 29 3b 0a 20 20 20  901122,  7);.   
18740 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c       MD5STEP(F1,
18750 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b   d, a, b, c, in[
18760 31 33 5d 2b 30 78 66 64 39 38 37 31 39 33 2c 20  13]+0xfd987193, 
18770 31 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  12);.        MD5
18780 53 54 45 50 28 46 31 2c 20 63 2c 20 64 2c 20 61  STEP(F1, c, d, a
18790 2c 20 62 2c 20 69 6e 5b 31 34 5d 2b 30 78 61 36  , b, in[14]+0xa6
187a0 37 39 34 33 38 65 2c 20 31 37 29 3b 0a 20 20 20  79438e, 17);.   
187b0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c       MD5STEP(F1,
187c0 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
187d0 31 35 5d 2b 30 78 34 39 62 34 30 38 32 31 2c 20  15]+0x49b40821, 
187e0 32 32 29 3b 0a 0a 20 20 20 20 20 20 20 20 4d 44  22);..        MD
187f0 35 53 54 45 50 28 46 32 2c 20 61 2c 20 62 2c 20  5STEP(F2, a, b, 
18800 63 2c 20 64 2c 20 69 6e 5b 20 31 5d 2b 30 78 66  c, d, in[ 1]+0xf
18810 36 31 65 32 35 36 32 2c 20 20 35 29 3b 0a 20 20  61e2562,  5);.  
18820 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32        MD5STEP(F2
18830 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
18840 5b 20 36 5d 2b 30 78 63 30 34 30 62 33 34 30 2c  [ 6]+0xc040b340,
18850 20 20 39 29 3b 0a 20 20 20 20 20 20 20 20 4d 44    9);.        MD
18860 35 53 54 45 50 28 46 32 2c 20 63 2c 20 64 2c 20  5STEP(F2, c, d, 
18870 61 2c 20 62 2c 20 69 6e 5b 31 31 5d 2b 30 78 32  a, b, in[11]+0x2
18880 36 35 65 35 61 35 31 2c 20 31 34 29 3b 0a 20 20  65e5a51, 14);.  
18890 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32        MD5STEP(F2
188a0 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
188b0 5b 20 30 5d 2b 30 78 65 39 62 36 63 37 61 61 2c  [ 0]+0xe9b6c7aa,
188c0 20 32 30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   20);.        MD
188d0 35 53 54 45 50 28 46 32 2c 20 61 2c 20 62 2c 20  5STEP(F2, a, b, 
188e0 63 2c 20 64 2c 20 69 6e 5b 20 35 5d 2b 30 78 64  c, d, in[ 5]+0xd
188f0 36 32 66 31 30 35 64 2c 20 20 35 29 3b 0a 20 20  62f105d,  5);.  
18900 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32        MD5STEP(F2
18910 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
18920 5b 31 30 5d 2b 30 78 30 32 34 34 31 34 35 33 2c  [10]+0x02441453,
18930 20 20 39 29 3b 0a 20 20 20 20 20 20 20 20 4d 44    9);.        MD
18940 35 53 54 45 50 28 46 32 2c 20 63 2c 20 64 2c 20  5STEP(F2, c, d, 
18950 61 2c 20 62 2c 20 69 6e 5b 31 35 5d 2b 30 78 64  a, b, in[15]+0xd
18960 38 61 31 65 36 38 31 2c 20 31 34 29 3b 0a 20 20  8a1e681, 14);.  
18970 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32        MD5STEP(F2
18980 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
18990 5b 20 34 5d 2b 30 78 65 37 64 33 66 62 63 38 2c  [ 4]+0xe7d3fbc8,
189a0 20 32 30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   20);.        MD
189b0 35 53 54 45 50 28 46 32 2c 20 61 2c 20 62 2c 20  5STEP(F2, a, b, 
189c0 63 2c 20 64 2c 20 69 6e 5b 20 39 5d 2b 30 78 32  c, d, in[ 9]+0x2
189d0 31 65 31 63 64 65 36 2c 20 20 35 29 3b 0a 20 20  1e1cde6,  5);.  
189e0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32        MD5STEP(F2
189f0 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
18a00 5b 31 34 5d 2b 30 78 63 33 33 37 30 37 64 36 2c  [14]+0xc33707d6,
18a10 20 20 39 29 3b 0a 20 20 20 20 20 20 20 20 4d 44    9);.        MD
18a20 35 53 54 45 50 28 46 32 2c 20 63 2c 20 64 2c 20  5STEP(F2, c, d, 
18a30 61 2c 20 62 2c 20 69 6e 5b 20 33 5d 2b 30 78 66  a, b, in[ 3]+0xf
18a40 34 64 35 30 64 38 37 2c 20 31 34 29 3b 0a 20 20  4d50d87, 14);.  
18a50 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32        MD5STEP(F2
18a60 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
18a70 5b 20 38 5d 2b 30 78 34 35 35 61 31 34 65 64 2c  [ 8]+0x455a14ed,
18a80 20 32 30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   20);.        MD
18a90 35 53 54 45 50 28 46 32 2c 20 61 2c 20 62 2c 20  5STEP(F2, a, b, 
18aa0 63 2c 20 64 2c 20 69 6e 5b 31 33 5d 2b 30 78 61  c, d, in[13]+0xa
18ab0 39 65 33 65 39 30 35 2c 20 20 35 29 3b 0a 20 20  9e3e905,  5);.  
18ac0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32        MD5STEP(F2
18ad0 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
18ae0 5b 20 32 5d 2b 30 78 66 63 65 66 61 33 66 38 2c  [ 2]+0xfcefa3f8,
18af0 20 20 39 29 3b 0a 20 20 20 20 20 20 20 20 4d 44    9);.        MD
18b00 35 53 54 45 50 28 46 32 2c 20 63 2c 20 64 2c 20  5STEP(F2, c, d, 
18b10 61 2c 20 62 2c 20 69 6e 5b 20 37 5d 2b 30 78 36  a, b, in[ 7]+0x6
18b20 37 36 66 30 32 64 39 2c 20 31 34 29 3b 0a 20 20  76f02d9, 14);.  
18b30 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32        MD5STEP(F2
18b40 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
18b50 5b 31 32 5d 2b 30 78 38 64 32 61 34 63 38 61 2c  [12]+0x8d2a4c8a,
18b60 20 32 30 29 3b 0a 0a 20 20 20 20 20 20 20 20 4d   20);..        M
18b70 44 35 53 54 45 50 28 46 33 2c 20 61 2c 20 62 2c  D5STEP(F3, a, b,
18b80 20 63 2c 20 64 2c 20 69 6e 5b 20 35 5d 2b 30 78   c, d, in[ 5]+0x
18b90 66 66 66 61 33 39 34 32 2c 20 20 34 29 3b 0a 20  fffa3942,  4);. 
18ba0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
18bb0 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  3, d, a, b, c, i
18bc0 6e 5b 20 38 5d 2b 30 78 38 37 37 31 66 36 38 31  n[ 8]+0x8771f681
18bd0 2c 20 31 31 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 11);.        M
18be0 44 35 53 54 45 50 28 46 33 2c 20 63 2c 20 64 2c  D5STEP(F3, c, d,
18bf0 20 61 2c 20 62 2c 20 69 6e 5b 31 31 5d 2b 30 78   a, b, in[11]+0x
18c00 36 64 39 64 36 31 32 32 2c 20 31 36 29 3b 0a 20  6d9d6122, 16);. 
18c10 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
18c20 33 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  3, b, c, d, a, i
18c30 6e 5b 31 34 5d 2b 30 78 66 64 65 35 33 38 30 63  n[14]+0xfde5380c
18c40 2c 20 32 33 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 23);.        M
18c50 44 35 53 54 45 50 28 46 33 2c 20 61 2c 20 62 2c  D5STEP(F3, a, b,
18c60 20 63 2c 20 64 2c 20 69 6e 5b 20 31 5d 2b 30 78   c, d, in[ 1]+0x
18c70 61 34 62 65 65 61 34 34 2c 20 20 34 29 3b 0a 20  a4beea44,  4);. 
18c80 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
18c90 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  3, d, a, b, c, i
18ca0 6e 5b 20 34 5d 2b 30 78 34 62 64 65 63 66 61 39  n[ 4]+0x4bdecfa9
18cb0 2c 20 31 31 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 11);.        M
18cc0 44 35 53 54 45 50 28 46 33 2c 20 63 2c 20 64 2c  D5STEP(F3, c, d,
18cd0 20 61 2c 20 62 2c 20 69 6e 5b 20 37 5d 2b 30 78   a, b, in[ 7]+0x
18ce0 66 36 62 62 34 62 36 30 2c 20 31 36 29 3b 0a 20  f6bb4b60, 16);. 
18cf0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
18d00 33 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  3, b, c, d, a, i
18d10 6e 5b 31 30 5d 2b 30 78 62 65 62 66 62 63 37 30  n[10]+0xbebfbc70
18d20 2c 20 32 33 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 23);.        M
18d30 44 35 53 54 45 50 28 46 33 2c 20 61 2c 20 62 2c  D5STEP(F3, a, b,
18d40 20 63 2c 20 64 2c 20 69 6e 5b 31 33 5d 2b 30 78   c, d, in[13]+0x
18d50 32 38 39 62 37 65 63 36 2c 20 20 34 29 3b 0a 20  289b7ec6,  4);. 
18d60 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
18d70 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  3, d, a, b, c, i
18d80 6e 5b 20 30 5d 2b 30 78 65 61 61 31 32 37 66 61  n[ 0]+0xeaa127fa
18d90 2c 20 31 31 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 11);.        M
18da0 44 35 53 54 45 50 28 46 33 2c 20 63 2c 20 64 2c  D5STEP(F3, c, d,
18db0 20 61 2c 20 62 2c 20 69 6e 5b 20 33 5d 2b 30 78   a, b, in[ 3]+0x
18dc0 64 34 65 66 33 30 38 35 2c 20 31 36 29 3b 0a 20  d4ef3085, 16);. 
18dd0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
18de0 33 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  3, b, c, d, a, i
18df0 6e 5b 20 36 5d 2b 30 78 30 34 38 38 31 64 30 35  n[ 6]+0x04881d05
18e00 2c 20 32 33 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 23);.        M
18e10 44 35 53 54 45 50 28 46 33 2c 20 61 2c 20 62 2c  D5STEP(F3, a, b,
18e20 20 63 2c 20 64 2c 20 69 6e 5b 20 39 5d 2b 30 78   c, d, in[ 9]+0x
18e30 64 39 64 34 64 30 33 39 2c 20 20 34 29 3b 0a 20  d9d4d039,  4);. 
18e40 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
18e50 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  3, d, a, b, c, i
18e60 6e 5b 31 32 5d 2b 30 78 65 36 64 62 39 39 65 35  n[12]+0xe6db99e5
18e70 2c 20 31 31 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 11);.        M
18e80 44 35 53 54 45 50 28 46 33 2c 20 63 2c 20 64 2c  D5STEP(F3, c, d,
18e90 20 61 2c 20 62 2c 20 69 6e 5b 31 35 5d 2b 30 78   a, b, in[15]+0x
18ea0 31 66 61 32 37 63 66 38 2c 20 31 36 29 3b 0a 20  1fa27cf8, 16);. 
18eb0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
18ec0 33 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  3, b, c, d, a, i
18ed0 6e 5b 20 32 5d 2b 30 78 63 34 61 63 35 36 36 35  n[ 2]+0xc4ac5665
18ee0 2c 20 32 33 29 3b 0a 0a 20 20 20 20 20 20 20 20  , 23);..        
18ef0 4d 44 35 53 54 45 50 28 46 34 2c 20 61 2c 20 62  MD5STEP(F4, a, b
18f00 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 30 5d 2b 30  , c, d, in[ 0]+0
18f10 78 66 34 32 39 32 32 34 34 2c 20 20 36 29 3b 0a  xf4292244,  6);.
18f20 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
18f30 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F4, d, a, b, c, 
18f40 69 6e 5b 20 37 5d 2b 30 78 34 33 32 61 66 66 39  in[ 7]+0x432aff9
18f50 37 2c 20 31 30 29 3b 0a 20 20 20 20 20 20 20 20  7, 10);.        
18f60 4d 44 35 53 54 45 50 28 46 34 2c 20 63 2c 20 64  MD5STEP(F4, c, d
18f70 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 34 5d 2b 30  , a, b, in[14]+0
18f80 78 61 62 39 34 32 33 61 37 2c 20 31 35 29 3b 0a  xab9423a7, 15);.
18f90 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
18fa0 46 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20  F4, b, c, d, a, 
18fb0 69 6e 5b 20 35 5d 2b 30 78 66 63 39 33 61 30 33  in[ 5]+0xfc93a03
18fc0 39 2c 20 32 31 29 3b 0a 20 20 20 20 20 20 20 20  9, 21);.        
18fd0 4d 44 35 53 54 45 50 28 46 34 2c 20 61 2c 20 62  MD5STEP(F4, a, b
18fe0 2c 20 63 2c 20 64 2c 20 69 6e 5b 31 32 5d 2b 30  , c, d, in[12]+0
18ff0 78 36 35 35 62 35 39 63 33 2c 20 20 36 29 3b 0a  x655b59c3,  6);.
19000 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
19010 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F4, d, a, b, c, 
19020 69 6e 5b 20 33 5d 2b 30 78 38 66 30 63 63 63 39  in[ 3]+0x8f0ccc9
19030 32 2c 20 31 30 29 3b 0a 20 20 20 20 20 20 20 20  2, 10);.        
19040 4d 44 35 53 54 45 50 28 46 34 2c 20 63 2c 20 64  MD5STEP(F4, c, d
19050 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 30 5d 2b 30  , a, b, in[10]+0
19060 78 66 66 65 66 66 34 37 64 2c 20 31 35 29 3b 0a  xffeff47d, 15);.
19070 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
19080 46 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20  F4, b, c, d, a, 
19090 69 6e 5b 20 31 5d 2b 30 78 38 35 38 34 35 64 64  in[ 1]+0x85845dd
190a0 31 2c 20 32 31 29 3b 0a 20 20 20 20 20 20 20 20  1, 21);.        
190b0 4d 44 35 53 54 45 50 28 46 34 2c 20 61 2c 20 62  MD5STEP(F4, a, b
190c0 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 38 5d 2b 30  , c, d, in[ 8]+0
190d0 78 36 66 61 38 37 65 34 66 2c 20 20 36 29 3b 0a  x6fa87e4f,  6);.
190e0 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
190f0 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F4, d, a, b, c, 
19100 69 6e 5b 31 35 5d 2b 30 78 66 65 32 63 65 36 65  in[15]+0xfe2ce6e
19110 30 2c 20 31 30 29 3b 0a 20 20 20 20 20 20 20 20  0, 10);.        
19120 4d 44 35 53 54 45 50 28 46 34 2c 20 63 2c 20 64  MD5STEP(F4, c, d
19130 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 36 5d 2b 30  , a, b, in[ 6]+0
19140 78 61 33 30 31 34 33 31 34 2c 20 31 35 29 3b 0a  xa3014314, 15);.
19150 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
19160 46 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20  F4, b, c, d, a, 
19170 69 6e 5b 31 33 5d 2b 30 78 34 65 30 38 31 31 61  in[13]+0x4e0811a
19180 31 2c 20 32 31 29 3b 0a 20 20 20 20 20 20 20 20  1, 21);.        
19190 4d 44 35 53 54 45 50 28 46 34 2c 20 61 2c 20 62  MD5STEP(F4, a, b
191a0 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 34 5d 2b 30  , c, d, in[ 4]+0
191b0 78 66 37 35 33 37 65 38 32 2c 20 20 36 29 3b 0a  xf7537e82,  6);.
191c0 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
191d0 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F4, d, a, b, c, 
191e0 69 6e 5b 31 31 5d 2b 30 78 62 64 33 61 66 32 33  in[11]+0xbd3af23
191f0 35 2c 20 31 30 29 3b 0a 20 20 20 20 20 20 20 20  5, 10);.        
19200 4d 44 35 53 54 45 50 28 46 34 2c 20 63 2c 20 64  MD5STEP(F4, c, d
19210 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 32 5d 2b 30  , a, b, in[ 2]+0
19220 78 32 61 64 37 64 32 62 62 2c 20 31 35 29 3b 0a  x2ad7d2bb, 15);.
19230 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
19240 46 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20  F4, b, c, d, a, 
19250 69 6e 5b 20 39 5d 2b 30 78 65 62 38 36 64 33 39  in[ 9]+0xeb86d39
19260 31 2c 20 32 31 29 3b 0a 0a 20 20 20 20 20 20 20  1, 21);..       
19270 20 62 75 66 5b 30 5d 20 2b 3d 20 61 3b 0a 20 20   buf[0] += a;.  
19280 20 20 20 20 20 20 62 75 66 5b 31 5d 20 2b 3d 20        buf[1] += 
19290 62 3b 0a 20 20 20 20 20 20 20 20 62 75 66 5b 32  b;.        buf[2
192a0 5d 20 2b 3d 20 63 3b 0a 20 20 20 20 20 20 20 20  ] += c;.        
192b0 62 75 66 5b 33 5d 20 2b 3d 20 64 3b 0a 7d 0a 0a  buf[3] += d;.}..
192c0 2f 2a 0a 20 2a 20 53 74 61 72 74 20 4d 44 35 20  /*. * Start MD5 
192d0 61 63 63 75 6d 75 6c 61 74 69 6f 6e 2e 20 20 53  accumulation.  S
192e0 65 74 20 62 69 74 20 63 6f 75 6e 74 20 74 6f 20  et bit count to 
192f0 30 20 61 6e 64 20 62 75 66 66 65 72 20 74 6f 20  0 and buffer to 
19300 6d 79 73 74 65 72 69 6f 75 73 0a 20 2a 20 69 6e  mysterious. * in
19310 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 63 6f 6e  itialization con
19320 73 74 61 6e 74 73 2e 0a 20 2a 2f 0a 73 74 61 74  stants.. */.stat
19330 69 63 20 76 6f 69 64 20 4d 44 35 49 6e 69 74 28  ic void MD5Init(
19340 4d 44 35 43 6f 6e 74 65 78 74 20 2a 63 74 78 29  MD5Context *ctx)
19350 7b 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e 69  {.        ctx->i
19360 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  sInit = 1;.     
19370 20 20 20 63 74 78 2d 3e 62 75 66 5b 30 5d 20 3d     ctx->buf[0] =
19380 20 30 78 36 37 34 35 32 33 30 31 3b 0a 20 20 20   0x67452301;.   
19390 20 20 20 20 20 63 74 78 2d 3e 62 75 66 5b 31 5d       ctx->buf[1]
193a0 20 3d 20 30 78 65 66 63 64 61 62 38 39 3b 0a 20   = 0xefcdab89;. 
193b0 20 20 20 20 20 20 20 63 74 78 2d 3e 62 75 66 5b         ctx->buf[
193c0 32 5d 20 3d 20 30 78 39 38 62 61 64 63 66 65 3b  2] = 0x98badcfe;
193d0 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62 75  .        ctx->bu
193e0 66 5b 33 5d 20 3d 20 30 78 31 30 33 32 35 34 37  f[3] = 0x1032547
193f0 36 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e  6;.        ctx->
19400 62 69 74 73 5b 30 5d 20 3d 20 30 3b 0a 20 20 20  bits[0] = 0;.   
19410 20 20 20 20 20 63 74 78 2d 3e 62 69 74 73 5b 31       ctx->bits[1
19420 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  ] = 0;.}../*. * 
19430 55 70 64 61 74 65 20 63 6f 6e 74 65 78 74 20 74  Update context t
19440 6f 20 72 65 66 6c 65 63 74 20 74 68 65 20 63 6f  o reflect the co
19450 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f 66 20 61  ncatenation of a
19460 6e 6f 74 68 65 72 20 62 75 66 66 65 72 20 66 75  nother buffer fu
19470 6c 6c 0a 20 2a 20 6f 66 20 62 79 74 65 73 2e 0a  ll. * of bytes..
19480 20 2a 2f 0a 73 74 61 74 69 63 20 0a 76 6f 69 64   */.static .void
19490 20 4d 44 35 55 70 64 61 74 65 28 4d 44 35 43 6f   MD5Update(MD5Co
194a0 6e 74 65 78 74 20 2a 63 74 78 2c 20 63 6f 6e 73  ntext *ctx, cons
194b0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
194c0 2a 62 75 66 2c 20 75 6e 73 69 67 6e 65 64 20 69  *buf, unsigned i
194d0 6e 74 20 6c 65 6e 29 7b 0a 20 20 20 20 20 20 20  nt len){.       
194e0 20 75 69 6e 74 33 32 20 74 3b 0a 0a 20 20 20 20   uint32 t;..    
194f0 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 62 69      /* Update bi
19500 74 63 6f 75 6e 74 20 2a 2f 0a 0a 20 20 20 20 20  tcount */..     
19510 20 20 20 74 20 3d 20 63 74 78 2d 3e 62 69 74 73     t = ctx->bits
19520 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 20  [0];.        if 
19530 28 28 63 74 78 2d 3e 62 69 74 73 5b 30 5d 20 3d  ((ctx->bits[0] =
19540 20 74 20 2b 20 28 28 75 69 6e 74 33 32 29 6c 65   t + ((uint32)le
19550 6e 20 3c 3c 20 33 29 29 20 3c 20 74 29 0a 20 20  n << 3)) < t).  
19560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 74                ct
19570 78 2d 3e 62 69 74 73 5b 31 5d 2b 2b 3b 20 2f 2a  x->bits[1]++; /*
19580 20 43 61 72 72 79 20 66 72 6f 6d 20 6c 6f 77 20   Carry from low 
19590 74 6f 20 68 69 67 68 20 2a 2f 0a 20 20 20 20 20  to high */.     
195a0 20 20 20 63 74 78 2d 3e 62 69 74 73 5b 31 5d 20     ctx->bits[1] 
195b0 2b 3d 20 6c 65 6e 20 3e 3e 20 32 39 3b 0a 0a 20  += len >> 29;.. 
195c0 20 20 20 20 20 20 20 74 20 3d 20 28 74 20 3e 3e         t = (t >>
195d0 20 33 29 20 26 20 30 78 33 66 3b 20 20 20 20 2f   3) & 0x3f;    /
195e0 2a 20 42 79 74 65 73 20 61 6c 72 65 61 64 79 20  * Bytes already 
195f0 69 6e 20 73 68 73 49 6e 66 6f 2d 3e 64 61 74 61  in shsInfo->data
19600 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   */..        /* 
19610 48 61 6e 64 6c 65 20 61 6e 79 20 6c 65 61 64 69  Handle any leadi
19620 6e 67 20 6f 64 64 2d 73 69 7a 65 64 20 63 68 75  ng odd-sized chu
19630 6e 6b 73 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  nks */..        
19640 69 66 20 28 20 74 20 29 20 7b 0a 20 20 20 20 20  if ( t ) {.     
19650 20 20 20 20 20 20 20 20 20 20 20 75 6e 73 69 67             unsig
19660 6e 65 64 20 63 68 61 72 20 2a 70 20 3d 20 28 75  ned char *p = (u
19670 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 63  nsigned char *)c
19680 74 78 2d 3e 69 6e 20 2b 20 74 3b 0a 0a 20 20 20  tx->in + t;..   
19690 20 20 20 20 20 20 20 20 20 20 20 20 20 74 20 3d               t =
196a0 20 36 34 2d 74 3b 0a 20 20 20 20 20 20 20 20 20   64-t;.         
196b0 20 20 20 20 20 20 20 69 66 20 28 6c 65 6e 20 3c         if (len <
196c0 20 74 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20   t) {.          
196d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65                me
196e0 6d 63 70 79 28 70 2c 20 62 75 66 2c 20 6c 65 6e  mcpy(p, buf, len
196f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
19700 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
19710 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n;.             
19720 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
19730 20 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 62       memcpy(p, b
19740 75 66 2c 20 74 29 3b 0a 20 20 20 20 20 20 20 20  uf, t);.        
19750 20 20 20 20 20 20 20 20 62 79 74 65 52 65 76 65          byteReve
19760 72 73 65 28 63 74 78 2d 3e 69 6e 2c 20 31 36 29  rse(ctx->in, 16)
19770 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
19780 20 20 4d 44 35 54 72 61 6e 73 66 6f 72 6d 28 63    MD5Transform(c
19790 74 78 2d 3e 62 75 66 2c 20 28 75 69 6e 74 33 32  tx->buf, (uint32
197a0 20 2a 29 63 74 78 2d 3e 69 6e 29 3b 0a 20 20 20   *)ctx->in);.   
197b0 20 20 20 20 20 20 20 20 20 20 20 20 20 62 75 66               buf
197c0 20 2b 3d 20 74 3b 0a 20 20 20 20 20 20 20 20 20   += t;.         
197d0 20 20 20 20 20 20 20 6c 65 6e 20 2d 3d 20 74 3b         len -= t;
197e0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
197f0 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 64      /* Process d
19800 61 74 61 20 69 6e 20 36 34 2d 62 79 74 65 20 63  ata in 64-byte c
19810 68 75 6e 6b 73 20 2a 2f 0a 0a 20 20 20 20 20 20  hunks */..      
19820 20 20 77 68 69 6c 65 20 28 6c 65 6e 20 3e 3d 20    while (len >= 
19830 36 34 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  64) {.          
19840 20 20 20 20 20 20 6d 65 6d 63 70 79 28 63 74 78        memcpy(ctx
19850 2d 3e 69 6e 2c 20 62 75 66 2c 20 36 34 29 3b 0a  ->in, buf, 64);.
19860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19870 62 79 74 65 52 65 76 65 72 73 65 28 63 74 78 2d  byteReverse(ctx-
19880 3e 69 6e 2c 20 31 36 29 3b 0a 20 20 20 20 20 20  >in, 16);.      
19890 20 20 20 20 20 20 20 20 20 20 4d 44 35 54 72 61            MD5Tra
198a0 6e 73 66 6f 72 6d 28 63 74 78 2d 3e 62 75 66 2c  nsform(ctx->buf,
198b0 20 28 75 69 6e 74 33 32 20 2a 29 63 74 78 2d 3e   (uint32 *)ctx->
198c0 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  in);.           
198d0 20 20 20 20 20 62 75 66 20 2b 3d 20 36 34 3b 0a       buf += 64;.
198e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
198f0 6c 65 6e 20 2d 3d 20 36 34 3b 0a 20 20 20 20 20  len -= 64;.     
19900 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
19910 20 48 61 6e 64 6c 65 20 61 6e 79 20 72 65 6d 61   Handle any rema
19920 69 6e 69 6e 67 20 62 79 74 65 73 20 6f 66 20 64  ining bytes of d
19930 61 74 61 2e 20 2a 2f 0a 0a 20 20 20 20 20 20 20  ata. */..       
19940 20 6d 65 6d 63 70 79 28 63 74 78 2d 3e 69 6e 2c   memcpy(ctx->in,
19950 20 62 75 66 2c 20 6c 65 6e 29 3b 0a 7d 0a 0a 2f   buf, len);.}../
19960 2a 0a 20 2a 20 46 69 6e 61 6c 20 77 72 61 70 75  *. * Final wrapu
19970 70 20 2d 20 70 61 64 20 74 6f 20 36 34 2d 62 79  p - pad to 64-by
19980 74 65 20 62 6f 75 6e 64 61 72 79 20 77 69 74 68  te boundary with
19990 20 74 68 65 20 62 69 74 20 70 61 74 74 65 72 6e   the bit pattern
199a0 20 0a 20 2a 20 31 20 30 2a 20 28 36 34 2d 62 69   . * 1 0* (64-bi
199b0 74 20 63 6f 75 6e 74 20 6f 66 20 62 69 74 73 20  t count of bits 
199c0 70 72 6f 63 65 73 73 65 64 2c 20 4d 53 42 2d 66  processed, MSB-f
199d0 69 72 73 74 29 0a 20 2a 2f 0a 73 74 61 74 69 63  irst). */.static
199e0 20 76 6f 69 64 20 4d 44 35 46 69 6e 61 6c 28 75   void MD5Final(u
199f0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64 69 67  nsigned char dig
19a00 65 73 74 5b 31 36 5d 2c 20 4d 44 35 43 6f 6e 74  est[16], MD5Cont
19a10 65 78 74 20 2a 63 74 78 29 7b 0a 20 20 20 20 20  ext *ctx){.     
19a20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 6f 75 6e     unsigned coun
19a30 74 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67  t;.        unsig
19a40 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a 0a 20 20  ned char *p;..  
19a50 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65        /* Compute
19a60 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
19a70 20 6d 6f 64 20 36 34 20 2a 2f 0a 20 20 20 20 20   mod 64 */.     
19a80 20 20 20 63 6f 75 6e 74 20 3d 20 28 63 74 78 2d     count = (ctx-
19a90 3e 62 69 74 73 5b 30 5d 20 3e 3e 20 33 29 20 26  >bits[0] >> 3) &
19aa0 20 30 78 33 46 3b 0a 0a 20 20 20 20 20 20 20 20   0x3F;..        
19ab0 2f 2a 20 53 65 74 20 74 68 65 20 66 69 72 73 74  /* Set the first
19ac0 20 63 68 61 72 20 6f 66 20 70 61 64 64 69 6e 67   char of padding
19ad0 20 74 6f 20 30 78 38 30 2e 20 20 54 68 69 73 20   to 0x80.  This 
19ae0 69 73 20 73 61 66 65 20 73 69 6e 63 65 20 74 68  is safe since th
19af0 65 72 65 20 69 73 0a 20 20 20 20 20 20 20 20 20  ere is.         
19b00 20 20 61 6c 77 61 79 73 20 61 74 20 6c 65 61 73    always at leas
19b10 74 20 6f 6e 65 20 62 79 74 65 20 66 72 65 65 20  t one byte free 
19b20 2a 2f 0a 20 20 20 20 20 20 20 20 70 20 3d 20 63  */.        p = c
19b30 74 78 2d 3e 69 6e 20 2b 20 63 6f 75 6e 74 3b 0a  tx->in + count;.
19b40 20 20 20 20 20 20 20 20 2a 70 2b 2b 20 3d 20 30          *p++ = 0
19b50 78 38 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  x80;..        /*
19b60 20 42 79 74 65 73 20 6f 66 20 70 61 64 64 69 6e   Bytes of paddin
19b70 67 20 6e 65 65 64 65 64 20 74 6f 20 6d 61 6b 65  g needed to make
19b80 20 36 34 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   64 bytes */.   
19b90 20 20 20 20 20 63 6f 75 6e 74 20 3d 20 36 34 20       count = 64 
19ba0 2d 20 31 20 2d 20 63 6f 75 6e 74 3b 0a 0a 20 20  - 1 - count;..  
19bb0 20 20 20 20 20 20 2f 2a 20 50 61 64 20 6f 75 74        /* Pad out
19bc0 20 74 6f 20 35 36 20 6d 6f 64 20 36 34 20 2a 2f   to 56 mod 64 */
19bd0 0a 20 20 20 20 20 20 20 20 69 66 20 28 63 6f 75  .        if (cou
19be0 6e 74 20 3c 20 38 29 20 7b 0a 20 20 20 20 20 20  nt < 8) {.      
19bf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77 6f            /* Two
19c00 20 6c 6f 74 73 20 6f 66 20 70 61 64 64 69 6e 67   lots of padding
19c10 3a 20 20 50 61 64 20 74 68 65 20 66 69 72 73 74  :  Pad the first
19c20 20 62 6c 6f 63 6b 20 74 6f 20 36 34 20 62 79 74   block to 64 byt
19c30 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  es */.          
19c40 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20        memset(p, 
19c50 30 2c 20 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20  0, count);.     
19c60 20 20 20 20 20 20 20 20 20 20 20 62 79 74 65 52             byteR
19c70 65 76 65 72 73 65 28 63 74 78 2d 3e 69 6e 2c 20  everse(ctx->in, 
19c80 31 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  16);.           
19c90 20 20 20 20 20 4d 44 35 54 72 61 6e 73 66 6f 72       MD5Transfor
19ca0 6d 28 63 74 78 2d 3e 62 75 66 2c 20 28 75 69 6e  m(ctx->buf, (uin
19cb0 74 33 32 20 2a 29 63 74 78 2d 3e 69 6e 29 3b 0a  t32 *)ctx->in);.
19cc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19cd0 20 2f 2a 20 4e 6f 77 20 66 69 6c 6c 20 74 68 65   /* Now fill the
19ce0 20 6e 65 78 74 20 62 6c 6f 63 6b 20 77 69 74 68   next block with
19cf0 20 35 36 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   56 bytes */.   
19d00 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d               mem
19d10 73 65 74 28 63 74 78 2d 3e 69 6e 2c 20 30 2c 20  set(ctx->in, 0, 
19d20 35 36 29 3b 0a 20 20 20 20 20 20 20 20 7d 20 65  56);.        } e
19d30 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20  lse {.          
19d40 20 20 20 20 20 20 2f 2a 20 50 61 64 20 62 6c 6f        /* Pad blo
19d50 63 6b 20 74 6f 20 35 36 20 62 79 74 65 73 20 2a  ck to 56 bytes *
19d60 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
19d70 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 63    memset(p, 0, c
19d80 6f 75 6e 74 2d 38 29 3b 0a 20 20 20 20 20 20 20  ount-8);.       
19d90 20 7d 0a 20 20 20 20 20 20 20 20 62 79 74 65 52   }.        byteR
19da0 65 76 65 72 73 65 28 63 74 78 2d 3e 69 6e 2c 20  everse(ctx->in, 
19db0 31 34 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  14);..        /*
19dc0 20 41 70 70 65 6e 64 20 6c 65 6e 67 74 68 20 69   Append length i
19dd0 6e 20 62 69 74 73 20 61 6e 64 20 74 72 61 6e 73  n bits and trans
19de0 66 6f 72 6d 20 2a 2f 0a 20 20 20 20 20 20 20 20  form */.        
19df0 28 28 75 69 6e 74 33 32 20 2a 29 63 74 78 2d 3e  ((uint32 *)ctx->
19e00 69 6e 29 5b 20 31 34 20 5d 20 3d 20 63 74 78 2d  in)[ 14 ] = ctx-
19e10 3e 62 69 74 73 5b 30 5d 3b 0a 20 20 20 20 20 20  >bits[0];.      
19e20 20 20 28 28 75 69 6e 74 33 32 20 2a 29 63 74 78    ((uint32 *)ctx
19e30 2d 3e 69 6e 29 5b 20 31 35 20 5d 20 3d 20 63 74  ->in)[ 15 ] = ct
19e40 78 2d 3e 62 69 74 73 5b 31 5d 3b 0a 0a 20 20 20  x->bits[1];..   
19e50 20 20 20 20 20 4d 44 35 54 72 61 6e 73 66 6f 72       MD5Transfor
19e60 6d 28 63 74 78 2d 3e 62 75 66 2c 20 28 75 69 6e  m(ctx->buf, (uin
19e70 74 33 32 20 2a 29 63 74 78 2d 3e 69 6e 29 3b 0a  t32 *)ctx->in);.
19e80 20 20 20 20 20 20 20 20 62 79 74 65 52 65 76 65          byteReve
19e90 72 73 65 28 28 75 6e 73 69 67 6e 65 64 20 63 68  rse((unsigned ch
19ea0 61 72 20 2a 29 63 74 78 2d 3e 62 75 66 2c 20 34  ar *)ctx->buf, 4
19eb0 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  );.        memcp
19ec0 79 28 64 69 67 65 73 74 2c 20 63 74 78 2d 3e 62  y(digest, ctx->b
19ed0 75 66 2c 20 31 36 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  uf, 16);.}../*.*
19ee0 2a 20 43 6f 6e 76 65 72 74 20 61 20 31 32 38 2d  * Convert a 128-
19ef0 62 69 74 20 4d 44 35 20 64 69 67 65 73 74 20 69  bit MD5 digest i
19f00 6e 74 6f 20 61 20 33 32 2d 64 69 67 69 74 20 62  nto a 32-digit b
19f10 61 73 65 2d 31 36 20 6e 75 6d 62 65 72 2e 0a 2a  ase-16 number..*
19f20 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 4d 44  /.static void MD
19f30 35 44 69 67 65 73 74 54 6f 42 61 73 65 31 36 28  5DigestToBase16(
19f40 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
19f50 69 67 65 73 74 2c 20 63 68 61 72 20 2a 7a 42 75  igest, char *zBu
19f60 66 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61  f){.  static cha
19f70 72 20 63 6f 6e 73 74 20 7a 45 6e 63 6f 64 65 5b  r const zEncode[
19f80 5d 20 3d 20 22 30 31 32 33 34 35 36 37 38 39 61  ] = "0123456789a
19f90 62 63 64 65 66 22 3b 0a 20 20 69 6e 74 20 69 2c  bcdef";.  int i,
19fa0 20 6a 3b 0a 0a 20 20 66 6f 72 28 6a 3d 69 3d 30   j;..  for(j=i=0
19fb0 3b 20 69 3c 31 36 3b 20 69 2b 2b 29 7b 0a 20 20  ; i<16; i++){.  
19fc0 20 20 69 6e 74 20 61 20 3d 20 64 69 67 65 73 74    int a = digest
19fd0 5b 69 5d 3b 0a 20 20 20 20 7a 42 75 66 5b 6a 2b  [i];.    zBuf[j+
19fe0 2b 5d 20 3d 20 7a 45 6e 63 6f 64 65 5b 28 61 3e  +] = zEncode[(a>
19ff0 3e 34 29 26 30 78 66 5d 3b 0a 20 20 20 20 7a 42  >4)&0xf];.    zB
1a000 75 66 5b 6a 2b 2b 5d 20 3d 20 7a 45 6e 63 6f 64  uf[j++] = zEncod
1a010 65 5b 61 20 26 20 30 78 66 5d 3b 0a 20 20 7d 0a  e[a & 0xf];.  }.
1a020 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 7d    zBuf[j] = 0;.}
1a030 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  .../*.** Convert
1a040 20 61 20 31 32 38 2d 62 69 74 20 4d 44 35 20 64   a 128-bit MD5 d
1a050 69 67 65 73 74 20 69 6e 74 6f 20 73 65 71 75 65  igest into seque
1a060 6e 63 79 20 6f 66 20 65 69 67 68 74 20 35 2d 64  ncy of eight 5-d
1a070 69 67 69 74 20 69 6e 74 65 67 65 72 73 0a 2a 2a  igit integers.**
1a080 20 65 61 63 68 20 72 65 70 72 65 73 65 6e 74 69   each representi
1a090 6e 67 20 31 36 20 62 69 74 73 20 6f 66 20 74 68  ng 16 bits of th
1a0a0 65 20 64 69 67 65 73 74 20 61 6e 64 20 73 65 70  e digest and sep
1a0b0 61 72 61 74 65 64 20 66 72 6f 6d 20 65 61 63 68  arated from each
1a0c0 0a 2a 2a 20 6f 74 68 65 72 20 62 79 20 61 20 22  .** other by a "
1a0d0 2d 22 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f  -" character..*/
1a0e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 4d 44 35  .static void MD5
1a0f0 44 69 67 65 73 74 54 6f 42 61 73 65 31 30 78 38  DigestToBase10x8
1a100 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64  (unsigned char d
1a110 69 67 65 73 74 5b 31 36 5d 2c 20 63 68 61 72 20  igest[16], char 
1a120 7a 44 69 67 65 73 74 5b 35 30 5d 29 7b 0a 20 20  zDigest[50]){.  
1a130 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 75 6e 73 69  int i, j;.  unsi
1a140 67 6e 65 64 20 69 6e 74 20 78 3b 0a 20 20 66 6f  gned int x;.  fo
1a150 72 28 69 3d 6a 3d 30 3b 20 69 3c 31 36 3b 20 69  r(i=j=0; i<16; i
1a160 2b 3d 32 29 7b 0a 20 20 20 20 78 20 3d 20 64 69  +=2){.    x = di
1a170 67 65 73 74 5b 69 5d 2a 32 35 36 20 2b 20 64 69  gest[i]*256 + di
1a180 67 65 73 74 5b 69 2b 31 5d 3b 0a 20 20 20 20 69  gest[i+1];.    i
1a190 66 28 20 69 3e 30 20 29 20 7a 44 69 67 65 73 74  f( i>0 ) zDigest
1a1a0 5b 6a 2b 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20 20  [j++] = '-';.   
1a1b0 20 73 70 72 69 6e 74 66 28 26 7a 44 69 67 65 73   sprintf(&zDiges
1a1c0 74 5b 6a 5d 2c 20 22 25 30 35 75 22 2c 20 78 29  t[j], "%05u", x)
1a1d0 3b 0a 20 20 20 20 6a 20 2b 3d 20 35 3b 0a 20 20  ;.    j += 5;.  
1a1e0 7d 0a 20 20 7a 44 69 67 65 73 74 5b 6a 5d 20 3d  }.  zDigest[j] =
1a1f0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 54   0;.}../*.** A T
1a200 43 4c 20 63 6f 6d 6d 61 6e 64 20 66 6f 72 20 6d  CL command for m
1a210 64 35 2e 20 20 54 68 65 20 61 72 67 75 6d 65 6e  d5.  The argumen
1a220 74 20 69 73 20 74 68 65 20 74 65 78 74 20 74 6f  t is the text to
1a230 20 62 65 20 68 61 73 68 65 64 2e 20 20 54 68 65   be hashed.  The
1a240 0a 2a 2a 20 52 65 73 75 6c 74 20 69 73 20 74 68  .** Result is th
1a250 65 20 68 61 73 68 20 69 6e 20 62 61 73 65 36 34  e hash in base64
1a260 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .  .*/.static in
1a270 74 20 6d 64 35 5f 63 6d 64 28 76 6f 69 64 2a 63  t md5_cmd(void*c
1a280 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  d, Tcl_Interp *i
1a290 6e 74 65 72 70 2c 20 69 6e 74 20 61 72 67 63 2c  nterp, int argc,
1a2a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72   const char **ar
1a2b0 67 76 29 7b 0a 20 20 4d 44 35 43 6f 6e 74 65 78  gv){.  MD5Contex
1a2c0 74 20 63 74 78 3b 0a 20 20 75 6e 73 69 67 6e 65  t ctx;.  unsigne
1a2d0 64 20 63 68 61 72 20 64 69 67 65 73 74 5b 31 36  d char digest[16
1a2e0 5d 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35  ];.  char zBuf[5
1a2f0 30 5d 3b 0a 20 20 76 6f 69 64 20 28 2a 63 6f 6e  0];.  void (*con
1a300 76 65 72 74 65 72 29 28 75 6e 73 69 67 6e 65 64  verter)(unsigned
1a310 20 63 68 61 72 2a 2c 20 63 68 61 72 2a 29 3b 0a   char*, char*);.
1a320 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29  .  if( argc!=2 )
1a330 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1a340 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 77  Result(interp,"w
1a350 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
1a360 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
1a370 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 20 22 20  [0], .        " 
1a380 54 45 58 54 5c 22 22 2c 20 30 29 3b 0a 20 20 20  TEXT\"", 0);.   
1a390 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1a3a0 52 3b 0a 20 20 7d 0a 20 20 4d 44 35 49 6e 69 74  R;.  }.  MD5Init
1a3b0 28 26 63 74 78 29 3b 0a 20 20 4d 44 35 55 70 64  (&ctx);.  MD5Upd
1a3c0 61 74 65 28 26 63 74 78 2c 20 28 75 6e 73 69 67  ate(&ctx, (unsig
1a3d0 6e 65 64 20 63 68 61 72 2a 29 61 72 67 76 5b 31  ned char*)argv[1
1a3e0 5d 2c 20 28 75 6e 73 69 67 6e 65 64 29 73 74 72  ], (unsigned)str
1a3f0 6c 65 6e 28 61 72 67 76 5b 31 5d 29 29 3b 0a 20  len(argv[1]));. 
1a400 20 4d 44 35 46 69 6e 61 6c 28 64 69 67 65 73 74   MD5Final(digest
1a410 2c 20 26 63 74 78 29 3b 0a 20 20 63 6f 6e 76 65  , &ctx);.  conve
1a420 72 74 65 72 20 3d 20 28 76 6f 69 64 28 2a 29 28  rter = (void(*)(
1a430 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 2c 63  unsigned char*,c
1a440 68 61 72 2a 29 29 63 64 3b 0a 20 20 63 6f 6e 76  har*))cd;.  conv
1a450 65 72 74 65 72 28 64 69 67 65 73 74 2c 20 7a 42  erter(digest, zB
1a460 75 66 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  uf);.  Tcl_Appen
1a470 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1a480 7a 42 75 66 2c 20 28 63 68 61 72 2a 29 30 29 3b  zBuf, (char*)0);
1a490 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1a4a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 54 43 4c  ;.}../*.** A TCL
1a4b0 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 74 61 6b 65   command to take
1a4c0 20 74 68 65 20 6d 64 35 20 68 61 73 68 20 6f 66   the md5 hash of
1a4d0 20 61 20 66 69 6c 65 2e 20 20 54 68 65 20 61 72   a file.  The ar
1a4e0 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a  gument is the.**
1a4f0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   name of the fil
1a500 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1a510 20 6d 64 35 66 69 6c 65 5f 63 6d 64 28 76 6f 69   md5file_cmd(voi
1a520 64 2a 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70  d*cd, Tcl_Interp
1a530 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 61 72 67  *interp, int arg
1a540 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  c, const char **
1a550 61 72 67 76 29 7b 0a 20 20 46 49 4c 45 20 2a 69  argv){.  FILE *i
1a560 6e 3b 0a 20 20 4d 44 35 43 6f 6e 74 65 78 74 20  n;.  MD5Context 
1a570 63 74 78 3b 0a 20 20 76 6f 69 64 20 28 2a 63 6f  ctx;.  void (*co
1a580 6e 76 65 72 74 65 72 29 28 75 6e 73 69 67 6e 65  nverter)(unsigne
1a590 64 20 63 68 61 72 2a 2c 20 63 68 61 72 2a 29 3b  d char*, char*);
1a5a0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1a5b0 20 64 69 67 65 73 74 5b 31 36 5d 3b 0a 20 20 63   digest[16];.  c
1a5c0 68 61 72 20 7a 42 75 66 5b 31 30 32 34 30 5d 3b  har zBuf[10240];
1a5d0 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20  ..  if( argc!=2 
1a5e0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1a5f0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22  dResult(interp,"
1a600 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
1a610 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
1a620 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 20 22  v[0], .        "
1a630 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30 29   FILENAME\"", 0)
1a640 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1a650 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 6e  _ERROR;.  }.  in
1a660 20 3d 20 66 6f 70 65 6e 28 61 72 67 76 5b 31 5d   = fopen(argv[1]
1a670 2c 22 72 62 22 29 3b 0a 20 20 69 66 28 20 69 6e  ,"rb");.  if( in
1a680 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  ==0 ){.    Tcl_A
1a690 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1a6a0 72 70 2c 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70  rp,"unable to op
1a6b0 65 6e 20 66 69 6c 65 20 5c 22 22 2c 20 61 72 67  en file \"", arg
1a6c0 76 5b 31 5d 2c 20 0a 20 20 20 20 20 20 20 20 20  v[1], .         
1a6d0 22 5c 22 20 66 6f 72 20 72 65 61 64 69 6e 67 22  "\" for reading"
1a6e0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1a6f0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1a700 20 20 4d 44 35 49 6e 69 74 28 26 63 74 78 29 3b    MD5Init(&ctx);
1a710 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20  .  for(;;){.    
1a720 69 6e 74 20 6e 3b 0a 20 20 20 20 6e 20 3d 20 28  int n;.    n = (
1a730 69 6e 74 29 66 72 65 61 64 28 7a 42 75 66 2c 20  int)fread(zBuf, 
1a740 31 2c 20 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c  1, sizeof(zBuf),
1a750 20 69 6e 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c   in);.    if( n<
1a760 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
1a770 4d 44 35 55 70 64 61 74 65 28 26 63 74 78 2c 20  MD5Update(&ctx, 
1a780 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
1a790 7a 42 75 66 2c 20 28 75 6e 73 69 67 6e 65 64 29  zBuf, (unsigned)
1a7a0 6e 29 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65  n);.  }.  fclose
1a7b0 28 69 6e 29 3b 0a 20 20 4d 44 35 46 69 6e 61 6c  (in);.  MD5Final
1a7c0 28 64 69 67 65 73 74 2c 20 26 63 74 78 29 3b 0a  (digest, &ctx);.
1a7d0 20 20 63 6f 6e 76 65 72 74 65 72 20 3d 20 28 76    converter = (v
1a7e0 6f 69 64 28 2a 29 28 75 6e 73 69 67 6e 65 64 20  oid(*)(unsigned 
1a7f0 63 68 61 72 2a 2c 63 68 61 72 2a 29 29 63 64 3b  char*,char*))cd;
1a800 0a 20 20 63 6f 6e 76 65 72 74 65 72 28 64 69 67  .  converter(dig
1a810 65 73 74 2c 20 7a 42 75 66 29 3b 0a 20 20 54 63  est, zBuf);.  Tc
1a820 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1a830 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 28 63 68  nterp, zBuf, (ch
1a840 61 72 2a 29 30 29 3b 0a 20 20 72 65 74 75 72 6e  ar*)0);.  return
1a850 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1a860 2a 20 52 65 67 69 73 74 65 72 20 74 68 65 20 66  * Register the f
1a870 6f 75 72 20 6e 65 77 20 54 43 4c 20 63 6f 6d 6d  our new TCL comm
1a880 61 6e 64 73 20 66 6f 72 20 67 65 6e 65 72 61 74  ands for generat
1a890 69 6e 67 20 4d 44 35 20 63 68 65 63 6b 73 75 6d  ing MD5 checksum
1a8a0 73 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 54 43  s.** with the TC
1a8b0 4c 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 2a  L interpreter..*
1a8c0 2f 0a 69 6e 74 20 4d 64 35 5f 49 6e 69 74 28 54  /.int Md5_Init(T
1a8d0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1a8e0 70 29 7b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65  p){.  Tcl_Create
1a8f0 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
1a900 22 6d 64 35 22 2c 20 28 54 63 6c 5f 43 6d 64 50  "md5", (Tcl_CmdP
1a910 72 6f 63 2a 29 6d 64 35 5f 63 6d 64 2c 0a 20 20  roc*)md5_cmd,.  
1a920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a930 20 20 4d 44 35 44 69 67 65 73 74 54 6f 42 61 73    MD5DigestToBas
1a940 65 31 36 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43  e16, 0);.  Tcl_C
1a950 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74  reateCommand(int
1a960 65 72 70 2c 20 22 6d 64 35 2d 31 30 78 38 22 2c  erp, "md5-10x8",
1a970 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 6d   (Tcl_CmdProc*)m
1a980 64 35 5f 63 6d 64 2c 0a 20 20 20 20 20 20 20 20  d5_cmd,.        
1a990 20 20 20 20 20 20 20 20 20 20 20 20 4d 44 35 44              MD5D
1a9a0 69 67 65 73 74 54 6f 42 61 73 65 31 30 78 38 2c  igestToBase10x8,
1a9b0 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74   0);.  Tcl_Creat
1a9c0 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  eCommand(interp,
1a9d0 20 22 6d 64 35 66 69 6c 65 22 2c 20 28 54 63 6c   "md5file", (Tcl
1a9e0 5f 43 6d 64 50 72 6f 63 2a 29 6d 64 35 66 69 6c  _CmdProc*)md5fil
1a9f0 65 5f 63 6d 64 2c 0a 20 20 20 20 20 20 20 20 20  e_cmd,.         
1aa00 20 20 20 20 20 20 20 20 20 20 20 4d 44 35 44 69             MD5Di
1aa10 67 65 73 74 54 6f 42 61 73 65 31 36 2c 20 30 29  gestToBase16, 0)
1aa20 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 43 6f  ;.  Tcl_CreateCo
1aa30 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 6d  mmand(interp, "m
1aa40 64 35 66 69 6c 65 2d 31 30 78 38 22 2c 20 28 54  d5file-10x8", (T
1aa50 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 6d 64 35 66  cl_CmdProc*)md5f
1aa60 69 6c 65 5f 63 6d 64 2c 0a 20 20 20 20 20 20 20  ile_cmd,.       
1aa70 20 20 20 20 20 20 20 20 20 20 20 20 20 4d 44 35               MD5
1aa80 44 69 67 65 73 74 54 6f 42 61 73 65 31 30 78 38  DigestToBase10x8
1aa90 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
1aaa0 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  CL_OK;.}.#endif 
1aab0 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  /* defined(SQLIT
1aac0 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e  E_TEST) || defin
1aad0 65 64 28 53 51 4c 49 54 45 5f 54 43 4c 4d 44 35  ed(SQLITE_TCLMD5
1aae0 29 20 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65  ) */..#if define
1aaf0 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f  d(SQLITE_TEST)./
1ab00 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 74 65 73 74  *.** During test
1ab10 69 6e 67 2c 20 74 68 65 20 73 70 65 63 69 61 6c  ing, the special
1ab20 20 6d 64 35 73 75 6d 28 29 20 61 67 67 72 65 67   md5sum() aggreg
1ab30 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  ate function is 
1ab40 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 20 69 6e  available..** in
1ab50 73 69 64 65 20 53 51 4c 69 74 65 2e 20 20 54 68  side SQLite.  Th
1ab60 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74  e following rout
1ab70 69 6e 65 73 20 69 6d 70 6c 65 6d 65 6e 74 20 74  ines implement t
1ab80 68 61 74 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  hat function..*/
1ab90 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 64 35  .static void md5
1aba0 73 74 65 70 28 73 71 6c 69 74 65 33 5f 63 6f 6e  step(sqlite3_con
1abb0 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69  text *context, i
1abc0 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
1abd0 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a  _value **argv){.
1abe0 20 20 4d 44 35 43 6f 6e 74 65 78 74 20 2a 70 3b    MD5Context *p;
1abf0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
1ac00 61 72 67 63 3c 31 20 29 20 72 65 74 75 72 6e 3b  argc<1 ) return;
1ac10 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61  .  p = sqlite3_a
1ac20 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
1ac30 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66  (context, sizeof
1ac40 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 3d 3d  (*p));.  if( p==
1ac50 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
1ac60 28 20 21 70 2d 3e 69 73 49 6e 69 74 20 29 7b 0a  ( !p->isInit ){.
1ac70 20 20 20 20 4d 44 35 49 6e 69 74 28 70 29 3b 0a      MD5Init(p);.
1ac80 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
1ac90 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <argc; i++){.   
1aca0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61   const char *zDa
1acb0 74 61 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69  ta = (char*)sqli
1acc0 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
1acd0 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28  rgv[i]);.    if(
1ace0 20 7a 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20   zData ){.      
1acf0 4d 44 35 55 70 64 61 74 65 28 70 2c 20 28 75 6e  MD5Update(p, (un
1ad00 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 44 61  signed char*)zDa
1ad10 74 61 2c 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  ta, (int)strlen(
1ad20 7a 44 61 74 61 29 29 3b 0a 20 20 20 20 7d 0a 20  zData));.    }. 
1ad30 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
1ad40 20 6d 64 35 66 69 6e 61 6c 69 7a 65 28 73 71 6c   md5finalize(sql
1ad50 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
1ad60 6e 74 65 78 74 29 7b 0a 20 20 4d 44 35 43 6f 6e  ntext){.  MD5Con
1ad70 74 65 78 74 20 2a 70 3b 0a 20 20 75 6e 73 69 67  text *p;.  unsig
1ad80 6e 65 64 20 63 68 61 72 20 64 69 67 65 73 74 5b  ned char digest[
1ad90 31 36 5d 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  16];.  char zBuf
1ada0 5b 33 33 5d 3b 0a 20 20 70 20 3d 20 73 71 6c 69  [33];.  p = sqli
1adb0 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
1adc0 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73  ntext(context, s
1add0 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 4d 44  izeof(*p));.  MD
1ade0 35 46 69 6e 61 6c 28 64 69 67 65 73 74 2c 70 29  5Final(digest,p)
1adf0 3b 0a 20 20 4d 44 35 44 69 67 65 73 74 54 6f 42  ;.  MD5DigestToB
1ae00 61 73 65 31 36 28 64 69 67 65 73 74 2c 20 7a 42  ase16(digest, zB
1ae10 75 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  uf);.  sqlite3_r
1ae20 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
1ae30 78 74 2c 20 7a 42 75 66 2c 20 2d 31 2c 20 53 51  xt, zBuf, -1, SQ
1ae40 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
1ae50 0a 7d 0a 69 6e 74 20 4d 64 35 5f 52 65 67 69 73  .}.int Md5_Regis
1ae60 74 65 72 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ter(sqlite3 *db)
1ae70 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  {.  int rc = sql
1ae80 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
1ae90 74 69 6f 6e 28 64 62 2c 20 22 6d 64 35 73 75 6d  tion(db, "md5sum
1aea0 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  ", -1, SQLITE_UT
1aeb0 46 38 2c 20 30 2c 20 30 2c 20 0a 20 20 20 20 20  F8, 0, 0, .     
1aec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aed0 20 20 20 20 20 20 20 20 20 20 20 20 6d 64 35 73              md5s
1aee0 74 65 70 2c 20 6d 64 35 66 69 6e 61 6c 69 7a 65  tep, md5finalize
1aef0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6f 76 65  );.  sqlite3_ove
1af00 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e 28 64  rload_function(d
1af10 62 2c 20 22 6d 64 35 73 75 6d 22 2c 20 2d 31 29  b, "md5sum", -1)
1af20 3b 20 20 2f 2a 20 54 6f 20 65 78 65 72 63 69 73  ;  /* To exercis
1af30 65 20 74 68 69 73 20 41 50 49 20 2a 2f 0a 20 20  e this API */.  
1af40 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
1af50 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53  dif /* defined(S
1af60 51 4c 49 54 45 5f 54 45 53 54 29 20 2a 2f 0a 0a  QLITE_TEST) */..
1af70 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61  ./*.** If the ma
1af80 63 72 6f 20 54 43 4c 53 48 20 69 73 20 6f 6e 65  cro TCLSH is one
1af90 2c 20 74 68 65 6e 20 70 75 74 20 69 6e 20 63 6f  , then put in co
1afa0 64 65 20 74 68 69 73 20 66 6f 72 20 74 68 65 0a  de this for the.
1afb0 2a 2a 20 22 6d 61 69 6e 22 20 72 6f 75 74 69 6e  ** "main" routin
1afc0 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 69 74  e that will init
1afd0 69 61 6c 69 7a 65 20 54 63 6c 20 61 6e 64 20 74  ialize Tcl and t
1afe0 61 6b 65 20 69 6e 70 75 74 20 66 72 6f 6d 0a 2a  ake input from.*
1aff0 2a 20 73 74 61 6e 64 61 72 64 20 69 6e 70 75 74  * standard input
1b000 2c 20 6f 72 20 69 66 20 61 20 66 69 6c 65 20 69  , or if a file i
1b010 73 20 6e 61 6d 65 64 20 6f 6e 20 74 68 65 20 63  s named on the c
1b020 6f 6d 6d 61 6e 64 20 6c 69 6e 65 0a 2a 2a 20 74  ommand line.** t
1b030 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
1b040 65 72 20 72 65 61 64 73 20 61 6e 64 20 65 76 61  er reads and eva
1b050 6c 75 61 74 65 73 20 74 68 61 74 20 66 69 6c 65  luates that file
1b060 2e 0a 2a 2f 0a 23 69 66 20 54 43 4c 53 48 3d 3d  ..*/.#if TCLSH==
1b070 31 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  1.static const c
1b080 68 61 72 20 2a 74 63 6c 73 68 5f 6d 61 69 6e 5f  har *tclsh_main_
1b090 6c 6f 6f 70 28 76 6f 69 64 29 7b 0a 20 20 73 74  loop(void){.  st
1b0a0 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
1b0b0 7a 4d 61 69 6e 6c 6f 6f 70 5b 5d 20 3d 0a 20 20  zMainloop[] =.  
1b0c0 20 20 22 73 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e    "set line {}\n
1b0d0 22 0a 20 20 20 20 22 77 68 69 6c 65 20 7b 21 5b  ".    "while {![
1b0e0 65 6f 66 20 73 74 64 69 6e 5d 7d 20 7b 5c 6e 22  eof stdin]} {\n"
1b0f0 0a 20 20 20 20 20 20 22 69 66 20 7b 24 6c 69 6e  .      "if {$lin
1b100 65 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20  e!=\"\"} {\n".  
1b110 20 20 20 20 20 20 22 70 75 74 73 20 2d 6e 6f 6e        "puts -non
1b120 65 77 6c 69 6e 65 20 5c 22 3e 20 5c 22 5c 6e 22  ewline \"> \"\n"
1b130 0a 20 20 20 20 20 20 22 7d 20 65 6c 73 65 20 7b  .      "} else {
1b140 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 70 75 74  \n".        "put
1b150 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22 25  s -nonewline \"%
1b160 20 5c 22 5c 6e 22 0a 20 20 20 20 20 20 22 7d 5c   \"\n".      "}\
1b170 6e 22 0a 20 20 20 20 20 20 22 66 6c 75 73 68 20  n".      "flush 
1b180 73 74 64 6f 75 74 5c 6e 22 0a 20 20 20 20 20 20  stdout\n".      
1b190 22 61 70 70 65 6e 64 20 6c 69 6e 65 20 5b 67 65  "append line [ge
1b1a0 74 73 20 73 74 64 69 6e 5d 5c 6e 22 0a 20 20 20  ts stdin]\n".   
1b1b0 20 20 20 22 69 66 20 7b 5b 69 6e 66 6f 20 63 6f     "if {[info co
1b1c0 6d 70 6c 65 74 65 20 24 6c 69 6e 65 5d 7d 20 7b  mplete $line]} {
1b1d0 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 69 66 20  \n".        "if 
1b1e0 7b 5b 63 61 74 63 68 20 7b 75 70 6c 65 76 65 6c  {[catch {uplevel
1b1f0 20 23 30 20 24 6c 69 6e 65 7d 20 72 65 73 75 6c   #0 $line} resul
1b200 74 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20  t]} {\n".       
1b210 20 20 20 22 70 75 74 73 20 73 74 64 65 72 72 20     "puts stderr 
1b220 5c 22 45 72 72 6f 72 3a 20 24 72 65 73 75 6c 74  \"Error: $result
1b230 5c 22 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 7d  \"\n".        "}
1b240 20 65 6c 73 65 69 66 20 7b 24 72 65 73 75 6c 74   elseif {$result
1b250 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20  !=\"\"} {\n".   
1b260 20 20 20 20 20 20 20 22 70 75 74 73 20 24 72 65         "puts $re
1b270 73 75 6c 74 5c 6e 22 0a 20 20 20 20 20 20 20 20  sult\n".        
1b280 22 7d 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 73  "}\n".        "s
1b290 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20  et line {}\n".  
1b2a0 20 20 20 20 22 7d 20 65 6c 73 65 20 7b 5c 6e 22      "} else {\n"
1b2b0 0a 20 20 20 20 20 20 20 20 22 61 70 70 65 6e 64  .        "append
1b2c0 20 6c 69 6e 65 20 5c 5c 6e 5c 6e 22 0a 20 20 20   line \\n\n".   
1b2d0 20 20 20 22 7d 5c 6e 22 0a 20 20 20 20 22 7d 5c     "}\n".    "}\
1b2e0 6e 22 0a 20 20 3b 0a 20 20 72 65 74 75 72 6e 20  n".  ;.  return 
1b2f0 7a 4d 61 69 6e 6c 6f 6f 70 3b 0a 7d 0a 23 65 6e  zMainloop;.}.#en
1b300 64 69 66 0a 23 69 66 20 54 43 4c 53 48 3d 3d 32  dif.#if TCLSH==2
1b310 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
1b320 61 72 20 2a 74 63 6c 73 68 5f 6d 61 69 6e 5f 6c  ar *tclsh_main_l
1b330 6f 6f 70 28 76 6f 69 64 29 3b 0a 23 65 6e 64 69  oop(void);.#endi
1b340 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
1b350 5f 54 45 53 54 0a 73 74 61 74 69 63 20 76 6f 69  _TEST.static voi
1b360 64 20 69 6e 69 74 5f 61 6c 6c 28 54 63 6c 5f 49  d init_all(Tcl_I
1b370 6e 74 65 72 70 20 2a 29 3b 0a 73 74 61 74 69 63  nterp *);.static
1b380 20 69 6e 74 20 69 6e 69 74 5f 61 6c 6c 5f 63 6d   int init_all_cm
1b390 64 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  d(.  ClientData 
1b3a0 63 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  cd,.  Tcl_Interp
1b3b0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1b3c0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1b3d0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1b3e0 0a 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ..  Tcl_Interp *
1b3f0 73 6c 61 76 65 3b 0a 20 20 69 66 28 20 6f 62 6a  slave;.  if( obj
1b400 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
1b410 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
1b420 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
1b430 4c 41 56 45 22 29 3b 0a 20 20 20 20 72 65 74 75  LAVE");.    retu
1b440 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1b450 7d 0a 0a 20 20 73 6c 61 76 65 20 3d 20 54 63 6c  }..  slave = Tcl
1b460 5f 47 65 74 53 6c 61 76 65 28 69 6e 74 65 72 70  _GetSlave(interp
1b470 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
1b480 6f 62 6a 76 5b 31 5d 29 29 3b 0a 20 20 69 66 28  objv[1]));.  if(
1b490 20 21 73 6c 61 76 65 20 29 7b 0a 20 20 20 20 72   !slave ){.    r
1b4a0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1b4b0 0a 20 20 7d 0a 0a 20 20 69 6e 69 74 5f 61 6c 6c  .  }..  init_all
1b4c0 28 73 6c 61 76 65 29 3b 0a 20 20 72 65 74 75 72  (slave);.  retur
1b4d0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1b4e0 2a 2a 20 54 63 6c 63 6d 64 3a 20 64 62 5f 75 73  ** Tclcmd: db_us
1b4f0 65 5f 6c 65 67 61 63 79 5f 70 72 65 70 61 72 65  e_legacy_prepare
1b500 20 44 42 20 42 4f 4f 4c 45 41 4e 0a 2a 2a 0a 2a   DB BOOLEAN.**.*
1b510 2a 20 20 20 54 68 65 20 66 69 72 73 74 20 61 72  *   The first ar
1b520 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 63  gument to this c
1b530 6f 6d 6d 61 6e 64 20 6d 75 73 74 20 62 65 20 61  ommand must be a
1b540 20 64 61 74 61 62 61 73 65 20 63 6f 6d 6d 61 6e   database comman
1b550 64 20 63 72 65 61 74 65 64 20 62 79 0a 2a 2a 20  d created by.** 
1b560 20 20 5b 73 71 6c 69 74 65 33 5d 2e 20 49 66 20    [sqlite3]. If 
1b570 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
1b580 65 6e 74 20 69 73 20 74 72 75 65 2c 20 74 68 65  ent is true, the
1b590 6e 20 74 68 65 20 68 61 6e 64 6c 65 20 69 73 20  n the handle is 
1b5a0 63 6f 6e 66 69 67 75 72 65 64 0a 2a 2a 20 20 20  configured.**   
1b5b0 74 6f 20 75 73 65 20 74 68 65 20 73 71 6c 69 74  to use the sqlit
1b5c0 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 29 20  e3_prepare_v2() 
1b5d0 66 75 6e 63 74 69 6f 6e 20 74 6f 20 70 72 65 70  function to prep
1b5e0 61 72 65 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  are statements. 
1b5f0 49 66 20 69 74 0a 2a 2a 20 20 20 69 73 20 66 61  If it.**   is fa
1b600 6c 73 65 2c 20 73 71 6c 69 74 65 33 5f 70 72 65  lse, sqlite3_pre
1b610 70 61 72 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  pare()..*/.stati
1b620 63 20 69 6e 74 20 64 62 5f 75 73 65 5f 6c 65 67  c int db_use_leg
1b630 61 63 79 5f 70 72 65 70 61 72 65 5f 63 6d 64 28  acy_prepare_cmd(
1b640 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 64  .  ClientData cd
1b650 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1b660 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1b670 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1b680 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
1b690 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64   Tcl_CmdInfo cmd
1b6a0 49 6e 66 6f 3b 0a 20 20 53 71 6c 69 74 65 44 62  Info;.  SqliteDb
1b6b0 20 2a 70 44 62 3b 0a 20 20 69 6e 74 20 62 50 72   *pDb;.  int bPr
1b6c0 65 70 61 72 65 3b 0a 0a 20 20 69 66 28 20 6f 62  epare;..  if( ob
1b6d0 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
1b6e0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
1b6f0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
1b700 44 42 20 42 4f 4f 4c 45 41 4e 22 29 3b 0a 20 20  DB BOOLEAN");.  
1b710 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1b720 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21  OR;.  }..  if( !
1b730 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e  Tcl_GetCommandIn
1b740 66 6f 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  fo(interp, Tcl_G
1b750 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1b760 29 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29 7b 0a  ), &cmdInfo) ){.
1b770 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1b780 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f  sult(interp, "no
1b790 20 73 75 63 68 20 64 62 3a 20 22 2c 20 54 63 6c   such db: ", Tcl
1b7a0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1b7b0 31 5d 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  1]), (char*)0);.
1b7c0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1b7d0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 44 62 20  RROR;.  }.  pDb 
1b7e0 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 6d 64  = (SqliteDb*)cmd
1b7f0 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61  Info.objClientDa
1b800 74 61 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  ta;.  if( Tcl_Ge
1b810 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
1b820 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
1b830 20 26 62 50 72 65 70 61 72 65 29 20 29 7b 0a 20   &bPrepare) ){. 
1b840 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1b850 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70 44 62 2d  ROR;.  }..  pDb-
1b860 3e 62 4c 65 67 61 63 79 50 72 65 70 61 72 65 20  >bLegacyPrepare 
1b870 3d 20 62 50 72 65 70 61 72 65 3b 0a 0a 20 20 54  = bPrepare;..  T
1b880 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69  cl_ResetResult(i
1b890 6e 74 65 72 70 29 3b 0a 20 20 72 65 74 75 72 6e  nterp);.  return
1b8a0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69   TCL_OK;.}.#endi
1b8b0 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75  f../*.** Configu
1b8c0 72 65 20 74 68 65 20 69 6e 74 65 72 70 72 65 74  re the interpret
1b8d0 65 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  er passed as the
1b8e0 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
1b8f0 74 6f 20 68 61 76 65 20 61 63 63 65 73 73 0a 2a  to have access.*
1b900 2a 20 74 6f 20 74 68 65 20 63 6f 6d 6d 61 6e 64  * to the command
1b910 73 20 61 6e 64 20 6c 69 6e 6b 65 64 20 76 61 72  s and linked var
1b920 69 61 62 6c 65 73 20 74 68 61 74 20 6d 61 6b 65  iables that make
1b930 20 75 70 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74   up:.**.**   * t
1b940 68 65 20 5b 73 71 6c 69 74 65 33 5d 20 65 78 74  he [sqlite3] ext
1b950 65 6e 73 69 6f 6e 20 69 74 73 65 6c 66 2c 20 0a  ension itself, .
1b960 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 53 51 4c  **.**   * If SQL
1b970 49 54 45 5f 54 43 4c 4d 44 35 20 6f 72 20 53 51  ITE_TCLMD5 or SQ
1b980 4c 49 54 45 5f 54 45 53 54 20 69 73 20 64 65 66  LITE_TEST is def
1b990 69 6e 65 64 2c 20 74 68 65 20 4d 64 35 20 63 6f  ined, the Md5 co
1b9a0 6d 6d 61 6e 64 73 2c 20 61 6e 64 0a 2a 2a 0a 2a  mmands, and.**.*
1b9b0 2a 20 20 20 2a 20 49 66 20 53 51 4c 49 54 45 5f  *   * If SQLITE_
1b9c0 54 45 53 54 20 69 73 20 73 65 74 2c 20 74 68 65  TEST is set, the
1b9d0 20 76 61 72 69 6f 75 73 20 74 65 73 74 20 69 6e   various test in
1b9e0 74 65 72 66 61 63 65 73 20 75 73 65 64 20 62 79  terfaces used by
1b9f0 20 74 68 65 20 54 63 6c 0a 2a 2a 20 20 20 20 20   the Tcl.**     
1ba00 74 65 73 74 20 73 75 69 74 65 2e 0a 2a 2f 0a 73  test suite..*/.s
1ba10 74 61 74 69 63 20 76 6f 69 64 20 69 6e 69 74 5f  tatic void init_
1ba20 61 6c 6c 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  all(Tcl_Interp *
1ba30 69 6e 74 65 72 70 29 7b 0a 20 20 53 71 6c 69 74  interp){.  Sqlit
1ba40 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  e3_Init(interp);
1ba50 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
1ba60 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65  LITE_TEST) || de
1ba70 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 43 4c  fined(SQLITE_TCL
1ba80 4d 44 35 29 0a 20 20 4d 64 35 5f 49 6e 69 74 28  MD5).  Md5_Init(
1ba90 69 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69 66 0a  interp);.#endif.
1baa0 0a 20 20 2f 2a 20 49 6e 73 74 61 6c 6c 20 74 68  .  /* Install th
1bab0 65 20 5b 72 65 67 69 73 74 65 72 5f 64 62 73 74  e [register_dbst
1bac0 61 74 5f 76 74 61 62 5d 20 63 6f 6d 6d 61 6e 64  at_vtab] command
1bad0 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 69   to access the i
1bae0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 20 20  mplementation.  
1baf0 2a 2a 20 6f 66 20 76 69 72 74 75 61 6c 20 74 61  ** of virtual ta
1bb00 62 6c 65 20 64 62 73 74 61 74 20 28 73 6f 75 72  ble dbstat (sour
1bb10 63 65 20 66 69 6c 65 20 74 65 73 74 5f 73 74 61  ce file test_sta
1bb20 74 2e 63 29 2e 20 54 68 69 73 20 63 6f 6d 6d 61  t.c). This comma
1bb30 6e 64 20 69 73 0a 20 20 2a 2a 20 72 65 71 75 69  nd is.  ** requi
1bb40 72 65 64 20 66 6f 72 20 74 65 73 74 66 69 78 74  red for testfixt
1bb50 75 72 65 20 61 6e 64 20 73 71 6c 69 74 65 33 5f  ure and sqlite3_
1bb60 61 6e 61 6c 79 7a 65 72 2c 20 62 75 74 20 6e 6f  analyzer, but no
1bb70 74 20 62 79 20 74 68 65 20 70 72 6f 64 75 63 74  t by the product
1bb80 69 6f 6e 0a 20 20 2a 2a 20 54 63 6c 20 65 78 74  ion.  ** Tcl ext
1bb90 65 6e 73 69 6f 6e 2e 20 20 2a 2f 0a 23 69 66 20  ension.  */.#if 
1bba0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
1bbb0 45 53 54 29 20 7c 7c 20 54 43 4c 53 48 3d 3d 32  EST) || TCLSH==2
1bbc0 0a 20 20 7b 0a 20 20 20 20 65 78 74 65 72 6e 20  .  {.    extern 
1bbd0 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 53 74  int SqlitetestSt
1bbe0 61 74 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  at_Init(Tcl_Inte
1bbf0 72 70 2a 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  rp*);.    Sqlite
1bc00 74 65 73 74 53 74 61 74 5f 49 6e 69 74 28 69 6e  testStat_Init(in
1bc10 74 65 72 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  terp);.  }.#endi
1bc20 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
1bc30 5f 54 45 53 54 0a 20 20 7b 0a 20 20 20 20 65 78  _TEST.  {.    ex
1bc40 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 63  tern int Sqlitec
1bc50 6f 6e 66 69 67 5f 49 6e 69 74 28 54 63 6c 5f 49  onfig_Init(Tcl_I
1bc60 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1bc70 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1bc80 73 74 31 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  st1_Init(Tcl_Int
1bc90 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1bca0 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1bcb0 32 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  2_Init(Tcl_Inter
1bcc0 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1bcd0 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 33 5f  int Sqlitetest3_
1bce0 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1bcf0 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1bd00 74 20 53 71 6c 69 74 65 74 65 73 74 34 5f 49 6e  t Sqlitetest4_In
1bd10 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1bd20 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1bd30 53 71 6c 69 74 65 74 65 73 74 35 5f 49 6e 69 74  Sqlitetest5_Init
1bd40 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1bd50 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1bd60 6c 69 74 65 74 65 73 74 36 5f 49 6e 69 74 28 54  litetest6_Init(T
1bd70 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1bd80 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1bd90 74 65 74 65 73 74 37 5f 49 6e 69 74 28 54 63 6c  tetest7_Init(Tcl
1bda0 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1bdb0 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1bdc0 74 65 73 74 38 5f 49 6e 69 74 28 54 63 6c 5f 49  test8_Init(Tcl_I
1bdd0 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1bde0 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1bdf0 73 74 39 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  st9_Init(Tcl_Int
1be00 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1be10 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1be20 61 73 79 6e 63 5f 49 6e 69 74 28 54 63 6c 5f 49  async_Init(Tcl_I
1be30 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1be40 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1be50 73 74 5f 61 75 74 6f 65 78 74 5f 49 6e 69 74 28  st_autoext_Init(
1be60 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1be70 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1be80 69 74 65 74 65 73 74 5f 64 65 6d 6f 76 66 73 5f  itetest_demovfs_
1be90 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
1bea0 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1beb0 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f 66 75  nt Sqlitetest_fu
1bec0 6e 63 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  nc_Init(Tcl_Inte
1bed0 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
1bee0 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f   int Sqlitetest_
1bef0 68 65 78 69 6f 5f 49 6e 69 74 28 54 63 6c 5f 49  hexio_Init(Tcl_I
1bf00 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1bf10 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1bf20 73 74 5f 69 6e 69 74 5f 49 6e 69 74 28 54 63 6c  st_init_Init(Tcl
1bf30 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1bf40 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1bf50 74 65 73 74 5f 6d 61 6c 6c 6f 63 5f 49 6e 69 74  test_malloc_Init
1bf60 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1bf70 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1bf80 6c 69 74 65 74 65 73 74 5f 6d 75 74 65 78 5f 49  litetest_mutex_I
1bf90 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1bfa0 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1bfb0 20 53 71 6c 69 74 65 74 65 73 74 73 63 68 65 6d   Sqlitetestschem
1bfc0 61 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  a_Init(Tcl_Inter
1bfd0 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1bfe0 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 73 73  int Sqlitetestss
1bff0 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  e_Init(Tcl_Inter
1c000 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1c010 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 74 63  int Sqlitetesttc
1c020 6c 76 61 72 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  lvar_Init(Tcl_In
1c030 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1c040 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1c050 74 66 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  tfs_Init(Tcl_Int
1c060 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1c070 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1c080 54 68 72 65 61 64 5f 49 6e 69 74 28 54 63 6c 5f  Thread_Init(Tcl_
1c090 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
1c0a0 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1c0b0 65 73 74 4f 6e 65 66 69 6c 65 5f 49 6e 69 74 28  estOnefile_Init(
1c0c0 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1c0d0 74 20 53 71 6c 69 74 65 74 65 73 74 4f 73 69 6e  t SqlitetestOsin
1c0e0 73 74 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  st_Init(Tcl_Inte
1c0f0 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
1c100 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 62   int Sqlitetestb
1c110 61 63 6b 75 70 5f 49 6e 69 74 28 54 63 6c 5f 49  ackup_Init(Tcl_I
1c120 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1c130 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1c140 73 74 69 6e 74 61 72 72 61 79 5f 49 6e 69 74 28  stintarray_Init(
1c150 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1c160 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1c170 69 74 65 74 65 73 74 76 66 73 5f 49 6e 69 74 28  itetestvfs_Init(
1c180 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29 3b 0a 20  Tcl_Interp *);. 
1c190 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1c1a0 6c 69 74 65 74 65 73 74 72 74 72 65 65 5f 49 6e  litetestrtree_In
1c1b0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1c1c0 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1c1d0 53 71 6c 69 74 65 71 75 6f 74 61 5f 49 6e 69 74  Sqlitequota_Init
1c1e0 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1c1f0 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1c200 6c 69 74 65 6d 75 6c 74 69 70 6c 65 78 5f 49 6e  litemultiplex_In
1c210 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1c220 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1c230 53 71 6c 69 74 65 53 75 70 65 72 6c 6f 63 6b 5f  SqliteSuperlock_
1c240 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1c250 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1c260 74 20 53 71 6c 69 74 65 74 65 73 74 53 79 73 63  t SqlitetestSysc
1c270 61 6c 6c 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  all_Init(Tcl_Int
1c280 65 72 70 2a 29 3b 0a 0a 23 69 66 20 64 65 66 69  erp*);..#if defi
1c290 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
1c2a0 45 5f 46 54 53 33 29 20 7c 7c 20 64 65 66 69 6e  E_FTS3) || defin
1c2b0 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
1c2c0 5f 46 54 53 34 29 0a 20 20 20 20 65 78 74 65 72  _FTS4).    exter
1c2d0 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1c2e0 66 74 73 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  fts3_Init(Tcl_In
1c2f0 74 65 72 70 20 2a 69 6e 74 65 72 70 29 3b 0a 23  terp *interp);.#
1c300 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
1c310 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 5a 49 50 56  LITE_ENABLE_ZIPV
1c320 46 53 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  FS.    extern in
1c330 74 20 5a 69 70 76 66 73 5f 49 6e 69 74 28 54 63  t Zipvfs_Init(Tc
1c340 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1c350 5a 69 70 76 66 73 5f 49 6e 69 74 28 69 6e 74 65  Zipvfs_Init(inte
1c360 72 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  rp);.#endif..   
1c370 20 53 71 6c 69 74 65 63 6f 6e 66 69 67 5f 49 6e   Sqliteconfig_In
1c380 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1c390 53 71 6c 69 74 65 74 65 73 74 31 5f 49 6e 69 74  Sqlitetest1_Init
1c3a0 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1c3b0 6c 69 74 65 74 65 73 74 32 5f 49 6e 69 74 28 69  litetest2_Init(i
1c3c0 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1c3d0 74 65 74 65 73 74 33 5f 49 6e 69 74 28 69 6e 74  tetest3_Init(int
1c3e0 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1c3f0 74 65 73 74 34 5f 49 6e 69 74 28 69 6e 74 65 72  test4_Init(inter
1c400 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
1c410 73 74 35 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  st5_Init(interp)
1c420 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1c430 36 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  6_Init(interp);.
1c440 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 37 5f      Sqlitetest7_
1c450 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
1c460 20 20 53 71 6c 69 74 65 74 65 73 74 38 5f 49 6e    Sqlitetest8_In
1c470 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1c480 53 71 6c 69 74 65 74 65 73 74 39 5f 49 6e 69 74  Sqlitetest9_Init
1c490 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1c4a0 6c 69 74 65 74 65 73 74 61 73 79 6e 63 5f 49 6e  litetestasync_In
1c4b0 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1c4c0 53 71 6c 69 74 65 74 65 73 74 5f 61 75 74 6f 65  Sqlitetest_autoe
1c4d0 78 74 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  xt_Init(interp);
1c4e0 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f  .    Sqlitetest_
1c4f0 64 65 6d 6f 76 66 73 5f 49 6e 69 74 28 69 6e 74  demovfs_Init(int
1c500 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1c510 74 65 73 74 5f 66 75 6e 63 5f 49 6e 69 74 28 69  test_func_Init(i
1c520 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1c530 74 65 74 65 73 74 5f 68 65 78 69 6f 5f 49 6e 69  tetest_hexio_Ini
1c540 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
1c550 71 6c 69 74 65 74 65 73 74 5f 69 6e 69 74 5f 49  qlitetest_init_I
1c560 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1c570 20 53 71 6c 69 74 65 74 65 73 74 5f 6d 61 6c 6c   Sqlitetest_mall
1c580 6f 63 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  oc_Init(interp);
1c590 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f  .    Sqlitetest_
1c5a0 6d 75 74 65 78 5f 49 6e 69 74 28 69 6e 74 65 72  mutex_Init(inter
1c5b0 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
1c5c0 73 74 73 63 68 65 6d 61 5f 49 6e 69 74 28 69 6e  stschema_Init(in
1c5d0 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
1c5e0 65 74 65 73 74 74 63 6c 76 61 72 5f 49 6e 69 74  etesttclvar_Init
1c5f0 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1c600 6c 69 74 65 74 65 73 74 66 73 5f 49 6e 69 74 28  litetestfs_Init(
1c610 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
1c620 69 74 65 74 65 73 74 54 68 72 65 61 64 5f 49 6e  itetestThread_In
1c630 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1c640 53 71 6c 69 74 65 74 65 73 74 4f 6e 65 66 69 6c  SqlitetestOnefil
1c650 65 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  e_Init(interp);.
1c660 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 4f 73      SqlitetestOs
1c670 69 6e 73 74 5f 49 6e 69 74 28 69 6e 74 65 72 70  inst_Init(interp
1c680 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1c690 74 62 61 63 6b 75 70 5f 49 6e 69 74 28 69 6e 74  tbackup_Init(int
1c6a0 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1c6b0 74 65 73 74 69 6e 74 61 72 72 61 79 5f 49 6e 69  testintarray_Ini
1c6c0 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
1c6d0 71 6c 69 74 65 74 65 73 74 76 66 73 5f 49 6e 69  qlitetestvfs_Ini
1c6e0 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
1c6f0 71 6c 69 74 65 74 65 73 74 72 74 72 65 65 5f 49  qlitetestrtree_I
1c700 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1c710 20 53 71 6c 69 74 65 71 75 6f 74 61 5f 49 6e 69   Sqlitequota_Ini
1c720 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
1c730 71 6c 69 74 65 6d 75 6c 74 69 70 6c 65 78 5f 49  qlitemultiplex_I
1c740 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1c750 20 53 71 6c 69 74 65 53 75 70 65 72 6c 6f 63 6b   SqliteSuperlock
1c760 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1c770 20 20 20 53 71 6c 69 74 65 74 65 73 74 53 79 73     SqlitetestSys
1c780 63 61 6c 6c 5f 49 6e 69 74 28 69 6e 74 65 72 70  call_Init(interp
1c790 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  );..#if defined(
1c7a0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54  SQLITE_ENABLE_FT
1c7b0 53 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  S3) || defined(S
1c7c0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53  QLITE_ENABLE_FTS
1c7d0 34 29 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  4).    Sqlitetes
1c7e0 74 66 74 73 33 5f 49 6e 69 74 28 69 6e 74 65 72  tfts3_Init(inter
1c7f0 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  p);.#endif..    
1c800 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
1c810 6d 61 6e 64 28 0a 20 20 20 20 20 20 20 20 69 6e  mand(.        in
1c820 74 65 72 70 2c 20 22 6c 6f 61 64 5f 74 65 73 74  terp, "load_test
1c830 66 69 78 74 75 72 65 5f 65 78 74 65 6e 73 69 6f  fixture_extensio
1c840 6e 73 22 2c 20 69 6e 69 74 5f 61 6c 6c 5f 63 6d  ns", init_all_cm
1c850 64 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20  d, 0, 0.    );. 
1c860 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
1c870 43 6f 6d 6d 61 6e 64 28 0a 20 20 20 20 20 20 20  Command(.       
1c880 20 69 6e 74 65 72 70 2c 20 22 64 62 5f 75 73 65   interp, "db_use
1c890 5f 6c 65 67 61 63 79 5f 70 72 65 70 61 72 65 22  _legacy_prepare"
1c8a0 2c 20 64 62 5f 75 73 65 5f 6c 65 67 61 63 79 5f  , db_use_legacy_
1c8b0 70 72 65 70 61 72 65 5f 63 6d 64 2c 20 30 2c 20  prepare_cmd, 0, 
1c8c0 30 0a 20 20 20 20 29 3b 0a 0a 23 69 66 64 65 66  0.    );..#ifdef
1c8d0 20 53 51 4c 49 54 45 5f 53 53 45 0a 20 20 20 20   SQLITE_SSE.    
1c8e0 53 71 6c 69 74 65 74 65 73 74 73 73 65 5f 49 6e  Sqlitetestsse_In
1c8f0 69 74 28 69 6e 74 65 72 70 29 3b 0a 23 65 6e 64  it(interp);.#end
1c900 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  if.  }.#endif.}.
1c910 0a 23 64 65 66 69 6e 65 20 54 43 4c 53 48 5f 4d  .#define TCLSH_M
1c920 41 49 4e 20 6d 61 69 6e 20 20 20 2f 2a 20 4e 65  AIN main   /* Ne
1c930 65 64 65 64 20 74 6f 20 66 61 6b 65 20 6f 75 74  eded to fake out
1c940 20 6d 6b 74 63 6c 61 70 70 20 2a 2f 0a 69 6e 74   mktclapp */.int
1c950 20 54 43 4c 53 48 5f 4d 41 49 4e 28 69 6e 74 20   TCLSH_MAIN(int 
1c960 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67  argc, char **arg
1c970 76 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  v){.  Tcl_Interp
1c980 20 2a 69 6e 74 65 72 70 3b 0a 0a 23 69 66 20 21   *interp;..#if !
1c990 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f 57  defined(_WIN32_W
1c9a0 43 45 29 0a 20 20 69 66 28 20 67 65 74 65 6e 76  CE).  if( getenv
1c9b0 28 22 42 52 45 41 4b 22 29 20 29 7b 0a 20 20 20  ("BREAK") ){.   
1c9c0 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
1c9d0 0a 20 20 20 20 20 20 20 20 22 61 74 74 61 63 68  .        "attach
1c9e0 20 64 65 62 75 67 67 65 72 20 74 6f 20 70 72 6f   debugger to pro
1c9f0 63 65 73 73 20 25 64 20 61 6e 64 20 70 72 65 73  cess %d and pres
1ca00 73 20 61 6e 79 20 6b 65 79 20 74 6f 20 63 6f 6e  s any key to con
1ca10 74 69 6e 75 65 2e 5c 6e 22 2c 0a 20 20 20 20 20  tinue.\n",.     
1ca20 20 20 20 47 45 54 50 49 44 28 29 29 3b 0a 20 20     GETPID());.  
1ca30 20 20 66 67 65 74 63 28 73 74 64 69 6e 29 3b 0a    fgetc(stdin);.
1ca40 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
1ca50 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 5f 73 68   Call sqlite3_sh
1ca60 75 74 64 6f 77 6e 28 29 20 6f 6e 63 65 20 62 65  utdown() once be
1ca70 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68  fore doing anyth
1ca80 69 6e 67 20 65 6c 73 65 2e 20 54 68 69 73 20 69  ing else. This i
1ca90 73 20 74 6f 0a 20 20 2a 2a 20 74 65 73 74 20 74  s to.  ** test t
1caa0 68 61 74 20 73 71 6c 69 74 65 33 5f 73 68 75 74  hat sqlite3_shut
1cab0 64 6f 77 6e 28 29 20 63 61 6e 20 62 65 20 73 61  down() can be sa
1cac0 66 65 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 61  fely called by a
1cad0 20 70 72 6f 63 65 73 73 20 62 65 66 6f 72 65 0a   process before.
1cae0 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6e 69    ** sqlite3_ini
1caf0 74 69 61 6c 69 7a 65 28 29 20 69 73 2e 20 2a 2f  tialize() is. */
1cb00 0a 20 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64  .  sqlite3_shutd
1cb10 6f 77 6e 28 29 3b 0a 0a 20 20 54 63 6c 5f 46 69  own();..  Tcl_Fi
1cb20 6e 64 45 78 65 63 75 74 61 62 6c 65 28 61 72 67  ndExecutable(arg
1cb30 76 5b 30 5d 29 3b 0a 20 20 69 6e 74 65 72 70 20  v[0]);.  interp 
1cb40 3d 20 54 63 6c 5f 43 72 65 61 74 65 49 6e 74 65  = Tcl_CreateInte
1cb50 72 70 28 29 3b 0a 0a 23 69 66 20 54 43 4c 53 48  rp();..#if TCLSH
1cb60 3d 3d 32 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  ==2.  sqlite3_co
1cb70 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46  nfig(SQLITE_CONF
1cb80 49 47 5f 53 49 4e 47 4c 45 54 48 52 45 41 44 29  IG_SINGLETHREAD)
1cb90 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 6e 69 74  ;.#endif..  init
1cba0 5f 61 6c 6c 28 69 6e 74 65 72 70 29 3b 0a 20 20  _all(interp);.  
1cbb0 69 66 28 20 61 72 67 63 3e 3d 32 20 29 7b 0a 20  if( argc>=2 ){. 
1cbc0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 68     int i;.    ch
1cbd0 61 72 20 7a 41 72 67 63 5b 33 32 5d 3b 0a 20 20  ar zArgc[32];.  
1cbe0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
1cbf0 74 66 28 73 69 7a 65 6f 66 28 7a 41 72 67 63 29  tf(sizeof(zArgc)
1cc00 2c 20 7a 41 72 67 63 2c 20 22 25 64 22 2c 20 61  , zArgc, "%d", a
1cc10 72 67 63 2d 28 33 2d 54 43 4c 53 48 29 29 3b 0a  rgc-(3-TCLSH));.
1cc20 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69      Tcl_SetVar(i
1cc30 6e 74 65 72 70 2c 22 61 72 67 63 22 2c 20 7a 41  nterp,"argc", zA
1cc40 72 67 63 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f  rgc, TCL_GLOBAL_
1cc50 4f 4e 4c 59 29 3b 0a 20 20 20 20 54 63 6c 5f 53  ONLY);.    Tcl_S
1cc60 65 74 56 61 72 28 69 6e 74 65 72 70 2c 22 61 72  etVar(interp,"ar
1cc70 67 76 30 22 2c 61 72 67 76 5b 31 5d 2c 54 43 4c  gv0",argv[1],TCL
1cc80 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20  _GLOBAL_ONLY);. 
1cc90 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e     Tcl_SetVar(in
1cca0 74 65 72 70 2c 22 61 72 67 76 22 2c 20 22 22 2c  terp,"argv", "",
1ccb0 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59   TCL_GLOBAL_ONLY
1ccc0 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 33 2d 54  );.    for(i=3-T
1ccd0 43 4c 53 48 3b 20 69 3c 61 72 67 63 3b 20 69 2b  CLSH; i<argc; i+
1cce0 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65  +){.      Tcl_Se
1ccf0 74 56 61 72 28 69 6e 74 65 72 70 2c 20 22 61 72  tVar(interp, "ar
1cd00 67 76 22 2c 20 61 72 67 76 5b 69 5d 2c 0a 20 20  gv", argv[i],.  
1cd10 20 20 20 20 20 20 20 20 54 43 4c 5f 47 4c 4f 42          TCL_GLOB
1cd20 41 4c 5f 4f 4e 4c 59 20 7c 20 54 43 4c 5f 4c 49  AL_ONLY | TCL_LI
1cd30 53 54 5f 45 4c 45 4d 45 4e 54 20 7c 20 54 43 4c  ST_ELEMENT | TCL
1cd40 5f 41 50 50 45 4e 44 5f 56 41 4c 55 45 29 3b 0a  _APPEND_VALUE);.
1cd50 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 54 43      }.    if( TC
1cd60 4c 53 48 3d 3d 31 20 26 26 20 54 63 6c 5f 45 76  LSH==1 && Tcl_Ev
1cd70 61 6c 46 69 6c 65 28 69 6e 74 65 72 70 2c 20 61  alFile(interp, a
1cd80 72 67 76 5b 31 5d 29 21 3d 54 43 4c 5f 4f 4b 20  rgv[1])!=TCL_OK 
1cd90 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
1cda0 68 61 72 20 2a 7a 49 6e 66 6f 20 3d 20 54 63 6c  har *zInfo = Tcl
1cdb0 5f 47 65 74 56 61 72 28 69 6e 74 65 72 70 2c 20  _GetVar(interp, 
1cdc0 22 65 72 72 6f 72 49 6e 66 6f 22 2c 20 54 43 4c  "errorInfo", TCL
1cdd0 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20  _GLOBAL_ONLY);. 
1cde0 20 20 20 20 20 69 66 28 20 7a 49 6e 66 6f 3d 3d       if( zInfo==
1cdf0 30 20 29 20 7a 49 6e 66 6f 20 3d 20 54 63 6c 5f  0 ) zInfo = Tcl_
1ce00 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
1ce10 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 20 20 66  interp);.      f
1ce20 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25  printf(stderr,"%
1ce30 73 3a 20 25 73 5c 6e 22 2c 20 2a 61 72 67 76 2c  s: %s\n", *argv,
1ce40 20 7a 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 72   zInfo);.      r
1ce50 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
1ce60 20 7d 0a 20 20 69 66 28 20 54 43 4c 53 48 3d 3d   }.  if( TCLSH==
1ce70 32 20 7c 7c 20 61 72 67 63 3c 3d 31 20 29 7b 0a  2 || argc<=1 ){.
1ce80 20 20 20 20 54 63 6c 5f 47 6c 6f 62 61 6c 45 76      Tcl_GlobalEv
1ce90 61 6c 28 69 6e 74 65 72 70 2c 20 74 63 6c 73 68  al(interp, tclsh
1cea0 5f 6d 61 69 6e 5f 6c 6f 6f 70 28 29 29 3b 0a 20  _main_loop());. 
1ceb0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
1cec0 0a 23 65 6e 64 69 66 20 2f 2a 20 54 43 4c 53 48  .#endif /* TCLSH
1ced0 20 2a 2f 0a                                       */.