/ Hex Artifact Content
Login

Artifact 5b801c7eeefe8c968325558e2a7977cf8a713d5f:


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 24 49 64 3a 20 74 63 6c 73 71 6c 69 74  ** $Id: tclsqlit
0210: 65 2e 63 2c 76 20 31 2e 31 39 39 20 32 30 30 37  e.c,v 1.199 2007
0220: 2f 30 38 2f 33 30 20 31 34 3a 35 38 3a 32 30 20  /08/30 14:58:20 
0230: 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e  drh Exp $.*/.#in
0240: 63 6c 75 64 65 20 22 74 63 6c 2e 68 22 0a 23 69  clude "tcl.h".#i
0250: 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e 68 3e  nclude <errno.h>
0260: 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 61 64 64  ../*.** Some add
0270: 69 74 69 6f 6e 61 6c 20 69 6e 63 6c 75 64 65 20  itional include 
0280: 66 69 6c 65 73 20 61 72 65 20 6e 65 65 64 65 64  files are needed
0290: 20 69 66 20 74 68 69 73 20 66 69 6c 65 20 69 73   if this file is
02a0: 20 6e 6f 74 0a 2a 2a 20 61 70 70 65 6e 64 65 64   not.** appended
02b0: 20 74 6f 20 74 68 65 20 61 6d 61 6c 67 61 6d 61   to the amalgama
02c0: 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tion..*/.#ifndef
02d0: 20 53 51 4c 49 54 45 5f 41 4d 41 4c 47 41 4d 41   SQLITE_AMALGAMA
02e0: 54 49 4f 4e 0a 23 20 69 6e 63 6c 75 64 65 20 22  TION.# include "
02f0: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 20 69  sqliteInt.h".# i
0300: 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e 68  nclude <stdlib.h
0310: 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 74 72  >.# include <str
0320: 69 6e 67 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65  ing.h>.# include
0330: 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23 20 69 6e   <assert.h>.# in
0340: 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a  clude <ctype.h>.
0350: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 57 69  #endif../*. * Wi
0360: 6e 64 6f 77 73 20 6e 65 65 64 73 20 74 6f 20 6b  ndows needs to k
0370: 6e 6f 77 20 77 68 69 63 68 20 73 79 6d 62 6f 6c  now which symbol
0380: 73 20 74 6f 20 65 78 70 6f 72 74 2e 20 20 55 6e  s to export.  Un
0390: 69 78 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 2a 20  ix does not.. * 
03a0: 42 55 49 4c 44 5f 73 71 6c 69 74 65 20 73 68 6f  BUILD_sqlite sho
03b0: 75 6c 64 20 62 65 20 75 6e 64 65 66 69 6e 65 64  uld be undefined
03c0: 20 66 6f 72 20 55 6e 69 78 2e 0a 20 2a 2f 0a 23   for Unix.. */.#
03d0: 69 66 64 65 66 20 42 55 49 4c 44 5f 73 71 6c 69  ifdef BUILD_sqli
03e0: 74 65 0a 23 75 6e 64 65 66 20 54 43 4c 5f 53 54  te.#undef TCL_ST
03f0: 4f 52 41 47 45 5f 43 4c 41 53 53 0a 23 64 65 66  ORAGE_CLASS.#def
0400: 69 6e 65 20 54 43 4c 5f 53 54 4f 52 41 47 45 5f  ine TCL_STORAGE_
0410: 43 4c 41 53 53 20 44 4c 4c 45 58 50 4f 52 54 0a  CLASS DLLEXPORT.
0420: 23 65 6e 64 69 66 20 2f 2a 20 42 55 49 4c 44 5f  #endif /* BUILD_
0430: 73 71 6c 69 74 65 20 2a 2f 0a 0a 23 64 65 66 69  sqlite */..#defi
0440: 6e 65 20 4e 55 4d 5f 50 52 45 50 41 52 45 44 5f  ne NUM_PREPARED_
0450: 53 54 4d 54 53 20 31 30 0a 23 64 65 66 69 6e 65  STMTS 10.#define
0460: 20 4d 41 58 5f 50 52 45 50 41 52 45 44 5f 53 54   MAX_PREPARED_ST
0470: 4d 54 53 20 31 30 30 0a 0a 2f 2a 0a 2a 2a 20 49  MTS 100../*.** I
0480: 66 20 54 43 4c 20 75 73 65 73 20 55 54 46 2d 38  f TCL uses UTF-8
0490: 20 61 6e 64 20 53 51 4c 69 74 65 20 69 73 20 63   and SQLite is c
04a0: 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73 65  onfigured to use
04b0: 20 69 73 6f 38 38 35 39 2c 20 74 68 65 6e 20 77   iso8859, then w
04c0: 65 0a 2a 2a 20 68 61 76 65 20 74 6f 20 64 6f 20  e.** have to do 
04d0: 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 77 68  a translation wh
04e0: 65 6e 20 67 6f 69 6e 67 20 62 65 74 77 65 65 6e  en going between
04f0: 20 74 68 65 20 74 77 6f 2e 20 20 53 65 74 20 74   the two.  Set t
0500: 68 65 20 0a 2a 2a 20 55 54 46 5f 54 52 41 4e 53  he .** UTF_TRANS
0510: 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 20 6d 61  LATION_NEEDED ma
0520: 63 72 6f 20 74 6f 20 69 6e 64 69 63 61 74 65 20  cro to indicate 
0530: 74 68 61 74 20 77 65 20 6e 65 65 64 20 74 6f 20  that we need to 
0540: 64 6f 0a 2a 2a 20 74 68 69 73 20 74 72 61 6e 73  do.** this trans
0550: 6c 61 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 23 69 66  lation.  .*/.#if
0560: 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 55 54 46   defined(TCL_UTF
0570: 5f 4d 41 58 29 20 26 26 20 21 64 65 66 69 6e 65  _MAX) && !define
0580: 64 28 53 51 4c 49 54 45 5f 55 54 46 38 29 0a 23  d(SQLITE_UTF8).#
0590: 20 64 65 66 69 6e 65 20 55 54 46 5f 54 52 41 4e   define UTF_TRAN
05a0: 53 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 20 31  SLATION_NEEDED 1
05b0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4e  .#endif../*.** N
05c0: 65 77 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73  ew SQL functions
05d0: 20 63 61 6e 20 62 65 20 63 72 65 61 74 65 64 20   can be created 
05e0: 61 73 20 54 43 4c 20 73 63 72 69 70 74 73 2e 20  as TCL scripts. 
05f0: 20 45 61 63 68 20 73 75 63 68 20 66 75 6e 63 74   Each such funct
0600: 69 6f 6e 0a 2a 2a 20 69 73 20 64 65 73 63 72 69  ion.** is descri
0610: 62 65 64 20 62 79 20 61 6e 20 69 6e 73 74 61 6e  bed by an instan
0620: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
0630: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ing structure..*
0640: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0650: 20 53 71 6c 46 75 6e 63 20 53 71 6c 46 75 6e 63   SqlFunc SqlFunc
0660: 3b 0a 73 74 72 75 63 74 20 53 71 6c 46 75 6e 63  ;.struct SqlFunc
0670: 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20   {.  Tcl_Interp 
0680: 2a 69 6e 74 65 72 70 3b 20 20 20 2f 2a 20 54 68  *interp;   /* Th
0690: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 20  e TCL interpret 
06a0: 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20 66  to execute the f
06b0: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
06c0: 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 20 20  _Obj *pScript;  
06d0: 20 20 20 2f 2a 20 54 68 65 20 54 63 6c 5f 4f 62     /* The Tcl_Ob
06e0: 6a 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  j representation
06f0: 20 6f 66 20 74 68 65 20 73 63 72 69 70 74 20 2a   of the script *
0700: 2f 0a 20 20 69 6e 74 20 75 73 65 45 76 61 6c 4f  /.  int useEvalO
0710: 62 6a 76 3b 20 20 20 20 20 20 2f 2a 20 54 72 75  bjv;      /* Tru
0720: 65 20 69 66 20 69 74 20 69 73 20 73 61 66 65 20  e if it is safe 
0730: 74 6f 20 75 73 65 20 54 63 6c 5f 45 76 61 6c 4f  to use Tcl_EvalO
0740: 62 6a 76 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  bjv */.  char *z
0750: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 2f  Name;          /
0760: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 69 73 20 66  * Name of this f
0770: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 53 71 6c  unction */.  Sql
0780: 46 75 6e 63 20 2a 70 4e 65 78 74 3b 20 20 20 20  Func *pNext;    
0790: 20 20 20 2f 2a 20 4e 65 78 74 20 66 75 6e 63 74     /* Next funct
07a0: 69 6f 6e 20 6f 6e 20 74 68 65 20 6c 69 73 74 20  ion on the list 
07b0: 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 7d  of them all */.}
07c0: 3b 0a 0a 2f 2a 0a 2a 2a 20 4e 65 77 20 63 6f 6c  ;../*.** New col
07d0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73  lation sequences
07e0: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 62 65   function can be
07f0: 20 63 72 65 61 74 65 64 20 61 73 20 54 43 4c 20   created as TCL 
0800: 73 63 72 69 70 74 73 2e 20 20 45 61 63 68 20 73  scripts.  Each s
0810: 75 63 68 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  uch.** function 
0820: 69 73 20 64 65 73 63 72 69 62 65 64 20 62 79 20  is described by 
0830: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
0840: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
0850: 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65 64  ucture..*/.typed
0860: 65 66 20 73 74 72 75 63 74 20 53 71 6c 43 6f 6c  ef struct SqlCol
0870: 6c 61 74 65 20 53 71 6c 43 6f 6c 6c 61 74 65 3b  late SqlCollate;
0880: 0a 73 74 72 75 63 74 20 53 71 6c 43 6f 6c 6c 61  .struct SqlColla
0890: 74 65 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72  te {.  Tcl_Inter
08a0: 70 20 2a 69 6e 74 65 72 70 3b 20 20 20 2f 2a 20  p *interp;   /* 
08b0: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
08c0: 74 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  t to execute the
08d0: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 63   function */.  c
08e0: 68 61 72 20 2a 7a 53 63 72 69 70 74 3b 20 20 20  har *zScript;   
08f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 63 72 69       /* The scri
0900: 70 74 20 74 6f 20 62 65 20 72 75 6e 20 2a 2f 0a  pt to be run */.
0910: 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 4e    SqlCollate *pN
0920: 65 78 74 3b 20 20 20 20 2f 2a 20 4e 65 78 74 20  ext;    /* Next 
0930: 66 75 6e 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  function on the 
0940: 6c 69 73 74 20 6f 66 20 74 68 65 6d 20 61 6c 6c  list of them all
0950: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72   */.};../*.** Pr
0960: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
0970: 73 20 61 72 65 20 63 61 63 68 65 64 20 66 6f 72  s are cached for
0980: 20 66 61 73 74 65 72 20 65 78 65 63 75 74 69 6f   faster executio
0990: 6e 2e 20 20 45 61 63 68 20 70 72 65 70 61 72 65  n.  Each prepare
09a0: 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 69  d.** statement i
09b0: 73 20 64 65 73 63 72 69 62 65 64 20 62 79 20 61  s described by a
09c0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
09d0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
09e0: 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65 64 65  cture..*/.typede
09f0: 66 20 73 74 72 75 63 74 20 53 71 6c 50 72 65 70  f struct SqlPrep
0a00: 61 72 65 64 53 74 6d 74 20 53 71 6c 50 72 65 70  aredStmt SqlPrep
0a10: 61 72 65 64 53 74 6d 74 3b 0a 73 74 72 75 63 74  aredStmt;.struct
0a20: 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74   SqlPreparedStmt
0a30: 20 7b 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64   {.  SqlPrepared
0a40: 53 74 6d 74 20 2a 70 4e 65 78 74 3b 20 20 2f 2a  Stmt *pNext;  /*
0a50: 20 4e 65 78 74 20 69 6e 20 6c 69 6e 6b 65 64 20   Next in linked 
0a60: 6c 69 73 74 20 2a 2f 0a 20 20 53 71 6c 50 72 65  list */.  SqlPre
0a70: 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65 76  paredStmt *pPrev
0a80: 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 6f  ;  /* Previous o
0a90: 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20  n the list */.  
0aa0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
0ab0: 74 6d 74 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  tmt;     /* The 
0ac0: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
0ad0: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 71 6c  nt */.  int nSql
0ae0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0af0: 20 2f 2a 20 63 68 61 72 73 20 69 6e 20 7a 53 71   /* chars in zSq
0b00: 6c 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 20 7a 53  l[] */.  char zS
0b10: 71 6c 5b 31 5d 3b 20 20 20 20 20 20 20 20 20 20  ql[1];          
0b20: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65    /* Text of the
0b30: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a   SQL statement *
0b40: 2f 0a 7d 3b 0a 0a 74 79 70 65 64 65 66 20 73 74  /.};..typedef st
0b50: 72 75 63 74 20 49 6e 63 72 62 6c 6f 62 43 68 61  ruct IncrblobCha
0b60: 6e 6e 65 6c 20 49 6e 63 72 62 6c 6f 62 43 68 61  nnel IncrblobCha
0b70: 6e 6e 65 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  nnel;../*.** The
0b80: 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e  re is one instan
0b90: 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  ce of this struc
0ba0: 74 75 72 65 20 66 6f 72 20 65 61 63 68 20 53 51  ture for each SQ
0bb0: 4c 69 74 65 20 64 61 74 61 62 61 73 65 0a 2a 2a  Lite database.**
0bc0: 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 6f   that has been o
0bd0: 70 65 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c  pened by the SQL
0be0: 69 74 65 20 54 43 4c 20 69 6e 74 65 72 66 61 63  ite TCL interfac
0bf0: 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  e..*/.typedef st
0c00: 72 75 63 74 20 53 71 6c 69 74 65 44 62 20 53 71  ruct SqliteDb Sq
0c10: 6c 69 74 65 44 62 3b 0a 73 74 72 75 63 74 20 53  liteDb;.struct S
0c20: 71 6c 69 74 65 44 62 20 7b 0a 20 20 73 71 6c 69  qliteDb {.  sqli
0c30: 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
0c40: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 72         /* The "r
0c50: 65 61 6c 22 20 64 61 74 61 62 61 73 65 20 73 74  eal" database st
0c60: 72 75 63 74 75 72 65 2e 20 4d 55 53 54 20 42 45  ructure. MUST BE
0c70: 20 46 49 52 53 54 20 2a 2f 0a 20 20 54 63 6c 5f   FIRST */.  Tcl_
0c80: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 20  Interp *interp; 
0c90: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
0ca0: 74 65 72 70 72 65 74 65 72 20 75 73 65 64 20 66  terpreter used f
0cb0: 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65  or this database
0cc0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 42 75 73   */.  char *zBus
0cd0: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
0ce0: 20 2f 2a 20 54 68 65 20 62 75 73 79 20 63 61 6c   /* The busy cal
0cf0: 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f  lback routine */
0d00: 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74  .  char *zCommit
0d10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
0d20: 20 54 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b   The commit hook
0d30: 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e   callback routin
0d40: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 72  e */.  char *zTr
0d50: 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
0d60: 20 20 2f 2a 20 54 68 65 20 74 72 61 63 65 20 63    /* The trace c
0d70: 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20  allback routine 
0d80: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 72 6f 66  */.  char *zProf
0d90: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
0da0: 2f 2a 20 54 68 65 20 70 72 6f 66 69 6c 65 20 63  /* The profile c
0db0: 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20  allback routine 
0dc0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 72 6f 67  */.  char *zProg
0dd0: 72 65 73 73 3b 20 20 20 20 20 20 20 20 20 20 20  ress;           
0de0: 2f 2a 20 54 68 65 20 70 72 6f 67 72 65 73 73 20  /* The progress 
0df0: 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65  callback routine
0e00: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 75 74   */.  char *zAut
0e10: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
0e20: 20 2f 2a 20 54 68 65 20 61 75 74 68 6f 72 69 7a   /* The authoriz
0e30: 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 20 72  ation callback r
0e40: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72  outine */.  char
0e50: 20 2a 7a 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20   *zNull;        
0e60: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 74         /* Text t
0e70: 6f 20 73 75 62 73 74 69 74 75 74 65 20 66 6f 72  o substitute for
0e80: 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 20 76 61 6c   an SQL NULL val
0e90: 75 65 20 2a 2f 0a 20 20 53 71 6c 46 75 6e 63 20  ue */.  SqlFunc 
0ea0: 2a 70 46 75 6e 63 3b 20 20 20 20 20 20 20 20 20  *pFunc;         
0eb0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 53 51     /* List of SQ
0ec0: 4c 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  L functions */. 
0ed0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 55 70 64 61 74   Tcl_Obj *pUpdat
0ee0: 65 48 6f 6f 6b 3b 20 20 20 20 20 20 2f 2a 20 55  eHook;      /* U
0ef0: 70 64 61 74 65 20 68 6f 6f 6b 20 73 63 72 69 70  pdate hook scrip
0f00: 74 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20 20  t (if any) */.  
0f10: 54 63 6c 5f 4f 62 6a 20 2a 70 52 6f 6c 6c 62 61  Tcl_Obj *pRollba
0f20: 63 6b 48 6f 6f 6b 3b 20 20 20 20 2f 2a 20 52 6f  ckHook;    /* Ro
0f30: 6c 6c 62 61 63 6b 20 68 6f 6f 6b 20 73 63 72 69  llback hook scri
0f40: 70 74 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20  pt (if any) */. 
0f50: 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43 6f   SqlCollate *pCo
0f60: 6c 6c 61 74 65 3b 20 20 20 20 20 20 2f 2a 20 4c  llate;      /* L
0f70: 69 73 74 20 6f 66 20 53 51 4c 20 63 6f 6c 6c 61  ist of SQL colla
0f80: 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 73 20 2a  tion functions *
0f90: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
0fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0fb0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 6f 66  * Return code of
0fc0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c   most recent sql
0fd0: 69 74 65 33 5f 65 78 65 63 28 29 20 2a 2f 0a 20  ite3_exec() */. 
0fe0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f 6c 6c 61   Tcl_Obj *pColla
0ff0: 74 65 4e 65 65 64 65 64 3b 20 20 20 2f 2a 20 43  teNeeded;   /* C
1000: 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65 64 65 64 20  ollation needed 
1010: 73 63 72 69 70 74 20 2a 2f 0a 20 20 53 71 6c 50  script */.  SqlP
1020: 72 65 70 61 72 65 64 53 74 6d 74 20 2a 73 74 6d  reparedStmt *stm
1030: 74 4c 69 73 74 3b 20 2f 2a 20 4c 69 73 74 20 6f  tList; /* List o
1040: 66 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  f prepared state
1050: 6d 65 6e 74 73 2a 2f 0a 20 20 53 71 6c 50 72 65  ments*/.  SqlPre
1060: 70 61 72 65 64 53 74 6d 74 20 2a 73 74 6d 74 4c  paredStmt *stmtL
1070: 61 73 74 3b 20 2f 2a 20 4c 61 73 74 20 73 74 61  ast; /* Last sta
1080: 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 6c 69  tement in the li
1090: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 53  st */.  int maxS
10a0: 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tmt;            
10b0: 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 6d     /* The next m
10c0: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
10d0: 20 73 74 6d 74 4c 69 73 74 20 2a 2f 0a 20 20 69   stmtList */.  i
10e0: 6e 74 20 6e 53 74 6d 74 3b 20 20 20 20 20 20 20  nt nStmt;       
10f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1100: 62 65 72 20 6f 66 20 73 74 61 74 65 6d 65 6e 74  ber of statement
1110: 73 20 69 6e 20 73 74 6d 74 4c 69 73 74 20 2a 2f  s in stmtList */
1120: 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  .  IncrblobChann
1130: 65 6c 20 2a 70 49 6e 63 72 62 6c 6f 62 3b 2f 2a  el *pIncrblob;/*
1140: 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   Linked list of 
1150: 6f 70 65 6e 20 69 6e 63 72 62 6c 6f 62 20 63 68  open incrblob ch
1160: 61 6e 6e 65 6c 73 20 2a 2f 0a 7d 3b 0a 0a 73 74  annels */.};..st
1170: 72 75 63 74 20 49 6e 63 72 62 6c 6f 62 43 68 61  ruct IncrblobCha
1180: 6e 6e 65 6c 20 7b 0a 20 20 73 71 6c 69 74 65 33  nnel {.  sqlite3
1190: 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 3b 20 20 20  _blob *pBlob;   
11a0: 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 20 62 6c     /* sqlite3 bl
11b0: 6f 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 53  ob handle */.  S
11c0: 71 6c 69 74 65 44 62 20 2a 70 44 62 3b 20 20 20  qliteDb *pDb;   
11d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f           /* Asso
11e0: 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20  ciated database 
11f0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
1200: 69 6e 74 20 69 53 65 65 6b 3b 20 20 20 20 20 20  int iSeek;      
1210: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
1220: 72 65 6e 74 20 73 65 65 6b 20 6f 66 66 73 65 74  rent seek offset
1230: 20 2a 2f 0a 20 20 54 63 6c 5f 43 68 61 6e 6e 65   */.  Tcl_Channe
1240: 6c 20 63 68 61 6e 6e 65 6c 3b 20 20 20 20 20 20  l channel;      
1250: 2f 2a 20 43 68 61 6e 6e 65 6c 20 69 64 65 6e 74  /* Channel ident
1260: 69 66 69 65 72 20 2a 2f 0a 20 20 49 6e 63 72 62  ifier */.  Incrb
1270: 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 4e 65 78  lobChannel *pNex
1280: 74 3b 20 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c  t;   /* Linked l
1290: 69 73 74 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20  ist of all open 
12a0: 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c  incrblob channel
12b0: 73 20 2a 2f 0a 20 20 49 6e 63 72 62 6c 6f 62 43  s */.  IncrblobC
12c0: 68 61 6e 6e 65 6c 20 2a 70 50 72 65 76 3b 20 20  hannel *pPrev;  
12d0: 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20   /* Linked list 
12e0: 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 69 6e 63 72  of all open incr
12f0: 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 73 20 2a 2f  blob channels */
1300: 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .};..#ifndef SQL
1310: 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
1320: 42 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c  B./*.** Close al
1330: 6c 20 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e  l incrblob chann
1340: 65 6c 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67  els opened using
1350: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
1360: 74 69 6f 6e 20 70 44 62 2e 0a 2a 2a 20 54 68 69  tion pDb..** Thi
1370: 73 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  s is called when
1380: 20 73 68 75 74 74 69 6e 67 20 64 6f 77 6e 20 74   shutting down t
1390: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
13a0: 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ection..*/.stati
13b0: 63 20 76 6f 69 64 20 63 6c 6f 73 65 49 6e 63 72  c void closeIncr
13c0: 62 6c 6f 62 43 68 61 6e 6e 65 6c 73 28 53 71 6c  blobChannels(Sql
13d0: 69 74 65 44 62 20 2a 70 44 62 29 7b 0a 20 20 49  iteDb *pDb){.  I
13e0: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a  ncrblobChannel *
13f0: 70 3b 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61  p;.  IncrblobCha
1400: 6e 6e 65 6c 20 2a 70 4e 65 78 74 3b 0a 0a 20 20  nnel *pNext;..  
1410: 66 6f 72 28 70 3d 70 44 62 2d 3e 70 49 6e 63 72  for(p=pDb->pIncr
1420: 62 6c 6f 62 3b 20 70 3b 20 70 3d 70 4e 65 78 74  blob; p; p=pNext
1430: 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
1440: 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 20 20 2f 2a  ->pNext;..    /*
1450: 20 4e 6f 74 65 3a 20 43 61 6c 6c 69 6e 67 20 75   Note: Calling u
1460: 6e 72 65 67 69 73 74 65 72 20 68 65 72 65 20 63  nregister here c
1470: 61 6c 6c 20 54 63 6c 5f 43 6c 6f 73 65 20 6f 6e  all Tcl_Close on
1480: 20 74 68 65 20 69 6e 63 72 62 6c 6f 62 20 63 68   the incrblob ch
1490: 61 6e 6e 65 6c 2c 20 0a 20 20 20 20 2a 2a 20 77  annel, .    ** w
14a0: 68 69 63 68 20 64 65 6c 65 74 65 73 20 74 68 65  hich deletes the
14b0: 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c   IncrblobChannel
14c0: 20 73 74 72 75 63 74 75 72 65 20 61 74 20 2a 70   structure at *p
14d0: 2e 20 53 6f 20 64 6f 20 6e 6f 74 0a 20 20 20 20  . So do not.    
14e0: 2a 2a 20 63 61 6c 6c 20 54 63 6c 5f 46 72 65 65  ** call Tcl_Free
14f0: 28 29 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a  () here..    */.
1500: 20 20 20 20 54 63 6c 5f 55 6e 72 65 67 69 73 74      Tcl_Unregist
1510: 65 72 43 68 61 6e 6e 65 6c 28 70 44 62 2d 3e 69  erChannel(pDb->i
1520: 6e 74 65 72 70 2c 20 70 2d 3e 63 68 61 6e 6e 65  nterp, p->channe
1530: 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  l);.  }.}../*.**
1540: 20 43 6c 6f 73 65 20 61 6e 20 69 6e 63 72 65 6d   Close an increm
1550: 65 6e 74 61 6c 20 62 6c 6f 62 20 63 68 61 6e 6e  ental blob chann
1560: 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
1570: 74 20 69 6e 63 72 62 6c 6f 62 43 6c 6f 73 65 28  t incrblobClose(
1580: 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61  ClientData insta
1590: 6e 63 65 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74  nceData, Tcl_Int
15a0: 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20  erp *interp){.  
15b0: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20  IncrblobChannel 
15c0: 2a 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68  *p = (IncrblobCh
15d0: 61 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e 63 65  annel *)instance
15e0: 44 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Data;.  int rc =
15f0: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c   sqlite3_blob_cl
1600: 6f 73 65 28 70 2d 3e 70 42 6c 6f 62 29 3b 0a 20  ose(p->pBlob);. 
1610: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1620: 2d 3e 70 44 62 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  ->pDb->db;..  /*
1630: 20 52 65 6d 6f 76 65 20 74 68 65 20 63 68 61 6e   Remove the chan
1640: 6e 65 6c 20 66 72 6f 6d 20 74 68 65 20 53 71 6c  nel from the Sql
1650: 69 74 65 44 62 2e 70 49 6e 63 72 62 6c 6f 62 20  iteDb.pIncrblob 
1660: 6c 69 73 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70  list. */.  if( p
1670: 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70  ->pNext ){.    p
1680: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
1690: 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20   p->pPrev;.  }. 
16a0: 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b   if( p->pPrev ){
16b0: 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70  .    p->pPrev->p
16c0: 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Next = p->pNext;
16d0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 44  .  }.  if( p->pD
16e0: 62 2d 3e 70 49 6e 63 72 62 6c 6f 62 3d 3d 70 20  b->pIncrblob==p 
16f0: 29 7b 0a 20 20 20 20 70 2d 3e 70 44 62 2d 3e 70  ){.    p->pDb->p
1700: 49 6e 63 72 62 6c 6f 62 20 3d 20 70 2d 3e 70 4e  Incrblob = p->pN
1710: 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  ext;.  }..  /* F
1720: 72 65 65 20 74 68 65 20 49 6e 63 72 62 6c 6f 62  ree the Incrblob
1730: 43 68 61 6e 6e 65 6c 20 73 74 72 75 63 74 75 72  Channel structur
1740: 65 20 2a 2f 0a 20 20 54 63 6c 5f 46 72 65 65 28  e */.  Tcl_Free(
1750: 28 63 68 61 72 20 2a 29 70 29 3b 0a 0a 20 20 69  (char *)p);..  i
1760: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1770: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52   ){.    Tcl_SetR
1780: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
1790: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72  har *)sqlite3_er
17a0: 72 6d 73 67 28 64 62 29 2c 20 54 43 4c 5f 56 4f  rmsg(db), TCL_VO
17b0: 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 72 65 74  LATILE);.    ret
17c0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
17d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
17e0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  OK;.}../*.** Rea
17f0: 64 20 64 61 74 61 20 66 72 6f 6d 20 61 6e 20 69  d data from an i
1800: 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20  ncremental blob 
1810: 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74  channel..*/.stat
1820: 69 63 20 69 6e 74 20 69 6e 63 72 62 6c 6f 62 49  ic int incrblobI
1830: 6e 70 75 74 28 0a 20 20 43 6c 69 65 6e 74 44 61  nput(.  ClientDa
1840: 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c  ta instanceData,
1850: 20 0a 20 20 63 68 61 72 20 2a 62 75 66 2c 20 0a   .  char *buf, .
1860: 20 20 69 6e 74 20 62 75 66 53 69 7a 65 2c 0a 20    int bufSize,. 
1870: 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50   int *errorCodeP
1880: 74 72 0a 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62  tr.){.  Incrblob
1890: 43 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28 49 6e  Channel *p = (In
18a0: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29  crblobChannel *)
18b0: 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20  instanceData;.  
18c0: 69 6e 74 20 6e 52 65 61 64 20 3d 20 62 75 66 53  int nRead = bufS
18d0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ize;         /* 
18e0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
18f0: 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74  to read */.  int
1900: 20 6e 42 6c 6f 62 3b 20 20 20 20 20 20 20 20 20   nBlob;         
1910: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
1920: 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62  al size of the b
1930: 6c 6f 62 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  lob */.  int rc;
1940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1950: 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 20        /* sqlite 
1960: 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 0a 20  error code */.. 
1970: 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33   nBlob = sqlite3
1980: 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70  _blob_bytes(p->p
1990: 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20 28 70 2d  Blob);.  if( (p-
19a0: 3e 69 53 65 65 6b 2b 6e 52 65 61 64 29 3e 6e 42  >iSeek+nRead)>nB
19b0: 6c 6f 62 20 29 7b 0a 20 20 20 20 6e 52 65 61 64  lob ){.    nRead
19c0: 20 3d 20 6e 42 6c 6f 62 2d 70 2d 3e 69 53 65 65   = nBlob-p->iSee
19d0: 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65  k;.  }.  if( nRe
19e0: 61 64 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ad<=0 ){.    ret
19f0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 63  urn 0;.  }..  rc
1a00: 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f   = sqlite3_blob_
1a10: 72 65 61 64 28 70 2d 3e 70 42 6c 6f 62 2c 20 28  read(p->pBlob, (
1a20: 76 6f 69 64 20 2a 29 62 75 66 2c 20 6e 52 65 61  void *)buf, nRea
1a30: 64 2c 20 70 2d 3e 69 53 65 65 6b 29 3b 0a 20 20  d, p->iSeek);.  
1a40: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1a50: 4b 20 29 7b 0a 20 20 20 20 2a 65 72 72 6f 72 43  K ){.    *errorC
1a60: 6f 64 65 50 74 72 20 3d 20 72 63 3b 0a 20 20 20  odePtr = rc;.   
1a70: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a   return -1;.  }.
1a80: 0a 20 20 70 2d 3e 69 53 65 65 6b 20 2b 3d 20 6e  .  p->iSeek += n
1a90: 52 65 61 64 3b 0a 20 20 72 65 74 75 72 6e 20 6e  Read;.  return n
1aa0: 52 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  Read;.}../*.** W
1ab0: 72 69 74 65 20 64 61 74 61 20 74 6f 20 61 6e 20  rite data to an 
1ac0: 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62  incremental blob
1ad0: 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61   channel..*/.sta
1ae0: 74 69 63 20 69 6e 74 20 69 6e 63 72 62 6c 6f 62  tic int incrblob
1af0: 4f 75 74 70 75 74 28 0a 20 20 43 6c 69 65 6e 74  Output(.  Client
1b00: 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74  Data instanceDat
1b10: 61 2c 20 0a 20 20 43 4f 4e 53 54 20 63 68 61 72  a, .  CONST char
1b20: 20 2a 62 75 66 2c 20 0a 20 20 69 6e 74 20 74 6f   *buf, .  int to
1b30: 57 72 69 74 65 2c 0a 20 20 69 6e 74 20 2a 65 72  Write,.  int *er
1b40: 72 6f 72 43 6f 64 65 50 74 72 0a 29 7b 0a 20 20  rorCodePtr.){.  
1b50: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20  IncrblobChannel 
1b60: 2a 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68  *p = (IncrblobCh
1b70: 61 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e 63 65  annel *)instance
1b80: 44 61 74 61 3b 0a 20 20 69 6e 74 20 6e 57 72 69  Data;.  int nWri
1b90: 74 65 20 3d 20 74 6f 57 72 69 74 65 3b 20 20 20  te = toWrite;   
1ba0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1bb0: 66 20 62 79 74 65 73 20 74 6f 20 77 72 69 74 65  f bytes to write
1bc0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 6c 6f 62 3b   */.  int nBlob;
1bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be0: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65     /* Total size
1bf0: 20 6f 66 20 74 68 65 20 62 6c 6f 62 20 2a 2f 0a   of the blob */.
1c00: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c20: 2a 20 73 71 6c 69 74 65 20 65 72 72 6f 72 20 63  * sqlite error c
1c30: 6f 64 65 20 2a 2f 0a 0a 20 20 6e 42 6c 6f 62 20  ode */..  nBlob 
1c40: 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62  = sqlite3_blob_b
1c50: 79 74 65 73 28 70 2d 3e 70 42 6c 6f 62 29 3b 0a  ytes(p->pBlob);.
1c60: 20 20 69 66 28 20 28 70 2d 3e 69 53 65 65 6b 2b    if( (p->iSeek+
1c70: 6e 57 72 69 74 65 29 3e 6e 42 6c 6f 62 20 29 7b  nWrite)>nBlob ){
1c80: 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50  .    *errorCodeP
1c90: 74 72 20 3d 20 45 49 4e 56 41 4c 3b 0a 20 20 20  tr = EINVAL;.   
1ca0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a   return -1;.  }.
1cb0: 20 20 69 66 28 20 6e 57 72 69 74 65 3c 3d 30 20    if( nWrite<=0 
1cc0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
1cd0: 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c  .  }..  rc = sql
1ce0: 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65 28  ite3_blob_write(
1cf0: 70 2d 3e 70 42 6c 6f 62 2c 20 28 76 6f 69 64 20  p->pBlob, (void 
1d00: 2a 29 62 75 66 2c 20 6e 57 72 69 74 65 2c 20 70  *)buf, nWrite, p
1d10: 2d 3e 69 53 65 65 6b 29 3b 0a 20 20 69 66 28 20  ->iSeek);.  if( 
1d20: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1d30: 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50  .    *errorCodeP
1d40: 74 72 20 3d 20 45 49 4f 3b 0a 20 20 20 20 72 65  tr = EIO;.    re
1d50: 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20  turn -1;.  }..  
1d60: 70 2d 3e 69 53 65 65 6b 20 2b 3d 20 6e 57 72 69  p->iSeek += nWri
1d70: 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 6e 57 72  te;.  return nWr
1d80: 69 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  ite;.}../*.** Se
1d90: 65 6b 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  ek an incrementa
1da0: 6c 20 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a  l blob channel..
1db0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
1dc0: 63 72 62 6c 6f 62 53 65 65 6b 28 0a 20 20 43 6c  crblobSeek(.  Cl
1dd0: 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63  ientData instanc
1de0: 65 44 61 74 61 2c 20 0a 20 20 6c 6f 6e 67 20 6f  eData, .  long o
1df0: 66 66 73 65 74 2c 0a 20 20 69 6e 74 20 73 65 65  ffset,.  int see
1e00: 6b 4d 6f 64 65 2c 0a 20 20 69 6e 74 20 2a 65 72  kMode,.  int *er
1e10: 72 6f 72 43 6f 64 65 50 74 72 0a 29 7b 0a 20 20  rorCodePtr.){.  
1e20: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20  IncrblobChannel 
1e30: 2a 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68  *p = (IncrblobCh
1e40: 61 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e 63 65  annel *)instance
1e50: 44 61 74 61 3b 0a 0a 20 20 73 77 69 74 63 68 28  Data;..  switch(
1e60: 20 73 65 65 6b 4d 6f 64 65 20 29 7b 0a 20 20 20   seekMode ){.   
1e70: 20 63 61 73 65 20 53 45 45 4b 5f 53 45 54 3a 0a   case SEEK_SET:.
1e80: 20 20 20 20 20 20 70 2d 3e 69 53 65 65 6b 20 3d        p->iSeek =
1e90: 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 62   offset;.      b
1ea0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
1eb0: 45 45 4b 5f 43 55 52 3a 0a 20 20 20 20 20 20 70  EEK_CUR:.      p
1ec0: 2d 3e 69 53 65 65 6b 20 2b 3d 20 6f 66 66 73 65  ->iSeek += offse
1ed0: 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  t;.      break;.
1ee0: 20 20 20 20 63 61 73 65 20 53 45 45 4b 5f 45 4e      case SEEK_EN
1ef0: 44 3a 0a 20 20 20 20 20 20 70 2d 3e 69 53 65 65  D:.      p->iSee
1f00: 6b 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  k = sqlite3_blob
1f10: 5f 62 79 74 65 73 28 70 2d 3e 70 42 6c 6f 62 29  _bytes(p->pBlob)
1f20: 20 2b 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20   + offset;.     
1f30: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66   break;..    def
1f40: 61 75 6c 74 3a 20 61 73 73 65 72 74 28 21 22 42  ault: assert(!"B
1f50: 61 64 20 73 65 65 6b 4d 6f 64 65 22 29 3b 0a 20  ad seekMode");. 
1f60: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e   }..  return p->
1f70: 69 53 65 65 6b 3b 0a 7d 0a 0a 0a 73 74 61 74 69  iSeek;.}...stati
1f80: 63 20 76 6f 69 64 20 69 6e 63 72 62 6c 6f 62 57  c void incrblobW
1f90: 61 74 63 68 28 43 6c 69 65 6e 74 44 61 74 61 20  atch(ClientData 
1fa0: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 69 6e  instanceData, in
1fb0: 74 20 6d 6f 64 65 29 7b 20 0a 20 20 2f 2a 20 4e  t mode){ .  /* N
1fc0: 4f 2d 4f 50 20 2a 2f 20 0a 7d 0a 73 74 61 74 69  O-OP */ .}.stati
1fd0: 63 20 69 6e 74 20 69 6e 63 72 62 6c 6f 62 48 61  c int incrblobHa
1fe0: 6e 64 6c 65 28 43 6c 69 65 6e 74 44 61 74 61 20  ndle(ClientData 
1ff0: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 69 6e  instanceData, in
2000: 74 20 64 69 72 2c 20 43 6c 69 65 6e 74 44 61 74  t dir, ClientDat
2010: 61 20 2a 68 50 74 72 29 7b 0a 20 20 72 65 74 75  a *hPtr){.  retu
2020: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a  rn TCL_ERROR;.}.
2030: 0a 73 74 61 74 69 63 20 54 63 6c 5f 43 68 61 6e  .static Tcl_Chan
2040: 6e 65 6c 54 79 70 65 20 49 6e 63 72 62 6c 6f 62  nelType Incrblob
2050: 43 68 61 6e 6e 65 6c 54 79 70 65 20 3d 20 7b 0a  ChannelType = {.
2060: 20 20 22 69 6e 63 72 62 6c 6f 62 22 2c 20 20 20    "incrblob",   
2070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2080: 20 20 20 20 20 2f 2a 20 74 79 70 65 4e 61 6d 65       /* typeName
2090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
20b0: 20 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45    TCL_CHANNEL_VE
20c0: 52 53 49 4f 4e 5f 32 2c 20 20 20 20 20 20 20 20  RSION_2,        
20d0: 20 20 20 20 20 2f 2a 20 76 65 72 73 69 6f 6e 20       /* version 
20e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
2100: 20 20 69 6e 63 72 62 6c 6f 62 43 6c 6f 73 65 2c    incrblobClose,
2110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2120: 20 20 20 20 20 2f 2a 20 63 6c 6f 73 65 50 72 6f       /* closePro
2130: 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
2140: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
2150: 20 20 69 6e 63 72 62 6c 6f 62 49 6e 70 75 74 2c    incrblobInput,
2160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2170: 20 20 20 20 20 2f 2a 20 69 6e 70 75 74 50 72 6f       /* inputPro
2180: 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
21a0: 20 20 69 6e 63 72 62 6c 6f 62 4f 75 74 70 75 74    incrblobOutput
21b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
21c0: 20 20 20 20 20 2f 2a 20 6f 75 74 70 75 74 50 72       /* outputPr
21d0: 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  oc              
21e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
21f0: 20 20 69 6e 63 72 62 6c 6f 62 53 65 65 6b 2c 20    incrblobSeek, 
2200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2210: 20 20 20 20 20 2f 2a 20 73 65 65 6b 50 72 6f 63       /* seekProc
2220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2230: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
2240: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
2250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2260: 20 20 20 20 20 2f 2a 20 73 65 74 4f 70 74 69 6f       /* setOptio
2270: 6e 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20  nProc           
2280: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
2290: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
22a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b0: 20 20 20 20 20 2f 2a 20 67 65 74 4f 70 74 69 6f       /* getOptio
22c0: 6e 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20  nProc           
22d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
22e0: 20 20 69 6e 63 72 62 6c 6f 62 57 61 74 63 68 2c    incrblobWatch,
22f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2300: 20 20 20 20 20 2f 2a 20 77 61 74 63 68 50 72 6f       /* watchPro
2310: 63 20 28 74 68 69 73 20 69 73 20 61 20 6e 6f 2d  c (this is a no-
2320: 6f 70 29 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  op)          */.
2330: 20 20 69 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65    incrblobHandle
2340: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2350: 20 20 20 20 20 2f 2a 20 67 65 74 48 61 6e 64 6c       /* getHandl
2360: 65 50 72 6f 63 20 28 61 6c 77 61 79 73 20 72 65  eProc (always re
2370: 74 75 72 6e 73 20 65 72 72 6f 72 29 20 2a 2f 0a  turns error) */.
2380: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
2390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a0: 20 20 20 20 20 2f 2a 20 63 6c 6f 73 65 32 50 72       /* close2Pr
23b0: 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  oc              
23c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
23d0: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
23e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f0: 20 20 20 20 20 2f 2a 20 62 6c 6f 63 6b 4d 6f 64       /* blockMod
2400: 65 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20  eProc           
2410: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
2420: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
2430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2440: 20 20 20 20 20 2f 2a 20 66 6c 75 73 68 50 72 6f       /* flushPro
2450: 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
2460: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
2470: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
2480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2490: 20 20 20 20 20 2f 2a 20 68 61 6e 64 6c 65 72 50       /* handlerP
24a0: 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20  roc             
24b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
24c0: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
24d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e0: 20 20 20 20 20 2f 2a 20 77 69 64 65 53 65 65 6b       /* wideSeek
24f0: 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20  Proc            
2500: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
2510: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  };../*.** Create
2520: 20 61 20 6e 65 77 20 69 6e 63 72 62 6c 6f 62 20   a new incrblob 
2530: 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74  channel..*/.stat
2540: 69 63 20 69 6e 74 20 63 72 65 61 74 65 49 6e 63  ic int createInc
2550: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 28 0a 20 20  rblobChannel(.  
2560: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2570: 72 70 2c 20 0a 20 20 53 71 6c 69 74 65 44 62 20  rp, .  SqliteDb 
2580: 2a 70 44 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63  *pDb, .  const c
2590: 68 61 72 20 2a 7a 44 62 2c 0a 20 20 63 6f 6e 73  har *zDb,.  cons
25a0: 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 2c 20  t char *zTable, 
25b0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
25c0: 43 6f 6c 75 6d 6e 2c 20 0a 20 20 73 71 6c 69 74  Column, .  sqlit
25d0: 65 5f 69 6e 74 36 34 20 69 52 6f 77 2c 0a 20 20  e_int64 iRow,.  
25e0: 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 0a 29  int isReadonly.)
25f0: 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e  {.  IncrblobChan
2600: 6e 65 6c 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65  nel *p;.  sqlite
2610: 33 20 2a 64 62 20 3d 20 70 44 62 2d 3e 64 62 3b  3 *db = pDb->db;
2620: 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20  .  sqlite3_blob 
2630: 2a 70 42 6c 6f 62 3b 0a 20 20 69 6e 74 20 72 63  *pBlob;.  int rc
2640: 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  ;.  int flags = 
2650: 54 43 4c 5f 52 45 41 44 41 42 4c 45 7c 28 69 73  TCL_READABLE|(is
2660: 52 65 61 64 6f 6e 6c 79 20 3f 20 30 20 3a 20 54  Readonly ? 0 : T
2670: 43 4c 5f 57 52 49 54 41 42 4c 45 29 3b 0a 0a 20  CL_WRITABLE);.. 
2680: 20 2f 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c   /* This variabl
2690: 65 20 69 73 20 75 73 65 64 20 74 6f 20 6e 61 6d  e is used to nam
26a0: 65 20 74 68 65 20 63 68 61 6e 6e 65 6c 73 3a 20  e the channels: 
26b0: 22 69 6e 63 72 62 6c 6f 62 5f 5b 69 6e 63 72 20  "incrblob_[incr 
26c0: 63 6f 75 6e 74 5d 22 20 2a 2f 0a 20 20 73 74 61  count]" */.  sta
26d0: 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 20 3d 20  tic int count = 
26e0: 30 3b 0a 20 20 63 68 61 72 20 7a 43 68 61 6e 6e  0;.  char zChann
26f0: 65 6c 5b 36 34 5d 3b 0a 0a 20 20 72 63 20 3d 20  el[64];..  rc = 
2700: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65  sqlite3_blob_ope
2710: 6e 28 64 62 2c 20 7a 44 62 2c 20 7a 54 61 62 6c  n(db, zDb, zTabl
2720: 65 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 69 52 6f 77  e, zColumn, iRow
2730: 2c 20 21 69 73 52 65 61 64 6f 6e 6c 79 2c 20 26  , !isReadonly, &
2740: 70 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20 72 63  pBlob);.  if( rc
2750: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2760: 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
2770: 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
2780: 29 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28  )sqlite3_errmsg(
2790: 70 44 62 2d 3e 64 62 29 2c 20 54 43 4c 5f 56 4f  pDb->db), TCL_VO
27a0: 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 72 65 74  LATILE);.    ret
27b0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
27c0: 20 7d 0a 0a 20 20 70 20 3d 20 28 49 6e 63 72 62   }..  p = (Incrb
27d0: 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 54 63 6c  lobChannel *)Tcl
27e0: 5f 41 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 49 6e  _Alloc(sizeof(In
27f0: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 29 29 3b  crblobChannel));
2800: 0a 20 20 70 2d 3e 69 53 65 65 6b 20 3d 20 30 3b  .  p->iSeek = 0;
2810: 0a 20 20 70 2d 3e 70 42 6c 6f 62 20 3d 20 70 42  .  p->pBlob = pB
2820: 6c 6f 62 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  lob;..  sqlite3_
2830: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
2840: 7a 43 68 61 6e 6e 65 6c 29 2c 20 7a 43 68 61 6e  zChannel), zChan
2850: 6e 65 6c 2c 20 22 69 6e 63 72 62 6c 6f 62 5f 25  nel, "incrblob_%
2860: 64 22 2c 20 2b 2b 63 6f 75 6e 74 29 3b 0a 20 20  d", ++count);.  
2870: 70 2d 3e 63 68 61 6e 6e 65 6c 20 3d 20 54 63 6c  p->channel = Tcl
2880: 5f 43 72 65 61 74 65 43 68 61 6e 6e 65 6c 28 26  _CreateChannel(&
2890: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 54  IncrblobChannelT
28a0: 79 70 65 2c 20 7a 43 68 61 6e 6e 65 6c 2c 20 70  ype, zChannel, p
28b0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 54 63 6c 5f  , flags);.  Tcl_
28c0: 52 65 67 69 73 74 65 72 43 68 61 6e 6e 65 6c 28  RegisterChannel(
28d0: 69 6e 74 65 72 70 2c 20 70 2d 3e 63 68 61 6e 6e  interp, p->chann
28e0: 65 6c 29 3b 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20  el);..  /* Link 
28f0: 74 68 65 20 6e 65 77 20 63 68 61 6e 6e 65 6c 20  the new channel 
2900: 69 6e 74 6f 20 74 68 65 20 53 71 6c 69 74 65 44  into the SqliteD
2910: 62 2e 70 49 6e 63 72 62 6c 6f 62 20 6c 69 73 74  b.pIncrblob list
2920: 2e 20 2a 2f 0a 20 20 70 2d 3e 70 4e 65 78 74 20  . */.  p->pNext 
2930: 3d 20 70 44 62 2d 3e 70 49 6e 63 72 62 6c 6f 62  = pDb->pIncrblob
2940: 3b 0a 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30  ;.  p->pPrev = 0
2950: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74  ;.  if( p->pNext
2960: 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74   ){.    p->pNext
2970: 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 7d  ->pPrev = p;.  }
2980: 0a 20 20 70 44 62 2d 3e 70 49 6e 63 72 62 6c 6f  .  pDb->pIncrblo
2990: 62 20 3d 20 70 3b 0a 20 20 70 2d 3e 70 44 62 20  b = p;.  p->pDb 
29a0: 3d 20 70 44 62 3b 0a 0a 20 20 54 63 6c 5f 53 65  = pDb;..  Tcl_Se
29b0: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
29c0: 28 63 68 61 72 20 2a 29 54 63 6c 5f 47 65 74 43  (char *)Tcl_GetC
29d0: 68 61 6e 6e 65 6c 4e 61 6d 65 28 70 2d 3e 63 68  hannelName(p->ch
29e0: 61 6e 6e 65 6c 29 2c 20 54 43 4c 5f 56 4f 4c 41  annel), TCL_VOLA
29f0: 54 49 4c 45 29 3b 0a 20 20 72 65 74 75 72 6e 20  TILE);.  return 
2a00: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6c 73 65 20  TCL_OK;.}.#else 
2a10: 20 2f 2a 20 65 6c 73 65 20 63 6c 61 75 73 65 20   /* else clause 
2a20: 66 6f 72 20 22 23 69 66 6e 64 65 66 20 53 51 4c  for "#ifndef SQL
2a30: 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
2a40: 42 22 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  B" */.  #define 
2a50: 63 6c 6f 73 65 49 6e 63 72 62 6c 6f 62 43 68 61  closeIncrblobCha
2a60: 6e 6e 65 6c 73 28 70 44 62 29 0a 23 65 6e 64 69  nnels(pDb).#endi
2a70: 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 61 74  f../*.** Look at
2a80: 20 74 68 65 20 73 63 72 69 70 74 20 70 72 65 66   the script pref
2a90: 69 78 20 69 6e 20 70 43 6d 64 2e 20 20 57 65 20  ix in pCmd.  We 
2aa0: 77 69 6c 6c 20 62 65 20 65 78 65 63 75 74 69 6e  will be executin
2ab0: 67 20 74 68 69 73 20 73 63 72 69 70 74 0a 2a 2a  g this script.**
2ac0: 20 61 66 74 65 72 20 66 69 72 73 74 20 61 70 70   after first app
2ad0: 65 6e 64 69 6e 67 20 6f 6e 65 20 6f 72 20 6d 6f  ending one or mo
2ae0: 72 65 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 54  re arguments.  T
2af0: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c  his routine anal
2b00: 79 7a 65 73 0a 2a 2a 20 74 68 65 20 73 63 72 69  yzes.** the scri
2b10: 70 74 20 74 6f 20 73 65 65 20 69 66 20 69 74 20  pt to see if it 
2b20: 69 73 20 73 61 66 65 20 74 6f 20 75 73 65 20 54  is safe to use T
2b30: 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 6f 6e  cl_EvalObjv() on
2b40: 20 74 68 65 20 73 63 72 69 70 74 0a 2a 2a 20 72   the script.** r
2b50: 61 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6d  ather than the m
2b60: 6f 72 65 20 67 65 6e 65 72 61 6c 20 54 63 6c 5f  ore general Tcl_
2b70: 45 76 61 6c 45 78 28 29 2e 20 20 54 63 6c 5f 45  EvalEx().  Tcl_E
2b80: 76 61 6c 4f 62 6a 76 28 29 20 69 73 20 6d 75 63  valObjv() is muc
2b90: 68 0a 2a 2a 20 66 61 73 74 65 72 2e 0a 2a 2a 0a  h.** faster..**.
2ba0: 2a 2a 20 53 63 72 69 70 74 73 20 74 68 61 74 20  ** Scripts that 
2bb0: 61 72 65 20 73 61 66 65 20 74 6f 20 75 73 65 20  are safe to use 
2bc0: 77 69 74 68 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  with Tcl_EvalObj
2bd0: 76 28 29 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  v() consists of 
2be0: 61 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d  a.** command nam
2bf0: 65 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 7a 65  e followed by ze
2c00: 72 6f 20 6f 72 20 6d 6f 72 65 20 61 72 67 75 6d  ro or more argum
2c10: 65 6e 74 73 20 77 69 74 68 20 6e 6f 20 5b 2e 2e  ents with no [..
2c20: 2e 5d 20 6f 72 20 24 0a 2a 2a 20 6f 72 20 7b 2e  .] or $.** or {.
2c30: 2e 2e 7d 20 6f 72 20 3b 20 74 6f 20 62 65 20 73  ..} or ; to be s
2c40: 65 65 6e 20 61 6e 79 77 68 65 72 65 2e 20 20 4d  een anywhere.  M
2c50: 6f 73 74 20 63 61 6c 6c 62 61 63 6b 20 73 63 72  ost callback scr
2c60: 69 70 74 73 20 63 6f 6e 73 69 73 74 0a 2a 2a 20  ipts consist.** 
2c70: 6f 66 20 6a 75 73 74 20 61 20 73 69 6e 67 6c 65  of just a single
2c80: 20 70 72 6f 63 65 64 75 72 65 20 6e 61 6d 65 20   procedure name 
2c90: 61 6e 64 20 74 68 65 79 20 6d 65 65 74 20 74 68  and they meet th
2ca0: 69 73 20 72 65 71 75 69 72 65 6d 65 6e 74 2e 0a  is requirement..
2cb0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  */.static int sa
2cc0: 66 65 54 6f 55 73 65 45 76 61 6c 4f 62 6a 76 28  feToUseEvalObjv(
2cd0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2ce0: 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d  rp, Tcl_Obj *pCm
2cf0: 64 29 7b 0a 20 20 2f 2a 20 57 65 20 63 6f 75 6c  d){.  /* We coul
2d00: 64 20 74 72 79 20 74 6f 20 64 6f 20 73 6f 6d 65  d try to do some
2d10: 74 68 69 6e 67 20 77 69 74 68 20 54 63 6c 5f 50  thing with Tcl_P
2d20: 61 72 73 65 28 29 2e 20 20 42 75 74 20 77 65 20  arse().  But we 
2d30: 77 69 6c 6c 20 69 6e 73 74 65 61 64 0a 20 20 2a  will instead.  *
2d40: 2a 20 6a 75 73 74 20 64 6f 20 61 20 73 65 61 72  * just do a sear
2d50: 63 68 20 66 6f 72 20 66 6f 72 62 69 64 64 65 6e  ch for forbidden
2d60: 20 63 68 61 72 61 63 74 65 72 73 2e 20 20 49 66   characters.  If
2d70: 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 72 62   any of the forb
2d80: 69 64 64 65 6e 0a 20 20 2a 2a 20 63 68 61 72 61  idden.  ** chara
2d90: 63 74 65 72 73 20 61 70 70 65 61 72 20 69 6e 20  cters appear in 
2da0: 70 43 6d 64 2c 20 77 65 20 77 69 6c 6c 20 72 65  pCmd, we will re
2db0: 70 6f 72 74 20 74 68 65 20 73 74 72 69 6e 67 20  port the string 
2dc0: 61 73 20 75 6e 73 61 66 65 2e 0a 20 20 2a 2f 0a  as unsafe..  */.
2dd0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
2de0: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 7a 20 3d 20  .  int n;.  z = 
2df0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
2e00: 6d 4f 62 6a 28 70 43 6d 64 2c 20 26 6e 29 3b 0a  mObj(pCmd, &n);.
2e10: 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30    while( n-- > 0
2e20: 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 20 3d 20   ){.    int c = 
2e30: 2a 28 7a 2b 2b 29 3b 0a 20 20 20 20 69 66 28 20  *(z++);.    if( 
2e40: 63 3d 3d 27 24 27 20 7c 7c 20 63 3d 3d 27 5b 27  c=='$' || c=='['
2e50: 20 7c 7c 20 63 3d 3d 27 3b 27 20 29 20 72 65 74   || c==';' ) ret
2e60: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
2e70: 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 1;.}../*.** 
2e80: 46 69 6e 64 20 61 6e 20 53 71 6c 46 75 6e 63 20  Find an SqlFunc 
2e90: 73 74 72 75 63 74 75 72 65 20 77 69 74 68 20 74  structure with t
2ea0: 68 65 20 67 69 76 65 6e 20 6e 61 6d 65 2e 20 20  he given name.  
2eb0: 4f 72 20 63 72 65 61 74 65 20 61 20 6e 65 77 0a  Or create a new.
2ec0: 2a 2a 20 6f 6e 65 20 69 66 20 61 6e 20 65 78 69  ** one if an exi
2ed0: 73 74 69 6e 67 20 6f 6e 65 20 63 61 6e 6e 6f 74  sting one cannot
2ee0: 20 62 65 20 66 6f 75 6e 64 2e 20 20 52 65 74 75   be found.  Retu
2ef0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
2f00: 74 68 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  the.** structure
2f10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 71 6c 46  ..*/.static SqlF
2f20: 75 6e 63 20 2a 66 69 6e 64 53 71 6c 46 75 6e 63  unc *findSqlFunc
2f30: 28 53 71 6c 69 74 65 44 62 20 2a 70 44 62 2c 20  (SqliteDb *pDb, 
2f40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
2f50: 65 29 7b 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70  e){.  SqlFunc *p
2f60: 2c 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69  , *pNew;.  int i
2f70: 3b 0a 20 20 70 4e 65 77 20 3d 20 28 53 71 6c 46  ;.  pNew = (SqlF
2f80: 75 6e 63 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20  unc*)Tcl_Alloc( 
2f90: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20  sizeof(*pNew) + 
2fa0: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 20 2b 20  strlen(zName) + 
2fb0: 31 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 7a 4e 61  1 );.  pNew->zNa
2fc0: 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65  me = (char*)&pNe
2fd0: 77 5b 31 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  w[1];.  for(i=0;
2fe0: 20 7a 4e 61 6d 65 5b 69 5d 3b 20 69 2b 2b 29 7b   zName[i]; i++){
2ff0: 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 5b 69 5d 20   pNew->zName[i] 
3000: 3d 20 74 6f 6c 6f 77 65 72 28 7a 4e 61 6d 65 5b  = tolower(zName[
3010: 69 5d 29 3b 20 7d 0a 20 20 70 4e 65 77 2d 3e 7a  i]); }.  pNew->z
3020: 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 66  Name[i] = 0;.  f
3030: 6f 72 28 70 3d 70 44 62 2d 3e 70 46 75 6e 63 3b  or(p=pDb->pFunc;
3040: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
3050: 20 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70   .    if( strcmp
3060: 28 70 2d 3e 7a 4e 61 6d 65 2c 20 70 4e 65 77 2d  (p->zName, pNew-
3070: 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  >zName)==0 ){.  
3080: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68      Tcl_Free((ch
3090: 61 72 2a 29 70 4e 65 77 29 3b 0a 20 20 20 20 20  ar*)pNew);.     
30a0: 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20 20 7d   return p;.    }
30b0: 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 69 6e 74  .  }.  pNew->int
30c0: 65 72 70 20 3d 20 70 44 62 2d 3e 69 6e 74 65 72  erp = pDb->inter
30d0: 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 63 72 69  p;.  pNew->pScri
30e0: 70 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  pt = 0;.  pNew->
30f0: 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 70 46 75  pNext = pDb->pFu
3100: 6e 63 3b 0a 20 20 70 44 62 2d 3e 70 46 75 6e 63  nc;.  pDb->pFunc
3110: 20 3d 20 70 4e 65 77 3b 0a 20 20 72 65 74 75 72   = pNew;.  retur
3120: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
3130: 20 46 69 6e 61 6c 69 7a 65 20 61 6e 64 20 66 72   Finalize and fr
3140: 65 65 20 61 20 6c 69 73 74 20 6f 66 20 70 72 65  ee a list of pre
3150: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73  pared statements
3160: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3170: 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28 20  flushStmtCache( 
3180: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 29 7b  SqliteDb *pDb ){
3190: 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74  .  SqlPreparedSt
31a0: 6d 74 20 2a 70 50 72 65 53 74 6d 74 3b 0a 0a 20  mt *pPreStmt;.. 
31b0: 20 77 68 69 6c 65 28 20 20 70 44 62 2d 3e 73 74   while(  pDb->st
31c0: 6d 74 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 71  mtList ){.    sq
31d0: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 20  lite3_finalize( 
31e0: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 2d 3e 70  pDb->stmtList->p
31f0: 53 74 6d 74 20 29 3b 0a 20 20 20 20 70 50 72 65  Stmt );.    pPre
3200: 53 74 6d 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74  Stmt = pDb->stmt
3210: 4c 69 73 74 3b 0a 20 20 20 20 70 44 62 2d 3e 73  List;.    pDb->s
3220: 74 6d 74 4c 69 73 74 20 3d 20 70 44 62 2d 3e 73  tmtList = pDb->s
3230: 74 6d 74 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a  tmtList->pNext;.
3240: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 20 28 63      Tcl_Free( (c
3250: 68 61 72 2a 29 70 50 72 65 53 74 6d 74 20 29 3b  har*)pPreStmt );
3260: 0a 20 20 7d 0a 20 20 70 44 62 2d 3e 6e 53 74 6d  .  }.  pDb->nStm
3270: 74 20 3d 20 30 3b 0a 20 20 70 44 62 2d 3e 73 74  t = 0;.  pDb->st
3280: 6d 74 4c 61 73 74 20 3d 20 30 3b 0a 7d 0a 0a 2f  mtLast = 0;.}../
3290: 2a 0a 2a 2a 20 54 43 4c 20 63 61 6c 6c 73 20 74  *.** TCL calls t
32a0: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 77 68  his procedure wh
32b0: 65 6e 20 61 6e 20 73 71 6c 69 74 65 33 20 64 61  en an sqlite3 da
32c0: 74 61 62 61 73 65 20 63 6f 6d 6d 61 6e 64 20 69  tabase command i
32d0: 73 0a 2a 2a 20 64 65 6c 65 74 65 64 2e 0a 2a 2f  s.** deleted..*/
32e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44 62 44  .static void DbD
32f0: 65 6c 65 74 65 43 6d 64 28 76 6f 69 64 20 2a 64  eleteCmd(void *d
3300: 62 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  b){.  SqliteDb *
3310: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a  pDb = (SqliteDb*
3320: 29 64 62 3b 0a 20 20 66 6c 75 73 68 53 74 6d 74  )db;.  flushStmt
3330: 43 61 63 68 65 28 70 44 62 29 3b 0a 20 20 63 6c  Cache(pDb);.  cl
3340: 6f 73 65 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  oseIncrblobChann
3350: 65 6c 73 28 70 44 62 29 3b 0a 20 20 73 71 6c 69  els(pDb);.  sqli
3360: 74 65 33 5f 63 6c 6f 73 65 28 70 44 62 2d 3e 64  te3_close(pDb->d
3370: 62 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 44 62  b);.  while( pDb
3380: 2d 3e 70 46 75 6e 63 20 29 7b 0a 20 20 20 20 53  ->pFunc ){.    S
3390: 71 6c 46 75 6e 63 20 2a 70 46 75 6e 63 20 3d 20  qlFunc *pFunc = 
33a0: 70 44 62 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20  pDb->pFunc;.    
33b0: 70 44 62 2d 3e 70 46 75 6e 63 20 3d 20 70 46 75  pDb->pFunc = pFu
33c0: 6e 63 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 54  nc->pNext;.    T
33d0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
33e0: 70 46 75 6e 63 2d 3e 70 53 63 72 69 70 74 29 3b  pFunc->pScript);
33f0: 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63  .    Tcl_Free((c
3400: 68 61 72 2a 29 70 46 75 6e 63 29 3b 0a 20 20 7d  har*)pFunc);.  }
3410: 0a 20 20 77 68 69 6c 65 28 20 70 44 62 2d 3e 70  .  while( pDb->p
3420: 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 53  Collate ){.    S
3430: 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c  qlCollate *pColl
3440: 61 74 65 20 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c  ate = pDb->pColl
3450: 61 74 65 3b 0a 20 20 20 20 70 44 62 2d 3e 70 43  ate;.    pDb->pC
3460: 6f 6c 6c 61 74 65 20 3d 20 70 43 6f 6c 6c 61 74  ollate = pCollat
3470: 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 54 63  e->pNext;.    Tc
3480: 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 43  l_Free((char*)pC
3490: 6f 6c 6c 61 74 65 29 3b 0a 20 20 7d 0a 20 20 69  ollate);.  }.  i
34a0: 66 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b  f( pDb->zBusy ){
34b0: 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44  .    Tcl_Free(pD
34c0: 62 2d 3e 7a 42 75 73 79 29 3b 0a 20 20 7d 0a 20  b->zBusy);.  }. 
34d0: 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65   if( pDb->zTrace
34e0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65   ){.    Tcl_Free
34f0: 28 70 44 62 2d 3e 7a 54 72 61 63 65 29 3b 0a 20  (pDb->zTrace);. 
3500: 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 50   }.  if( pDb->zP
3510: 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 54 63  rofile ){.    Tc
3520: 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 50 72 6f  l_Free(pDb->zPro
3530: 66 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  file);.  }.  if(
3540: 20 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20   pDb->zAuth ){. 
3550: 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d     Tcl_Free(pDb-
3560: 3e 7a 41 75 74 68 29 3b 0a 20 20 7d 0a 20 20 69  >zAuth);.  }.  i
3570: 66 28 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 29 7b  f( pDb->zNull ){
3580: 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44  .    Tcl_Free(pD
3590: 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20  b->zNull);.  }. 
35a0: 20 69 66 28 20 70 44 62 2d 3e 70 55 70 64 61 74   if( pDb->pUpdat
35b0: 65 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 54 63 6c  eHook ){.    Tcl
35c0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44  _DecrRefCount(pD
35d0: 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 29 3b  b->pUpdateHook);
35e0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e  .  }.  if( pDb->
35f0: 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 20 29 7b  pRollbackHook ){
3600: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
3610: 43 6f 75 6e 74 28 70 44 62 2d 3e 70 52 6f 6c 6c  Count(pDb->pRoll
3620: 62 61 63 6b 48 6f 6f 6b 29 3b 0a 20 20 7d 0a 20  backHook);.  }. 
3630: 20 69 66 28 20 70 44 62 2d 3e 70 43 6f 6c 6c 61   if( pDb->pColla
3640: 74 65 4e 65 65 64 65 64 20 29 7b 0a 20 20 20 20  teNeeded ){.    
3650: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
3660: 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65  (pDb->pCollateNe
3670: 65 64 65 64 29 3b 0a 20 20 7d 0a 20 20 54 63 6c  eded);.  }.  Tcl
3680: 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 44 62  _Free((char*)pDb
3690: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
36a0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
36b0: 65 64 20 77 68 65 6e 20 61 20 64 61 74 61 62 61  ed when a databa
36c0: 73 65 20 66 69 6c 65 20 69 73 20 6c 6f 63 6b 65  se file is locke
36d0: 64 20 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a  d while trying.*
36e0: 2a 20 74 6f 20 65 78 65 63 75 74 65 20 53 51 4c  * to execute SQL
36f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3700: 44 62 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f  DbBusyHandler(vo
3710: 69 64 20 2a 63 64 2c 20 69 6e 74 20 6e 54 72 69  id *cd, int nTri
3720: 65 73 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20  es){.  SqliteDb 
3730: 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62  *pDb = (SqliteDb
3740: 2a 29 63 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  *)cd;.  int rc;.
3750: 20 20 63 68 61 72 20 7a 56 61 6c 5b 33 30 5d 3b    char zVal[30];
3760: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ..  sqlite3_snpr
3770: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 56 61 6c  intf(sizeof(zVal
3780: 29 2c 20 7a 56 61 6c 2c 20 22 25 64 22 2c 20 6e  ), zVal, "%d", n
3790: 54 72 69 65 73 29 3b 0a 20 20 72 63 20 3d 20 54  Tries);.  rc = T
37a0: 63 6c 5f 56 61 72 45 76 61 6c 28 70 44 62 2d 3e  cl_VarEval(pDb->
37b0: 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 42 75  interp, pDb->zBu
37c0: 73 79 2c 20 22 20 22 2c 20 7a 56 61 6c 2c 20 28  sy, " ", zVal, (
37d0: 63 68 61 72 2a 29 30 29 3b 0a 20 20 69 66 28 20  char*)0);.  if( 
37e0: 72 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74  rc!=TCL_OK || at
37f0: 6f 69 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  oi(Tcl_GetString
3800: 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65  Result(pDb->inte
3810: 72 70 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75  rp)) ){.    retu
3820: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
3830: 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn 1;.}../*.** T
3840: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69  his routine is i
3850: 6e 76 6f 6b 65 64 20 61 73 20 74 68 65 20 27 70  nvoked as the 'p
3860: 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b  rogress callback
3870: 27 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  ' for the databa
3880: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
3890: 74 20 44 62 50 72 6f 67 72 65 73 73 48 61 6e 64  t DbProgressHand
38a0: 6c 65 72 28 76 6f 69 64 20 2a 63 64 29 7b 0a 20  ler(void *cd){. 
38b0: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
38c0: 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a   (SqliteDb*)cd;.
38d0: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
38e0: 65 72 74 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72  ert( pDb->zProgr
38f0: 65 73 73 20 29 3b 0a 20 20 72 63 20 3d 20 54 63  ess );.  rc = Tc
3900: 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65  l_Eval(pDb->inte
3910: 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65  rp, pDb->zProgre
3920: 73 73 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 54  ss);.  if( rc!=T
3930: 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28 54 63  CL_OK || atoi(Tc
3940: 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
3950: 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 29 20  t(pDb->interp)) 
3960: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
3970: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
3980: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
3990: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a  TE_OMIT_TRACE./*
39a0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
39b0: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
39c0: 65 20 53 51 4c 69 74 65 20 74 72 61 63 65 20 68  e SQLite trace h
39d0: 61 6e 64 6c 65 72 20 77 68 65 6e 65 76 65 72 20  andler whenever 
39e0: 61 20 6e 65 77 0a 2a 2a 20 62 6c 6f 63 6b 20 6f  a new.** block o
39f0: 66 20 53 51 4c 20 69 73 20 65 78 65 63 75 74 65  f SQL is execute
3a00: 64 2e 20 20 54 68 65 20 54 43 4c 20 73 63 72 69  d.  The TCL scri
3a10: 70 74 20 69 6e 20 70 44 62 2d 3e 7a 54 72 61 63  pt in pDb->zTrac
3a20: 65 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a 2a  e is executed..*
3a30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44 62  /.static void Db
3a40: 54 72 61 63 65 48 61 6e 64 6c 65 72 28 76 6f 69  TraceHandler(voi
3a50: 64 20 2a 63 64 2c 20 63 6f 6e 73 74 20 63 68 61  d *cd, const cha
3a60: 72 20 2a 7a 53 71 6c 29 7b 0a 20 20 53 71 6c 69  r *zSql){.  Sqli
3a70: 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c  teDb *pDb = (Sql
3a80: 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 54 63 6c  iteDb*)cd;.  Tcl
3a90: 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a 0a 20  _DString str;.. 
3aa0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
3ab0: 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f 44 53  (&str);.  Tcl_DS
3ac0: 74 72 69 6e 67 41 70 70 65 6e 64 28 26 73 74 72  tringAppend(&str
3ad0: 2c 20 70 44 62 2d 3e 7a 54 72 61 63 65 2c 20 2d  , pDb->zTrace, -
3ae0: 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  1);.  Tcl_DStrin
3af0: 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26  gAppendElement(&
3b00: 73 74 72 2c 20 7a 53 71 6c 29 3b 0a 20 20 54 63  str, zSql);.  Tc
3b10: 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65  l_Eval(pDb->inte
3b20: 72 70 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56  rp, Tcl_DStringV
3b30: 61 6c 75 65 28 26 73 74 72 29 29 3b 0a 20 20 54  alue(&str));.  T
3b40: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
3b50: 73 74 72 29 3b 0a 20 20 54 63 6c 5f 52 65 73 65  str);.  Tcl_Rese
3b60: 74 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74  tResult(pDb->int
3b70: 65 72 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  erp);.}.#endif..
3b80: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
3b90: 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20  MIT_TRACE./*.** 
3ba0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
3bb0: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 53 51  called by the SQ
3bc0: 4c 69 74 65 20 70 72 6f 66 69 6c 65 20 68 61 6e  Lite profile han
3bd0: 64 6c 65 72 20 61 66 74 65 72 20 61 20 73 74 61  dler after a sta
3be0: 74 65 6d 65 6e 74 0a 2a 2a 20 53 51 4c 20 68 61  tement.** SQL ha
3bf0: 73 20 65 78 65 63 75 74 65 64 2e 20 20 54 68 65  s executed.  The
3c00: 20 54 43 4c 20 73 63 72 69 70 74 20 69 6e 20 70   TCL script in p
3c10: 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 69 73 20  Db->zProfile is 
3c20: 65 76 61 6c 75 61 74 65 64 2e 0a 2a 2f 0a 73 74  evaluated..*/.st
3c30: 61 74 69 63 20 76 6f 69 64 20 44 62 50 72 6f 66  atic void DbProf
3c40: 69 6c 65 48 61 6e 64 6c 65 72 28 76 6f 69 64 20  ileHandler(void 
3c50: 2a 63 64 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *cd, const char 
3c60: 2a 7a 53 71 6c 2c 20 73 71 6c 69 74 65 5f 75 69  *zSql, sqlite_ui
3c70: 6e 74 36 34 20 74 6d 29 7b 0a 20 20 53 71 6c 69  nt64 tm){.  Sqli
3c80: 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c  teDb *pDb = (Sql
3c90: 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 54 63 6c  iteDb*)cd;.  Tcl
3ca0: 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a 20 20  _DString str;.  
3cb0: 63 68 61 72 20 7a 54 6d 5b 31 30 30 5d 3b 0a 0a  char zTm[100];..
3cc0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
3cd0: 74 66 28 73 69 7a 65 6f 66 28 7a 54 6d 29 2d 31  tf(sizeof(zTm)-1
3ce0: 2c 20 7a 54 6d 2c 20 22 25 6c 6c 64 22 2c 20 74  , zTm, "%lld", t
3cf0: 6d 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  m);.  Tcl_DStrin
3d00: 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 54  gInit(&str);.  T
3d10: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
3d20: 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a 50 72 6f  (&str, pDb->zPro
3d30: 66 69 6c 65 2c 20 2d 31 29 3b 0a 20 20 54 63 6c  file, -1);.  Tcl
3d40: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c  _DStringAppendEl
3d50: 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 53 71 6c  ement(&str, zSql
3d60: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
3d70: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73  AppendElement(&s
3d80: 74 72 2c 20 7a 54 6d 29 3b 0a 20 20 54 63 6c 5f  tr, zTm);.  Tcl_
3d90: 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70  Eval(pDb->interp
3da0: 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c  , Tcl_DStringVal
3db0: 75 65 28 26 73 74 72 29 29 3b 0a 20 20 54 63 6c  ue(&str));.  Tcl
3dc0: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 73 74  _DStringFree(&st
3dd0: 72 29 3b 0a 20 20 54 63 6c 5f 52 65 73 65 74 52  r);.  Tcl_ResetR
3de0: 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72  esult(pDb->inter
3df0: 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  p);.}.#endif../*
3e00: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
3e10: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
3e20: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
3e30: 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 54 68 65   committed.  The
3e40: 0a 2a 2a 20 54 43 4c 20 73 63 72 69 70 74 20 69  .** TCL script i
3e50: 6e 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 69  n pDb->zCommit i
3e60: 73 20 65 78 65 63 75 74 65 64 2e 20 20 49 66 20  s executed.  If 
3e70: 69 74 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a  it returns non-z
3e80: 65 72 6f 20 6f 72 0a 2a 2a 20 69 66 20 69 74 20  ero or.** if it 
3e90: 74 68 72 6f 77 73 20 61 6e 20 65 78 63 65 70 74  throws an except
3ea0: 69 6f 6e 2c 20 74 68 65 20 74 72 61 6e 73 61 63  ion, the transac
3eb0: 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
3ec0: 61 63 6b 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f  ack instead.** o
3ed0: 66 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65  f being committe
3ee0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
3ef0: 20 44 62 43 6f 6d 6d 69 74 48 61 6e 64 6c 65 72   DbCommitHandler
3f00: 28 76 6f 69 64 20 2a 63 64 29 7b 0a 20 20 53 71  (void *cd){.  Sq
3f10: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
3f20: 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69  qliteDb*)cd;.  i
3f30: 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 54  nt rc;..  rc = T
3f40: 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74  cl_Eval(pDb->int
3f50: 65 72 70 2c 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69  erp, pDb->zCommi
3f60: 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 54 43  t);.  if( rc!=TC
3f70: 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28 54 63 6c  L_OK || atoi(Tcl
3f80: 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74  _GetStringResult
3f90: 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 29 20 29  (pDb->interp)) )
3fa0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
3fb0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
3fc0: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44  }..static void D
3fd0: 62 52 6f 6c 6c 62 61 63 6b 48 61 6e 64 6c 65 72  bRollbackHandler
3fe0: 28 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74  (void *clientDat
3ff0: 61 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  a){.  SqliteDb *
4000: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a  pDb = (SqliteDb*
4010: 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 61  )clientData;.  a
4020: 73 73 65 72 74 28 70 44 62 2d 3e 70 52 6f 6c 6c  ssert(pDb->pRoll
4030: 62 61 63 6b 48 6f 6f 6b 29 3b 0a 20 20 69 66 28  backHook);.  if(
4040: 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 45 76 61   TCL_OK!=Tcl_Eva
4050: 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65  lObjEx(pDb->inte
4060: 72 70 2c 20 70 44 62 2d 3e 70 52 6f 6c 6c 62 61  rp, pDb->pRollba
4070: 63 6b 48 6f 6f 6b 2c 20 30 29 20 29 7b 0a 20 20  ckHook, 0) ){.  
4080: 20 20 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64    Tcl_Background
4090: 45 72 72 6f 72 28 70 44 62 2d 3e 69 6e 74 65 72  Error(pDb->inter
40a0: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  p);.  }.}..stati
40b0: 63 20 76 6f 69 64 20 44 62 55 70 64 61 74 65 48  c void DbUpdateH
40c0: 61 6e 64 6c 65 72 28 0a 20 20 76 6f 69 64 20 2a  andler(.  void *
40d0: 70 2c 20 0a 20 20 69 6e 74 20 6f 70 2c 0a 20 20  p, .  int op,.  
40e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c  const char *zDb,
40f0: 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
4100: 7a 54 62 6c 2c 20 0a 20 20 73 71 6c 69 74 65 5f  zTbl, .  sqlite_
4110: 69 6e 74 36 34 20 72 6f 77 69 64 0a 29 7b 0a 20  int64 rowid.){. 
4120: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
4130: 20 28 53 71 6c 69 74 65 44 62 20 2a 29 70 3b 0a   (SqliteDb *)p;.
4140: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b    Tcl_Obj *pCmd;
4150: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 2d  ..  assert( pDb-
4160: 3e 70 55 70 64 61 74 65 48 6f 6f 6b 20 29 3b 0a  >pUpdateHook );.
4170: 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 51    assert( op==SQ
4180: 4c 49 54 45 5f 49 4e 53 45 52 54 20 7c 7c 20 6f  LITE_INSERT || o
4190: 70 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45  p==SQLITE_UPDATE
41a0: 20 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 44   || op==SQLITE_D
41b0: 45 4c 45 54 45 20 29 3b 0a 0a 20 20 70 43 6d 64  ELETE );..  pCmd
41c0: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
41d0: 4f 62 6a 28 70 44 62 2d 3e 70 55 70 64 61 74 65  Obj(pDb->pUpdate
41e0: 48 6f 6f 6b 29 3b 0a 20 20 54 63 6c 5f 49 6e 63  Hook);.  Tcl_Inc
41f0: 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b  rRefCount(pCmd);
4200: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
4210: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
4220: 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Cmd, Tcl_NewStri
4230: 6e 67 4f 62 6a 28 0a 20 20 20 20 28 20 28 6f 70  ngObj(.    ( (op
4240: 3d 3d 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 29  ==SQLITE_INSERT)
4250: 3f 22 49 4e 53 45 52 54 22 3a 28 6f 70 3d 3d 53  ?"INSERT":(op==S
4260: 51 4c 49 54 45 5f 55 50 44 41 54 45 29 3f 22 55  QLITE_UPDATE)?"U
4270: 50 44 41 54 45 22 3a 22 44 45 4c 45 54 45 22 29  PDATE":"DELETE")
4280: 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
4290: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
42a0: 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f  nt(0, pCmd, Tcl_
42b0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 44 62  NewStringObj(zDb
42c0: 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
42d0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
42e0: 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f  nt(0, pCmd, Tcl_
42f0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54 62  NewStringObj(zTb
4300: 6c 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c  l, -1));.  Tcl_L
4310: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
4320: 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c  ent(0, pCmd, Tcl
4330: 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 72  _NewWideIntObj(r
4340: 6f 77 69 64 29 29 3b 0a 20 20 54 63 6c 5f 45 76  owid));.  Tcl_Ev
4350: 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69 6e 74  alObjEx(pDb->int
4360: 65 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c 5f 45  erp, pCmd, TCL_E
4370: 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 7d 0a 0a  VAL_DIRECT);.}..
4380: 73 74 61 74 69 63 20 76 6f 69 64 20 74 63 6c 43  static void tclC
4390: 6f 6c 6c 61 74 65 4e 65 65 64 65 64 28 0a 20 20  ollateNeeded(.  
43a0: 76 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20 73 71  void *pCtx,.  sq
43b0: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74  lite3 *db,.  int
43c0: 20 65 6e 63 2c 0a 20 20 63 6f 6e 73 74 20 63 68   enc,.  const ch
43d0: 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 53  ar *zName.){.  S
43e0: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
43f0: 53 71 6c 69 74 65 44 62 20 2a 29 70 43 74 78 3b  SqliteDb *)pCtx;
4400: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72  .  Tcl_Obj *pScr
4410: 69 70 74 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63  ipt = Tcl_Duplic
4420: 61 74 65 4f 62 6a 28 70 44 62 2d 3e 70 43 6f 6c  ateObj(pDb->pCol
4430: 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 54  lateNeeded);.  T
4440: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
4450: 70 53 63 72 69 70 74 29 3b 0a 20 20 54 63 6c 5f  pScript);.  Tcl_
4460: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
4470: 6d 65 6e 74 28 30 2c 20 70 53 63 72 69 70 74 2c  ment(0, pScript,
4480: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
4490: 6a 28 7a 4e 61 6d 65 2c 20 2d 31 29 29 3b 0a 20  j(zName, -1));. 
44a0: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70   Tcl_EvalObjEx(p
44b0: 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 53 63 72  Db->interp, pScr
44c0: 69 70 74 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44  ipt, 0);.  Tcl_D
44d0: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72  ecrRefCount(pScr
44e0: 69 70 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ipt);.}../*.** T
44f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
4500: 61 6c 6c 65 64 20 74 6f 20 65 76 61 6c 75 61 74  alled to evaluat
4510: 65 20 61 6e 20 53 51 4c 20 63 6f 6c 6c 61 74 69  e an SQL collati
4520: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c  on function impl
4530: 65 6d 65 6e 74 65 64 0a 2a 2a 20 75 73 69 6e 67  emented.** using
4540: 20 54 43 4c 20 73 63 72 69 70 74 2e 0a 2a 2f 0a   TCL script..*/.
4550: 73 74 61 74 69 63 20 69 6e 74 20 74 63 6c 53 71  static int tclSq
4560: 6c 43 6f 6c 6c 61 74 65 28 0a 20 20 76 6f 69 64  lCollate(.  void
4570: 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e 41   *pCtx,.  int nA
4580: 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ,.  const void *
4590: 7a 41 2c 0a 20 20 69 6e 74 20 6e 42 2c 0a 20 20  zA,.  int nB,.  
45a0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 0a 29  const void *zB.)
45b0: 7b 0a 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a  {.  SqlCollate *
45c0: 70 20 3d 20 28 53 71 6c 43 6f 6c 6c 61 74 65 20  p = (SqlCollate 
45d0: 2a 29 70 43 74 78 3b 0a 20 20 54 63 6c 5f 4f 62  *)pCtx;.  Tcl_Ob
45e0: 6a 20 2a 70 43 6d 64 3b 0a 0a 20 20 70 43 6d 64  j *pCmd;..  pCmd
45f0: 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
4600: 4f 62 6a 28 70 2d 3e 7a 53 63 72 69 70 74 2c 20  Obj(p->zScript, 
4610: 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52  -1);.  Tcl_IncrR
4620: 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20  efCount(pCmd);. 
4630: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
4640: 6e 64 45 6c 65 6d 65 6e 74 28 70 2d 3e 69 6e 74  ndElement(p->int
4650: 65 72 70 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e  erp, pCmd, Tcl_N
4660: 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 41 2c 20  ewStringObj(zA, 
4670: 6e 41 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  nA));.  Tcl_List
4680: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
4690: 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64  (p->interp, pCmd
46a0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
46b0: 62 6a 28 7a 42 2c 20 6e 42 29 29 3b 0a 20 20 54  bj(zB, nB));.  T
46c0: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e  cl_EvalObjEx(p->
46d0: 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 43  interp, pCmd, TC
46e0: 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a  L_EVAL_DIRECT);.
46f0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
4700: 6e 74 28 70 43 6d 64 29 3b 0a 20 20 72 65 74 75  nt(pCmd);.  retu
4710: 72 6e 20 28 61 74 6f 69 28 54 63 6c 5f 47 65 74  rn (atoi(Tcl_Get
4720: 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e  StringResult(p->
4730: 69 6e 74 65 72 70 29 29 29 3b 0a 7d 0a 0a 2f 2a  interp)));.}../*
4740: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
4750: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 76   is called to ev
4760: 61 6c 75 61 74 65 20 61 6e 20 53 51 4c 20 66 75  aluate an SQL fu
4770: 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74  nction implement
4780: 65 64 0a 2a 2a 20 75 73 69 6e 67 20 54 43 4c 20  ed.** using TCL 
4790: 73 63 72 69 70 74 2e 0a 2a 2f 0a 73 74 61 74 69  script..*/.stati
47a0: 63 20 76 6f 69 64 20 74 63 6c 53 71 6c 46 75 6e  c void tclSqlFun
47b0: 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  c(sqlite3_contex
47c0: 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20  t *context, int 
47d0: 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
47e0: 6c 75 65 2a 2a 61 72 67 76 29 7b 0a 20 20 53 71  lue**argv){.  Sq
47f0: 6c 46 75 6e 63 20 2a 70 20 3d 20 73 71 6c 69 74  lFunc *p = sqlit
4800: 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e  e3_user_data(con
4810: 74 65 78 74 29 3b 0a 20 20 54 63 6c 5f 4f 62 6a  text);.  Tcl_Obj
4820: 20 2a 70 43 6d 64 3b 0a 20 20 69 6e 74 20 69 3b   *pCmd;.  int i;
4830: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
4840: 28 20 61 72 67 63 3d 3d 30 20 29 7b 0a 20 20 20  ( argc==0 ){.   
4850: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
4860: 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20 74 6f   no arguments to
4870: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c 20 63   the function, c
4880: 61 6c 6c 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  all Tcl_EvalObjE
4890: 78 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  x on the.    ** 
48a0: 73 63 72 69 70 74 20 6f 62 6a 65 63 74 20 64 69  script object di
48b0: 72 65 63 74 6c 79 2e 20 20 54 68 69 73 20 61 6c  rectly.  This al
48c0: 6c 6f 77 73 20 74 68 65 20 54 43 4c 20 63 6f 6d  lows the TCL com
48d0: 70 69 6c 65 72 20 74 6f 20 67 65 6e 65 72 61 74  piler to generat
48e0: 65 0a 20 20 20 20 2a 2a 20 62 79 74 65 63 6f 64  e.    ** bytecod
48f0: 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 61 6e  e for the comman
4900: 64 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 69  d on the first i
4910: 6e 76 6f 63 61 74 69 6f 6e 20 61 6e 64 20 74 68  nvocation and th
4920: 75 73 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73  us make.    ** s
4930: 75 62 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61  ubsequent invoca
4940: 74 69 6f 6e 73 20 6d 75 63 68 20 66 61 73 74 65  tions much faste
4950: 72 2e 20 2a 2f 0a 20 20 20 20 70 43 6d 64 20 3d  r. */.    pCmd =
4960: 20 70 2d 3e 70 53 63 72 69 70 74 3b 0a 20 20 20   p->pScript;.   
4970: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
4980: 74 28 70 43 6d 64 29 3b 0a 20 20 20 20 72 63 20  t(pCmd);.    rc 
4990: 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28  = Tcl_EvalObjEx(
49a0: 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c  p->interp, pCmd,
49b0: 20 30 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63   0);.    Tcl_Dec
49c0: 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b  rRefCount(pCmd);
49d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
49e0: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61 72   If there are ar
49f0: 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 66  guments to the f
4a00: 75 6e 63 74 69 6f 6e 2c 20 6d 61 6b 65 20 61 20  unction, make a 
4a10: 73 68 61 6c 6c 6f 77 20 63 6f 70 79 20 6f 66 20  shallow copy of 
4a20: 74 68 65 0a 20 20 20 20 2a 2a 20 73 63 72 69 70  the.    ** scrip
4a30: 74 20 6f 62 6a 65 63 74 2c 20 6c 61 70 70 65 6e  t object, lappen
4a40: 64 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 2c  d the arguments,
4a50: 20 74 68 65 6e 20 65 76 61 6c 75 61 74 65 20 74   then evaluate t
4a60: 68 65 20 63 6f 70 79 2e 0a 20 20 20 20 2a 2a 0a  he copy..    **.
4a70: 20 20 20 20 2a 2a 20 42 79 20 22 73 68 61 6c 6c      ** By "shall
4a80: 6f 77 22 20 63 6f 70 79 2c 20 77 65 20 6d 65 61  ow" copy, we mea
4a90: 6e 20 61 20 6f 6e 6c 79 20 74 68 65 20 6f 75 74  n a only the out
4aa0: 65 72 20 6c 69 73 74 20 54 63 6c 5f 4f 62 6a 20  er list Tcl_Obj 
4ab0: 69 73 20 64 75 70 6c 69 63 61 74 65 64 2e 0a 20  is duplicated.. 
4ac0: 20 20 20 2a 2a 20 54 68 65 20 6e 65 77 20 54 63     ** The new Tc
4ad0: 6c 5f 4f 62 6a 20 63 6f 6e 74 61 69 6e 73 20 70  l_Obj contains p
4ae0: 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65 20 6f  ointers to the o
4af0: 72 69 67 69 6e 61 6c 20 6c 69 73 74 20 65 6c 65  riginal list ele
4b00: 6d 65 6e 74 73 2e 20 0a 20 20 20 20 2a 2a 20 54  ments. .    ** T
4b10: 68 61 74 20 77 61 79 2c 20 77 68 65 6e 20 54 63  hat way, when Tc
4b20: 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 69 73 20  l_EvalObjv() is 
4b30: 72 75 6e 20 61 6e 64 20 73 68 69 6d 6d 65 72 73  run and shimmers
4b40: 20 74 68 65 20 66 69 72 73 74 20 65 6c 65 6d 65   the first eleme
4b50: 6e 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  nt.    ** of the
4b60: 20 6c 69 73 74 20 74 6f 20 74 63 6c 43 6d 64 4e   list to tclCmdN
4b70: 61 6d 65 54 79 70 65 2c 20 74 68 61 74 20 61 6c  ameType, that al
4b80: 74 65 72 6e 61 74 65 20 72 65 70 72 65 73 65 6e  ternate represen
4b90: 74 61 74 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20  tation will.    
4ba0: 2a 2a 20 62 65 20 70 72 65 73 65 72 76 65 64 20  ** be preserved 
4bb0: 61 6e 64 20 72 65 75 73 65 64 20 6f 6e 20 74 68  and reused on th
4bc0: 65 20 6e 65 78 74 20 69 6e 76 6f 63 61 74 69 6f  e next invocatio
4bd0: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 54 63  n..    */.    Tc
4be0: 6c 5f 4f 62 6a 20 2a 2a 61 41 72 67 3b 0a 20 20  l_Obj **aArg;.  
4bf0: 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20    int nArg;.    
4c00: 69 66 28 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 47  if( Tcl_ListObjG
4c10: 65 74 45 6c 65 6d 65 6e 74 73 28 70 2d 3e 69 6e  etElements(p->in
4c20: 74 65 72 70 2c 20 70 2d 3e 70 53 63 72 69 70 74  terp, p->pScript
4c30: 2c 20 26 6e 41 72 67 2c 20 26 61 41 72 67 29 20  , &nArg, &aArg) 
4c40: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
4c50: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
4c60: 6e 74 65 78 74 2c 20 54 63 6c 5f 47 65 74 53 74  ntext, Tcl_GetSt
4c70: 72 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e  ringResult(p->in
4c80: 74 65 72 70 29 2c 20 2d 31 29 3b 20 0a 20 20 20  terp), -1); .   
4c90: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
4ca0: 20 20 20 20 20 0a 20 20 20 20 70 43 6d 64 20 3d       .    pCmd =
4cb0: 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28   Tcl_NewListObj(
4cc0: 6e 41 72 67 2c 20 61 41 72 67 29 3b 0a 20 20 20  nArg, aArg);.   
4cd0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
4ce0: 74 28 70 43 6d 64 29 3b 0a 20 20 20 20 66 6f 72  t(pCmd);.    for
4cf0: 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b  (i=0; i<argc; i+
4d00: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
4d10: 33 5f 76 61 6c 75 65 20 2a 70 49 6e 20 3d 20 61  3_value *pIn = a
4d20: 72 67 76 5b 69 5d 3b 0a 20 20 20 20 20 20 54 63  rgv[i];.      Tc
4d30: 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b 0a 20 20 20  l_Obj *pVal;.   
4d40: 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20           .      
4d50: 2f 2a 20 53 65 74 20 70 56 61 6c 20 74 6f 20 63  /* Set pVal to c
4d60: 6f 6e 74 61 69 6e 20 74 68 65 20 69 27 74 68 20  ontain the i'th 
4d70: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 69 73 20 72  column of this r
4d80: 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 73 77 69  ow. */.      swi
4d90: 74 63 68 28 20 73 71 6c 69 74 65 33 5f 76 61 6c  tch( sqlite3_val
4da0: 75 65 5f 74 79 70 65 28 70 49 6e 29 20 29 7b 0a  ue_type(pIn) ){.
4db0: 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
4dc0: 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20  ITE_BLOB: {.    
4dd0: 20 20 20 20 20 20 69 6e 74 20 62 79 74 65 73 20        int bytes 
4de0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
4df0: 62 79 74 65 73 28 70 49 6e 29 3b 0a 20 20 20 20  bytes(pIn);.    
4e00: 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c        pVal = Tcl
4e10: 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a  _NewByteArrayObj
4e20: 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62  (sqlite3_value_b
4e30: 6c 6f 62 28 70 49 6e 29 2c 20 62 79 74 65 73 29  lob(pIn), bytes)
4e40: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
4e50: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
4e60: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
4e70: 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20  _INTEGER: {.    
4e80: 20 20 20 20 20 20 73 71 6c 69 74 65 5f 69 6e 74        sqlite_int
4e90: 36 34 20 76 20 3d 20 73 71 6c 69 74 65 33 5f 76  64 v = sqlite3_v
4ea0: 61 6c 75 65 5f 69 6e 74 36 34 28 70 49 6e 29 3b  alue_int64(pIn);
4eb0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 76  .          if( v
4ec0: 3e 3d 2d 32 31 34 37 34 38 33 36 34 37 20 26 26  >=-2147483647 &&
4ed0: 20 76 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29   v<=2147483647 )
4ee0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 56  {.            pV
4ef0: 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  al = Tcl_NewIntO
4f00: 62 6a 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  bj(v);.         
4f10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
4f20: 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e      pVal = Tcl_N
4f30: 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 76 29 3b  ewWideIntObj(v);
4f40: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
4f50: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
4f60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4f70: 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41  case SQLITE_FLOA
4f80: 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 64  T: {.          d
4f90: 6f 75 62 6c 65 20 72 20 3d 20 73 71 6c 69 74 65  ouble r = sqlite
4fa0: 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 70  3_value_double(p
4fb0: 49 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  In);.          p
4fc0: 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 44 6f 75  Val = Tcl_NewDou
4fd0: 62 6c 65 4f 62 6a 28 72 29 3b 0a 20 20 20 20 20  bleObj(r);.     
4fe0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4ff0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61      }.        ca
5000: 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20  se SQLITE_NULL: 
5010: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 56 61 6c  {.          pVal
5020: 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
5030: 4f 62 6a 28 22 22 2c 20 30 29 3b 0a 20 20 20 20  Obj("", 0);.    
5040: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5050: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 64       }.        d
5060: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
5070: 20 20 20 20 69 6e 74 20 62 79 74 65 73 20 3d 20      int bytes = 
5080: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
5090: 74 65 73 28 70 49 6e 29 3b 0a 20 20 20 20 20 20  tes(pIn);.      
50a0: 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e      pVal = Tcl_N
50b0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61  ewStringObj((cha
50c0: 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  r *)sqlite3_valu
50d0: 65 5f 74 65 78 74 28 70 49 6e 29 2c 20 62 79 74  e_text(pIn), byt
50e0: 65 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  es);.          b
50f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
5100: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
5110: 20 3d 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70   = Tcl_ListObjAp
5120: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d 3e 69  pendElement(p->i
5130: 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 70 56 61  nterp, pCmd, pVa
5140: 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  l);.      if( rc
5150: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
5160: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d  DecrRefCount(pCm
5170: 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  d);.        sqli
5180: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
5190: 28 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f 47 65  (context, Tcl_Ge
51a0: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 2d  tStringResult(p-
51b0: 3e 69 6e 74 65 72 70 29 2c 20 2d 31 29 3b 20 0a  >interp), -1); .
51c0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
51d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
51e0: 20 20 69 66 28 20 21 70 2d 3e 75 73 65 45 76 61    if( !p->useEva
51f0: 6c 4f 62 6a 76 20 29 7b 0a 20 20 20 20 20 20 2f  lObjv ){.      /
5200: 2a 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28  * Tcl_EvalObjEx(
5210: 29 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63  ) will automatic
5220: 61 6c 6c 79 20 63 61 6c 6c 20 54 63 6c 5f 45 76  ally call Tcl_Ev
5230: 61 6c 4f 62 6a 76 28 29 20 69 66 20 70 43 6d 64  alObjv() if pCmd
5240: 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 20 6c  .      ** is a l
5250: 69 73 74 20 77 69 74 68 6f 75 74 20 61 20 73 74  ist without a st
5260: 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74  ring representat
5270: 69 6f 6e 2e 20 20 54 6f 20 70 72 65 76 65 6e 74  ion.  To prevent
5280: 20 74 68 69 73 20 66 72 6f 6d 0a 20 20 20 20 20   this from.     
5290: 20 2a 2a 20 68 61 70 70 65 6e 69 6e 67 2c 20 6d   ** happening, m
52a0: 61 6b 65 20 73 75 72 65 20 70 43 6d 64 20 68 61  ake sure pCmd ha
52b0: 73 20 61 20 76 61 6c 69 64 20 73 74 72 69 6e 67  s a valid string
52c0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
52d0: 2a 2f 0a 20 20 20 20 20 20 54 63 6c 5f 47 65 74  */.      Tcl_Get
52e0: 53 74 72 69 6e 67 28 70 43 6d 64 29 3b 0a 20 20  String(pCmd);.  
52f0: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 54 63 6c    }.    rc = Tcl
5300: 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e  _EvalObjEx(p->in
5310: 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c 5f  terp, pCmd, TCL_
5320: 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20  EVAL_DIRECT);.  
5330: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
5340: 6e 74 28 70 43 6d 64 29 3b 0a 20 20 7d 0a 0a 20  nt(pCmd);.  }.. 
5350: 20 69 66 28 20 72 63 20 26 26 20 72 63 21 3d 54   if( rc && rc!=T
5360: 43 4c 5f 52 45 54 55 52 4e 20 29 7b 0a 20 20 20  CL_RETURN ){.   
5370: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
5380: 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 54  error(context, T
5390: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
53a0: 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c 20 2d  lt(p->interp), -
53b0: 31 29 3b 20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  1); .  }else{.  
53c0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 72 20    Tcl_Obj *pVar 
53d0: 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75  = Tcl_GetObjResu
53e0: 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 3b 0a 20  lt(p->interp);. 
53f0: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 75 38     int n;.    u8
5400: 20 2a 64 61 74 61 3b 0a 20 20 20 20 63 68 61 72   *data;.    char
5410: 20 2a 7a 54 79 70 65 20 3d 20 70 56 61 72 2d 3e   *zType = pVar->
5420: 74 79 70 65 50 74 72 20 3f 20 70 56 61 72 2d 3e  typePtr ? pVar->
5430: 74 79 70 65 50 74 72 2d 3e 6e 61 6d 65 20 3a 20  typePtr->name : 
5440: 22 22 3b 0a 20 20 20 20 63 68 61 72 20 63 20 3d  "";.    char c =
5450: 20 7a 54 79 70 65 5b 30 5d 3b 0a 20 20 20 20 69   zType[0];.    i
5460: 66 28 20 63 3d 3d 27 62 27 20 26 26 20 73 74 72  f( c=='b' && str
5470: 63 6d 70 28 7a 54 79 70 65 2c 22 62 79 74 65 61  cmp(zType,"bytea
5480: 72 72 61 79 22 29 3d 3d 30 20 26 26 20 70 56 61  rray")==0 && pVa
5490: 72 2d 3e 62 79 74 65 73 3d 3d 30 20 29 7b 0a 20  r->bytes==0 ){. 
54a0: 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 72 65 74       /* Only ret
54b0: 75 72 6e 20 61 20 42 4c 4f 42 20 74 79 70 65 20  urn a BLOB type 
54c0: 69 66 20 74 68 65 20 54 63 6c 20 76 61 72 69 61  if the Tcl varia
54d0: 62 6c 65 20 69 73 20 61 20 62 79 74 65 61 72 72  ble is a bytearr
54e0: 61 79 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  ay and.      ** 
54f0: 68 61 73 20 6e 6f 20 73 74 72 69 6e 67 20 72 65  has no string re
5500: 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20 2a 2f  presentation. */
5510: 0a 20 20 20 20 20 20 64 61 74 61 20 3d 20 54 63  .      data = Tc
5520: 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72  l_GetByteArrayFr
5530: 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b  omObj(pVar, &n);
5540: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
5550: 65 73 75 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65  esult_blob(conte
5560: 78 74 2c 20 64 61 74 61 2c 20 6e 2c 20 53 51 4c  xt, data, n, SQL
5570: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
5580: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
5590: 3d 27 62 27 20 26 26 20 73 74 72 63 6d 70 28 7a  ='b' && strcmp(z
55a0: 54 79 70 65 2c 22 62 6f 6f 6c 65 61 6e 22 29 3d  Type,"boolean")=
55b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =0 ){.      Tcl_
55c0: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 30 2c  GetIntFromObj(0,
55d0: 20 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20   pVar, &n);.    
55e0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
55f0: 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 6e 29  _int(context, n)
5600: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
5610: 63 3d 3d 27 64 27 20 26 26 20 73 74 72 63 6d 70  c=='d' && strcmp
5620: 28 7a 54 79 70 65 2c 22 64 6f 75 62 6c 65 22 29  (zType,"double")
5630: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 6f 75  ==0 ){.      dou
5640: 62 6c 65 20 72 3b 0a 20 20 20 20 20 20 54 63 6c  ble r;.      Tcl
5650: 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62  _GetDoubleFromOb
5660: 6a 28 30 2c 20 70 56 61 72 2c 20 26 72 29 3b 0a  j(0, pVar, &r);.
5670: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
5680: 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74  sult_double(cont
5690: 65 78 74 2c 20 72 29 3b 0a 20 20 20 20 7d 65 6c  ext, r);.    }el
56a0: 73 65 20 69 66 28 20 28 63 3d 3d 27 77 27 20 26  se if( (c=='w' &
56b0: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
56c0: 77 69 64 65 49 6e 74 22 29 3d 3d 30 29 20 7c 7c  wideInt")==0) ||
56d0: 0a 20 20 20 20 20 20 20 20 20 20 28 63 3d 3d 27  .          (c=='
56e0: 69 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79  i' && strcmp(zTy
56f0: 70 65 2c 22 69 6e 74 22 29 3d 3d 30 29 20 29 7b  pe,"int")==0) ){
5700: 0a 20 20 20 20 20 20 54 63 6c 5f 57 69 64 65 49  .      Tcl_WideI
5710: 6e 74 20 76 3b 0a 20 20 20 20 20 20 54 63 6c 5f  nt v;.      Tcl_
5720: 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62  GetWideIntFromOb
5730: 6a 28 30 2c 20 70 56 61 72 2c 20 26 76 29 3b 0a  j(0, pVar, &v);.
5740: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
5750: 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65  sult_int64(conte
5760: 78 74 2c 20 76 29 3b 0a 20 20 20 20 7d 65 6c 73  xt, v);.    }els
5770: 65 7b 0a 20 20 20 20 20 20 64 61 74 61 20 3d 20  e{.      data = 
5780: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
5790: 29 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72  )Tcl_GetStringFr
57a0: 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b  omObj(pVar, &n);
57b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
57c0: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
57d0: 78 74 2c 20 28 63 68 61 72 20 2a 29 64 61 74 61  xt, (char *)data
57e0: 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  , n, SQLITE_TRAN
57f0: 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d 0a 20 20  SIENT);.    }.  
5800: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
5810: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
5820: 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 54 68 69  ZATION./*.** Thi
5830: 73 20 69 73 20 74 68 65 20 61 75 74 68 65 6e 74  s is the authent
5840: 69 63 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  ication function
5850: 2e 20 20 49 74 20 61 70 70 65 6e 64 73 20 74 68  .  It appends th
5860: 65 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e  e authentication
5870: 0a 2a 2a 20 74 79 70 65 20 63 6f 64 65 20 61 6e  .** type code an
5880: 64 20 74 68 65 20 74 77 6f 20 61 72 67 75 6d 65  d the two argume
5890: 6e 74 73 20 74 6f 20 7a 43 6d 64 5b 5d 20 74 68  nts to zCmd[] th
58a0: 65 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 72  en invokes the r
58b0: 65 73 75 6c 74 0a 2a 2a 20 6f 6e 20 74 68 65 20  esult.** on the 
58c0: 69 6e 74 65 72 70 72 65 74 65 72 2e 20 20 54 68  interpreter.  Th
58d0: 65 20 72 65 70 6c 79 20 69 73 20 65 78 61 6d 69  e reply is exami
58e0: 6e 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ned to determine
58f0: 20 69 66 20 74 68 65 0a 2a 2a 20 61 75 74 68 65   if the.** authe
5900: 6e 74 69 63 61 74 69 6f 6e 20 66 61 69 6c 73 20  ntication fails 
5910: 6f 72 20 73 75 63 63 65 65 64 73 2e 0a 2a 2f 0a  or succeeds..*/.
5920: 73 74 61 74 69 63 20 69 6e 74 20 61 75 74 68 5f  static int auth_
5930: 63 61 6c 6c 62 61 63 6b 28 0a 20 20 76 6f 69 64  callback(.  void
5940: 20 2a 70 41 72 67 2c 0a 20 20 69 6e 74 20 63 6f   *pArg,.  int co
5950: 64 65 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  de,.  const char
5960: 20 2a 7a 41 72 67 31 2c 0a 20 20 63 6f 6e 73 74   *zArg1,.  const
5970: 20 63 68 61 72 20 2a 7a 41 72 67 32 2c 0a 20 20   char *zArg2,.  
5980: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
5990: 33 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  3,.  const char 
59a0: 2a 7a 41 72 67 34 0a 29 7b 0a 20 20 63 68 61 72  *zArg4.){.  char
59b0: 20 2a 7a 43 6f 64 65 3b 0a 20 20 54 63 6c 5f 44   *zCode;.  Tcl_D
59c0: 53 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 69 6e  String str;.  in
59d0: 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20 63 68  t rc;.  const ch
59e0: 61 72 20 2a 7a 52 65 70 6c 79 3b 0a 20 20 53 71  ar *zReply;.  Sq
59f0: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
5a00: 71 6c 69 74 65 44 62 2a 29 70 41 72 67 3b 0a 0a  qliteDb*)pArg;..
5a10: 20 20 73 77 69 74 63 68 28 20 63 6f 64 65 20 29    switch( code )
5a20: 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
5a30: 45 5f 43 4f 50 59 20 20 20 20 20 20 20 20 20 20  E_COPY          
5a40: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
5a50: 49 54 45 5f 43 4f 50 59 22 3b 20 62 72 65 61 6b  ITE_COPY"; break
5a60: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
5a70: 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 20 20  E_CREATE_INDEX  
5a80: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
5a90: 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58  ITE_CREATE_INDEX
5aa0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
5ab0: 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45  se SQLITE_CREATE
5ac0: 5f 54 41 42 4c 45 20 20 20 20 20 20 3a 20 7a 43  _TABLE      : zC
5ad0: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41  ode="SQLITE_CREA
5ae0: 54 45 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b  TE_TABLE"; break
5af0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
5b00: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e  E_CREATE_TEMP_IN
5b10: 44 45 58 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c  DEX : zCode="SQL
5b20: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
5b30: 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20  INDEX"; break;. 
5b40: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
5b50: 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45  REATE_TEMP_TABLE
5b60: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
5b70: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42  _CREATE_TEMP_TAB
5b80: 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  LE"; break;.    
5b90: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41  case SQLITE_CREA
5ba0: 54 45 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 3a  TE_TEMP_TRIGGER:
5bb0: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43   zCode="SQLITE_C
5bc0: 52 45 41 54 45 5f 54 45 4d 50 5f 54 52 49 47 47  REATE_TEMP_TRIGG
5bd0: 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  ER"; break;.    
5be0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41  case SQLITE_CREA
5bf0: 54 45 5f 54 45 4d 50 5f 56 49 45 57 20 20 3a 20  TE_TEMP_VIEW  : 
5c00: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52  zCode="SQLITE_CR
5c10: 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 22 3b  EATE_TEMP_VIEW";
5c20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
5c30: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
5c40: 52 49 47 47 45 52 20 20 20 20 3a 20 7a 43 6f 64  RIGGER    : zCod
5c50: 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45  e="SQLITE_CREATE
5c60: 5f 54 52 49 47 47 45 52 22 3b 20 62 72 65 61 6b  _TRIGGER"; break
5c70: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
5c80: 45 5f 43 52 45 41 54 45 5f 56 49 45 57 20 20 20  E_CREATE_VIEW   
5c90: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
5ca0: 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57 22  ITE_CREATE_VIEW"
5cb0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
5cc0: 65 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 20  e SQLITE_DELETE 
5cd0: 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f             : zCo
5ce0: 64 65 3d 22 53 51 4c 49 54 45 5f 44 45 4c 45 54  de="SQLITE_DELET
5cf0: 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  E"; break;.    c
5d00: 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  ase SQLITE_DROP_
5d10: 49 4e 44 45 58 20 20 20 20 20 20 20 20 3a 20 7a  INDEX        : z
5d20: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f  Code="SQLITE_DRO
5d30: 50 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b  P_INDEX"; break;
5d40: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
5d50: 5f 44 52 4f 50 5f 54 41 42 4c 45 20 20 20 20 20  _DROP_TABLE     
5d60: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
5d70: 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 22 3b 20  TE_DROP_TABLE"; 
5d80: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
5d90: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
5da0: 5f 49 4e 44 45 58 20 20 20 3a 20 7a 43 6f 64 65  _INDEX   : zCode
5db0: 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  ="SQLITE_DROP_TE
5dc0: 4d 50 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b  MP_INDEX"; break
5dd0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
5de0: 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c  E_DROP_TEMP_TABL
5df0: 45 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c  E   : zCode="SQL
5e00: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41  ITE_DROP_TEMP_TA
5e10: 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  BLE"; break;.   
5e20: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f   case SQLITE_DRO
5e30: 50 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 20 3a  P_TEMP_TRIGGER :
5e40: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44   zCode="SQLITE_D
5e50: 52 4f 50 5f 54 45 4d 50 5f 54 52 49 47 47 45 52  ROP_TEMP_TRIGGER
5e60: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
5e70: 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54  se SQLITE_DROP_T
5e80: 45 4d 50 5f 56 49 45 57 20 20 20 20 3a 20 7a 43  EMP_VIEW    : zC
5e90: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50  ode="SQLITE_DROP
5ea0: 5f 54 45 4d 50 5f 56 49 45 57 22 3b 20 62 72 65  _TEMP_VIEW"; bre
5eb0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
5ec0: 49 54 45 5f 44 52 4f 50 5f 54 52 49 47 47 45 52  ITE_DROP_TRIGGER
5ed0: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
5ee0: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 52 49 47 47  QLITE_DROP_TRIGG
5ef0: 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  ER"; break;.    
5f00: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50  case SQLITE_DROP
5f10: 5f 56 49 45 57 20 20 20 20 20 20 20 20 20 3a 20  _VIEW         : 
5f20: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52  zCode="SQLITE_DR
5f30: 4f 50 5f 56 49 45 57 22 3b 20 62 72 65 61 6b 3b  OP_VIEW"; break;
5f40: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
5f50: 5f 49 4e 53 45 52 54 20 20 20 20 20 20 20 20 20  _INSERT         
5f60: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
5f70: 54 45 5f 49 4e 53 45 52 54 22 3b 20 62 72 65 61  TE_INSERT"; brea
5f80: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
5f90: 54 45 5f 50 52 41 47 4d 41 20 20 20 20 20 20 20  TE_PRAGMA       
5fa0: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
5fb0: 4c 49 54 45 5f 50 52 41 47 4d 41 22 3b 20 62 72  LITE_PRAGMA"; br
5fc0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
5fd0: 4c 49 54 45 5f 52 45 41 44 20 20 20 20 20 20 20  LITE_READ       
5fe0: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
5ff0: 53 51 4c 49 54 45 5f 52 45 41 44 22 3b 20 62 72  SQLITE_READ"; br
6000: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
6010: 4c 49 54 45 5f 53 45 4c 45 43 54 20 20 20 20 20  LITE_SELECT     
6020: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
6030: 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 22 3b 20  SQLITE_SELECT"; 
6040: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
6050: 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49  SQLITE_TRANSACTI
6060: 4f 4e 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65  ON       : zCode
6070: 3d 22 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43  ="SQLITE_TRANSAC
6080: 54 49 4f 4e 22 3b 20 62 72 65 61 6b 3b 0a 20 20  TION"; break;.  
6090: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55 50    case SQLITE_UP
60a0: 44 41 54 45 20 20 20 20 20 20 20 20 20 20 20 20  DATE            
60b0: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
60c0: 55 50 44 41 54 45 22 3b 20 62 72 65 61 6b 3b 0a  UPDATE"; break;.
60d0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
60e0: 41 54 54 41 43 48 20 20 20 20 20 20 20 20 20 20  ATTACH          
60f0: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
6100: 45 5f 41 54 54 41 43 48 22 3b 20 62 72 65 61 6b  E_ATTACH"; break
6110: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
6120: 45 5f 44 45 54 41 43 48 20 20 20 20 20 20 20 20  E_DETACH        
6130: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
6140: 49 54 45 5f 44 45 54 41 43 48 22 3b 20 62 72 65  ITE_DETACH"; bre
6150: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
6160: 49 54 45 5f 41 4c 54 45 52 5f 54 41 42 4c 45 20  ITE_ALTER_TABLE 
6170: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
6180: 51 4c 49 54 45 5f 41 4c 54 45 52 5f 54 41 42 4c  QLITE_ALTER_TABL
6190: 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  E"; break;.    c
61a0: 61 73 65 20 53 51 4c 49 54 45 5f 52 45 49 4e 44  ase SQLITE_REIND
61b0: 45 58 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a  EX           : z
61c0: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 52 45 49  Code="SQLITE_REI
61d0: 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20  NDEX"; break;.  
61e0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 4e    case SQLITE_AN
61f0: 41 4c 59 5a 45 20 20 20 20 20 20 20 20 20 20 20  ALYZE           
6200: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
6210: 41 4e 41 4c 59 5a 45 22 3b 20 62 72 65 61 6b 3b  ANALYZE"; break;
6220: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
6230: 5f 43 52 45 41 54 45 5f 56 54 41 42 4c 45 20 20  _CREATE_VTABLE  
6240: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
6250: 54 45 5f 43 52 45 41 54 45 5f 56 54 41 42 4c 45  TE_CREATE_VTABLE
6260: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
6270: 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56  se SQLITE_DROP_V
6280: 54 41 42 4c 45 20 20 20 20 20 20 20 3a 20 7a 43  TABLE       : zC
6290: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50  ode="SQLITE_DROP
62a0: 5f 56 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b  _VTABLE"; break;
62b0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
62c0: 5f 46 55 4e 43 54 49 4f 4e 20 20 20 20 20 20 20  _FUNCTION       
62d0: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
62e0: 54 45 5f 46 55 4e 43 54 49 4f 4e 22 3b 20 62 72  TE_FUNCTION"; br
62f0: 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
6300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6310: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
6320: 3f 3f 3f 3f 22 3b 20 62 72 65 61 6b 3b 0a 20 20  ????"; break;.  
6330: 7d 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49  }.  Tcl_DStringI
6340: 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 54 63 6c  nit(&str);.  Tcl
6350: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26  _DStringAppend(&
6360: 73 74 72 2c 20 70 44 62 2d 3e 7a 41 75 74 68 2c  str, pDb->zAuth,
6370: 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72   -1);.  Tcl_DStr
6380: 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ingAppendElement
6390: 28 26 73 74 72 2c 20 7a 43 6f 64 65 29 3b 0a 20  (&str, zCode);. 
63a0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
63b0: 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20  ndElement(&str, 
63c0: 7a 41 72 67 31 20 3f 20 7a 41 72 67 31 20 3a 20  zArg1 ? zArg1 : 
63d0: 22 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  "");.  Tcl_DStri
63e0: 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  ngAppendElement(
63f0: 26 73 74 72 2c 20 7a 41 72 67 32 20 3f 20 7a 41  &str, zArg2 ? zA
6400: 72 67 32 20 3a 20 22 22 29 3b 0a 20 20 54 63 6c  rg2 : "");.  Tcl
6410: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c  _DStringAppendEl
6420: 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41 72 67  ement(&str, zArg
6430: 33 20 3f 20 7a 41 72 67 33 20 3a 20 22 22 29 3b  3 ? zArg3 : "");
6440: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70  .  Tcl_DStringAp
6450: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72  pendElement(&str
6460: 2c 20 7a 41 72 67 34 20 3f 20 7a 41 72 67 34 20  , zArg4 ? zArg4 
6470: 3a 20 22 22 29 3b 0a 20 20 72 63 20 3d 20 54 63  : "");.  rc = Tc
6480: 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 28 70 44 62  l_GlobalEval(pDb
6490: 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53  ->interp, Tcl_DS
64a0: 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29  tringValue(&str)
64b0: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
64c0: 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20 7a 52  Free(&str);.  zR
64d0: 65 70 6c 79 20 3d 20 54 63 6c 5f 47 65 74 53 74  eply = Tcl_GetSt
64e0: 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62 2d 3e  ringResult(pDb->
64f0: 69 6e 74 65 72 70 29 3b 0a 20 20 69 66 28 20 73  interp);.  if( s
6500: 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22 53 51  trcmp(zReply,"SQ
6510: 4c 49 54 45 5f 4f 4b 22 29 3d 3d 30 20 29 7b 0a  LITE_OK")==0 ){.
6520: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
6530: 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  OK;.  }else if( 
6540: 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22 53  strcmp(zReply,"S
6550: 51 4c 49 54 45 5f 44 45 4e 59 22 29 3d 3d 30 20  QLITE_DENY")==0 
6560: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
6570: 54 45 5f 44 45 4e 59 3b 0a 20 20 7d 65 6c 73 65  TE_DENY;.  }else
6580: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 52 65 70   if( strcmp(zRep
6590: 6c 79 2c 22 53 51 4c 49 54 45 5f 49 47 4e 4f 52  ly,"SQLITE_IGNOR
65a0: 45 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  E")==0 ){.    rc
65b0: 20 3d 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45   = SQLITE_IGNORE
65c0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
65d0: 63 20 3d 20 39 39 39 3b 0a 20 20 7d 0a 20 20 72  c = 999;.  }.  r
65e0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
65f0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
6600: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 20  T_AUTHORIZATION 
6610: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 7a 54 65 78 74 20  */../*.** zText 
6620: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
6630: 74 65 78 74 20 6f 62 74 61 69 6e 65 64 20 76 69  text obtained vi
6640: 61 20 61 6e 20 73 71 6c 69 74 65 33 5f 72 65 73  a an sqlite3_res
6650: 75 6c 74 5f 74 65 78 74 28 29 0a 2a 2a 20 6f 72  ult_text().** or
6660: 20 73 69 6d 69 6c 61 72 20 69 6e 74 65 72 66 61   similar interfa
6670: 63 65 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  ce. This routine
6680: 20 72 65 74 75 72 6e 73 20 61 20 54 63 6c 20 73   returns a Tcl s
6690: 74 72 69 6e 67 20 6f 62 6a 65 63 74 2c 20 0a 2a  tring object, .*
66a0: 2a 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  * reference coun
66b0: 74 20 73 65 74 20 74 6f 20 30 2c 20 63 6f 6e 74  t set to 0, cont
66c0: 61 69 6e 69 6e 67 20 74 68 65 20 74 65 78 74 2e  aining the text.
66d0: 20 49 66 20 61 20 74 72 61 6e 73 6c 61 74 69 6f   If a translatio
66e0: 6e 0a 2a 2a 20 62 65 74 77 65 65 6e 20 69 73 6f  n.** between iso
66f0: 38 38 35 39 20 61 6e 64 20 55 54 46 2d 38 20 69  8859 and UTF-8 i
6700: 73 20 72 65 71 75 69 72 65 64 2c 20 69 74 20 69  s required, it i
6710: 73 20 70 72 65 66 6f 72 6d 65 64 2e 0a 2a 2f 0a  s preformed..*/.
6720: 73 74 61 74 69 63 20 54 63 6c 5f 4f 62 6a 20 2a  static Tcl_Obj *
6730: 64 62 54 65 78 74 54 6f 4f 62 6a 28 63 68 61 72  dbTextToObj(char
6740: 20 63 6f 6e 73 74 20 2a 7a 54 65 78 74 29 7b 0a   const *zText){.
6750: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b    Tcl_Obj *pVal;
6760: 0a 23 69 66 64 65 66 20 55 54 46 5f 54 52 41 4e  .#ifdef UTF_TRAN
6770: 53 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 0a 20  SLATION_NEEDED. 
6780: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 43 6f   Tcl_DString dCo
6790: 6c 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  l;.  Tcl_DString
67a0: 49 6e 69 74 28 26 64 43 6f 6c 29 3b 0a 20 20 54  Init(&dCol);.  T
67b0: 63 6c 5f 45 78 74 65 72 6e 61 6c 54 6f 55 74 66  cl_ExternalToUtf
67c0: 44 53 74 72 69 6e 67 28 4e 55 4c 4c 2c 20 7a 54  DString(NULL, zT
67d0: 65 78 74 2c 20 2d 31 2c 20 26 64 43 6f 6c 29 3b  ext, -1, &dCol);
67e0: 0a 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65  .  pVal = Tcl_Ne
67f0: 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 44  wStringObj(Tcl_D
6800: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 64 43 6f  StringValue(&dCo
6810: 6c 29 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44  l), -1);.  Tcl_D
6820: 53 74 72 69 6e 67 46 72 65 65 28 26 64 43 6f 6c  StringFree(&dCol
6830: 29 3b 0a 23 65 6c 73 65 0a 20 20 70 56 61 6c 20  );.#else.  pVal 
6840: 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
6850: 62 6a 28 7a 54 65 78 74 2c 20 2d 31 29 3b 0a 23  bj(zText, -1);.#
6860: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 70  endif.  return p
6870: 56 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Val;.}../*.** Th
6880: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 61 64 73  is routine reads
6890: 20 61 20 6c 69 6e 65 20 6f 66 20 74 65 78 74 20   a line of text 
68a0: 66 72 6f 6d 20 46 49 4c 45 20 69 6e 2c 20 73 74  from FILE in, st
68b0: 6f 72 65 73 0a 2a 2a 20 74 68 65 20 74 65 78 74  ores.** the text
68c0: 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   in memory obtai
68d0: 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28  ned from malloc(
68e0: 29 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20  ) and returns a 
68f0: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
6900: 65 20 74 65 78 74 2e 20 20 4e 55 4c 4c 20 69 73  e text.  NULL is
6910: 20 72 65 74 75 72 6e 65 64 20 61 74 20 65 6e 64   returned at end
6920: 20 6f 66 20 66 69 6c 65 2c 20 6f 72 20 69 66 20   of file, or if 
6930: 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 66 61 69 6c  malloc().** fail
6940: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74  s..**.** The int
6950: 65 72 66 61 63 65 20 69 73 20 6c 69 6b 65 20 22  erface is like "
6960: 72 65 61 64 6c 69 6e 65 22 20 62 75 74 20 6e 6f  readline" but no
6970: 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 65 64   command-line ed
6980: 69 74 69 6e 67 0a 2a 2a 20 69 73 20 64 6f 6e 65  iting.** is done
6990: 2e 0a 2a 2a 0a 2a 2a 20 63 6f 70 69 65 64 20 66  ..**.** copied f
69a0: 72 6f 6d 20 73 68 65 6c 6c 2e 63 20 66 72 6f 6d  rom shell.c from
69b0: 20 27 2e 69 6d 70 6f 72 74 27 20 63 6f 6d 6d 61   '.import' comma
69c0: 6e 64 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  nd.*/.static cha
69d0: 72 20 2a 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65  r *local_getline
69e0: 28 63 68 61 72 20 2a 7a 50 72 6f 6d 70 74 2c 20  (char *zPrompt, 
69f0: 46 49 4c 45 20 2a 69 6e 29 7b 0a 20 20 63 68 61  FILE *in){.  cha
6a00: 72 20 2a 7a 4c 69 6e 65 3b 0a 20 20 69 6e 74 20  r *zLine;.  int 
6a10: 6e 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a  nLine;.  int n;.
6a20: 20 20 69 6e 74 20 65 6f 6c 3b 0a 0a 20 20 6e 4c    int eol;..  nL
6a30: 69 6e 65 20 3d 20 31 30 30 3b 0a 20 20 7a 4c 69  ine = 100;.  zLi
6a40: 6e 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 4c 69  ne = malloc( nLi
6a50: 6e 65 20 29 3b 0a 20 20 69 66 28 20 7a 4c 69 6e  ne );.  if( zLin
6a60: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  e==0 ) return 0;
6a70: 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 65 6f 6c 20  .  n = 0;.  eol 
6a80: 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 21 65  = 0;.  while( !e
6a90: 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 2b  ol ){.    if( n+
6aa0: 31 30 30 3e 6e 4c 69 6e 65 20 29 7b 0a 20 20 20  100>nLine ){.   
6ab0: 20 20 20 6e 4c 69 6e 65 20 3d 20 6e 4c 69 6e 65     nLine = nLine
6ac0: 2a 32 20 2b 20 31 30 30 3b 0a 20 20 20 20 20 20  *2 + 100;.      
6ad0: 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28  zLine = realloc(
6ae0: 7a 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29 3b 0a 20  zLine, nLine);. 
6af0: 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d       if( zLine==
6b00: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
6b10: 20 20 7d 0a 20 20 20 20 69 66 28 20 66 67 65 74    }.    if( fget
6b20: 73 28 26 7a 4c 69 6e 65 5b 6e 5d 2c 20 6e 4c 69  s(&zLine[n], nLi
6b30: 6e 65 20 2d 20 6e 2c 20 69 6e 29 3d 3d 30 20 29  ne - n, in)==0 )
6b40: 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30  {.      if( n==0
6b50: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65   ){.        free
6b60: 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20  (zLine);.       
6b70: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
6b80: 20 7d 0a 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6e   }.      zLine[n
6b90: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 65 6f 6c  ] = 0;.      eol
6ba0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61   = 1;.      brea
6bb0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69  k;.    }.    whi
6bc0: 6c 65 28 20 7a 4c 69 6e 65 5b 6e 5d 20 29 7b 20  le( zLine[n] ){ 
6bd0: 6e 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 6e  n++; }.    if( n
6be0: 3e 30 20 26 26 20 7a 4c 69 6e 65 5b 6e 2d 31 5d  >0 && zLine[n-1]
6bf0: 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20  =='\n' ){.      
6c00: 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a 4c 69 6e 65  n--;.      zLine
6c10: 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 65  [n] = 0;.      e
6c20: 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ol = 1;.    }.  
6c30: 7d 0a 20 20 7a 4c 69 6e 65 20 3d 20 72 65 61 6c  }.  zLine = real
6c40: 6c 6f 63 28 20 7a 4c 69 6e 65 2c 20 6e 2b 31 20  loc( zLine, n+1 
6c50: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4c 69 6e  );.  return zLin
6c60: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  e;.}../*.** The 
6c70: 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d 61 6e 64  "sqlite" command
6c80: 20 62 65 6c 6f 77 20 63 72 65 61 74 65 73 20 61   below creates a
6c90: 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d 61 6e 64   new Tcl command
6ca0: 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6e   for each.** con
6cb0: 6e 65 63 74 69 6f 6e 20 69 74 20 6f 70 65 6e 73  nection it opens
6cc0: 20 74 6f 20 61 6e 20 53 51 4c 69 74 65 20 64 61   to an SQLite da
6cd0: 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f  tabase.  This ro
6ce0: 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64  utine is invoked
6cf0: 0a 2a 2a 20 77 68 65 6e 65 76 65 72 20 6f 6e 65  .** whenever one
6d00: 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63   of those connec
6d10: 74 69 6f 6e 2d 73 70 65 63 69 66 69 63 20 63 6f  tion-specific co
6d20: 6d 6d 61 6e 64 73 20 69 73 20 65 78 65 63 75 74  mmands is execut
6d30: 65 64 0a 2a 2a 20 69 6e 20 54 63 6c 2e 20 20 46  ed.** in Tcl.  F
6d40: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 79  or example, if y
6d50: 6f 75 20 72 75 6e 20 54 63 6c 20 63 6f 64 65 20  ou run Tcl code 
6d60: 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
6d70: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 64         sqlite3 d
6d80: 62 31 20 20 22 6d 79 5f 64 61 74 61 62 61 73 65  b1  "my_database
6d90: 22 0a 2a 2a 20 20 20 20 20 20 20 64 62 31 20 63  ".**       db1 c
6da0: 6c 6f 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  lose.**.** The f
6db0: 69 72 73 74 20 63 6f 6d 6d 61 6e 64 20 6f 70 65  irst command ope
6dc0: 6e 73 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ns a connection 
6dd0: 74 6f 20 74 68 65 20 22 6d 79 5f 64 61 74 61 62  to the "my_datab
6de0: 61 73 65 22 20 64 61 74 61 62 61 73 65 0a 2a 2a  ase" database.**
6df0: 20 61 6e 64 20 63 61 6c 6c 73 20 74 68 61 74 20   and calls that 
6e00: 63 6f 6e 6e 65 63 74 69 6f 6e 20 22 64 62 31 22  connection "db1"
6e10: 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20 63 6f  .  The second co
6e20: 6d 6d 61 6e 64 20 63 61 75 73 65 73 20 74 68 69  mmand causes thi
6e30: 73 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 20  s.** subroutine 
6e40: 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 2e 0a 2a  to be invoked..*
6e50: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 4f  /.static int DbO
6e60: 62 6a 43 6d 64 28 76 6f 69 64 20 2a 63 64 2c 20  bjCmd(void *cd, 
6e70: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
6e80: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 54 63 6c  rp, int objc,Tcl
6e90: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76  _Obj *const*objv
6ea0: 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  ){.  SqliteDb *p
6eb0: 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29  Db = (SqliteDb*)
6ec0: 63 64 3b 0a 20 20 69 6e 74 20 63 68 6f 69 63 65  cd;.  int choice
6ed0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 54 43 4c  ;.  int rc = TCL
6ee0: 5f 4f 4b 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  _OK;.  static co
6ef0: 6e 73 74 20 63 68 61 72 20 2a 44 42 5f 73 74 72  nst char *DB_str
6f00: 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 61 75 74  s[] = {.    "aut
6f10: 68 6f 72 69 7a 65 72 22 2c 20 20 20 20 20 20 20  horizer",       
6f20: 20 20 22 62 75 73 79 22 2c 20 20 20 20 20 20 20    "busy",       
6f30: 20 20 20 20 20 20 20 22 63 61 63 68 65 22 2c 0a         "cache",.
6f40: 20 20 20 20 22 63 68 61 6e 67 65 73 22 2c 20 20      "changes",  
6f50: 20 20 20 20 20 20 20 20 20 20 22 63 6c 6f 73 65            "close
6f60: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ",             "
6f70: 63 6f 6c 6c 61 74 65 22 2c 0a 20 20 20 20 22 63  collate",.    "c
6f80: 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 22  ollation_needed"
6f90: 2c 20 20 20 22 63 6f 6d 6d 69 74 5f 68 6f 6f 6b  ,   "commit_hook
6fa0: 22 2c 20 20 20 20 20 20 20 22 63 6f 6d 70 6c 65  ",       "comple
6fb0: 74 65 22 2c 0a 20 20 20 20 22 63 6f 70 79 22 2c  te",.    "copy",
6fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
6fd0: 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65  enable_load_exte
6fe0: 6e 73 69 6f 6e 22 2c 22 65 72 72 6f 72 63 6f 64  nsion","errorcod
6ff0: 65 22 2c 0a 20 20 20 20 22 65 76 61 6c 22 2c 20  e",.    "eval", 
7000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 65                "e
7010: 78 69 73 74 73 22 2c 20 20 20 20 20 20 20 20 20  xists",         
7020: 20 20 20 22 66 75 6e 63 74 69 6f 6e 22 2c 0a 20     "function",. 
7030: 20 20 20 22 69 6e 63 72 62 6c 6f 62 22 2c 20 20     "incrblob",  
7040: 20 20 20 20 20 20 20 20 20 22 69 6e 74 65 72 72           "interr
7050: 75 70 74 22 2c 20 20 20 20 20 20 20 20 20 22 6c  upt",         "l
7060: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
7070: 22 2c 0a 20 20 20 20 22 6e 75 6c 6c 76 61 6c 75  ",.    "nullvalu
7080: 65 22 2c 20 20 20 20 20 20 20 20 20 20 22 6f 6e  e",          "on
7090: 65 63 6f 6c 75 6d 6e 22 2c 20 20 20 20 20 20 20  ecolumn",       
70a0: 20 20 22 70 72 6f 66 69 6c 65 22 2c 0a 20 20 20    "profile",.   
70b0: 20 22 70 72 6f 67 72 65 73 73 22 2c 20 20 20 20   "progress",    
70c0: 20 20 20 20 20 20 20 22 72 65 6b 65 79 22 2c 20         "rekey", 
70d0: 20 20 20 20 20 20 20 20 20 20 20 20 22 72 6f 6c              "rol
70e0: 6c 62 61 63 6b 5f 68 6f 6f 6b 22 2c 0a 20 20 20  lback_hook",.   
70f0: 20 22 74 69 6d 65 6f 75 74 22 2c 20 20 20 20 20   "timeout",     
7100: 20 20 20 20 20 20 20 22 74 6f 74 61 6c 5f 63 68         "total_ch
7110: 61 6e 67 65 73 22 2c 20 20 20 20 20 22 74 72 61  anges",     "tra
7120: 63 65 22 2c 0a 20 20 20 20 22 74 72 61 6e 73 61  ce",.    "transa
7130: 63 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 22  ction",        "
7140: 75 70 64 61 74 65 5f 68 6f 6f 6b 22 2c 20 20 20  update_hook",   
7150: 20 20 20 20 22 76 65 72 73 69 6f 6e 22 2c 0a 20      "version",. 
7160: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
7170: 20 20 20 20 20 20 20 20 0a 20 20 7d 3b 0a 20 20          .  };.  
7180: 65 6e 75 6d 20 44 42 5f 65 6e 75 6d 20 7b 0a 20  enum DB_enum {. 
7190: 20 20 20 44 42 5f 41 55 54 48 4f 52 49 5a 45 52     DB_AUTHORIZER
71a0: 2c 20 20 20 20 20 20 20 20 44 42 5f 42 55 53 59  ,        DB_BUSY
71b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 44 42  ,             DB
71c0: 5f 43 41 43 48 45 2c 0a 20 20 20 20 44 42 5f 43  _CACHE,.    DB_C
71d0: 48 41 4e 47 45 53 2c 20 20 20 20 20 20 20 20 20  HANGES,         
71e0: 20 20 44 42 5f 43 4c 4f 53 45 2c 20 20 20 20 20    DB_CLOSE,     
71f0: 20 20 20 20 20 20 20 44 42 5f 43 4f 4c 4c 41 54         DB_COLLAT
7200: 45 2c 0a 20 20 20 20 44 42 5f 43 4f 4c 4c 41 54  E,.    DB_COLLAT
7210: 49 4f 4e 5f 4e 45 45 44 45 44 2c 20 20 44 42 5f  ION_NEEDED,  DB_
7220: 43 4f 4d 4d 49 54 5f 48 4f 4f 4b 2c 20 20 20 20  COMMIT_HOOK,    
7230: 20 20 44 42 5f 43 4f 4d 50 4c 45 54 45 2c 0a 20    DB_COMPLETE,. 
7240: 20 20 20 44 42 5f 43 4f 50 59 2c 20 20 20 20 20     DB_COPY,     
7250: 20 20 20 20 20 20 20 20 20 44 42 5f 45 4e 41 42           DB_ENAB
7260: 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  LE_LOAD_EXTENSIO
7270: 4e 2c 44 42 5f 45 52 52 4f 52 43 4f 44 45 2c 0a  N,DB_ERRORCODE,.
7280: 20 20 20 20 44 42 5f 45 56 41 4c 2c 20 20 20 20      DB_EVAL,    
7290: 20 20 20 20 20 20 20 20 20 20 44 42 5f 45 58 49            DB_EXI
72a0: 53 54 53 2c 20 20 20 20 20 20 20 20 20 20 20 44  STS,           D
72b0: 42 5f 46 55 4e 43 54 49 4f 4e 2c 0a 20 20 20 20  B_FUNCTION,.    
72c0: 44 42 5f 49 4e 43 52 42 4c 4f 42 2c 20 20 20 20  DB_INCRBLOB,    
72d0: 20 20 20 20 20 20 44 42 5f 49 4e 54 45 52 52 55        DB_INTERRU
72e0: 50 54 2c 20 20 20 20 20 20 20 20 44 42 5f 4c 41  PT,        DB_LA
72f0: 53 54 5f 49 4e 53 45 52 54 5f 52 4f 57 49 44 2c  ST_INSERT_ROWID,
7300: 0a 20 20 20 20 44 42 5f 4e 55 4c 4c 56 41 4c 55  .    DB_NULLVALU
7310: 45 2c 20 20 20 20 20 20 20 20 20 44 42 5f 4f 4e  E,         DB_ON
7320: 45 43 4f 4c 55 4d 4e 2c 20 20 20 20 20 20 20 20  ECOLUMN,        
7330: 44 42 5f 50 52 4f 46 49 4c 45 2c 0a 20 20 20 20  DB_PROFILE,.    
7340: 44 42 5f 50 52 4f 47 52 45 53 53 2c 20 20 20 20  DB_PROGRESS,    
7350: 20 20 20 20 20 20 44 42 5f 52 45 4b 45 59 2c 20        DB_REKEY, 
7360: 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 52 4f             DB_RO
7370: 4c 4c 42 41 43 4b 5f 48 4f 4f 4b 2c 0a 20 20 20  LLBACK_HOOK,.   
7380: 20 44 42 5f 54 49 4d 45 4f 55 54 2c 20 20 20 20   DB_TIMEOUT,    
7390: 20 20 20 20 20 20 20 44 42 5f 54 4f 54 41 4c 5f         DB_TOTAL_
73a0: 43 48 41 4e 47 45 53 2c 20 20 20 20 44 42 5f 54  CHANGES,    DB_T
73b0: 52 41 43 45 2c 0a 20 20 20 20 44 42 5f 54 52 41  RACE,.    DB_TRA
73c0: 4e 53 41 43 54 49 4f 4e 2c 20 20 20 20 20 20 20  NSACTION,       
73d0: 44 42 5f 55 50 44 41 54 45 5f 48 4f 4f 4b 2c 20  DB_UPDATE_HOOK, 
73e0: 20 20 20 20 20 44 42 5f 56 45 52 53 49 4f 4e 0a       DB_VERSION.
73f0: 20 20 7d 3b 0a 20 20 2f 2a 20 64 6f 6e 27 74 20    };.  /* don't 
7400: 6c 65 61 76 65 20 74 72 61 69 6c 69 6e 67 20 63  leave trailing c
7410: 6f 6d 6d 61 73 20 6f 6e 20 44 42 5f 65 6e 75 6d  ommas on DB_enum
7420: 2c 20 69 74 20 63 6f 6e 66 75 73 65 73 20 74 68  , it confuses th
7430: 65 20 41 49 58 20 78 6c 63 20 63 6f 6d 70 69 6c  e AIX xlc compil
7440: 65 72 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a  er */..  if( obj
7450: 63 3c 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  c<2 ){.    Tcl_W
7460: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
7470: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 55  rp, 1, objv, "SU
7480: 42 43 4f 4d 4d 41 4e 44 20 2e 2e 2e 22 29 3b 0a  BCOMMAND ...");.
7490: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
74a0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
74b0: 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d  Tcl_GetIndexFrom
74c0: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
74d0: 5b 31 5d 2c 20 44 42 5f 73 74 72 73 2c 20 22 6f  [1], DB_strs, "o
74e0: 70 74 69 6f 6e 22 2c 20 30 2c 20 26 63 68 6f 69  ption", 0, &choi
74f0: 63 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ce) ){.    retur
7500: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
7510: 0a 0a 20 20 73 77 69 74 63 68 28 20 28 65 6e 75  ..  switch( (enu
7520: 6d 20 44 42 5f 65 6e 75 6d 29 63 68 6f 69 63 65  m DB_enum)choice
7530: 20 29 7b 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62   ){..  /*    $db
7540: 20 61 75 74 68 6f 72 69 7a 65 72 20 3f 43 41 4c   authorizer ?CAL
7550: 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a  LBACK?.  **.  **
7560: 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65   Invoke the give
7570: 6e 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61 75  n callback to au
7580: 74 68 6f 72 69 7a 65 20 65 61 63 68 20 53 51 4c  thorize each SQL
7590: 20 6f 70 65 72 61 74 69 6f 6e 20 61 73 20 69 74   operation as it
75a0: 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 69 6c 65   is.  ** compile
75b0: 64 2e 20 20 35 20 61 72 67 75 6d 65 6e 74 73 20  d.  5 arguments 
75c0: 61 72 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20  are appended to 
75d0: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 62 65 66  the callback bef
75e0: 6f 72 65 20 69 74 20 69 73 0a 20 20 2a 2a 20 69  ore it is.  ** i
75f0: 6e 76 6f 6b 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  nvoked:.  **.  *
7600: 2a 20 20 20 28 31 29 20 54 68 65 20 61 75 74 68  *   (1) The auth
7610: 6f 72 69 7a 61 74 69 6f 6e 20 74 79 70 65 20 28  orization type (
7620: 65 78 3a 20 53 51 4c 49 54 45 5f 43 52 45 41 54  ex: SQLITE_CREAT
7630: 45 5f 54 41 42 4c 45 2c 20 53 51 4c 49 54 45 5f  E_TABLE, SQLITE_
7640: 49 4e 53 45 52 54 2c 20 2e 2e 2e 29 0a 20 20 2a  INSERT, ...).  *
7650: 2a 20 20 20 28 32 29 20 46 69 72 73 74 20 64 65  *   (2) First de
7660: 73 63 72 69 70 74 69 76 65 20 6e 61 6d 65 20 28  scriptive name (
7670: 64 65 70 65 6e 64 73 20 6f 6e 20 61 75 74 68 6f  depends on autho
7680: 72 69 7a 61 74 69 6f 6e 20 74 79 70 65 29 0a 20  rization type). 
7690: 20 2a 2a 20 20 20 28 33 29 20 53 65 63 6f 6e 64   **   (3) Second
76a0: 20 64 65 73 63 72 69 70 74 69 76 65 20 6e 61 6d   descriptive nam
76b0: 65 0a 20 20 2a 2a 20 20 20 28 34 29 20 4e 61 6d  e.  **   (4) Nam
76c0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
76d0: 65 20 28 65 78 3a 20 22 6d 61 69 6e 22 2c 20 22  e (ex: "main", "
76e0: 74 65 6d 70 22 29 0a 20 20 2a 2a 20 20 20 28 35  temp").  **   (5
76f0: 29 20 4e 61 6d 65 20 6f 66 20 74 72 69 67 67 65  ) Name of trigge
7700: 72 20 74 68 61 74 20 69 73 20 64 6f 69 6e 67 20  r that is doing 
7710: 74 68 65 20 61 63 63 65 73 73 0a 20 20 2a 2a 0a  the access.  **.
7720: 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61 63    ** The callbac
7730: 6b 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20  k should return 
7740: 6f 6e 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  on of the follow
7750: 69 6e 67 20 73 74 72 69 6e 67 73 3a 20 53 51 4c  ing strings: SQL
7760: 49 54 45 5f 4f 4b 2c 0a 20 20 2a 2a 20 53 51 4c  ITE_OK,.  ** SQL
7770: 49 54 45 5f 49 47 4e 4f 52 45 2c 20 6f 72 20 53  ITE_IGNORE, or S
7780: 51 4c 49 54 45 5f 44 45 4e 59 2e 20 20 41 6e 79  QLITE_DENY.  Any
7790: 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76 61   other return va
77a0: 6c 75 65 20 69 73 20 61 6e 20 65 72 72 6f 72 2e  lue is an error.
77b0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
77c0: 69 73 20 6d 65 74 68 6f 64 20 69 73 20 69 6e 76  is method is inv
77d0: 6f 6b 65 64 20 77 69 74 68 20 6e 6f 20 61 72 67  oked with no arg
77e0: 75 6d 65 6e 74 73 2c 20 74 68 65 20 63 75 72 72  uments, the curr
77f0: 65 6e 74 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  ent authorizatio
7800: 6e 0a 20 20 2a 2a 20 63 61 6c 6c 62 61 63 6b 20  n.  ** callback 
7810: 73 74 72 69 6e 67 20 69 73 20 72 65 74 75 72 6e  string is return
7820: 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ed..  */.  case 
7830: 44 42 5f 41 55 54 48 4f 52 49 5a 45 52 3a 20 7b  DB_AUTHORIZER: {
7840: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
7850: 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
7860: 4e 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  N.    Tcl_Append
7870: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
7880: 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 6e 6f  authorization no
7890: 74 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74  t available in t
78a0: 68 69 73 20 62 75 69 6c 64 22 2c 20 30 29 3b 0a  his build", 0);.
78b0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
78c0: 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 20 20  RROR;.#else.    
78d0: 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20  if( objc>3 ){.  
78e0: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
78f0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
7900: 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b  objv, "?CALLBACK
7910: 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ?");.      retur
7920: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
7930: 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d   }else if( objc=
7940: 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =2 ){.      if( 
7950: 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20  pDb->zAuth ){.  
7960: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
7970: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
7980: 44 62 2d 3e 7a 41 75 74 68 2c 20 30 29 3b 0a 20  Db->zAuth, 0);. 
7990: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
79a0: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 41  {.      char *zA
79b0: 75 74 68 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c  uth;.      int l
79c0: 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44  en;.      if( pD
79d0: 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20  b->zAuth ){.    
79e0: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
79f0: 2d 3e 7a 41 75 74 68 29 3b 0a 20 20 20 20 20 20  ->zAuth);.      
7a00: 7d 0a 20 20 20 20 20 20 7a 41 75 74 68 20 3d 20  }.      zAuth = 
7a10: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
7a20: 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c  mObj(objv[2], &l
7a30: 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  en);.      if( z
7a40: 41 75 74 68 20 26 26 20 6c 65 6e 3e 30 20 29 7b  Auth && len>0 ){
7a50: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 41  .        pDb->zA
7a60: 75 74 68 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28  uth = Tcl_Alloc(
7a70: 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20   len + 1 );.    
7a80: 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e      memcpy(pDb->
7a90: 7a 41 75 74 68 2c 20 7a 41 75 74 68 2c 20 6c 65  zAuth, zAuth, le
7aa0: 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  n+1);.      }els
7ab0: 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  e{.        pDb->
7ac0: 7a 41 75 74 68 20 3d 20 30 3b 0a 20 20 20 20 20  zAuth = 0;.     
7ad0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44 62   }.      if( pDb
7ae0: 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 20  ->zAuth ){.     
7af0: 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d     pDb->interp =
7b00: 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20   interp;.       
7b10: 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 74   sqlite3_set_aut
7b20: 68 6f 72 69 7a 65 72 28 70 44 62 2d 3e 64 62 2c  horizer(pDb->db,
7b30: 20 61 75 74 68 5f 63 61 6c 6c 62 61 63 6b 2c 20   auth_callback, 
7b40: 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  pDb);.      }els
7b50: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
7b60: 65 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65  e3_set_authorize
7b70: 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29  r(pDb->db, 0, 0)
7b80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
7b90: 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b  #endif.    break
7ba0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24  ;.  }..  /*    $
7bb0: 64 62 20 62 75 73 79 20 3f 43 41 4c 4c 42 41 43  db busy ?CALLBAC
7bc0: 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76  K?.  **.  ** Inv
7bd0: 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63 61  oke the given ca
7be0: 6c 6c 62 61 63 6b 20 69 66 20 61 6e 20 53 51 4c  llback if an SQL
7bf0: 20 73 74 61 74 65 6d 65 6e 74 20 61 74 74 65 6d   statement attem
7c00: 70 74 73 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a  pts to open.  **
7c10: 20 61 20 6c 6f 63 6b 65 64 20 64 61 74 61 62 61   a locked databa
7c20: 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  se file..  */.  
7c30: 63 61 73 65 20 44 42 5f 42 55 53 59 3a 20 7b 0a  case DB_BUSY: {.
7c40: 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29      if( objc>3 )
7c50: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
7c60: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
7c70: 20 32 2c 20 6f 62 6a 76 2c 20 22 43 41 4c 4c 42   2, objv, "CALLB
7c80: 41 43 4b 22 29 3b 0a 20 20 20 20 20 20 72 65 74  ACK");.      ret
7c90: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
7ca0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a     }else if( obj
7cb0: 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66  c==2 ){.      if
7cc0: 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a  ( pDb->zBusy ){.
7cd0: 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
7ce0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
7cf0: 20 70 44 62 2d 3e 7a 42 75 73 79 2c 20 30 29 3b   pDb->zBusy, 0);
7d00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
7d10: 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  se{.      char *
7d20: 7a 42 75 73 79 3b 0a 20 20 20 20 20 20 69 6e 74  zBusy;.      int
7d30: 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20   len;.      if( 
7d40: 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20  pDb->zBusy ){.  
7d50: 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70        Tcl_Free(p
7d60: 44 62 2d 3e 7a 42 75 73 79 29 3b 0a 20 20 20 20  Db->zBusy);.    
7d70: 20 20 7d 0a 20 20 20 20 20 20 7a 42 75 73 79 20    }.      zBusy 
7d80: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
7d90: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
7da0: 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  &len);.      if(
7db0: 20 7a 42 75 73 79 20 26 26 20 6c 65 6e 3e 30 20   zBusy && len>0 
7dc0: 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
7dd0: 7a 42 75 73 79 20 3d 20 54 63 6c 5f 41 6c 6c 6f  zBusy = Tcl_Allo
7de0: 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20  c( len + 1 );.  
7df0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62        memcpy(pDb
7e00: 2d 3e 7a 42 75 73 79 2c 20 7a 42 75 73 79 2c 20  ->zBusy, zBusy, 
7e10: 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65  len+1);.      }e
7e20: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62  lse{.        pDb
7e30: 2d 3e 7a 42 75 73 79 20 3d 20 30 3b 0a 20 20 20  ->zBusy = 0;.   
7e40: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
7e50: 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20  Db->zBusy ){.   
7e60: 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70       pDb->interp
7e70: 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20   = interp;.     
7e80: 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f     sqlite3_busy_
7e90: 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c  handler(pDb->db,
7ea0: 20 44 62 42 75 73 79 48 61 6e 64 6c 65 72 2c 20   DbBusyHandler, 
7eb0: 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  pDb);.      }els
7ec0: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
7ed0: 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28  e3_busy_handler(
7ee0: 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a  pDb->db, 0, 0);.
7ef0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
7f00: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
7f10: 2f 2a 20 20 20 20 20 24 64 62 20 63 61 63 68 65  /*     $db cache
7f20: 20 66 6c 75 73 68 0a 20 20 2a 2a 20 20 20 20 20   flush.  **     
7f30: 24 64 62 20 63 61 63 68 65 20 73 69 7a 65 20 6e  $db cache size n
7f40: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6c 75 73 68  .  **.  ** Flush
7f50: 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
7f60: 61 74 65 6d 65 6e 74 20 63 61 63 68 65 2c 20 6f  atement cache, o
7f70: 72 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75  r set the maximu
7f80: 6d 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a  m number of.  **
7f90: 20 63 61 63 68 65 64 20 73 74 61 74 65 6d 65 6e   cached statemen
7fa0: 74 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ts..  */.  case 
7fb0: 44 42 5f 43 41 43 48 45 3a 20 7b 0a 20 20 20 20  DB_CACHE: {.    
7fc0: 63 68 61 72 20 2a 73 75 62 43 6d 64 3b 0a 20 20  char *subCmd;.  
7fd0: 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 20 20 69 66    int n;..    if
7fe0: 28 20 6f 62 6a 63 3c 3d 32 20 29 7b 0a 20 20 20  ( objc<=2 ){.   
7ff0: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
8000: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
8010: 62 6a 76 2c 20 22 63 61 63 68 65 20 6f 70 74 69  bjv, "cache opti
8020: 6f 6e 20 3f 61 72 67 3f 22 29 3b 0a 20 20 20 20  on ?arg?");.    
8030: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
8040: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 75  OR;.    }.    su
8050: 62 43 6d 64 20 3d 20 54 63 6c 5f 47 65 74 53 74  bCmd = Tcl_GetSt
8060: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 20 6f 62 6a  ringFromObj( obj
8070: 76 5b 32 5d 2c 20 30 20 29 3b 0a 20 20 20 20 69  v[2], 0 );.    i
8080: 66 28 20 2a 73 75 62 43 6d 64 3d 3d 27 66 27 20  f( *subCmd=='f' 
8090: 26 26 20 73 74 72 63 6d 70 28 73 75 62 43 6d 64  && strcmp(subCmd
80a0: 2c 22 66 6c 75 73 68 22 29 3d 3d 30 20 29 7b 0a  ,"flush")==0 ){.
80b0: 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d        if( objc!=
80c0: 33 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  3 ){.        Tcl
80d0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
80e0: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
80f0: 66 6c 75 73 68 22 29 3b 0a 20 20 20 20 20 20 20  flush");.       
8100: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
8110: 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  R;.      }else{.
8120: 20 20 20 20 20 20 20 20 66 6c 75 73 68 53 74 6d          flushStm
8130: 74 43 61 63 68 65 28 20 70 44 62 20 29 3b 0a 20  tCache( pDb );. 
8140: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
8150: 20 69 66 28 20 2a 73 75 62 43 6d 64 3d 3d 27 73   if( *subCmd=='s
8160: 27 20 26 26 20 73 74 72 63 6d 70 28 73 75 62 43  ' && strcmp(subC
8170: 6d 64 2c 22 73 69 7a 65 22 29 3d 3d 30 20 29 7b  md,"size")==0 ){
8180: 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21  .      if( objc!
8190: 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  =4 ){.        Tc
81a0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
81b0: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
81c0: 22 73 69 7a 65 20 6e 22 29 3b 0a 20 20 20 20 20  "size n");.     
81d0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
81e0: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ROR;.      }else
81f0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 54 43  {.        if( TC
8200: 4c 5f 45 52 52 4f 52 3d 3d 54 63 6c 5f 47 65 74  L_ERROR==Tcl_Get
8210: 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
8220: 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 29 20  p, objv[3], &n) 
8230: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  ){.          Tcl
8240: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 20 69  _AppendResult( i
8250: 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74 20 63  nterp, "cannot c
8260: 6f 6e 76 65 72 74 20 5c 22 22 2c 20 0a 20 20 20  onvert \"", .   
8270: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
8280: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
8290: 28 6f 62 6a 76 5b 33 5d 2c 30 29 2c 20 22 5c 22  (objv[3],0), "\"
82a0: 20 74 6f 20 69 6e 74 65 67 65 72 22 2c 20 30 29   to integer", 0)
82b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
82c0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
82d0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
82e0: 20 20 20 20 20 20 20 69 66 28 20 6e 3c 30 20 29         if( n<0 )
82f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6c  {.            fl
8300: 75 73 68 53 74 6d 74 43 61 63 68 65 28 20 70 44  ushStmtCache( pD
8310: 62 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  b );.           
8320: 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   n = 0;.        
8330: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3e 4d 41    }else if( n>MA
8340: 58 5f 50 52 45 50 41 52 45 44 5f 53 54 4d 54 53  X_PREPARED_STMTS
8350: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
8360: 6e 20 3d 20 4d 41 58 5f 50 52 45 50 41 52 45 44  n = MAX_PREPARED
8370: 5f 53 54 4d 54 53 3b 0a 20 20 20 20 20 20 20 20  _STMTS;.        
8380: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 44    }.          pD
8390: 62 2d 3e 6d 61 78 53 74 6d 74 20 3d 20 6e 3b 0a  b->maxStmt = n;.
83a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
83b0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
83c0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
83d0: 75 6c 74 28 20 69 6e 74 65 72 70 2c 20 22 62 61  ult( interp, "ba
83e0: 64 20 6f 70 74 69 6f 6e 20 5c 22 22 2c 20 0a 20  d option \"", . 
83f0: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74           Tcl_Get
8400: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
8410: 6a 76 5b 30 5d 2c 30 29 2c 20 22 5c 22 3a 20 6d  jv[0],0), "\": m
8420: 75 73 74 20 62 65 20 66 6c 75 73 68 20 6f 72 20  ust be flush or 
8430: 73 69 7a 65 22 2c 20 30 29 3b 0a 20 20 20 20 20  size", 0);.     
8440: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
8450: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  R;.    }.    bre
8460: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
8470: 20 20 24 64 62 20 63 68 61 6e 67 65 73 0a 20 20    $db changes.  
8480: 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74  **.  ** Return t
8490: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
84a0: 73 20 74 68 61 74 20 77 65 72 65 20 6d 6f 64 69  s that were modi
84b0: 66 69 65 64 2c 20 69 6e 73 65 72 74 65 64 2c 20  fied, inserted, 
84c0: 6f 72 20 64 65 6c 65 74 65 64 20 62 79 0a 20 20  or deleted by.  
84d0: 2a 2a 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  ** the most rece
84e0: 6e 74 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54  nt INSERT, UPDAT
84f0: 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74  E or DELETE stat
8500: 65 6d 65 6e 74 2c 20 6e 6f 74 20 69 6e 63 6c 75  ement, not inclu
8510: 64 69 6e 67 20 0a 20 20 2a 2a 20 61 6e 79 20 63  ding .  ** any c
8520: 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74  hanges made by t
8530: 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e  rigger programs.
8540: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
8550: 43 48 41 4e 47 45 53 3a 20 7b 0a 20 20 20 20 54  CHANGES: {.    T
8560: 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b  cl_Obj *pResult;
8570: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  .    if( objc!=2
8580: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
8590: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
85a0: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22 29 3b  p, 2, objv, "");
85b0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
85c0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
85d0: 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c     pResult = Tcl
85e0: 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _GetObjResult(in
85f0: 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53  terp);.    Tcl_S
8600: 65 74 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74  etIntObj(pResult
8610: 2c 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65  , sqlite3_change
8620: 73 28 70 44 62 2d 3e 64 62 29 29 3b 0a 20 20 20  s(pDb->db));.   
8630: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
8640: 2a 20 20 20 20 24 64 62 20 63 6c 6f 73 65 0a 20  *    $db close. 
8650: 20 2a 2a 0a 20 20 2a 2a 20 53 68 75 74 64 6f 77   **.  ** Shutdow
8660: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  n the database. 
8670: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4c   */.  case DB_CL
8680: 4f 53 45 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 44  OSE: {.    Tcl_D
8690: 65 6c 65 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74  eleteCommand(int
86a0: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
86b0: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
86c0: 5d 2c 20 30 29 29 3b 0a 20 20 20 20 62 72 65 61  ], 0));.    brea
86d0: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
86e0: 2a 20 20 20 20 20 24 64 62 20 63 6f 6c 6c 61 74  *     $db collat
86f0: 65 20 4e 41 4d 45 20 53 43 52 49 50 54 0a 20 20  e NAME SCRIPT.  
8700: 2a 2a 0a 20 20 2a 2a 20 43 72 65 61 74 65 20 61  **.  ** Create a
8710: 20 6e 65 77 20 53 51 4c 20 63 6f 6c 6c 61 74 69   new SQL collati
8720: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  on function call
8730: 65 64 20 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76  ed NAME.  Whenev
8740: 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 66 75 6e  er.  ** that fun
8750: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
8760: 20 69 6e 76 6f 6b 65 20 53 43 52 49 50 54 20 74   invoke SCRIPT t
8770: 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 66  o evaluate the f
8780: 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  unction..  */.  
8790: 63 61 73 65 20 44 42 5f 43 4f 4c 4c 41 54 45 3a  case DB_COLLATE:
87a0: 20 7b 0a 20 20 20 20 53 71 6c 43 6f 6c 6c 61 74   {.    SqlCollat
87b0: 65 20 2a 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20  e *pCollate;.   
87c0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
87d0: 20 20 63 68 61 72 20 2a 7a 53 63 72 69 70 74 3b    char *zScript;
87e0: 0a 20 20 20 20 69 6e 74 20 6e 53 63 72 69 70 74  .    int nScript
87f0: 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
8800: 34 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  4 ){.      Tcl_W
8810: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
8820: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 41  rp, 2, objv, "NA
8830: 4d 45 20 53 43 52 49 50 54 22 29 3b 0a 20 20 20  ME SCRIPT");.   
8840: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
8850: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  ROR;.    }.    z
8860: 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  Name = Tcl_GetSt
8870: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
8880: 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20 7a 53 63  [2], 0);.    zSc
8890: 72 69 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74  ript = Tcl_GetSt
88a0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
88b0: 5b 33 5d 2c 20 26 6e 53 63 72 69 70 74 29 3b 0a  [3], &nScript);.
88c0: 20 20 20 20 70 43 6f 6c 6c 61 74 65 20 3d 20 28      pCollate = (
88d0: 53 71 6c 43 6f 6c 6c 61 74 65 2a 29 54 63 6c 5f  SqlCollate*)Tcl_
88e0: 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  Alloc( sizeof(*p
88f0: 43 6f 6c 6c 61 74 65 29 20 2b 20 6e 53 63 72 69  Collate) + nScri
8900: 70 74 20 2b 20 31 20 29 3b 0a 20 20 20 20 69 66  pt + 1 );.    if
8910: 28 20 70 43 6f 6c 6c 61 74 65 3d 3d 30 20 29 20  ( pCollate==0 ) 
8920: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
8930: 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e  ;.    pCollate->
8940: 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b  interp = interp;
8950: 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 70  .    pCollate->p
8960: 4e 65 78 74 20 3d 20 70 44 62 2d 3e 70 43 6f 6c  Next = pDb->pCol
8970: 6c 61 74 65 3b 0a 20 20 20 20 70 43 6f 6c 6c 61  late;.    pColla
8980: 74 65 2d 3e 7a 53 63 72 69 70 74 20 3d 20 28 63  te->zScript = (c
8990: 68 61 72 2a 29 26 70 43 6f 6c 6c 61 74 65 5b 31  har*)&pCollate[1
89a0: 5d 3b 0a 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c  ];.    pDb->pCol
89b0: 6c 61 74 65 20 3d 20 70 43 6f 6c 6c 61 74 65 3b  late = pCollate;
89c0: 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 43 6f 6c  .    memcpy(pCol
89d0: 6c 61 74 65 2d 3e 7a 53 63 72 69 70 74 2c 20 7a  late->zScript, z
89e0: 53 63 72 69 70 74 2c 20 6e 53 63 72 69 70 74 2b  Script, nScript+
89f0: 31 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  1);.    if( sqli
8a00: 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
8a10: 74 69 6f 6e 28 70 44 62 2d 3e 64 62 2c 20 7a 4e  tion(pDb->db, zN
8a20: 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  ame, SQLITE_UTF8
8a30: 2c 20 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  , .        pColl
8a40: 61 74 65 2c 20 74 63 6c 53 71 6c 43 6f 6c 6c 61  ate, tclSqlColla
8a50: 74 65 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  te) ){.      Tcl
8a60: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
8a70: 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74  p, (char *)sqlit
8a80: 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64  e3_errmsg(pDb->d
8a90: 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45  b), TCL_VOLATILE
8aa0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
8ab0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
8ac0: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
8ad0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24  .  /*.  **     $
8ae0: 64 62 20 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65  db collation_nee
8af0: 64 65 64 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a  ded SCRIPT.  **.
8b00: 20 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65    ** Create a ne
8b10: 77 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20  w SQL collation 
8b20: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20  function called 
8b30: 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76 65 72 0a  NAME.  Whenever.
8b40: 20 20 2a 2a 20 74 68 61 74 20 66 75 6e 63 74 69    ** that functi
8b50: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 6e  on is called, in
8b60: 76 6f 6b 65 20 53 43 52 49 50 54 20 74 6f 20 65  voke SCRIPT to e
8b70: 76 61 6c 75 61 74 65 20 74 68 65 20 66 75 6e 63  valuate the func
8b80: 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  tion..  */.  cas
8b90: 65 20 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e  e DB_COLLATION_N
8ba0: 45 45 44 45 44 3a 20 7b 0a 20 20 20 20 69 66 28  EEDED: {.    if(
8bb0: 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
8bc0: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
8bd0: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
8be0: 6a 76 2c 20 22 53 43 52 49 50 54 22 29 3b 0a 20  jv, "SCRIPT");. 
8bf0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
8c00: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
8c10: 20 69 66 28 20 70 44 62 2d 3e 70 43 6f 6c 6c 61   if( pDb->pColla
8c20: 74 65 4e 65 65 64 65 64 20 29 7b 0a 20 20 20 20  teNeeded ){.    
8c30: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
8c40: 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65  nt(pDb->pCollate
8c50: 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 7d 0a 20  Needed);.    }. 
8c60: 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65     pDb->pCollate
8c70: 4e 65 65 64 65 64 20 3d 20 54 63 6c 5f 44 75 70  Needed = Tcl_Dup
8c80: 6c 69 63 61 74 65 4f 62 6a 28 6f 62 6a 76 5b 32  licateObj(objv[2
8c90: 5d 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72  ]);.    Tcl_Incr
8ca0: 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 43  RefCount(pDb->pC
8cb0: 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20  ollateNeeded);. 
8cc0: 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61     sqlite3_colla
8cd0: 74 69 6f 6e 5f 6e 65 65 64 65 64 28 70 44 62 2d  tion_needed(pDb-
8ce0: 3e 64 62 2c 20 70 44 62 2c 20 74 63 6c 43 6f 6c  >db, pDb, tclCol
8cf0: 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 20  lateNeeded);.   
8d00: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
8d10: 2a 20 20 20 20 24 64 62 20 63 6f 6d 6d 69 74 5f  *    $db commit_
8d20: 68 6f 6f 6b 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a  hook ?CALLBACK?.
8d30: 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65    **.  ** Invoke
8d40: 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62   the given callb
8d50: 61 63 6b 20 6a 75 73 74 20 62 65 66 6f 72 65 20  ack just before 
8d60: 63 6f 6d 6d 69 74 74 69 6e 67 20 65 76 65 72 79  committing every
8d70: 20 53 51 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e   SQL transaction
8d80: 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 63 61  ..  ** If the ca
8d90: 6c 6c 62 61 63 6b 20 74 68 72 6f 77 73 20 61 6e  llback throws an
8da0: 20 65 78 63 65 70 74 69 6f 6e 20 6f 72 20 72 65   exception or re
8db0: 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  turns non-zero, 
8dc0: 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 74 72  then the.  ** tr
8dd0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 62 6f  ansaction is abo
8de0: 72 74 65 64 2e 20 20 49 66 20 43 41 4c 4c 42 41  rted.  If CALLBA
8df0: 43 4b 20 69 73 20 61 6e 20 65 6d 70 74 79 20 73  CK is an empty s
8e00: 74 72 69 6e 67 2c 20 74 68 65 20 63 61 6c 6c 62  tring, the callb
8e10: 61 63 6b 0a 20 20 2a 2a 20 69 73 20 64 69 73 61  ack.  ** is disa
8e20: 62 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  bled..  */.  cas
8e30: 65 20 44 42 5f 43 4f 4d 4d 49 54 5f 48 4f 4f 4b  e DB_COMMIT_HOOK
8e40: 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  : {.    if( objc
8e50: 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  >3 ){.      Tcl_
8e60: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
8e70: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f  erp, 2, objv, "?
8e80: 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20  CALLBACK?");.   
8e90: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
8ea0: 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ROR;.    }else i
8eb0: 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20  f( objc==2 ){.  
8ec0: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f      if( pDb->zCo
8ed0: 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  mmit ){.        
8ee0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
8ef0: 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 43  (interp, pDb->zC
8f00: 6f 6d 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20 20  ommit, 0);.     
8f10: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
8f20: 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69      char *zCommi
8f30: 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  t;.      int len
8f40: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ;.      if( pDb-
8f50: 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  >zCommit ){.    
8f60: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
8f70: 2d 3e 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20  ->zCommit);.    
8f80: 20 20 7d 0a 20 20 20 20 20 20 7a 43 6f 6d 6d 69    }.      zCommi
8f90: 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  t = Tcl_GetStrin
8fa0: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
8fb0: 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69  , &len);.      i
8fc0: 66 28 20 7a 43 6f 6d 6d 69 74 20 26 26 20 6c 65  f( zCommit && le
8fd0: 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  n>0 ){.        p
8fe0: 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20 54 63  Db->zCommit = Tc
8ff0: 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31  l_Alloc( len + 1
9000: 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   );.        memc
9010: 70 79 28 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 2c  py(pDb->zCommit,
9020: 20 7a 43 6f 6d 6d 69 74 2c 20 6c 65 6e 2b 31 29   zCommit, len+1)
9030: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
9040: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 43 6f 6d         pDb->zCom
9050: 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  mit = 0;.      }
9060: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
9070: 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20  zCommit ){.     
9080: 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d     pDb->interp =
9090: 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20   interp;.       
90a0: 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f   sqlite3_commit_
90b0: 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20 44 62  hook(pDb->db, Db
90c0: 43 6f 6d 6d 69 74 48 61 6e 64 6c 65 72 2c 20 70  CommitHandler, p
90d0: 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Db);.      }else
90e0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
90f0: 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 70 44  3_commit_hook(pD
9100: 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  b->db, 0, 0);.  
9110: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
9120: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
9130: 20 20 20 20 24 64 62 20 63 6f 6d 70 6c 65 74 65      $db complete
9140: 20 53 51 4c 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52   SQL.  **.  ** R
9150: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 53 51  eturn TRUE if SQ
9160: 4c 20 69 73 20 61 20 63 6f 6d 70 6c 65 74 65 20  L is a complete 
9170: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  SQL statement.  
9180: 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 0a  Return FALSE if.
9190: 20 20 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c 20    ** additional 
91a0: 6c 69 6e 65 73 20 6f 66 20 69 6e 70 75 74 20 61  lines of input a
91b0: 72 65 20 6e 65 65 64 65 64 2e 20 20 54 68 69 73  re needed.  This
91c0: 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74   is similar to t
91d0: 68 65 0a 20 20 2a 2a 20 62 75 69 6c 74 2d 69 6e  he.  ** built-in
91e0: 20 22 69 6e 66 6f 20 63 6f 6d 70 6c 65 74 65 22   "info complete"
91f0: 20 63 6f 6d 6d 61 6e 64 20 6f 66 20 54 63 6c 2e   command of Tcl.
9200: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
9210: 43 4f 4d 50 4c 45 54 45 3a 20 7b 0a 23 69 66 6e  COMPLETE: {.#ifn
9220: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9230: 43 4f 4d 50 4c 45 54 45 0a 20 20 20 20 54 63 6c  COMPLETE.    Tcl
9240: 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20  _Obj *pResult;. 
9250: 20 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c 65 74     int isComplet
9260: 65 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  e;.    if( objc!
9270: 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =3 ){.      Tcl_
9280: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
9290: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53  erp, 2, objv, "S
92a0: 51 4c 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  QL");.      retu
92b0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
92c0: 20 20 7d 0a 20 20 20 20 69 73 43 6f 6d 70 6c 65    }.    isComple
92d0: 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6d  te = sqlite3_com
92e0: 70 6c 65 74 65 28 20 54 63 6c 5f 47 65 74 53 74  plete( Tcl_GetSt
92f0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
9300: 5b 32 5d 2c 20 30 29 20 29 3b 0a 20 20 20 20 70  [2], 0) );.    p
9310: 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74  Result = Tcl_Get
9320: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
9330: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 42 6f  );.    Tcl_SetBo
9340: 6f 6c 65 61 6e 4f 62 6a 28 70 52 65 73 75 6c 74  oleanObj(pResult
9350: 2c 20 69 73 43 6f 6d 70 6c 65 74 65 29 3b 0a 23  , isComplete);.#
9360: 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b  endif.    break;
9370: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
9380: 62 20 63 6f 70 79 20 63 6f 6e 66 6c 69 63 74 2d  b copy conflict-
9390: 61 6c 67 6f 72 69 74 68 6d 20 74 61 62 6c 65 20  algorithm table 
93a0: 66 69 6c 65 6e 61 6d 65 20 3f 53 45 50 41 52 41  filename ?SEPARA
93b0: 54 4f 52 3f 20 3f 4e 55 4c 4c 49 4e 44 49 43 41  TOR? ?NULLINDICA
93c0: 54 4f 52 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43  TOR?.  **.  ** C
93d0: 6f 70 79 20 64 61 74 61 20 69 6e 74 6f 20 74 61  opy data into ta
93e0: 62 6c 65 20 66 72 6f 6d 20 66 69 6c 65 6e 61 6d  ble from filenam
93f0: 65 2c 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 75 73  e, optionally us
9400: 69 6e 67 20 53 45 50 41 52 41 54 4f 52 0a 20 20  ing SEPARATOR.  
9410: 2a 2a 20 61 73 20 63 6f 6c 75 6d 6e 20 73 65 70  ** as column sep
9420: 61 72 61 74 6f 72 73 2e 20 20 49 66 20 61 20 63  arators.  If a c
9430: 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61  olumn contains a
9440: 20 6e 75 6c 6c 20 73 74 72 69 6e 67 2c 20 6f 72   null string, or
9450: 20 74 68 65 0a 20 20 2a 2a 20 76 61 6c 75 65 20   the.  ** value 
9460: 6f 66 20 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52  of NULLINDICATOR
9470: 2c 20 61 20 4e 55 4c 4c 20 69 73 20 69 6e 73 65  , a NULL is inse
9480: 72 74 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6c  rted for the col
9490: 75 6d 6e 2e 0a 20 20 2a 2a 20 63 6f 6e 66 6c 69  umn..  ** confli
94a0: 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20 69 73 20  ct-algorithm is 
94b0: 6f 6e 65 20 6f 66 20 74 68 65 20 73 71 6c 69 74  one of the sqlit
94c0: 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67 6f 72  e conflict algor
94d0: 69 74 68 6d 73 3a 0a 20 20 2a 2a 20 20 20 20 72  ithms:.  **    r
94e0: 6f 6c 6c 62 61 63 6b 2c 20 61 62 6f 72 74 2c 20  ollback, abort, 
94f0: 66 61 69 6c 2c 20 69 67 6e 6f 72 65 2c 20 72 65  fail, ignore, re
9500: 70 6c 61 63 65 0a 20 20 2a 2a 20 4f 6e 20 73 75  place.  ** On su
9510: 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20 74 68  ccess, return th
9520: 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 69 6e 65  e number of line
9530: 73 20 70 72 6f 63 65 73 73 65 64 2c 20 6e 6f 74  s processed, not
9540: 20 6e 65 63 65 73 73 61 72 69 6c 79 20 73 61 6d   necessarily sam
9550: 65 0a 20 20 2a 2a 20 61 73 20 27 64 62 20 63 68  e.  ** as 'db ch
9560: 61 6e 67 65 73 27 20 64 75 65 20 74 6f 20 63 6f  anges' due to co
9570: 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d  nflict-algorithm
9580: 20 73 65 6c 65 63 74 65 64 2e 0a 20 20 2a 2a 0a   selected..  **.
9590: 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 69    ** This code i
95a0: 73 20 62 61 73 69 63 61 6c 6c 79 20 61 6e 20 69  s basically an i
95b0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2f 65 6e  mplementation/en
95c0: 68 61 6e 63 65 6d 65 6e 74 20 6f 66 0a 20 20 2a  hancement of.  *
95d0: 2a 20 74 68 65 20 73 71 6c 69 74 65 33 20 73 68  * the sqlite3 sh
95e0: 65 6c 6c 2e 63 20 22 2e 69 6d 70 6f 72 74 22 20  ell.c ".import" 
95f0: 63 6f 6d 6d 61 6e 64 2e 0a 20 20 2a 2a 0a 20 20  command..  **.  
9600: 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ** This command 
9610: 75 73 61 67 65 20 69 73 20 65 71 75 69 76 61 6c  usage is equival
9620: 65 6e 74 20 74 6f 20 74 68 65 20 73 71 6c 69 74  ent to the sqlit
9630: 65 32 2e 78 20 43 4f 50 59 20 73 74 61 74 65 6d  e2.x COPY statem
9640: 65 6e 74 2c 0a 20 20 2a 2a 20 77 68 69 63 68 20  ent,.  ** which 
9650: 69 6d 70 6f 72 74 73 20 66 69 6c 65 20 64 61 74  imports file dat
9660: 61 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 75  a into a table u
9670: 73 69 6e 67 20 74 68 65 20 50 6f 73 74 67 72 65  sing the Postgre
9680: 53 51 4c 20 43 4f 50 59 20 66 69 6c 65 20 66 6f  SQL COPY file fo
9690: 72 6d 61 74 3a 0a 20 20 2a 2a 20 20 20 24 64 62  rmat:.  **   $db
96a0: 20 63 6f 70 79 20 24 63 6f 6e 66 6c 69 74 5f 61   copy $conflit_a
96b0: 6c 67 6f 20 24 74 61 62 6c 65 5f 6e 61 6d 65 20  lgo $table_name 
96c0: 24 66 69 6c 65 6e 61 6d 65 20 5c 74 20 5c 5c 4e  $filename \t \\N
96d0: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
96e0: 43 4f 50 59 3a 20 7b 0a 20 20 20 20 63 68 61 72  COPY: {.    char
96f0: 20 2a 7a 54 61 62 6c 65 3b 20 20 20 20 20 20 20   *zTable;       
9700: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72          /* Inser
9710: 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68 69 73  t data into this
9720: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 63 68   table */.    ch
9730: 61 72 20 2a 7a 46 69 6c 65 3b 20 20 20 20 20 20  ar *zFile;      
9740: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
9750: 20 66 69 6c 65 20 66 72 6f 6d 20 77 68 69 63 68   file from which
9760: 20 74 6f 20 65 78 74 72 61 63 74 20 64 61 74 61   to extract data
9770: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 43   */.    char *zC
9780: 6f 6e 66 6c 69 63 74 3b 20 20 20 20 20 20 20 20  onflict;        
9790: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 66 6c      /* The confl
97a0: 69 63 74 20 61 6c 67 6f 72 69 74 68 6d 20 74 6f  ict algorithm to
97b0: 20 75 73 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69   use */.    sqli
97c0: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
97d0: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 74 61          /* A sta
97e0: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e  tement */.    in
97f0: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
9800: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
9810: 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 20 20  ult code */.    
9820: 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20  int nCol;       
9830: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
9840: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
9850: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   in the table */
9860: 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 20  .    int nByte; 
9870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9880: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
9890: 74 65 73 20 69 6e 20 61 6e 20 53 51 4c 20 73 74  tes in an SQL st
98a0: 72 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ring */.    int 
98b0: 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
98c0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
98d0: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 20 20  counters */.    
98e0: 69 6e 74 20 6e 53 65 70 3b 20 20 20 20 20 20 20  int nSep;       
98f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
9900: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
9910: 6e 20 7a 53 65 70 5b 5d 20 2a 2f 0a 20 20 20 20  n zSep[] */.    
9920: 69 6e 74 20 6e 4e 75 6c 6c 3b 20 20 20 20 20 20  int nNull;      
9930: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
9940: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
9950: 6e 20 7a 4e 75 6c 6c 5b 5d 20 2a 2f 0a 20 20 20  n zNull[] */.   
9960: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20   char *zSql;    
9970: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9980: 41 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  An SQL statement
9990: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c   */.    char *zL
99a0: 69 6e 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ine;            
99b0: 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
99c0: 6c 69 6e 65 20 6f 66 20 69 6e 70 75 74 20 66 72  line of input fr
99d0: 6f 6d 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20  om the file */. 
99e0: 20 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 3b     char **azCol;
99f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9a00: 2a 20 7a 4c 69 6e 65 5b 5d 20 62 72 6f 6b 65 6e  * zLine[] broken
9a10: 20 75 70 20 69 6e 74 6f 20 63 6f 6c 75 6d 6e 73   up into columns
9a20: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 43   */.    char *zC
9a30: 6f 6d 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20  ommit;          
9a40: 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 63 6f      /* How to co
9a50: 6d 6d 69 74 20 63 68 61 6e 67 65 73 20 2a 2f 0a  mmit changes */.
9a60: 20 20 20 20 46 49 4c 45 20 2a 69 6e 3b 20 20 20      FILE *in;   
9a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a80: 2f 2a 20 54 68 65 20 69 6e 70 75 74 20 66 69 6c  /* The input fil
9a90: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 69 6e  e */.    int lin
9aa0: 65 6e 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20  eno = 0;        
9ab0: 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d       /* Line num
9ac0: 62 65 72 20 6f 66 20 69 6e 70 75 74 20 66 69 6c  ber of input fil
9ad0: 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 7a 4c  e */.    char zL
9ae0: 69 6e 65 4e 75 6d 5b 38 30 5d 3b 20 20 20 20 20  ineNum[80];     
9af0: 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d       /* Line num
9b00: 62 65 72 20 70 72 69 6e 74 20 62 75 66 66 65 72  ber print buffer
9b10: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20   */.    Tcl_Obj 
9b20: 2a 70 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20  *pResult;       
9b30: 20 20 20 20 2f 2a 20 69 6e 74 65 72 70 20 72 65      /* interp re
9b40: 73 75 6c 74 20 2a 2f 0a 0a 20 20 20 20 63 68 61  sult */..    cha
9b50: 72 20 2a 7a 53 65 70 3b 0a 20 20 20 20 63 68 61  r *zSep;.    cha
9b60: 72 20 2a 7a 4e 75 6c 6c 3b 0a 20 20 20 20 69 66  r *zNull;.    if
9b70: 28 20 6f 62 6a 63 3c 35 20 7c 7c 20 6f 62 6a 63  ( objc<5 || objc
9b80: 3e 37 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  >7 ){.      Tcl_
9b90: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
9ba0: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 0a 20  erp, 2, objv, . 
9bb0: 20 20 20 20 20 20 20 20 22 43 4f 4e 46 4c 49 43          "CONFLIC
9bc0: 54 2d 41 4c 47 4f 52 49 54 48 4d 20 54 41 42 4c  T-ALGORITHM TABL
9bd0: 45 20 46 49 4c 45 4e 41 4d 45 20 3f 53 45 50 41  E FILENAME ?SEPA
9be0: 52 41 54 4f 52 3f 20 3f 4e 55 4c 4c 49 4e 44 49  RATOR? ?NULLINDI
9bf0: 43 41 54 4f 52 3f 22 29 3b 0a 20 20 20 20 20 20  CATOR?");.      
9c00: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
9c10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
9c20: 6f 62 6a 63 3e 3d 36 20 29 7b 0a 20 20 20 20 20  objc>=6 ){.     
9c30: 20 7a 53 65 70 20 3d 20 54 63 6c 5f 47 65 74 53   zSep = Tcl_GetS
9c40: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
9c50: 76 5b 35 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 65  v[5], 0);.    }e
9c60: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 53 65 70 20  lse{.      zSep 
9c70: 3d 20 22 5c 74 22 3b 0a 20 20 20 20 7d 0a 20 20  = "\t";.    }.  
9c80: 20 20 69 66 28 20 6f 62 6a 63 3e 3d 37 20 29 7b    if( objc>=7 ){
9c90: 0a 20 20 20 20 20 20 7a 4e 75 6c 6c 20 3d 20 54  .      zNull = T
9ca0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
9cb0: 4f 62 6a 28 6f 62 6a 76 5b 36 5d 2c 20 30 29 3b  Obj(objv[6], 0);
9cc0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9cd0: 20 20 7a 4e 75 6c 6c 20 3d 20 22 22 3b 0a 20 20    zNull = "";.  
9ce0: 20 20 7d 0a 20 20 20 20 7a 43 6f 6e 66 6c 69 63    }.    zConflic
9cf0: 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  t = Tcl_GetStrin
9d00: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
9d10: 2c 20 30 29 3b 0a 20 20 20 20 7a 54 61 62 6c 65  , 0);.    zTable
9d20: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
9d30: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c  FromObj(objv[3],
9d40: 20 30 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d   0);.    zFile =
9d50: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
9d60: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 34 5d 2c 20 30  omObj(objv[4], 0
9d70: 29 3b 0a 20 20 20 20 6e 53 65 70 20 3d 20 73 74  );.    nSep = st
9d80: 72 6c 65 6e 28 7a 53 65 70 29 3b 0a 20 20 20 20  rlen(zSep);.    
9d90: 6e 4e 75 6c 6c 20 3d 20 73 74 72 6c 65 6e 28 7a  nNull = strlen(z
9da0: 4e 75 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 6e  Null);.    if( n
9db0: 53 65 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Sep==0 ){.      
9dc0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
9dd0: 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 3a 20  (interp,"Error: 
9de0: 6e 6f 6e 2d 6e 75 6c 6c 20 73 65 70 61 72 61 74  non-null separat
9df0: 6f 72 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  or required for 
9e00: 63 6f 70 79 22 2c 30 29 3b 0a 20 20 20 20 20 20  copy",0);.      
9e10: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
9e20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 73  ;.    }.    if(s
9e30: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 43  qlite3StrICmp(zC
9e40: 6f 6e 66 6c 69 63 74 2c 20 22 72 6f 6c 6c 62 61  onflict, "rollba
9e50: 63 6b 22 29 20 21 3d 20 30 20 26 26 0a 20 20 20  ck") != 0 &&.   
9e60: 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 49 43      sqlite3StrIC
9e70: 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 61  mp(zConflict, "a
9e80: 62 6f 72 74 22 20 20 20 29 20 21 3d 20 30 20 26  bort"   ) != 0 &
9e90: 26 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  &.       sqlite3
9ea0: 53 74 72 49 43 6d 70 28 7a 43 6f 6e 66 6c 69 63  StrICmp(zConflic
9eb0: 74 2c 20 22 66 61 69 6c 22 20 20 20 20 29 20 21  t, "fail"    ) !
9ec0: 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20 73 71  = 0 &&.       sq
9ed0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 43 6f  lite3StrICmp(zCo
9ee0: 6e 66 6c 69 63 74 2c 20 22 69 67 6e 6f 72 65 22  nflict, "ignore"
9ef0: 20 20 29 20 21 3d 20 30 20 26 26 0a 20 20 20 20    ) != 0 &&.    
9f00: 20 20 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d     sqlite3StrICm
9f10: 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 72 65  p(zConflict, "re
9f20: 70 6c 61 63 65 22 20 29 20 21 3d 20 30 20 29 20  place" ) != 0 ) 
9f30: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
9f40: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
9f50: 20 22 45 72 72 6f 72 3a 20 5c 22 22 2c 20 7a 43   "Error: \"", zC
9f60: 6f 6e 66 6c 69 63 74 2c 20 0a 20 20 20 20 20 20  onflict, .      
9f70: 20 20 20 20 20 20 22 5c 22 2c 20 63 6f 6e 66 6c        "\", confl
9f80: 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20 6d 75  ict-algorithm mu
9f90: 73 74 20 62 65 20 6f 6e 65 20 6f 66 3a 20 72 6f  st be one of: ro
9fa0: 6c 6c 62 61 63 6b 2c 20 22 0a 20 20 20 20 20 20  llback, ".      
9fb0: 20 20 20 20 20 20 22 61 62 6f 72 74 2c 20 66 61        "abort, fa
9fc0: 69 6c 2c 20 69 67 6e 6f 72 65 2c 20 6f 72 20 72  il, ignore, or r
9fd0: 65 70 6c 61 63 65 22 2c 20 30 29 3b 0a 20 20 20  eplace", 0);.   
9fe0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
9ff0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  ROR;.    }.    z
a000: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
a010: 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 2a 20  rintf("SELECT * 
a020: 46 52 4f 4d 20 27 25 71 27 22 2c 20 7a 54 61 62  FROM '%q'", zTab
a030: 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71  le);.    if( zSq
a040: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63  l==0 ){.      Tc
a050: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
a060: 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 6e  nterp, "Error: n
a070: 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 22 2c  o such table: ",
a080: 20 7a 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20   zTable, 0);.   
a090: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
a0a0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  ROR;.    }.    n
a0b0: 42 79 74 65 20 3d 20 73 74 72 6c 65 6e 28 7a 53  Byte = strlen(zS
a0c0: 71 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ql);.    rc = sq
a0d0: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 70 44  lite3_prepare(pD
a0e0: 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  b->db, zSql, -1,
a0f0: 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
a100: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
a110: 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ql);.    if( rc 
a120: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
a130: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
a140: 2c 20 22 45 72 72 6f 72 3a 20 22 2c 20 73 71 6c  , "Error: ", sql
a150: 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d  ite3_errmsg(pDb-
a160: 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  >db), 0);.      
a170: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65  nCol = 0;.    }e
a180: 6c 73 65 7b 0a 20 20 20 20 20 20 6e 43 6f 6c 20  lse{.      nCol 
a190: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
a1a0: 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20  _count(pStmt);. 
a1b0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
a1c0: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
a1d0: 3b 0a 20 20 20 20 69 66 28 20 6e 43 6f 6c 3d 3d  ;.    if( nCol==
a1e0: 30 20 29 20 7b 0a 20 20 20 20 20 20 72 65 74 75  0 ) {.      retu
a1f0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
a200: 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20 6d    }.    zSql = m
a210: 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 2b 20 35  alloc( nByte + 5
a220: 30 20 2b 20 6e 43 6f 6c 2a 32 20 29 3b 0a 20 20  0 + nCol*2 );.  
a230: 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20    if( zSql==0 ) 
a240: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
a250: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
a260: 20 22 45 72 72 6f 72 3a 20 63 61 6e 27 74 20 6d   "Error: can't m
a270: 61 6c 6c 6f 63 28 29 22 2c 20 30 29 3b 0a 20 20  alloc()", 0);.  
a280: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
a290: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
a2a0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
a2b0: 28 6e 42 79 74 65 2b 35 30 2c 20 7a 53 71 6c 2c  (nByte+50, zSql,
a2c0: 20 22 49 4e 53 45 52 54 20 4f 52 20 25 71 20 49   "INSERT OR %q I
a2d0: 4e 54 4f 20 27 25 71 27 20 56 41 4c 55 45 53 28  NTO '%q' VALUES(
a2e0: 3f 22 2c 0a 20 20 20 20 20 20 20 20 20 7a 43 6f  ?",.         zCo
a2f0: 6e 66 6c 69 63 74 2c 20 7a 54 61 62 6c 65 29 3b  nflict, zTable);
a300: 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c 65 6e 28  .    j = strlen(
a310: 7a 53 71 6c 29 3b 0a 20 20 20 20 66 6f 72 28 69  zSql);.    for(i
a320: 3d 31 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =1; i<nCol; i++)
a330: 7b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b  {.      zSql[j++
a340: 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 7a  ] = ',';.      z
a350: 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 3f 27 3b 0a  Sql[j++] = '?';.
a360: 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 5b 6a      }.    zSql[j
a370: 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20 7a  ++] = ')';.    z
a380: 53 71 6c 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20  Sql[j] = 0;.    
a390: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
a3a0: 70 61 72 65 28 70 44 62 2d 3e 64 62 2c 20 7a 53  pare(pDb->db, zS
a3b0: 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
a3c0: 30 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 53 71  0);.    free(zSq
a3d0: 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  l);.    if( rc )
a3e0: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
a3f0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
a400: 20 22 45 72 72 6f 72 3a 20 22 2c 20 73 71 6c 69   "Error: ", sqli
a410: 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
a420: 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  db), 0);.      s
a430: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
a440: 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 65  pStmt);.      re
a450: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
a460: 20 20 20 20 7d 0a 20 20 20 20 69 6e 20 3d 20 66      }.    in = f
a470: 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 22 72 62 22  open(zFile, "rb"
a480: 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 3d 3d 30  );.    if( in==0
a490: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
a4a0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
a4b0: 70 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f  p, "Error: canno
a4c0: 74 20 6f 70 65 6e 20 66 69 6c 65 3a 20 22 2c 20  t open file: ", 
a4d0: 7a 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 20 20  zFile, NULL);.  
a4e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
a4f0: 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
a500: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
a510: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ROR;.    }.    a
a520: 7a 43 6f 6c 20 3d 20 6d 61 6c 6c 6f 63 28 20 73  zCol = malloc( s
a530: 69 7a 65 6f 66 28 61 7a 43 6f 6c 5b 30 5d 29 2a  izeof(azCol[0])*
a540: 28 6e 43 6f 6c 2b 31 29 20 29 3b 0a 20 20 20 20  (nCol+1) );.    
a550: 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 20 7b  if( azCol==0 ) {
a560: 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
a570: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
a580: 22 45 72 72 6f 72 3a 20 63 61 6e 27 74 20 6d 61  "Error: can't ma
a590: 6c 6c 6f 63 28 29 22 2c 20 30 29 3b 0a 20 20 20  lloc()", 0);.   
a5a0: 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20     fclose(in);. 
a5b0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
a5c0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
a5d0: 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f 65   (void)sqlite3_e
a5e0: 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 22 42 45  xec(pDb->db, "BE
a5f0: 47 49 4e 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  GIN", 0, 0, 0);.
a600: 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 43      zCommit = "C
a610: 4f 4d 4d 49 54 22 3b 0a 20 20 20 20 77 68 69 6c  OMMIT";.    whil
a620: 65 28 20 28 7a 4c 69 6e 65 20 3d 20 6c 6f 63 61  e( (zLine = loca
a630: 6c 5f 67 65 74 6c 69 6e 65 28 30 2c 20 69 6e 29  l_getline(0, in)
a640: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68  )!=0 ){.      ch
a650: 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 69 20 3d  ar *z;.      i =
a660: 20 30 3b 0a 20 20 20 20 20 20 6c 69 6e 65 6e 6f   0;.      lineno
a670: 2b 2b 3b 0a 20 20 20 20 20 20 61 7a 43 6f 6c 5b  ++;.      azCol[
a680: 30 5d 20 3d 20 7a 4c 69 6e 65 3b 0a 20 20 20 20  0] = zLine;.    
a690: 20 20 66 6f 72 28 69 3d 30 2c 20 7a 3d 7a 4c 69    for(i=0, z=zLi
a6a0: 6e 65 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20 20  ne; *z; z++){.  
a6b0: 20 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d 7a 53        if( *z==zS
a6c0: 65 70 5b 30 5d 20 26 26 20 73 74 72 6e 63 6d 70  ep[0] && strncmp
a6d0: 28 7a 2c 20 7a 53 65 70 2c 20 6e 53 65 70 29 3d  (z, zSep, nSep)=
a6e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
a6f0: 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  *z = 0;.        
a700: 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20    i++;.         
a710: 20 69 66 28 20 69 3c 6e 43 6f 6c 20 29 7b 0a 20   if( i<nCol ){. 
a720: 20 20 20 20 20 20 20 20 20 20 20 61 7a 43 6f 6c             azCol
a730: 5b 69 5d 20 3d 20 26 7a 5b 6e 53 65 70 5d 3b 0a  [i] = &z[nSep];.
a740: 20 20 20 20 20 20 20 20 20 20 20 20 7a 20 2b 3d              z +=
a750: 20 6e 53 65 70 2d 31 3b 0a 20 20 20 20 20 20 20   nSep-1;.       
a760: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
a770: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
a780: 20 69 2b 31 21 3d 6e 43 6f 6c 20 29 7b 0a 20 20   i+1!=nCol ){.  
a790: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72        char *zErr
a7a0: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 45  ;.        int nE
a7b0: 72 72 20 3d 20 73 74 72 6c 65 6e 28 7a 46 69 6c  rr = strlen(zFil
a7c0: 65 29 20 2b 20 32 30 30 3b 0a 20 20 20 20 20 20  e) + 200;.      
a7d0: 20 20 7a 45 72 72 20 3d 20 6d 61 6c 6c 6f 63 28    zErr = malloc(
a7e0: 6e 45 72 72 29 3b 0a 20 20 20 20 20 20 20 20 69  nErr);.        i
a7f0: 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 20  f( zErr ){.     
a800: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
a810: 72 69 6e 74 66 28 6e 45 72 72 2c 20 7a 45 72 72  rintf(nErr, zErr
a820: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,.             "
a830: 45 72 72 6f 72 3a 20 25 73 20 6c 69 6e 65 20 25  Error: %s line %
a840: 64 3a 20 65 78 70 65 63 74 65 64 20 25 64 20 63  d: expected %d c
a850: 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 62  olumns of data b
a860: 75 74 20 66 6f 75 6e 64 20 25 64 22 2c 0a 20 20  ut found %d",.  
a870: 20 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65             zFile
a880: 2c 20 6c 69 6e 65 6e 6f 2c 20 6e 43 6f 6c 2c 20  , lineno, nCol, 
a890: 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  i+1);.          
a8a0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
a8b0: 28 69 6e 74 65 72 70 2c 20 7a 45 72 72 2c 20 30  (interp, zErr, 0
a8c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 72 65  );.          fre
a8d0: 65 28 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 20  e(zErr);.       
a8e0: 20 7d 0a 20 20 20 20 20 20 20 20 7a 43 6f 6d 6d   }.        zComm
a8f0: 69 74 20 3d 20 22 52 4f 4c 4c 42 41 43 4b 22 3b  it = "ROLLBACK";
a900: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
a910: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
a920: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
a930: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ++){.        /* 
a940: 63 68 65 63 6b 20 66 6f 72 20 6e 75 6c 6c 20 64  check for null d
a950: 61 74 61 2c 20 69 66 20 73 6f 2c 20 62 69 6e 64  ata, if so, bind
a960: 20 61 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20   as null */.    
a970: 20 20 20 20 69 66 20 28 28 6e 4e 75 6c 6c 3e 30      if ((nNull>0
a980: 20 26 26 20 73 74 72 63 6d 70 28 61 7a 43 6f 6c   && strcmp(azCol
a990: 5b 69 5d 2c 20 7a 4e 75 6c 6c 29 3d 3d 30 29 20  [i], zNull)==0) 
a9a0: 7c 7c 20 73 74 72 6c 65 6e 28 61 7a 43 6f 6c 5b  || strlen(azCol[
a9b0: 69 5d 29 3d 3d 30 29 20 7b 0a 20 20 20 20 20 20  i])==0) {.      
a9c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
a9d0: 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69 2b 31  _null(pStmt, i+1
a9e0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
a9f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
aa00: 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53  te3_bind_text(pS
aa10: 74 6d 74 2c 20 69 2b 31 2c 20 61 7a 43 6f 6c 5b  tmt, i+1, azCol[
aa20: 69 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53  i], -1, SQLITE_S
aa30: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20  TATIC);.        
aa40: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
aa50: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
aa60: 6d 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  mt);.      rc = 
aa70: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
aa80: 74 6d 74 29 3b 0a 20 20 20 20 20 20 66 72 65 65  tmt);.      free
aa90: 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 69  (zLine);.      i
aaa0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
aab0: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
aac0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
aad0: 65 72 70 2c 22 45 72 72 6f 72 3a 20 22 2c 20 73  erp,"Error: ", s
aae0: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44  qlite3_errmsg(pD
aaf0: 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20 20  b->db), 0);.    
ab00: 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 52      zCommit = "R
ab10: 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20 20  OLLBACK";.      
ab20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
ab30: 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28  .    }.    free(
ab40: 61 7a 43 6f 6c 29 3b 0a 20 20 20 20 66 63 6c 6f  azCol);.    fclo
ab50: 73 65 28 69 6e 29 3b 0a 20 20 20 20 73 71 6c 69  se(in);.    sqli
ab60: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
ab70: 6d 74 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 73  mt);.    (void)s
ab80: 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d  qlite3_exec(pDb-
ab90: 3e 64 62 2c 20 7a 43 6f 6d 6d 69 74 2c 20 30 2c  >db, zCommit, 0,
aba0: 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 69 66 28   0, 0);..    if(
abb0: 20 7a 43 6f 6d 6d 69 74 5b 30 5d 20 3d 3d 20 27   zCommit[0] == '
abc0: 43 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 73  C' ){.      /* s
abd0: 75 63 63 65 73 73 2c 20 73 65 74 20 72 65 73 75  uccess, set resu
abe0: 6c 74 20 61 73 20 6e 75 6d 62 65 72 20 6f 66 20  lt as number of 
abf0: 6c 69 6e 65 73 20 70 72 6f 63 65 73 73 65 64 20  lines processed 
ac00: 2a 2f 0a 20 20 20 20 20 20 70 52 65 73 75 6c 74  */.      pResult
ac10: 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73   = Tcl_GetObjRes
ac20: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  ult(interp);.   
ac30: 20 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a     Tcl_SetIntObj
ac40: 28 70 52 65 73 75 6c 74 2c 20 6c 69 6e 65 6e 6f  (pResult, lineno
ac50: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43  );.      rc = TC
ac60: 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  L_OK;.    }else{
ac70: 0a 20 20 20 20 20 20 2f 2a 20 66 61 69 6c 75 72  .      /* failur
ac80: 65 2c 20 61 70 70 65 6e 64 20 6c 69 6e 65 6e 6f  e, append lineno
ac90: 20 77 68 65 72 65 20 66 61 69 6c 65 64 20 2a 2f   where failed */
aca0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
acb0: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
acc0: 4c 69 6e 65 4e 75 6d 29 2c 20 7a 4c 69 6e 65 4e  LineNum), zLineN
acd0: 75 6d 2c 22 25 64 22 2c 6c 69 6e 65 6e 6f 29 3b  um,"%d",lineno);
ace0: 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
acf0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22  dResult(interp,"
ad00: 2c 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20 70  , failed while p
ad10: 72 6f 63 65 73 73 69 6e 67 20 6c 69 6e 65 3a 20  rocessing line: 
ad20: 22 2c 7a 4c 69 6e 65 4e 75 6d 2c 30 29 3b 0a 20  ",zLineNum,0);. 
ad30: 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52       rc = TCL_ER
ad40: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  ROR;.    }.    b
ad50: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
ad60: 20 20 2a 2a 20 20 20 20 24 64 62 20 65 6e 61 62    **    $db enab
ad70: 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  le_load_extensio
ad80: 6e 20 42 4f 4f 4c 45 41 4e 0a 20 20 2a 2a 0a 20  n BOOLEAN.  **. 
ad90: 20 2a 2a 20 54 75 72 6e 20 74 68 65 20 65 78 74   ** Turn the ext
ada0: 65 6e 73 69 6f 6e 20 6c 6f 61 64 69 6e 67 20 66  ension loading f
adb0: 65 61 74 75 72 65 20 6f 6e 20 6f 72 20 6f 66 66  eature on or off
adc0: 2e 20 20 49 74 20 69 66 20 6f 66 66 20 62 79 0a  .  It if off by.
add0: 20 20 2a 2a 20 64 65 66 61 75 6c 74 2e 0a 20 20    ** default..  
ade0: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 45 4e 41  */.  case DB_ENA
adf0: 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  BLE_LOAD_EXTENSI
ae00: 4f 4e 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53 51  ON: {.#ifndef SQ
ae10: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
ae20: 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 69 6e 74  XTENSION.    int
ae30: 20 6f 6e 6f 66 66 3b 0a 20 20 20 20 69 66 28 20   onoff;.    if( 
ae40: 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20  objc!=3 ){.     
ae50: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
ae60: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
ae70: 76 2c 20 22 42 4f 4f 4c 45 41 4e 22 29 3b 0a 20  v, "BOOLEAN");. 
ae80: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
ae90: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
aea0: 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c   if( Tcl_GetBool
aeb0: 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
aec0: 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6f 6e 6f  p, objv[2], &ono
aed0: 66 66 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ff) ){.      ret
aee0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
aef0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
af00: 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74  _enable_load_ext
af10: 65 6e 73 69 6f 6e 28 70 44 62 2d 3e 64 62 2c 20  ension(pDb->db, 
af20: 6f 6e 6f 66 66 29 3b 0a 20 20 20 20 62 72 65 61  onoff);.    brea
af30: 6b 3b 0a 23 65 6c 73 65 0a 20 20 20 20 54 63 6c  k;.#else.    Tcl
af40: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
af50: 74 65 72 70 2c 20 22 65 78 74 65 6e 73 69 6f 6e  terp, "extension
af60: 20 6c 6f 61 64 69 6e 67 20 69 73 20 74 75 72 6e   loading is turn
af70: 65 64 20 6f 66 66 20 61 74 20 63 6f 6d 70 69 6c  ed off at compil
af80: 65 2d 74 69 6d 65 22 2c 0a 20 20 20 20 20 20 20  e-time",.       
af90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 29                0)
afa0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
afb0: 5f 45 52 52 4f 52 3b 0a 23 65 6e 64 69 66 0a 20  _ERROR;.#endif. 
afc0: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
afd0: 20 24 64 62 20 65 72 72 6f 72 63 6f 64 65 0a 20   $db errorcode. 
afe0: 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
aff0: 74 68 65 20 6e 75 6d 65 72 69 63 20 65 72 72 6f  the numeric erro
b000: 72 20 63 6f 64 65 20 74 68 61 74 20 77 61 73 20  r code that was 
b010: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
b020: 6d 6f 73 74 20 72 65 63 65 6e 74 0a 20 20 2a 2a  most recent.  **
b030: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
b040: 5f 65 78 65 63 28 29 2e 0a 20 20 2a 2f 0a 20 20  _exec()..  */.  
b050: 63 61 73 65 20 44 42 5f 45 52 52 4f 52 43 4f 44  case DB_ERRORCOD
b060: 45 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  E: {.    Tcl_Set
b070: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
b080: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
b090: 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
b0a0: 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20  pDb->db)));.    
b0b0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 20 0a 20  break;.  }.   . 
b0c0: 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20   /*.  **    $db 
b0d0: 65 76 61 6c 20 24 73 71 6c 20 3f 61 72 72 61 79  eval $sql ?array
b0e0: 3f 20 3f 7b 20 20 2e 2e 2e 63 6f 64 65 2e 2e 2e  ? ?{  ...code...
b0f0: 20 7d 3f 0a 20 20 2a 2a 20 20 20 20 24 64 62 20   }?.  **    $db 
b100: 6f 6e 65 63 6f 6c 75 6d 6e 20 24 73 71 6c 0a 20  onecolumn $sql. 
b110: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 53 51 4c   **.  ** The SQL
b120: 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 24 73   statement in $s
b130: 71 6c 20 69 73 20 65 76 61 6c 75 61 74 65 64 2e  ql is evaluated.
b140: 20 20 46 6f 72 20 65 61 63 68 20 72 6f 77 2c 20    For each row, 
b150: 74 68 65 20 76 61 6c 75 65 73 20 61 72 65 0a 20  the values are. 
b160: 20 2a 2a 20 70 6c 61 63 65 64 20 69 6e 20 65 6c   ** placed in el
b170: 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 61 72  ements of the ar
b180: 72 61 79 20 6e 61 6d 65 64 20 22 61 72 72 61 79  ray named "array
b190: 22 20 61 6e 64 20 2e 2e 2e 63 6f 64 65 2e 2e 2e  " and ...code...
b1a0: 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20   is executed..  
b1b0: 2a 2a 20 49 66 20 22 61 72 72 61 79 22 20 61 6e  ** If "array" an
b1c0: 64 20 22 63 6f 64 65 22 20 61 72 65 20 6f 6d 69  d "code" are omi
b1d0: 74 74 65 64 2c 20 74 68 65 6e 20 6e 6f 20 63 61  tted, then no ca
b1e0: 6c 6c 62 61 63 6b 20 69 73 20 65 76 65 72 79 20  llback is every 
b1f0: 69 6e 76 6f 6b 65 64 2e 0a 20 20 2a 2a 20 49 66  invoked..  ** If
b200: 20 22 61 72 72 61 79 22 20 69 73 20 61 6e 20 65   "array" is an e
b210: 6d 70 74 79 20 73 74 72 69 6e 67 2c 20 74 68 65  mpty string, the
b220: 6e 20 74 68 65 20 76 61 6c 75 65 73 20 61 72 65  n the values are
b230: 20 70 6c 61 63 65 64 20 69 6e 20 76 61 72 69 61   placed in varia
b240: 62 6c 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 68  bles.  ** that h
b250: 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ave the same nam
b260: 65 20 61 73 20 74 68 65 20 66 69 65 6c 64 73 20  e as the fields 
b270: 65 78 74 72 61 63 74 65 64 20 62 79 20 74 68 65  extracted by the
b280: 20 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a   query..  **.  *
b290: 2a 20 54 68 65 20 6f 6e 65 63 6f 6c 75 6d 6e 20  * The onecolumn 
b2a0: 6d 65 74 68 6f 64 20 69 73 20 74 68 65 20 65 71  method is the eq
b2b0: 75 69 76 61 6c 65 6e 74 20 6f 66 3a 0a 20 20 2a  uivalent of:.  *
b2c0: 2a 20 20 20 20 20 6c 69 6e 64 65 78 20 5b 24 64  *     lindex [$d
b2d0: 62 20 65 76 61 6c 20 24 73 71 6c 5d 20 30 0a 20  b eval $sql] 0. 
b2e0: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 4f 4e   */.  case DB_ON
b2f0: 45 43 4f 4c 55 4d 4e 3a 0a 20 20 63 61 73 65 20  ECOLUMN:.  case 
b300: 44 42 5f 45 56 41 4c 3a 0a 20 20 63 61 73 65 20  DB_EVAL:.  case 
b310: 44 42 5f 45 58 49 53 54 53 3a 20 7b 0a 20 20 20  DB_EXISTS: {.   
b320: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 53 71   char const *zSq
b330: 6c 3b 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20  l;      /* Next 
b340: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  SQL statement to
b350: 20 65 78 65 63 75 74 65 20 2a 2f 0a 20 20 20 20   execute */.    
b360: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4c 65 66  char const *zLef
b370: 74 3b 20 20 20 20 20 2f 2a 20 57 68 61 74 20 69  t;     /* What i
b380: 73 20 6c 65 66 74 20 61 66 74 65 72 20 66 69 72  s left after fir
b390: 73 74 20 73 74 6d 74 20 69 6e 20 7a 53 71 6c 20  st stmt in zSql 
b3a0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  */.    sqlite3_s
b3b0: 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 2f 2a  tmt *pStmt;   /*
b3c0: 20 43 6f 6d 70 69 6c 65 64 20 53 51 4c 20 73 74   Compiled SQL st
b3d0: 61 74 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 54 63  atment */.    Tc
b3e0: 6c 5f 4f 62 6a 20 2a 70 41 72 72 61 79 3b 20 20  l_Obj *pArray;  
b3f0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
b400: 61 72 72 61 79 20 69 6e 74 6f 20 77 68 69 63 68  array into which
b410: 20 72 65 73 75 6c 74 73 20 61 72 65 20 77 72 69   results are wri
b420: 74 74 65 6e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  tten */.    Tcl_
b430: 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 20 20 20  Obj *pScript;   
b440: 20 20 20 2f 2a 20 53 63 72 69 70 74 20 74 6f 20     /* Script to 
b450: 72 75 6e 20 66 6f 72 20 65 61 63 68 20 72 65 73  run for each res
b460: 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 54  ult set */.    T
b470: 63 6c 5f 4f 62 6a 20 2a 2a 61 70 50 61 72 6d 3b  cl_Obj **apParm;
b480: 20 20 20 20 20 20 2f 2a 20 50 61 72 61 6d 65 74        /* Paramet
b490: 65 72 73 20 74 68 61 74 20 6e 65 65 64 20 61 20  ers that need a 
b4a0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
b4b0: 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50  () */.    int nP
b4c0: 61 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  arm;            
b4d0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
b4e0: 74 72 69 65 73 20 75 73 65 64 20 69 6e 20 61 70  tries used in ap
b4f0: 50 61 72 6d 5b 5d 20 2a 2f 0a 20 20 20 20 54 63  Parm[] */.    Tc
b500: 6c 5f 4f 62 6a 20 2a 61 50 61 72 6d 5b 31 30 5d  l_Obj *aParm[10]
b510: 3b 20 20 20 20 2f 2a 20 53 74 61 74 69 63 20 73  ;    /* Static s
b520: 70 61 63 65 20 66 6f 72 20 61 70 50 61 72 6d 5b  pace for apParm[
b530: 5d 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  ] in the common 
b540: 63 61 73 65 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  case */.    Tcl_
b550: 4f 62 6a 20 2a 70 52 65 74 3b 20 20 20 20 20 20  Obj *pRet;      
b560: 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 62     /* Value to b
b570: 65 20 72 65 74 75 72 6e 65 64 20 2a 2f 0a 20 20  e returned */.  
b580: 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d    SqlPreparedStm
b590: 74 20 2a 70 50 72 65 53 74 6d 74 3b 20 20 2f 2a  t *pPreStmt;  /*
b5a0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 70 72   Pointer to a pr
b5b0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
b5c0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 32 3b   */.    int rc2;
b5d0: 0a 0a 20 20 20 20 69 66 28 20 63 68 6f 69 63 65  ..    if( choice
b5e0: 3d 3d 44 42 5f 45 56 41 4c 20 29 7b 0a 20 20 20  ==DB_EVAL ){.   
b5f0: 20 20 20 69 66 28 20 6f 62 6a 63 3c 33 20 7c 7c     if( objc<3 ||
b600: 20 6f 62 6a 63 3e 35 20 29 7b 0a 20 20 20 20 20   objc>5 ){.     
b610: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
b620: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
b630: 62 6a 76 2c 20 22 53 51 4c 20 3f 41 52 52 41 59  bjv, "SQL ?ARRAY
b640: 2d 4e 41 4d 45 3f 20 3f 53 43 52 49 50 54 3f 22  -NAME? ?SCRIPT?"
b650: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
b660: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
b670: 20 20 20 7d 0a 20 20 20 20 20 20 70 52 65 74 20     }.      pRet 
b680: 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a  = Tcl_NewObj();.
b690: 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65        Tcl_IncrRe
b6a0: 66 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20  fCount(pRet);.  
b6b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
b6c0: 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
b6d0: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
b6e0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
b6f0: 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 22 29 3b 0a  , objv, "SQL");.
b700: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
b710: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
b720: 7d 0a 20 20 20 20 20 20 69 66 28 20 63 68 6f 69  }.      if( choi
b730: 63 65 3d 3d 44 42 5f 45 58 49 53 54 53 20 29 7b  ce==DB_EXISTS ){
b740: 0a 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20  .        pRet = 
b750: 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62  Tcl_NewBooleanOb
b760: 6a 28 30 29 3b 0a 20 20 20 20 20 20 20 20 54 63  j(0);.        Tc
b770: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
b780: 52 65 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Ret);.      }els
b790: 65 7b 0a 20 20 20 20 20 20 20 20 70 52 65 74 20  e{.        pRet 
b7a0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
b7b0: 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d   }.    if( objc=
b7c0: 3d 33 20 29 7b 0a 20 20 20 20 20 20 70 41 72 72  =3 ){.      pArr
b7d0: 61 79 20 3d 20 70 53 63 72 69 70 74 20 3d 20 30  ay = pScript = 0
b7e0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
b7f0: 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20  objc==4 ){.     
b800: 20 70 41 72 72 61 79 20 3d 20 30 3b 0a 20 20 20   pArray = 0;.   
b810: 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62 6a     pScript = obj
b820: 76 5b 33 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  v[3];.    }else{
b830: 0a 20 20 20 20 20 20 70 41 72 72 61 79 20 3d 20  .      pArray = 
b840: 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20 20 20 69  objv[3];.      i
b850: 66 28 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  f( Tcl_GetString
b860: 28 70 41 72 72 61 79 29 5b 30 5d 3d 3d 30 20 29  (pArray)[0]==0 )
b870: 20 70 41 72 72 61 79 20 3d 20 30 3b 0a 20 20 20   pArray = 0;.   
b880: 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62 6a     pScript = obj
b890: 76 5b 34 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  v[4];.    }..   
b8a0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
b8b0: 74 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20  t(objv[2]);.    
b8c0: 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74  zSql = Tcl_GetSt
b8d0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
b8e0: 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20 77 68 69  [2], 0);.    whi
b8f0: 6c 65 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 26  le( rc==TCL_OK &
b900: 26 20 7a 53 71 6c 5b 30 5d 20 29 7b 0a 20 20 20  & zSql[0] ){.   
b910: 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
b920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b930: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
b940: 0a 20 20 20 20 20 20 69 6e 74 20 6e 56 61 72 3b  .      int nVar;
b950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b960: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
b970: 69 6e 64 20 70 61 72 61 6d 65 74 65 72 73 20 69  ind parameters i
b980: 6e 20 74 68 65 20 70 53 74 6d 74 20 2a 2f 0a 20  n the pStmt */. 
b990: 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20       int nCol;  
b9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9b0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
b9c0: 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75  umns in the resu
b9d0: 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 20 20  lt set */.      
b9e0: 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 43 6f 6c 4e  Tcl_Obj **apColN
b9f0: 61 6d 65 20 3d 20 30 3b 20 20 20 2f 2a 20 41 72  ame = 0;   /* Ar
ba00: 72 61 79 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61  ray of column na
ba10: 6d 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  mes */.      int
ba20: 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20   len;           
ba30: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69 6e          /* Strin
ba40: 67 20 6c 65 6e 67 74 68 20 6f 66 20 7a 53 71 6c  g length of zSql
ba50: 20 2a 2f 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20   */.  .      /* 
ba60: 54 72 79 20 74 6f 20 66 69 6e 64 20 61 20 53 51  Try to find a SQ
ba70: 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  L statement that
ba80: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
ba90: 6e 20 63 6f 6d 70 69 6c 65 64 20 61 6e 64 0a 20  n compiled and. 
baa0: 20 20 20 20 20 2a 2a 20 77 68 69 63 68 20 6d 61       ** which ma
bab0: 74 63 68 65 73 20 74 68 65 20 6e 65 78 74 20 73  tches the next s
bac0: 65 71 75 65 6e 63 65 20 6f 66 20 53 51 4c 2e 0a  equence of SQL..
bad0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
bae0: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
baf0: 70 50 72 65 53 74 6d 74 20 3d 20 70 44 62 2d 3e  pPreStmt = pDb->
bb00: 73 74 6d 74 4c 69 73 74 3b 0a 20 20 20 20 20 20  stmtList;.      
bb10: 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 53 71  len = strlen(zSq
bb20: 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  l);.      if( pP
bb30: 72 65 53 74 6d 74 20 26 26 20 73 71 6c 69 74 65  reStmt && sqlite
bb40: 33 5f 65 78 70 69 72 65 64 28 70 50 72 65 53 74  3_expired(pPreSt
bb50: 6d 74 2d 3e 70 53 74 6d 74 29 20 29 7b 0a 20 20  mt->pStmt) ){.  
bb60: 20 20 20 20 20 20 66 6c 75 73 68 53 74 6d 74 43        flushStmtC
bb70: 61 63 68 65 28 70 44 62 29 3b 0a 20 20 20 20 20  ache(pDb);.     
bb80: 20 20 20 70 50 72 65 53 74 6d 74 20 3d 20 30 3b     pPreStmt = 0;
bb90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
bba0: 6f 72 28 3b 20 70 50 72 65 53 74 6d 74 3b 20 70  or(; pPreStmt; p
bbb0: 50 72 65 53 74 6d 74 3d 70 50 72 65 53 74 6d 74  PreStmt=pPreStmt
bbc0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
bbd0: 20 20 69 6e 74 20 6e 20 3d 20 70 50 72 65 53 74    int n = pPreSt
bbe0: 6d 74 2d 3e 6e 53 71 6c 3b 0a 20 20 20 20 20 20  mt->nSql;.      
bbf0: 20 20 69 66 28 20 6c 65 6e 3e 3d 6e 20 0a 20 20    if( len>=n .  
bc00: 20 20 20 20 20 20 20 20 20 20 26 26 20 6d 65 6d            && mem
bc10: 63 6d 70 28 70 50 72 65 53 74 6d 74 2d 3e 7a 53  cmp(pPreStmt->zS
bc20: 71 6c 2c 20 7a 53 71 6c 2c 20 6e 29 3d 3d 30 0a  ql, zSql, n)==0.
bc30: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
bc40: 7a 53 71 6c 5b 6e 5d 3d 3d 30 20 7c 7c 20 7a 53  zSql[n]==0 || zS
bc50: 71 6c 5b 6e 2d 31 5d 3d 3d 27 3b 27 29 0a 20 20  ql[n-1]==';').  
bc60: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
bc70: 20 20 20 70 53 74 6d 74 20 3d 20 70 50 72 65 53     pStmt = pPreS
bc80: 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20  tmt->pStmt;.    
bc90: 20 20 20 20 20 20 7a 4c 65 66 74 20 3d 20 26 7a        zLeft = &z
bca0: 53 71 6c 5b 70 50 72 65 53 74 6d 74 2d 3e 6e 53  Sql[pPreStmt->nS
bcb0: 71 6c 5d 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  ql];..          
bcc0: 2f 2a 20 57 68 65 6e 20 61 20 70 72 65 70 61 72  /* When a prepar
bcd0: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  ed statement is 
bce0: 66 6f 75 6e 64 2c 20 75 6e 6c 69 6e 6b 20 69 74  found, unlink it
bcf0: 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 20 20   from the.      
bd00: 20 20 20 20 2a 2a 20 63 61 63 68 65 20 6c 69 73      ** cache lis
bd10: 74 2e 20 20 49 74 20 77 69 6c 6c 20 6c 61 74 65  t.  It will late
bd20: 72 20 62 65 20 61 64 64 65 64 20 62 61 63 6b 20  r be added back 
bd30: 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
bd40: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  .          ** of
bd50: 20 74 68 65 20 63 61 63 68 65 20 6c 69 73 74 20   the cache list 
bd60: 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6d 70 6c  in order to impl
bd70: 65 6d 65 6e 74 20 4c 52 55 20 72 65 70 6c 61 63  ement LRU replac
bd80: 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 20 20 20  ement..         
bd90: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
bda0: 28 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65  ( pPreStmt->pPre
bdb0: 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  v ){.           
bdc0: 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76   pPreStmt->pPrev
bdd0: 2d 3e 70 4e 65 78 74 20 3d 20 70 50 72 65 53 74  ->pNext = pPreSt
bde0: 6d 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  mt->pNext;.     
bdf0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
be00: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d          pDb->stm
be10: 74 4c 69 73 74 20 3d 20 70 50 72 65 53 74 6d 74  tList = pPreStmt
be20: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
be30: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
be40: 66 28 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65  f( pPreStmt->pNe
be50: 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  xt ){.          
be60: 20 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78    pPreStmt->pNex
be70: 74 2d 3e 70 50 72 65 76 20 3d 20 70 50 72 65 53  t->pPrev = pPreS
be80: 74 6d 74 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20  tmt->pPrev;.    
be90: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
bea0: 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73 74           pDb->st
beb0: 6d 74 4c 61 73 74 20 3d 20 70 50 72 65 53 74 6d  mtLast = pPreStm
bec0: 74 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20  t->pPrev;.      
bed0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
bee0: 70 44 62 2d 3e 6e 53 74 6d 74 2d 2d 3b 0a 20 20  pDb->nStmt--;.  
bef0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
bf00: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
bf10: 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  .  .      /* If 
bf20: 6e 6f 20 70 72 65 70 61 72 65 64 20 73 74 61 74  no prepared stat
bf30: 65 6d 65 6e 74 20 77 61 73 20 66 6f 75 6e 64 2e  ement was found.
bf40: 20 20 43 6f 6d 70 69 6c 65 20 74 68 65 20 53 51    Compile the SQ
bf50: 4c 20 74 65 78 74 0a 20 20 20 20 20 20 2a 2f 0a  L text.      */.
bf60: 20 20 20 20 20 20 69 66 28 20 70 53 74 6d 74 3d        if( pStmt=
bf70: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
bf80: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
bf90: 69 74 65 33 5f 70 72 65 70 61 72 65 28 70 44 62  ite3_prepare(pDb
bfa0: 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  ->db, zSql, -1, 
bfb0: 26 70 53 74 6d 74 2c 20 26 7a 4c 65 66 74 29 20  &pStmt, &zLeft) 
bfc0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  ){.          Tcl
bfd0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
bfe0: 74 65 72 70 2c 20 64 62 54 65 78 74 54 6f 4f 62  terp, dbTextToOb
bff0: 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  j(sqlite3_errmsg
c000: 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20  (pDb->db)));.   
c010: 20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f         rc = TCL_
c020: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20  ERROR;.         
c030: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
c040: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53  }.        if( pS
c050: 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tmt==0 ){.      
c060: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
c070: 4b 21 3d 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  K!=sqlite3_errco
c080: 64 65 28 70 44 62 2d 3e 64 62 29 20 29 7b 0a 20  de(pDb->db) ){. 
c090: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
c0a0: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 65 72 72  compile-time err
c0b0: 6f 72 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  or in the statem
c0c0: 65 6e 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  ent.            
c0d0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 54  */.            T
c0e0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
c0f0: 69 6e 74 65 72 70 2c 20 64 62 54 65 78 74 54 6f  interp, dbTextTo
c100: 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 6d  Obj(sqlite3_errm
c110: 73 67 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20  sg(pDb->db)));. 
c120: 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
c130: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
c140: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
c150: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
c160: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
c170: 65 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20  e statement was 
c180: 61 20 6e 6f 2d 6f 70 2e 20 20 43 6f 6e 74 69 6e  a no-op.  Contin
c190: 75 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  ue to the next s
c1a0: 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 20  tatement.       
c1b0: 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 53       ** in the S
c1c0: 51 4c 20 73 74 72 69 6e 67 2e 0a 20 20 20 20 20  QL string..     
c1d0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
c1e0: 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 7a 4c 65        zSql = zLe
c1f0: 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ft;.            
c200: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
c210: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
c220: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
c230: 70 50 72 65 53 74 6d 74 3d 3d 30 20 29 3b 0a 20  pPreStmt==0 );. 
c240: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
c250: 20 42 69 6e 64 20 76 61 6c 75 65 73 20 74 6f 20   Bind values to 
c260: 70 61 72 61 6d 65 74 65 72 73 20 74 68 61 74 20  parameters that 
c270: 62 65 67 69 6e 20 77 69 74 68 20 24 20 6f 72 20  begin with $ or 
c280: 3a 0a 20 20 20 20 20 20 2a 2f 20 20 0a 20 20 20  :.      */  .   
c290: 20 20 20 6e 56 61 72 20 3d 20 73 71 6c 69 74 65     nVar = sqlite
c2a0: 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
c2b0: 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20  _count(pStmt);. 
c2c0: 20 20 20 20 20 6e 50 61 72 6d 20 3d 20 30 3b 0a       nParm = 0;.
c2d0: 20 20 20 20 20 20 69 66 28 20 6e 56 61 72 3e 73        if( nVar>s
c2e0: 69 7a 65 6f 66 28 61 50 61 72 6d 29 2f 73 69 7a  izeof(aParm)/siz
c2f0: 65 6f 66 28 61 50 61 72 6d 5b 30 5d 29 20 29 7b  eof(aParm[0]) ){
c300: 0a 20 20 20 20 20 20 20 20 61 70 50 61 72 6d 20  .        apParm 
c310: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 2a 29 54 63 6c  = (Tcl_Obj**)Tcl
c320: 5f 41 6c 6c 6f 63 28 6e 56 61 72 2a 73 69 7a 65  _Alloc(nVar*size
c330: 6f 66 28 61 70 50 61 72 6d 5b 30 5d 29 29 3b 0a  of(apParm[0]));.
c340: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
c350: 20 20 20 20 20 61 70 50 61 72 6d 20 3d 20 61 50       apParm = aP
c360: 61 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  arm;.      }.   
c370: 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e     for(i=1; i<=n
c380: 56 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Var; i++){.     
c390: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
c3a0: 56 61 72 20 3d 20 73 71 6c 69 74 65 33 5f 62 69  Var = sqlite3_bi
c3b0: 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d  nd_parameter_nam
c3c0: 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20  e(pStmt, i);.   
c3d0: 20 20 20 20 20 69 66 28 20 7a 56 61 72 21 3d 30       if( zVar!=0
c3e0: 20 26 26 20 28 7a 56 61 72 5b 30 5d 3d 3d 27 24   && (zVar[0]=='$
c3f0: 27 20 7c 7c 20 7a 56 61 72 5b 30 5d 3d 3d 27 3a  ' || zVar[0]==':
c400: 27 20 7c 7c 20 7a 56 61 72 5b 30 5d 3d 3d 27 40  ' || zVar[0]=='@
c410: 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ') ){.          
c420: 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 72 20 3d 20  Tcl_Obj *pVar = 
c430: 54 63 6c 5f 47 65 74 56 61 72 32 45 78 28 69 6e  Tcl_GetVar2Ex(in
c440: 74 65 72 70 2c 20 26 7a 56 61 72 5b 31 5d 2c 20  terp, &zVar[1], 
c450: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  0, 0);.         
c460: 20 69 66 28 20 70 56 61 72 20 29 7b 0a 20 20 20   if( pVar ){.   
c470: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a           int n;.
c480: 20 20 20 20 20 20 20 20 20 20 20 20 75 38 20 2a              u8 *
c490: 64 61 74 61 3b 0a 20 20 20 20 20 20 20 20 20 20  data;.          
c4a0: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20    char *zType = 
c4b0: 70 56 61 72 2d 3e 74 79 70 65 50 74 72 20 3f 20  pVar->typePtr ? 
c4c0: 70 56 61 72 2d 3e 74 79 70 65 50 74 72 2d 3e 6e  pVar->typePtr->n
c4d0: 61 6d 65 20 3a 20 22 22 3b 0a 20 20 20 20 20 20  ame : "";.      
c4e0: 20 20 20 20 20 20 63 68 61 72 20 63 20 3d 20 7a        char c = z
c4f0: 54 79 70 65 5b 30 5d 3b 0a 20 20 20 20 20 20 20  Type[0];.       
c500: 20 20 20 20 20 69 66 28 20 7a 56 61 72 5b 30 5d       if( zVar[0]
c510: 3d 3d 27 40 27 20 7c 7c 0a 20 20 20 20 20 20 20  =='@' ||.       
c520: 20 20 20 20 20 20 20 20 28 63 3d 3d 27 62 27 20          (c=='b' 
c530: 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c  && strcmp(zType,
c540: 22 62 79 74 65 61 72 72 61 79 22 29 3d 3d 30 20  "bytearray")==0 
c550: 26 26 20 70 56 61 72 2d 3e 62 79 74 65 73 3d 3d  && pVar->bytes==
c560: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0) ){.          
c570: 20 20 20 20 2f 2a 20 4c 6f 61 64 20 61 20 42 4c      /* Load a BL
c580: 4f 42 20 74 79 70 65 20 69 66 20 74 68 65 20 54  OB type if the T
c590: 63 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 61  cl variable is a
c5a0: 20 62 79 74 65 61 72 72 61 79 20 61 6e 64 0a 20   bytearray and. 
c5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
c5c0: 69 74 20 68 61 73 20 6e 6f 20 73 74 72 69 6e 67  it has no string
c5d0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
c5e0: 6f 72 20 74 68 65 20 68 6f 73 74 0a 20 20 20 20  or the host.    
c5f0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 72            ** par
c600: 61 6d 65 74 65 72 20 6e 61 6d 65 20 62 65 67 69  ameter name begi
c610: 6e 73 20 77 69 74 68 20 22 40 22 2e 20 2a 2f 0a  ns with "@". */.
c620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
c630: 74 61 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65  ta = Tcl_GetByte
c640: 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 70 56 61  ArrayFromObj(pVa
c650: 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20  r, &n);.        
c660: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
c670: 6e 64 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69  nd_blob(pStmt, i
c680: 2c 20 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54  , data, n, SQLIT
c690: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  E_STATIC);.     
c6a0: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63           Tcl_Inc
c6b0: 72 52 65 66 43 6f 75 6e 74 28 70 56 61 72 29 3b  rRefCount(pVar);
c6c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  .              a
c6d0: 70 50 61 72 6d 5b 6e 50 61 72 6d 2b 2b 5d 20 3d  pParm[nParm++] =
c6e0: 20 70 56 61 72 3b 0a 20 20 20 20 20 20 20 20 20   pVar;.         
c6f0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
c700: 27 62 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54  'b' && strcmp(zT
c710: 79 70 65 2c 22 62 6f 6f 6c 65 61 6e 22 29 3d 3d  ype,"boolean")==
c720: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
c730: 20 20 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f     Tcl_GetIntFro
c740: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 56 61  mObj(interp, pVa
c750: 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20  r, &n);.        
c760: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
c770: 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20 69 2c  nd_int(pStmt, i,
c780: 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   n);.           
c790: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 64   }else if( c=='d
c7a0: 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70  ' && strcmp(zTyp
c7b0: 65 2c 22 64 6f 75 62 6c 65 22 29 3d 3d 30 20 29  e,"double")==0 )
c7c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
c7d0: 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20 20 20  double r;.      
c7e0: 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 44          Tcl_GetD
c7f0: 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e 74  oubleFromObj(int
c800: 65 72 70 2c 20 70 56 61 72 2c 20 26 72 29 3b 0a  erp, pVar, &r);.
c810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
c820: 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c  lite3_bind_doubl
c830: 65 28 70 53 74 6d 74 2c 20 69 2c 20 72 29 3b 0a  e(pStmt, i, r);.
c840: 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
c850: 65 20 69 66 28 20 28 63 3d 3d 27 77 27 20 26 26  e if( (c=='w' &&
c860: 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 77   strcmp(zType,"w
c870: 69 64 65 49 6e 74 22 29 3d 3d 30 29 20 7c 7c 0a  ideInt")==0) ||.
c880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c890: 20 20 28 63 3d 3d 27 69 27 20 26 26 20 73 74 72    (c=='i' && str
c8a0: 63 6d 70 28 7a 54 79 70 65 2c 22 69 6e 74 22 29  cmp(zType,"int")
c8b0: 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ==0) ){.        
c8c0: 20 20 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e        Tcl_WideIn
c8d0: 74 20 76 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t v;.           
c8e0: 20 20 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e     Tcl_GetWideIn
c8f0: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
c900: 20 70 56 61 72 2c 20 26 76 29 3b 0a 20 20 20 20   pVar, &v);.    
c910: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
c920: 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74  3_bind_int64(pSt
c930: 6d 74 2c 20 69 2c 20 76 29 3b 0a 20 20 20 20 20  mt, i, v);.     
c940: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
c950: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
c960: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
c970: 72 20 2a 29 54 63 6c 5f 47 65 74 53 74 72 69 6e  r *)Tcl_GetStrin
c980: 67 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26  gFromObj(pVar, &
c990: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
c9a0: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74    sqlite3_bind_t
c9b0: 65 78 74 28 70 53 74 6d 74 2c 20 69 2c 20 28 63  ext(pStmt, i, (c
c9c0: 68 61 72 20 2a 29 64 61 74 61 2c 20 6e 2c 20 53  har *)data, n, S
c9d0: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
c9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c               Tcl
c9f0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 56  _IncrRefCount(pV
ca00: 61 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ar);.           
ca10: 20 20 20 61 70 50 61 72 6d 5b 6e 50 61 72 6d 2b     apParm[nParm+
ca20: 2b 5d 20 3d 20 70 56 61 72 3b 0a 20 20 20 20 20  +] = pVar;.     
ca30: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ca40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ca50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
ca60: 6e 64 5f 6e 75 6c 6c 28 20 70 53 74 6d 74 2c 20  nd_null( pStmt, 
ca70: 69 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  i );.          }
ca80: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ca90: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6d   }..      /* Com
caa0: 70 75 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  pute column name
cab0: 73 20 2a 2f 0a 20 20 20 20 20 20 6e 43 6f 6c 20  s */.      nCol 
cac0: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
cad0: 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20  _count(pStmt);. 
cae0: 20 20 20 20 20 69 66 28 20 70 53 63 72 69 70 74       if( pScript
caf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70 43 6f   ){.        apCo
cb00: 6c 4e 61 6d 65 20 3d 20 28 54 63 6c 5f 4f 62 6a  lName = (Tcl_Obj
cb10: 2a 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69  **)Tcl_Alloc( si
cb20: 7a 65 6f 66 28 54 63 6c 5f 4f 62 6a 2a 29 2a 6e  zeof(Tcl_Obj*)*n
cb30: 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 69  Col );.        i
cb40: 66 28 20 61 70 43 6f 6c 4e 61 6d 65 3d 3d 30 20  f( apColName==0 
cb50: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
cb60: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
cb70: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
cb80: 20 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 20 3d    apColName[i] =
cb90: 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c   dbTextToObj(sql
cba0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65  ite3_column_name
cbb0: 28 70 53 74 6d 74 2c 69 29 29 3b 0a 20 20 20 20  (pStmt,i));.    
cbc0: 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65        Tcl_IncrRe
cbd0: 66 43 6f 75 6e 74 28 61 70 43 6f 6c 4e 61 6d 65  fCount(apColName
cbe0: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  [i]);.        }.
cbf0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
cc00: 2a 20 49 66 20 72 65 73 75 6c 74 73 20 61 72 65  * If results are
cc10: 20 62 65 69 6e 67 20 73 74 6f 72 65 64 20 69 6e   being stored in
cc20: 20 61 6e 20 61 72 72 61 79 20 76 61 72 69 61 62   an array variab
cc30: 6c 65 2c 20 74 68 65 6e 20 63 72 65 61 74 65 0a  le, then create.
cc40: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 61 72 72        ** the arr
cc50: 61 79 28 2a 29 20 65 6e 74 72 79 20 66 6f 72 20  ay(*) entry for 
cc60: 74 68 61 74 20 61 72 72 61 79 0a 20 20 20 20 20  that array.     
cc70: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41   */.      if( pA
cc80: 72 72 61 79 20 29 7b 0a 20 20 20 20 20 20 20 20  rray ){.        
cc90: 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f 6c 4c 69 73  Tcl_Obj *pColLis
cca0: 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29  t = Tcl_NewObj()
ccb0: 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62  ;.        Tcl_Ob
ccc0: 6a 20 2a 70 53 74 61 72 20 3d 20 54 63 6c 5f 4e  j *pStar = Tcl_N
ccd0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 2a 22 2c  ewStringObj("*",
cce0: 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 54 63   -1);.        Tc
ccf0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
cd00: 43 6f 6c 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  ColList);.      
cd10: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
cd20: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
cd30: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
cd40: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
cd50: 72 70 2c 20 70 43 6f 6c 4c 69 73 74 2c 20 61 70  rp, pColList, ap
cd60: 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20  ColName[i]);.   
cd70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54       }.        T
cd80: 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e  cl_ObjSetVar2(in
cd90: 74 65 72 70 2c 20 70 41 72 72 61 79 2c 20 70 53  terp, pArray, pS
cda0: 74 61 72 2c 20 70 43 6f 6c 4c 69 73 74 2c 30 29  tar, pColList,0)
cdb0: 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65  ;.        Tcl_De
cdc0: 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6f 6c 4c  crRefCount(pColL
cdd0: 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  ist);.      }.. 
cde0: 20 20 20 20 20 2f 2a 20 45 78 65 63 75 74 65 20       /* Execute 
cdf0: 74 68 65 20 53 51 4c 0a 20 20 20 20 20 20 2a 2f  the SQL.      */
ce00: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 72 63  .      while( rc
ce10: 3d 3d 54 43 4c 5f 4f 4b 20 26 26 20 70 53 74 6d  ==TCL_OK && pStm
ce20: 74 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d  t && SQLITE_ROW=
ce30: 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
ce40: 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  tmt) ){.        
ce50: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
ce60: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
ce70: 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b 0a   Tcl_Obj *pVal;.
ce80: 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20            .     
ce90: 20 20 20 20 20 2f 2a 20 53 65 74 20 70 56 61 6c       /* Set pVal
cea0: 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
ceb0: 69 27 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  i'th column of t
cec0: 68 69 73 20 72 6f 77 2e 20 2a 2f 0a 20 20 20 20  his row. */.    
ced0: 20 20 20 20 20 20 73 77 69 74 63 68 28 20 73 71        switch( sq
cee0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70  lite3_column_typ
cef0: 65 28 70 53 74 6d 74 2c 20 69 29 20 29 7b 0a 20  e(pStmt, i) ){. 
cf00: 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20             case 
cf10: 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20  SQLITE_BLOB: {. 
cf20: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
cf30: 20 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33   bytes = sqlite3
cf40: 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53  _column_bytes(pS
cf50: 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  tmt, i);.       
cf60: 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63         pVal = Tc
cf70: 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62  l_NewByteArrayOb
cf80: 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  j(sqlite3_column
cf90: 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69 29 2c  _blob(pStmt, i),
cfa0: 20 62 79 74 65 73 29 3b 0a 20 20 20 20 20 20 20   bytes);.       
cfb0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
cfc0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
cfd0: 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
cfe0: 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20  ITE_INTEGER: {. 
cff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
d000: 69 74 65 5f 69 6e 74 36 34 20 76 20 3d 20 73 71  ite_int64 v = sq
d010: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
d020: 36 34 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20  64(pStmt, i);.  
d030: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
d040: 76 3e 3d 2d 32 31 34 37 34 38 33 36 34 37 20 26  v>=-2147483647 &
d050: 26 20 76 3c 3d 32 31 34 37 34 38 33 36 34 37 20  & v<=2147483647 
d060: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
d070: 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65     pVal = Tcl_Ne
d080: 77 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20  wIntObj(v);.    
d090: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
d0a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d0b0: 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 57   pVal = Tcl_NewW
d0c0: 69 64 65 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20  ideIntObj(v);.  
d0d0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
d0e0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
d0f0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
d100: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73  .            cas
d110: 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20  e SQLITE_FLOAT: 
d120: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
d130: 64 6f 75 62 6c 65 20 72 20 3d 20 73 71 6c 69 74  double r = sqlit
d140: 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65  e3_column_double
d150: 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  (pStmt, i);.    
d160: 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d            pVal =
d170: 20 54 63 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f 62   Tcl_NewDoubleOb
d180: 6a 28 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  j(r);.          
d190: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
d1a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d1b0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
d1c0: 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20  _NULL: {.       
d1d0: 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 64 62         pVal = db
d1e0: 54 65 78 74 54 6f 4f 62 6a 28 70 44 62 2d 3e 7a  TextToObj(pDb->z
d1f0: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  Null);.         
d200: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d210: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d220: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b        default: {
d230: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
d240: 56 61 6c 20 3d 20 64 62 54 65 78 74 54 6f 4f 62  Val = dbTextToOb
d250: 6a 28 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  j((char *)sqlite
d260: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
d270: 74 6d 74 2c 20 69 29 29 3b 0a 20 20 20 20 20 20  tmt, i));.      
d280: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
d290: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
d2a0: 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20         }.  .    
d2b0: 20 20 20 20 20 20 69 66 28 20 70 53 63 72 69 70        if( pScrip
d2c0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
d2d0: 20 69 66 28 20 70 41 72 72 61 79 3d 3d 30 20 29   if( pArray==0 )
d2e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
d2f0: 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69  Tcl_ObjSetVar2(i
d300: 6e 74 65 72 70 2c 20 61 70 43 6f 6c 4e 61 6d 65  nterp, apColName
d310: 5b 69 5d 2c 20 30 2c 20 70 56 61 6c 2c 20 30 29  [i], 0, pVal, 0)
d320: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
d330: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
d340: 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72     Tcl_ObjSetVar
d350: 32 28 69 6e 74 65 72 70 2c 20 70 41 72 72 61 79  2(interp, pArray
d360: 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20  , apColName[i], 
d370: 70 56 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  pVal, 0);.      
d380: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d390: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 68 6f 69    }else if( choi
d3a0: 63 65 3d 3d 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e  ce==DB_ONECOLUMN
d3b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
d3c0: 61 73 73 65 72 74 28 20 70 52 65 74 3d 3d 30 20  assert( pRet==0 
d3d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
d3e0: 66 28 20 70 52 65 74 3d 3d 30 20 29 7b 0a 20 20  f( pRet==0 ){.  
d3f0: 20 20 20 20 20 20 20 20 20 20 20 20 70 52 65 74              pRet
d400: 20 3d 20 70 56 61 6c 3b 0a 20 20 20 20 20 20 20   = pVal;.       
d410: 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52         Tcl_IncrR
d420: 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20  efCount(pRet);. 
d430: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
d440: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 43           rc = TC
d450: 4c 5f 42 52 45 41 4b 3b 0a 20 20 20 20 20 20 20  L_BREAK;.       
d460: 20 20 20 20 20 69 20 3d 20 6e 43 6f 6c 3b 0a 20       i = nCol;. 
d470: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
d480: 66 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f 45 58  f( choice==DB_EX
d490: 49 53 54 53 20 29 7b 0a 20 20 20 20 20 20 20 20  ISTS ){.        
d4a0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
d4b0: 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20  ount(pRet);.    
d4c0: 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 54          pRet = T
d4d0: 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a  cl_NewBooleanObj
d4e0: 28 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (1);.           
d4f0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
d500: 74 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20 20  t(pRet);.       
d510: 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 42 52       rc = TCL_BR
d520: 45 41 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  EAK;.           
d530: 20 69 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 20   i = nCol;.     
d540: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
d550: 20 20 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74          Tcl_List
d560: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
d570: 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 70  (interp, pRet, p
d580: 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Val);.          
d590: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20  }.        }.  . 
d5a0: 20 20 20 20 20 20 20 69 66 28 20 70 53 63 72 69         if( pScri
d5b0: 70 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  pt ){.          
d5c0: 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  rc = Tcl_EvalObj
d5d0: 45 78 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69  Ex(interp, pScri
d5e0: 70 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  pt, 0);.        
d5f0: 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 43 4f    if( rc==TCL_CO
d600: 4e 54 49 4e 55 45 20 29 7b 0a 20 20 20 20 20 20  NTINUE ){.      
d610: 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f        rc = TCL_O
d620: 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  K;.          }. 
d630: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
d640: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 54  .      if( rc==T
d650: 43 4c 5f 42 52 45 41 4b 20 29 7b 0a 20 20 20 20  CL_BREAK ){.    
d660: 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b      rc = TCL_OK;
d670: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
d680: 2f 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6c 75  /* Free the colu
d690: 6d 6e 20 6e 61 6d 65 20 6f 62 6a 65 63 74 73 20  mn name objects 
d6a0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 53 63  */.      if( pSc
d6b0: 72 69 70 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ript ){.        
d6c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
d6d0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
d6e0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
d6f0: 74 28 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b  t(apColName[i]);
d700: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d710: 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61     Tcl_Free((cha
d720: 72 2a 29 61 70 43 6f 6c 4e 61 6d 65 29 3b 0a 20  r*)apColName);. 
d730: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
d740: 20 46 72 65 65 20 74 68 65 20 62 6f 75 6e 64 20   Free the bound 
d750: 73 74 72 69 6e 67 20 61 6e 64 20 62 6c 6f 62 20  string and blob 
d760: 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20  parameters */.  
d770: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
d780: 50 61 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Parm; i++){.    
d790: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
d7a0: 6f 75 6e 74 28 61 70 50 61 72 6d 5b 69 5d 29 3b  ount(apParm[i]);
d7b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
d7c0: 66 28 20 61 70 50 61 72 6d 21 3d 61 50 61 72 6d  f( apParm!=aParm
d7d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
d7e0: 46 72 65 65 28 28 63 68 61 72 2a 29 61 70 50 61  Free((char*)apPa
d7f0: 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  rm);.      }..  
d800: 20 20 20 20 2f 2a 20 52 65 73 65 74 20 74 68 65      /* Reset the
d810: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 66 20   statement.  If 
d820: 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 20  the result code 
d830: 69 73 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41  is SQLITE_SCHEMA
d840: 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  , then.      ** 
d850: 66 6c 75 73 68 20 74 68 65 20 73 74 61 74 65 6d  flush the statem
d860: 65 6e 74 20 63 61 63 68 65 20 61 6e 64 20 74 72  ent cache and tr
d870: 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  y the statement 
d880: 61 67 61 69 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  again..      */.
d890: 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69        rc2 = sqli
d8a0: 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29  te3_reset(pStmt)
d8b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  ;.      if( SQLI
d8c0: 54 45 5f 53 43 48 45 4d 41 3d 3d 72 63 32 20 29  TE_SCHEMA==rc2 )
d8d0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 66 74  {.        /* Aft
d8e0: 65 72 20 61 20 73 63 68 65 6d 61 20 63 68 61 6e  er a schema chan
d8f0: 67 65 2c 20 66 6c 75 73 68 20 74 68 65 20 63 61  ge, flush the ca
d900: 63 68 65 20 61 6e 64 20 74 72 79 20 74 6f 20 72  che and try to r
d910: 75 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  un the.        *
d920: 2a 20 73 74 61 74 65 6d 65 6e 74 20 61 67 61 69  * statement agai
d930: 6e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  n.        */.   
d940: 20 20 20 20 20 66 6c 75 73 68 53 74 6d 74 43 61       flushStmtCa
d950: 63 68 65 28 20 70 44 62 20 29 3b 0a 20 20 20 20  che( pDb );.    
d960: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
d970: 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
d980: 20 20 20 20 20 69 66 28 20 70 50 72 65 53 74 6d       if( pPreStm
d990: 74 20 29 20 54 63 6c 5f 46 72 65 65 28 28 63 68  t ) Tcl_Free((ch
d9a0: 61 72 2a 29 70 50 72 65 53 74 6d 74 29 3b 0a 20  ar*)pPreStmt);. 
d9b0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
d9c0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
d9d0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 32 20   SQLITE_OK!=rc2 
d9e0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
d9f0: 20 61 20 72 75 6e 2d 74 69 6d 65 20 65 72 72 6f   a run-time erro
da00: 72 20 6f 63 63 75 72 73 2c 20 72 65 70 6f 72 74  r occurs, report
da10: 20 74 68 65 20 65 72 72 6f 72 20 61 6e 64 20 73   the error and s
da20: 74 6f 70 20 72 65 61 64 69 6e 67 0a 20 20 20 20  top reading.    
da30: 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 0a 20      ** the SQL. 
da40: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
da50: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
da60: 6c 74 28 69 6e 74 65 72 70 2c 20 64 62 54 65 78  lt(interp, dbTex
da70: 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65  tToObj(sqlite3_e
da80: 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 29 29  rrmsg(pDb->db)))
da90: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
daa0: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
dab0: 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
dac0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
dad0: 20 20 20 69 66 28 20 70 50 72 65 53 74 6d 74 20     if( pPreStmt 
dae0: 29 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72  ) Tcl_Free((char
daf0: 2a 29 70 50 72 65 53 74 6d 74 29 3b 0a 20 20 20  *)pPreStmt);.   
db00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
db10: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 44 62 2d    }else if( pDb-
db20: 3e 6d 61 78 53 74 6d 74 3c 3d 30 20 29 7b 0a 20  >maxStmt<=0 ){. 
db30: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
db40: 20 63 61 63 68 65 20 69 73 20 74 75 72 6e 65 64   cache is turned
db50: 20 6f 66 66 2c 20 64 65 61 6c 6c 6f 63 61 74 65   off, deallocate
db60: 64 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  d the statement 
db70: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
db80: 50 72 65 53 74 6d 74 20 29 20 54 63 6c 5f 46 72  PreStmt ) Tcl_Fr
db90: 65 65 28 28 63 68 61 72 2a 29 70 50 72 65 53 74  ee((char*)pPreSt
dba0: 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  mt);.        sql
dbb0: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
dbc0: 74 6d 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  tmt);.      }els
dbd0: 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 76  e{.        /* Ev
dbe0: 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 20  erything worked 
dbf0: 61 6e 64 20 74 68 65 20 63 61 63 68 65 20 69 73  and the cache is
dc00: 20 6f 70 65 72 61 74 69 6f 6e 61 6c 2e 0a 20 20   operational..  
dc10: 20 20 20 20 20 20 2a 2a 20 43 72 65 61 74 65 20        ** Create 
dc20: 61 20 6e 65 77 20 53 71 6c 50 72 65 70 61 72 65  a new SqlPrepare
dc30: 64 53 74 6d 74 20 73 74 72 75 63 74 75 72 65 20  dStmt structure 
dc40: 69 66 20 77 65 20 6e 65 65 64 20 6f 6e 65 2e 0a  if we need one..
dc50: 20 20 20 20 20 20 20 20 2a 2a 20 28 49 66 20 77          ** (If w
dc60: 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 6f  e already have o
dc70: 6e 65 20 77 65 20 63 61 6e 20 6a 75 73 74 20 72  ne we can just r
dc80: 65 75 73 65 20 69 74 2e 29 0a 20 20 20 20 20 20  euse it.).      
dc90: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
dca0: 20 70 50 72 65 53 74 6d 74 3d 3d 30 20 29 7b 0a   pPreStmt==0 ){.
dcb0: 20 20 20 20 20 20 20 20 20 20 6c 65 6e 20 3d 20            len = 
dcc0: 7a 4c 65 66 74 20 2d 20 7a 53 71 6c 3b 0a 20 20  zLeft - zSql;.  
dcd0: 20 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74          pPreStmt
dce0: 20 3d 20 28 53 71 6c 50 72 65 70 61 72 65 64 53   = (SqlPreparedS
dcf0: 74 6d 74 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20  tmt*)Tcl_Alloc( 
dd00: 73 69 7a 65 6f 66 28 2a 70 50 72 65 53 74 6d 74  sizeof(*pPreStmt
dd10: 29 20 2b 20 6c 65 6e 20 29 3b 0a 20 20 20 20 20  ) + len );.     
dd20: 20 20 20 20 20 69 66 28 20 70 50 72 65 53 74 6d       if( pPreStm
dd30: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 54 43  t==0 ) return TC
dd40: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  L_ERROR;.       
dd50: 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70 53 74     pPreStmt->pSt
dd60: 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20 20 20  mt = pStmt;.    
dd70: 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e        pPreStmt->
dd80: 6e 53 71 6c 20 3d 20 6c 65 6e 3b 0a 20 20 20 20  nSql = len;.    
dd90: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 72        memcpy(pPr
dda0: 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c 20 7a 53 71  eStmt->zSql, zSq
ddb0: 6c 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 20 20 20  l, len);.       
ddc0: 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71     pPreStmt->zSq
ddd0: 6c 5b 6c 65 6e 5d 20 3d 20 30 3b 0a 20 20 20 20  l[len] = 0;.    
dde0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
ddf0: 2a 20 41 64 64 20 74 68 65 20 70 72 65 70 61 72  * Add the prepar
de00: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  ed statement to 
de10: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
de20: 20 74 68 65 20 63 61 63 68 65 20 6c 69 73 74 0a   the cache list.
de30: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
de40: 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65     pPreStmt->pNe
de50: 78 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69  xt = pDb->stmtLi
de60: 73 74 3b 0a 20 20 20 20 20 20 20 20 70 50 72 65  st;.        pPre
de70: 53 74 6d 74 2d 3e 70 50 72 65 76 20 3d 20 30 3b  Stmt->pPrev = 0;
de80: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 44 62  .        if( pDb
de90: 2d 3e 73 74 6d 74 4c 69 73 74 20 29 7b 0a 20 20  ->stmtList ){.  
dea0: 20 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74         pDb->stmt
deb0: 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d 20 70 50  List->pPrev = pP
dec0: 72 65 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20  reStmt;.        
ded0: 7d 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73  }.        pDb->s
dee0: 74 6d 74 4c 69 73 74 20 3d 20 70 50 72 65 53 74  tmtList = pPreSt
def0: 6d 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  mt;.        if( 
df00: 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 3d 3d 30  pDb->stmtLast==0
df10: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
df20: 73 65 72 74 28 20 70 44 62 2d 3e 6e 53 74 6d 74  sert( pDb->nStmt
df30: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
df40: 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d   pDb->stmtLast =
df50: 20 70 50 72 65 53 74 6d 74 3b 0a 20 20 20 20 20   pPreStmt;.     
df60: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
df70: 20 20 20 20 61 73 73 65 72 74 28 20 70 44 62 2d      assert( pDb-
df80: 3e 6e 53 74 6d 74 3e 30 20 29 3b 0a 20 20 20 20  >nStmt>0 );.    
df90: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 44      }.        pD
dfa0: 62 2d 3e 6e 53 74 6d 74 2b 2b 3b 0a 20 20 20 0a  b->nStmt++;.   .
dfb0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65          /* If we
dfc0: 20 68 61 76 65 20 74 6f 6f 20 6d 61 6e 79 20 73   have too many s
dfd0: 74 61 74 65 6d 65 6e 74 20 69 6e 20 63 61 63 68  tatement in cach
dfe0: 65 2c 20 72 65 6d 6f 76 65 20 74 68 65 20 73 75  e, remove the su
dff0: 72 70 6c 75 73 20 66 72 6f 6d 20 74 68 65 0a 20  rplus from the. 
e000: 20 20 20 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66         ** end of
e010: 20 74 68 65 20 63 61 63 68 65 20 6c 69 73 74 2e   the cache list.
e020: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
e030: 20 20 20 20 77 68 69 6c 65 28 20 70 44 62 2d 3e      while( pDb->
e040: 6e 53 74 6d 74 3e 70 44 62 2d 3e 6d 61 78 53 74  nStmt>pDb->maxSt
e050: 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mt ){.          
e060: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
e070: 28 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e  (pDb->stmtLast->
e080: 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  pStmt);.        
e090: 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20    pDb->stmtLast 
e0a0: 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 2d  = pDb->stmtLast-
e0b0: 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20 20 20  >pPrev;.        
e0c0: 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72    Tcl_Free((char
e0d0: 2a 29 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 2d  *)pDb->stmtLast-
e0e0: 3e 70 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 20  >pNext);.       
e0f0: 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74     pDb->stmtLast
e100: 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  ->pNext = 0;.   
e110: 20 20 20 20 20 20 20 70 44 62 2d 3e 6e 53 74 6d         pDb->nStm
e120: 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  t--;.        }. 
e130: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
e140: 20 50 72 6f 63 65 65 64 20 74 6f 20 74 68 65 20   Proceed to the 
e150: 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74 20 2a  next statement *
e160: 2f 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 7a  /.      zSql = z
e170: 4c 65 66 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Left;.    }.    
e180: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
e190: 28 6f 62 6a 76 5b 32 5d 29 3b 0a 0a 20 20 20 20  (objv[2]);..    
e1a0: 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20  if( pRet ){.    
e1b0: 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b    if( rc==TCL_OK
e1c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
e1d0: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
e1e0: 65 72 70 2c 20 70 52 65 74 29 3b 0a 20 20 20 20  erp, pRet);.    
e1f0: 20 20 7d 0a 20 20 20 20 20 20 54 63 6c 5f 44 65    }.      Tcl_De
e200: 63 72 52 65 66 43 6f 75 6e 74 28 70 52 65 74 29  crRefCount(pRet)
e210: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
e220: 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20  rc==TCL_OK ){.  
e230: 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73      Tcl_ResetRes
e240: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  ult(interp);.   
e250: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
e260: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
e270: 20 24 64 62 20 66 75 6e 63 74 69 6f 6e 20 4e 41   $db function NA
e280: 4d 45 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20  ME SCRIPT.  **. 
e290: 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77   ** Create a new
e2a0: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 63 61   SQL function ca
e2b0: 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 57 68 65 6e  lled NAME.  When
e2c0: 65 76 65 72 20 74 68 61 74 20 66 75 6e 63 74 69  ever that functi
e2d0: 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 61 6c 6c 65  on is.  ** calle
e2e0: 64 2c 20 69 6e 76 6f 6b 65 20 53 43 52 49 50 54  d, invoke SCRIPT
e2f0: 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65   to evaluate the
e300: 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a   function..  */.
e310: 20 20 63 61 73 65 20 44 42 5f 46 55 4e 43 54 49    case DB_FUNCTI
e320: 4f 4e 3a 20 7b 0a 20 20 20 20 53 71 6c 46 75 6e  ON: {.    SqlFun
e330: 63 20 2a 70 46 75 6e 63 3b 0a 20 20 20 20 54 63  c *pFunc;.    Tc
e340: 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 0a  l_Obj *pScript;.
e350: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b      char *zName;
e360: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 34  .    if( objc!=4
e370: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
e380: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
e390: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d  p, 2, objv, "NAM
e3a0: 45 20 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20  E SCRIPT");.    
e3b0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
e3c0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e  OR;.    }.    zN
e3d0: 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ame = Tcl_GetStr
e3e0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
e3f0: 32 5d 2c 20 30 29 3b 0a 20 20 20 20 70 53 63 72  2], 0);.    pScr
e400: 69 70 74 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20  ipt = objv[3];. 
e410: 20 20 20 70 46 75 6e 63 20 3d 20 66 69 6e 64 53     pFunc = findS
e420: 71 6c 46 75 6e 63 28 70 44 62 2c 20 7a 4e 61 6d  qlFunc(pDb, zNam
e430: 65 29 3b 0a 20 20 20 20 69 66 28 20 70 46 75 6e  e);.    if( pFun
e440: 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 54 43  c==0 ) return TC
e450: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 69 66 28  L_ERROR;.    if(
e460: 20 70 46 75 6e 63 2d 3e 70 53 63 72 69 70 74 20   pFunc->pScript 
e470: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63  ){.      Tcl_Dec
e480: 72 52 65 66 43 6f 75 6e 74 28 70 46 75 6e 63 2d  rRefCount(pFunc-
e490: 3e 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20 7d  >pScript);.    }
e4a0: 0a 20 20 20 20 70 46 75 6e 63 2d 3e 70 53 63 72  .    pFunc->pScr
e4b0: 69 70 74 20 3d 20 70 53 63 72 69 70 74 3b 0a 20  ipt = pScript;. 
e4c0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
e4d0: 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 20 20  unt(pScript);.  
e4e0: 20 20 70 46 75 6e 63 2d 3e 75 73 65 45 76 61 6c    pFunc->useEval
e4f0: 4f 62 6a 76 20 3d 20 73 61 66 65 54 6f 55 73 65  Objv = safeToUse
e500: 45 76 61 6c 4f 62 6a 76 28 69 6e 74 65 72 70 2c  EvalObjv(interp,
e510: 20 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20 72   pScript);.    r
e520: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
e530: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 44 62 2d  te_function(pDb-
e540: 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20  >db, zName, -1, 
e550: 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20 20  SQLITE_UTF8,.   
e560: 20 20 20 20 20 70 46 75 6e 63 2c 20 74 63 6c 53       pFunc, tclS
e570: 71 6c 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20  qlFunc, 0, 0);. 
e580: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
e590: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
e5a0: 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20   = TCL_ERROR;.  
e5b0: 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
e5c0: 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
e5d0: 2a 29 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  *)sqlite3_errmsg
e5e0: 28 70 44 62 2d 3e 64 62 29 2c 20 54 43 4c 5f 56  (pDb->db), TCL_V
e5f0: 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 7d 65  OLATILE);.    }e
e600: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4d 75  lse{.      /* Mu
e610: 73 74 20 66 6c 75 73 68 20 61 6e 79 20 63 61 63  st flush any cac
e620: 68 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 2a  hed statements *
e630: 2f 0a 20 20 20 20 20 20 66 6c 75 73 68 53 74 6d  /.      flushStm
e640: 74 43 61 63 68 65 28 20 70 44 62 20 29 3b 0a 20  tCache( pDb );. 
e650: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
e660: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
e670: 20 20 20 24 64 62 20 69 6e 63 72 62 6c 6f 62 20     $db incrblob 
e680: 3f 2d 72 65 61 64 6f 6e 6c 79 3f 20 3f 44 42 3f  ?-readonly? ?DB?
e690: 20 54 41 42 4c 45 20 43 4f 4c 55 4d 4e 20 52 4f   TABLE COLUMN RO
e6a0: 57 49 44 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  WID.  */.  case 
e6b0: 44 42 5f 49 4e 43 52 42 4c 4f 42 3a 20 7b 0a 23  DB_INCRBLOB: {.#
e6c0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
e6d0: 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 54  T_INCRBLOB.    T
e6e0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
e6f0: 69 6e 74 65 72 70 2c 20 22 69 6e 63 72 62 6c 6f  interp, "incrblo
e700: 62 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  b not available 
e710: 69 6e 20 74 68 69 73 20 62 75 69 6c 64 22 2c 20  in this build", 
e720: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
e730: 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a  CL_ERROR;.#else.
e740: 20 20 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e      int isReadon
e750: 6c 79 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73  ly = 0;.    cons
e760: 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 22 6d  t char *zDb = "m
e770: 61 69 6e 22 3b 0a 20 20 20 20 63 6f 6e 73 74 20  ain";.    const 
e780: 63 68 61 72 20 2a 7a 54 61 62 6c 65 3b 0a 20 20  char *zTable;.  
e790: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
e7a0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71 6c 69 74  olumn;.    sqlit
e7b0: 65 5f 69 6e 74 36 34 20 69 52 6f 77 3b 0a 0a 20  e_int64 iRow;.. 
e7c0: 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20     /* Check for 
e7d0: 74 68 65 20 2d 72 65 61 64 6f 6e 6c 79 20 6f 70  the -readonly op
e7e0: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 28 20  tion */.    if( 
e7f0: 6f 62 6a 63 3e 33 20 26 26 20 73 74 72 63 6d 70  objc>3 && strcmp
e800: 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f  (Tcl_GetString(o
e810: 62 6a 76 5b 32 5d 29 2c 20 22 2d 72 65 61 64 6f  bjv[2]), "-reado
e820: 6e 6c 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  nly")==0 ){.    
e830: 20 20 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31    isReadonly = 1
e840: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
e850: 20 6f 62 6a 63 21 3d 28 35 2b 69 73 52 65 61 64   objc!=(5+isRead
e860: 6f 6e 6c 79 29 20 26 26 20 6f 62 6a 63 21 3d 28  only) && objc!=(
e870: 36 2b 69 73 52 65 61 64 6f 6e 6c 79 29 20 29 7b  6+isReadonly) ){
e880: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
e890: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
e8a0: 32 2c 20 6f 62 6a 76 2c 20 22 3f 2d 72 65 61 64  2, objv, "?-read
e8b0: 6f 6e 6c 79 3f 20 3f 44 42 3f 20 54 41 42 4c 45  only? ?DB? TABLE
e8c0: 20 43 4f 4c 55 4d 4e 20 52 4f 57 49 44 22 29 3b   COLUMN ROWID");
e8d0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
e8e0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
e8f0: 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 28 36      if( objc==(6
e900: 2b 69 73 52 65 61 64 6f 6e 6c 79 29 20 29 7b 0a  +isReadonly) ){.
e910: 20 20 20 20 20 20 7a 44 62 20 3d 20 54 63 6c 5f        zDb = Tcl_
e920: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
e930: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 54  ]);.    }.    zT
e940: 61 62 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  able = Tcl_GetSt
e950: 72 69 6e 67 28 6f 62 6a 76 5b 6f 62 6a 63 2d 33  ring(objv[objc-3
e960: 5d 29 3b 0a 20 20 20 20 7a 43 6f 6c 75 6d 6e 20  ]);.    zColumn 
e970: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
e980: 6f 62 6a 76 5b 6f 62 6a 63 2d 32 5d 29 3b 0a 20  objv[objc-2]);. 
e990: 20 20 20 72 63 20 3d 20 54 63 6c 5f 47 65 74 57     rc = Tcl_GetW
e9a0: 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  ideIntFromObj(in
e9b0: 74 65 72 70 2c 20 6f 62 6a 76 5b 6f 62 6a 63 2d  terp, objv[objc-
e9c0: 31 5d 2c 20 26 69 52 6f 77 29 3b 0a 0a 20 20 20  1], &iRow);..   
e9d0: 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20   if( rc==TCL_OK 
e9e0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 63 72  ){.      rc = cr
e9f0: 65 61 74 65 49 6e 63 72 62 6c 6f 62 43 68 61 6e  eateIncrblobChan
ea00: 6e 65 6c 28 0a 20 20 20 20 20 20 20 20 20 20 69  nel(.          i
ea10: 6e 74 65 72 70 2c 20 70 44 62 2c 20 7a 44 62 2c  nterp, pDb, zDb,
ea20: 20 7a 54 61 62 6c 65 2c 20 7a 43 6f 6c 75 6d 6e   zTable, zColumn
ea30: 2c 20 69 52 6f 77 2c 20 69 73 52 65 61 64 6f 6e  , iRow, isReadon
ea40: 6c 79 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  ly.      );.    
ea50: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65  }.#endif.    bre
ea60: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
ea70: 2a 2a 20 20 20 20 20 24 64 62 20 69 6e 74 65 72  **     $db inter
ea80: 72 75 70 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  rupt.  **.  ** I
ea90: 6e 74 65 72 72 75 70 74 20 74 68 65 20 65 78 65  nterrupt the exe
eaa0: 63 75 74 69 6f 6e 20 6f 66 20 74 68 65 20 69 6e  cution of the in
eab0: 6e 65 72 2d 6d 6f 73 74 20 53 51 4c 20 69 6e 74  ner-most SQL int
eac0: 65 72 70 72 65 74 65 72 2e 20 20 54 68 69 73 0a  erpreter.  This.
ead0: 20 20 2a 2a 20 63 61 75 73 65 73 20 74 68 65 20    ** causes the 
eae0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  SQL statement to
eaf0: 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
eb00: 20 6f 66 20 53 51 4c 49 54 45 5f 49 4e 54 45 52   of SQLITE_INTER
eb10: 52 55 50 54 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  RUPT..  */.  cas
eb20: 65 20 44 42 5f 49 4e 54 45 52 52 55 50 54 3a 20  e DB_INTERRUPT: 
eb30: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  {.    sqlite3_in
eb40: 74 65 72 72 75 70 74 28 70 44 62 2d 3e 64 62 29  terrupt(pDb->db)
eb50: 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
eb60: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  /*.  **     
eb70: 24 64 62 20 6e 75 6c 6c 76 61 6c 75 65 20 3f 53  $db nullvalue ?S
eb80: 54 52 49 4e 47 3f 0a 20 20 2a 2a 0a 20 20 2a 2a  TRING?.  **.  **
eb90: 20 43 68 61 6e 67 65 20 74 65 78 74 20 75 73 65   Change text use
eba0: 64 20 77 68 65 6e 20 61 20 4e 55 4c 4c 20 63 6f  d when a NULL co
ebb0: 6d 65 73 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  mes back from th
ebc0: 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 3f  e database. If ?
ebd0: 53 54 52 49 4e 47 3f 0a 20 20 2a 2a 20 69 73 20  STRING?.  ** is 
ebe0: 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 74 68 65  not present, the
ebf0: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  n the current st
ec00: 72 69 6e 67 20 75 73 65 64 20 66 6f 72 20 4e 55  ring used for NU
ec10: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  LL is returned..
ec20: 20 20 2a 2a 20 49 66 20 53 54 52 49 4e 47 20 69    ** If STRING i
ec30: 73 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20  s present, then 
ec40: 53 54 52 49 4e 47 20 69 73 20 72 65 74 75 72 6e  STRING is return
ec50: 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2f 0a 20 20  ed..  **.  */.  
ec60: 63 61 73 65 20 44 42 5f 4e 55 4c 4c 56 41 4c 55  case DB_NULLVALU
ec70: 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a  E: {.    if( obj
ec80: 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33 20  c!=2 && objc!=3 
ec90: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
eca0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
ecb0: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 55 4c 4c  , 2, objv, "NULL
ecc0: 56 41 4c 55 45 22 29 3b 0a 20 20 20 20 20 20 72  VALUE");.      r
ecd0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
ece0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f  .    }.    if( o
ecf0: 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc==3 ){.      
ed00: 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 63  int len;.      c
ed10: 68 61 72 20 2a 7a 4e 75 6c 6c 20 3d 20 54 63 6c  har *zNull = Tcl
ed20: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
ed30: 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29  j(objv[2], &len)
ed40: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ;.      if( pDb-
ed50: 3e 7a 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  >zNull ){.      
ed60: 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e    Tcl_Free(pDb->
ed70: 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a  zNull);.      }.
ed80: 20 20 20 20 20 20 69 66 28 20 7a 4e 75 6c 6c 20        if( zNull 
ed90: 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20  && len>0 ){.    
eda0: 20 20 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 3d      pDb->zNull =
edb0: 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20   Tcl_Alloc( len 
edc0: 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 73  + 1 );.        s
edd0: 74 72 6e 63 70 79 28 70 44 62 2d 3e 7a 4e 75 6c  trncpy(pDb->zNul
ede0: 6c 2c 20 7a 4e 75 6c 6c 2c 20 6c 65 6e 29 3b 0a  l, zNull, len);.
edf0: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75          pDb->zNu
ee00: 6c 6c 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a  ll[len] = '\0';.
ee10: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
ee20: 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20       pDb->zNull 
ee30: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
ee40: 20 7d 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62   }.    Tcl_SetOb
ee50: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
ee60: 64 62 54 65 78 74 54 6f 4f 62 6a 28 70 44 62 2d  dbTextToObj(pDb-
ee70: 3e 7a 4e 75 6c 6c 29 29 3b 0a 20 20 20 20 62 72  >zNull));.    br
ee80: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
ee90: 20 2a 2a 20 20 20 20 20 24 64 62 20 6c 61 73 74   **     $db last
eea0: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 20 0a 20  _insert_rowid . 
eeb0: 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
eec0: 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
eed0: 20 69 73 20 74 68 65 20 52 4f 57 49 44 20 66 6f   is the ROWID fo
eee0: 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  r the most recen
eef0: 74 20 69 6e 73 65 72 74 2e 0a 20 20 2a 2f 0a 20  t insert..  */. 
ef00: 20 63 61 73 65 20 44 42 5f 4c 41 53 54 5f 49 4e   case DB_LAST_IN
ef10: 53 45 52 54 5f 52 4f 57 49 44 3a 20 7b 0a 20 20  SERT_ROWID: {.  
ef20: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75    Tcl_Obj *pResu
ef30: 6c 74 3b 0a 20 20 20 20 54 63 6c 5f 57 69 64 65  lt;.    Tcl_Wide
ef40: 49 6e 74 20 72 6f 77 69 64 3b 0a 20 20 20 20 69  Int rowid;.    i
ef50: 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
ef60: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
ef70: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
ef80: 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 20  objv, "");.     
ef90: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
efa0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 6f 77  R;.    }.    row
efb0: 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 6c 61 73  id = sqlite3_las
efc0: 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 70  t_insert_rowid(p
efd0: 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20 70 52 65  Db->db);.    pRe
efe0: 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62  sult = Tcl_GetOb
eff0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  jResult(interp);
f000: 0a 20 20 20 20 54 63 6c 5f 53 65 74 57 69 64 65  .    Tcl_SetWide
f010: 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20  IntObj(pResult, 
f020: 72 6f 77 69 64 29 3b 0a 20 20 20 20 62 72 65 61  rowid);.    brea
f030: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
f040: 2a 20 54 68 65 20 44 42 5f 4f 4e 45 43 4f 4c 55  * The DB_ONECOLU
f050: 4d 4e 20 6d 65 74 68 6f 64 20 69 73 20 69 6d 70  MN method is imp
f060: 6c 65 6d 65 6e 74 65 64 20 74 6f 67 65 74 68 65  lemented togethe
f070: 72 20 77 69 74 68 20 44 42 5f 45 56 41 4c 2e 0a  r with DB_EVAL..
f080: 20 20 2a 2f 0a 0a 20 20 2f 2a 20 20 20 20 24 64    */..  /*    $d
f090: 62 20 70 72 6f 67 72 65 73 73 20 3f 4e 20 43 41  b progress ?N CA
f0a0: 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 20 0a 20 20  LLBACK?.  ** .  
f0b0: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69  ** Invoke the gi
f0c0: 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 65 76 65  ven callback eve
f0d0: 72 79 20 4e 20 76 69 72 74 75 61 6c 20 6d 61 63  ry N virtual mac
f0e0: 68 69 6e 65 20 6f 70 63 6f 64 65 73 20 77 68 69  hine opcodes whi
f0f0: 6c 65 20 65 78 65 63 75 74 69 6e 67 0a 20 20 2a  le executing.  *
f100: 2a 20 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a  * queries..  */.
f110: 20 20 63 61 73 65 20 44 42 5f 50 52 4f 47 52 45    case DB_PROGRE
f120: 53 53 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62  SS: {.    if( ob
f130: 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69  jc==2 ){.      i
f140: 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73  f( pDb->zProgres
f150: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  s ){.        Tcl
f160: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
f170: 74 65 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f 67  terp, pDb->zProg
f180: 72 65 73 73 2c 20 30 29 3b 0a 20 20 20 20 20 20  ress, 0);.      
f190: 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
f1a0: 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20  objc==4 ){.     
f1b0: 20 63 68 61 72 20 2a 7a 50 72 6f 67 72 65 73 73   char *zProgress
f1c0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b  ;.      int len;
f1d0: 0a 20 20 20 20 20 20 69 6e 74 20 4e 3b 0a 20 20  .      int N;.  
f1e0: 20 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d      if( TCL_OK!=
f1f0: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
f200: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
f210: 5d 2c 20 26 4e 29 20 29 7b 0a 20 20 20 20 20 20  ], &N) ){.      
f220: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
f230: 4f 52 3b 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20  OR;.      };.   
f240: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f     if( pDb->zPro
f250: 67 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20  gress ){.       
f260: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
f270: 50 72 6f 67 72 65 73 73 29 3b 0a 20 20 20 20 20  Progress);.     
f280: 20 7d 0a 20 20 20 20 20 20 7a 50 72 6f 67 72 65   }.      zProgre
f290: 73 73 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  ss = Tcl_GetStri
f2a0: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33  ngFromObj(objv[3
f2b0: 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20  ], &len);.      
f2c0: 69 66 28 20 7a 50 72 6f 67 72 65 73 73 20 26 26  if( zProgress &&
f2d0: 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20   len>0 ){.      
f2e0: 20 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73    pDb->zProgress
f2f0: 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65   = Tcl_Alloc( le
f300: 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20  n + 1 );.       
f310: 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 50 72   memcpy(pDb->zPr
f320: 6f 67 72 65 73 73 2c 20 7a 50 72 6f 67 72 65 73  ogress, zProgres
f330: 73 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20  s, len+1);.     
f340: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
f350: 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 3d  pDb->zProgress =
f360: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e   0;.      }.#ifn
f370: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f380: 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43  PROGRESS_CALLBAC
f390: 4b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  K.      if( pDb-
f3a0: 3e 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20  >zProgress ){.  
f3b0: 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72        pDb->inter
f3c0: 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20  p = interp;.    
f3d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 67      sqlite3_prog
f3e0: 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 70 44 62  ress_handler(pDb
f3f0: 2d 3e 64 62 2c 20 4e 2c 20 44 62 50 72 6f 67 72  ->db, N, DbProgr
f400: 65 73 73 48 61 6e 64 6c 65 72 2c 20 70 44 62 29  essHandler, pDb)
f410: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
f420: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70         sqlite3_p
f430: 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28  rogress_handler(
f440: 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 2c 20 30  pDb->db, 0, 0, 0
f450: 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
f460: 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
f470: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
f480: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
f490: 62 6a 76 2c 20 22 4e 20 43 41 4c 4c 42 41 43 4b  bjv, "N CALLBACK
f4a0: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
f4b0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
f4c0: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
f4d0: 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 70 72  ..  /*    $db pr
f4e0: 6f 66 69 6c 65 20 3f 43 41 4c 4c 42 41 43 4b 3f  ofile ?CALLBACK?
f4f0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20  .  **.  ** Make 
f500: 61 72 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20  arrangements to 
f510: 69 6e 76 6f 6b 65 20 74 68 65 20 43 41 4c 4c 42  invoke the CALLB
f520: 41 43 4b 20 72 6f 75 74 69 6e 65 20 61 66 74 65  ACK routine afte
f530: 72 20 65 61 63 68 20 53 51 4c 20 73 74 61 74 65  r each SQL state
f540: 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 61 74 20 68  ment.  ** that h
f550: 61 73 20 72 75 6e 2e 20 20 54 68 65 20 74 65 78  as run.  The tex
f560: 74 20 6f 66 20 74 68 65 20 53 51 4c 20 61 6e 64  t of the SQL and
f570: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 65   the amount of e
f580: 6c 61 70 73 65 20 74 69 6d 65 20 61 72 65 0a 20  lapse time are. 
f590: 20 2a 2a 20 61 70 70 65 6e 64 65 64 20 74 6f 20   ** appended to 
f5a0: 43 41 4c 4c 42 41 43 4b 20 62 65 66 6f 72 65 20  CALLBACK before 
f5b0: 74 68 65 20 73 63 72 69 70 74 20 69 73 20 72 75  the script is ru
f5c0: 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  n..  */.  case D
f5d0: 42 5f 50 52 4f 46 49 4c 45 3a 20 7b 0a 20 20 20  B_PROFILE: {.   
f5e0: 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20   if( objc>3 ){. 
f5f0: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
f600: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
f610: 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43   objv, "?CALLBAC
f620: 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  K?");.      retu
f630: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
f640: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63    }else if( objc
f650: 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==2 ){.      if(
f660: 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29   pDb->zProfile )
f670: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  {.        Tcl_Ap
f680: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
f690: 70 2c 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65  p, pDb->zProfile
f6a0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
f6b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
f6c0: 68 61 72 20 2a 7a 50 72 6f 66 69 6c 65 3b 0a 20  har *zProfile;. 
f6d0: 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20       int len;.  
f6e0: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72      if( pDb->zPr
f6f0: 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  ofile ){.       
f700: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
f710: 50 72 6f 66 69 6c 65 29 3b 0a 20 20 20 20 20 20  Profile);.      
f720: 7d 0a 20 20 20 20 20 20 7a 50 72 6f 66 69 6c 65  }.      zProfile
f730: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
f740: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
f750: 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66   &len);.      if
f760: 28 20 7a 50 72 6f 66 69 6c 65 20 26 26 20 6c 65  ( zProfile && le
f770: 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  n>0 ){.        p
f780: 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 3d 20 54  Db->zProfile = T
f790: 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20  cl_Alloc( len + 
f7a0: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  1 );.        mem
f7b0: 63 70 79 28 70 44 62 2d 3e 7a 50 72 6f 66 69 6c  cpy(pDb->zProfil
f7c0: 65 2c 20 7a 50 72 6f 66 69 6c 65 2c 20 6c 65 6e  e, zProfile, len
f7d0: 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  +1);.      }else
f7e0: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
f7f0: 50 72 6f 66 69 6c 65 20 3d 20 30 3b 0a 20 20 20  Profile = 0;.   
f800: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
f810: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20  ITE_OMIT_TRACE. 
f820: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50       if( pDb->zP
f830: 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  rofile ){.      
f840: 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20    pDb->interp = 
f850: 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20  interp;.        
f860: 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28  sqlite3_profile(
f870: 70 44 62 2d 3e 64 62 2c 20 44 62 50 72 6f 66 69  pDb->db, DbProfi
f880: 6c 65 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b  leHandler, pDb);
f890: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
f8a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72        sqlite3_pr
f8b0: 6f 66 69 6c 65 28 70 44 62 2d 3e 64 62 2c 20 30  ofile(pDb->db, 0
f8c0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  , 0);.      }.#e
f8d0: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 62  ndif.    }.    b
f8e0: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
f8f0: 20 20 2a 2a 20 20 20 20 20 24 64 62 20 72 65 6b    **     $db rek
f900: 65 79 20 4b 45 59 0a 20 20 2a 2a 0a 20 20 2a 2a  ey KEY.  **.  **
f910: 20 43 68 61 6e 67 65 20 74 68 65 20 65 6e 63 72   Change the encr
f920: 79 70 74 69 6f 6e 20 6b 65 79 20 6f 6e 20 74 68  yption key on th
f930: 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e  e currently open
f940: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
f950: 20 20 63 61 73 65 20 44 42 5f 52 45 4b 45 59 3a    case DB_REKEY:
f960: 20 7b 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b   {.    int nKey;
f970: 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 3b  .    void *pKey;
f980: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  .    if( objc!=3
f990: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
f9a0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
f9b0: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4b 45 59  p, 2, objv, "KEY
f9c0: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
f9d0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
f9e0: 7d 0a 20 20 20 20 70 4b 65 79 20 3d 20 54 63 6c  }.    pKey = Tcl
f9f0: 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f  _GetByteArrayFro
fa00: 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6e  mObj(objv[2], &n
fa10: 4b 65 79 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  Key);.#ifdef SQL
fa20: 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
fa30: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
fa40: 65 6b 65 79 28 70 44 62 2d 3e 64 62 2c 20 70 4b  ekey(pDb->db, pK
fa50: 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20 69  ey, nKey);.    i
fa60: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54  f( rc ){.      T
fa70: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
fa80: 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 45  interp, sqlite3E
fa90: 72 72 53 74 72 28 72 63 29 2c 20 30 29 3b 0a 20  rrStr(rc), 0);. 
faa0: 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52       rc = TCL_ER
fab0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ROR;.    }.#endi
fac0: 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  f.    break;.  }
fad0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  /*.  **     
fae0: 24 64 62 20 74 69 6d 65 6f 75 74 20 4d 49 4c 4c  $db timeout MILL
faf0: 45 53 45 43 4f 4e 44 53 0a 20 20 2a 2a 0a 20 20  ESECONDS.  **.  
fb00: 2a 2a 20 44 65 6c 61 79 20 66 6f 72 20 74 68 65  ** Delay for the
fb10: 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69   number of milli
fb20: 73 65 63 6f 6e 64 73 20 73 70 65 63 69 66 69 65  seconds specifie
fb30: 64 20 77 68 65 6e 20 61 20 66 69 6c 65 20 69 73  d when a file is
fb40: 20 6c 6f 63 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20   locked..  */.  
fb50: 63 61 73 65 20 44 42 5f 54 49 4d 45 4f 55 54 3a  case DB_TIMEOUT:
fb60: 20 7b 0a 20 20 20 20 69 6e 74 20 6d 73 3b 0a 20   {.    int ms;. 
fb70: 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29     if( objc!=3 )
fb80: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
fb90: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
fba0: 20 32 2c 20 6f 62 6a 76 2c 20 22 4d 49 4c 4c 49   2, objv, "MILLI
fbb0: 53 45 43 4f 4e 44 53 22 29 3b 0a 20 20 20 20 20  SECONDS");.     
fbc0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
fbd0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  R;.    }.    if(
fbe0: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
fbf0: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
fc00: 32 5d 2c 20 26 6d 73 29 20 29 20 72 65 74 75 72  2], &ms) ) retur
fc10: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
fc20: 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69   sqlite3_busy_ti
fc30: 6d 65 6f 75 74 28 70 44 62 2d 3e 64 62 2c 20 6d  meout(pDb->db, m
fc40: 73 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  s);.    break;. 
fc50: 20 7d 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20   }.  .  /*.  ** 
fc60: 20 20 20 20 24 64 62 20 74 6f 74 61 6c 5f 63 68      $db total_ch
fc70: 61 6e 67 65 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20  anges.  **.  ** 
fc80: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
fc90: 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77  r of rows that w
fca0: 65 72 65 20 6d 6f 64 69 66 69 65 64 2c 20 69 6e  ere modified, in
fcb0: 73 65 72 74 65 64 2c 20 6f 72 20 64 65 6c 65 74  serted, or delet
fcc0: 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74  ed .  ** since t
fcd0: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
fce0: 6c 65 20 77 61 73 20 63 72 65 61 74 65 64 2e 0a  le was created..
fcf0: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54    */.  case DB_T
fd00: 4f 54 41 4c 5f 43 48 41 4e 47 45 53 3a 20 7b 0a  OTAL_CHANGES: {.
fd10: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65      Tcl_Obj *pRe
fd20: 73 75 6c 74 3b 0a 20 20 20 20 69 66 28 20 6f 62  sult;.    if( ob
fd30: 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 54  jc!=2 ){.      T
fd40: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
fd50: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
fd60: 20 22 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75   "");.      retu
fd70: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
fd80: 20 20 7d 0a 20 20 20 20 70 52 65 73 75 6c 74 20    }.    pResult 
fd90: 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75  = Tcl_GetObjResu
fda0: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  lt(interp);.    
fdb0: 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52  Tcl_SetIntObj(pR
fdc0: 65 73 75 6c 74 2c 20 73 71 6c 69 74 65 33 5f 74  esult, sqlite3_t
fdd0: 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 70 44 62  otal_changes(pDb
fde0: 2d 3e 64 62 29 29 3b 0a 20 20 20 20 62 72 65 61  ->db));.    brea
fdf0: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
fe00: 24 64 62 20 74 72 61 63 65 20 3f 43 41 4c 4c 42  $db trace ?CALLB
fe10: 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d  ACK?.  **.  ** M
fe20: 61 6b 65 20 61 72 72 61 6e 67 65 6d 65 6e 74 73  ake arrangements
fe30: 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 43   to invoke the C
fe40: 41 4c 4c 42 41 43 4b 20 72 6f 75 74 69 6e 65 20  ALLBACK routine 
fe50: 66 6f 72 20 65 61 63 68 20 53 51 4c 20 73 74 61  for each SQL sta
fe60: 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 61 74  tement.  ** that
fe70: 20 69 73 20 65 78 65 63 75 74 65 64 2e 20 20 54   is executed.  T
fe80: 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 53  he text of the S
fe90: 51 4c 20 69 73 20 61 70 70 65 6e 64 65 64 20 74  QL is appended t
fea0: 6f 20 43 41 4c 4c 42 41 43 4b 20 62 65 66 6f 72  o CALLBACK befor
feb0: 65 0a 20 20 2a 2a 20 69 74 20 69 73 20 65 78 65  e.  ** it is exe
fec0: 63 75 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61  cuted..  */.  ca
fed0: 73 65 20 44 42 5f 54 52 41 43 45 3a 20 7b 0a 20  se DB_TRACE: {. 
fee0: 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b     if( objc>3 ){
fef0: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
ff00: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
ff10: 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42  2, objv, "?CALLB
ff20: 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65  ACK?");.      re
ff30: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
ff40: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62      }else if( ob
ff50: 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69  jc==2 ){.      i
ff60: 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29  f( pDb->zTrace )
ff70: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  {.        Tcl_Ap
ff80: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
ff90: 70 2c 20 70 44 62 2d 3e 7a 54 72 61 63 65 2c 20  p, pDb->zTrace, 
ffa0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
ffb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61  }else{.      cha
ffc0: 72 20 2a 7a 54 72 61 63 65 3b 0a 20 20 20 20 20  r *zTrace;.     
ffd0: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20   int len;.      
ffe0: 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20  if( pDb->zTrace 
fff0: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46  ){.        Tcl_F
10000 72 65 65 28 70 44 62 2d 3e 7a 54 72 61 63 65 29  ree(pDb->zTrace)
10010 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10020 7a 54 72 61 63 65 20 3d 20 54 63 6c 5f 47 65 74  zTrace = Tcl_Get
10030 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
10040 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20  jv[2], &len);.  
10050 20 20 20 20 69 66 28 20 7a 54 72 61 63 65 20 26      if( zTrace &
10060 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20  & len>0 ){.     
10070 20 20 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 3d     pDb->zTrace =
10080 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20   Tcl_Alloc( len 
10090 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d  + 1 );.        m
100a0 65 6d 63 70 79 28 70 44 62 2d 3e 7a 54 72 61 63  emcpy(pDb->zTrac
100b0 65 2c 20 7a 54 72 61 63 65 2c 20 6c 65 6e 2b 31  e, zTrace, len+1
100c0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
100d0 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 54 72          pDb->zTr
100e0 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ace = 0;.      }
100f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10100 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 20 20 20  OMIT_TRACE.     
10110 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65   if( pDb->zTrace
10120 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
10130 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
10140 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
10150 33 5f 74 72 61 63 65 28 70 44 62 2d 3e 64 62 2c  3_trace(pDb->db,
10160 20 44 62 54 72 61 63 65 48 61 6e 64 6c 65 72 2c   DbTraceHandler,
10170 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c   pDb);.      }el
10180 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
10190 74 65 33 5f 74 72 61 63 65 28 70 44 62 2d 3e 64  te3_trace(pDb->d
101a0 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  b, 0, 0);.      
101b0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
101c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
101d0 20 2f 2a 20 20 20 20 24 64 62 20 74 72 61 6e 73   /*    $db trans
101e0 61 63 74 69 6f 6e 20 5b 2d 64 65 66 65 72 72 65  action [-deferre
101f0 64 7c 2d 69 6d 6d 65 64 69 61 74 65 7c 2d 65 78  d|-immediate|-ex
10200 63 6c 75 73 69 76 65 5d 20 53 43 52 49 50 54 0a  clusive] SCRIPT.
10210 20 20 2a 2a 0a 20 20 2a 2a 20 53 74 61 72 74 20    **.  ** Start 
10220 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  a new transactio
10230 6e 20 28 69 66 20 77 65 20 61 72 65 20 6e 6f 74  n (if we are not
10240 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
10250 6d 69 64 73 74 20 6f 66 20 61 0a 20 20 2a 2a 20  midst of a.  ** 
10260 74 72 61 6e 73 61 63 74 69 6f 6e 29 20 61 6e 64  transaction) and
10270 20 65 78 65 63 75 74 65 20 74 68 65 20 54 43 4c   execute the TCL
10280 20 73 63 72 69 70 74 20 53 43 52 49 50 54 2e 20   script SCRIPT. 
10290 20 41 66 74 65 72 20 53 43 52 49 50 54 0a 20 20   After SCRIPT.  
102a0 2a 2a 20 63 6f 6d 70 6c 65 74 65 73 2c 20 65 69  ** completes, ei
102b0 74 68 65 72 20 63 6f 6d 6d 69 74 20 74 68 65 20  ther commit the 
102c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 72  transaction or r
102d0 6f 6c 6c 20 69 74 20 62 61 63 6b 20 69 66 20 53  oll it back if S
102e0 43 52 49 50 54 0a 20 20 2a 2a 20 74 68 72 6f 77  CRIPT.  ** throw
102f0 73 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 2e 20  s an exception. 
10300 20 4f 72 20 69 66 20 6e 6f 20 6e 65 77 20 74 72   Or if no new tr
10310 61 6e 73 61 74 69 6f 6e 20 77 61 73 20 73 74 61  ansation was sta
10320 72 74 65 64 2c 20 64 6f 20 6e 6f 74 68 69 6e 67  rted, do nothing
10330 2e 0a 20 20 2a 2a 20 70 61 73 73 20 74 68 65 20  ..  ** pass the 
10340 65 78 63 65 70 74 69 6f 6e 20 6f 6e 20 75 70 20  exception on up 
10350 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a  the stack..  **.
10360 20 20 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e    ** This comman
10370 64 20 77 61 73 20 69 6e 73 70 69 72 65 64 20 62  d was inspired b
10380 79 20 44 61 76 65 20 54 68 6f 6d 61 73 27 73 20  y Dave Thomas's 
10390 74 61 6c 6b 20 6f 6e 20 52 75 62 79 20 61 74 20  talk on Ruby at 
103a0 74 68 65 0a 20 20 2a 2a 20 32 30 30 35 20 4f 27  the.  ** 2005 O'
103b0 52 65 69 6c 6c 79 20 4f 70 65 6e 20 53 6f 75 72  Reilly Open Sour
103c0 63 65 20 43 6f 6e 76 65 6e 74 69 6f 6e 20 28 4f  ce Convention (O
103d0 53 43 4f 4e 29 2e 0a 20 20 2a 2f 0a 20 20 63 61  SCON)..  */.  ca
103e0 73 65 20 44 42 5f 54 52 41 4e 53 41 43 54 49 4f  se DB_TRANSACTIO
103f0 4e 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 6e 54  N: {.    int inT
10400 72 61 6e 73 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  rans;.    Tcl_Ob
10410 6a 20 2a 70 53 63 72 69 70 74 3b 0a 20 20 20 20  j *pScript;.    
10420 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 65 67  const char *zBeg
10430 69 6e 20 3d 20 22 42 45 47 49 4e 22 3b 0a 20 20  in = "BEGIN";.  
10440 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26    if( objc!=3 &&
10450 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
10460 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
10470 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
10480 6a 76 2c 20 22 5b 54 59 50 45 5d 20 53 43 52 49  jv, "[TYPE] SCRI
10490 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  PT");.      retu
104a0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
104b0 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63    }.    if( objc
104c0 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 70 53 63  ==3 ){.      pSc
104d0 72 69 70 74 20 3d 20 6f 62 6a 76 5b 32 5d 3b 0a  ript = objv[2];.
104e0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
104f0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
10500 63 68 61 72 20 2a 54 54 59 50 45 5f 73 74 72 73  char *TTYPE_strs
10510 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 22  [] = {.        "
10520 64 65 66 65 72 72 65 64 22 2c 20 20 20 22 65 78  deferred",   "ex
10530 63 6c 75 73 69 76 65 22 2c 20 20 22 69 6d 6d 65  clusive",  "imme
10540 64 69 61 74 65 22 2c 20 30 0a 20 20 20 20 20 20  diate", 0.      
10550 7d 3b 0a 20 20 20 20 20 20 65 6e 75 6d 20 54 54  };.      enum TT
10560 59 50 45 5f 65 6e 75 6d 20 7b 0a 20 20 20 20 20  YPE_enum {.     
10570 20 20 20 54 54 59 50 45 5f 44 45 46 45 52 52 45     TTYPE_DEFERRE
10580 44 2c 20 54 54 59 50 45 5f 45 58 43 4c 55 53 49  D, TTYPE_EXCLUSI
10590 56 45 2c 20 54 54 59 50 45 5f 49 4d 4d 45 44 49  VE, TTYPE_IMMEDI
105a0 41 54 45 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20  ATE.      };.   
105b0 20 20 20 69 6e 74 20 74 74 79 70 65 3b 0a 20 20     int ttype;.  
105c0 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49      if( Tcl_GetI
105d0 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  ndexFromObj(inte
105e0 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 54 54 59  rp, objv[2], TTY
105f0 50 45 5f 73 74 72 73 2c 20 22 74 72 61 6e 73 61  PE_strs, "transa
10600 63 74 69 6f 6e 20 74 79 70 65 22 2c 0a 20 20 20  ction type",.   
10610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10620 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 26 74             0, &t
10630 74 79 70 65 29 20 29 7b 0a 20 20 20 20 20 20 20  type) ){.       
10640 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
10650 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
10660 20 73 77 69 74 63 68 28 20 28 65 6e 75 6d 20 54   switch( (enum T
10670 54 59 50 45 5f 65 6e 75 6d 29 74 74 79 70 65 20  TYPE_enum)ttype 
10680 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  ){.        case 
10690 54 54 59 50 45 5f 44 45 46 45 52 52 45 44 3a 20  TTYPE_DEFERRED: 
106a0 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 3b 20     /* no-op */; 
106b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106c0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
106d0 61 73 65 20 54 54 59 50 45 5f 45 58 43 4c 55 53  ase TTYPE_EXCLUS
106e0 49 56 45 3a 20 20 20 7a 42 65 67 69 6e 20 3d 20  IVE:   zBegin = 
106f0 22 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45  "BEGIN EXCLUSIVE
10700 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ";  break;.     
10710 20 20 20 63 61 73 65 20 54 54 59 50 45 5f 49 4d     case TTYPE_IM
10720 4d 45 44 49 41 54 45 3a 20 20 20 7a 42 65 67 69  MEDIATE:   zBegi
10730 6e 20 3d 20 22 42 45 47 49 4e 20 49 4d 4d 45 44  n = "BEGIN IMMED
10740 49 41 54 45 22 3b 20 20 62 72 65 61 6b 3b 0a 20  IATE";  break;. 
10750 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 63       }.      pSc
10760 72 69 70 74 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a  ript = objv[3];.
10770 20 20 20 20 7d 0a 20 20 20 20 69 6e 54 72 61 6e      }.    inTran
10780 73 20 3d 20 21 73 71 6c 69 74 65 33 5f 67 65 74  s = !sqlite3_get
10790 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 70 44 62 2d  _autocommit(pDb-
107a0 3e 64 62 29 3b 0a 20 20 20 20 69 66 28 20 21 69  >db);.    if( !i
107b0 6e 54 72 61 6e 73 20 29 7b 0a 20 20 20 20 20 20  nTrans ){.      
107c0 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f 65 78  (void)sqlite3_ex
107d0 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a 42 65 67  ec(pDb->db, zBeg
107e0 69 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  in, 0, 0, 0);.  
107f0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 54 63 6c    }.    rc = Tcl
10800 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72  _EvalObjEx(inter
10810 70 2c 20 70 53 63 72 69 70 74 2c 20 30 29 3b 0a  p, pScript, 0);.
10820 20 20 20 20 69 66 28 20 21 69 6e 54 72 61 6e 73      if( !inTrans
10830 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
10840 63 68 61 72 20 2a 7a 45 6e 64 3b 0a 20 20 20 20  char *zEnd;.    
10850 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 45 52    if( rc==TCL_ER
10860 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ROR ){.        z
10870 45 6e 64 20 3d 20 22 52 4f 4c 4c 42 41 43 4b 22  End = "ROLLBACK"
10880 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ;.      } else {
10890 0a 20 20 20 20 20 20 20 20 7a 45 6e 64 20 3d 20  .        zEnd = 
108a0 22 43 4f 4d 4d 49 54 22 3b 0a 20 20 20 20 20 20  "COMMIT";.      
108b0 7d 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  }.      if( sqli
108c0 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62  te3_exec(pDb->db
108d0 2c 20 7a 45 6e 64 2c 20 30 2c 20 30 2c 20 30 29  , zEnd, 0, 0, 0)
108e0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
108f0 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62  te3_exec(pDb->db
10900 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c  , "ROLLBACK", 0,
10910 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
10920 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
10930 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
10940 20 20 20 24 64 62 20 75 70 64 61 74 65 5f 68 6f     $db update_ho
10950 6f 6b 20 3f 73 63 72 69 70 74 3f 0a 20 20 2a 2a  ok ?script?.  **
10960 20 20 20 20 24 64 62 20 72 6f 6c 6c 62 61 63 6b      $db rollback
10970 5f 68 6f 6f 6b 20 3f 73 63 72 69 70 74 3f 0a 20  _hook ?script?. 
10980 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 55 50   */.  case DB_UP
10990 44 41 54 45 5f 48 4f 4f 4b 3a 20 0a 20 20 63 61  DATE_HOOK: .  ca
109a0 73 65 20 44 42 5f 52 4f 4c 4c 42 41 43 4b 5f 48  se DB_ROLLBACK_H
109b0 4f 4f 4b 3a 20 7b 0a 0a 20 20 20 20 2f 2a 20 73  OOK: {..    /* s
109c0 65 74 20 70 70 48 6f 6f 6b 20 74 6f 20 70 6f 69  et ppHook to poi
109d0 6e 74 20 61 74 20 70 55 70 64 61 74 65 48 6f 6f  nt at pUpdateHoo
109e0 6b 20 6f 72 20 70 52 6f 6c 6c 62 61 63 6b 48 6f  k or pRollbackHo
109f0 6f 6b 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  ok, depending on
10a00 20 0a 20 20 20 20 2a 2a 20 77 68 65 74 68 65 72   .    ** whether
10a10 20 5b 24 64 62 20 75 70 64 61 74 65 5f 68 6f 6f   [$db update_hoo
10a20 6b 5d 20 6f 72 20 5b 24 64 62 20 72 6f 6c 6c 62  k] or [$db rollb
10a30 61 63 6b 5f 68 6f 6f 6b 5d 20 77 61 73 20 69 6e  ack_hook] was in
10a40 76 6f 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  voked..    */.  
10a50 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 70 70 48 6f    Tcl_Obj **ppHo
10a60 6f 6b 3b 20 0a 20 20 20 20 69 66 28 20 63 68 6f  ok; .    if( cho
10a70 69 63 65 3d 3d 44 42 5f 55 50 44 41 54 45 5f 48  ice==DB_UPDATE_H
10a80 4f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 70 48  OOK ){.      ppH
10a90 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e 70 55 70 64  ook = &pDb->pUpd
10aa0 61 74 65 48 6f 6f 6b 3b 0a 20 20 20 20 7d 65 6c  ateHook;.    }el
10ab0 73 65 7b 0a 20 20 20 20 20 20 70 70 48 6f 6f 6b  se{.      ppHook
10ac0 20 3d 20 26 70 44 62 2d 3e 70 52 6f 6c 6c 62 61   = &pDb->pRollba
10ad0 63 6b 48 6f 6f 6b 3b 0a 20 20 20 20 7d 0a 0a 20  ckHook;.    }.. 
10ae0 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26     if( objc!=2 &
10af0 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  & objc!=3 ){.   
10b00 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
10b10 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
10b20 6f 62 6a 76 2c 20 22 3f 53 43 52 49 50 54 3f 22  objv, "?SCRIPT?"
10b30 29 3b 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e  );.       return
10b40 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
10b50 7d 0a 20 20 20 20 69 66 28 20 2a 70 70 48 6f 6f  }.    if( *ppHoo
10b60 6b 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53  k ){.      Tcl_S
10b70 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
10b80 72 70 2c 20 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20  rp, *ppHook);.  
10b90 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20      if( objc==3 
10ba0 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 44  ){.        Tcl_D
10bb0 65 63 72 52 65 66 43 6f 75 6e 74 28 2a 70 70 48  ecrRefCount(*ppH
10bc0 6f 6f 6b 29 3b 0a 20 20 20 20 20 20 20 20 2a 70  ook);.        *p
10bd0 70 48 6f 6f 6b 20 3d 20 30 3b 0a 20 20 20 20 20  pHook = 0;.     
10be0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
10bf0 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20   objc==3 ){.    
10c00 20 20 61 73 73 65 72 74 28 20 21 28 2a 70 70 48    assert( !(*ppH
10c10 6f 6f 6b 29 20 29 3b 0a 20 20 20 20 20 20 69 66  ook) );.      if
10c20 28 20 54 63 6c 5f 47 65 74 43 68 61 72 4c 65 6e  ( Tcl_GetCharLen
10c30 67 74 68 28 6f 62 6a 76 5b 32 5d 29 3e 30 20 29  gth(objv[2])>0 )
10c40 7b 0a 20 20 20 20 20 20 20 20 2a 70 70 48 6f 6f  {.        *ppHoo
10c50 6b 20 3d 20 6f 62 6a 76 5b 32 5d 3b 0a 20 20 20  k = objv[2];.   
10c60 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66       Tcl_IncrRef
10c70 43 6f 75 6e 74 28 2a 70 70 48 6f 6f 6b 29 3b 0a  Count(*ppHook);.
10c80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
10c90 20 20 20 73 71 6c 69 74 65 33 5f 75 70 64 61 74     sqlite3_updat
10ca0 65 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20  e_hook(pDb->db, 
10cb0 28 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f  (pDb->pUpdateHoo
10cc0 6b 3f 44 62 55 70 64 61 74 65 48 61 6e 64 6c 65  k?DbUpdateHandle
10cd0 72 3a 30 29 2c 20 70 44 62 29 3b 0a 20 20 20 20  r:0), pDb);.    
10ce0 73 71 6c 69 74 65 33 5f 72 6f 6c 6c 62 61 63 6b  sqlite3_rollback
10cf0 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 28 70  _hook(pDb->db,(p
10d00 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f  Db->pRollbackHoo
10d10 6b 3f 44 62 52 6f 6c 6c 62 61 63 6b 48 61 6e 64  k?DbRollbackHand
10d20 6c 65 72 3a 30 29 2c 70 44 62 29 3b 0a 0a 20 20  ler:0),pDb);..  
10d30 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
10d40 2f 2a 20 20 20 20 24 64 62 20 76 65 72 73 69 6f  /*    $db versio
10d50 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75  n.  **.  ** Retu
10d60 72 6e 20 74 68 65 20 76 65 72 73 69 6f 6e 20 73  rn the version s
10d70 74 72 69 6e 67 20 66 6f 72 20 74 68 69 73 20 64  tring for this d
10d80 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
10d90 63 61 73 65 20 44 42 5f 56 45 52 53 49 4f 4e 3a  case DB_VERSION:
10da0 20 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65   {.    Tcl_SetRe
10db0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
10dc0 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6c 69 62  ar *)sqlite3_lib
10dd0 76 65 72 73 69 6f 6e 28 29 2c 20 54 43 4c 5f 53  version(), TCL_S
10de0 54 41 54 49 43 29 3b 0a 20 20 20 20 62 72 65 61  TATIC);.    brea
10df0 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 7d 20 2f 2a 20  k;.  }...  } /* 
10e00 45 6e 64 20 6f 66 20 74 68 65 20 53 57 49 54 43  End of the SWITC
10e10 48 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  H statement */. 
10e20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
10e30 2a 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 20 44  *.**   sqlite3 D
10e40 42 4e 41 4d 45 20 46 49 4c 45 4e 41 4d 45 20 3f  BNAME FILENAME ?
10e50 4d 4f 44 45 3f 20 3f 2d 6b 65 79 20 4b 45 59 3f  MODE? ?-key KEY?
10e60 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  .**.** This is t
10e70 68 65 20 6d 61 69 6e 20 54 63 6c 20 63 6f 6d 6d  he main Tcl comm
10e80 61 6e 64 2e 20 20 57 68 65 6e 20 74 68 65 20 22  and.  When the "
10e90 73 71 6c 69 74 65 22 20 54 63 6c 20 63 6f 6d 6d  sqlite" Tcl comm
10ea0 61 6e 64 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b 65  and is.** invoke
10eb0 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
10ec0 72 75 6e 73 20 74 6f 20 70 72 6f 63 65 73 73 20  runs to process 
10ed0 74 68 61 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  that command..**
10ee0 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72  .** The first ar
10ef0 67 75 6d 65 6e 74 2c 20 44 42 4e 41 4d 45 2c 20  gument, DBNAME, 
10f00 69 73 20 61 6e 20 61 72 62 69 74 72 61 72 79 20  is an arbitrary 
10f10 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 0a 2a  name for a new.*
10f20 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * database conne
10f30 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 63 6f 6d  ction.  This com
10f40 6d 61 6e 64 20 63 72 65 61 74 65 73 20 61 20 6e  mand creates a n
10f50 65 77 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64  ew command named
10f60 0a 2a 2a 20 44 42 4e 41 4d 45 20 74 68 61 74 20  .** DBNAME that 
10f70 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6e 74 72  is used to contr
10f80 6f 6c 20 74 68 61 74 20 63 6f 6e 6e 65 63 74 69  ol that connecti
10f90 6f 6e 2e 20 20 54 68 65 20 64 61 74 61 62 61 73  on.  The databas
10fa0 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  e.** connection 
10fb0 69 73 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  is deleted when 
10fc0 74 68 65 20 44 42 4e 41 4d 45 20 63 6f 6d 6d 61  the DBNAME comma
10fd0 6e 64 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a  nd is deleted..*
10fe0 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  *.** The second 
10ff0 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
11000 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 69 72 65  name of the dire
11010 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61  ctory that conta
11020 69 6e 73 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74  ins.** the sqlit
11030 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  e database that 
11040 69 73 20 74 6f 20 62 65 20 61 63 63 65 73 73 65  is to be accesse
11050 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 73  d..**.** For tes
11060 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2c 20 77  ting purposes, w
11070 65 20 61 6c 73 6f 20 73 75 70 70 6f 72 74 20 74  e also support t
11080 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
11090 0a 2a 2a 20 20 73 71 6c 69 74 65 33 20 2d 65 6e  .**  sqlite3 -en
110a0 63 6f 64 69 6e 67 0a 2a 2a 0a 2a 2a 20 20 20 20  coding.**.**    
110b0 20 20 20 52 65 74 75 72 6e 20 74 68 65 20 65 6e     Return the en
110c0 63 6f 64 69 6e 67 20 75 73 65 64 20 62 79 20 4c  coding used by L
110d0 49 4b 45 20 61 6e 64 20 47 4c 4f 42 20 6f 70 65  IKE and GLOB ope
110e0 72 61 74 6f 72 73 2e 20 20 43 68 6f 69 63 65 73  rators.  Choices
110f0 0a 2a 2a 20 20 20 20 20 20 20 61 72 65 20 55 54  .**       are UT
11100 46 2d 38 20 61 6e 64 20 69 73 6f 38 38 35 39 2e  F-8 and iso8859.
11110 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74 65 33 20  .**.**  sqlite3 
11120 2d 76 65 72 73 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20  -version.**.**  
11130 20 20 20 20 20 52 65 74 75 72 6e 20 74 68 65 20       Return the 
11140 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 6f  version number o
11150 66 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69 62  f the SQLite lib
11160 72 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 73 71 6c  rary..**.**  sql
11170 69 74 65 33 20 2d 74 63 6c 2d 75 73 65 73 2d 75  ite3 -tcl-uses-u
11180 74 66 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 52  tf.**.**       R
11190 65 74 75 72 6e 20 22 31 22 20 69 66 20 63 6f 6d  eturn "1" if com
111a0 70 69 6c 65 64 20 77 69 74 68 20 61 20 54 63 6c  piled with a Tcl
111b0 20 75 73 65 73 20 55 54 46 2d 38 2e 20 20 52 65   uses UTF-8.  Re
111c0 74 75 72 6e 20 22 30 22 20 69 66 0a 2a 2a 20 20  turn "0" if.**  
111d0 20 20 20 20 20 6e 6f 74 2e 20 20 55 73 65 64 20       not.  Used 
111e0 62 79 20 74 65 73 74 73 20 74 6f 20 6d 61 6b 65  by tests to make
111f0 20 73 75 72 65 20 74 68 65 20 6c 69 62 72 61 72   sure the librar
11200 79 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 0a  y was compiled .
11210 2a 2a 20 20 20 20 20 20 20 63 6f 72 72 65 63 74  **       correct
11220 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ly..*/.static in
11230 74 20 44 62 4d 61 69 6e 28 76 6f 69 64 20 2a 63  t DbMain(void *c
11240 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  d, Tcl_Interp *i
11250 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
11260 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f  Tcl_Obj *const*o
11270 62 6a 76 29 7b 0a 20 20 53 71 6c 69 74 65 44 62  bjv){.  SqliteDb
11280 20 2a 70 3b 0a 20 20 76 6f 69 64 20 2a 70 4b 65   *p;.  void *pKe
11290 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4b 65  y = 0;.  int nKe
112a0 79 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63  y = 0;.  const c
112b0 68 61 72 20 2a 7a 41 72 67 3b 0a 20 20 63 68 61  har *zArg;.  cha
112c0 72 20 2a 7a 45 72 72 4d 73 67 3b 0a 20 20 63 6f  r *zErrMsg;.  co
112d0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b  nst char *zFile;
112e0 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 74  .  Tcl_DString t
112f0 72 61 6e 73 6c 61 74 65 64 46 69 6c 65 6e 61 6d  ranslatedFilenam
11300 65 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32  e;.  if( objc==2
11310 20 29 7b 0a 20 20 20 20 7a 41 72 67 20 3d 20 54   ){.    zArg = T
11320 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
11330 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b  Obj(objv[1], 0);
11340 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
11350 7a 41 72 67 2c 22 2d 76 65 72 73 69 6f 6e 22 29  zArg,"-version")
11360 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  ==0 ){.      Tcl
11370 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
11380 74 65 72 70 2c 73 71 6c 69 74 65 33 5f 76 65 72  terp,sqlite3_ver
11390 73 69 6f 6e 2c 30 29 3b 0a 20 20 20 20 20 20 72  sion,0);.      r
113a0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20  eturn TCL_OK;.  
113b0 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72 63    }.    if( strc
113c0 6d 70 28 7a 41 72 67 2c 22 2d 68 61 73 2d 63 6f  mp(zArg,"-has-co
113d0 64 65 63 22 29 3d 3d 30 20 29 7b 0a 23 69 66 64  dec")==0 ){.#ifd
113e0 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
113f0 44 45 43 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  DEC.      Tcl_Ap
11400 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
11410 70 2c 22 31 22 2c 30 29 3b 0a 23 65 6c 73 65 0a  p,"1",0);.#else.
11420 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
11430 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 30  Result(interp,"0
11440 22 2c 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ",0);.#endif.   
11450 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
11460 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
11470 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 74 63  strcmp(zArg,"-tc
11480 6c 2d 75 73 65 73 2d 75 74 66 22 29 3d 3d 30 20  l-uses-utf")==0 
11490 29 7b 0a 23 69 66 64 65 66 20 54 43 4c 5f 55 54  ){.#ifdef TCL_UT
114a0 46 5f 4d 41 58 0a 20 20 20 20 20 20 54 63 6c 5f  F_MAX.      Tcl_
114b0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
114c0 65 72 70 2c 22 31 22 2c 30 29 3b 0a 23 65 6c 73  erp,"1",0);.#els
114d0 65 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  e.      Tcl_Appe
114e0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
114f0 22 30 22 2c 30 29 3b 0a 23 65 6e 64 69 66 0a 20  "0",0);.#endif. 
11500 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
11510 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
11520 69 66 28 20 6f 62 6a 63 3d 3d 35 20 7c 7c 20 6f  if( objc==5 || o
11530 62 6a 63 3d 3d 36 20 29 7b 0a 20 20 20 20 7a 41  bjc==6 ){.    zA
11540 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  rg = Tcl_GetStri
11550 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 6f  ngFromObj(objv[o
11560 62 6a 63 2d 32 5d 2c 20 30 29 3b 0a 20 20 20 20  bjc-2], 0);.    
11570 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c  if( strcmp(zArg,
11580 22 2d 6b 65 79 22 29 3d 3d 30 20 29 7b 0a 20 20  "-key")==0 ){.  
11590 20 20 20 20 70 4b 65 79 20 3d 20 54 63 6c 5f 47      pKey = Tcl_G
115a0 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f  etByteArrayFromO
115b0 62 6a 28 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 2c  bj(objv[objc-1],
115c0 20 26 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 6f   &nKey);.      o
115d0 62 6a 63 20 2d 3d 20 32 3b 0a 20 20 20 20 7d 0a  bjc -= 2;.    }.
115e0 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d    }.  if( objc!=
115f0 33 20 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a  3 && objc!=4 ){.
11600 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
11610 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
11620 6f 62 6a 76 2c 20 0a 23 69 66 64 65 66 20 53 51  objv, .#ifdef SQ
11630 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
11640 20 20 20 20 20 22 48 41 4e 44 4c 45 20 46 49 4c       "HANDLE FIL
11650 45 4e 41 4d 45 20 3f 2d 6b 65 79 20 43 4f 44 45  ENAME ?-key CODE
11660 43 2d 4b 45 59 3f 22 0a 23 65 6c 73 65 0a 20 20  C-KEY?".#else.  
11670 20 20 20 20 22 48 41 4e 44 4c 45 20 46 49 4c 45      "HANDLE FILE
11680 4e 41 4d 45 20 3f 4d 4f 44 45 3f 22 0a 23 65 6e  NAME ?MODE?".#en
11690 64 69 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 72  dif.    );.    r
116a0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
116b0 0a 20 20 7d 0a 20 20 7a 45 72 72 4d 73 67 20 3d  .  }.  zErrMsg =
116c0 20 30 3b 0a 20 20 70 20 3d 20 28 53 71 6c 69 74   0;.  p = (Sqlit
116d0 65 44 62 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20  eDb*)Tcl_Alloc( 
116e0 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20  sizeof(*p) );.  
116f0 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20  if( p==0 ){.    
11700 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
11710 74 65 72 70 2c 20 22 6d 61 6c 6c 6f 63 20 66 61  terp, "malloc fa
11720 69 6c 65 64 22 2c 20 54 43 4c 5f 53 54 41 54 49  iled", TCL_STATI
11730 43 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  C);.    return T
11740 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
11750 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a  memset(p, 0, siz
11760 65 6f 66 28 2a 70 29 29 3b 0a 20 20 7a 46 69 6c  eof(*p));.  zFil
11770 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
11780 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
11790 2c 20 30 29 3b 0a 20 20 7a 46 69 6c 65 20 3d 20  , 0);.  zFile = 
117a0 54 63 6c 5f 54 72 61 6e 73 6c 61 74 65 46 69 6c  Tcl_TranslateFil
117b0 65 4e 61 6d 65 28 69 6e 74 65 72 70 2c 20 7a 46  eName(interp, zF
117c0 69 6c 65 2c 20 26 74 72 61 6e 73 6c 61 74 65 64  ile, &translated
117d0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 73 71 6c  Filename);.  sql
117e0 69 74 65 33 5f 6f 70 65 6e 28 7a 46 69 6c 65 2c  ite3_open(zFile,
117f0 20 26 70 2d 3e 64 62 29 3b 0a 20 20 54 63 6c 5f   &p->db);.  Tcl_
11800 44 53 74 72 69 6e 67 46 72 65 65 28 26 74 72 61  DStringFree(&tra
11810 6e 73 6c 61 74 65 64 46 69 6c 65 6e 61 6d 65 29  nslatedFilename)
11820 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
11830 4b 21 3d 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  K!=sqlite3_errco
11840 64 65 28 70 2d 3e 64 62 29 20 29 7b 0a 20 20 20  de(p->db) ){.   
11850 20 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74   zErrMsg = sqlit
11860 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c  e3_mprintf("%s",
11870 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
11880 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 73 71 6c  p->db));.    sql
11890 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62  ite3_close(p->db
118a0 29 3b 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20 30  );.    p->db = 0
118b0 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  ;.  }.#ifdef SQL
118c0 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 70  ITE_TEST.  if( p
118d0 2d 3e 64 62 20 29 7b 0a 20 20 20 20 65 78 74 65  ->db ){.    exte
118e0 72 6e 20 69 6e 74 20 4d 64 35 5f 52 65 67 69 73  rn int Md5_Regis
118f0 74 65 72 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20  ter(sqlite3*);. 
11900 20 20 20 69 66 28 20 4d 64 35 5f 52 65 67 69 73     if( Md5_Regis
11910 74 65 72 28 70 2d 3e 64 62 29 3d 3d 53 51 4c 49  ter(p->db)==SQLI
11920 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  TE_NOMEM ){.    
11930 20 20 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69    zErrMsg = sqli
11940 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
11950 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
11960 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20  (p->db));.      
11970 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d  sqlite3_close(p-
11980 3e 64 62 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64  >db);.      p->d
11990 62 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  b = 0;.    }.  }
119a0 0a 23 65 6e 64 69 66 20 20 0a 23 69 66 64 65 66  .#endif  .#ifdef
119b0 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
119c0 43 0a 20 20 69 66 28 20 70 2d 3e 64 62 20 29 7b  C.  if( p->db ){
119d0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6b 65 79  .    sqlite3_key
119e0 28 70 2d 3e 64 62 2c 20 70 4b 65 79 2c 20 6e 4b  (p->db, pKey, nK
119f0 65 79 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ey);.  }.#endif.
11a00 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29    if( p->db==0 )
11a10 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  {.    Tcl_SetRes
11a20 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72  ult(interp, zErr
11a30 4d 73 67 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c  Msg, TCL_VOLATIL
11a40 45 29 3b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65  E);.    Tcl_Free
11a50 28 28 63 68 61 72 2a 29 70 29 3b 0a 20 20 20 20  ((char*)p);.    
11a60 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72  sqlite3_free(zEr
11a70 72 4d 73 67 29 3b 0a 20 20 20 20 72 65 74 75 72  rMsg);.    retur
11a80 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
11a90 0a 20 20 70 2d 3e 6d 61 78 53 74 6d 74 20 3d 20  .  p->maxStmt = 
11aa0 4e 55 4d 5f 50 52 45 50 41 52 45 44 5f 53 54 4d  NUM_PREPARED_STM
11ab0 54 53 3b 0a 20 20 70 2d 3e 69 6e 74 65 72 70 20  TS;.  p->interp 
11ac0 3d 20 69 6e 74 65 72 70 3b 0a 20 20 7a 41 72 67  = interp;.  zArg
11ad0 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
11ae0 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c  FromObj(objv[1],
11af0 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74   0);.  Tcl_Creat
11b00 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
11b10 72 70 2c 20 7a 41 72 67 2c 20 44 62 4f 62 6a 43  rp, zArg, DbObjC
11b20 6d 64 2c 20 28 63 68 61 72 2a 29 70 2c 20 44 62  md, (char*)p, Db
11b30 44 65 6c 65 74 65 43 6d 64 29 3b 0a 20 20 72 65  DeleteCmd);.  re
11b40 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
11b50 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20 61 20  /*.** Provide a 
11b60 64 75 6d 6d 79 20 54 63 6c 5f 49 6e 69 74 53 74  dummy Tcl_InitSt
11b70 75 62 73 20 69 66 20 77 65 20 61 72 65 20 75 73  ubs if we are us
11b80 69 6e 67 20 74 68 69 73 20 61 73 20 61 20 73 74  ing this as a st
11b90 61 74 69 63 0a 2a 2a 20 6c 69 62 72 61 72 79 2e  atic.** library.
11ba0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 55 53 45 5f  .*/.#ifndef USE_
11bb0 54 43 4c 5f 53 54 55 42 53 0a 23 20 75 6e 64 65  TCL_STUBS.# unde
11bc0 66 20 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73  f  Tcl_InitStubs
11bd0 0a 23 20 64 65 66 69 6e 65 20 54 63 6c 5f 49 6e  .# define Tcl_In
11be0 69 74 53 74 75 62 73 28 61 2c 62 2c 63 29 0a 23  itStubs(a,b,c).#
11bf0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  endif../*.** Mak
11c00 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20 61  e sure we have a
11c10 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e   PACKAGE_VERSION
11c20 20 6d 61 63 72 6f 20 64 65 66 69 6e 65 64 2e 20   macro defined. 
11c30 20 54 68 69 73 20 77 69 6c 6c 20 62 65 0a 2a 2a   This will be.**
11c40 20 64 65 66 69 6e 65 64 20 61 75 74 6f 6d 61 74   defined automat
11c50 69 63 61 6c 6c 79 20 62 79 20 74 68 65 20 54 45  ically by the TE
11c60 41 20 6d 61 6b 65 66 69 6c 65 2e 20 20 42 75 74  A makefile.  But
11c70 20 6f 74 68 65 72 20 6d 61 6b 65 66 69 6c 65 73   other makefiles
11c80 0a 2a 2a 20 64 6f 20 6e 6f 74 20 64 65 66 69 6e  .** do not defin
11c90 65 20 69 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  e it..*/.#ifndef
11ca0 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e   PACKAGE_VERSION
11cb0 0a 23 20 64 65 66 69 6e 65 20 50 41 43 4b 41 47  .# define PACKAG
11cc0 45 5f 56 45 52 53 49 4f 4e 20 53 51 4c 49 54 45  E_VERSION SQLITE
11cd0 5f 56 45 52 53 49 4f 4e 0a 23 65 6e 64 69 66 0a  _VERSION.#endif.
11ce0 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
11cf0 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a  e this module..*
11d00 2a 0a 2a 2a 20 54 68 69 73 20 54 63 6c 20 6d 6f  *.** This Tcl mo
11d10 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  dule contains on
11d20 6c 79 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20  ly a single new 
11d30 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65  Tcl command name
11d40 64 20 22 73 71 6c 69 74 65 22 2e 0a 2a 2a 20 28  d "sqlite"..** (
11d50 48 65 6e 63 65 20 74 68 65 72 65 20 69 73 20 6e  Hence there is n
11d60 6f 20 6e 61 6d 65 73 70 61 63 65 2e 20 20 54 68  o namespace.  Th
11d70 65 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20  ere is no point 
11d80 69 6e 20 75 73 69 6e 67 20 61 20 6e 61 6d 65 73  in using a names
11d90 70 61 63 65 0a 2a 2a 20 69 66 20 74 68 65 20 65  pace.** if the e
11da0 78 74 65 6e 73 69 6f 6e 20 6f 6e 6c 79 20 73 75  xtension only su
11db0 70 70 6c 69 65 73 20 6f 6e 65 20 6e 65 77 20 6e  pplies one new n
11dc0 61 6d 65 21 29 20 20 54 68 65 20 22 73 71 6c 69  ame!)  The "sqli
11dd0 74 65 22 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a  te" command is.*
11de0 2a 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 61  * used to open a
11df0 20 6e 65 77 20 53 51 4c 69 74 65 20 64 61 74 61   new SQLite data
11e00 62 61 73 65 2e 20 20 53 65 65 20 74 68 65 20 44  base.  See the D
11e10 62 4d 61 69 6e 28 29 20 72 6f 75 74 69 6e 65 20  bMain() routine 
11e20 61 62 6f 76 65 0a 2a 2a 20 66 6f 72 20 61 64 64  above.** for add
11e30 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
11e40 69 6f 6e 2e 0a 2a 2f 0a 45 58 54 45 52 4e 20 69  ion..*/.EXTERN i
11e50 6e 74 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28  nt Sqlite3_Init(
11e60 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
11e70 72 70 29 7b 0a 20 20 54 63 6c 5f 49 6e 69 74 53  rp){.  Tcl_InitS
11e80 74 75 62 73 28 69 6e 74 65 72 70 2c 20 22 38 2e  tubs(interp, "8.
11e90 34 22 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72  4", 0);.  Tcl_Cr
11ea0 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
11eb0 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33 22  nterp, "sqlite3"
11ec0 2c 20 28 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f  , (Tcl_ObjCmdPro
11ed0 63 2a 29 44 62 4d 61 69 6e 2c 20 30 2c 20 30 29  c*)DbMain, 0, 0)
11ee0 3b 0a 20 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69  ;.  Tcl_PkgProvi
11ef0 64 65 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  de(interp, "sqli
11f00 74 65 33 22 2c 20 50 41 43 4b 41 47 45 5f 56 45  te3", PACKAGE_VE
11f10 52 53 49 4f 4e 29 3b 0a 20 20 54 63 6c 5f 43 72  RSION);.  Tcl_Cr
11f20 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
11f30 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 22 2c  nterp, "sqlite",
11f40 20 28 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63   (Tcl_ObjCmdProc
11f50 2a 29 44 62 4d 61 69 6e 2c 20 30 2c 20 30 29 3b  *)DbMain, 0, 0);
11f60 0a 20 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64  .  Tcl_PkgProvid
11f70 65 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  e(interp, "sqlit
11f80 65 22 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53  e", PACKAGE_VERS
11f90 49 4f 4e 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  ION);.  return T
11fa0 43 4c 5f 4f 4b 3b 0a 7d 0a 45 58 54 45 52 4e 20  CL_OK;.}.EXTERN 
11fb0 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 33 5f 49  int Tclsqlite3_I
11fc0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
11fd0 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20  interp){ return 
11fe0 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74  Sqlite3_Init(int
11ff0 65 72 70 29 3b 20 7d 0a 45 58 54 45 52 4e 20 69  erp); }.EXTERN i
12000 6e 74 20 53 71 6c 69 74 65 33 5f 53 61 66 65 49  nt Sqlite3_SafeI
12010 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
12020 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20  interp){ return 
12030 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e  TCL_OK; }.EXTERN
12040 20 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 33 5f   int Tclsqlite3_
12050 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74  SafeInit(Tcl_Int
12060 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65  erp *interp){ re
12070 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 0a  turn TCL_OK; }..
12080 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 33  #ifndef SQLITE_3
12090 5f 53 55 46 46 49 58 5f 4f 4e 4c 59 0a 45 58 54  _SUFFIX_ONLY.EXT
120a0 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65 5f 49  ERN int Sqlite_I
120b0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
120c0 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20  interp){ return 
120d0 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74  Sqlite3_Init(int
120e0 65 72 70 29 3b 20 7d 0a 45 58 54 45 52 4e 20 69  erp); }.EXTERN i
120f0 6e 74 20 54 63 6c 73 71 6c 69 74 65 5f 49 6e 69  nt Tclsqlite_Ini
12100 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
12110 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 53 71  terp){ return Sq
12120 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72  lite3_Init(inter
12130 70 29 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74  p); }.EXTERN int
12140 20 53 71 6c 69 74 65 5f 53 61 66 65 49 6e 69 74   Sqlite_SafeInit
12150 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
12160 65 72 70 29 7b 20 72 65 74 75 72 6e 20 54 43 4c  erp){ return TCL
12170 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e  _OK; }.EXTERN in
12180 74 20 54 63 6c 73 71 6c 69 74 65 5f 53 61 66 65  t Tclsqlite_Safe
12190 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
121a0 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e  *interp){ return
121b0 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 23 65 6e 64 69   TCL_OK; }.#endi
121c0 66 0a 0a 23 69 66 64 65 66 20 54 43 4c 53 48 0a  f..#ifdef TCLSH.
121d0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
121e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
121f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
12220 2a 20 54 68 65 20 63 6f 64 65 20 74 68 61 74 20  * The code that 
12230 66 6f 6c 6c 6f 77 73 20 69 73 20 75 73 65 64 20  follows is used 
12240 74 6f 20 62 75 69 6c 64 20 73 74 61 6e 64 61 6c  to build standal
12250 6f 6e 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  one TCL interpre
12260 74 65 72 73 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49  ters.*/../*.** I
12270 66 20 74 68 65 20 6d 61 63 72 6f 20 54 43 4c 53  f the macro TCLS
12280 48 20 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 70  H is one, then p
12290 75 74 20 69 6e 20 63 6f 64 65 20 74 68 69 73 20  ut in code this 
122a0 66 6f 72 20 74 68 65 0a 2a 2a 20 22 6d 61 69 6e  for the.** "main
122b0 22 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77  " routine that w
122c0 69 6c 6c 20 69 6e 69 74 69 61 6c 69 7a 65 20 54  ill initialize T
122d0 63 6c 20 61 6e 64 20 74 61 6b 65 20 69 6e 70 75  cl and take inpu
122e0 74 20 66 72 6f 6d 0a 2a 2a 20 73 74 61 6e 64 61  t from.** standa
122f0 72 64 20 69 6e 70 75 74 2e 0a 2a 2f 0a 23 69 66  rd input..*/.#if
12300 20 54 43 4c 53 48 3d 3d 31 0a 73 74 61 74 69 63   TCLSH==1.static
12310 20 63 68 61 72 20 7a 4d 61 69 6e 6c 6f 6f 70 5b   char zMainloop[
12320 5d 20 3d 0a 20 20 22 73 65 74 20 6c 69 6e 65 20  ] =.  "set line 
12330 7b 7d 5c 6e 22 0a 20 20 22 77 68 69 6c 65 20 7b  {}\n".  "while {
12340 21 5b 65 6f 66 20 73 74 64 69 6e 5d 7d 20 7b 5c  ![eof stdin]} {\
12350 6e 22 0a 20 20 20 20 22 69 66 20 7b 24 6c 69 6e  n".    "if {$lin
12360 65 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20  e!=\"\"} {\n".  
12370 20 20 20 20 22 70 75 74 73 20 2d 6e 6f 6e 65 77      "puts -nonew
12380 6c 69 6e 65 20 5c 22 3e 20 5c 22 5c 6e 22 0a 20  line \"> \"\n". 
12390 20 20 20 22 7d 20 65 6c 73 65 20 7b 5c 6e 22 0a     "} else {\n".
123a0 20 20 20 20 20 20 22 70 75 74 73 20 2d 6e 6f 6e        "puts -non
123b0 65 77 6c 69 6e 65 20 5c 22 25 20 5c 22 5c 6e 22  ewline \"% \"\n"
123c0 0a 20 20 20 20 22 7d 5c 6e 22 0a 20 20 20 20 22  .    "}\n".    "
123d0 66 6c 75 73 68 20 73 74 64 6f 75 74 5c 6e 22 0a  flush stdout\n".
123e0 20 20 20 20 22 61 70 70 65 6e 64 20 6c 69 6e 65      "append line
123f0 20 5b 67 65 74 73 20 73 74 64 69 6e 5d 5c 6e 22   [gets stdin]\n"
12400 0a 20 20 20 20 22 69 66 20 7b 5b 69 6e 66 6f 20  .    "if {[info 
12410 63 6f 6d 70 6c 65 74 65 20 24 6c 69 6e 65 5d 7d  complete $line]}
12420 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 69 66 20   {\n".      "if 
12430 7b 5b 63 61 74 63 68 20 7b 75 70 6c 65 76 65 6c  {[catch {uplevel
12440 20 23 30 20 24 6c 69 6e 65 7d 20 72 65 73 75 6c   #0 $line} resul
12450 74 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20  t]} {\n".       
12460 20 22 70 75 74 73 20 73 74 64 65 72 72 20 5c 22   "puts stderr \"
12470 45 72 72 6f 72 3a 20 24 72 65 73 75 6c 74 5c 22  Error: $result\"
12480 5c 6e 22 0a 20 20 20 20 20 20 22 7d 20 65 6c 73  \n".      "} els
12490 65 69 66 20 7b 24 72 65 73 75 6c 74 21 3d 5c 22  eif {$result!=\"
124a0 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20  \"} {\n".       
124b0 20 22 70 75 74 73 20 24 72 65 73 75 6c 74 5c 6e   "puts $result\n
124c0 22 0a 20 20 20 20 20 20 22 7d 5c 6e 22 0a 20 20  ".      "}\n".  
124d0 20 20 20 20 22 73 65 74 20 6c 69 6e 65 20 7b 7d      "set line {}
124e0 5c 6e 22 0a 20 20 20 20 22 7d 20 65 6c 73 65 20  \n".    "} else 
124f0 7b 5c 6e 22 0a 20 20 20 20 20 20 22 61 70 70 65  {\n".      "appe
12500 6e 64 20 6c 69 6e 65 20 5c 5c 6e 5c 6e 22 0a 20  nd line \\n\n". 
12510 20 20 20 22 7d 5c 6e 22 0a 20 20 22 7d 5c 6e 22     "}\n".  "}\n"
12520 0a 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .;.#endif../*.**
12530 20 49 66 20 74 68 65 20 6d 61 63 72 6f 20 54 43   If the macro TC
12540 4c 53 48 20 69 73 20 74 77 6f 2c 20 74 68 65 6e  LSH is two, then
12550 20 67 65 74 20 74 68 65 20 6d 61 69 6e 20 6c 6f   get the main lo
12560 6f 70 20 63 6f 64 65 20 6f 75 74 20 6f 66 0a 2a  op code out of.*
12570 2a 20 74 68 65 20 73 65 70 61 72 61 74 65 20 66  * the separate f
12580 69 6c 65 20 22 73 70 61 63 65 61 6e 61 6c 5f 74  ile "spaceanal_t
12590 63 6c 2e 68 22 2e 0a 2a 2f 0a 23 69 66 20 54 43  cl.h"..*/.#if TC
125a0 4c 53 48 3d 3d 32 0a 73 74 61 74 69 63 20 63 68  LSH==2.static ch
125b0 61 72 20 7a 4d 61 69 6e 6c 6f 6f 70 5b 5d 20 3d  ar zMainloop[] =
125c0 20 0a 23 69 6e 63 6c 75 64 65 20 22 73 70 61 63   .#include "spac
125d0 65 61 6e 61 6c 5f 74 63 6c 2e 68 22 0a 3b 0a 23  eanal_tcl.h".;.#
125e0 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 54  endif..#define T
125f0 43 4c 53 48 5f 4d 41 49 4e 20 6d 61 69 6e 20 20  CLSH_MAIN main  
12600 20 2f 2a 20 4e 65 65 64 65 64 20 74 6f 20 66 61   /* Needed to fa
12610 6b 65 20 6f 75 74 20 6d 6b 74 63 6c 61 70 70 20  ke out mktclapp 
12620 2a 2f 0a 69 6e 74 20 54 43 4c 53 48 5f 4d 41 49  */.int TCLSH_MAI
12630 4e 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72  N(int argc, char
12640 20 2a 2a 61 72 67 76 29 7b 0a 20 20 54 63 6c 5f   **argv){.  Tcl_
12650 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a  Interp *interp;.
12660 20 20 54 63 6c 5f 46 69 6e 64 45 78 65 63 75 74    Tcl_FindExecut
12670 61 62 6c 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20  able(argv[0]);. 
12680 20 69 6e 74 65 72 70 20 3d 20 54 63 6c 5f 43 72   interp = Tcl_Cr
12690 65 61 74 65 49 6e 74 65 72 70 28 29 3b 0a 20 20  eateInterp();.  
126a0 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74  Sqlite3_Init(int
126b0 65 72 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  erp);.#ifdef SQL
126c0 49 54 45 5f 54 45 53 54 0a 20 20 7b 0a 20 20 20  ITE_TEST.  {.   
126d0 20 65 78 74 65 72 6e 20 69 6e 74 20 4d 64 35 5f   extern int Md5_
126e0 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
126f0 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
12700 74 20 53 71 6c 69 74 65 63 6f 6e 66 69 67 5f 49  t Sqliteconfig_I
12710 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
12720 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
12730 20 53 71 6c 69 74 65 74 65 73 74 31 5f 49 6e 69   Sqlitetest1_Ini
12740 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
12750 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
12760 71 6c 69 74 65 74 65 73 74 32 5f 49 6e 69 74 28  qlitetest2_Init(
12770 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
12780 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
12790 69 74 65 74 65 73 74 33 5f 49 6e 69 74 28 54 63  itetest3_Init(Tc
127a0 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
127b0 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
127c0 65 74 65 73 74 34 5f 49 6e 69 74 28 54 63 6c 5f  etest4_Init(Tcl_
127d0 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
127e0 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
127f0 65 73 74 35 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  est5_Init(Tcl_In
12800 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
12810 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
12820 74 36 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  t6_Init(Tcl_Inte
12830 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
12840 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 37   int Sqlitetest7
12850 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
12860 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
12870 6e 74 20 53 71 6c 69 74 65 74 65 73 74 38 5f 49  nt Sqlitetest8_I
12880 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
12890 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
128a0 20 53 71 6c 69 74 65 74 65 73 74 39 5f 49 6e 69   Sqlitetest9_Ini
128b0 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
128c0 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
128d0 71 6c 69 74 65 74 65 73 74 61 73 79 6e 63 5f 49  qlitetestasync_I
128e0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
128f0 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
12900 20 53 71 6c 69 74 65 74 65 73 74 5f 61 75 74 6f   Sqlitetest_auto
12910 65 78 74 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  ext_Init(Tcl_Int
12920 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
12930 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
12940 5f 68 65 78 69 6f 5f 49 6e 69 74 28 54 63 6c 5f  _hexio_Init(Tcl_
12950 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
12960 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
12970 65 73 74 5f 6d 61 6c 6c 6f 63 5f 49 6e 69 74 28  est_malloc_Init(
12980 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
12990 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
129a0 69 74 65 74 65 73 74 73 63 68 65 6d 61 5f 49 6e  itetestschema_In
129b0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
129c0 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
129d0 53 71 6c 69 74 65 74 65 73 74 73 73 65 5f 49 6e  Sqlitetestsse_In
129e0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
129f0 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
12a00 53 71 6c 69 74 65 74 65 73 74 74 63 6c 76 61 72  Sqlitetesttclvar
12a10 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
12a20 2a 29 3b 0a 0a 20 20 20 20 4d 64 35 5f 49 6e 69  *);..    Md5_Ini
12a30 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
12a40 71 6c 69 74 65 63 6f 6e 66 69 67 5f 49 6e 69 74  qliteconfig_Init
12a50 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
12a60 6c 69 74 65 74 65 73 74 31 5f 49 6e 69 74 28 69  litetest1_Init(i
12a70 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
12a80 74 65 74 65 73 74 32 5f 49 6e 69 74 28 69 6e 74  tetest2_Init(int
12a90 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
12aa0 74 65 73 74 33 5f 49 6e 69 74 28 69 6e 74 65 72  test3_Init(inter
12ab0 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
12ac0 73 74 34 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  st4_Init(interp)
12ad0 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
12ae0 35 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  5_Init(interp);.
12af0 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 36 5f      Sqlitetest6_
12b00 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
12b10 20 20 53 71 6c 69 74 65 74 65 73 74 37 5f 49 6e    Sqlitetest7_In
12b20 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
12b30 53 71 6c 69 74 65 74 65 73 74 38 5f 49 6e 69 74  Sqlitetest8_Init
12b40 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
12b50 6c 69 74 65 74 65 73 74 39 5f 49 6e 69 74 28 69  litetest9_Init(i
12b60 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
12b70 74 65 74 65 73 74 61 73 79 6e 63 5f 49 6e 69 74  tetestasync_Init
12b80 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
12b90 6c 69 74 65 74 65 73 74 5f 61 75 74 6f 65 78 74  litetest_autoext
12ba0 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
12bb0 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f 68 65     Sqlitetest_he
12bc0 78 69 6f 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  xio_Init(interp)
12bd0 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
12be0 5f 6d 61 6c 6c 6f 63 5f 49 6e 69 74 28 69 6e 74  _malloc_Init(int
12bf0 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
12c00 74 65 73 74 73 63 68 65 6d 61 5f 49 6e 69 74 28  testschema_Init(
12c10 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
12c20 69 74 65 74 65 73 74 74 63 6c 76 61 72 5f 49 6e  itetesttclvar_In
12c30 69 74 28 69 6e 74 65 72 70 29 3b 0a 23 69 66 64  it(interp);.#ifd
12c40 65 66 20 53 51 4c 49 54 45 5f 53 53 45 0a 20 20  ef SQLITE_SSE.  
12c50 20 20 53 71 6c 69 74 65 74 65 73 74 73 73 65 5f    Sqlitetestsse_
12c60 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 23 65  Init(interp);.#e
12c70 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ndif.  }.#endif.
12c80 20 20 69 66 28 20 61 72 67 63 3e 3d 32 20 7c 7c    if( argc>=2 ||
12c90 20 54 43 4c 53 48 3d 3d 32 20 29 7b 0a 20 20 20   TCLSH==2 ){.   
12ca0 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 68 61 72   int i;.    char
12cb0 20 7a 41 72 67 63 5b 33 32 5d 3b 0a 20 20 20 20   zArgc[32];.    
12cc0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
12cd0 28 73 69 7a 65 6f 66 28 7a 41 72 67 63 29 2c 20  (sizeof(zArgc), 
12ce0 7a 41 72 67 63 2c 20 22 25 64 22 2c 20 61 72 67  zArgc, "%d", arg
12cf0 63 2d 28 33 2d 54 43 4c 53 48 29 29 3b 0a 20 20  c-(3-TCLSH));.  
12d00 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74    Tcl_SetVar(int
12d10 65 72 70 2c 22 61 72 67 63 22 2c 20 7a 41 72 67  erp,"argc", zArg
12d20 63 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e  c, TCL_GLOBAL_ON
12d30 4c 59 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  LY);.    Tcl_Set
12d40 56 61 72 28 69 6e 74 65 72 70 2c 22 61 72 67 76  Var(interp,"argv
12d50 30 22 2c 61 72 67 76 5b 31 5d 2c 54 43 4c 5f 47  0",argv[1],TCL_G
12d60 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20  LOBAL_ONLY);.   
12d70 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65   Tcl_SetVar(inte
12d80 72 70 2c 22 61 72 67 76 22 2c 20 22 22 2c 20 54  rp,"argv", "", T
12d90 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
12da0 0a 20 20 20 20 66 6f 72 28 69 3d 33 2d 54 43 4c  .    for(i=3-TCL
12db0 53 48 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29  SH; i<argc; i++)
12dc0 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 56  {.      Tcl_SetV
12dd0 61 72 28 69 6e 74 65 72 70 2c 20 22 61 72 67 76  ar(interp, "argv
12de0 22 2c 20 61 72 67 76 5b 69 5d 2c 0a 20 20 20 20  ", argv[i],.    
12df0 20 20 20 20 20 20 54 43 4c 5f 47 4c 4f 42 41 4c        TCL_GLOBAL
12e00 5f 4f 4e 4c 59 20 7c 20 54 43 4c 5f 4c 49 53 54  _ONLY | TCL_LIST
12e10 5f 45 4c 45 4d 45 4e 54 20 7c 20 54 43 4c 5f 41  _ELEMENT | TCL_A
12e20 50 50 45 4e 44 5f 56 41 4c 55 45 29 3b 0a 20 20  PPEND_VALUE);.  
12e30 20 20 7d 0a 20 20 20 20 69 66 28 20 54 43 4c 53    }.    if( TCLS
12e40 48 3d 3d 31 20 26 26 20 54 63 6c 5f 45 76 61 6c  H==1 && Tcl_Eval
12e50 46 69 6c 65 28 69 6e 74 65 72 70 2c 20 61 72 67  File(interp, arg
12e60 76 5b 31 5d 29 21 3d 54 43 4c 5f 4f 4b 20 29 7b  v[1])!=TCL_OK ){
12e70 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
12e80 72 20 2a 7a 49 6e 66 6f 20 3d 20 54 63 6c 5f 47  r *zInfo = Tcl_G
12e90 65 74 56 61 72 28 69 6e 74 65 72 70 2c 20 22 65  etVar(interp, "e
12ea0 72 72 6f 72 49 6e 66 6f 22 2c 20 54 43 4c 5f 47  rrorInfo", TCL_G
12eb0 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20  LOBAL_ONLY);.   
12ec0 20 20 20 69 66 28 20 7a 49 6e 66 6f 3d 3d 30 20     if( zInfo==0 
12ed0 29 20 7a 49 6e 66 6f 20 3d 20 69 6e 74 65 72 70  ) zInfo = interp
12ee0 2d 3e 72 65 73 75 6c 74 3b 0a 20 20 20 20 20 20  ->result;.      
12ef0 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
12f00 25 73 3a 20 25 73 5c 6e 22 2c 20 2a 61 72 67 76  %s: %s\n", *argv
12f10 2c 20 7a 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  , zInfo);.      
12f20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
12f30 20 20 7d 0a 20 20 69 66 28 20 61 72 67 63 3c 3d    }.  if( argc<=
12f40 31 20 7c 7c 20 54 43 4c 53 48 3d 3d 32 20 29 7b  1 || TCLSH==2 ){
12f50 0a 20 20 20 20 54 63 6c 5f 47 6c 6f 62 61 6c 45  .    Tcl_GlobalE
12f60 76 61 6c 28 69 6e 74 65 72 70 2c 20 7a 4d 61 69  val(interp, zMai
12f70 6e 6c 6f 6f 70 29 3b 0a 20 20 7d 0a 20 20 72 65  nloop);.  }.  re
12f80 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
12f90 20 2f 2a 20 54 43 4c 53 48 20 2a 2f 0a            /* TCLSH */.