/ Hex Artifact Content
Login

Artifact 6a7eeff5afd8f5f10fcb7fd7806e56c725dd2b07:


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 32 32 36 20 32 30 30 38  e.c,v 1.226 2008
0220: 2f 30 39 2f 32 33 20 31 30 3a 31 32 3a 31 35 20  /09/23 10:12:15 
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 6f 6e 73 74 20 63  l[] */.  const c
0b10: 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20  har *zSql;      
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 69 6e 74 20  outine */.  int 
0e50: 64 69 73 61 62 6c 65 41 75 74 68 3b 20 20 20 20  disableAuth;    
0e60: 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c         /* Disabl
0e70: 65 20 74 68 65 20 61 75 74 68 6f 72 69 7a 65 72  e the authorizer
0e80: 20 69 66 20 69 74 20 65 78 69 73 74 73 20 2a 2f   if it exists */
0e90: 0a 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c 3b 20  .  char *zNull; 
0ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0eb0: 20 54 65 78 74 20 74 6f 20 73 75 62 73 74 69 74   Text to substit
0ec0: 75 74 65 20 66 6f 72 20 61 6e 20 53 51 4c 20 4e  ute for an SQL N
0ed0: 55 4c 4c 20 76 61 6c 75 65 20 2a 2f 0a 20 20 53  ULL value */.  S
0ee0: 71 6c 46 75 6e 63 20 2a 70 46 75 6e 63 3b 20 20  qlFunc *pFunc;  
0ef0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
0f00: 74 20 6f 66 20 53 51 4c 20 66 75 6e 63 74 69 6f  t of SQL functio
0f10: 6e 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ns */.  Tcl_Obj 
0f20: 2a 70 55 70 64 61 74 65 48 6f 6f 6b 3b 20 20 20  *pUpdateHook;   
0f30: 20 20 20 2f 2a 20 55 70 64 61 74 65 20 68 6f 6f     /* Update hoo
0f40: 6b 20 73 63 72 69 70 74 20 28 69 66 20 61 6e 79  k script (if any
0f50: 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  ) */.  Tcl_Obj *
0f60: 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3b 20 20  pRollbackHook;  
0f70: 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 68 6f    /* Rollback ho
0f80: 6f 6b 20 73 63 72 69 70 74 20 28 69 66 20 61 6e  ok script (if an
0f90: 79 29 20 2a 2f 0a 20 20 53 71 6c 43 6f 6c 6c 61  y) */.  SqlColla
0fa0: 74 65 20 2a 70 43 6f 6c 6c 61 74 65 3b 20 20 20  te *pCollate;   
0fb0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 53 51     /* List of SQ
0fc0: 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63  L collation func
0fd0: 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 72  tions */.  int r
0fe0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
0ff0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1000: 63 6f 64 65 20 6f 66 20 6d 6f 73 74 20 72 65 63  code of most rec
1010: 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63  ent sqlite3_exec
1020: 28 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  () */.  Tcl_Obj 
1030: 2a 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 3b  *pCollateNeeded;
1040: 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20     /* Collation 
1050: 6e 65 65 64 65 64 20 73 63 72 69 70 74 20 2a 2f  needed script */
1060: 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74  .  SqlPreparedSt
1070: 6d 74 20 2a 73 74 6d 74 4c 69 73 74 3b 20 2f 2a  mt *stmtList; /*
1080: 20 4c 69 73 74 20 6f 66 20 70 72 65 70 61 72 65   List of prepare
1090: 64 20 73 74 61 74 65 6d 65 6e 74 73 2a 2f 0a 20  d statements*/. 
10a0: 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74   SqlPreparedStmt
10b0: 20 2a 73 74 6d 74 4c 61 73 74 3b 20 2f 2a 20 4c   *stmtLast; /* L
10c0: 61 73 74 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  ast statement in
10d0: 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69   the list */.  i
10e0: 6e 74 20 6d 61 78 53 74 6d 74 3b 20 20 20 20 20  nt maxStmt;     
10f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1100: 20 6e 65 78 74 20 6d 61 78 69 6d 75 6d 20 6e 75   next maximum nu
1110: 6d 62 65 72 20 6f 66 20 73 74 6d 74 4c 69 73 74  mber of stmtList
1120: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 74 6d 74 3b   */.  int nStmt;
1130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1140: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 74   /* Number of st
1150: 61 74 65 6d 65 6e 74 73 20 69 6e 20 73 74 6d 74  atements in stmt
1160: 4c 69 73 74 20 2a 2f 0a 20 20 49 6e 63 72 62 6c  List */.  Incrbl
1170: 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 49 6e 63 72  obChannel *pIncr
1180: 62 6c 6f 62 3b 2f 2a 20 4c 69 6e 6b 65 64 20 6c  blob;/* Linked l
1190: 69 73 74 20 6f 66 20 6f 70 65 6e 20 69 6e 63 72  ist of open incr
11a0: 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 73 20 2a 2f  blob channels */
11b0: 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 49 6e 63 72  .};..struct Incr
11c0: 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 7b 0a 20 20  blobChannel {.  
11d0: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42  sqlite3_blob *pB
11e0: 6c 6f 62 3b 20 20 20 20 20 20 2f 2a 20 73 71 6c  lob;      /* sql
11f0: 69 74 65 33 20 62 6c 6f 62 20 68 61 6e 64 6c 65  ite3 blob handle
1200: 20 2a 2f 0a 20 20 53 71 6c 69 74 65 44 62 20 2a   */.  SqliteDb *
1210: 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  pDb;            
1220: 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20 64 61  /* Associated da
1230: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1240: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65 65 6b  n */.  int iSeek
1250: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1260: 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 65 65 6b   /* Current seek
1270: 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 54 63 6c   offset */.  Tcl
1280: 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 6e 65 6c  _Channel channel
1290: 3b 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 6e 65  ;      /* Channe
12a0: 6c 20 69 64 65 6e 74 69 66 69 65 72 20 2a 2f 0a  l identifier */.
12b0: 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65    IncrblobChanne
12c0: 6c 20 2a 70 4e 65 78 74 3b 20 20 20 2f 2a 20 4c  l *pNext;   /* L
12d0: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 61 6c  inked list of al
12e0: 6c 20 6f 70 65 6e 20 69 6e 63 72 62 6c 6f 62 20  l open incrblob 
12f0: 63 68 61 6e 6e 65 6c 73 20 2a 2f 0a 20 20 49 6e  channels */.  In
1300: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70  crblobChannel *p
1310: 50 72 65 76 3b 20 20 20 2f 2a 20 4c 69 6e 6b 65  Prev;   /* Linke
1320: 64 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 6f 70  d list of all op
1330: 65 6e 20 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e  en incrblob chan
1340: 6e 65 6c 73 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 6e  nels */.};..#ifn
1350: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1360: 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 43  INCRBLOB./*.** C
1370: 6c 6f 73 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f  lose all incrblo
1380: 62 20 63 68 61 6e 6e 65 6c 73 20 6f 70 65 6e 65  b channels opene
1390: 64 20 75 73 69 6e 67 20 64 61 74 61 62 61 73 65  d using database
13a0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 44 62 2e   connection pDb.
13b0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c  .** This is call
13c0: 65 64 20 77 68 65 6e 20 73 68 75 74 74 69 6e 67  ed when shutting
13d0: 20 64 6f 77 6e 20 74 68 65 20 64 61 74 61 62 61   down the databa
13e0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
13f0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c  /.static void cl
1400: 6f 73 65 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  oseIncrblobChann
1410: 65 6c 73 28 53 71 6c 69 74 65 44 62 20 2a 70 44  els(SqliteDb *pD
1420: 62 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68  b){.  IncrblobCh
1430: 61 6e 6e 65 6c 20 2a 70 3b 0a 20 20 49 6e 63 72  annel *p;.  Incr
1440: 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 4e 65  blobChannel *pNe
1450: 78 74 3b 0a 0a 20 20 66 6f 72 28 70 3d 70 44 62  xt;..  for(p=pDb
1460: 2d 3e 70 49 6e 63 72 62 6c 6f 62 3b 20 70 3b 20  ->pIncrblob; p; 
1470: 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e  p=pNext){.    pN
1480: 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
1490: 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 43 61  .    /* Note: Ca
14a0: 6c 6c 69 6e 67 20 75 6e 72 65 67 69 73 74 65 72  lling unregister
14b0: 20 68 65 72 65 20 63 61 6c 6c 20 54 63 6c 5f 43   here call Tcl_C
14c0: 6c 6f 73 65 20 6f 6e 20 74 68 65 20 69 6e 63 72  lose on the incr
14d0: 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2c 20 0a 20  blob channel, . 
14e0: 20 20 20 2a 2a 20 77 68 69 63 68 20 64 65 6c 65     ** which dele
14f0: 74 65 73 20 74 68 65 20 49 6e 63 72 62 6c 6f 62  tes the Incrblob
1500: 43 68 61 6e 6e 65 6c 20 73 74 72 75 63 74 75 72  Channel structur
1510: 65 20 61 74 20 2a 70 2e 20 53 6f 20 64 6f 20 6e  e at *p. So do n
1520: 6f 74 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 54  ot.    ** call T
1530: 63 6c 5f 46 72 65 65 28 29 20 68 65 72 65 2e 0a  cl_Free() here..
1540: 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 55      */.    Tcl_U
1550: 6e 72 65 67 69 73 74 65 72 43 68 61 6e 6e 65 6c  nregisterChannel
1560: 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 2d  (pDb->interp, p-
1570: 3e 63 68 61 6e 6e 65 6c 29 3b 0a 20 20 7d 0a 7d  >channel);.  }.}
1580: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e  ../*.** Close an
1590: 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f   incremental blo
15a0: 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74  b channel..*/.st
15b0: 61 74 69 63 20 69 6e 74 20 69 6e 63 72 62 6c 6f  atic int incrblo
15c0: 62 43 6c 6f 73 65 28 43 6c 69 65 6e 74 44 61 74  bClose(ClientDat
15d0: 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20  a instanceData, 
15e0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
15f0: 72 70 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43  rp){.  IncrblobC
1600: 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28 49 6e 63  hannel *p = (Inc
1610: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 69  rblobChannel *)i
1620: 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 69  nstanceData;.  i
1630: 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  nt rc = sqlite3_
1640: 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 2d 3e 70 42  blob_close(p->pB
1650: 6c 6f 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 20  lob);.  sqlite3 
1660: 2a 64 62 20 3d 20 70 2d 3e 70 44 62 2d 3e 64 62  *db = p->pDb->db
1670: 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74  ;..  /* Remove t
1680: 68 65 20 63 68 61 6e 6e 65 6c 20 66 72 6f 6d 20  he channel from 
1690: 74 68 65 20 53 71 6c 69 74 65 44 62 2e 70 49 6e  the SqliteDb.pIn
16a0: 63 72 62 6c 6f 62 20 6c 69 73 74 2e 20 2a 2f 0a  crblob list. */.
16b0: 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
16c0: 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e  {.    p->pNext->
16d0: 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76  pPrev = p->pPrev
16e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
16f0: 50 72 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70  Prev ){.    p->p
1700: 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d  Prev->pNext = p-
1710: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  >pNext;.  }.  if
1720: 28 20 70 2d 3e 70 44 62 2d 3e 70 49 6e 63 72 62  ( p->pDb->pIncrb
1730: 6c 6f 62 3d 3d 70 20 29 7b 0a 20 20 20 20 70 2d  lob==p ){.    p-
1740: 3e 70 44 62 2d 3e 70 49 6e 63 72 62 6c 6f 62 20  >pDb->pIncrblob 
1750: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  = p->pNext;.  }.
1760: 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20 49  .  /* Free the I
1770: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 73  ncrblobChannel s
1780: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 54 63  tructure */.  Tc
1790: 6c 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 70  l_Free((char *)p
17a0: 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  );..  if( rc!=SQ
17b0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
17c0: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
17d0: 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c  erp, (char *)sql
17e0: 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c  ite3_errmsg(db),
17f0: 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a   TCL_VOLATILE);.
1800: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1810: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
1820: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1830: 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66 72  .** Read data fr
1840: 6f 6d 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  om an incrementa
1850: 6c 20 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a  l blob channel..
1860: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
1870: 63 72 62 6c 6f 62 49 6e 70 75 74 28 0a 20 20 43  crblobInput(.  C
1880: 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e  lientData instan
1890: 63 65 44 61 74 61 2c 20 0a 20 20 63 68 61 72 20  ceData, .  char 
18a0: 2a 62 75 66 2c 20 0a 20 20 69 6e 74 20 62 75 66  *buf, .  int buf
18b0: 53 69 7a 65 2c 0a 20 20 69 6e 74 20 2a 65 72 72  Size,.  int *err
18c0: 6f 72 43 6f 64 65 50 74 72 0a 29 7b 0a 20 20 49  orCodePtr.){.  I
18d0: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a  ncrblobChannel *
18e0: 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68 61  p = (IncrblobCha
18f0: 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e 63 65 44  nnel *)instanceD
1900: 61 74 61 3b 0a 20 20 69 6e 74 20 6e 52 65 61 64  ata;.  int nRead
1910: 20 3d 20 62 75 66 53 69 7a 65 3b 20 20 20 20 20   = bufSize;     
1920: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1930: 20 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a   bytes to read *
1940: 2f 0a 20 20 69 6e 74 20 6e 42 6c 6f 62 3b 20 20  /.  int nBlob;  
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1960: 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f   /* Total size o
1970: 66 20 74 68 65 20 62 6c 6f 62 20 2a 2f 0a 20 20  f the blob */.  
1980: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19a0: 73 71 6c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  sqlite error cod
19b0: 65 20 2a 2f 0a 0a 20 20 6e 42 6c 6f 62 20 3d 20  e */..  nBlob = 
19c0: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74  sqlite3_blob_byt
19d0: 65 73 28 70 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20  es(p->pBlob);.  
19e0: 69 66 28 20 28 70 2d 3e 69 53 65 65 6b 2b 6e 52  if( (p->iSeek+nR
19f0: 65 61 64 29 3e 6e 42 6c 6f 62 20 29 7b 0a 20 20  ead)>nBlob ){.  
1a00: 20 20 6e 52 65 61 64 20 3d 20 6e 42 6c 6f 62 2d    nRead = nBlob-
1a10: 70 2d 3e 69 53 65 65 6b 3b 0a 20 20 7d 0a 20 20  p->iSeek;.  }.  
1a20: 69 66 28 20 6e 52 65 61 64 3c 3d 30 20 29 7b 0a  if( nRead<=0 ){.
1a30: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1a40: 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  }..  rc = sqlite
1a50: 33 5f 62 6c 6f 62 5f 72 65 61 64 28 70 2d 3e 70  3_blob_read(p->p
1a60: 42 6c 6f 62 2c 20 28 76 6f 69 64 20 2a 29 62 75  Blob, (void *)bu
1a70: 66 2c 20 6e 52 65 61 64 2c 20 70 2d 3e 69 53 65  f, nRead, p->iSe
1a80: 65 6b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ek);.  if( rc!=S
1a90: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1aa0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20  *errorCodePtr = 
1ab0: 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d  rc;.    return -
1ac0: 31 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69 53 65  1;.  }..  p->iSe
1ad0: 65 6b 20 2b 3d 20 6e 52 65 61 64 3b 0a 20 20 72  ek += nRead;.  r
1ae0: 65 74 75 72 6e 20 6e 52 65 61 64 3b 0a 7d 0a 0a  eturn nRead;.}..
1af0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61  /*.** Write data
1b00: 20 74 6f 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74   to an increment
1b10: 61 6c 20 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e  al blob channel.
1b20: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
1b30: 6e 63 72 62 6c 6f 62 4f 75 74 70 75 74 28 0a 20  ncrblobOutput(. 
1b40: 20 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74   ClientData inst
1b50: 61 6e 63 65 44 61 74 61 2c 20 0a 20 20 43 4f 4e  anceData, .  CON
1b60: 53 54 20 63 68 61 72 20 2a 62 75 66 2c 20 0a 20  ST char *buf, . 
1b70: 20 69 6e 74 20 74 6f 57 72 69 74 65 2c 0a 20 20   int toWrite,.  
1b80: 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 74  int *errorCodePt
1b90: 72 0a 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43  r.){.  IncrblobC
1ba0: 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28 49 6e 63  hannel *p = (Inc
1bb0: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 69  rblobChannel *)i
1bc0: 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 69  nstanceData;.  i
1bd0: 6e 74 20 6e 57 72 69 74 65 20 3d 20 74 6f 57 72  nt nWrite = toWr
1be0: 69 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e  ite;        /* N
1bf0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
1c00: 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 69 6e 74  o write */.  int
1c10: 20 6e 42 6c 6f 62 3b 20 20 20 20 20 20 20 20 20   nBlob;         
1c20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
1c30: 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62  al size of the b
1c40: 6c 6f 62 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  lob */.  int rc;
1c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c60: 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 20        /* sqlite 
1c70: 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 0a 20  error code */.. 
1c80: 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33   nBlob = sqlite3
1c90: 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70  _blob_bytes(p->p
1ca0: 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20 28 70 2d  Blob);.  if( (p-
1cb0: 3e 69 53 65 65 6b 2b 6e 57 72 69 74 65 29 3e 6e  >iSeek+nWrite)>n
1cc0: 42 6c 6f 62 20 29 7b 0a 20 20 20 20 2a 65 72 72  Blob ){.    *err
1cd0: 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 49 4e 56  orCodePtr = EINV
1ce0: 41 4c 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d  AL;.    return -
1cf0: 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 57 72  1;.  }.  if( nWr
1d00: 69 74 65 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65  ite<=0 ){.    re
1d10: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 72  turn 0;.  }..  r
1d20: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
1d30: 5f 77 72 69 74 65 28 70 2d 3e 70 42 6c 6f 62 2c  _write(p->pBlob,
1d40: 20 28 76 6f 69 64 20 2a 29 62 75 66 2c 20 6e 57   (void *)buf, nW
1d50: 72 69 74 65 2c 20 70 2d 3e 69 53 65 65 6b 29 3b  rite, p->iSeek);
1d60: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1d70: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 65 72 72  E_OK ){.    *err
1d80: 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 49 4f 3b  orCodePtr = EIO;
1d90: 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .    return -1;.
1da0: 20 20 7d 0a 0a 20 20 70 2d 3e 69 53 65 65 6b 20    }..  p->iSeek 
1db0: 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20 72 65 74  += nWrite;.  ret
1dc0: 75 72 6e 20 6e 57 72 69 74 65 3b 0a 7d 0a 0a 2f  urn nWrite;.}../
1dd0: 2a 0a 2a 2a 20 53 65 65 6b 20 61 6e 20 69 6e 63  *.** Seek an inc
1de0: 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 68  remental blob ch
1df0: 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  annel..*/.static
1e00: 20 69 6e 74 20 69 6e 63 72 62 6c 6f 62 53 65 65   int incrblobSee
1e10: 6b 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  k(.  ClientData 
1e20: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 0a 20  instanceData, . 
1e30: 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c 0a 20 20   long offset,.  
1e40: 69 6e 74 20 73 65 65 6b 4d 6f 64 65 2c 0a 20 20  int seekMode,.  
1e50: 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 74  int *errorCodePt
1e60: 72 0a 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43  r.){.  IncrblobC
1e70: 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28 49 6e 63  hannel *p = (Inc
1e80: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 69  rblobChannel *)i
1e90: 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 0a 20 20  nstanceData;..  
1ea0: 73 77 69 74 63 68 28 20 73 65 65 6b 4d 6f 64 65  switch( seekMode
1eb0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 45 45   ){.    case SEE
1ec0: 4b 5f 53 45 54 3a 0a 20 20 20 20 20 20 70 2d 3e  K_SET:.      p->
1ed0: 69 53 65 65 6b 20 3d 20 6f 66 66 73 65 74 3b 0a  iSeek = offset;.
1ee0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1ef0: 20 63 61 73 65 20 53 45 45 4b 5f 43 55 52 3a 0a   case SEEK_CUR:.
1f00: 20 20 20 20 20 20 70 2d 3e 69 53 65 65 6b 20 2b        p->iSeek +
1f10: 3d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  = offset;.      
1f20: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1f30: 53 45 45 4b 5f 45 4e 44 3a 0a 20 20 20 20 20 20  SEEK_END:.      
1f40: 70 2d 3e 69 53 65 65 6b 20 3d 20 73 71 6c 69 74  p->iSeek = sqlit
1f50: 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d  e3_blob_bytes(p-
1f60: 3e 70 42 6c 6f 62 29 20 2b 20 6f 66 66 73 65 74  >pBlob) + offset
1f70: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
1f80: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73      default: ass
1f90: 65 72 74 28 21 22 42 61 64 20 73 65 65 6b 4d 6f  ert(!"Bad seekMo
1fa0: 64 65 22 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  de");.  }..  ret
1fb0: 75 72 6e 20 70 2d 3e 69 53 65 65 6b 3b 0a 7d 0a  urn p->iSeek;.}.
1fc0: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  ..static void in
1fd0: 63 72 62 6c 6f 62 57 61 74 63 68 28 43 6c 69 65  crblobWatch(Clie
1fe0: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44  ntData instanceD
1ff0: 61 74 61 2c 20 69 6e 74 20 6d 6f 64 65 29 7b 20  ata, int mode){ 
2000: 0a 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 20 0a  .  /* NO-OP */ .
2010: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63  }.static int inc
2020: 72 62 6c 6f 62 48 61 6e 64 6c 65 28 43 6c 69 65  rblobHandle(Clie
2030: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44  ntData instanceD
2040: 61 74 61 2c 20 69 6e 74 20 64 69 72 2c 20 43 6c  ata, int dir, Cl
2050: 69 65 6e 74 44 61 74 61 20 2a 68 50 74 72 29 7b  ientData *hPtr){
2060: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  .  return TCL_ER
2070: 52 4f 52 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 54  ROR;.}..static T
2080: 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20 49  cl_ChannelType I
2090: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 54 79  ncrblobChannelTy
20a0: 70 65 20 3d 20 7b 0a 20 20 22 69 6e 63 72 62 6c  pe = {.  "incrbl
20b0: 6f 62 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ob",            
20c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74              /* t
20d0: 79 70 65 4e 61 6d 65 20 20 20 20 20 20 20 20 20  ypeName         
20e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f0: 20 20 20 20 2a 2f 0a 20 20 54 43 4c 5f 43 48 41      */.  TCL_CHA
2100: 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 32 2c 20  NNEL_VERSION_2, 
2110: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 76              /* v
2120: 65 72 73 69 6f 6e 20 20 20 20 20 20 20 20 20 20  ersion          
2130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2140: 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f      */.  incrblo
2150: 62 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  bClose,         
2160: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63              /* c
2170: 6c 6f 73 65 50 72 6f 63 20 20 20 20 20 20 20 20  loseProc        
2180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2190: 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f      */.  incrblo
21a0: 62 49 6e 70 75 74 2c 20 20 20 20 20 20 20 20 20  bInput,         
21b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
21c0: 6e 70 75 74 50 72 6f 63 20 20 20 20 20 20 20 20  nputProc        
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e0: 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f      */.  incrblo
21f0: 62 4f 75 74 70 75 74 2c 20 20 20 20 20 20 20 20  bOutput,        
2200: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f              /* o
2210: 75 74 70 75 74 50 72 6f 63 20 20 20 20 20 20 20  utputProc       
2220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2230: 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f      */.  incrblo
2240: 62 53 65 65 6b 2c 20 20 20 20 20 20 20 20 20 20  bSeek,          
2250: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
2260: 65 65 6b 50 72 6f 63 20 20 20 20 20 20 20 20 20  eekProc         
2270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2280: 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20      */.  0,     
2290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
22b0: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 20 20 20  etOptionProc    
22c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d0: 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20      */.  0,     
22e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 67              /* g
2300: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 20 20 20  etOptionProc    
2310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2320: 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f      */.  incrblo
2330: 62 57 61 74 63 68 2c 20 20 20 20 20 20 20 20 20  bWatch,         
2340: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 77              /* w
2350: 61 74 63 68 50 72 6f 63 20 28 74 68 69 73 20 69  atchProc (this i
2360: 73 20 61 20 6e 6f 2d 6f 70 29 20 20 20 20 20 20  s a no-op)      
2370: 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f      */.  incrblo
2380: 62 48 61 6e 64 6c 65 2c 20 20 20 20 20 20 20 20  bHandle,        
2390: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 67              /* g
23a0: 65 74 48 61 6e 64 6c 65 50 72 6f 63 20 28 61 6c  etHandleProc (al
23b0: 77 61 79 73 20 72 65 74 75 72 6e 73 20 65 72 72  ways returns err
23c0: 6f 72 29 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  or) */.  0,     
23d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63              /* c
23f0: 6c 6f 73 65 32 50 72 6f 63 20 20 20 20 20 20 20  lose2Proc       
2400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2410: 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20      */.  0,     
2420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2430: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 62              /* b
2440: 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 20 20 20 20  lockModeProc    
2450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2460: 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20      */.  0,     
2470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2480: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
2490: 6c 75 73 68 50 72 6f 63 20 20 20 20 20 20 20 20  lushProc        
24a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b0: 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20      */.  0,     
24c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 68              /* h
24e0: 61 6e 64 6c 65 72 50 72 6f 63 20 20 20 20 20 20  andlerProc      
24f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2500: 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20      */.  0,     
2510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2520: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 77              /* w
2530: 69 64 65 53 65 65 6b 50 72 6f 63 20 20 20 20 20  ideSeekProc     
2540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2550: 20 20 20 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a      */.};../*.**
2560: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e   Create a new in
2570: 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a  crblob channel..
2580: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 72  */.static int cr
2590: 65 61 74 65 49 6e 63 72 62 6c 6f 62 43 68 61 6e  eateIncrblobChan
25a0: 6e 65 6c 28 0a 20 20 54 63 6c 5f 49 6e 74 65 72  nel(.  Tcl_Inter
25b0: 70 20 2a 69 6e 74 65 72 70 2c 20 0a 20 20 53 71  p *interp, .  Sq
25c0: 6c 69 74 65 44 62 20 2a 70 44 62 2c 20 0a 20 20  liteDb *pDb, .  
25d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c  const char *zDb,
25e0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
25f0: 54 61 62 6c 65 2c 20 0a 20 20 63 6f 6e 73 74 20  Table, .  const 
2600: 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 2c 20 0a  char *zColumn, .
2610: 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69    sqlite_int64 i
2620: 52 6f 77 2c 0a 20 20 69 6e 74 20 69 73 52 65 61  Row,.  int isRea
2630: 64 6f 6e 6c 79 0a 29 7b 0a 20 20 49 6e 63 72 62  donly.){.  Incrb
2640: 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 3b 0a 20  lobChannel *p;. 
2650: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
2660: 44 62 2d 3e 64 62 3b 0a 20 20 73 71 6c 69 74 65  Db->db;.  sqlite
2670: 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 3b 0a 20  3_blob *pBlob;. 
2680: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 66   int rc;.  int f
2690: 6c 61 67 73 20 3d 20 54 43 4c 5f 52 45 41 44 41  lags = TCL_READA
26a0: 42 4c 45 7c 28 69 73 52 65 61 64 6f 6e 6c 79 20  BLE|(isReadonly 
26b0: 3f 20 30 20 3a 20 54 43 4c 5f 57 52 49 54 41 42  ? 0 : TCL_WRITAB
26c0: 4c 45 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  LE);..  /* This 
26d0: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
26e0: 20 74 6f 20 6e 61 6d 65 20 74 68 65 20 63 68 61   to name the cha
26f0: 6e 6e 65 6c 73 3a 20 22 69 6e 63 72 62 6c 6f 62  nnels: "incrblob
2700: 5f 5b 69 6e 63 72 20 63 6f 75 6e 74 5d 22 20 2a  _[incr count]" *
2710: 2f 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 63  /.  static int c
2720: 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 63 68 61 72  ount = 0;.  char
2730: 20 7a 43 68 61 6e 6e 65 6c 5b 36 34 5d 3b 0a 0a   zChannel[64];..
2740: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
2750: 6c 6f 62 5f 6f 70 65 6e 28 64 62 2c 20 7a 44 62  lob_open(db, zDb
2760: 2c 20 7a 54 61 62 6c 65 2c 20 7a 43 6f 6c 75 6d  , zTable, zColum
2770: 6e 2c 20 69 52 6f 77 2c 20 21 69 73 52 65 61 64  n, iRow, !isRead
2780: 6f 6e 6c 79 2c 20 26 70 42 6c 6f 62 29 3b 0a 20  only, &pBlob);. 
2790: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
27a0: 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65  OK ){.    Tcl_Se
27b0: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
27c0: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
27d0: 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c  errmsg(pDb->db),
27e0: 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a   TCL_VOLATILE);.
27f0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2800: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d  RROR;.  }..  p =
2810: 20 28 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65   (IncrblobChanne
2820: 6c 20 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 73 69  l *)Tcl_Alloc(si
2830: 7a 65 6f 66 28 49 6e 63 72 62 6c 6f 62 43 68 61  zeof(IncrblobCha
2840: 6e 6e 65 6c 29 29 3b 0a 20 20 70 2d 3e 69 53 65  nnel));.  p->iSe
2850: 65 6b 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 42 6c  ek = 0;.  p->pBl
2860: 6f 62 20 3d 20 70 42 6c 6f 62 3b 0a 0a 20 20 73  ob = pBlob;..  s
2870: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2880: 73 69 7a 65 6f 66 28 7a 43 68 61 6e 6e 65 6c 29  sizeof(zChannel)
2890: 2c 20 7a 43 68 61 6e 6e 65 6c 2c 20 22 69 6e 63  , zChannel, "inc
28a0: 72 62 6c 6f 62 5f 25 64 22 2c 20 2b 2b 63 6f 75  rblob_%d", ++cou
28b0: 6e 74 29 3b 0a 20 20 70 2d 3e 63 68 61 6e 6e 65  nt);.  p->channe
28c0: 6c 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 43 68  l = Tcl_CreateCh
28d0: 61 6e 6e 65 6c 28 26 49 6e 63 72 62 6c 6f 62 43  annel(&IncrblobC
28e0: 68 61 6e 6e 65 6c 54 79 70 65 2c 20 7a 43 68 61  hannelType, zCha
28f0: 6e 6e 65 6c 2c 20 70 2c 20 66 6c 61 67 73 29 3b  nnel, p, flags);
2900: 0a 20 20 54 63 6c 5f 52 65 67 69 73 74 65 72 43  .  Tcl_RegisterC
2910: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 70  hannel(interp, p
2920: 2d 3e 63 68 61 6e 6e 65 6c 29 3b 0a 0a 20 20 2f  ->channel);..  /
2930: 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20 63  * Link the new c
2940: 68 61 6e 6e 65 6c 20 69 6e 74 6f 20 74 68 65 20  hannel into the 
2950: 53 71 6c 69 74 65 44 62 2e 70 49 6e 63 72 62 6c  SqliteDb.pIncrbl
2960: 6f 62 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 70 2d  ob list. */.  p-
2970: 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 70 49  >pNext = pDb->pI
2980: 6e 63 72 62 6c 6f 62 3b 0a 20 20 70 2d 3e 70 50  ncrblob;.  p->pP
2990: 72 65 76 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  rev = 0;.  if( p
29a0: 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70  ->pNext ){.    p
29b0: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
29c0: 20 70 3b 0a 20 20 7d 0a 20 20 70 44 62 2d 3e 70   p;.  }.  pDb->p
29d0: 49 6e 63 72 62 6c 6f 62 20 3d 20 70 3b 0a 20 20  Incrblob = p;.  
29e0: 70 2d 3e 70 44 62 20 3d 20 70 44 62 3b 0a 0a 20  p->pDb = pDb;.. 
29f0: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
2a00: 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 54  nterp, (char *)T
2a10: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
2a20: 65 28 70 2d 3e 63 68 61 6e 6e 65 6c 29 2c 20 54  e(p->channel), T
2a30: 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20  CL_VOLATILE);.  
2a40: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
2a50: 0a 23 65 6c 73 65 20 20 2f 2a 20 65 6c 73 65 20  .#else  /* else 
2a60: 63 6c 61 75 73 65 20 66 6f 72 20 22 23 69 66 6e  clause for "#ifn
2a70: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2a80: 49 4e 43 52 42 4c 4f 42 22 20 2a 2f 0a 20 20 23  INCRBLOB" */.  #
2a90: 64 65 66 69 6e 65 20 63 6c 6f 73 65 49 6e 63 72  define closeIncr
2aa0: 62 6c 6f 62 43 68 61 6e 6e 65 6c 73 28 70 44 62  blobChannels(pDb
2ab0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
2ac0: 4c 6f 6f 6b 20 61 74 20 74 68 65 20 73 63 72 69  Look at the scri
2ad0: 70 74 20 70 72 65 66 69 78 20 69 6e 20 70 43 6d  pt prefix in pCm
2ae0: 64 2e 20 20 57 65 20 77 69 6c 6c 20 62 65 20 65  d.  We will be e
2af0: 78 65 63 75 74 69 6e 67 20 74 68 69 73 20 73 63  xecuting this sc
2b00: 72 69 70 74 0a 2a 2a 20 61 66 74 65 72 20 66 69  ript.** after fi
2b10: 72 73 74 20 61 70 70 65 6e 64 69 6e 67 20 6f 6e  rst appending on
2b20: 65 20 6f 72 20 6d 6f 72 65 20 61 72 67 75 6d 65  e or more argume
2b30: 6e 74 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69  nts.  This routi
2b40: 6e 65 20 61 6e 61 6c 79 7a 65 73 0a 2a 2a 20 74  ne analyzes.** t
2b50: 68 65 20 73 63 72 69 70 74 20 74 6f 20 73 65 65  he script to see
2b60: 20 69 66 20 69 74 20 69 73 20 73 61 66 65 20 74   if it is safe t
2b70: 6f 20 75 73 65 20 54 63 6c 5f 45 76 61 6c 4f 62  o use Tcl_EvalOb
2b80: 6a 76 28 29 20 6f 6e 20 74 68 65 20 73 63 72 69  jv() on the scri
2b90: 70 74 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61  pt.** rather tha
2ba0: 6e 20 74 68 65 20 6d 6f 72 65 20 67 65 6e 65 72  n the more gener
2bb0: 61 6c 20 54 63 6c 5f 45 76 61 6c 45 78 28 29 2e  al Tcl_EvalEx().
2bc0: 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29    Tcl_EvalObjv()
2bd0: 20 69 73 20 6d 75 63 68 0a 2a 2a 20 66 61 73 74   is much.** fast
2be0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 63 72 69 70 74  er..**.** Script
2bf0: 73 20 74 68 61 74 20 61 72 65 20 73 61 66 65 20  s that are safe 
2c00: 74 6f 20 75 73 65 20 77 69 74 68 20 54 63 6c 5f  to use with Tcl_
2c10: 45 76 61 6c 4f 62 6a 76 28 29 20 63 6f 6e 73 69  EvalObjv() consi
2c20: 73 74 73 20 6f 66 20 61 0a 2a 2a 20 63 6f 6d 6d  sts of a.** comm
2c30: 61 6e 64 20 6e 61 6d 65 20 66 6f 6c 6c 6f 77 65  and name followe
2c40: 64 20 62 79 20 7a 65 72 6f 20 6f 72 20 6d 6f 72  d by zero or mor
2c50: 65 20 61 72 67 75 6d 65 6e 74 73 20 77 69 74 68  e arguments with
2c60: 20 6e 6f 20 5b 2e 2e 2e 5d 20 6f 72 20 24 0a 2a   no [...] or $.*
2c70: 2a 20 6f 72 20 7b 2e 2e 2e 7d 20 6f 72 20 3b 20  * or {...} or ; 
2c80: 74 6f 20 62 65 20 73 65 65 6e 20 61 6e 79 77 68  to be seen anywh
2c90: 65 72 65 2e 20 20 4d 6f 73 74 20 63 61 6c 6c 62  ere.  Most callb
2ca0: 61 63 6b 20 73 63 72 69 70 74 73 20 63 6f 6e 73  ack scripts cons
2cb0: 69 73 74 0a 2a 2a 20 6f 66 20 6a 75 73 74 20 61  ist.** of just a
2cc0: 20 73 69 6e 67 6c 65 20 70 72 6f 63 65 64 75 72   single procedur
2cd0: 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 79 20  e name and they 
2ce0: 6d 65 65 74 20 74 68 69 73 20 72 65 71 75 69 72  meet this requir
2cf0: 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ement..*/.static
2d00: 20 69 6e 74 20 73 61 66 65 54 6f 55 73 65 45 76   int safeToUseEv
2d10: 61 6c 4f 62 6a 76 28 54 63 6c 5f 49 6e 74 65 72  alObjv(Tcl_Inter
2d20: 70 20 2a 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f  p *interp, Tcl_O
2d30: 62 6a 20 2a 70 43 6d 64 29 7b 0a 20 20 2f 2a 20  bj *pCmd){.  /* 
2d40: 57 65 20 63 6f 75 6c 64 20 74 72 79 20 74 6f 20  We could try to 
2d50: 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77 69 74  do something wit
2d60: 68 20 54 63 6c 5f 50 61 72 73 65 28 29 2e 20 20  h Tcl_Parse().  
2d70: 42 75 74 20 77 65 20 77 69 6c 6c 20 69 6e 73 74  But we will inst
2d80: 65 61 64 0a 20 20 2a 2a 20 6a 75 73 74 20 64 6f  ead.  ** just do
2d90: 20 61 20 73 65 61 72 63 68 20 66 6f 72 20 66 6f   a search for fo
2da0: 72 62 69 64 64 65 6e 20 63 68 61 72 61 63 74 65  rbidden characte
2db0: 72 73 2e 20 20 49 66 20 61 6e 79 20 6f 66 20 74  rs.  If any of t
2dc0: 68 65 20 66 6f 72 62 69 64 64 65 6e 0a 20 20 2a  he forbidden.  *
2dd0: 2a 20 63 68 61 72 61 63 74 65 72 73 20 61 70 70  * characters app
2de0: 65 61 72 20 69 6e 20 70 43 6d 64 2c 20 77 65 20  ear in pCmd, we 
2df0: 77 69 6c 6c 20 72 65 70 6f 72 74 20 74 68 65 20  will report the 
2e00: 73 74 72 69 6e 67 20 61 73 20 75 6e 73 61 66 65  string as unsafe
2e10: 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ..  */.  const c
2e20: 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 3b  har *z;.  int n;
2e30: 0a 20 20 7a 20 3d 20 54 63 6c 5f 47 65 74 53 74  .  z = Tcl_GetSt
2e40: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 43 6d 64  ringFromObj(pCmd
2e50: 2c 20 26 6e 29 3b 0a 20 20 77 68 69 6c 65 28 20  , &n);.  while( 
2e60: 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 69  n-- > 0 ){.    i
2e70: 6e 74 20 63 20 3d 20 2a 28 7a 2b 2b 29 3b 0a 20  nt c = *(z++);. 
2e80: 20 20 20 69 66 28 20 63 3d 3d 27 24 27 20 7c 7c     if( c=='$' ||
2e90: 20 63 3d 3d 27 5b 27 20 7c 7c 20 63 3d 3d 27 3b   c=='[' || c==';
2ea0: 27 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ' ) return 0;.  
2eb0: 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
2ec0: 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 6e 20 53  ./*.** Find an S
2ed0: 71 6c 46 75 6e 63 20 73 74 72 75 63 74 75 72 65  qlFunc structure
2ee0: 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
2ef0: 6e 61 6d 65 2e 20 20 4f 72 20 63 72 65 61 74 65  name.  Or create
2f00: 20 61 20 6e 65 77 0a 2a 2a 20 6f 6e 65 20 69 66   a new.** one if
2f10: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6f 6e 65   an existing one
2f20: 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
2f30: 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
2f40: 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73 74  ter to the.** st
2f50: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
2f60: 69 63 20 53 71 6c 46 75 6e 63 20 2a 66 69 6e 64  ic SqlFunc *find
2f70: 53 71 6c 46 75 6e 63 28 53 71 6c 69 74 65 44 62  SqlFunc(SqliteDb
2f80: 20 2a 70 44 62 2c 20 63 6f 6e 73 74 20 63 68 61   *pDb, const cha
2f90: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 53 71 6c  r *zName){.  Sql
2fa0: 46 75 6e 63 20 2a 70 2c 20 2a 70 4e 65 77 3b 0a  Func *p, *pNew;.
2fb0: 20 20 69 6e 74 20 69 3b 0a 20 20 70 4e 65 77 20    int i;.  pNew 
2fc0: 3d 20 28 53 71 6c 46 75 6e 63 2a 29 54 63 6c 5f  = (SqlFunc*)Tcl_
2fd0: 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  Alloc( sizeof(*p
2fe0: 4e 65 77 29 20 2b 20 73 74 72 6c 65 6e 28 7a 4e  New) + strlen(zN
2ff0: 61 6d 65 29 20 2b 20 31 20 29 3b 0a 20 20 70 4e  ame) + 1 );.  pN
3000: 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61  ew->zName = (cha
3010: 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 66  r*)&pNew[1];.  f
3020: 6f 72 28 69 3d 30 3b 20 7a 4e 61 6d 65 5b 69 5d  or(i=0; zName[i]
3030: 3b 20 69 2b 2b 29 7b 20 70 4e 65 77 2d 3e 7a 4e  ; i++){ pNew->zN
3040: 61 6d 65 5b 69 5d 20 3d 20 74 6f 6c 6f 77 65 72  ame[i] = tolower
3050: 28 7a 4e 61 6d 65 5b 69 5d 29 3b 20 7d 0a 20 20  (zName[i]); }.  
3060: 70 4e 65 77 2d 3e 7a 4e 61 6d 65 5b 69 5d 20 3d  pNew->zName[i] =
3070: 20 30 3b 0a 20 20 66 6f 72 28 70 3d 70 44 62 2d   0;.  for(p=pDb-
3080: 3e 70 46 75 6e 63 3b 20 70 3b 20 70 3d 70 2d 3e  >pFunc; p; p=p->
3090: 70 4e 65 78 74 29 7b 20 0a 20 20 20 20 69 66 28  pNext){ .    if(
30a0: 20 73 74 72 63 6d 70 28 70 2d 3e 7a 4e 61 6d 65   strcmp(p->zName
30b0: 2c 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 29 3d 3d  , pNew->zName)==
30c0: 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 46  0 ){.      Tcl_F
30d0: 72 65 65 28 28 63 68 61 72 2a 29 70 4e 65 77 29  ree((char*)pNew)
30e0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  ;.      return p
30f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e  ;.    }.  }.  pN
3100: 65 77 2d 3e 69 6e 74 65 72 70 20 3d 20 70 44 62  ew->interp = pDb
3110: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 70 4e 65 77  ->interp;.  pNew
3120: 2d 3e 70 53 63 72 69 70 74 20 3d 20 30 3b 0a 20  ->pScript = 0;. 
3130: 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70   pNew->pNext = p
3140: 44 62 2d 3e 70 46 75 6e 63 3b 0a 20 20 70 44 62  Db->pFunc;.  pDb
3150: 2d 3e 70 46 75 6e 63 20 3d 20 70 4e 65 77 3b 0a  ->pFunc = pNew;.
3160: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
3170: 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 61 6c 69 7a 65  ../*.** Finalize
3180: 20 61 6e 64 20 66 72 65 65 20 61 20 6c 69 73 74   and free a list
3190: 20 6f 66 20 70 72 65 70 61 72 65 64 20 73 74 61   of prepared sta
31a0: 74 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69  tements.*/.stati
31b0: 63 20 76 6f 69 64 20 66 6c 75 73 68 53 74 6d 74  c void flushStmt
31c0: 43 61 63 68 65 28 20 53 71 6c 69 74 65 44 62 20  Cache( SqliteDb 
31d0: 2a 70 44 62 20 29 7b 0a 20 20 53 71 6c 50 72 65  *pDb ){.  SqlPre
31e0: 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65 53  paredStmt *pPreS
31f0: 74 6d 74 3b 0a 0a 20 20 77 68 69 6c 65 28 20 20  tmt;..  while(  
3200: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 29 7b  pDb->stmtList ){
3210: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
3220: 61 6c 69 7a 65 28 20 70 44 62 2d 3e 73 74 6d 74  alize( pDb->stmt
3230: 4c 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20  List->pStmt );. 
3240: 20 20 20 70 50 72 65 53 74 6d 74 20 3d 20 70 44     pPreStmt = pD
3250: 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 0a 20 20 20  b->stmtList;.   
3260: 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d   pDb->stmtList =
3270: 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 2d 3e   pDb->stmtList->
3280: 70 4e 65 78 74 3b 0a 20 20 20 20 54 63 6c 5f 46  pNext;.    Tcl_F
3290: 72 65 65 28 20 28 63 68 61 72 2a 29 70 50 72 65  ree( (char*)pPre
32a0: 53 74 6d 74 20 29 3b 0a 20 20 7d 0a 20 20 70 44  Stmt );.  }.  pD
32b0: 62 2d 3e 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  b->nStmt = 0;.  
32c0: 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20  pDb->stmtLast = 
32d0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 43 4c 20  0;.}../*.** TCL 
32e0: 63 61 6c 6c 73 20 74 68 69 73 20 70 72 6f 63 65  calls this proce
32f0: 64 75 72 65 20 77 68 65 6e 20 61 6e 20 73 71 6c  dure when an sql
3300: 69 74 65 33 20 64 61 74 61 62 61 73 65 20 63 6f  ite3 database co
3310: 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 64 65 6c 65  mmand is.** dele
3320: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ted..*/.static v
3330: 6f 69 64 20 44 62 44 65 6c 65 74 65 43 6d 64 28  oid DbDeleteCmd(
3340: 76 6f 69 64 20 2a 64 62 29 7b 0a 20 20 53 71 6c  void *db){.  Sql
3350: 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71  iteDb *pDb = (Sq
3360: 6c 69 74 65 44 62 2a 29 64 62 3b 0a 20 20 66 6c  liteDb*)db;.  fl
3370: 75 73 68 53 74 6d 74 43 61 63 68 65 28 70 44 62  ushStmtCache(pDb
3380: 29 3b 0a 20 20 63 6c 6f 73 65 49 6e 63 72 62 6c  );.  closeIncrbl
3390: 6f 62 43 68 61 6e 6e 65 6c 73 28 70 44 62 29 3b  obChannels(pDb);
33a0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  .  sqlite3_close
33b0: 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20 77 68 69  (pDb->db);.  whi
33c0: 6c 65 28 20 70 44 62 2d 3e 70 46 75 6e 63 20 29  le( pDb->pFunc )
33d0: 7b 0a 20 20 20 20 53 71 6c 46 75 6e 63 20 2a 70  {.    SqlFunc *p
33e0: 46 75 6e 63 20 3d 20 70 44 62 2d 3e 70 46 75 6e  Func = pDb->pFun
33f0: 63 3b 0a 20 20 20 20 70 44 62 2d 3e 70 46 75 6e  c;.    pDb->pFun
3400: 63 20 3d 20 70 46 75 6e 63 2d 3e 70 4e 65 78 74  c = pFunc->pNext
3410: 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  ;.    Tcl_DecrRe
3420: 66 43 6f 75 6e 74 28 70 46 75 6e 63 2d 3e 70 53  fCount(pFunc->pS
3430: 63 72 69 70 74 29 3b 0a 20 20 20 20 54 63 6c 5f  cript);.    Tcl_
3440: 46 72 65 65 28 28 63 68 61 72 2a 29 70 46 75 6e  Free((char*)pFun
3450: 63 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28  c);.  }.  while(
3460: 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20 29   pDb->pCollate )
3470: 7b 0a 20 20 20 20 53 71 6c 43 6f 6c 6c 61 74 65  {.    SqlCollate
3480: 20 2a 70 43 6f 6c 6c 61 74 65 20 3d 20 70 44 62   *pCollate = pDb
3490: 2d 3e 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20  ->pCollate;.    
34a0: 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20 3d 20  pDb->pCollate = 
34b0: 70 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78 74 3b  pCollate->pNext;
34c0: 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63  .    Tcl_Free((c
34d0: 68 61 72 2a 29 70 43 6f 6c 6c 61 74 65 29 3b 0a  har*)pCollate);.
34e0: 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a    }.  if( pDb->z
34f0: 42 75 73 79 20 29 7b 0a 20 20 20 20 54 63 6c 5f  Busy ){.    Tcl_
3500: 46 72 65 65 28 70 44 62 2d 3e 7a 42 75 73 79 29  Free(pDb->zBusy)
3510: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d  ;.  }.  if( pDb-
3520: 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20 20 20 54  >zTrace ){.    T
3530: 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 54 72  cl_Free(pDb->zTr
3540: 61 63 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ace);.  }.  if( 
3550: 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b  pDb->zProfile ){
3560: 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44  .    Tcl_Free(pD
3570: 62 2d 3e 7a 50 72 6f 66 69 6c 65 29 3b 0a 20 20  b->zProfile);.  
3580: 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75  }.  if( pDb->zAu
3590: 74 68 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72  th ){.    Tcl_Fr
35a0: 65 65 28 70 44 62 2d 3e 7a 41 75 74 68 29 3b 0a  ee(pDb->zAuth);.
35b0: 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a    }.  if( pDb->z
35c0: 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 54 63 6c 5f  Null ){.    Tcl_
35d0: 46 72 65 65 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29  Free(pDb->zNull)
35e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d  ;.  }.  if( pDb-
35f0: 3e 70 55 70 64 61 74 65 48 6f 6f 6b 20 29 7b 0a  >pUpdateHook ){.
3600: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
3610: 6f 75 6e 74 28 70 44 62 2d 3e 70 55 70 64 61 74  ount(pDb->pUpdat
3620: 65 48 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20 69 66  eHook);.  }.  if
3630: 28 20 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b  ( pDb->pRollback
3640: 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  Hook ){.    Tcl_
3650: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62  DecrRefCount(pDb
3660: 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 29  ->pRollbackHook)
3670: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d  ;.  }.  if( pDb-
3680: 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 20  >pCollateNeeded 
3690: 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52  ){.    Tcl_DecrR
36a0: 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f  efCount(pDb->pCo
36b0: 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20  llateNeeded);.  
36c0: 7d 0a 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68  }.  Tcl_Free((ch
36d0: 61 72 2a 29 70 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a  ar*)pDb);.}../*.
36e0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
36f0: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
3700: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
3710: 73 20 6c 6f 63 6b 65 64 20 77 68 69 6c 65 20 74  s locked while t
3720: 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 65 78 65 63  rying.** to exec
3730: 75 74 65 20 53 51 4c 2e 0a 2a 2f 0a 73 74 61 74  ute SQL..*/.stat
3740: 69 63 20 69 6e 74 20 44 62 42 75 73 79 48 61 6e  ic int DbBusyHan
3750: 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 2c 20 69  dler(void *cd, i
3760: 6e 74 20 6e 54 72 69 65 73 29 7b 0a 20 20 53 71  nt nTries){.  Sq
3770: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
3780: 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69  qliteDb*)cd;.  i
3790: 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 56  nt rc;.  char zV
37a0: 61 6c 5b 33 30 5d 3b 0a 0a 20 20 73 71 6c 69 74  al[30];..  sqlit
37b0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
37c0: 6f 66 28 7a 56 61 6c 29 2c 20 7a 56 61 6c 2c 20  of(zVal), zVal, 
37d0: 22 25 64 22 2c 20 6e 54 72 69 65 73 29 3b 0a 20  "%d", nTries);. 
37e0: 20 72 63 20 3d 20 54 63 6c 5f 56 61 72 45 76 61   rc = Tcl_VarEva
37f0: 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70  l(pDb->interp, p
3800: 44 62 2d 3e 7a 42 75 73 79 2c 20 22 20 22 2c 20  Db->zBusy, " ", 
3810: 7a 56 61 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b  zVal, (char*)0);
3820: 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f  .  if( rc!=TCL_O
3830: 4b 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65  K || atoi(Tcl_Ge
3840: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44  tStringResult(pD
3850: 62 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a 20  b->interp)) ){. 
3860: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
3870: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
3880: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
3890: 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c  MIT_PROGRESS_CAL
38a0: 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73  LBACK./*.** This
38b0: 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f   routine is invo
38c0: 6b 65 64 20 61 73 20 74 68 65 20 27 70 72 6f 67  ked as the 'prog
38d0: 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 27 20 66  ress callback' f
38e0: 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  or the database.
38f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44  .*/.static int D
3900: 62 50 72 6f 67 72 65 73 73 48 61 6e 64 6c 65 72  bProgressHandler
3910: 28 76 6f 69 64 20 2a 63 64 29 7b 0a 20 20 53 71  (void *cd){.  Sq
3920: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
3930: 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69  qliteDb*)cd;.  i
3940: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
3950: 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73  ( pDb->zProgress
3960: 20 29 3b 0a 20 20 72 63 20 3d 20 54 63 6c 5f 45   );.  rc = Tcl_E
3970: 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  val(pDb->interp,
3980: 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 29   pDb->zProgress)
3990: 3b 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f  ;.  if( rc!=TCL_
39a0: 4f 4b 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47  OK || atoi(Tcl_G
39b0: 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70  etStringResult(p
39c0: 44 62 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a  Db->interp)) ){.
39d0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
39e0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
39f0: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
3a00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
3a10: 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E./*.** This rou
3a20: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
3a30: 79 20 74 68 65 20 53 51 4c 69 74 65 20 74 72 61  y the SQLite tra
3a40: 63 65 20 68 61 6e 64 6c 65 72 20 77 68 65 6e 65  ce handler whene
3a50: 76 65 72 20 61 20 6e 65 77 0a 2a 2a 20 62 6c 6f  ver a new.** blo
3a60: 63 6b 20 6f 66 20 53 51 4c 20 69 73 20 65 78 65  ck of SQL is exe
3a70: 63 75 74 65 64 2e 20 20 54 68 65 20 54 43 4c 20  cuted.  The TCL 
3a80: 73 63 72 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a  script in pDb->z
3a90: 54 72 61 63 65 20 69 73 20 65 78 65 63 75 74 65  Trace is execute
3aa0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
3ab0: 64 20 44 62 54 72 61 63 65 48 61 6e 64 6c 65 72  d DbTraceHandler
3ac0: 28 76 6f 69 64 20 2a 63 64 2c 20 63 6f 6e 73 74  (void *cd, const
3ad0: 20 63 68 61 72 20 2a 7a 53 71 6c 29 7b 0a 20 20   char *zSql){.  
3ae0: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
3af0: 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20  (SqliteDb*)cd;. 
3b00: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72   Tcl_DString str
3b10: 3b 0a 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  ;..  Tcl_DString
3b20: 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 54 63  Init(&str);.  Tc
3b30: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28  l_DStringAppend(
3b40: 26 73 74 72 2c 20 70 44 62 2d 3e 7a 54 72 61 63  &str, pDb->zTrac
3b50: 65 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53  e, -1);.  Tcl_DS
3b60: 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65  tringAppendEleme
3b70: 6e 74 28 26 73 74 72 2c 20 7a 53 71 6c 29 3b 0a  nt(&str, zSql);.
3b80: 20 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e    Tcl_Eval(pDb->
3b90: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53 74 72  interp, Tcl_DStr
3ba0: 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29 29 3b  ingValue(&str));
3bb0: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72  .  Tcl_DStringFr
3bc0: 65 65 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f  ee(&str);.  Tcl_
3bd0: 52 65 73 65 74 52 65 73 75 6c 74 28 70 44 62 2d  ResetResult(pDb-
3be0: 3e 69 6e 74 65 72 70 29 3b 0a 7d 0a 23 65 6e 64  >interp);.}.#end
3bf0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
3c00: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a  TE_OMIT_TRACE./*
3c10: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
3c20: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
3c30: 65 20 53 51 4c 69 74 65 20 70 72 6f 66 69 6c 65  e SQLite profile
3c40: 20 68 61 6e 64 6c 65 72 20 61 66 74 65 72 20 61   handler after a
3c50: 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 53 51   statement.** SQ
3c60: 4c 20 68 61 73 20 65 78 65 63 75 74 65 64 2e 20  L has executed. 
3c70: 20 54 68 65 20 54 43 4c 20 73 63 72 69 70 74 20   The TCL script 
3c80: 69 6e 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65  in pDb->zProfile
3c90: 20 69 73 20 65 76 61 6c 75 61 74 65 64 2e 0a 2a   is evaluated..*
3ca0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44 62  /.static void Db
3cb0: 50 72 6f 66 69 6c 65 48 61 6e 64 6c 65 72 28 76  ProfileHandler(v
3cc0: 6f 69 64 20 2a 63 64 2c 20 63 6f 6e 73 74 20 63  oid *cd, const c
3cd0: 68 61 72 20 2a 7a 53 71 6c 2c 20 73 71 6c 69 74  har *zSql, sqlit
3ce0: 65 5f 75 69 6e 74 36 34 20 74 6d 29 7b 0a 20 20  e_uint64 tm){.  
3cf0: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
3d00: 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20  (SqliteDb*)cd;. 
3d10: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72   Tcl_DString str
3d20: 3b 0a 20 20 63 68 61 72 20 7a 54 6d 5b 31 30 30  ;.  char zTm[100
3d30: 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  ];..  sqlite3_sn
3d40: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 54  printf(sizeof(zT
3d50: 6d 29 2d 31 2c 20 7a 54 6d 2c 20 22 25 6c 6c 64  m)-1, zTm, "%lld
3d60: 22 2c 20 74 6d 29 3b 0a 20 20 54 63 6c 5f 44 53  ", tm);.  Tcl_DS
3d70: 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b  tringInit(&str);
3d80: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70  .  Tcl_DStringAp
3d90: 70 65 6e 64 28 26 73 74 72 2c 20 70 44 62 2d 3e  pend(&str, pDb->
3da0: 7a 50 72 6f 66 69 6c 65 2c 20 2d 31 29 3b 0a 20  zProfile, -1);. 
3db0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
3dc0: 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20  ndElement(&str, 
3dd0: 7a 53 71 6c 29 3b 0a 20 20 54 63 6c 5f 44 53 74  zSql);.  Tcl_DSt
3de0: 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e  ringAppendElemen
3df0: 74 28 26 73 74 72 2c 20 7a 54 6d 29 3b 0a 20 20  t(&str, zTm);.  
3e00: 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e  Tcl_Eval(pDb->in
3e10: 74 65 72 70 2c 20 54 63 6c 5f 44 53 74 72 69 6e  terp, Tcl_DStrin
3e20: 67 56 61 6c 75 65 28 26 73 74 72 29 29 3b 0a 20  gValue(&str));. 
3e30: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
3e40: 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f 52 65  (&str);.  Tcl_Re
3e50: 73 65 74 52 65 73 75 6c 74 28 70 44 62 2d 3e 69  setResult(pDb->i
3e60: 6e 74 65 72 70 29 3b 0a 7d 0a 23 65 6e 64 69 66  nterp);.}.#endif
3e70: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
3e80: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
3e90: 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hen a transactio
3ea0: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 20  n is committed. 
3eb0: 20 54 68 65 0a 2a 2a 20 54 43 4c 20 73 63 72 69   The.** TCL scri
3ec0: 70 74 20 69 6e 20 70 44 62 2d 3e 7a 43 6f 6d 6d  pt in pDb->zComm
3ed0: 69 74 20 69 73 20 65 78 65 63 75 74 65 64 2e 20  it is executed. 
3ee0: 20 49 66 20 69 74 20 72 65 74 75 72 6e 73 20 6e   If it returns n
3ef0: 6f 6e 2d 7a 65 72 6f 20 6f 72 0a 2a 2a 20 69 66  on-zero or.** if
3f00: 20 69 74 20 74 68 72 6f 77 73 20 61 6e 20 65 78   it throws an ex
3f10: 63 65 70 74 69 6f 6e 2c 20 74 68 65 20 74 72 61  ception, the tra
3f20: 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
3f30: 65 64 20 62 61 63 6b 20 69 6e 73 74 65 61 64 0a  ed back instead.
3f40: 2a 2a 20 6f 66 20 62 65 69 6e 67 20 63 6f 6d 6d  ** of being comm
3f50: 69 74 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  itted..*/.static
3f60: 20 69 6e 74 20 44 62 43 6f 6d 6d 69 74 48 61 6e   int DbCommitHan
3f70: 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 29 7b 0a  dler(void *cd){.
3f80: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
3f90: 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b  = (SqliteDb*)cd;
3fa0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63  .  int rc;..  rc
3fb0: 20 3d 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d   = Tcl_Eval(pDb-
3fc0: 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 43  >interp, pDb->zC
3fd0: 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63  ommit);.  if( rc
3fe0: 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69  !=TCL_OK || atoi
3ff0: 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65  (Tcl_GetStringRe
4000: 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70  sult(pDb->interp
4010: 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  )) ){.    return
4020: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
4030: 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f   0;.}..static vo
4040: 69 64 20 44 62 52 6f 6c 6c 62 61 63 6b 48 61 6e  id DbRollbackHan
4050: 64 6c 65 72 28 76 6f 69 64 20 2a 63 6c 69 65 6e  dler(void *clien
4060: 74 44 61 74 61 29 7b 0a 20 20 53 71 6c 69 74 65  tData){.  Sqlite
4070: 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74  Db *pDb = (Sqlit
4080: 65 44 62 2a 29 63 6c 69 65 6e 74 44 61 74 61 3b  eDb*)clientData;
4090: 0a 20 20 61 73 73 65 72 74 28 70 44 62 2d 3e 70  .  assert(pDb->p
40a0: 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 29 3b 0a 20  RollbackHook);. 
40b0: 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c   if( TCL_OK!=Tcl
40c0: 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e  _EvalObjEx(pDb->
40d0: 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 70 52 6f  interp, pDb->pRo
40e0: 6c 6c 62 61 63 6b 48 6f 6f 6b 2c 20 30 29 20 29  llbackHook, 0) )
40f0: 7b 0a 20 20 20 20 54 63 6c 5f 42 61 63 6b 67 72  {.    Tcl_Backgr
4100: 6f 75 6e 64 45 72 72 6f 72 28 70 44 62 2d 3e 69  oundError(pDb->i
4110: 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 73  nterp);.  }.}..s
4120: 74 61 74 69 63 20 76 6f 69 64 20 44 62 55 70 64  tatic void DbUpd
4130: 61 74 65 48 61 6e 64 6c 65 72 28 0a 20 20 76 6f  ateHandler(.  vo
4140: 69 64 20 2a 70 2c 20 0a 20 20 69 6e 74 20 6f 70  id *p, .  int op
4150: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
4160: 7a 44 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68  zDb, .  const ch
4170: 61 72 20 2a 7a 54 62 6c 2c 20 0a 20 20 73 71 6c  ar *zTbl, .  sql
4180: 69 74 65 5f 69 6e 74 36 34 20 72 6f 77 69 64 0a  ite_int64 rowid.
4190: 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  ){.  SqliteDb *p
41a0: 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 20 2a  Db = (SqliteDb *
41b0: 29 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  )p;.  Tcl_Obj *p
41c0: 43 6d 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Cmd;..  assert( 
41d0: 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b  pDb->pUpdateHook
41e0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
41f0: 3d 3d 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 20  ==SQLITE_INSERT 
4200: 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 55 50  || op==SQLITE_UP
4210: 44 41 54 45 20 7c 7c 20 6f 70 3d 3d 53 51 4c 49  DATE || op==SQLI
4220: 54 45 5f 44 45 4c 45 54 45 20 29 3b 0a 0a 20 20  TE_DELETE );..  
4230: 70 43 6d 64 20 3d 20 54 63 6c 5f 44 75 70 6c 69  pCmd = Tcl_Dupli
4240: 63 61 74 65 4f 62 6a 28 70 44 62 2d 3e 70 55 70  cateObj(pDb->pUp
4250: 64 61 74 65 48 6f 6f 6b 29 3b 0a 20 20 54 63 6c  dateHook);.  Tcl
4260: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43  _IncrRefCount(pC
4270: 6d 64 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  md);.  Tcl_ListO
4280: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
4290: 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77  0, pCmd, Tcl_New
42a0: 53 74 72 69 6e 67 4f 62 6a 28 0a 20 20 20 20 28  StringObj(.    (
42b0: 20 28 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 53   (op==SQLITE_INS
42c0: 45 52 54 29 3f 22 49 4e 53 45 52 54 22 3a 28 6f  ERT)?"INSERT":(o
42d0: 70 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45  p==SQLITE_UPDATE
42e0: 29 3f 22 55 50 44 41 54 45 22 3a 22 44 45 4c 45  )?"UPDATE":"DELE
42f0: 54 45 22 29 2c 20 2d 31 29 29 3b 0a 20 20 54 63  TE"), -1));.  Tc
4300: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
4310: 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20  lement(0, pCmd, 
4320: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
4330: 28 7a 44 62 2c 20 2d 31 29 29 3b 0a 20 20 54 63  (zDb, -1));.  Tc
4340: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
4350: 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20  lement(0, pCmd, 
4360: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
4370: 28 7a 54 62 6c 2c 20 2d 31 29 29 3b 0a 20 20 54  (zTbl, -1));.  T
4380: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
4390: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c  Element(0, pCmd,
43a0: 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f   Tcl_NewWideIntO
43b0: 62 6a 28 72 6f 77 69 64 29 29 3b 0a 20 20 54 63  bj(rowid));.  Tc
43c0: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d  l_EvalObjEx(pDb-
43d0: 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54  >interp, pCmd, T
43e0: 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b  CL_EVAL_DIRECT);
43f0: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
4400: 74 63 6c 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64  tclCollateNeeded
4410: 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 0a  (.  void *pCtx,.
4420: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
4430: 20 69 6e 74 20 65 6e 63 2c 0a 20 20 63 6f 6e 73   int enc,.  cons
4440: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b  t char *zName.){
4450: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
4460: 20 3d 20 28 53 71 6c 69 74 65 44 62 20 2a 29 70   = (SqliteDb *)p
4470: 43 74 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  Ctx;.  Tcl_Obj *
4480: 70 53 63 72 69 70 74 20 3d 20 54 63 6c 5f 44 75  pScript = Tcl_Du
4490: 70 6c 69 63 61 74 65 4f 62 6a 28 70 44 62 2d 3e  plicateObj(pDb->
44a0: 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b  pCollateNeeded);
44b0: 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  .  Tcl_IncrRefCo
44c0: 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 20 20  unt(pScript);.  
44d0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
44e0: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 53 63 72  dElement(0, pScr
44f0: 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  ipt, Tcl_NewStri
4500: 6e 67 4f 62 6a 28 7a 4e 61 6d 65 2c 20 2d 31 29  ngObj(zName, -1)
4510: 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  );.  Tcl_EvalObj
4520: 45 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  Ex(pDb->interp, 
4530: 70 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20 54  pScript, 0);.  T
4540: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
4550: 70 53 63 72 69 70 74 29 3b 0a 7d 0a 0a 2f 2a 0a  pScript);.}../*.
4560: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
4570: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 76 61  is called to eva
4580: 6c 75 61 74 65 20 61 6e 20 53 51 4c 20 63 6f 6c  luate an SQL col
4590: 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  lation function 
45a0: 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 75  implemented.** u
45b0: 73 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74 2e  sing TCL script.
45c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
45d0: 63 6c 53 71 6c 43 6f 6c 6c 61 74 65 28 0a 20 20  clSqlCollate(.  
45e0: 76 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20 69 6e  void *pCtx,.  in
45f0: 74 20 6e 41 2c 0a 20 20 63 6f 6e 73 74 20 76 6f  t nA,.  const vo
4600: 69 64 20 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e 42  id *zA,.  int nB
4610: 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ,.  const void *
4620: 7a 42 0a 29 7b 0a 20 20 53 71 6c 43 6f 6c 6c 61  zB.){.  SqlColla
4630: 74 65 20 2a 70 20 3d 20 28 53 71 6c 43 6f 6c 6c  te *p = (SqlColl
4640: 61 74 65 20 2a 29 70 43 74 78 3b 0a 20 20 54 63  ate *)pCtx;.  Tc
4650: 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 0a 20 20  l_Obj *pCmd;..  
4660: 70 43 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 53 74  pCmd = Tcl_NewSt
4670: 72 69 6e 67 4f 62 6a 28 70 2d 3e 7a 53 63 72 69  ringObj(p->zScri
4680: 70 74 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49  pt, -1);.  Tcl_I
4690: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64  ncrRefCount(pCmd
46a0: 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
46b0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d  AppendElement(p-
46c0: 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54  >interp, pCmd, T
46d0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
46e0: 7a 41 2c 20 6e 41 29 29 3b 0a 20 20 54 63 6c 5f  zA, nA));.  Tcl_
46f0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
4700: 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c 20  ment(p->interp, 
4710: 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72  pCmd, Tcl_NewStr
4720: 69 6e 67 4f 62 6a 28 7a 42 2c 20 6e 42 29 29 3b  ingObj(zB, nB));
4730: 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78  .  Tcl_EvalObjEx
4740: 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64  (p->interp, pCmd
4750: 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43  , TCL_EVAL_DIREC
4760: 54 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65  T);.  Tcl_DecrRe
4770: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
4780: 72 65 74 75 72 6e 20 28 61 74 6f 69 28 54 63 6c  return (atoi(Tcl
4790: 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74  _GetStringResult
47a0: 28 70 2d 3e 69 6e 74 65 72 70 29 29 29 3b 0a 7d  (p->interp)));.}
47b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
47c0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
47d0: 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20 53 51  o evaluate an SQ
47e0: 4c 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65  L function imple
47f0: 6d 65 6e 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20  mented.** using 
4800: 54 43 4c 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 73  TCL script..*/.s
4810: 74 61 74 69 63 20 76 6f 69 64 20 74 63 6c 53 71  tatic void tclSq
4820: 6c 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  lFunc(sqlite3_co
4830: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20  ntext *context, 
4840: 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
4850: 33 5f 76 61 6c 75 65 2a 2a 61 72 67 76 29 7b 0a  3_value**argv){.
4860: 20 20 53 71 6c 46 75 6e 63 20 2a 70 20 3d 20 73    SqlFunc *p = s
4870: 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
4880: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 54 63 6c  (context);.  Tcl
4890: 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 20 20 69 6e  _Obj *pCmd;.  in
48a0: 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  t i;.  int rc;..
48b0: 20 20 69 66 28 20 61 72 67 63 3d 3d 30 20 29 7b    if( argc==0 ){
48c0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
48d0: 20 61 72 65 20 6e 6f 20 61 72 67 75 6d 65 6e 74   are no argument
48e0: 73 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f  s to the functio
48f0: 6e 2c 20 63 61 6c 6c 20 54 63 6c 5f 45 76 61 6c  n, call Tcl_Eval
4900: 4f 62 6a 45 78 20 6f 6e 20 74 68 65 0a 20 20 20  ObjEx on the.   
4910: 20 2a 2a 20 73 63 72 69 70 74 20 6f 62 6a 65 63   ** script objec
4920: 74 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68 69  t directly.  Thi
4930: 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 54 43 4c  s allows the TCL
4940: 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20 67 65 6e   compiler to gen
4950: 65 72 61 74 65 0a 20 20 20 20 2a 2a 20 62 79 74  erate.    ** byt
4960: 65 63 6f 64 65 20 66 6f 72 20 74 68 65 20 63 6f  ecode for the co
4970: 6d 6d 61 6e 64 20 6f 6e 20 74 68 65 20 66 69 72  mmand on the fir
4980: 73 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 61 6e  st invocation an
4990: 64 20 74 68 75 73 20 6d 61 6b 65 0a 20 20 20 20  d thus make.    
49a0: 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20 69 6e  ** subsequent in
49b0: 76 6f 63 61 74 69 6f 6e 73 20 6d 75 63 68 20 66  vocations much f
49c0: 61 73 74 65 72 2e 20 2a 2f 0a 20 20 20 20 70 43  aster. */.    pC
49d0: 6d 64 20 3d 20 70 2d 3e 70 53 63 72 69 70 74 3b  md = p->pScript;
49e0: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
49f0: 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20  Count(pCmd);.   
4a00: 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62   rc = Tcl_EvalOb
4a10: 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70  jEx(p->interp, p
4a20: 43 6d 64 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c  Cmd, 0);.    Tcl
4a30: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43  _DecrRefCount(pC
4a40: 6d 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  md);.  }else{.  
4a50: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
4a60: 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74  e arguments to t
4a70: 68 65 20 66 75 6e 63 74 69 6f 6e 2c 20 6d 61 6b  he function, mak
4a80: 65 20 61 20 73 68 61 6c 6c 6f 77 20 63 6f 70 79  e a shallow copy
4a90: 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 73   of the.    ** s
4aa0: 63 72 69 70 74 20 6f 62 6a 65 63 74 2c 20 6c 61  cript object, la
4ab0: 70 70 65 6e 64 20 74 68 65 20 61 72 67 75 6d 65  ppend the argume
4ac0: 6e 74 73 2c 20 74 68 65 6e 20 65 76 61 6c 75 61  nts, then evalua
4ad0: 74 65 20 74 68 65 20 63 6f 70 79 2e 0a 20 20 20  te the copy..   
4ae0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 42 79 20 22 73   **.    ** By "s
4af0: 68 61 6c 6c 6f 77 22 20 63 6f 70 79 2c 20 77 65  hallow" copy, we
4b00: 20 6d 65 61 6e 20 61 20 6f 6e 6c 79 20 74 68 65   mean a only the
4b10: 20 6f 75 74 65 72 20 6c 69 73 74 20 54 63 6c 5f   outer list Tcl_
4b20: 4f 62 6a 20 69 73 20 64 75 70 6c 69 63 61 74 65  Obj is duplicate
4b30: 64 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6e 65  d..    ** The ne
4b40: 77 20 54 63 6c 5f 4f 62 6a 20 63 6f 6e 74 61 69  w Tcl_Obj contai
4b50: 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74  ns pointers to t
4b60: 68 65 20 6f 72 69 67 69 6e 61 6c 20 6c 69 73 74  he original list
4b70: 20 65 6c 65 6d 65 6e 74 73 2e 20 0a 20 20 20 20   elements. .    
4b80: 2a 2a 20 54 68 61 74 20 77 61 79 2c 20 77 68 65  ** That way, whe
4b90: 6e 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29  n Tcl_EvalObjv()
4ba0: 20 69 73 20 72 75 6e 20 61 6e 64 20 73 68 69 6d   is run and shim
4bb0: 6d 65 72 73 20 74 68 65 20 66 69 72 73 74 20 65  mers the first e
4bc0: 6c 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 6f 66  lement.    ** of
4bd0: 20 74 68 65 20 6c 69 73 74 20 74 6f 20 74 63 6c   the list to tcl
4be0: 43 6d 64 4e 61 6d 65 54 79 70 65 2c 20 74 68 61  CmdNameType, tha
4bf0: 74 20 61 6c 74 65 72 6e 61 74 65 20 72 65 70 72  t alternate repr
4c00: 65 73 65 6e 74 61 74 69 6f 6e 20 77 69 6c 6c 0a  esentation will.
4c10: 20 20 20 20 2a 2a 20 62 65 20 70 72 65 73 65 72      ** be preser
4c20: 76 65 64 20 61 6e 64 20 72 65 75 73 65 64 20 6f  ved and reused o
4c30: 6e 20 74 68 65 20 6e 65 78 74 20 69 6e 76 6f 63  n the next invoc
4c40: 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ation..    */.  
4c50: 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 41 72 67    Tcl_Obj **aArg
4c60: 3b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a  ;.    int nArg;.
4c70: 20 20 20 20 69 66 28 20 54 63 6c 5f 4c 69 73 74      if( Tcl_List
4c80: 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 70  ObjGetElements(p
4c90: 2d 3e 69 6e 74 65 72 70 2c 20 70 2d 3e 70 53 63  ->interp, p->pSc
4ca0: 72 69 70 74 2c 20 26 6e 41 72 67 2c 20 26 61 41  ript, &nArg, &aA
4cb0: 72 67 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  rg) ){.      sql
4cc0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
4cd0: 72 28 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f 47  r(context, Tcl_G
4ce0: 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70  etStringResult(p
4cf0: 2d 3e 69 6e 74 65 72 70 29 2c 20 2d 31 29 3b 20  ->interp), -1); 
4d00: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
4d10: 20 20 20 7d 20 20 20 20 20 0a 20 20 20 20 70 43     }     .    pC
4d20: 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74  md = Tcl_NewList
4d30: 4f 62 6a 28 6e 41 72 67 2c 20 61 41 72 67 29 3b  Obj(nArg, aArg);
4d40: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
4d50: 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20  Count(pCmd);.   
4d60: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63   for(i=0; i<argc
4d70: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
4d80: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 49 6e  lite3_value *pIn
4d90: 20 3d 20 61 72 67 76 5b 69 5d 3b 0a 20 20 20 20   = argv[i];.    
4da0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b    Tcl_Obj *pVal;
4db0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20  .            .  
4dc0: 20 20 20 20 2f 2a 20 53 65 74 20 70 56 61 6c 20      /* Set pVal 
4dd0: 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 69  to contain the i
4de0: 27 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  'th column of th
4df0: 69 73 20 72 6f 77 2e 20 2a 2f 0a 20 20 20 20 20  is row. */.     
4e00: 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33   switch( sqlite3
4e10: 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 49 6e 29  _value_type(pIn)
4e20: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65   ){.        case
4e30: 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a   SQLITE_BLOB: {.
4e40: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 62 79            int by
4e50: 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  tes = sqlite3_va
4e60: 6c 75 65 5f 62 79 74 65 73 28 70 49 6e 29 3b 0a  lue_bytes(pIn);.
4e70: 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d            pVal =
4e80: 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61   Tcl_NewByteArra
4e90: 79 4f 62 6a 28 73 71 6c 69 74 65 33 5f 76 61 6c  yObj(sqlite3_val
4ea0: 75 65 5f 62 6c 6f 62 28 70 49 6e 29 2c 20 62 79  ue_blob(pIn), by
4eb0: 74 65 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tes);.          
4ec0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
4ed0: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51  .        case SQ
4ee0: 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a  LITE_INTEGER: {.
4ef0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
4f00: 5f 69 6e 74 36 34 20 76 20 3d 20 73 71 6c 69 74  _int64 v = sqlit
4f10: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 70  e3_value_int64(p
4f20: 49 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  In);.          i
4f30: 66 28 20 76 3e 3d 2d 32 31 34 37 34 38 33 36 34  f( v>=-214748364
4f40: 37 20 26 26 20 76 3c 3d 32 31 34 37 34 38 33 36  7 && v<=21474836
4f50: 34 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  47 ){.          
4f60: 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77    pVal = Tcl_New
4f70: 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20 20  IntObj(v);.     
4f80: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4f90: 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54          pVal = T
4fa0: 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a  cl_NewWideIntObj
4fb0: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  (v);.          }
4fc0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
4fd0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
4fe0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
4ff0: 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 20  FLOAT: {.       
5000: 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 73 71     double r = sq
5010: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62  lite3_value_doub
5020: 6c 65 28 70 49 6e 29 3b 0a 20 20 20 20 20 20 20  le(pIn);.       
5030: 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65     pVal = Tcl_Ne
5040: 77 44 6f 75 62 6c 65 4f 62 6a 28 72 29 3b 0a 20  wDoubleObj(r);. 
5050: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
5060: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5070: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55    case SQLITE_NU
5080: 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  LL: {.          
5090: 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74  pVal = Tcl_NewSt
50a0: 72 69 6e 67 4f 62 6a 28 22 22 2c 20 30 29 3b 0a  ringObj("", 0);.
50b0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
50c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
50d0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
50e0: 20 20 20 20 20 20 20 20 69 6e 74 20 62 79 74 65          int byte
50f0: 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  s = sqlite3_valu
5100: 65 5f 62 79 74 65 73 28 70 49 6e 29 3b 0a 20 20  e_bytes(pIn);.  
5110: 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54          pVal = T
5120: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
5130: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
5140: 76 61 6c 75 65 5f 74 65 78 74 28 70 49 6e 29 2c  value_text(pIn),
5150: 20 62 79 74 65 73 29 3b 0a 20 20 20 20 20 20 20   bytes);.       
5160: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
5170: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
5180: 20 20 72 63 20 3d 20 54 63 6c 5f 4c 69 73 74 4f    rc = Tcl_ListO
5190: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
51a0: 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c  p->interp, pCmd,
51b0: 20 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 69 66   pVal);.      if
51c0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
51d0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
51e0: 28 70 43 6d 64 29 3b 0a 20 20 20 20 20 20 20 20  (pCmd);.        
51f0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
5200: 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 54 63  rror(context, Tc
5210: 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
5220: 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c 20 2d 31  t(p->interp), -1
5230: 29 3b 20 0a 20 20 20 20 20 20 20 20 72 65 74 75  ); .        retu
5240: 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
5250: 7d 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 75 73  }.    if( !p->us
5260: 65 45 76 61 6c 4f 62 6a 76 20 29 7b 0a 20 20 20  eEvalObjv ){.   
5270: 20 20 20 2f 2a 20 54 63 6c 5f 45 76 61 6c 4f 62     /* Tcl_EvalOb
5280: 6a 45 78 28 29 20 77 69 6c 6c 20 61 75 74 6f 6d  jEx() will autom
5290: 61 74 69 63 61 6c 6c 79 20 63 61 6c 6c 20 54 63  atically call Tc
52a0: 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 69 66 20  l_EvalObjv() if 
52b0: 70 43 6d 64 0a 20 20 20 20 20 20 2a 2a 20 69 73  pCmd.      ** is
52c0: 20 61 20 6c 69 73 74 20 77 69 74 68 6f 75 74 20   a list without 
52d0: 61 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65  a string represe
52e0: 6e 74 61 74 69 6f 6e 2e 20 20 54 6f 20 70 72 65  ntation.  To pre
52f0: 76 65 6e 74 20 74 68 69 73 20 66 72 6f 6d 0a 20  vent this from. 
5300: 20 20 20 20 20 2a 2a 20 68 61 70 70 65 6e 69 6e       ** happenin
5310: 67 2c 20 6d 61 6b 65 20 73 75 72 65 20 70 43 6d  g, make sure pCm
5320: 64 20 68 61 73 20 61 20 76 61 6c 69 64 20 73 74  d has a valid st
5330: 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74  ring representat
5340: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 54 63 6c  ion */.      Tcl
5350: 5f 47 65 74 53 74 72 69 6e 67 28 70 43 6d 64 29  _GetString(pCmd)
5360: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
5370: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70   Tcl_EvalObjEx(p
5380: 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20  ->interp, pCmd, 
5390: 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29  TCL_EVAL_DIRECT)
53a0: 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  ;.    Tcl_DecrRe
53b0: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
53c0: 7d 0a 0a 20 20 69 66 28 20 72 63 20 26 26 20 72  }..  if( rc && r
53d0: 63 21 3d 54 43 4c 5f 52 45 54 55 52 4e 20 29 7b  c!=TCL_RETURN ){
53e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
53f0: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
5400: 74 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  t, Tcl_GetString
5410: 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70  Result(p->interp
5420: 29 2c 20 2d 31 29 3b 20 0a 20 20 7d 65 6c 73 65  ), -1); .  }else
5430: 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  {.    Tcl_Obj *p
5440: 56 61 72 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a  Var = Tcl_GetObj
5450: 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70  Result(p->interp
5460: 29 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  );.    int n;.  
5470: 20 20 75 38 20 2a 64 61 74 61 3b 0a 20 20 20 20    u8 *data;.    
5480: 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 70 56  char *zType = pV
5490: 61 72 2d 3e 74 79 70 65 50 74 72 20 3f 20 70 56  ar->typePtr ? pV
54a0: 61 72 2d 3e 74 79 70 65 50 74 72 2d 3e 6e 61 6d  ar->typePtr->nam
54b0: 65 20 3a 20 22 22 3b 0a 20 20 20 20 63 68 61 72  e : "";.    char
54c0: 20 63 20 3d 20 7a 54 79 70 65 5b 30 5d 3b 0a 20   c = zType[0];. 
54d0: 20 20 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26     if( c=='b' &&
54e0: 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 62   strcmp(zType,"b
54f0: 79 74 65 61 72 72 61 79 22 29 3d 3d 30 20 26 26  ytearray")==0 &&
5500: 20 70 56 61 72 2d 3e 62 79 74 65 73 3d 3d 30 20   pVar->bytes==0 
5510: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79  ){.      /* Only
5520: 20 72 65 74 75 72 6e 20 61 20 42 4c 4f 42 20 74   return a BLOB t
5530: 79 70 65 20 69 66 20 74 68 65 20 54 63 6c 20 76  ype if the Tcl v
5540: 61 72 69 61 62 6c 65 20 69 73 20 61 20 62 79 74  ariable is a byt
5550: 65 61 72 72 61 79 20 61 6e 64 0a 20 20 20 20 20  earray and.     
5560: 20 2a 2a 20 68 61 73 20 6e 6f 20 73 74 72 69 6e   ** has no strin
5570: 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  g representation
5580: 2e 20 2a 2f 0a 20 20 20 20 20 20 64 61 74 61 20  . */.      data 
5590: 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  = Tcl_GetByteArr
55a0: 61 79 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20  ayFromObj(pVar, 
55b0: 26 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  &n);.      sqlit
55c0: 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 28 63  e3_result_blob(c
55d0: 6f 6e 74 65 78 74 2c 20 64 61 74 61 2c 20 6e 2c  ontext, data, n,
55e0: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
55f0: 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  T);.    }else if
5600: 28 20 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63  ( c=='b' && strc
5610: 6d 70 28 7a 54 79 70 65 2c 22 62 6f 6f 6c 65 61  mp(zType,"boolea
5620: 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  n")==0 ){.      
5630: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
5640: 6a 28 30 2c 20 70 56 61 72 2c 20 26 6e 29 3b 0a  j(0, pVar, &n);.
5650: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
5660: 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74  sult_int(context
5670: 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  , n);.    }else 
5680: 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20 73 74  if( c=='d' && st
5690: 72 63 6d 70 28 7a 54 79 70 65 2c 22 64 6f 75 62  rcmp(zType,"doub
56a0: 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  le")==0 ){.     
56b0: 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20 20   double r;.     
56c0: 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72   Tcl_GetDoubleFr
56d0: 6f 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c 20 26  omObj(0, pVar, &
56e0: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
56f0: 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28  3_result_double(
5700: 63 6f 6e 74 65 78 74 2c 20 72 29 3b 0a 20 20 20  context, r);.   
5710: 20 7d 65 6c 73 65 20 69 66 28 20 28 63 3d 3d 27   }else if( (c=='
5720: 77 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79  w' && strcmp(zTy
5730: 70 65 2c 22 77 69 64 65 49 6e 74 22 29 3d 3d 30  pe,"wideInt")==0
5740: 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 28  ) ||.          (
5750: 63 3d 3d 27 69 27 20 26 26 20 73 74 72 63 6d 70  c=='i' && strcmp
5760: 28 7a 54 79 70 65 2c 22 69 6e 74 22 29 3d 3d 30  (zType,"int")==0
5770: 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  ) ){.      Tcl_W
5780: 69 64 65 49 6e 74 20 76 3b 0a 20 20 20 20 20 20  ideInt v;.      
5790: 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72  Tcl_GetWideIntFr
57a0: 6f 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c 20 26  omObj(0, pVar, &
57b0: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
57c0: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63  3_result_int64(c
57d0: 6f 6e 74 65 78 74 2c 20 76 29 3b 0a 20 20 20 20  ontext, v);.    
57e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 61 74  }else{.      dat
57f0: 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  a = (unsigned ch
5800: 61 72 20 2a 29 54 63 6c 5f 47 65 74 53 74 72 69  ar *)Tcl_GetStri
5810: 6e 67 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20  ngFromObj(pVar, 
5820: 26 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  &n);.      sqlit
5830: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
5840: 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 20 2a 29  ontext, (char *)
5850: 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f  data, n, SQLITE_
5860: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
5870: 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  }.  }.}..#ifndef
5880: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
5890: 48 4f 52 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a  HORIZATION./*.**
58a0: 20 54 68 69 73 20 69 73 20 74 68 65 20 61 75 74   This is the aut
58b0: 68 65 6e 74 69 63 61 74 69 6f 6e 20 66 75 6e 63  hentication func
58c0: 74 69 6f 6e 2e 20 20 49 74 20 61 70 70 65 6e 64  tion.  It append
58d0: 73 20 74 68 65 20 61 75 74 68 65 6e 74 69 63 61  s the authentica
58e0: 74 69 6f 6e 0a 2a 2a 20 74 79 70 65 20 63 6f 64  tion.** type cod
58f0: 65 20 61 6e 64 20 74 68 65 20 74 77 6f 20 61 72  e and the two ar
5900: 67 75 6d 65 6e 74 73 20 74 6f 20 7a 43 6d 64 5b  guments to zCmd[
5910: 5d 20 74 68 65 6e 20 69 6e 76 6f 6b 65 73 20 74  ] then invokes t
5920: 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 6f 6e 20  he result.** on 
5930: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e  the interpreter.
5940: 20 20 54 68 65 20 72 65 70 6c 79 20 69 73 20 65    The reply is e
5950: 78 61 6d 69 6e 65 64 20 74 6f 20 64 65 74 65 72  xamined to deter
5960: 6d 69 6e 65 20 69 66 20 74 68 65 0a 2a 2a 20 61  mine if the.** a
5970: 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 66 61  uthentication fa
5980: 69 6c 73 20 6f 72 20 73 75 63 63 65 65 64 73 2e  ils or succeeds.
5990: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
59a0: 75 74 68 5f 63 61 6c 6c 62 61 63 6b 28 0a 20 20  uth_callback(.  
59b0: 76 6f 69 64 20 2a 70 41 72 67 2c 0a 20 20 69 6e  void *pArg,.  in
59c0: 74 20 63 6f 64 65 2c 0a 20 20 63 6f 6e 73 74 20  t code,.  const 
59d0: 63 68 61 72 20 2a 7a 41 72 67 31 2c 0a 20 20 63  char *zArg1,.  c
59e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 32  onst char *zArg2
59f0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
5a00: 7a 41 72 67 33 2c 0a 20 20 63 6f 6e 73 74 20 63  zArg3,.  const c
5a10: 68 61 72 20 2a 7a 41 72 67 34 0a 29 7b 0a 20 20  har *zArg4.){.  
5a20: 63 68 61 72 20 2a 7a 43 6f 64 65 3b 0a 20 20 54  char *zCode;.  T
5a30: 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a  cl_DString str;.
5a40: 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73    int rc;.  cons
5a50: 74 20 63 68 61 72 20 2a 7a 52 65 70 6c 79 3b 0a  t char *zReply;.
5a60: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
5a70: 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 70 41 72  = (SqliteDb*)pAr
5a80: 67 3b 0a 20 20 69 66 28 20 70 44 62 2d 3e 64 69  g;.  if( pDb->di
5a90: 73 61 62 6c 65 41 75 74 68 20 29 20 72 65 74 75  sableAuth ) retu
5aa0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
5ab0: 20 73 77 69 74 63 68 28 20 63 6f 64 65 20 29 7b   switch( code ){
5ac0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
5ad0: 5f 43 4f 50 59 20 20 20 20 20 20 20 20 20 20 20  _COPY           
5ae0: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
5af0: 54 45 5f 43 4f 50 59 22 3b 20 62 72 65 61 6b 3b  TE_COPY"; break;
5b00: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
5b10: 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 20 20 20  _CREATE_INDEX   
5b20: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
5b30: 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 22  TE_CREATE_INDEX"
5b40: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
5b50: 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  e SQLITE_CREATE_
5b60: 54 41 42 4c 45 20 20 20 20 20 20 3a 20 7a 43 6f  TABLE      : zCo
5b70: 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54  de="SQLITE_CREAT
5b80: 45 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b  E_TABLE"; break;
5b90: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
5ba0: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44  _CREATE_TEMP_IND
5bb0: 45 58 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49  EX : zCode="SQLI
5bc0: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49  TE_CREATE_TEMP_I
5bd0: 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20  NDEX"; break;.  
5be0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52    case SQLITE_CR
5bf0: 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 20  EATE_TEMP_TABLE 
5c00: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
5c10: 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c  CREATE_TEMP_TABL
5c20: 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  E"; break;.    c
5c30: 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54  ase SQLITE_CREAT
5c40: 45 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 3a 20  E_TEMP_TRIGGER: 
5c50: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52  zCode="SQLITE_CR
5c60: 45 41 54 45 5f 54 45 4d 50 5f 54 52 49 47 47 45  EATE_TEMP_TRIGGE
5c70: 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  R"; break;.    c
5c80: 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54  ase SQLITE_CREAT
5c90: 45 5f 54 45 4d 50 5f 56 49 45 57 20 20 3a 20 7a  E_TEMP_VIEW  : z
5ca0: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45  Code="SQLITE_CRE
5cb0: 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 22 3b 20  ATE_TEMP_VIEW"; 
5cc0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
5cd0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 52  SQLITE_CREATE_TR
5ce0: 49 47 47 45 52 20 20 20 20 3a 20 7a 43 6f 64 65  IGGER    : zCode
5cf0: 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  ="SQLITE_CREATE_
5d00: 54 52 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b  TRIGGER"; break;
5d10: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
5d20: 5f 43 52 45 41 54 45 5f 56 49 45 57 20 20 20 20  _CREATE_VIEW    
5d30: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
5d40: 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57 22 3b  TE_CREATE_VIEW";
5d50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
5d60: 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 20   SQLITE_DELETE  
5d70: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
5d80: 65 3d 22 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  e="SQLITE_DELETE
5d90: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
5da0: 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49  se SQLITE_DROP_I
5db0: 4e 44 45 58 20 20 20 20 20 20 20 20 3a 20 7a 43  NDEX        : zC
5dc0: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50  ode="SQLITE_DROP
5dd0: 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a  _INDEX"; break;.
5de0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
5df0: 44 52 4f 50 5f 54 41 42 4c 45 20 20 20 20 20 20  DROP_TABLE      
5e00: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
5e10: 45 5f 44 52 4f 50 5f 54 41 42 4c 45 22 3b 20 62  E_DROP_TABLE"; b
5e20: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
5e30: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
5e40: 49 4e 44 45 58 20 20 20 3a 20 7a 43 6f 64 65 3d  INDEX   : zCode=
5e50: 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d  "SQLITE_DROP_TEM
5e60: 50 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b  P_INDEX"; break;
5e70: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
5e80: 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45  _DROP_TEMP_TABLE
5e90: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
5ea0: 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42  TE_DROP_TEMP_TAB
5eb0: 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  LE"; break;.    
5ec0: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50  case SQLITE_DROP
5ed0: 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 20 3a 20  _TEMP_TRIGGER : 
5ee0: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52  zCode="SQLITE_DR
5ef0: 4f 50 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 22  OP_TEMP_TRIGGER"
5f00: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
5f10: 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  e SQLITE_DROP_TE
5f20: 4d 50 5f 56 49 45 57 20 20 20 20 3a 20 7a 43 6f  MP_VIEW    : zCo
5f30: 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f  de="SQLITE_DROP_
5f40: 54 45 4d 50 5f 56 49 45 57 22 3b 20 62 72 65 61  TEMP_VIEW"; brea
5f50: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
5f60: 54 45 5f 44 52 4f 50 5f 54 52 49 47 47 45 52 20  TE_DROP_TRIGGER 
5f70: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
5f80: 4c 49 54 45 5f 44 52 4f 50 5f 54 52 49 47 47 45  LITE_DROP_TRIGGE
5f90: 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  R"; break;.    c
5fa0: 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  ase SQLITE_DROP_
5fb0: 56 49 45 57 20 20 20 20 20 20 20 20 20 3a 20 7a  VIEW         : z
5fc0: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f  Code="SQLITE_DRO
5fd0: 50 5f 56 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a  P_VIEW"; break;.
5fe0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
5ff0: 49 4e 53 45 52 54 20 20 20 20 20 20 20 20 20 20  INSERT          
6000: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
6010: 45 5f 49 4e 53 45 52 54 22 3b 20 62 72 65 61 6b  E_INSERT"; break
6020: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
6030: 45 5f 50 52 41 47 4d 41 20 20 20 20 20 20 20 20  E_PRAGMA        
6040: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
6050: 49 54 45 5f 50 52 41 47 4d 41 22 3b 20 62 72 65  ITE_PRAGMA"; bre
6060: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
6070: 49 54 45 5f 52 45 41 44 20 20 20 20 20 20 20 20  ITE_READ        
6080: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
6090: 51 4c 49 54 45 5f 52 45 41 44 22 3b 20 62 72 65  QLITE_READ"; bre
60a0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
60b0: 49 54 45 5f 53 45 4c 45 43 54 20 20 20 20 20 20  ITE_SELECT      
60c0: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
60d0: 51 4c 49 54 45 5f 53 45 4c 45 43 54 22 3b 20 62  QLITE_SELECT"; b
60e0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
60f0: 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f  QLITE_TRANSACTIO
6100: 4e 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d  N       : zCode=
6110: 22 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54  "SQLITE_TRANSACT
6120: 49 4f 4e 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ION"; break;.   
6130: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55 50 44   case SQLITE_UPD
6140: 41 54 45 20 20 20 20 20 20 20 20 20 20 20 20 3a  ATE            :
6150: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 55   zCode="SQLITE_U
6160: 50 44 41 54 45 22 3b 20 62 72 65 61 6b 3b 0a 20  PDATE"; break;. 
6170: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
6180: 54 54 41 43 48 20 20 20 20 20 20 20 20 20 20 20  TTACH           
6190: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
61a0: 5f 41 54 54 41 43 48 22 3b 20 62 72 65 61 6b 3b  _ATTACH"; break;
61b0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
61c0: 5f 44 45 54 41 43 48 20 20 20 20 20 20 20 20 20  _DETACH         
61d0: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
61e0: 54 45 5f 44 45 54 41 43 48 22 3b 20 62 72 65 61  TE_DETACH"; brea
61f0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
6200: 54 45 5f 41 4c 54 45 52 5f 54 41 42 4c 45 20 20  TE_ALTER_TABLE  
6210: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
6220: 4c 49 54 45 5f 41 4c 54 45 52 5f 54 41 42 4c 45  LITE_ALTER_TABLE
6230: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
6240: 73 65 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45  se SQLITE_REINDE
6250: 58 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43  X           : zC
6260: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 52 45 49 4e  ode="SQLITE_REIN
6270: 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  DEX"; break;.   
6280: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 4e 41   case SQLITE_ANA
6290: 4c 59 5a 45 20 20 20 20 20 20 20 20 20 20 20 3a  LYZE           :
62a0: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 41   zCode="SQLITE_A
62b0: 4e 41 4c 59 5a 45 22 3b 20 62 72 65 61 6b 3b 0a  NALYZE"; break;.
62c0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
62d0: 43 52 45 41 54 45 5f 56 54 41 42 4c 45 20 20 20  CREATE_VTABLE   
62e0: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
62f0: 45 5f 43 52 45 41 54 45 5f 56 54 41 42 4c 45 22  E_CREATE_VTABLE"
6300: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
6310: 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54  e SQLITE_DROP_VT
6320: 41 42 4c 45 20 20 20 20 20 20 20 3a 20 7a 43 6f  ABLE       : zCo
6330: 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f  de="SQLITE_DROP_
6340: 56 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a  VTABLE"; break;.
6350: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
6360: 46 55 4e 43 54 49 4f 4e 20 20 20 20 20 20 20 20  FUNCTION        
6370: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
6380: 45 5f 46 55 4e 43 54 49 4f 4e 22 3b 20 62 72 65  E_FUNCTION"; bre
6390: 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 20  ak;.    default 
63a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63b0: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 3f        : zCode="?
63c0: 3f 3f 3f 22 3b 20 62 72 65 61 6b 3b 0a 20 20 7d  ???"; break;.  }
63d0: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e  .  Tcl_DStringIn
63e0: 69 74 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f  it(&str);.  Tcl_
63f0: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 73  DStringAppend(&s
6400: 74 72 2c 20 70 44 62 2d 3e 7a 41 75 74 68 2c 20  tr, pDb->zAuth, 
6410: 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  -1);.  Tcl_DStri
6420: 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  ngAppendElement(
6430: 26 73 74 72 2c 20 7a 43 6f 64 65 29 3b 0a 20 20  &str, zCode);.  
6440: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
6450: 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a  dElement(&str, z
6460: 41 72 67 31 20 3f 20 7a 41 72 67 31 20 3a 20 22  Arg1 ? zArg1 : "
6470: 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  ");.  Tcl_DStrin
6480: 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26  gAppendElement(&
6490: 73 74 72 2c 20 7a 41 72 67 32 20 3f 20 7a 41 72  str, zArg2 ? zAr
64a0: 67 32 20 3a 20 22 22 29 3b 0a 20 20 54 63 6c 5f  g2 : "");.  Tcl_
64b0: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65  DStringAppendEle
64c0: 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41 72 67 33  ment(&str, zArg3
64d0: 20 3f 20 7a 41 72 67 33 20 3a 20 22 22 29 3b 0a   ? zArg3 : "");.
64e0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
64f0: 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c  endElement(&str,
6500: 20 7a 41 72 67 34 20 3f 20 7a 41 72 67 34 20 3a   zArg4 ? zArg4 :
6510: 20 22 22 29 3b 0a 20 20 72 63 20 3d 20 54 63 6c   "");.  rc = Tcl
6520: 5f 47 6c 6f 62 61 6c 45 76 61 6c 28 70 44 62 2d  _GlobalEval(pDb-
6530: 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53 74  >interp, Tcl_DSt
6540: 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29 29  ringValue(&str))
6550: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46  ;.  Tcl_DStringF
6560: 72 65 65 28 26 73 74 72 29 3b 0a 20 20 7a 52 65  ree(&str);.  zRe
6570: 70 6c 79 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ply = Tcl_GetStr
6580: 69 6e 67 52 65 73 75 6c 74 28 70 44 62 2d 3e 69  ingResult(pDb->i
6590: 6e 74 65 72 70 29 3b 0a 20 20 69 66 28 20 73 74  nterp);.  if( st
65a0: 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22 53 51 4c  rcmp(zReply,"SQL
65b0: 49 54 45 5f 4f 4b 22 29 3d 3d 30 20 29 7b 0a 20  ITE_OK")==0 ){. 
65c0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
65d0: 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  K;.  }else if( s
65e0: 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22 53 51  trcmp(zReply,"SQ
65f0: 4c 49 54 45 5f 44 45 4e 59 22 29 3d 3d 30 20 29  LITE_DENY")==0 )
6600: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
6610: 45 5f 44 45 4e 59 3b 0a 20 20 7d 65 6c 73 65 20  E_DENY;.  }else 
6620: 69 66 28 20 73 74 72 63 6d 70 28 7a 52 65 70 6c  if( strcmp(zRepl
6630: 79 2c 22 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  y,"SQLITE_IGNORE
6640: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ")==0 ){.    rc 
6650: 3d 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 3b  = SQLITE_IGNORE;
6660: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
6670: 20 3d 20 39 39 39 3b 0a 20 20 7d 0a 20 20 72 65   = 999;.  }.  re
6680: 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
6690: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
66a0: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 20 2a  _AUTHORIZATION *
66b0: 2f 0a 0a 2f 2a 0a 2a 2a 20 7a 54 65 78 74 20 69  /../*.** zText i
66c0: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
66d0: 65 78 74 20 6f 62 74 61 69 6e 65 64 20 76 69 61  ext obtained via
66e0: 20 61 6e 20 73 71 6c 69 74 65 33 5f 72 65 73 75   an sqlite3_resu
66f0: 6c 74 5f 74 65 78 74 28 29 0a 2a 2a 20 6f 72 20  lt_text().** or 
6700: 73 69 6d 69 6c 61 72 20 69 6e 74 65 72 66 61 63  similar interfac
6710: 65 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  e. This routine 
6720: 72 65 74 75 72 6e 73 20 61 20 54 63 6c 20 73 74  returns a Tcl st
6730: 72 69 6e 67 20 6f 62 6a 65 63 74 2c 20 0a 2a 2a  ring object, .**
6740: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
6750: 20 73 65 74 20 74 6f 20 30 2c 20 63 6f 6e 74 61   set to 0, conta
6760: 69 6e 69 6e 67 20 74 68 65 20 74 65 78 74 2e 20  ining the text. 
6770: 49 66 20 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e  If a translation
6780: 0a 2a 2a 20 62 65 74 77 65 65 6e 20 69 73 6f 38  .** between iso8
6790: 38 35 39 20 61 6e 64 20 55 54 46 2d 38 20 69 73  859 and UTF-8 is
67a0: 20 72 65 71 75 69 72 65 64 2c 20 69 74 20 69 73   required, it is
67b0: 20 70 72 65 66 6f 72 6d 65 64 2e 0a 2a 2f 0a 73   preformed..*/.s
67c0: 74 61 74 69 63 20 54 63 6c 5f 4f 62 6a 20 2a 64  tatic Tcl_Obj *d
67d0: 62 54 65 78 74 54 6f 4f 62 6a 28 63 68 61 72 20  bTextToObj(char 
67e0: 63 6f 6e 73 74 20 2a 7a 54 65 78 74 29 7b 0a 20  const *zText){. 
67f0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b 0a   Tcl_Obj *pVal;.
6800: 23 69 66 64 65 66 20 55 54 46 5f 54 52 41 4e 53  #ifdef UTF_TRANS
6810: 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 0a 20 20  LATION_NEEDED.  
6820: 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 43 6f 6c  Tcl_DString dCol
6830: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49  ;.  Tcl_DStringI
6840: 6e 69 74 28 26 64 43 6f 6c 29 3b 0a 20 20 54 63  nit(&dCol);.  Tc
6850: 6c 5f 45 78 74 65 72 6e 61 6c 54 6f 55 74 66 44  l_ExternalToUtfD
6860: 53 74 72 69 6e 67 28 4e 55 4c 4c 2c 20 7a 54 65  String(NULL, zTe
6870: 78 74 2c 20 2d 31 2c 20 26 64 43 6f 6c 29 3b 0a  xt, -1, &dCol);.
6880: 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77    pVal = Tcl_New
6890: 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 44 53  StringObj(Tcl_DS
68a0: 74 72 69 6e 67 56 61 6c 75 65 28 26 64 43 6f 6c  tringValue(&dCol
68b0: 29 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53  ), -1);.  Tcl_DS
68c0: 74 72 69 6e 67 46 72 65 65 28 26 64 43 6f 6c 29  tringFree(&dCol)
68d0: 3b 0a 23 65 6c 73 65 0a 20 20 70 56 61 6c 20 3d  ;.#else.  pVal =
68e0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
68f0: 6a 28 7a 54 65 78 74 2c 20 2d 31 29 3b 0a 23 65  j(zText, -1);.#e
6900: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 70 56  ndif.  return pV
6910: 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  al;.}../*.** Thi
6920: 73 20 72 6f 75 74 69 6e 65 20 72 65 61 64 73 20  s routine reads 
6930: 61 20 6c 69 6e 65 20 6f 66 20 74 65 78 74 20 66  a line of text f
6940: 72 6f 6d 20 46 49 4c 45 20 69 6e 2c 20 73 74 6f  rom FILE in, sto
6950: 72 65 73 0a 2a 2a 20 74 68 65 20 74 65 78 74 20  res.** the text 
6960: 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  in memory obtain
6970: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29  ed from malloc()
6980: 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 70   and returns a p
6990: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
69a0: 20 74 65 78 74 2e 20 20 4e 55 4c 4c 20 69 73 20   text.  NULL is 
69b0: 72 65 74 75 72 6e 65 64 20 61 74 20 65 6e 64 20  returned at end 
69c0: 6f 66 20 66 69 6c 65 2c 20 6f 72 20 69 66 20 6d  of file, or if m
69d0: 61 6c 6c 6f 63 28 29 0a 2a 2a 20 66 61 69 6c 73  alloc().** fails
69e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65  ..**.** The inte
69f0: 72 66 61 63 65 20 69 73 20 6c 69 6b 65 20 22 72  rface is like "r
6a00: 65 61 64 6c 69 6e 65 22 20 62 75 74 20 6e 6f 20  eadline" but no 
6a10: 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 65 64 69  command-line edi
6a20: 74 69 6e 67 0a 2a 2a 20 69 73 20 64 6f 6e 65 2e  ting.** is done.
6a30: 0a 2a 2a 0a 2a 2a 20 63 6f 70 69 65 64 20 66 72  .**.** copied fr
6a40: 6f 6d 20 73 68 65 6c 6c 2e 63 20 66 72 6f 6d 20  om shell.c from 
6a50: 27 2e 69 6d 70 6f 72 74 27 20 63 6f 6d 6d 61 6e  '.import' comman
6a60: 64 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  d.*/.static char
6a70: 20 2a 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28   *local_getline(
6a80: 63 68 61 72 20 2a 7a 50 72 6f 6d 70 74 2c 20 46  char *zPrompt, F
6a90: 49 4c 45 20 2a 69 6e 29 7b 0a 20 20 63 68 61 72  ILE *in){.  char
6aa0: 20 2a 7a 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e   *zLine;.  int n
6ab0: 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  Line;.  int n;. 
6ac0: 20 69 6e 74 20 65 6f 6c 3b 0a 0a 20 20 6e 4c 69   int eol;..  nLi
6ad0: 6e 65 20 3d 20 31 30 30 3b 0a 20 20 7a 4c 69 6e  ne = 100;.  zLin
6ae0: 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 4c 69 6e  e = malloc( nLin
6af0: 65 20 29 3b 0a 20 20 69 66 28 20 7a 4c 69 6e 65  e );.  if( zLine
6b00: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
6b10: 20 20 6e 20 3d 20 30 3b 0a 20 20 65 6f 6c 20 3d    n = 0;.  eol =
6b20: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 21 65 6f   0;.  while( !eo
6b30: 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 2b 31  l ){.    if( n+1
6b40: 30 30 3e 6e 4c 69 6e 65 20 29 7b 0a 20 20 20 20  00>nLine ){.    
6b50: 20 20 6e 4c 69 6e 65 20 3d 20 6e 4c 69 6e 65 2a    nLine = nLine*
6b60: 32 20 2b 20 31 30 30 3b 0a 20 20 20 20 20 20 7a  2 + 100;.      z
6b70: 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28 7a  Line = realloc(z
6b80: 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29 3b 0a 20 20  Line, nLine);.  
6b90: 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d 30      if( zLine==0
6ba0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
6bb0: 20 7d 0a 20 20 20 20 69 66 28 20 66 67 65 74 73   }.    if( fgets
6bc0: 28 26 7a 4c 69 6e 65 5b 6e 5d 2c 20 6e 4c 69 6e  (&zLine[n], nLin
6bd0: 65 20 2d 20 6e 2c 20 69 6e 29 3d 3d 30 20 29 7b  e - n, in)==0 ){
6be0: 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20  .      if( n==0 
6bf0: 29 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 28  ){.        free(
6c00: 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20  zLine);.        
6c10: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
6c20: 7d 0a 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d  }.      zLine[n]
6c30: 20 3d 20 30 3b 0a 20 20 20 20 20 20 65 6f 6c 20   = 0;.      eol 
6c40: 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 1;.      break
6c50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c  ;.    }.    whil
6c60: 65 28 20 7a 4c 69 6e 65 5b 6e 5d 20 29 7b 20 6e  e( zLine[n] ){ n
6c70: 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e  ++; }.    if( n>
6c80: 30 20 26 26 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d  0 && zLine[n-1]=
6c90: 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20 6e  ='\n' ){.      n
6ca0: 2d 2d 3b 0a 20 20 20 20 20 20 7a 4c 69 6e 65 5b  --;.      zLine[
6cb0: 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 65 6f  n] = 0;.      eo
6cc0: 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  l = 1;.    }.  }
6cd0: 0a 20 20 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c  .  zLine = reall
6ce0: 6f 63 28 20 7a 4c 69 6e 65 2c 20 6e 2b 31 20 29  oc( zLine, n+1 )
6cf0: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4c 69 6e 65  ;.  return zLine
6d00: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 69 67 75  ;.}.../*.** Figu
6d10: 72 65 20 6f 75 74 20 74 68 65 20 63 6f 6c 75 6d  re out the colum
6d20: 6e 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 65 20  n names for the 
6d30: 64 61 74 61 20 72 65 74 75 72 6e 65 64 20 62 79  data returned by
6d40: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a   the statement.*
6d50: 2a 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  * passed as the 
6d60: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
6d70: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
6d80: 74 65 72 20 70 61 70 43 6f 6c 4e 61 6d 65 20 69  ter papColName i
6d90: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
6da0: 20 2a 70 61 70 43 6f 6c 4e 61 6d 65 20 69 73 20   *papColName is 
6db0: 73 65 74 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20  set to point.** 
6dc0: 61 74 20 61 6e 20 61 72 72 61 79 20 61 6c 6c 6f  at an array allo
6dd0: 63 61 74 65 64 20 75 73 69 6e 67 20 54 63 6c 5f  cated using Tcl_
6de0: 41 6c 6c 6f 63 28 29 2e 20 49 74 20 69 73 20 74  Alloc(). It is t
6df0: 68 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f  he callers respo
6e00: 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20 74 6f 20  nsibility.** to 
6e10: 66 72 65 65 20 74 68 69 73 20 61 72 72 61 79 20  free this array 
6e20: 75 73 69 6e 67 20 54 63 6c 5f 46 72 65 65 28 29  using Tcl_Free()
6e30: 2c 20 61 6e 64 20 74 6f 20 64 65 63 72 65 6d 65  , and to decreme
6e40: 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
6e50: 0a 2a 2a 20 63 6f 75 6e 74 20 6f 66 20 65 61 63  .** count of eac
6e60: 68 20 54 63 6c 5f 4f 62 6a 2a 20 6d 65 6d 62 65  h Tcl_Obj* membe
6e70: 72 20 6f 66 20 74 68 65 20 61 72 72 61 79 2e 0a  r of the array..
6e80: 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
6e90: 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66   value of this f
6ea0: 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 20 6e  unction is the n
6eb0: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
6ec0: 20 6f 66 20 64 61 74 61 0a 2a 2a 20 72 65 74 75   of data.** retu
6ed0: 72 6e 65 64 20 62 79 20 70 53 74 6d 74 20 28 61  rned by pStmt (a
6ee0: 6e 64 20 68 65 6e 63 65 20 74 68 65 20 73 69 7a  nd hence the siz
6ef0: 65 20 6f 66 20 74 68 65 20 2a 70 61 70 43 6f 6c  e of the *papCol
6f00: 4e 61 6d 65 20 61 72 72 61 79 29 2e 0a 2a 2a 0a  Name array)..**.
6f10: 2a 2a 20 49 66 20 70 41 72 72 61 79 20 69 73 20  ** If pArray is 
6f20: 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69  not NULL, then i
6f30: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e  t contains the n
6f40: 61 6d 65 20 6f 66 20 61 20 54 63 6c 20 61 72 72  ame of a Tcl arr
6f50: 61 79 0a 2a 2a 20 76 61 72 69 61 62 6c 65 2e 20  ay.** variable. 
6f60: 54 68 65 20 22 2a 22 20 6d 65 6d 62 65 72 20 6f  The "*" member o
6f70: 66 20 74 68 69 73 20 61 72 72 61 79 20 69 73 20  f this array is 
6f80: 73 65 74 20 74 6f 20 61 20 6c 69 73 74 20 63 6f  set to a list co
6f90: 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 74 68 65 20  ntaining.** the 
6fa0: 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c  names of the col
6fb0: 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79  umns returned by
6fc0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20   the statement, 
6fd0: 69 6e 20 6f 72 64 65 72 20 66 72 6f 6d 0a 2a 2a  in order from.**
6fe0: 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e 20   left to right. 
6ff0: 65 2e 67 2e 20 69 66 20 74 68 65 20 6e 61 6d 65  e.g. if the name
7000: 73 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65  s of the returne
7010: 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 61 2c  d columns are a,
7020: 20 62 20 61 6e 64 0a 2a 2a 20 63 2c 20 69 74 20   b and.** c, it 
7030: 64 6f 65 73 20 74 68 65 20 65 71 75 69 76 61 6c  does the equival
7040: 65 6e 74 20 6f 66 20 74 68 65 20 74 63 6c 20 63  ent of the tcl c
7050: 6f 6d 6d 61 6e 64 3a 0a 2a 2a 0a 2a 2a 20 20 20  ommand:.**.**   
7060: 20 20 73 65 74 20 24 7b 70 41 72 72 61 79 7d 28    set ${pArray}(
7070: 2a 29 20 7b 61 20 62 20 63 7d 0a 2a 2f 0a 73 74  *) {a b c}.*/.st
7080: 61 74 69 63 20 69 6e 74 0a 63 6f 6d 70 75 74 65  atic int.compute
7090: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 54  ColumnNames(.  T
70a0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
70b0: 70 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  p, .  sqlite3_st
70c0: 6d 74 20 2a 70 53 74 6d 74 2c 20 20 20 20 20 20  mt *pStmt,      
70d0: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 73          /* SQL s
70e0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 63  tatement */.  Tc
70f0: 6c 5f 4f 62 6a 20 2a 2a 2a 70 61 70 43 6f 6c 4e  l_Obj ***papColN
7100: 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ame,            
7110: 2f 2a 20 4f 55 54 3a 20 41 72 72 61 79 20 6f 66  /* OUT: Array of
7120: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   column names */
7130: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 72  .  Tcl_Obj *pArr
7140: 61 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ay              
7150: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
7160: 61 72 72 61 79 20 76 61 72 69 61 62 6c 65 20 28  array variable (
7170: 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a  may be null) */.
7180: 29 7b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 0a  ){.  int nCol;..
7190: 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c    /* Compute col
71a0: 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 6e  umn names */.  n
71b0: 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Col = sqlite3_co
71c0: 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74  lumn_count(pStmt
71d0: 29 3b 0a 20 20 69 66 28 20 70 61 70 43 6f 6c 4e  );.  if( papColN
71e0: 61 6d 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ame ){.    int i
71f0: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a  ;.    Tcl_Obj **
7200: 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 54 63 6c  apColName = (Tcl
7210: 5f 4f 62 6a 2a 2a 29 54 63 6c 5f 41 6c 6c 6f 63  _Obj**)Tcl_Alloc
7220: 28 20 73 69 7a 65 6f 66 28 54 63 6c 5f 4f 62 6a  ( sizeof(Tcl_Obj
7230: 2a 29 2a 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 66  *)*nCol );.    f
7240: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
7250: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 70 43 6f  i++){.      apCo
7260: 6c 4e 61 6d 65 5b 69 5d 20 3d 20 64 62 54 65 78  lName[i] = dbTex
7270: 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63  tToObj(sqlite3_c
7280: 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74  olumn_name(pStmt
7290: 2c 69 29 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f  ,i));.      Tcl_
72a0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 61 70 43  IncrRefCount(apC
72b0: 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20  olName[i]);.    
72c0: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 72 65 73  }..    /* If res
72d0: 75 6c 74 73 20 61 72 65 20 62 65 69 6e 67 20 73  ults are being s
72e0: 74 6f 72 65 64 20 69 6e 20 61 6e 20 61 72 72 61  tored in an arra
72f0: 79 20 76 61 72 69 61 62 6c 65 2c 20 74 68 65 6e  y variable, then
7300: 20 63 72 65 61 74 65 0a 20 20 20 20 2a 2a 20 74   create.    ** t
7310: 68 65 20 61 72 72 61 79 28 2a 29 20 65 6e 74 72  he array(*) entr
7320: 79 20 66 6f 72 20 74 68 61 74 20 61 72 72 61 79  y for that array
7330: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
7340: 70 41 72 72 61 79 20 29 7b 0a 20 20 20 20 20 20  pArray ){.      
7350: 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f 6c 4c 69 73  Tcl_Obj *pColLis
7360: 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29  t = Tcl_NewObj()
7370: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20  ;.      Tcl_Obj 
7380: 2a 70 53 74 61 72 20 3d 20 54 63 6c 5f 4e 65 77  *pStar = Tcl_New
7390: 53 74 72 69 6e 67 4f 62 6a 28 22 2a 22 2c 20 2d  StringObj("*", -
73a0: 31 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e  1);.      Tcl_In
73b0: 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6f 6c 4c  crRefCount(pColL
73c0: 69 73 74 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  ist);.      for(
73d0: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
73e0: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4c  ){.        Tcl_L
73f0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
7400: 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 43 6f 6c  ent(interp, pCol
7410: 4c 69 73 74 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b  List, apColName[
7420: 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
7430: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
7440: 75 6e 74 28 70 53 74 61 72 29 3b 0a 20 20 20 20  unt(pStar);.    
7450: 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32    Tcl_ObjSetVar2
7460: 28 69 6e 74 65 72 70 2c 20 70 41 72 72 61 79 2c  (interp, pArray,
7470: 20 70 53 74 61 72 2c 20 70 43 6f 6c 4c 69 73 74   pStar, pColList
7480: 2c 30 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 44  ,0);.      Tcl_D
7490: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6f 6c  ecrRefCount(pCol
74a0: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 54 63 6c  List);.      Tcl
74b0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 53  _DecrRefCount(pS
74c0: 74 61 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tar);.    }.    
74d0: 2a 70 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 61 70  *papColName = ap
74e0: 43 6f 6c 4e 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20  ColName;.  }..  
74f0: 72 65 74 75 72 6e 20 6e 43 6f 6c 3b 0a 7d 0a 0a  return nCol;.}..
7500: 2f 2a 0a 2a 2a 20 54 68 65 20 22 73 71 6c 69 74  /*.** The "sqlit
7510: 65 22 20 63 6f 6d 6d 61 6e 64 20 62 65 6c 6f 77  e" command below
7520: 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 20 54   creates a new T
7530: 63 6c 20 63 6f 6d 6d 61 6e 64 20 66 6f 72 20 65  cl command for e
7540: 61 63 68 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  ach.** connectio
7550: 6e 20 69 74 20 6f 70 65 6e 73 20 74 6f 20 61 6e  n it opens to an
7560: 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
7570: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
7580: 69 73 20 69 6e 76 6f 6b 65 64 0a 2a 2a 20 77 68  is invoked.** wh
7590: 65 6e 65 76 65 72 20 6f 6e 65 20 6f 66 20 74 68  enever one of th
75a0: 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2d 73  ose connection-s
75b0: 70 65 63 69 66 69 63 20 63 6f 6d 6d 61 6e 64 73  pecific commands
75c0: 20 69 73 20 65 78 65 63 75 74 65 64 0a 2a 2a 20   is executed.** 
75d0: 69 6e 20 54 63 6c 2e 20 20 46 6f 72 20 65 78 61  in Tcl.  For exa
75e0: 6d 70 6c 65 2c 20 69 66 20 79 6f 75 20 72 75 6e  mple, if you run
75f0: 20 54 63 6c 20 63 6f 64 65 20 6c 69 6b 65 20 74   Tcl code like t
7600: 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
7610: 20 73 71 6c 69 74 65 33 20 64 62 31 20 20 22 6d   sqlite3 db1  "m
7620: 79 5f 64 61 74 61 62 61 73 65 22 0a 2a 2a 20 20  y_database".**  
7630: 20 20 20 20 20 64 62 31 20 63 6c 6f 73 65 0a 2a       db1 close.*
7640: 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 63  *.** The first c
7650: 6f 6d 6d 61 6e 64 20 6f 70 65 6e 73 20 61 20 63  ommand opens a c
7660: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65  onnection to the
7670: 20 22 6d 79 5f 64 61 74 61 62 61 73 65 22 20 64   "my_database" d
7680: 61 74 61 62 61 73 65 0a 2a 2a 20 61 6e 64 20 63  atabase.** and c
7690: 61 6c 6c 73 20 74 68 61 74 20 63 6f 6e 6e 65 63  alls that connec
76a0: 74 69 6f 6e 20 22 64 62 31 22 2e 20 20 54 68 65  tion "db1".  The
76b0: 20 73 65 63 6f 6e 64 20 63 6f 6d 6d 61 6e 64 20   second command 
76c0: 63 61 75 73 65 73 20 74 68 69 73 0a 2a 2a 20 73  causes this.** s
76d0: 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 62 65 20  ubroutine to be 
76e0: 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74  invoked..*/.stat
76f0: 69 63 20 69 6e 74 20 44 62 4f 62 6a 43 6d 64 28  ic int DbObjCmd(
7700: 76 6f 69 64 20 2a 63 64 2c 20 54 63 6c 5f 49 6e  void *cd, Tcl_In
7710: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
7720: 74 20 6f 62 6a 63 2c 54 63 6c 5f 4f 62 6a 20 2a  t objc,Tcl_Obj *
7730: 63 6f 6e 73 74 2a 6f 62 6a 76 29 7b 0a 20 20 53  const*objv){.  S
7740: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
7750: 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20  SqliteDb*)cd;.  
7760: 69 6e 74 20 63 68 6f 69 63 65 3b 0a 20 20 69 6e  int choice;.  in
7770: 74 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20  t rc = TCL_OK;. 
7780: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
7790: 61 72 20 2a 44 42 5f 73 74 72 73 5b 5d 20 3d 20  ar *DB_strs[] = 
77a0: 7b 0a 20 20 20 20 22 61 75 74 68 6f 72 69 7a 65  {.    "authorize
77b0: 72 22 2c 20 20 20 20 20 20 20 20 20 22 62 75 73  r",         "bus
77c0: 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  y",             
77d0: 20 22 63 61 63 68 65 22 2c 0a 20 20 20 20 22 63   "cache",.    "c
77e0: 68 61 6e 67 65 73 22 2c 20 20 20 20 20 20 20 20  hanges",        
77f0: 20 20 20 20 22 63 6c 6f 73 65 22 2c 20 20 20 20      "close",    
7800: 20 20 20 20 20 20 20 20 20 22 63 6f 6c 6c 61 74           "collat
7810: 65 22 2c 0a 20 20 20 20 22 63 6f 6c 6c 61 74 69  e",.    "collati
7820: 6f 6e 5f 6e 65 65 64 65 64 22 2c 20 20 20 22 63  on_needed",   "c
7830: 6f 6d 6d 69 74 5f 68 6f 6f 6b 22 2c 20 20 20 20  ommit_hook",    
7840: 20 20 20 22 63 6f 6d 70 6c 65 74 65 22 2c 0a 20     "complete",. 
7850: 20 20 20 22 63 6f 70 79 22 2c 20 20 20 20 20 20     "copy",      
7860: 20 20 20 20 20 20 20 20 20 22 65 6e 61 62 6c 65           "enable
7870: 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 22  _load_extension"
7880: 2c 22 65 72 72 6f 72 63 6f 64 65 22 2c 0a 20 20  ,"errorcode",.  
7890: 20 20 22 65 76 61 6c 22 2c 20 20 20 20 20 20 20    "eval",       
78a0: 20 20 20 20 20 20 20 20 22 65 78 69 73 74 73 22          "exists"
78b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 22 66 75  ,            "fu
78c0: 6e 63 74 69 6f 6e 22 2c 0a 20 20 20 20 22 69 6e  nction",.    "in
78d0: 63 72 62 6c 6f 62 22 2c 20 20 20 20 20 20 20 20  crblob",        
78e0: 20 20 20 22 69 6e 74 65 72 72 75 70 74 22 2c 20     "interrupt", 
78f0: 20 20 20 20 20 20 20 20 22 6c 61 73 74 5f 69 6e          "last_in
7900: 73 65 72 74 5f 72 6f 77 69 64 22 2c 0a 20 20 20  sert_rowid",.   
7910: 20 22 6e 75 6c 6c 76 61 6c 75 65 22 2c 20 20 20   "nullvalue",   
7920: 20 20 20 20 20 20 20 22 6f 6e 65 63 6f 6c 75 6d         "onecolum
7930: 6e 22 2c 20 20 20 20 20 20 20 20 20 22 70 72 6f  n",         "pro
7940: 66 69 6c 65 22 2c 0a 20 20 20 20 22 70 72 6f 67  file",.    "prog
7950: 72 65 73 73 22 2c 20 20 20 20 20 20 20 20 20 20  ress",          
7960: 20 22 72 65 6b 65 79 22 2c 20 20 20 20 20 20 20   "rekey",       
7970: 20 20 20 20 20 20 22 72 6f 6c 6c 62 61 63 6b 5f        "rollback_
7980: 68 6f 6f 6b 22 2c 0a 20 20 20 20 22 74 69 6d 65  hook",.    "time
7990: 6f 75 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  out",           
79a0: 20 22 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 22   "total_changes"
79b0: 2c 20 20 20 20 20 22 74 72 61 63 65 22 2c 0a 20  ,     "trace",. 
79c0: 20 20 20 22 74 72 61 6e 73 61 63 74 69 6f 6e 22     "transaction"
79d0: 2c 20 20 20 20 20 20 20 20 22 75 70 64 61 74 65  ,        "update
79e0: 5f 68 6f 6f 6b 22 2c 20 20 20 20 20 20 20 22 76  _hook",       "v
79f0: 65 72 73 69 6f 6e 22 2c 0a 20 20 20 20 30 20 20  ersion",.    0  
7a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a10: 20 20 0a 20 20 7d 3b 0a 20 20 65 6e 75 6d 20 44    .  };.  enum D
7a20: 42 5f 65 6e 75 6d 20 7b 0a 20 20 20 20 44 42 5f  B_enum {.    DB_
7a30: 41 55 54 48 4f 52 49 5a 45 52 2c 20 20 20 20 20  AUTHORIZER,     
7a40: 20 20 20 44 42 5f 42 55 53 59 2c 20 20 20 20 20     DB_BUSY,     
7a50: 20 20 20 20 20 20 20 20 44 42 5f 43 41 43 48 45          DB_CACHE
7a60: 2c 0a 20 20 20 20 44 42 5f 43 48 41 4e 47 45 53  ,.    DB_CHANGES
7a70: 2c 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 43  ,           DB_C
7a80: 4c 4f 53 45 2c 20 20 20 20 20 20 20 20 20 20 20  LOSE,           
7a90: 20 44 42 5f 43 4f 4c 4c 41 54 45 2c 0a 20 20 20   DB_COLLATE,.   
7aa0: 20 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e 45   DB_COLLATION_NE
7ab0: 45 44 45 44 2c 20 20 44 42 5f 43 4f 4d 4d 49 54  EDED,  DB_COMMIT
7ac0: 5f 48 4f 4f 4b 2c 20 20 20 20 20 20 44 42 5f 43  _HOOK,      DB_C
7ad0: 4f 4d 50 4c 45 54 45 2c 0a 20 20 20 20 44 42 5f  OMPLETE,.    DB_
7ae0: 43 4f 50 59 2c 20 20 20 20 20 20 20 20 20 20 20  COPY,           
7af0: 20 20 20 44 42 5f 45 4e 41 42 4c 45 5f 4c 4f 41     DB_ENABLE_LOA
7b00: 44 5f 45 58 54 45 4e 53 49 4f 4e 2c 44 42 5f 45  D_EXTENSION,DB_E
7b10: 52 52 4f 52 43 4f 44 45 2c 0a 20 20 20 20 44 42  RRORCODE,.    DB
7b20: 5f 45 56 41 4c 2c 20 20 20 20 20 20 20 20 20 20  _EVAL,          
7b30: 20 20 20 20 44 42 5f 45 58 49 53 54 53 2c 20 20      DB_EXISTS,  
7b40: 20 20 20 20 20 20 20 20 20 44 42 5f 46 55 4e 43           DB_FUNC
7b50: 54 49 4f 4e 2c 0a 20 20 20 20 44 42 5f 49 4e 43  TION,.    DB_INC
7b60: 52 42 4c 4f 42 2c 20 20 20 20 20 20 20 20 20 20  RBLOB,          
7b70: 44 42 5f 49 4e 54 45 52 52 55 50 54 2c 20 20 20  DB_INTERRUPT,   
7b80: 20 20 20 20 20 44 42 5f 4c 41 53 54 5f 49 4e 53       DB_LAST_INS
7b90: 45 52 54 5f 52 4f 57 49 44 2c 0a 20 20 20 20 44  ERT_ROWID,.    D
7ba0: 42 5f 4e 55 4c 4c 56 41 4c 55 45 2c 20 20 20 20  B_NULLVALUE,    
7bb0: 20 20 20 20 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d       DB_ONECOLUM
7bc0: 4e 2c 20 20 20 20 20 20 20 20 44 42 5f 50 52 4f  N,        DB_PRO
7bd0: 46 49 4c 45 2c 0a 20 20 20 20 44 42 5f 50 52 4f  FILE,.    DB_PRO
7be0: 47 52 45 53 53 2c 20 20 20 20 20 20 20 20 20 20  GRESS,          
7bf0: 44 42 5f 52 45 4b 45 59 2c 20 20 20 20 20 20 20  DB_REKEY,       
7c00: 20 20 20 20 20 44 42 5f 52 4f 4c 4c 42 41 43 4b       DB_ROLLBACK
7c10: 5f 48 4f 4f 4b 2c 0a 20 20 20 20 44 42 5f 54 49  _HOOK,.    DB_TI
7c20: 4d 45 4f 55 54 2c 20 20 20 20 20 20 20 20 20 20  MEOUT,          
7c30: 20 44 42 5f 54 4f 54 41 4c 5f 43 48 41 4e 47 45   DB_TOTAL_CHANGE
7c40: 53 2c 20 20 20 20 44 42 5f 54 52 41 43 45 2c 0a  S,    DB_TRACE,.
7c50: 20 20 20 20 44 42 5f 54 52 41 4e 53 41 43 54 49      DB_TRANSACTI
7c60: 4f 4e 2c 20 20 20 20 20 20 20 44 42 5f 55 50 44  ON,       DB_UPD
7c70: 41 54 45 5f 48 4f 4f 4b 2c 20 20 20 20 20 20 44  ATE_HOOK,      D
7c80: 42 5f 56 45 52 53 49 4f 4e 0a 20 20 7d 3b 0a 20  B_VERSION.  };. 
7c90: 20 2f 2a 20 64 6f 6e 27 74 20 6c 65 61 76 65 20   /* don't leave 
7ca0: 74 72 61 69 6c 69 6e 67 20 63 6f 6d 6d 61 73 20  trailing commas 
7cb0: 6f 6e 20 44 42 5f 65 6e 75 6d 2c 20 69 74 20 63  on DB_enum, it c
7cc0: 6f 6e 66 75 73 65 73 20 74 68 65 20 41 49 58 20  onfuses the AIX 
7cd0: 78 6c 63 20 63 6f 6d 70 69 6c 65 72 20 2a 2f 0a  xlc compiler */.
7ce0: 0a 20 20 69 66 28 20 6f 62 6a 63 3c 32 20 29 7b  .  if( objc<2 ){
7cf0: 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
7d00: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
7d10: 20 6f 62 6a 76 2c 20 22 53 55 42 43 4f 4d 4d 41   objv, "SUBCOMMA
7d20: 4e 44 20 2e 2e 2e 22 29 3b 0a 20 20 20 20 72 65  ND ...");.    re
7d30: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
7d40: 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65    }.  if( Tcl_Ge
7d50: 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e  tIndexFromObj(in
7d60: 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 44  terp, objv[1], D
7d70: 42 5f 73 74 72 73 2c 20 22 6f 70 74 69 6f 6e 22  B_strs, "option"
7d80: 2c 20 30 2c 20 26 63 68 6f 69 63 65 29 20 29 7b  , 0, &choice) ){
7d90: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
7da0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 73 77  ERROR;.  }..  sw
7db0: 69 74 63 68 28 20 28 65 6e 75 6d 20 44 42 5f 65  itch( (enum DB_e
7dc0: 6e 75 6d 29 63 68 6f 69 63 65 20 29 7b 0a 0a 20  num)choice ){.. 
7dd0: 20 2f 2a 20 20 20 20 24 64 62 20 61 75 74 68 6f   /*    $db autho
7de0: 72 69 7a 65 72 20 3f 43 41 4c 4c 42 41 43 4b 3f  rizer ?CALLBACK?
7df0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b  .  **.  ** Invok
7e00: 65 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c  e the given call
7e10: 62 61 63 6b 20 74 6f 20 61 75 74 68 6f 72 69 7a  back to authoriz
7e20: 65 20 65 61 63 68 20 53 51 4c 20 6f 70 65 72 61  e each SQL opera
7e30: 74 69 6f 6e 20 61 73 20 69 74 20 69 73 0a 20 20  tion as it is.  
7e40: 2a 2a 20 63 6f 6d 70 69 6c 65 64 2e 20 20 35 20  ** compiled.  5 
7e50: 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 61 70  arguments are ap
7e60: 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 63 61  pended to the ca
7e70: 6c 6c 62 61 63 6b 20 62 65 66 6f 72 65 20 69 74  llback before it
7e80: 20 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6b 65 64   is.  ** invoked
7e90: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 31  :.  **.  **   (1
7ea0: 29 20 54 68 65 20 61 75 74 68 6f 72 69 7a 61 74  ) The authorizat
7eb0: 69 6f 6e 20 74 79 70 65 20 28 65 78 3a 20 53 51  ion type (ex: SQ
7ec0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c  LITE_CREATE_TABL
7ed0: 45 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  E, SQLITE_INSERT
7ee0: 2c 20 2e 2e 2e 29 0a 20 20 2a 2a 20 20 20 28 32  , ...).  **   (2
7ef0: 29 20 46 69 72 73 74 20 64 65 73 63 72 69 70 74  ) First descript
7f00: 69 76 65 20 6e 61 6d 65 20 28 64 65 70 65 6e 64  ive name (depend
7f10: 73 20 6f 6e 20 61 75 74 68 6f 72 69 7a 61 74 69  s on authorizati
7f20: 6f 6e 20 74 79 70 65 29 0a 20 20 2a 2a 20 20 20  on type).  **   
7f30: 28 33 29 20 53 65 63 6f 6e 64 20 64 65 73 63 72  (3) Second descr
7f40: 69 70 74 69 76 65 20 6e 61 6d 65 0a 20 20 2a 2a  iptive name.  **
7f50: 20 20 20 28 34 29 20 4e 61 6d 65 20 6f 66 20 74     (4) Name of t
7f60: 68 65 20 64 61 74 61 62 61 73 65 20 28 65 78 3a  he database (ex:
7f70: 20 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 29   "main", "temp")
7f80: 0a 20 20 2a 2a 20 20 20 28 35 29 20 4e 61 6d 65  .  **   (5) Name
7f90: 20 6f 66 20 74 72 69 67 67 65 72 20 74 68 61 74   of trigger that
7fa0: 20 69 73 20 64 6f 69 6e 67 20 74 68 65 20 61 63   is doing the ac
7fb0: 63 65 73 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  cess.  **.  ** T
7fc0: 68 65 20 63 61 6c 6c 62 61 63 6b 20 73 68 6f 75  he callback shou
7fd0: 6c 64 20 72 65 74 75 72 6e 20 6f 6e 20 6f 66 20  ld return on of 
7fe0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
7ff0: 72 69 6e 67 73 3a 20 53 51 4c 49 54 45 5f 4f 4b  rings: SQLITE_OK
8000: 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 49 47  ,.  ** SQLITE_IG
8010: 4e 4f 52 45 2c 20 6f 72 20 53 51 4c 49 54 45 5f  NORE, or SQLITE_
8020: 44 45 4e 59 2e 20 20 41 6e 79 20 6f 74 68 65 72  DENY.  Any other
8030: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
8040: 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2a 0a   an error..  **.
8050: 20 20 2a 2a 20 49 66 20 74 68 69 73 20 6d 65 74    ** If this met
8060: 68 6f 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 77  hod is invoked w
8070: 69 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73  ith no arguments
8080: 2c 20 74 68 65 20 63 75 72 72 65 6e 74 20 61 75  , the current au
8090: 74 68 6f 72 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a  thorization.  **
80a0: 20 63 61 6c 6c 62 61 63 6b 20 73 74 72 69 6e 67   callback string
80b0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20   is returned..  
80c0: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 41 55 54  */.  case DB_AUT
80d0: 48 4f 52 49 5a 45 52 3a 20 7b 0a 23 69 66 64 65  HORIZER: {.#ifde
80e0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
80f0: 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20  THORIZATION.    
8100: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
8110: 28 69 6e 74 65 72 70 2c 20 22 61 75 74 68 6f 72  (interp, "author
8120: 69 7a 61 74 69 6f 6e 20 6e 6f 74 20 61 76 61 69  ization not avai
8130: 6c 61 62 6c 65 20 69 6e 20 74 68 69 73 20 62 75  lable in this bu
8140: 69 6c 64 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  ild", 0);.    re
8150: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8160: 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 6f 62  #else.    if( ob
8170: 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63  jc>3 ){.      Tc
8180: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
8190: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
81a0: 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20  "?CALLBACK?");. 
81b0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
81c0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65  ERROR;.    }else
81d0: 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a   if( objc==2 ){.
81e0: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
81f0: 41 75 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Auth ){.        
8200: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
8210: 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 41  (interp, pDb->zA
8220: 75 74 68 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  uth, 0);.      }
8230: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8240: 20 20 63 68 61 72 20 2a 7a 41 75 74 68 3b 0a 20    char *zAuth;. 
8250: 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20       int len;.  
8260: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75      if( pDb->zAu
8270: 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  th ){.        Tc
8280: 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 41 75 74  l_Free(pDb->zAut
8290: 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  h);.      }.    
82a0: 20 20 7a 41 75 74 68 20 3d 20 54 63 6c 5f 47 65    zAuth = Tcl_Ge
82b0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
82c0: 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20  bjv[2], &len);. 
82d0: 20 20 20 20 20 69 66 28 20 7a 41 75 74 68 20 26       if( zAuth &
82e0: 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20  & len>0 ){.     
82f0: 20 20 20 70 44 62 2d 3e 7a 41 75 74 68 20 3d 20     pDb->zAuth = 
8300: 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b  Tcl_Alloc( len +
8310: 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65   1 );.        me
8320: 6d 63 70 79 28 70 44 62 2d 3e 7a 41 75 74 68 2c  mcpy(pDb->zAuth,
8330: 20 7a 41 75 74 68 2c 20 6c 65 6e 2b 31 29 3b 0a   zAuth, len+1);.
8340: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8350: 20 20 20 20 20 70 44 62 2d 3e 7a 41 75 74 68 20       pDb->zAuth 
8360: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
8370: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74     if( pDb->zAut
8380: 68 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  h ){.        pDb
8390: 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  ->interp = inter
83a0: 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  p;.        sqlit
83b0: 65 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65  e3_set_authorize
83c0: 72 28 70 44 62 2d 3e 64 62 2c 20 61 75 74 68 5f  r(pDb->db, auth_
83d0: 63 61 6c 6c 62 61 63 6b 2c 20 70 44 62 29 3b 0a  callback, pDb);.
83e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
83f0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74       sqlite3_set
8400: 5f 61 75 74 68 6f 72 69 7a 65 72 28 70 44 62 2d  _authorizer(pDb-
8410: 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  >db, 0, 0);.    
8420: 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
8430: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
8440: 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 62 75 73  .  /*    $db bus
8450: 79 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a  y ?CALLBACK?.  *
8460: 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  *.  ** Invoke th
8470: 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b  e given callback
8480: 20 69 66 20 61 6e 20 53 51 4c 20 73 74 61 74 65   if an SQL state
8490: 6d 65 6e 74 20 61 74 74 65 6d 70 74 73 20 74 6f  ment attempts to
84a0: 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 6c 6f 63   open.  ** a loc
84b0: 6b 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  ked database fil
84c0: 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  e..  */.  case D
84d0: 42 5f 42 55 53 59 3a 20 7b 0a 20 20 20 20 69 66  B_BUSY: {.    if
84e0: 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20  ( objc>3 ){.    
84f0: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
8500: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
8510: 6a 76 2c 20 22 43 41 4c 4c 42 41 43 4b 22 29 3b  jv, "CALLBACK");
8520: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
8530: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c  L_ERROR;.    }el
8540: 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29  se if( objc==2 )
8550: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  {.      if( pDb-
8560: 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 20 20  >zBusy ){.      
8570: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
8580: 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e  lt(interp, pDb->
8590: 7a 42 75 73 79 2c 20 30 29 3b 0a 20 20 20 20 20  zBusy, 0);.     
85a0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
85b0: 20 20 20 20 63 68 61 72 20 2a 7a 42 75 73 79 3b      char *zBusy;
85c0: 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  .      int len;.
85d0: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
85e0: 42 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Busy ){.        
85f0: 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 42  Tcl_Free(pDb->zB
8600: 75 73 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  usy);.      }.  
8610: 20 20 20 20 7a 42 75 73 79 20 3d 20 54 63 6c 5f      zBusy = Tcl_
8620: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
8630: 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b  (objv[2], &len);
8640: 0a 20 20 20 20 20 20 69 66 28 20 7a 42 75 73 79  .      if( zBusy
8650: 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20   && len>0 ){.   
8660: 20 20 20 20 20 70 44 62 2d 3e 7a 42 75 73 79 20       pDb->zBusy 
8670: 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e  = Tcl_Alloc( len
8680: 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20   + 1 );.        
8690: 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 42 75 73  memcpy(pDb->zBus
86a0: 79 2c 20 7a 42 75 73 79 2c 20 6c 65 6e 2b 31 29  y, zBusy, len+1)
86b0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
86c0: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 42 75 73         pDb->zBus
86d0: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  y = 0;.      }. 
86e0: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 42       if( pDb->zB
86f0: 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70  usy ){.        p
8700: 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74  Db->interp = int
8710: 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  erp;.        sql
8720: 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65  ite3_busy_handle
8730: 72 28 70 44 62 2d 3e 64 62 2c 20 44 62 42 75 73  r(pDb->db, DbBus
8740: 79 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a  yHandler, pDb);.
8750: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8760: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73       sqlite3_bus
8770: 79 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64  y_handler(pDb->d
8780: 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  b, 0, 0);.      
8790: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  }.    }.    brea
87a0: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
87b0: 20 24 64 62 20 63 61 63 68 65 20 66 6c 75 73 68   $db cache flush
87c0: 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63 61  .  **     $db ca
87d0: 63 68 65 20 73 69 7a 65 20 6e 0a 20 20 2a 2a 0a  che size n.  **.
87e0: 20 20 2a 2a 20 46 6c 75 73 68 20 74 68 65 20 70    ** Flush the p
87f0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
8800: 74 20 63 61 63 68 65 2c 20 6f 72 20 73 65 74 20  t cache, or set 
8810: 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
8820: 65 72 20 6f 66 0a 20 20 2a 2a 20 63 61 63 68 65  er of.  ** cache
8830: 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20  d statements..  
8840: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 41 43  */.  case DB_CAC
8850: 48 45 3a 20 7b 0a 20 20 20 20 63 68 61 72 20 2a  HE: {.    char *
8860: 73 75 62 43 6d 64 3b 0a 20 20 20 20 69 6e 74 20  subCmd;.    int 
8870: 6e 3b 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  n;..    if( objc
8880: 3c 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  <=2 ){.      Tcl
8890: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
88a0: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
88b0: 63 61 63 68 65 20 6f 70 74 69 6f 6e 20 3f 61 72  cache option ?ar
88c0: 67 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  g?");.      retu
88d0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
88e0: 20 20 7d 0a 20 20 20 20 73 75 62 43 6d 64 20 3d    }.    subCmd =
88f0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
8900: 6f 6d 4f 62 6a 28 20 6f 62 6a 76 5b 32 5d 2c 20  omObj( objv[2], 
8910: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 2a 73 75  0 );.    if( *su
8920: 62 43 6d 64 3d 3d 27 66 27 20 26 26 20 73 74 72  bCmd=='f' && str
8930: 63 6d 70 28 73 75 62 43 6d 64 2c 22 66 6c 75 73  cmp(subCmd,"flus
8940: 68 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  h")==0 ){.      
8950: 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
8960: 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67         Tcl_Wrong
8970: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
8980: 32 2c 20 6f 62 6a 76 2c 20 22 66 6c 75 73 68 22  2, objv, "flush"
8990: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
89a0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
89b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
89c0: 20 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65    flushStmtCache
89d0: 28 20 70 44 62 20 29 3b 0a 20 20 20 20 20 20 7d  ( pDb );.      }
89e0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 2a  .    }else if( *
89f0: 73 75 62 43 6d 64 3d 3d 27 73 27 20 26 26 20 73  subCmd=='s' && s
8a00: 74 72 63 6d 70 28 73 75 62 43 6d 64 2c 22 73 69  trcmp(subCmd,"si
8a10: 7a 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ze")==0 ){.     
8a20: 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a   if( objc!=4 ){.
8a30: 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e          Tcl_Wron
8a40: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
8a50: 20 32 2c 20 6f 62 6a 76 2c 20 22 73 69 7a 65 20   2, objv, "size 
8a60: 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  n");.        ret
8a70: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
8a80: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8a90: 20 20 20 20 69 66 28 20 54 43 4c 5f 45 52 52 4f      if( TCL_ERRO
8aa0: 52 3d 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  R==Tcl_GetIntFro
8ab0: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
8ac0: 76 5b 33 5d 2c 20 26 6e 29 20 29 7b 0a 20 20 20  v[3], &n) ){.   
8ad0: 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
8ae0: 64 52 65 73 75 6c 74 28 20 69 6e 74 65 72 70 2c  dResult( interp,
8af0: 20 22 63 61 6e 6e 6f 74 20 63 6f 6e 76 65 72 74   "cannot convert
8b00: 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 20 20   \"", .         
8b10: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
8b20: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
8b30: 33 5d 2c 30 29 2c 20 22 5c 22 20 74 6f 20 69 6e  3],0), "\" to in
8b40: 74 65 67 65 72 22 2c 20 30 29 3b 0a 20 20 20 20  teger", 0);.    
8b50: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
8b60: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
8b70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
8b80: 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20   if( n<0 ){.    
8b90: 20 20 20 20 20 20 20 20 66 6c 75 73 68 53 74 6d          flushStm
8ba0: 74 43 61 63 68 65 28 20 70 44 62 20 29 3b 0a 20  tCache( pDb );. 
8bb0: 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 30             n = 0
8bc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
8bd0: 65 20 69 66 28 20 6e 3e 4d 41 58 5f 50 52 45 50  e if( n>MAX_PREP
8be0: 41 52 45 44 5f 53 54 4d 54 53 20 29 7b 0a 20 20  ARED_STMTS ){.  
8bf0: 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 4d 41            n = MA
8c00: 58 5f 50 52 45 50 41 52 45 44 5f 53 54 4d 54 53  X_PREPARED_STMTS
8c10: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
8c20: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 6d 61 78          pDb->max
8c30: 53 74 6d 74 20 3d 20 6e 3b 0a 20 20 20 20 20 20  Stmt = n;.      
8c40: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
8c50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c  }else{.      Tcl
8c60: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 20 69  _AppendResult( i
8c70: 6e 74 65 72 70 2c 20 22 62 61 64 20 6f 70 74 69  nterp, "bad opti
8c80: 6f 6e 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  on \"", .       
8c90: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
8ca0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
8cb0: 30 29 2c 20 22 5c 22 3a 20 6d 75 73 74 20 62 65  0), "\": must be
8cc0: 20 66 6c 75 73 68 20 6f 72 20 73 69 7a 65 22 2c   flush or size",
8cd0: 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   0);.      retur
8ce0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
8cf0: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
8d00: 7d 0a 0a 20 20 2f 2a 20 20 20 20 20 24 64 62 20  }..  /*     $db 
8d10: 63 68 61 6e 67 65 73 0a 20 20 2a 2a 0a 20 20 2a  changes.  **.  *
8d20: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
8d30: 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
8d40: 20 77 65 72 65 20 6d 6f 64 69 66 69 65 64 2c 20   were modified, 
8d50: 69 6e 73 65 72 74 65 64 2c 20 6f 72 20 64 65 6c  inserted, or del
8d60: 65 74 65 64 20 62 79 0a 20 20 2a 2a 20 74 68 65  eted by.  ** the
8d70: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 49 4e 53   most recent INS
8d80: 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44  ERT, UPDATE or D
8d90: 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c  ELETE statement,
8da0: 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67 20 0a   not including .
8db0: 20 20 2a 2a 20 61 6e 79 20 63 68 61 6e 67 65 73    ** any changes
8dc0: 20 6d 61 64 65 20 62 79 20 74 72 69 67 67 65 72   made by trigger
8dd0: 20 70 72 6f 67 72 61 6d 73 2e 0a 20 20 2a 2f 0a   programs..  */.
8de0: 20 20 63 61 73 65 20 44 42 5f 43 48 41 4e 47 45    case DB_CHANGE
8df0: 53 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  S: {.    Tcl_Obj
8e00: 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 69   *pResult;.    i
8e10: 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
8e20: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
8e30: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
8e40: 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 20  objv, "");.     
8e50: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
8e60: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 52 65  R;.    }.    pRe
8e70: 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62  sult = Tcl_GetOb
8e80: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  jResult(interp);
8e90: 0a 20 20 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f  .    Tcl_SetIntO
8ea0: 62 6a 28 70 52 65 73 75 6c 74 2c 20 73 71 6c 69  bj(pResult, sqli
8eb0: 74 65 33 5f 63 68 61 6e 67 65 73 28 70 44 62 2d  te3_changes(pDb-
8ec0: 3e 64 62 29 29 3b 0a 20 20 20 20 62 72 65 61 6b  >db));.    break
8ed0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24  ;.  }..  /*    $
8ee0: 64 62 20 63 6c 6f 73 65 0a 20 20 2a 2a 0a 20 20  db close.  **.  
8ef0: 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20  ** Shutdown the 
8f00: 64 61 74 61 62 61 73 65 0a 20 20 2a 2f 0a 20 20  database.  */.  
8f10: 63 61 73 65 20 44 42 5f 43 4c 4f 53 45 3a 20 7b  case DB_CLOSE: {
8f20: 0a 20 20 20 20 54 63 6c 5f 44 65 6c 65 74 65 43  .    Tcl_DeleteC
8f30: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 54  ommand(interp, T
8f40: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
8f50: 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 29  Obj(objv[0], 0))
8f60: 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
8f70: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  /*.  **     
8f80: 24 64 62 20 63 6f 6c 6c 61 74 65 20 4e 41 4d 45  $db collate NAME
8f90: 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a   SCRIPT.  **.  *
8fa0: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53  * Create a new S
8fb0: 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e  QL collation fun
8fc0: 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d  ction called NAM
8fd0: 45 2e 20 20 57 68 65 6e 65 76 65 72 0a 20 20 2a  E.  Whenever.  *
8fe0: 2a 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20  * that function 
8ff0: 69 73 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b  is called, invok
9000: 65 20 53 43 52 49 50 54 20 74 6f 20 65 76 61 6c  e SCRIPT to eval
9010: 75 61 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f  uate the functio
9020: 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  n..  */.  case D
9030: 42 5f 43 4f 4c 4c 41 54 45 3a 20 7b 0a 20 20 20  B_COLLATE: {.   
9040: 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43 6f   SqlCollate *pCo
9050: 6c 6c 61 74 65 3b 0a 20 20 20 20 63 68 61 72 20  llate;.    char 
9060: 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 68 61 72  *zName;.    char
9070: 20 2a 7a 53 63 72 69 70 74 3b 0a 20 20 20 20 69   *zScript;.    i
9080: 6e 74 20 6e 53 63 72 69 70 74 3b 0a 20 20 20 20  nt nScript;.    
9090: 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
90a0: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
90b0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
90c0: 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20 53 43 52   objv, "NAME SCR
90d0: 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74  IPT");.      ret
90e0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
90f0: 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d     }.    zName =
9100: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
9110: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30  omObj(objv[2], 0
9120: 29 3b 0a 20 20 20 20 7a 53 63 72 69 70 74 20 3d  );.    zScript =
9130: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
9140: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26  omObj(objv[3], &
9150: 6e 53 63 72 69 70 74 29 3b 0a 20 20 20 20 70 43  nScript);.    pC
9160: 6f 6c 6c 61 74 65 20 3d 20 28 53 71 6c 43 6f 6c  ollate = (SqlCol
9170: 6c 61 74 65 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28  late*)Tcl_Alloc(
9180: 20 73 69 7a 65 6f 66 28 2a 70 43 6f 6c 6c 61 74   sizeof(*pCollat
9190: 65 29 20 2b 20 6e 53 63 72 69 70 74 20 2b 20 31  e) + nScript + 1
91a0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c   );.    if( pCol
91b0: 6c 61 74 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  late==0 ) return
91c0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
91d0: 70 43 6f 6c 6c 61 74 65 2d 3e 69 6e 74 65 72 70  pCollate->interp
91e0: 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 70   = interp;.    p
91f0: 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78 74 20 3d  Collate->pNext =
9200: 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 3b 0a   pDb->pCollate;.
9210: 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 7a 53      pCollate->zS
9220: 63 72 69 70 74 20 3d 20 28 63 68 61 72 2a 29 26  cript = (char*)&
9230: 70 43 6f 6c 6c 61 74 65 5b 31 5d 3b 0a 20 20 20  pCollate[1];.   
9240: 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20 3d   pDb->pCollate =
9250: 20 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 6d   pCollate;.    m
9260: 65 6d 63 70 79 28 70 43 6f 6c 6c 61 74 65 2d 3e  emcpy(pCollate->
9270: 7a 53 63 72 69 70 74 2c 20 7a 53 63 72 69 70 74  zScript, zScript
9280: 2c 20 6e 53 63 72 69 70 74 2b 31 29 3b 0a 20 20  , nScript+1);.  
9290: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 72    if( sqlite3_cr
92a0: 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 70  eate_collation(p
92b0: 44 62 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 53  Db->db, zName, S
92c0: 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20 20 20  QLITE_UTF8, .   
92d0: 20 20 20 20 20 70 43 6f 6c 6c 61 74 65 2c 20 74       pCollate, t
92e0: 63 6c 53 71 6c 43 6f 6c 6c 61 74 65 29 20 29 7b  clSqlCollate) ){
92f0: 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65  .      Tcl_SetRe
9300: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
9310: 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72  ar *)sqlite3_err
9320: 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 54 43  msg(pDb->db), TC
9330: 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20  L_VOLATILE);.   
9340: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
9350: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  ROR;.    }.    b
9360: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
9370: 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63 6f 6c    **     $db col
9380: 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 20 53 43  lation_needed SC
9390: 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43  RIPT.  **.  ** C
93a0: 72 65 61 74 65 20 61 20 6e 65 77 20 53 51 4c 20  reate a new SQL 
93b0: 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69  collation functi
93c0: 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20  on called NAME. 
93d0: 20 57 68 65 6e 65 76 65 72 0a 20 20 2a 2a 20 74   Whenever.  ** t
93e0: 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  hat function is 
93f0: 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53  called, invoke S
9400: 43 52 49 50 54 20 74 6f 20 65 76 61 6c 75 61 74  CRIPT to evaluat
9410: 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a  e the function..
9420: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43    */.  case DB_C
9430: 4f 4c 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 3a  OLLATION_NEEDED:
9440: 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21   {.    if( objc!
9450: 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =3 ){.      Tcl_
9460: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
9470: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53  erp, 2, objv, "S
9480: 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72  CRIPT");.      r
9490: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
94a0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
94b0: 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64  Db->pCollateNeed
94c0: 65 64 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  ed ){.      Tcl_
94d0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62  DecrRefCount(pDb
94e0: 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64  ->pCollateNeeded
94f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 62  );.    }.    pDb
9500: 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64  ->pCollateNeeded
9510: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
9520: 4f 62 6a 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  Obj(objv[2]);.  
9530: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
9540: 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65  nt(pDb->pCollate
9550: 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 73 71 6c  Needed);.    sql
9560: 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e  ite3_collation_n
9570: 65 65 64 65 64 28 70 44 62 2d 3e 64 62 2c 20 70  eeded(pDb->db, p
9580: 44 62 2c 20 74 63 6c 43 6f 6c 6c 61 74 65 4e 65  Db, tclCollateNe
9590: 65 64 65 64 29 3b 0a 20 20 20 20 62 72 65 61 6b  eded);.    break
95a0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24  ;.  }..  /*    $
95b0: 64 62 20 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 20 3f  db commit_hook ?
95c0: 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20  CALLBACK?.  **. 
95d0: 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67   ** Invoke the g
95e0: 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 6a 75  iven callback ju
95f0: 73 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74  st before commit
9600: 74 69 6e 67 20 65 76 65 72 79 20 53 51 4c 20 74  ting every SQL t
9610: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a  ransaction..  **
9620: 20 49 66 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   If the callback
9630: 20 74 68 72 6f 77 73 20 61 6e 20 65 78 63 65 70   throws an excep
9640: 74 69 6f 6e 20 6f 72 20 72 65 74 75 72 6e 73 20  tion or returns 
9650: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74  non-zero, then t
9660: 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  he.  ** transact
9670: 69 6f 6e 20 69 73 20 61 62 6f 72 74 65 64 2e 20  ion is aborted. 
9680: 20 49 66 20 43 41 4c 4c 42 41 43 4b 20 69 73 20   If CALLBACK is 
9690: 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c  an empty string,
96a0: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 0a 20 20   the callback.  
96b0: 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e 0a  ** is disabled..
96c0: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43    */.  case DB_C
96d0: 4f 4d 4d 49 54 5f 48 4f 4f 4b 3a 20 7b 0a 20 20  OMMIT_HOOK: {.  
96e0: 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a    if( objc>3 ){.
96f0: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
9700: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
9710: 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41  , objv, "?CALLBA
9720: 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74  CK?");.      ret
9730: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9740: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a     }else if( obj
9750: 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66  c==2 ){.      if
9760: 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29  ( pDb->zCommit )
9770: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  {.        Tcl_Ap
9780: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
9790: 70 2c 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 2c  p, pDb->zCommit,
97a0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
97b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
97c0: 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 0a 20 20 20  ar *zCommit;.   
97d0: 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
97e0: 20 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d    if( pDb->zComm
97f0: 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  it ){.        Tc
9800: 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 43 6f 6d  l_Free(pDb->zCom
9810: 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mit);.      }.  
9820: 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 54 63      zCommit = Tc
9830: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
9840: 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e  bj(objv[2], &len
9850: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6f  );.      if( zCo
9860: 6d 6d 69 74 20 26 26 20 6c 65 6e 3e 30 20 29 7b  mmit && len>0 ){
9870: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 43  .        pDb->zC
9880: 6f 6d 6d 69 74 20 3d 20 54 63 6c 5f 41 6c 6c 6f  ommit = Tcl_Allo
9890: 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20  c( len + 1 );.  
98a0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62        memcpy(pDb
98b0: 2d 3e 7a 43 6f 6d 6d 69 74 2c 20 7a 43 6f 6d 6d  ->zCommit, zComm
98c0: 69 74 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20  it, len+1);.    
98d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
98e0: 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20   pDb->zCommit = 
98f0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
9900: 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69   if( pDb->zCommi
9910: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  t ){.        pDb
9920: 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  ->interp = inter
9930: 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  p;.        sqlit
9940: 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 70  e3_commit_hook(p
9950: 44 62 2d 3e 64 62 2c 20 44 62 43 6f 6d 6d 69 74  Db->db, DbCommit
9960: 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20  Handler, pDb);. 
9970: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9980: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d      sqlite3_comm
9990: 69 74 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c  it_hook(pDb->db,
99a0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
99b0: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
99c0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
99d0: 62 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c 0a 20  b complete SQL. 
99e0: 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
99f0: 54 52 55 45 20 69 66 20 53 51 4c 20 69 73 20 61  TRUE if SQL is a
9a00: 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c 20 73 74   complete SQL st
9a10: 61 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e  atement.  Return
9a20: 20 46 41 4c 53 45 20 69 66 0a 20 20 2a 2a 20 61   FALSE if.  ** a
9a30: 64 64 69 74 69 6f 6e 61 6c 20 6c 69 6e 65 73 20  dditional lines 
9a40: 6f 66 20 69 6e 70 75 74 20 61 72 65 20 6e 65 65  of input are nee
9a50: 64 65 64 2e 20 20 54 68 69 73 20 69 73 20 73 69  ded.  This is si
9a60: 6d 69 6c 61 72 20 74 6f 20 74 68 65 0a 20 20 2a  milar to the.  *
9a70: 2a 20 62 75 69 6c 74 2d 69 6e 20 22 69 6e 66 6f  * built-in "info
9a80: 20 63 6f 6d 70 6c 65 74 65 22 20 63 6f 6d 6d 61   complete" comma
9a90: 6e 64 20 6f 66 20 54 63 6c 2e 0a 20 20 2a 2f 0a  nd of Tcl..  */.
9aa0: 20 20 63 61 73 65 20 44 42 5f 43 4f 4d 50 4c 45    case DB_COMPLE
9ab0: 54 45 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53 51  TE: {.#ifndef SQ
9ac0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45  LITE_OMIT_COMPLE
9ad0: 54 45 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  TE.    Tcl_Obj *
9ae0: 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74  pResult;.    int
9af0: 20 69 73 43 6f 6d 70 6c 65 74 65 3b 0a 20 20 20   isComplete;.   
9b00: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
9b10: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
9b20: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
9b30: 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 22 29 3b 0a  , objv, "SQL");.
9b40: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
9b50: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
9b60: 20 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 73    isComplete = s
9b70: 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 28  qlite3_complete(
9b80: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
9b90: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30  omObj(objv[2], 0
9ba0: 29 20 29 3b 0a 20 20 20 20 70 52 65 73 75 6c 74  ) );.    pResult
9bb0: 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73   = Tcl_GetObjRes
9bc0: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  ult(interp);.   
9bd0: 20 54 63 6c 5f 53 65 74 42 6f 6f 6c 65 61 6e 4f   Tcl_SetBooleanO
9be0: 62 6a 28 70 52 65 73 75 6c 74 2c 20 69 73 43 6f  bj(pResult, isCo
9bf0: 6d 70 6c 65 74 65 29 3b 0a 23 65 6e 64 69 66 0a  mplete);.#endif.
9c00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
9c10: 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6f 70 79    /*    $db copy
9c20: 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69   conflict-algori
9c30: 74 68 6d 20 74 61 62 6c 65 20 66 69 6c 65 6e 61  thm table filena
9c40: 6d 65 20 3f 53 45 50 41 52 41 54 4f 52 3f 20 3f  me ?SEPARATOR? ?
9c50: 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f 0a 20  NULLINDICATOR?. 
9c60: 20 2a 2a 0a 20 20 2a 2a 20 43 6f 70 79 20 64 61   **.  ** Copy da
9c70: 74 61 20 69 6e 74 6f 20 74 61 62 6c 65 20 66 72  ta into table fr
9c80: 6f 6d 20 66 69 6c 65 6e 61 6d 65 2c 20 6f 70 74  om filename, opt
9c90: 69 6f 6e 61 6c 6c 79 20 75 73 69 6e 67 20 53 45  ionally using SE
9ca0: 50 41 52 41 54 4f 52 0a 20 20 2a 2a 20 61 73 20  PARATOR.  ** as 
9cb0: 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72  column separator
9cc0: 73 2e 20 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20  s.  If a column 
9cd0: 63 6f 6e 74 61 69 6e 73 20 61 20 6e 75 6c 6c 20  contains a null 
9ce0: 73 74 72 69 6e 67 2c 20 6f 72 20 74 68 65 0a 20  string, or the. 
9cf0: 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 4e 55 4c   ** value of NUL
9d00: 4c 49 4e 44 49 43 41 54 4f 52 2c 20 61 20 4e 55  LINDICATOR, a NU
9d10: 4c 4c 20 69 73 20 69 6e 73 65 72 74 65 64 20 66  LL is inserted f
9d20: 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 20  or the column.. 
9d30: 20 2a 2a 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67   ** conflict-alg
9d40: 6f 72 69 74 68 6d 20 69 73 20 6f 6e 65 20 6f 66  orithm is one of
9d50: 20 74 68 65 20 73 71 6c 69 74 65 20 63 6f 6e 66   the sqlite conf
9d60: 6c 69 63 74 20 61 6c 67 6f 72 69 74 68 6d 73 3a  lict algorithms:
9d70: 0a 20 20 2a 2a 20 20 20 20 72 6f 6c 6c 62 61 63  .  **    rollbac
9d80: 6b 2c 20 61 62 6f 72 74 2c 20 66 61 69 6c 2c 20  k, abort, fail, 
9d90: 69 67 6e 6f 72 65 2c 20 72 65 70 6c 61 63 65 0a  ignore, replace.
9da0: 20 20 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c    ** On success,
9db0: 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   return the numb
9dc0: 65 72 20 6f 66 20 6c 69 6e 65 73 20 70 72 6f 63  er of lines proc
9dd0: 65 73 73 65 64 2c 20 6e 6f 74 20 6e 65 63 65 73  essed, not neces
9de0: 73 61 72 69 6c 79 20 73 61 6d 65 0a 20 20 2a 2a  sarily same.  **
9df0: 20 61 73 20 27 64 62 20 63 68 61 6e 67 65 73 27   as 'db changes'
9e00: 20 64 75 65 20 74 6f 20 63 6f 6e 66 6c 69 63 74   due to conflict
9e10: 2d 61 6c 67 6f 72 69 74 68 6d 20 73 65 6c 65 63  -algorithm selec
9e20: 74 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ted..  **.  ** T
9e30: 68 69 73 20 63 6f 64 65 20 69 73 20 62 61 73 69  his code is basi
9e40: 63 61 6c 6c 79 20 61 6e 20 69 6d 70 6c 65 6d 65  cally an impleme
9e50: 6e 74 61 74 69 6f 6e 2f 65 6e 68 61 6e 63 65 6d  ntation/enhancem
9e60: 65 6e 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  ent of.  ** the 
9e70: 73 71 6c 69 74 65 33 20 73 68 65 6c 6c 2e 63 20  sqlite3 shell.c 
9e80: 22 2e 69 6d 70 6f 72 74 22 20 63 6f 6d 6d 61 6e  ".import" comman
9e90: 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  d..  **.  ** Thi
9ea0: 73 20 63 6f 6d 6d 61 6e 64 20 75 73 61 67 65 20  s command usage 
9eb0: 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
9ec0: 20 74 68 65 20 73 71 6c 69 74 65 32 2e 78 20 43   the sqlite2.x C
9ed0: 4f 50 59 20 73 74 61 74 65 6d 65 6e 74 2c 0a 20  OPY statement,. 
9ee0: 20 2a 2a 20 77 68 69 63 68 20 69 6d 70 6f 72 74   ** which import
9ef0: 73 20 66 69 6c 65 20 64 61 74 61 20 69 6e 74 6f  s file data into
9f00: 20 61 20 74 61 62 6c 65 20 75 73 69 6e 67 20 74   a table using t
9f10: 68 65 20 50 6f 73 74 67 72 65 53 51 4c 20 43 4f  he PostgreSQL CO
9f20: 50 59 20 66 69 6c 65 20 66 6f 72 6d 61 74 3a 0a  PY file format:.
9f30: 20 20 2a 2a 20 20 20 24 64 62 20 63 6f 70 79 20    **   $db copy 
9f40: 24 63 6f 6e 66 6c 69 74 5f 61 6c 67 6f 20 24 74  $conflit_algo $t
9f50: 61 62 6c 65 5f 6e 61 6d 65 20 24 66 69 6c 65 6e  able_name $filen
9f60: 61 6d 65 20 5c 74 20 5c 5c 4e 0a 20 20 2a 2f 0a  ame \t \\N.  */.
9f70: 20 20 63 61 73 65 20 44 42 5f 43 4f 50 59 3a 20    case DB_COPY: 
9f80: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62  {.    char *zTab
9f90: 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
9fa0: 20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61 74 61    /* Insert data
9fb0: 20 69 6e 74 6f 20 74 68 69 73 20 74 61 62 6c 65   into this table
9fc0: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 46   */.    char *zF
9fd0: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
9fe0: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
9ff0: 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 65 78  from which to ex
a000: 74 72 61 63 74 20 64 61 74 61 20 2a 2f 0a 20 20  tract data */.  
a010: 20 20 63 68 61 72 20 2a 7a 43 6f 6e 66 6c 69 63    char *zConflic
a020: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
a030: 20 54 68 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c   The conflict al
a040: 67 6f 72 69 74 68 6d 20 74 6f 20 75 73 65 20 2a  gorithm to use *
a050: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  /.    sqlite3_st
a060: 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20  mt *pStmt;      
a070: 20 20 2f 2a 20 41 20 73 74 61 74 65 6d 65 6e 74    /* A statement
a080: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c   */.    int nCol
a090: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a0a0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
a0b0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
a0c0: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74  table */.    int
a0d0: 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20   nByte;         
a0e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
a0f0: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61  er of bytes in a
a100: 6e 20 53 51 4c 20 73 74 72 69 6e 67 20 2a 2f 0a  n SQL string */.
a110: 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20      int i, j;   
a120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a130: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
a140: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 70   */.    int nSep
a150: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a160: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
a170: 20 62 79 74 65 73 20 69 6e 20 7a 53 65 70 5b 5d   bytes in zSep[]
a180: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4e 75 6c   */.    int nNul
a190: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
a1a0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
a1b0: 20 62 79 74 65 73 20 69 6e 20 7a 4e 75 6c 6c 5b   bytes in zNull[
a1c0: 5d 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  ] */.    char *z
a1d0: 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sql;            
a1e0: 20 20 20 20 20 2f 2a 20 41 6e 20 53 51 4c 20 73       /* An SQL s
a1f0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
a200: 63 68 61 72 20 2a 7a 4c 69 6e 65 3b 20 20 20 20  char *zLine;    
a210: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
a220: 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f 66 20   single line of 
a230: 69 6e 70 75 74 20 66 72 6f 6d 20 74 68 65 20 66  input from the f
a240: 69 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  ile */.    char 
a250: 2a 2a 61 7a 43 6f 6c 3b 20 20 20 20 20 20 20 20  **azCol;        
a260: 20 20 20 20 20 20 20 2f 2a 20 7a 4c 69 6e 65 5b         /* zLine[
a270: 5d 20 62 72 6f 6b 65 6e 20 75 70 20 69 6e 74 6f  ] broken up into
a280: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20   columns */.    
a290: 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 20 20  char *zCommit;  
a2a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
a2b0: 6f 77 20 74 6f 20 63 6f 6d 6d 69 74 20 63 68 61  ow to commit cha
a2c0: 6e 67 65 73 20 2a 2f 0a 20 20 20 20 46 49 4c 45  nges */.    FILE
a2d0: 20 2a 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20   *in;           
a2e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
a2f0: 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 20  nput file */.   
a300: 20 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20 30 3b   int lineno = 0;
a310: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a320: 4c 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 69  Line number of i
a330: 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 20  nput file */.   
a340: 20 63 68 61 72 20 7a 4c 69 6e 65 4e 75 6d 5b 38   char zLineNum[8
a350: 30 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0];          /* 
a360: 4c 69 6e 65 20 6e 75 6d 62 65 72 20 70 72 69 6e  Line number prin
a370: 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20  t buffer */.    
a380: 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74  Tcl_Obj *pResult
a390: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69  ;           /* i
a3a0: 6e 74 65 72 70 20 72 65 73 75 6c 74 20 2a 2f 0a  nterp result */.
a3b0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 65 70 3b  .    char *zSep;
a3c0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c  .    char *zNull
a3d0: 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3c 35  ;.    if( objc<5
a3e0: 20 7c 7c 20 6f 62 6a 63 3e 37 20 29 7b 0a 20 20   || objc>7 ){.  
a3f0: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
a400: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
a410: 6f 62 6a 76 2c 20 0a 20 20 20 20 20 20 20 20 20  objv, .         
a420: 22 43 4f 4e 46 4c 49 43 54 2d 41 4c 47 4f 52 49  "CONFLICT-ALGORI
a430: 54 48 4d 20 54 41 42 4c 45 20 46 49 4c 45 4e 41  THM TABLE FILENA
a440: 4d 45 20 3f 53 45 50 41 52 41 54 4f 52 3f 20 3f  ME ?SEPARATOR? ?
a450: 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f 22 29  NULLINDICATOR?")
a460: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
a470: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
a480: 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 3d 36 20      if( objc>=6 
a490: 29 7b 0a 20 20 20 20 20 20 7a 53 65 70 20 3d 20  ){.      zSep = 
a4a0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
a4b0: 6d 4f 62 6a 28 6f 62 6a 76 5b 35 5d 2c 20 30 29  mObj(objv[5], 0)
a4c0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
a4d0: 20 20 20 7a 53 65 70 20 3d 20 22 5c 74 22 3b 0a     zSep = "\t";.
a4e0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62      }.    if( ob
a4f0: 6a 63 3e 3d 37 20 29 7b 0a 20 20 20 20 20 20 7a  jc>=7 ){.      z
a500: 4e 75 6c 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74  Null = Tcl_GetSt
a510: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
a520: 5b 36 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  [6], 0);.    }el
a530: 73 65 7b 0a 20 20 20 20 20 20 7a 4e 75 6c 6c 20  se{.      zNull 
a540: 3d 20 22 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = "";.    }.    
a550: 7a 43 6f 6e 66 6c 69 63 74 20 3d 20 54 63 6c 5f  zConflict = Tcl_
a560: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
a570: 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20  (objv[2], 0);.  
a580: 20 20 7a 54 61 62 6c 65 20 3d 20 54 63 6c 5f 47    zTable = Tcl_G
a590: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
a5a0: 6f 62 6a 76 5b 33 5d 2c 20 30 29 3b 0a 20 20 20  objv[3], 0);.   
a5b0: 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74   zFile = Tcl_Get
a5c0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
a5d0: 6a 76 5b 34 5d 2c 20 30 29 3b 0a 20 20 20 20 6e  jv[4], 0);.    n
a5e0: 53 65 70 20 3d 20 73 74 72 6c 65 6e 28 7a 53 65  Sep = strlen(zSe
a5f0: 70 29 3b 0a 20 20 20 20 6e 4e 75 6c 6c 20 3d 20  p);.    nNull = 
a600: 73 74 72 6c 65 6e 28 7a 4e 75 6c 6c 29 3b 0a 20  strlen(zNull);. 
a610: 20 20 20 69 66 28 20 6e 53 65 70 3d 3d 30 20 29     if( nSep==0 )
a620: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
a630: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
a640: 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c  "Error: non-null
a650: 20 73 65 70 61 72 61 74 6f 72 20 72 65 71 75 69   separator requi
a660: 72 65 64 20 66 6f 72 20 63 6f 70 79 22 2c 30 29  red for copy",0)
a670: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
a680: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
a690: 20 20 20 20 69 66 28 73 74 72 63 6d 70 28 7a 43      if(strcmp(zC
a6a0: 6f 6e 66 6c 69 63 74 2c 20 22 72 6f 6c 6c 62 61  onflict, "rollba
a6b0: 63 6b 22 29 20 21 3d 20 30 20 26 26 0a 20 20 20  ck") != 0 &&.   
a6c0: 20 20 20 20 73 74 72 63 6d 70 28 7a 43 6f 6e 66      strcmp(zConf
a6d0: 6c 69 63 74 2c 20 22 61 62 6f 72 74 22 20 20 20  lict, "abort"   
a6e0: 29 20 21 3d 20 30 20 26 26 0a 20 20 20 20 20 20  ) != 0 &&.      
a6f0: 20 73 74 72 63 6d 70 28 7a 43 6f 6e 66 6c 69 63   strcmp(zConflic
a700: 74 2c 20 22 66 61 69 6c 22 20 20 20 20 29 20 21  t, "fail"    ) !
a710: 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20 73 74  = 0 &&.       st
a720: 72 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20  rcmp(zConflict, 
a730: 22 69 67 6e 6f 72 65 22 20 20 29 20 21 3d 20 30  "ignore"  ) != 0
a740: 20 26 26 0a 20 20 20 20 20 20 20 73 74 72 63 6d   &&.       strcm
a750: 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 72 65  p(zConflict, "re
a760: 70 6c 61 63 65 22 20 29 20 21 3d 20 30 20 29 20  place" ) != 0 ) 
a770: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
a780: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
a790: 20 22 45 72 72 6f 72 3a 20 5c 22 22 2c 20 7a 43   "Error: \"", zC
a7a0: 6f 6e 66 6c 69 63 74 2c 20 0a 20 20 20 20 20 20  onflict, .      
a7b0: 20 20 20 20 20 20 22 5c 22 2c 20 63 6f 6e 66 6c        "\", confl
a7c0: 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20 6d 75  ict-algorithm mu
a7d0: 73 74 20 62 65 20 6f 6e 65 20 6f 66 3a 20 72 6f  st be one of: ro
a7e0: 6c 6c 62 61 63 6b 2c 20 22 0a 20 20 20 20 20 20  llback, ".      
a7f0: 20 20 20 20 20 20 22 61 62 6f 72 74 2c 20 66 61        "abort, fa
a800: 69 6c 2c 20 69 67 6e 6f 72 65 2c 20 6f 72 20 72  il, ignore, or r
a810: 65 70 6c 61 63 65 22 2c 20 30 29 3b 0a 20 20 20  eplace", 0);.   
a820: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
a830: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  ROR;.    }.    z
a840: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
a850: 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 2a 20  rintf("SELECT * 
a860: 46 52 4f 4d 20 27 25 71 27 22 2c 20 7a 54 61 62  FROM '%q'", zTab
a870: 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71  le);.    if( zSq
a880: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63  l==0 ){.      Tc
a890: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
a8a0: 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 6e  nterp, "Error: n
a8b0: 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 22 2c  o such table: ",
a8c0: 20 7a 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20   zTable, 0);.   
a8d0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
a8e0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  ROR;.    }.    n
a8f0: 42 79 74 65 20 3d 20 73 74 72 6c 65 6e 28 7a 53  Byte = strlen(zS
a900: 71 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ql);.    rc = sq
a910: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 70 44  lite3_prepare(pD
a920: 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  b->db, zSql, -1,
a930: 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
a940: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
a950: 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ql);.    if( rc 
a960: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
a970: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
a980: 2c 20 22 45 72 72 6f 72 3a 20 22 2c 20 73 71 6c  , "Error: ", sql
a990: 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d  ite3_errmsg(pDb-
a9a0: 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  >db), 0);.      
a9b0: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65  nCol = 0;.    }e
a9c0: 6c 73 65 7b 0a 20 20 20 20 20 20 6e 43 6f 6c 20  lse{.      nCol 
a9d0: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
a9e0: 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20  _count(pStmt);. 
a9f0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
aa00: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
aa10: 3b 0a 20 20 20 20 69 66 28 20 6e 43 6f 6c 3d 3d  ;.    if( nCol==
aa20: 30 20 29 20 7b 0a 20 20 20 20 20 20 72 65 74 75  0 ) {.      retu
aa30: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
aa40: 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20 6d    }.    zSql = m
aa50: 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 2b 20 35  alloc( nByte + 5
aa60: 30 20 2b 20 6e 43 6f 6c 2a 32 20 29 3b 0a 20 20  0 + nCol*2 );.  
aa70: 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20    if( zSql==0 ) 
aa80: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
aa90: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
aaa0: 20 22 45 72 72 6f 72 3a 20 63 61 6e 27 74 20 6d   "Error: can't m
aab0: 61 6c 6c 6f 63 28 29 22 2c 20 30 29 3b 0a 20 20  alloc()", 0);.  
aac0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
aad0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
aae0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
aaf0: 28 6e 42 79 74 65 2b 35 30 2c 20 7a 53 71 6c 2c  (nByte+50, zSql,
ab00: 20 22 49 4e 53 45 52 54 20 4f 52 20 25 71 20 49   "INSERT OR %q I
ab10: 4e 54 4f 20 27 25 71 27 20 56 41 4c 55 45 53 28  NTO '%q' VALUES(
ab20: 3f 22 2c 0a 20 20 20 20 20 20 20 20 20 7a 43 6f  ?",.         zCo
ab30: 6e 66 6c 69 63 74 2c 20 7a 54 61 62 6c 65 29 3b  nflict, zTable);
ab40: 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c 65 6e 28  .    j = strlen(
ab50: 7a 53 71 6c 29 3b 0a 20 20 20 20 66 6f 72 28 69  zSql);.    for(i
ab60: 3d 31 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =1; i<nCol; i++)
ab70: 7b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b  {.      zSql[j++
ab80: 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 7a  ] = ',';.      z
ab90: 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 3f 27 3b 0a  Sql[j++] = '?';.
aba0: 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 5b 6a      }.    zSql[j
abb0: 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20 7a  ++] = ')';.    z
abc0: 53 71 6c 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20  Sql[j] = 0;.    
abd0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
abe0: 70 61 72 65 28 70 44 62 2d 3e 64 62 2c 20 7a 53  pare(pDb->db, zS
abf0: 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
ac00: 30 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 53 71  0);.    free(zSq
ac10: 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  l);.    if( rc )
ac20: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
ac30: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
ac40: 20 22 45 72 72 6f 72 3a 20 22 2c 20 73 71 6c 69   "Error: ", sqli
ac50: 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
ac60: 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  db), 0);.      s
ac70: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
ac80: 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 65  pStmt);.      re
ac90: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
aca0: 20 20 20 20 7d 0a 20 20 20 20 69 6e 20 3d 20 66      }.    in = f
acb0: 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 22 72 62 22  open(zFile, "rb"
acc0: 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 3d 3d 30  );.    if( in==0
acd0: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
ace0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
acf0: 70 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f  p, "Error: canno
ad00: 74 20 6f 70 65 6e 20 66 69 6c 65 3a 20 22 2c 20  t open file: ", 
ad10: 7a 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 20 20  zFile, NULL);.  
ad20: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
ad30: 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
ad40: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
ad50: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ROR;.    }.    a
ad60: 7a 43 6f 6c 20 3d 20 6d 61 6c 6c 6f 63 28 20 73  zCol = malloc( s
ad70: 69 7a 65 6f 66 28 61 7a 43 6f 6c 5b 30 5d 29 2a  izeof(azCol[0])*
ad80: 28 6e 43 6f 6c 2b 31 29 20 29 3b 0a 20 20 20 20  (nCol+1) );.    
ad90: 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 20 7b  if( azCol==0 ) {
ada0: 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
adb0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
adc0: 22 45 72 72 6f 72 3a 20 63 61 6e 27 74 20 6d 61  "Error: can't ma
add0: 6c 6c 6f 63 28 29 22 2c 20 30 29 3b 0a 20 20 20  lloc()", 0);.   
ade0: 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20     fclose(in);. 
adf0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
ae00: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
ae10: 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f 65   (void)sqlite3_e
ae20: 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 22 42 45  xec(pDb->db, "BE
ae30: 47 49 4e 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  GIN", 0, 0, 0);.
ae40: 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 43      zCommit = "C
ae50: 4f 4d 4d 49 54 22 3b 0a 20 20 20 20 77 68 69 6c  OMMIT";.    whil
ae60: 65 28 20 28 7a 4c 69 6e 65 20 3d 20 6c 6f 63 61  e( (zLine = loca
ae70: 6c 5f 67 65 74 6c 69 6e 65 28 30 2c 20 69 6e 29  l_getline(0, in)
ae80: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68  )!=0 ){.      ch
ae90: 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 69 20 3d  ar *z;.      i =
aea0: 20 30 3b 0a 20 20 20 20 20 20 6c 69 6e 65 6e 6f   0;.      lineno
aeb0: 2b 2b 3b 0a 20 20 20 20 20 20 61 7a 43 6f 6c 5b  ++;.      azCol[
aec0: 30 5d 20 3d 20 7a 4c 69 6e 65 3b 0a 20 20 20 20  0] = zLine;.    
aed0: 20 20 66 6f 72 28 69 3d 30 2c 20 7a 3d 7a 4c 69    for(i=0, z=zLi
aee0: 6e 65 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20 20  ne; *z; z++){.  
aef0: 20 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d 7a 53        if( *z==zS
af00: 65 70 5b 30 5d 20 26 26 20 73 74 72 6e 63 6d 70  ep[0] && strncmp
af10: 28 7a 2c 20 7a 53 65 70 2c 20 6e 53 65 70 29 3d  (z, zSep, nSep)=
af20: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
af30: 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  *z = 0;.        
af40: 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20    i++;.         
af50: 20 69 66 28 20 69 3c 6e 43 6f 6c 20 29 7b 0a 20   if( i<nCol ){. 
af60: 20 20 20 20 20 20 20 20 20 20 20 61 7a 43 6f 6c             azCol
af70: 5b 69 5d 20 3d 20 26 7a 5b 6e 53 65 70 5d 3b 0a  [i] = &z[nSep];.
af80: 20 20 20 20 20 20 20 20 20 20 20 20 7a 20 2b 3d              z +=
af90: 20 6e 53 65 70 2d 31 3b 0a 20 20 20 20 20 20 20   nSep-1;.       
afa0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
afb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
afc0: 20 69 2b 31 21 3d 6e 43 6f 6c 20 29 7b 0a 20 20   i+1!=nCol ){.  
afd0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72        char *zErr
afe0: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 45  ;.        int nE
aff0: 72 72 20 3d 20 73 74 72 6c 65 6e 28 7a 46 69 6c  rr = strlen(zFil
b000: 65 29 20 2b 20 32 30 30 3b 0a 20 20 20 20 20 20  e) + 200;.      
b010: 20 20 7a 45 72 72 20 3d 20 6d 61 6c 6c 6f 63 28    zErr = malloc(
b020: 6e 45 72 72 29 3b 0a 20 20 20 20 20 20 20 20 69  nErr);.        i
b030: 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 20  f( zErr ){.     
b040: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
b050: 72 69 6e 74 66 28 6e 45 72 72 2c 20 7a 45 72 72  rintf(nErr, zErr
b060: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,.             "
b070: 45 72 72 6f 72 3a 20 25 73 20 6c 69 6e 65 20 25  Error: %s line %
b080: 64 3a 20 65 78 70 65 63 74 65 64 20 25 64 20 63  d: expected %d c
b090: 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 62  olumns of data b
b0a0: 75 74 20 66 6f 75 6e 64 20 25 64 22 2c 0a 20 20  ut found %d",.  
b0b0: 20 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65             zFile
b0c0: 2c 20 6c 69 6e 65 6e 6f 2c 20 6e 43 6f 6c 2c 20  , lineno, nCol, 
b0d0: 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  i+1);.          
b0e0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
b0f0: 28 69 6e 74 65 72 70 2c 20 7a 45 72 72 2c 20 30  (interp, zErr, 0
b100: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 72 65  );.          fre
b110: 65 28 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 20  e(zErr);.       
b120: 20 7d 0a 20 20 20 20 20 20 20 20 7a 43 6f 6d 6d   }.        zComm
b130: 69 74 20 3d 20 22 52 4f 4c 4c 42 41 43 4b 22 3b  it = "ROLLBACK";
b140: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
b150: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
b160: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
b170: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ++){.        /* 
b180: 63 68 65 63 6b 20 66 6f 72 20 6e 75 6c 6c 20 64  check for null d
b190: 61 74 61 2c 20 69 66 20 73 6f 2c 20 62 69 6e 64  ata, if so, bind
b1a0: 20 61 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20   as null */.    
b1b0: 20 20 20 20 69 66 20 28 28 6e 4e 75 6c 6c 3e 30      if ((nNull>0
b1c0: 20 26 26 20 73 74 72 63 6d 70 28 61 7a 43 6f 6c   && strcmp(azCol
b1d0: 5b 69 5d 2c 20 7a 4e 75 6c 6c 29 3d 3d 30 29 20  [i], zNull)==0) 
b1e0: 7c 7c 20 73 74 72 6c 65 6e 28 61 7a 43 6f 6c 5b  || strlen(azCol[
b1f0: 69 5d 29 3d 3d 30 29 20 7b 0a 20 20 20 20 20 20  i])==0) {.      
b200: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
b210: 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69 2b 31  _null(pStmt, i+1
b220: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
b230: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
b240: 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53  te3_bind_text(pS
b250: 74 6d 74 2c 20 69 2b 31 2c 20 61 7a 43 6f 6c 5b  tmt, i+1, azCol[
b260: 69 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53  i], -1, SQLITE_S
b270: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20  TATIC);.        
b280: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
b290: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
b2a0: 6d 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  mt);.      rc = 
b2b0: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
b2c0: 74 6d 74 29 3b 0a 20 20 20 20 20 20 66 72 65 65  tmt);.      free
b2d0: 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 69  (zLine);.      i
b2e0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
b2f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
b300: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
b310: 65 72 70 2c 22 45 72 72 6f 72 3a 20 22 2c 20 73  erp,"Error: ", s
b320: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44  qlite3_errmsg(pD
b330: 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20 20  b->db), 0);.    
b340: 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 52      zCommit = "R
b350: 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20 20  OLLBACK";.      
b360: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
b370: 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28  .    }.    free(
b380: 61 7a 43 6f 6c 29 3b 0a 20 20 20 20 66 63 6c 6f  azCol);.    fclo
b390: 73 65 28 69 6e 29 3b 0a 20 20 20 20 73 71 6c 69  se(in);.    sqli
b3a0: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
b3b0: 6d 74 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 73  mt);.    (void)s
b3c0: 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d  qlite3_exec(pDb-
b3d0: 3e 64 62 2c 20 7a 43 6f 6d 6d 69 74 2c 20 30 2c  >db, zCommit, 0,
b3e0: 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 69 66 28   0, 0);..    if(
b3f0: 20 7a 43 6f 6d 6d 69 74 5b 30 5d 20 3d 3d 20 27   zCommit[0] == '
b400: 43 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 73  C' ){.      /* s
b410: 75 63 63 65 73 73 2c 20 73 65 74 20 72 65 73 75  uccess, set resu
b420: 6c 74 20 61 73 20 6e 75 6d 62 65 72 20 6f 66 20  lt as number of 
b430: 6c 69 6e 65 73 20 70 72 6f 63 65 73 73 65 64 20  lines processed 
b440: 2a 2f 0a 20 20 20 20 20 20 70 52 65 73 75 6c 74  */.      pResult
b450: 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73   = Tcl_GetObjRes
b460: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  ult(interp);.   
b470: 20 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a     Tcl_SetIntObj
b480: 28 70 52 65 73 75 6c 74 2c 20 6c 69 6e 65 6e 6f  (pResult, lineno
b490: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43  );.      rc = TC
b4a0: 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  L_OK;.    }else{
b4b0: 0a 20 20 20 20 20 20 2f 2a 20 66 61 69 6c 75 72  .      /* failur
b4c0: 65 2c 20 61 70 70 65 6e 64 20 6c 69 6e 65 6e 6f  e, append lineno
b4d0: 20 77 68 65 72 65 20 66 61 69 6c 65 64 20 2a 2f   where failed */
b4e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
b4f0: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
b500: 4c 69 6e 65 4e 75 6d 29 2c 20 7a 4c 69 6e 65 4e  LineNum), zLineN
b510: 75 6d 2c 22 25 64 22 2c 6c 69 6e 65 6e 6f 29 3b  um,"%d",lineno);
b520: 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
b530: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22  dResult(interp,"
b540: 2c 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20 70  , failed while p
b550: 72 6f 63 65 73 73 69 6e 67 20 6c 69 6e 65 3a 20  rocessing line: 
b560: 22 2c 7a 4c 69 6e 65 4e 75 6d 2c 30 29 3b 0a 20  ",zLineNum,0);. 
b570: 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52       rc = TCL_ER
b580: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  ROR;.    }.    b
b590: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
b5a0: 20 20 2a 2a 20 20 20 20 24 64 62 20 65 6e 61 62    **    $db enab
b5b0: 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  le_load_extensio
b5c0: 6e 20 42 4f 4f 4c 45 41 4e 0a 20 20 2a 2a 0a 20  n BOOLEAN.  **. 
b5d0: 20 2a 2a 20 54 75 72 6e 20 74 68 65 20 65 78 74   ** Turn the ext
b5e0: 65 6e 73 69 6f 6e 20 6c 6f 61 64 69 6e 67 20 66  ension loading f
b5f0: 65 61 74 75 72 65 20 6f 6e 20 6f 72 20 6f 66 66  eature on or off
b600: 2e 20 20 49 74 20 69 66 20 6f 66 66 20 62 79 0a  .  It if off by.
b610: 20 20 2a 2a 20 64 65 66 61 75 6c 74 2e 0a 20 20    ** default..  
b620: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 45 4e 41  */.  case DB_ENA
b630: 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  BLE_LOAD_EXTENSI
b640: 4f 4e 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53 51  ON: {.#ifndef SQ
b650: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
b660: 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 69 6e 74  XTENSION.    int
b670: 20 6f 6e 6f 66 66 3b 0a 20 20 20 20 69 66 28 20   onoff;.    if( 
b680: 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20  objc!=3 ){.     
b690: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
b6a0: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
b6b0: 76 2c 20 22 42 4f 4f 4c 45 41 4e 22 29 3b 0a 20  v, "BOOLEAN");. 
b6c0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
b6d0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
b6e0: 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c   if( Tcl_GetBool
b6f0: 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
b700: 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6f 6e 6f  p, objv[2], &ono
b710: 66 66 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ff) ){.      ret
b720: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
b730: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
b740: 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74  _enable_load_ext
b750: 65 6e 73 69 6f 6e 28 70 44 62 2d 3e 64 62 2c 20  ension(pDb->db, 
b760: 6f 6e 6f 66 66 29 3b 0a 20 20 20 20 62 72 65 61  onoff);.    brea
b770: 6b 3b 0a 23 65 6c 73 65 0a 20 20 20 20 54 63 6c  k;.#else.    Tcl
b780: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
b790: 74 65 72 70 2c 20 22 65 78 74 65 6e 73 69 6f 6e  terp, "extension
b7a0: 20 6c 6f 61 64 69 6e 67 20 69 73 20 74 75 72 6e   loading is turn
b7b0: 65 64 20 6f 66 66 20 61 74 20 63 6f 6d 70 69 6c  ed off at compil
b7c0: 65 2d 74 69 6d 65 22 2c 0a 20 20 20 20 20 20 20  e-time",.       
b7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 29                0)
b7e0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
b7f0: 5f 45 52 52 4f 52 3b 0a 23 65 6e 64 69 66 0a 20  _ERROR;.#endif. 
b800: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
b810: 20 24 64 62 20 65 72 72 6f 72 63 6f 64 65 0a 20   $db errorcode. 
b820: 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
b830: 74 68 65 20 6e 75 6d 65 72 69 63 20 65 72 72 6f  the numeric erro
b840: 72 20 63 6f 64 65 20 74 68 61 74 20 77 61 73 20  r code that was 
b850: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
b860: 6d 6f 73 74 20 72 65 63 65 6e 74 0a 20 20 2a 2a  most recent.  **
b870: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
b880: 5f 65 78 65 63 28 29 2e 0a 20 20 2a 2f 0a 20 20  _exec()..  */.  
b890: 63 61 73 65 20 44 42 5f 45 52 52 4f 52 43 4f 44  case DB_ERRORCOD
b8a0: 45 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  E: {.    Tcl_Set
b8b0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
b8c0: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
b8d0: 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
b8e0: 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20  pDb->db)));.    
b8f0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 20 0a 20  break;.  }.   . 
b900: 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20   /*.  **    $db 
b910: 65 76 61 6c 20 24 73 71 6c 20 3f 61 72 72 61 79  eval $sql ?array
b920: 3f 20 3f 7b 20 20 2e 2e 2e 63 6f 64 65 2e 2e 2e  ? ?{  ...code...
b930: 20 7d 3f 0a 20 20 2a 2a 20 20 20 20 24 64 62 20   }?.  **    $db 
b940: 6f 6e 65 63 6f 6c 75 6d 6e 20 24 73 71 6c 0a 20  onecolumn $sql. 
b950: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 53 51 4c   **.  ** The SQL
b960: 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 24 73   statement in $s
b970: 71 6c 20 69 73 20 65 76 61 6c 75 61 74 65 64 2e  ql is evaluated.
b980: 20 20 46 6f 72 20 65 61 63 68 20 72 6f 77 2c 20    For each row, 
b990: 74 68 65 20 76 61 6c 75 65 73 20 61 72 65 0a 20  the values are. 
b9a0: 20 2a 2a 20 70 6c 61 63 65 64 20 69 6e 20 65 6c   ** placed in el
b9b0: 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 61 72  ements of the ar
b9c0: 72 61 79 20 6e 61 6d 65 64 20 22 61 72 72 61 79  ray named "array
b9d0: 22 20 61 6e 64 20 2e 2e 2e 63 6f 64 65 2e 2e 2e  " and ...code...
b9e0: 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20   is executed..  
b9f0: 2a 2a 20 49 66 20 22 61 72 72 61 79 22 20 61 6e  ** If "array" an
ba00: 64 20 22 63 6f 64 65 22 20 61 72 65 20 6f 6d 69  d "code" are omi
ba10: 74 74 65 64 2c 20 74 68 65 6e 20 6e 6f 20 63 61  tted, then no ca
ba20: 6c 6c 62 61 63 6b 20 69 73 20 65 76 65 72 79 20  llback is every 
ba30: 69 6e 76 6f 6b 65 64 2e 0a 20 20 2a 2a 20 49 66  invoked..  ** If
ba40: 20 22 61 72 72 61 79 22 20 69 73 20 61 6e 20 65   "array" is an e
ba50: 6d 70 74 79 20 73 74 72 69 6e 67 2c 20 74 68 65  mpty string, the
ba60: 6e 20 74 68 65 20 76 61 6c 75 65 73 20 61 72 65  n the values are
ba70: 20 70 6c 61 63 65 64 20 69 6e 20 76 61 72 69 61   placed in varia
ba80: 62 6c 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 68  bles.  ** that h
ba90: 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ave the same nam
baa0: 65 20 61 73 20 74 68 65 20 66 69 65 6c 64 73 20  e as the fields 
bab0: 65 78 74 72 61 63 74 65 64 20 62 79 20 74 68 65  extracted by the
bac0: 20 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a   query..  **.  *
bad0: 2a 20 54 68 65 20 6f 6e 65 63 6f 6c 75 6d 6e 20  * The onecolumn 
bae0: 6d 65 74 68 6f 64 20 69 73 20 74 68 65 20 65 71  method is the eq
baf0: 75 69 76 61 6c 65 6e 74 20 6f 66 3a 0a 20 20 2a  uivalent of:.  *
bb00: 2a 20 20 20 20 20 6c 69 6e 64 65 78 20 5b 24 64  *     lindex [$d
bb10: 62 20 65 76 61 6c 20 24 73 71 6c 5d 20 30 0a 20  b eval $sql] 0. 
bb20: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 4f 4e   */.  case DB_ON
bb30: 45 43 4f 4c 55 4d 4e 3a 0a 20 20 63 61 73 65 20  ECOLUMN:.  case 
bb40: 44 42 5f 45 56 41 4c 3a 0a 20 20 63 61 73 65 20  DB_EVAL:.  case 
bb50: 44 42 5f 45 58 49 53 54 53 3a 20 7b 0a 20 20 20  DB_EXISTS: {.   
bb60: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 53 71   char const *zSq
bb70: 6c 3b 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20  l;      /* Next 
bb80: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  SQL statement to
bb90: 20 65 78 65 63 75 74 65 20 2a 2f 0a 20 20 20 20   execute */.    
bba0: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4c 65 66  char const *zLef
bbb0: 74 3b 20 20 20 20 20 2f 2a 20 57 68 61 74 20 69  t;     /* What i
bbc0: 73 20 6c 65 66 74 20 61 66 74 65 72 20 66 69 72  s left after fir
bbd0: 73 74 20 73 74 6d 74 20 69 6e 20 7a 53 71 6c 20  st stmt in zSql 
bbe0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  */.    sqlite3_s
bbf0: 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 2f 2a  tmt *pStmt;   /*
bc00: 20 43 6f 6d 70 69 6c 65 64 20 53 51 4c 20 73 74   Compiled SQL st
bc10: 61 74 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 54 63  atment */.    Tc
bc20: 6c 5f 4f 62 6a 20 2a 70 41 72 72 61 79 3b 20 20  l_Obj *pArray;  
bc30: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
bc40: 61 72 72 61 79 20 69 6e 74 6f 20 77 68 69 63 68  array into which
bc50: 20 72 65 73 75 6c 74 73 20 61 72 65 20 77 72 69   results are wri
bc60: 74 74 65 6e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  tten */.    Tcl_
bc70: 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 20 20 20  Obj *pScript;   
bc80: 20 20 20 2f 2a 20 53 63 72 69 70 74 20 74 6f 20     /* Script to 
bc90: 72 75 6e 20 66 6f 72 20 65 61 63 68 20 72 65 73  run for each res
bca0: 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 54  ult set */.    T
bcb0: 63 6c 5f 4f 62 6a 20 2a 2a 61 70 50 61 72 6d 3b  cl_Obj **apParm;
bcc0: 20 20 20 20 20 20 2f 2a 20 50 61 72 61 6d 65 74        /* Paramet
bcd0: 65 72 73 20 74 68 61 74 20 6e 65 65 64 20 61 20  ers that need a 
bce0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
bcf0: 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50  () */.    int nP
bd00: 61 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  arm;            
bd10: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
bd20: 74 72 69 65 73 20 75 73 65 64 20 69 6e 20 61 70  tries used in ap
bd30: 50 61 72 6d 5b 5d 20 2a 2f 0a 20 20 20 20 54 63  Parm[] */.    Tc
bd40: 6c 5f 4f 62 6a 20 2a 61 50 61 72 6d 5b 31 30 5d  l_Obj *aParm[10]
bd50: 3b 20 20 20 20 2f 2a 20 53 74 61 74 69 63 20 73  ;    /* Static s
bd60: 70 61 63 65 20 66 6f 72 20 61 70 50 61 72 6d 5b  pace for apParm[
bd70: 5d 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  ] in the common 
bd80: 63 61 73 65 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  case */.    Tcl_
bd90: 4f 62 6a 20 2a 70 52 65 74 3b 20 20 20 20 20 20  Obj *pRet;      
bda0: 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 62     /* Value to b
bdb0: 65 20 72 65 74 75 72 6e 65 64 20 2a 2f 0a 20 20  e returned */.  
bdc0: 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d    SqlPreparedStm
bdd0: 74 20 2a 70 50 72 65 53 74 6d 74 3b 20 20 2f 2a  t *pPreStmt;  /*
bde0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 70 72   Pointer to a pr
bdf0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
be00: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 32 3b   */.    int rc2;
be10: 0a 0a 20 20 20 20 69 66 28 20 63 68 6f 69 63 65  ..    if( choice
be20: 3d 3d 44 42 5f 45 56 41 4c 20 29 7b 0a 20 20 20  ==DB_EVAL ){.   
be30: 20 20 20 69 66 28 20 6f 62 6a 63 3c 33 20 7c 7c     if( objc<3 ||
be40: 20 6f 62 6a 63 3e 35 20 29 7b 0a 20 20 20 20 20   objc>5 ){.     
be50: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
be60: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
be70: 62 6a 76 2c 20 22 53 51 4c 20 3f 41 52 52 41 59  bjv, "SQL ?ARRAY
be80: 2d 4e 41 4d 45 3f 20 3f 53 43 52 49 50 54 3f 22  -NAME? ?SCRIPT?"
be90: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
bea0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
beb0: 20 20 20 7d 0a 20 20 20 20 20 20 70 52 65 74 20     }.      pRet 
bec0: 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a  = Tcl_NewObj();.
bed0: 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65        Tcl_IncrRe
bee0: 66 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20  fCount(pRet);.  
bef0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
bf00: 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
bf10: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
bf20: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
bf30: 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 22 29 3b 0a  , objv, "SQL");.
bf40: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
bf50: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
bf60: 7d 0a 20 20 20 20 20 20 69 66 28 20 63 68 6f 69  }.      if( choi
bf70: 63 65 3d 3d 44 42 5f 45 58 49 53 54 53 20 29 7b  ce==DB_EXISTS ){
bf80: 0a 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20  .        pRet = 
bf90: 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62  Tcl_NewBooleanOb
bfa0: 6a 28 30 29 3b 0a 20 20 20 20 20 20 20 20 54 63  j(0);.        Tc
bfb0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
bfc0: 52 65 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Ret);.      }els
bfd0: 65 7b 0a 20 20 20 20 20 20 20 20 70 52 65 74 20  e{.        pRet 
bfe0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
bff0: 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d   }.    if( objc=
c000: 3d 33 20 29 7b 0a 20 20 20 20 20 20 70 41 72 72  =3 ){.      pArr
c010: 61 79 20 3d 20 70 53 63 72 69 70 74 20 3d 20 30  ay = pScript = 0
c020: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
c030: 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20  objc==4 ){.     
c040: 20 70 41 72 72 61 79 20 3d 20 30 3b 0a 20 20 20   pArray = 0;.   
c050: 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62 6a     pScript = obj
c060: 76 5b 33 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  v[3];.    }else{
c070: 0a 20 20 20 20 20 20 70 41 72 72 61 79 20 3d 20  .      pArray = 
c080: 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20 20 20 69  objv[3];.      i
c090: 66 28 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  f( Tcl_GetString
c0a0: 28 70 41 72 72 61 79 29 5b 30 5d 3d 3d 30 20 29  (pArray)[0]==0 )
c0b0: 20 70 41 72 72 61 79 20 3d 20 30 3b 0a 20 20 20   pArray = 0;.   
c0c0: 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62 6a     pScript = obj
c0d0: 76 5b 34 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  v[4];.    }..   
c0e0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
c0f0: 74 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20  t(objv[2]);.    
c100: 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74  zSql = Tcl_GetSt
c110: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
c120: 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20 77 68 69  [2], 0);.    whi
c130: 6c 65 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 26  le( rc==TCL_OK &
c140: 26 20 7a 53 71 6c 5b 30 5d 20 29 7b 0a 20 20 20  & zSql[0] ){.   
c150: 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
c160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c170: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
c180: 0a 20 20 20 20 20 20 69 6e 74 20 6e 56 61 72 3b  .      int nVar;
c190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1a0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
c1b0: 69 6e 64 20 70 61 72 61 6d 65 74 65 72 73 20 69  ind parameters i
c1c0: 6e 20 74 68 65 20 70 53 74 6d 74 20 2a 2f 0a 20  n the pStmt */. 
c1d0: 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20       int nCol = 
c1e0: 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  -1;             
c1f0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
c200: 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75  umns in the resu
c210: 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 20 20  lt set */.      
c220: 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 43 6f 6c 4e  Tcl_Obj **apColN
c230: 61 6d 65 20 3d 20 30 3b 20 20 20 2f 2a 20 41 72  ame = 0;   /* Ar
c240: 72 61 79 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61  ray of column na
c250: 6d 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  mes */.      int
c260: 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20   len;           
c270: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69 6e          /* Strin
c280: 67 20 6c 65 6e 67 74 68 20 6f 66 20 7a 53 71 6c  g length of zSql
c290: 20 2a 2f 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20   */.  .      /* 
c2a0: 54 72 79 20 74 6f 20 66 69 6e 64 20 61 20 53 51  Try to find a SQ
c2b0: 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  L statement that
c2c0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
c2d0: 6e 20 63 6f 6d 70 69 6c 65 64 20 61 6e 64 0a 20  n compiled and. 
c2e0: 20 20 20 20 20 2a 2a 20 77 68 69 63 68 20 6d 61       ** which ma
c2f0: 74 63 68 65 73 20 74 68 65 20 6e 65 78 74 20 73  tches the next s
c300: 65 71 75 65 6e 63 65 20 6f 66 20 53 51 4c 2e 0a  equence of SQL..
c310: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
c320: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
c330: 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 53 71  len = strlen(zSq
c340: 6c 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 50  l);.      for(pP
c350: 72 65 53 74 6d 74 20 3d 20 70 44 62 2d 3e 73 74  reStmt = pDb->st
c360: 6d 74 4c 69 73 74 3b 20 70 50 72 65 53 74 6d 74  mtList; pPreStmt
c370: 3b 20 70 50 72 65 53 74 6d 74 3d 70 50 72 65 53  ; pPreStmt=pPreS
c380: 74 6d 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  tmt->pNext){.   
c390: 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 50 72       int n = pPr
c3a0: 65 53 74 6d 74 2d 3e 6e 53 71 6c 3b 0a 20 20 20  eStmt->nSql;.   
c3b0: 20 20 20 20 20 69 66 28 20 6c 65 6e 3e 3d 6e 20       if( len>=n 
c3c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20  .            && 
c3d0: 6d 65 6d 63 6d 70 28 70 50 72 65 53 74 6d 74 2d  memcmp(pPreStmt-
c3e0: 3e 7a 53 71 6c 2c 20 7a 53 71 6c 2c 20 6e 29 3d  >zSql, zSql, n)=
c3f0: 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  =0.            &
c400: 26 20 28 7a 53 71 6c 5b 6e 5d 3d 3d 30 20 7c 7c  & (zSql[n]==0 ||
c410: 20 7a 53 71 6c 5b 6e 2d 31 5d 3d 3d 27 3b 27 29   zSql[n-1]==';')
c420: 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
c430: 20 20 20 20 20 20 70 53 74 6d 74 20 3d 20 70 50        pStmt = pP
c440: 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a 20  reStmt->pStmt;. 
c450: 20 20 20 20 20 20 20 20 20 7a 4c 65 66 74 20 3d           zLeft =
c460: 20 26 7a 53 71 6c 5b 70 50 72 65 53 74 6d 74 2d   &zSql[pPreStmt-
c470: 3e 6e 53 71 6c 5d 3b 0a 0a 20 20 20 20 20 20 20  >nSql];..       
c480: 20 20 20 2f 2a 20 57 68 65 6e 20 61 20 70 72 65     /* When a pre
c490: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
c4a0: 69 73 20 66 6f 75 6e 64 2c 20 75 6e 6c 69 6e 6b  is found, unlink
c4b0: 20 69 74 20 66 72 6f 6d 20 74 68 65 0a 20 20 20   it from the.   
c4c0: 20 20 20 20 20 20 20 2a 2a 20 63 61 63 68 65 20         ** cache 
c4d0: 6c 69 73 74 2e 20 20 49 74 20 77 69 6c 6c 20 6c  list.  It will l
c4e0: 61 74 65 72 20 62 65 20 61 64 64 65 64 20 62 61  ater be added ba
c4f0: 63 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  ck to the beginn
c500: 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ing.          **
c510: 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 6c 69   of the cache li
c520: 73 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69  st in order to i
c530: 6d 70 6c 65 6d 65 6e 74 20 4c 52 55 20 72 65 70  mplement LRU rep
c540: 6c 61 63 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20  lacement..      
c550: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
c560: 20 69 66 28 20 70 50 72 65 53 74 6d 74 2d 3e 70   if( pPreStmt->p
c570: 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20  Prev ){.        
c580: 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70 50      pPreStmt->pP
c590: 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 50 72  rev->pNext = pPr
c5a0: 65 53 74 6d 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  eStmt->pNext;.  
c5b0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
c5c0: 20 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e             pDb->
c5d0: 73 74 6d 74 4c 69 73 74 20 3d 20 70 50 72 65 53  stmtList = pPreS
c5e0: 74 6d 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  tmt->pNext;.    
c5f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c600: 20 20 69 66 28 20 70 50 72 65 53 74 6d 74 2d 3e    if( pPreStmt->
c610: 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20  pNext ){.       
c620: 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70       pPreStmt->p
c630: 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 50  Next->pPrev = pP
c640: 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 3b 0a 20  reStmt->pPrev;. 
c650: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
c660: 20 20 20 20 20 20 20 20 20 20 20 20 70 44 62 2d              pDb-
c670: 3e 73 74 6d 74 4c 61 73 74 20 3d 20 70 50 72 65  >stmtLast = pPre
c680: 53 74 6d 74 2d 3e 70 50 72 65 76 3b 0a 20 20 20  Stmt->pPrev;.   
c690: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
c6a0: 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74 2d 2d 3b     pDb->nStmt--;
c6b0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
c6c0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
c6d0: 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20    }.  .      /* 
c6e0: 49 66 20 6e 6f 20 70 72 65 70 61 72 65 64 20 73  If no prepared s
c6f0: 74 61 74 65 6d 65 6e 74 20 77 61 73 20 66 6f 75  tatement was fou
c700: 6e 64 2e 20 20 43 6f 6d 70 69 6c 65 20 74 68 65  nd.  Compile the
c710: 20 53 51 4c 20 74 65 78 74 0a 20 20 20 20 20 20   SQL text.      
c720: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 53 74  */.      if( pSt
c730: 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  mt==0 ){.       
c740: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
c750: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
c760: 76 32 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c  v2(pDb->db, zSql
c770: 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 26 7a  , -1, &pStmt, &z
c780: 4c 65 66 74 29 20 29 7b 0a 20 20 20 20 20 20 20  Left) ){.       
c790: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
c7a0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 64 62 54 65  ult(interp, dbTe
c7b0: 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f  xtToObj(sqlite3_
c7c0: 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 29  errmsg(pDb->db))
c7d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
c7e0: 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  = TCL_ERROR;.   
c7f0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
c800: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c810: 69 66 28 20 70 53 74 6d 74 3d 3d 30 20 29 7b 0a  if( pStmt==0 ){.
c820: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 53 51            if( SQ
c830: 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
c840: 5f 65 72 72 63 6f 64 65 28 70 44 62 2d 3e 64 62  _errcode(pDb->db
c850: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
c860: 20 2f 2a 20 41 20 63 6f 6d 70 69 6c 65 2d 74 69   /* A compile-ti
c870: 6d 65 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20  me error in the 
c880: 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20  statement.      
c890: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
c8a0: 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52       Tcl_SetObjR
c8b0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 64 62  esult(interp, db
c8c0: 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65  TextToObj(sqlite
c8d0: 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
c8e0: 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  )));.           
c8f0: 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b   rc = TCL_ERROR;
c900: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
c910: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ak;.          }e
c920: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
c930: 20 2f 2a 20 54 68 65 20 73 74 61 74 65 6d 65 6e   /* The statemen
c940: 74 20 77 61 73 20 61 20 6e 6f 2d 6f 70 2e 20 20  t was a no-op.  
c950: 43 6f 6e 74 69 6e 75 65 20 74 6f 20 74 68 65 20  Continue to the 
c960: 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74 0a 20  next statement. 
c970: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e             ** in
c980: 20 74 68 65 20 53 51 4c 20 73 74 72 69 6e 67 2e   the SQL string.
c990: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
c9a0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 53 71 6c              zSql
c9b0: 20 3d 20 7a 4c 65 66 74 3b 0a 20 20 20 20 20 20   = zLeft;.      
c9c0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
c9d0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
c9e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
c9f0: 73 65 72 74 28 20 70 50 72 65 53 74 6d 74 3d 3d  sert( pPreStmt==
ca00: 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  0 );.      }..  
ca10: 20 20 20 20 2f 2a 20 42 69 6e 64 20 76 61 6c 75      /* Bind valu
ca20: 65 73 20 74 6f 20 70 61 72 61 6d 65 74 65 72 73  es to parameters
ca30: 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68   that begin with
ca40: 20 24 20 6f 72 20 3a 0a 20 20 20 20 20 20 2a 2f   $ or :.      */
ca50: 20 20 0a 20 20 20 20 20 20 6e 56 61 72 20 3d 20    .      nVar = 
ca60: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
ca70: 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28 70 53 74  ameter_count(pSt
ca80: 6d 74 29 3b 0a 20 20 20 20 20 20 6e 50 61 72 6d  mt);.      nParm
ca90: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
caa0: 6e 56 61 72 3e 73 69 7a 65 6f 66 28 61 50 61 72  nVar>sizeof(aPar
cab0: 6d 29 2f 73 69 7a 65 6f 66 28 61 50 61 72 6d 5b  m)/sizeof(aParm[
cac0: 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61  0]) ){.        a
cad0: 70 50 61 72 6d 20 3d 20 28 54 63 6c 5f 4f 62 6a  pParm = (Tcl_Obj
cae0: 2a 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 6e 56 61  **)Tcl_Alloc(nVa
caf0: 72 2a 73 69 7a 65 6f 66 28 61 70 50 61 72 6d 5b  r*sizeof(apParm[
cb00: 30 5d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  0]));.      }els
cb10: 65 7b 0a 20 20 20 20 20 20 20 20 61 70 50 61 72  e{.        apPar
cb20: 6d 20 3d 20 61 50 61 72 6d 3b 0a 20 20 20 20 20  m = aParm;.     
cb30: 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31   }.      for(i=1
cb40: 3b 20 69 3c 3d 6e 56 61 72 3b 20 69 2b 2b 29 7b  ; i<=nVar; i++){
cb50: 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
cb60: 68 61 72 20 2a 7a 56 61 72 20 3d 20 73 71 6c 69  har *zVar = sqli
cb70: 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
cb80: 65 72 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20 69  er_name(pStmt, i
cb90: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  );.        if( z
cba0: 56 61 72 21 3d 30 20 26 26 20 28 7a 56 61 72 5b  Var!=0 && (zVar[
cbb0: 30 5d 3d 3d 27 24 27 20 7c 7c 20 7a 56 61 72 5b  0]=='$' || zVar[
cbc0: 30 5d 3d 3d 27 3a 27 20 7c 7c 20 7a 56 61 72 5b  0]==':' || zVar[
cbd0: 30 5d 3d 3d 27 40 27 29 20 29 7b 0a 20 20 20 20  0]=='@') ){.    
cbe0: 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70        Tcl_Obj *p
cbf0: 56 61 72 20 3d 20 54 63 6c 5f 47 65 74 56 61 72  Var = Tcl_GetVar
cc00: 32 45 78 28 69 6e 74 65 72 70 2c 20 26 7a 56 61  2Ex(interp, &zVa
cc10: 72 5b 31 5d 2c 20 30 2c 20 30 29 3b 0a 20 20 20  r[1], 0, 0);.   
cc20: 20 20 20 20 20 20 20 69 66 28 20 70 56 61 72 20         if( pVar 
cc30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
cc40: 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  nt n;.          
cc50: 20 20 75 38 20 2a 64 61 74 61 3b 0a 20 20 20 20    u8 *data;.    
cc60: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
cc70: 79 70 65 20 3d 20 70 56 61 72 2d 3e 74 79 70 65  ype = pVar->type
cc80: 50 74 72 20 3f 20 70 56 61 72 2d 3e 74 79 70 65  Ptr ? pVar->type
cc90: 50 74 72 2d 3e 6e 61 6d 65 20 3a 20 22 22 3b 0a  Ptr->name : "";.
cca0: 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
ccb0: 20 63 20 3d 20 7a 54 79 70 65 5b 30 5d 3b 0a 20   c = zType[0];. 
ccc0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a             if( z
ccd0: 56 61 72 5b 30 5d 3d 3d 27 40 27 20 7c 7c 0a 20  Var[0]=='@' ||. 
cce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
ccf0: 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d 70 28  =='b' && strcmp(
cd00: 7a 54 79 70 65 2c 22 62 79 74 65 61 72 72 61 79  zType,"bytearray
cd10: 22 29 3d 3d 30 20 26 26 20 70 56 61 72 2d 3e 62  ")==0 && pVar->b
cd20: 79 74 65 73 3d 3d 30 29 20 29 7b 0a 20 20 20 20  ytes==0) ){.    
cd30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 61            /* Loa
cd40: 64 20 61 20 42 4c 4f 42 20 74 79 70 65 20 69 66  d a BLOB type if
cd50: 20 74 68 65 20 54 63 6c 20 76 61 72 69 61 62 6c   the Tcl variabl
cd60: 65 20 69 73 20 61 20 62 79 74 65 61 72 72 61 79  e is a bytearray
cd70: 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20   and.           
cd80: 20 20 20 2a 2a 20 69 74 20 68 61 73 20 6e 6f 20     ** it has no 
cd90: 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74  string represent
cda0: 61 74 69 6f 6e 20 6f 72 20 74 68 65 20 68 6f 73  ation or the hos
cdb0: 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t.              
cdc0: 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 6e 61 6d  ** parameter nam
cdd0: 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 22 40  e begins with "@
cde0: 22 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ". */.          
cdf0: 20 20 20 20 64 61 74 61 20 3d 20 54 63 6c 5f 47      data = Tcl_G
ce00: 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f  etByteArrayFromO
ce10: 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20  bj(pVar, &n);.  
ce20: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
ce30: 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53  te3_bind_blob(pS
ce40: 74 6d 74 2c 20 69 2c 20 64 61 74 61 2c 20 6e 2c  tmt, i, data, n,
ce50: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
ce60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54  .              T
ce70: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
ce80: 70 56 61 72 29 3b 0a 20 20 20 20 20 20 20 20 20  pVar);.         
ce90: 20 20 20 20 20 61 70 50 61 72 6d 5b 6e 50 61 72       apParm[nPar
cea0: 6d 2b 2b 5d 20 3d 20 70 56 61 72 3b 0a 20 20 20  m++] = pVar;.   
ceb0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
cec0: 66 28 20 63 3d 3d 27 62 27 20 26 26 20 73 74 72  f( c=='b' && str
ced0: 63 6d 70 28 7a 54 79 70 65 2c 22 62 6f 6f 6c 65  cmp(zType,"boole
cee0: 61 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  an")==0 ){.     
cef0: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74           Tcl_Get
cf00: 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
cf10: 70 2c 20 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20  p, pVar, &n);.  
cf20: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
cf30: 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74  te3_bind_int(pSt
cf40: 6d 74 2c 20 69 2c 20 6e 29 3b 0a 20 20 20 20 20  mt, i, n);.     
cf50: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
cf60: 20 63 3d 3d 27 64 27 20 26 26 20 73 74 72 63 6d   c=='d' && strcm
cf70: 70 28 7a 54 79 70 65 2c 22 64 6f 75 62 6c 65 22  p(zType,"double"
cf80: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
cf90: 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 3b 0a        double r;.
cfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
cfb0: 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f  l_GetDoubleFromO
cfc0: 62 6a 28 69 6e 74 65 72 70 2c 20 70 56 61 72 2c  bj(interp, pVar,
cfd0: 20 26 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20   &r);.          
cfe0: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
cff0: 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20 69  _double(pStmt, i
d000: 2c 20 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , r);.          
d010: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63 3d 3d    }else if( (c==
d020: 27 77 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54  'w' && strcmp(zT
d030: 79 70 65 2c 22 77 69 64 65 49 6e 74 22 29 3d 3d  ype,"wideInt")==
d040: 30 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  0) ||.          
d050: 20 20 20 20 20 20 20 20 28 63 3d 3d 27 69 27 20          (c=='i' 
d060: 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c  && strcmp(zType,
d070: 22 69 6e 74 22 29 3d 3d 30 29 20 29 7b 0a 20 20  "int")==0) ){.  
d080: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
d090: 57 69 64 65 49 6e 74 20 76 3b 0a 20 20 20 20 20  WideInt v;.     
d0a0: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74           Tcl_Get
d0b0: 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  WideIntFromObj(i
d0c0: 6e 74 65 72 70 2c 20 70 56 61 72 2c 20 26 76 29  nterp, pVar, &v)
d0d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
d0e0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
d0f0: 36 34 28 70 53 74 6d 74 2c 20 69 2c 20 76 29 3b  64(pStmt, i, v);
d100: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
d110: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
d120: 20 20 64 61 74 61 20 3d 20 28 75 6e 73 69 67 6e    data = (unsign
d130: 65 64 20 63 68 61 72 20 2a 29 54 63 6c 5f 47 65  ed char *)Tcl_Ge
d140: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70  tStringFromObj(p
d150: 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20  Var, &n);.      
d160: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
d170: 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c  bind_text(pStmt,
d180: 20 69 2c 20 28 63 68 61 72 20 2a 29 64 61 74 61   i, (char *)data
d190: 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  , n, SQLITE_STAT
d1a0: 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  IC);.           
d1b0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
d1c0: 75 6e 74 28 70 56 61 72 29 3b 0a 20 20 20 20 20  unt(pVar);.     
d1d0: 20 20 20 20 20 20 20 20 20 61 70 50 61 72 6d 5b           apParm[
d1e0: 6e 50 61 72 6d 2b 2b 5d 20 3d 20 70 56 61 72 3b  nParm++] = pVar;
d1f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
d200: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
d210: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
d220: 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 20 70  te3_bind_null( p
d230: 53 74 6d 74 2c 20 69 20 29 3b 0a 20 20 20 20 20  Stmt, i );.     
d240: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
d250: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
d260: 2f 2a 20 45 78 65 63 75 74 65 20 74 68 65 20 53  /* Execute the S
d270: 51 4c 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  QL.      */.    
d280: 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 54 43 4c    while( rc==TCL
d290: 5f 4f 4b 20 26 26 20 70 53 74 6d 74 20 26 26 20  _OK && pStmt && 
d2a0: 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
d2b0: 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20  te3_step(pStmt) 
d2c0: 29 7b 0a 0a 09 2f 2a 20 43 6f 6d 70 75 74 65 20  ){.../* Compute 
d2d0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 54 68  column names. Th
d2e0: 69 73 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20  is must be done 
d2f0: 61 66 74 65 72 20 74 68 65 20 66 69 72 73 74 20  after the first 
d300: 73 75 63 63 65 73 73 66 75 6c 0a 09 2a 2a 20 63  successful..** c
d310: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 73  all to sqlite3_s
d320: 74 65 70 28 29 2c 20 69 6e 20 63 61 73 65 20 74  tep(), in case t
d330: 68 65 20 71 75 65 72 79 20 69 73 20 72 65 63 6f  he query is reco
d340: 6d 70 69 6c 65 64 20 61 6e 64 20 74 68 65 0a 20  mpiled and the. 
d350: 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72         ** number
d360: 20 6f 72 20 6e 61 6d 65 73 20 6f 66 20 74 68 65   or names of the
d370: 20 72 65 74 75 72 6e 65 64 20 63 6f 6c 75 6d 6e   returned column
d380: 73 20 63 68 61 6e 67 65 73 2e 20 0a 20 20 20 20  s changes. .    
d390: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
d3a0: 73 73 65 72 74 28 21 70 41 72 72 61 79 7c 7c 70  ssert(!pArray||p
d3b0: 53 63 72 69 70 74 29 3b 0a 20 20 20 20 20 20 20  Script);.       
d3c0: 20 69 66 20 28 6e 43 6f 6c 20 3c 20 30 29 20 7b   if (nCol < 0) {
d3d0: 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4f  .          Tcl_O
d3e0: 62 6a 20 2a 2a 2a 61 70 20 3d 20 28 70 53 63 72  bj ***ap = (pScr
d3f0: 69 70 74 3f 26 61 70 43 6f 6c 4e 61 6d 65 3a 30  ipt?&apColName:0
d400: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43 6f  );.          nCo
d410: 6c 20 3d 20 63 6f 6d 70 75 74 65 43 6f 6c 75 6d  l = computeColum
d420: 6e 4e 61 6d 65 73 28 69 6e 74 65 72 70 2c 20 70  nNames(interp, p
d430: 53 74 6d 74 2c 20 61 70 2c 20 70 41 72 72 61 79  Stmt, ap, pArray
d440: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
d450: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
d460: 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
d470: 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a         Tcl_Obj *
d480: 70 56 61 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  pVal;.          
d490: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65  .          /* Se
d4a0: 74 20 70 56 61 6c 20 74 6f 20 63 6f 6e 74 61 69  t pVal to contai
d4b0: 6e 20 74 68 65 20 69 27 74 68 20 63 6f 6c 75 6d  n the i'th colum
d4c0: 6e 20 6f 66 20 74 68 69 73 20 72 6f 77 2e 20 2a  n of this row. *
d4d0: 2f 0a 20 20 20 20 20 20 20 20 20 20 73 77 69 74  /.          swit
d4e0: 63 68 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ch( sqlite3_colu
d4f0: 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c 20 69  mn_type(pStmt, i
d500: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
d510: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f   case SQLITE_BLO
d520: 42 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  B: {.           
d530: 20 20 20 69 6e 74 20 62 79 74 65 73 20 3d 20 73     int bytes = s
d540: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
d550: 74 65 73 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20  tes(pStmt, i);. 
d560: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
d570: 73 74 20 63 68 61 72 20 2a 7a 42 6c 6f 62 20 3d  st char *zBlob =
d580: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
d590: 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69 29 3b 0a  blob(pStmt, i);.
d5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
d5b0: 28 20 21 7a 42 6c 6f 62 20 29 20 62 79 74 65 73  ( !zBlob ) bytes
d5c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
d5d0: 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e      pVal = Tcl_N
d5e0: 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 28  ewByteArrayObj((
d5f0: 75 38 2a 29 7a 42 6c 6f 62 2c 20 62 79 74 65 73  u8*)zBlob, bytes
d600: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
d610: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
d620: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
d630: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e    case SQLITE_IN
d640: 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 20  TEGER: {.       
d650: 20 20 20 20 20 20 20 73 71 6c 69 74 65 5f 69 6e         sqlite_in
d660: 74 36 34 20 76 20 3d 20 73 71 6c 69 74 65 33 5f  t64 v = sqlite3_
d670: 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74  column_int64(pSt
d680: 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  mt, i);.        
d690: 20 20 20 20 20 20 69 66 28 20 76 3e 3d 2d 32 31        if( v>=-21
d6a0: 34 37 34 38 33 36 34 37 20 26 26 20 76 3c 3d 32  47483647 && v<=2
d6b0: 31 34 37 34 38 33 36 34 37 20 29 7b 0a 20 20 20  147483647 ){.   
d6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56 61               pVa
d6d0: 6c 20 3d 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  l = Tcl_NewIntOb
d6e0: 6a 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  j(v);.          
d6f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d700: 20 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20             pVal 
d710: 3d 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74  = Tcl_NewWideInt
d720: 4f 62 6a 28 76 29 3b 0a 20 20 20 20 20 20 20 20  Obj(v);.        
d730: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d740: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
d750: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
d760: 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
d770: 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20  TE_FLOAT: {.    
d780: 20 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65            double
d790: 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c   r = sqlite3_col
d7a0: 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74  umn_double(pStmt
d7b0: 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , i);.          
d7c0: 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e      pVal = Tcl_N
d7d0: 65 77 44 6f 75 62 6c 65 4f 62 6a 28 72 29 3b 0a  ewDoubleObj(r);.
d7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
d7f0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
d800: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63   }.            c
d810: 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a  ase SQLITE_NULL:
d820: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
d830: 20 70 56 61 6c 20 3d 20 64 62 54 65 78 74 54 6f   pVal = dbTextTo
d840: 4f 62 6a 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29 3b  Obj(pDb->zNull);
d850: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
d860: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
d870: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
d880: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
d890: 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20           pVal = 
d8a0: 64 62 54 65 78 74 54 6f 4f 62 6a 28 28 63 68 61  dbTextToObj((cha
d8b0: 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  r *)sqlite3_colu
d8c0: 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69  mn_text(pStmt, i
d8d0: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
d8e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
d8f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
d900: 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20   }.  .          
d910: 69 66 28 20 70 53 63 72 69 70 74 20 29 7b 0a 20  if( pScript ){. 
d920: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
d930: 41 72 72 61 79 3d 3d 30 20 29 7b 0a 20 20 20 20  Array==0 ){.    
d940: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62            Tcl_Ob
d950: 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c  jSetVar2(interp,
d960: 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 30   apColName[i], 0
d970: 2c 20 70 56 61 6c 2c 20 30 29 3b 0a 20 20 20 20  , pVal, 0);.    
d980: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
d990: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c               Tcl
d9a0: 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65  _ObjSetVar2(inte
d9b0: 72 70 2c 20 70 41 72 72 61 79 2c 20 61 70 43 6f  rp, pArray, apCo
d9c0: 6c 4e 61 6d 65 5b 69 5d 2c 20 70 56 61 6c 2c 20  lName[i], pVal, 
d9d0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
d9e0: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  }.          }els
d9f0: 65 20 69 66 28 20 63 68 6f 69 63 65 3d 3d 44 42  e if( choice==DB
da00: 5f 4f 4e 45 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  _ONECOLUMN ){.  
da10: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
da20: 28 20 70 52 65 74 3d 3d 30 20 29 3b 0a 20 20 20  ( pRet==0 );.   
da30: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52 65           if( pRe
da40: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
da50: 20 20 20 20 20 20 70 52 65 74 20 3d 20 70 56 61        pRet = pVa
da60: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l;.             
da70: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
da80: 74 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20 20  t(pRet);.       
da90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
daa0: 20 20 20 72 63 20 3d 20 54 43 4c 5f 42 52 45 41     rc = TCL_BREA
dab0: 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  K;.            i
dac0: 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20   = nCol;.       
dad0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 68 6f     }else if( cho
dae0: 69 63 65 3d 3d 44 42 5f 45 58 49 53 54 53 20 29  ice==DB_EXISTS )
daf0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 63  {.            Tc
db00: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
db10: 52 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Ret);.          
db20: 20 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77    pRet = Tcl_New
db30: 42 6f 6f 6c 65 61 6e 4f 62 6a 28 31 29 3b 0a 20  BooleanObj(1);. 
db40: 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49             Tcl_I
db50: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 52 65 74  ncrRefCount(pRet
db60: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
db70: 63 20 3d 20 54 43 4c 5f 42 52 45 41 4b 3b 0a 20  c = TCL_BREAK;. 
db80: 20 20 20 20 20 20 20 20 20 20 20 69 20 3d 20 6e             i = n
db90: 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  Col;.          }
dba0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
dbb0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
dbc0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
dbd0: 70 2c 20 70 52 65 74 2c 20 70 56 61 6c 29 3b 0a  p, pRet, pVal);.
dbe0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
dbf0: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20      }.  .       
dc00: 20 69 66 28 20 70 53 63 72 69 70 74 20 29 7b 0a   if( pScript ){.
dc10: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 54            rc = T
dc20: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74  cl_EvalObjEx(int
dc30: 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20 30 29  erp, pScript, 0)
dc40: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
dc50: 72 63 3d 3d 54 43 4c 5f 43 4f 4e 54 49 4e 55 45  rc==TCL_CONTINUE
dc60: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
dc70: 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20  rc = TCL_OK;.   
dc80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
dc90: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
dca0: 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 42 52 45   if( rc==TCL_BRE
dcb0: 41 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  AK ){.        rc
dcc0: 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20   = TCL_OK;.     
dcd0: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 72 65   }..      /* Fre
dce0: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  e the column nam
dcf0: 65 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 20  e objects */.   
dd00: 20 20 20 69 66 28 20 70 53 63 72 69 70 74 20 29     if( pScript )
dd10: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
dd20: 74 68 65 20 71 75 65 72 79 20 72 65 74 75 72 6e  the query return
dd30: 65 64 20 6e 6f 20 72 6f 77 73 2c 20 62 75 74 20  ed no rows, but 
dd40: 61 6e 20 61 72 72 61 79 20 76 61 72 69 61 62 6c  an array variabl
dd50: 65 20 77 61 73 20 0a 20 20 20 20 20 20 20 20 2a  e was .        *
dd60: 2a 20 73 70 65 63 69 66 69 65 64 2c 20 63 61 6c  * specified, cal
dd70: 6c 20 63 6f 6d 70 75 74 65 43 6f 6c 75 6d 6e 4e  l computeColumnN
dd80: 61 6d 65 73 28 29 20 6e 6f 77 20 74 6f 20 70 6f  ames() now to po
dd90: 70 75 6c 61 74 65 20 74 68 65 20 0a 20 20 20 20  pulate the .    
dda0: 20 20 20 20 2a 2a 20 61 72 72 61 79 6e 61 6d 65      ** arrayname
ddb0: 28 2a 29 20 76 61 72 69 61 62 6c 65 2e 0a 20 20  (*) variable..  
ddc0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
ddd0: 20 69 66 20 28 70 41 72 72 61 79 20 26 26 20 6e   if (pArray && n
dde0: 43 6f 6c 20 3c 20 30 29 20 7b 0a 20 20 20 20 20  Col < 0) {.     
ddf0: 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 2a       Tcl_Obj ***
de00: 61 70 20 3d 20 28 70 53 63 72 69 70 74 3f 26 61  ap = (pScript?&a
de10: 70 43 6f 6c 4e 61 6d 65 3a 30 29 3b 0a 20 20 20  pColName:0);.   
de20: 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 63 6f         nCol = co
de30: 6d 70 75 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  mputeColumnNames
de40: 28 69 6e 74 65 72 70 2c 20 70 53 74 6d 74 2c 20  (interp, pStmt, 
de50: 61 70 2c 20 70 41 72 72 61 79 29 3b 0a 20 20 20  ap, pArray);.   
de60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66       }.        f
de70: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
de80: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
de90: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
dea0: 28 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a  (apColName[i]);.
deb0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
dec0: 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72    Tcl_Free((char
ded0: 2a 29 61 70 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20  *)apColName);.  
dee0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
def0: 46 72 65 65 20 74 68 65 20 62 6f 75 6e 64 20 73  Free the bound s
df00: 74 72 69 6e 67 20 61 6e 64 20 62 6c 6f 62 20 70  tring and blob p
df10: 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 20  arameters */.   
df20: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50     for(i=0; i<nP
df30: 61 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  arm; i++){.     
df40: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
df50: 75 6e 74 28 61 70 50 61 72 6d 5b 69 5d 29 3b 0a  unt(apParm[i]);.
df60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
df70: 28 20 61 70 50 61 72 6d 21 3d 61 50 61 72 6d 20  ( apParm!=aParm 
df80: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46  ){.        Tcl_F
df90: 72 65 65 28 28 63 68 61 72 2a 29 61 70 50 61 72  ree((char*)apPar
dfa0: 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  m);.      }..   
dfb0: 20 20 20 2f 2a 20 52 65 73 65 74 20 74 68 65 20     /* Reset the 
dfc0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 66 20 74  statement.  If t
dfd0: 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 20 69  he result code i
dfe0: 73 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 2c  s SQLITE_SCHEMA,
dff0: 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 66   then.      ** f
e000: 6c 75 73 68 20 74 68 65 20 73 74 61 74 65 6d 65  lush the stateme
e010: 6e 74 20 63 61 63 68 65 20 61 6e 64 20 74 72 79  nt cache and try
e020: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 61   the statement a
e030: 67 61 69 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  gain..      */. 
e040: 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74       rc2 = sqlit
e050: 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b  e3_reset(pStmt);
e060: 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
e070: 45 5f 4f 4b 21 3d 72 63 32 20 29 7b 0a 20 20 20  E_OK!=rc2 ){.   
e080: 20 20 20 20 20 2f 2a 20 49 66 20 61 20 72 75 6e       /* If a run
e090: 2d 74 69 6d 65 20 65 72 72 6f 72 20 6f 63 63 75  -time error occu
e0a0: 72 73 2c 20 72 65 70 6f 72 74 20 74 68 65 20 65  rs, report the e
e0b0: 72 72 6f 72 20 61 6e 64 20 73 74 6f 70 20 72 65  rror and stop re
e0c0: 61 64 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a  ading.        **
e0d0: 20 74 68 65 20 53 51 4c 0a 20 20 20 20 20 20 20   the SQL.       
e0e0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   */.        Tcl_
e0f0: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
e100: 65 72 70 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a  erp, dbTextToObj
e110: 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28  (sqlite3_errmsg(
e120: 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20  pDb->db)));.    
e130: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
e140: 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
e150: 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52       rc = TCL_ER
e160: 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ROR;.        if(
e170: 20 70 50 72 65 53 74 6d 74 20 29 20 54 63 6c 5f   pPreStmt ) Tcl_
e180: 46 72 65 65 28 28 63 68 61 72 2a 29 70 50 72 65  Free((char*)pPre
e190: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 62  Stmt);.        b
e1a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  reak;.      }els
e1b0: 65 20 69 66 28 20 70 44 62 2d 3e 6d 61 78 53 74  e if( pDb->maxSt
e1c0: 6d 74 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  mt<=0 ){.       
e1d0: 20 2f 2a 20 49 66 20 74 68 65 20 63 61 63 68 65   /* If the cache
e1e0: 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66 2c 20   is turned off, 
e1f0: 64 65 61 6c 6c 6f 63 61 74 65 64 20 74 68 65 20  deallocated the 
e200: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
e210: 20 20 20 20 20 69 66 28 20 70 50 72 65 53 74 6d       if( pPreStm
e220: 74 20 29 20 54 63 6c 5f 46 72 65 65 28 28 63 68  t ) Tcl_Free((ch
e230: 61 72 2a 29 70 50 72 65 53 74 6d 74 29 3b 0a 20  ar*)pPreStmt);. 
e240: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
e250: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
e260: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e270: 20 20 20 20 20 2f 2a 20 45 76 65 72 79 74 68 69       /* Everythi
e280: 6e 67 20 77 6f 72 6b 65 64 20 61 6e 64 20 74 68  ng worked and th
e290: 65 20 63 61 63 68 65 20 69 73 20 6f 70 65 72 61  e cache is opera
e2a0: 74 69 6f 6e 61 6c 2e 0a 20 20 20 20 20 20 20 20  tional..        
e2b0: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
e2c0: 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20  SqlPreparedStmt 
e2d0: 73 74 72 75 63 74 75 72 65 20 69 66 20 77 65 20  structure if we 
e2e0: 6e 65 65 64 20 6f 6e 65 2e 0a 20 20 20 20 20 20  need one..      
e2f0: 20 20 2a 2a 20 28 49 66 20 77 65 20 61 6c 72 65    ** (If we alre
e300: 61 64 79 20 68 61 76 65 20 6f 6e 65 20 77 65 20  ady have one we 
e310: 63 61 6e 20 6a 75 73 74 20 72 65 75 73 65 20 69  can just reuse i
e320: 74 2e 29 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  t.).        */. 
e330: 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65 53         if( pPreS
e340: 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tmt==0 ){.      
e350: 20 20 20 20 6c 65 6e 20 3d 20 7a 4c 65 66 74 20      len = zLeft 
e360: 2d 20 7a 53 71 6c 3b 0a 20 20 20 20 20 20 20 20  - zSql;.        
e370: 20 20 70 50 72 65 53 74 6d 74 20 3d 20 28 53 71    pPreStmt = (Sq
e380: 6c 50 72 65 70 61 72 65 64 53 74 6d 74 2a 29 54  lPreparedStmt*)T
e390: 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  cl_Alloc( sizeof
e3a0: 28 2a 70 50 72 65 53 74 6d 74 29 20 29 3b 0a 20  (*pPreStmt) );. 
e3b0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72           if( pPr
e3c0: 65 53 74 6d 74 3d 3d 30 20 29 20 72 65 74 75 72  eStmt==0 ) retur
e3d0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
e3e0: 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d         pPreStmt-
e3f0: 3e 70 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a  >pStmt = pStmt;.
e400: 20 20 20 20 20 20 20 20 20 20 70 50 72 65 53 74            pPreSt
e410: 6d 74 2d 3e 6e 53 71 6c 20 3d 20 6c 65 6e 3b 0a  mt->nSql = len;.
e420: 20 20 20 20 20 20 20 20 20 20 70 50 72 65 53 74            pPreSt
e430: 6d 74 2d 3e 7a 53 71 6c 20 3d 20 73 71 6c 69 74  mt->zSql = sqlit
e440: 65 33 5f 73 71 6c 28 70 53 74 6d 74 29 3b 0a 20  e3_sql(pStmt);. 
e450: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
e460: 20 73 74 72 6c 65 6e 28 70 50 72 65 53 74 6d 74   strlen(pPreStmt
e470: 2d 3e 7a 53 71 6c 29 3d 3d 6c 65 6e 20 29 3b 0a  ->zSql)==len );.
e480: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
e490: 28 20 30 3d 3d 6d 65 6d 63 6d 70 28 70 50 72 65  ( 0==memcmp(pPre
e4a0: 53 74 6d 74 2d 3e 7a 53 71 6c 2c 20 7a 53 71 6c  Stmt->zSql, zSql
e4b0: 2c 20 6c 65 6e 29 20 29 3b 0a 20 20 20 20 20 20  , len) );.      
e4c0: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
e4d0: 41 64 64 20 74 68 65 20 70 72 65 70 61 72 65 64  Add the prepared
e4e0: 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68   statement to th
e4f0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
e500: 68 65 20 63 61 63 68 65 20 6c 69 73 74 0a 20 20  he cache list.  
e510: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
e520: 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74   pPreStmt->pNext
e530: 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74   = pDb->stmtList
e540: 3b 0a 20 20 20 20 20 20 20 20 70 50 72 65 53 74  ;.        pPreSt
e550: 6d 74 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20  mt->pPrev = 0;. 
e560: 20 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e         if( pDb->
e570: 73 74 6d 74 4c 69 73 74 20 29 7b 0a 20 20 20 20  stmtList ){.    
e580: 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69       pDb->stmtLi
e590: 73 74 2d 3e 70 50 72 65 76 20 3d 20 70 50 72 65  st->pPrev = pPre
e5a0: 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Stmt;.        }.
e5b0: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d          pDb->stm
e5c0: 74 4c 69 73 74 20 3d 20 70 50 72 65 53 74 6d 74  tList = pPreStmt
e5d0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 44  ;.        if( pD
e5e0: 62 2d 3e 73 74 6d 74 4c 61 73 74 3d 3d 30 20 29  b->stmtLast==0 )
e5f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
e600: 72 74 28 20 70 44 62 2d 3e 6e 53 74 6d 74 3d 3d  rt( pDb->nStmt==
e610: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  0 );.          p
e620: 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20 70  Db->stmtLast = p
e630: 50 72 65 53 74 6d 74 3b 0a 20 20 20 20 20 20 20  PreStmt;.       
e640: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e650: 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 6e    assert( pDb->n
e660: 53 74 6d 74 3e 30 20 29 3b 0a 20 20 20 20 20 20  Stmt>0 );.      
e670: 20 20 7d 0a 20 20 20 20 20 20 20 20 70 44 62 2d    }.        pDb-
e680: 3e 6e 53 74 6d 74 2b 2b 3b 0a 20 20 20 0a 20 20  >nStmt++;.   .  
e690: 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 68        /* If we h
e6a0: 61 76 65 20 74 6f 6f 20 6d 61 6e 79 20 73 74 61  ave too many sta
e6b0: 74 65 6d 65 6e 74 20 69 6e 20 63 61 63 68 65 2c  tement in cache,
e6c0: 20 72 65 6d 6f 76 65 20 74 68 65 20 73 75 72 70   remove the surp
e6d0: 6c 75 73 20 66 72 6f 6d 20 74 68 65 0a 20 20 20  lus from the.   
e6e0: 20 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74       ** end of t
e6f0: 68 65 20 63 61 63 68 65 20 6c 69 73 74 2e 0a 20  he cache list.. 
e700: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
e710: 20 20 77 68 69 6c 65 28 20 70 44 62 2d 3e 6e 53    while( pDb->nS
e720: 74 6d 74 3e 70 44 62 2d 3e 6d 61 78 53 74 6d 74  tmt>pDb->maxStmt
e730: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
e740: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
e750: 44 62 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70 53  Db->stmtLast->pS
e760: 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tmt);.          
e770: 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20  pDb->stmtLast = 
e780: 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70  pDb->stmtLast->p
e790: 50 72 65 76 3b 0a 20 20 20 20 20 20 20 20 20 20  Prev;.          
e7a0: 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29  Tcl_Free((char*)
e7b0: 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70  pDb->stmtLast->p
e7c0: 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Next);.         
e7d0: 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e   pDb->stmtLast->
e7e0: 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20  pNext = 0;.     
e7f0: 20 20 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74 2d       pDb->nStmt-
e800: 2d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  -;.        }.   
e810: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 50     }..      /* P
e820: 72 6f 63 65 65 64 20 74 6f 20 74 68 65 20 6e 65  roceed to the ne
e830: 78 74 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  xt statement */.
e840: 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 7a 4c 65        zSql = zLe
e850: 66 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63  ft;.    }.    Tc
e860: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 6f  l_DecrRefCount(o
e870: 62 6a 76 5b 32 5d 29 3b 0a 0a 20 20 20 20 69 66  bjv[2]);..    if
e880: 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20  ( pRet ){.      
e890: 69 66 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29  if( rc==TCL_OK )
e8a0: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65  {.        Tcl_Se
e8b0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
e8c0: 70 2c 20 70 52 65 74 29 3b 0a 20 20 20 20 20 20  p, pRet);.      
e8d0: 7d 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72  }.      Tcl_Decr
e8e0: 52 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a  RefCount(pRet);.
e8f0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
e900: 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20  ==TCL_OK ){.    
e910: 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c    Tcl_ResetResul
e920: 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 7d  t(interp);.    }
e930: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
e940: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24  .  /*.  **     $
e950: 64 62 20 66 75 6e 63 74 69 6f 6e 20 4e 41 4d 45  db function NAME
e960: 20 5b 2d 61 72 67 63 6f 75 6e 74 20 4e 5d 20 53   [-argcount N] S
e970: 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20  CRIPT.  **.  ** 
e980: 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 51 4c  Create a new SQL
e990: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64   function called
e9a0: 20 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76 65 72   NAME.  Whenever
e9b0: 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 69   that function i
e9c0: 73 0a 20 20 2a 2a 20 63 61 6c 6c 65 64 2c 20 69  s.  ** called, i
e9d0: 6e 76 6f 6b 65 20 53 43 52 49 50 54 20 74 6f 20  nvoke SCRIPT to 
e9e0: 65 76 61 6c 75 61 74 65 20 74 68 65 20 66 75 6e  evaluate the fun
e9f0: 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61  ction..  */.  ca
ea00: 73 65 20 44 42 5f 46 55 4e 43 54 49 4f 4e 3a 20  se DB_FUNCTION: 
ea10: 7b 0a 20 20 20 20 53 71 6c 46 75 6e 63 20 2a 70  {.    SqlFunc *p
ea20: 46 75 6e 63 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  Func;.    Tcl_Ob
ea30: 6a 20 2a 70 53 63 72 69 70 74 3b 0a 20 20 20 20  j *pScript;.    
ea40: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
ea50: 20 69 6e 74 20 6e 41 72 67 20 3d 20 2d 31 3b 0a   int nArg = -1;.
ea60: 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 36 20      if( objc==6 
ea70: 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
ea80: 68 61 72 20 2a 7a 20 3d 20 54 63 6c 5f 47 65 74  har *z = Tcl_Get
ea90: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b  String(objv[3]);
eaa0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73  .      int n = s
eab0: 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 20 20 20 20  trlen(z);.      
eac0: 69 66 28 20 6e 3e 32 20 26 26 20 73 74 72 6e 63  if( n>2 && strnc
ead0: 6d 70 28 7a 2c 20 22 2d 61 72 67 63 6f 75 6e 74  mp(z, "-argcount
eae0: 22 2c 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ",n)==0 ){.     
eaf0: 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e     if( Tcl_GetIn
eb00: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
eb10: 20 6f 62 6a 76 5b 34 5d 2c 20 26 6e 41 72 67 29   objv[4], &nArg)
eb20: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
eb30: 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ROR;.        if(
eb40: 20 6e 41 72 67 3c 30 20 29 7b 0a 20 20 20 20 20   nArg<0 ){.     
eb50: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
eb60: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e  esult(interp, "n
eb70: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
eb80: 74 73 20 6d 75 73 74 20 62 65 20 6e 6f 6e 2d 6e  ts must be non-n
eb90: 65 67 61 74 69 76 65 22 2c 0a 20 20 20 20 20 20  egative",.      
eba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebb0: 20 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a       (char*)0);.
ebc0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
ebd0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
ebe0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
ebf0: 20 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62      pScript = ob
ec00: 6a 76 5b 35 5d 3b 0a 20 20 20 20 7d 65 6c 73 65  jv[5];.    }else
ec10: 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a   if( objc!=4 ){.
ec20: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
ec30: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
ec40: 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20 5b 2d  , objv, "NAME [-
ec50: 61 72 67 63 6f 75 6e 74 20 4e 5d 20 53 43 52 49  argcount N] SCRI
ec60: 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  PT");.      retu
ec70: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
ec80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
ec90: 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 33 5d  Script = objv[3]
eca0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d  ;.    }.    zNam
ecb0: 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
ecc0: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
ecd0: 2c 20 30 29 3b 0a 20 20 20 20 70 46 75 6e 63 20  , 0);.    pFunc 
ece0: 3d 20 66 69 6e 64 53 71 6c 46 75 6e 63 28 70 44  = findSqlFunc(pD
ecf0: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69  b, zName);.    i
ed00: 66 28 20 70 46 75 6e 63 3d 3d 30 20 29 20 72 65  f( pFunc==0 ) re
ed10: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
ed20: 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 70      if( pFunc->p
ed30: 53 63 72 69 70 74 20 29 7b 0a 20 20 20 20 20 20  Script ){.      
ed40: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
ed50: 28 70 46 75 6e 63 2d 3e 70 53 63 72 69 70 74 29  (pFunc->pScript)
ed60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 75 6e  ;.    }.    pFun
ed70: 63 2d 3e 70 53 63 72 69 70 74 20 3d 20 70 53 63  c->pScript = pSc
ed80: 72 69 70 74 3b 0a 20 20 20 20 54 63 6c 5f 49 6e  ript;.    Tcl_In
ed90: 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69  crRefCount(pScri
eda0: 70 74 29 3b 0a 20 20 20 20 70 46 75 6e 63 2d 3e  pt);.    pFunc->
edb0: 75 73 65 45 76 61 6c 4f 62 6a 76 20 3d 20 73 61  useEvalObjv = sa
edc0: 66 65 54 6f 55 73 65 45 76 61 6c 4f 62 6a 76 28  feToUseEvalObjv(
edd0: 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 29  interp, pScript)
ede0: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
edf0: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
ee00: 6f 6e 28 70 44 62 2d 3e 64 62 2c 20 7a 4e 61 6d  on(pDb->db, zNam
ee10: 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f  e, nArg, SQLITE_
ee20: 55 54 46 38 2c 0a 20 20 20 20 20 20 20 20 70 46  UTF8,.        pF
ee30: 75 6e 63 2c 20 74 63 6c 53 71 6c 46 75 6e 63 2c  unc, tclSqlFunc,
ee40: 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
ee50: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
ee60: 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f  .      rc = TCL_
ee70: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 54 63 6c  ERROR;.      Tcl
ee80: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
ee90: 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74  p, (char *)sqlit
eea0: 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64  e3_errmsg(pDb->d
eeb0: 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45  b), TCL_VOLATILE
eec0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  );.    }.    bre
eed0: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
eee0: 2a 2a 20 20 20 20 20 24 64 62 20 69 6e 63 72 62  **     $db incrb
eef0: 6c 6f 62 20 3f 2d 72 65 61 64 6f 6e 6c 79 3f 20  lob ?-readonly? 
ef00: 3f 44 42 3f 20 54 41 42 4c 45 20 43 4f 4c 55 4d  ?DB? TABLE COLUM
ef10: 4e 20 52 4f 57 49 44 0a 20 20 2a 2f 0a 20 20 63  N ROWID.  */.  c
ef20: 61 73 65 20 44 42 5f 49 4e 43 52 42 4c 4f 42 3a  ase DB_INCRBLOB:
ef30: 20 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   {.#ifdef SQLITE
ef40: 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
ef50: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
ef60: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 69 6e 63  ult(interp, "inc
ef70: 72 62 6c 6f 62 20 6e 6f 74 20 61 76 61 69 6c 61  rblob not availa
ef80: 62 6c 65 20 69 6e 20 74 68 69 73 20 62 75 69 6c  ble in this buil
ef90: 64 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  d", 0);.    retu
efa0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65  rn TCL_ERROR;.#e
efb0: 6c 73 65 0a 20 20 20 20 69 6e 74 20 69 73 52 65  lse.    int isRe
efc0: 61 64 6f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20  adonly = 0;.    
efd0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
efe0: 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 63 6f  = "main";.    co
eff0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65  nst char *zTable
f000: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
f010: 20 2a 7a 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73   *zColumn;.    s
f020: 71 6c 69 74 65 5f 69 6e 74 36 34 20 69 52 6f 77  qlite_int64 iRow
f030: 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
f040: 66 6f 72 20 74 68 65 20 2d 72 65 61 64 6f 6e 6c  for the -readonl
f050: 79 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  y option */.    
f060: 69 66 28 20 6f 62 6a 63 3e 33 20 26 26 20 73 74  if( objc>3 && st
f070: 72 63 6d 70 28 54 63 6c 5f 47 65 74 53 74 72 69  rcmp(Tcl_GetStri
f080: 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 22 2d 72  ng(objv[2]), "-r
f090: 65 61 64 6f 6e 6c 79 22 29 3d 3d 30 20 29 7b 0a  eadonly")==0 ){.
f0a0: 20 20 20 20 20 20 69 73 52 65 61 64 6f 6e 6c 79        isReadonly
f0b0: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 1;.    }..   
f0c0: 20 69 66 28 20 6f 62 6a 63 21 3d 28 35 2b 69 73   if( objc!=(5+is
f0d0: 52 65 61 64 6f 6e 6c 79 29 20 26 26 20 6f 62 6a  Readonly) && obj
f0e0: 63 21 3d 28 36 2b 69 73 52 65 61 64 6f 6e 6c 79  c!=(6+isReadonly
f0f0: 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  ) ){.      Tcl_W
f100: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
f110: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 2d  rp, 2, objv, "?-
f120: 72 65 61 64 6f 6e 6c 79 3f 20 3f 44 42 3f 20 54  readonly? ?DB? T
f130: 41 42 4c 45 20 43 4f 4c 55 4d 4e 20 52 4f 57 49  ABLE COLUMN ROWI
f140: 44 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  D");.      retur
f150: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
f160: 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63   }..    if( objc
f170: 3d 3d 28 36 2b 69 73 52 65 61 64 6f 6e 6c 79 29  ==(6+isReadonly)
f180: 20 29 7b 0a 20 20 20 20 20 20 7a 44 62 20 3d 20   ){.      zDb = 
f190: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
f1a0: 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  jv[2]);.    }.  
f1b0: 20 20 7a 54 61 62 6c 65 20 3d 20 54 63 6c 5f 47    zTable = Tcl_G
f1c0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 6f 62  etString(objv[ob
f1d0: 6a 63 2d 33 5d 29 3b 0a 20 20 20 20 7a 43 6f 6c  jc-3]);.    zCol
f1e0: 75 6d 6e 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  umn = Tcl_GetStr
f1f0: 69 6e 67 28 6f 62 6a 76 5b 6f 62 6a 63 2d 32 5d  ing(objv[objc-2]
f200: 29 3b 0a 20 20 20 20 72 63 20 3d 20 54 63 6c 5f  );.    rc = Tcl_
f210: 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62  GetWideIntFromOb
f220: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 6f  j(interp, objv[o
f230: 62 6a 63 2d 31 5d 2c 20 26 69 52 6f 77 29 3b 0a  bjc-1], &iRow);.
f240: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c  .    if( rc==TCL
f250: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
f260: 3d 20 63 72 65 61 74 65 49 6e 63 72 62 6c 6f 62  = createIncrblob
f270: 43 68 61 6e 6e 65 6c 28 0a 20 20 20 20 20 20 20  Channel(.       
f280: 20 20 20 69 6e 74 65 72 70 2c 20 70 44 62 2c 20     interp, pDb, 
f290: 7a 44 62 2c 20 7a 54 61 62 6c 65 2c 20 7a 43 6f  zDb, zTable, zCo
f2a0: 6c 75 6d 6e 2c 20 69 52 6f 77 2c 20 69 73 52 65  lumn, iRow, isRe
f2b0: 61 64 6f 6e 6c 79 0a 20 20 20 20 20 20 29 3b 0a  adonly.      );.
f2c0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
f2d0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
f2e0: 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 69  *.  **     $db i
f2f0: 6e 74 65 72 72 75 70 74 0a 20 20 2a 2a 0a 20 20  nterrupt.  **.  
f300: 2a 2a 20 49 6e 74 65 72 72 75 70 74 20 74 68 65  ** Interrupt the
f310: 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68   execution of th
f320: 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 53 51 4c  e inner-most SQL
f330: 20 69 6e 74 65 72 70 72 65 74 65 72 2e 20 20 54   interpreter.  T
f340: 68 69 73 0a 20 20 2a 2a 20 63 61 75 73 65 73 20  his.  ** causes 
f350: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
f360: 74 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65  t to return an e
f370: 72 72 6f 72 20 6f 66 20 53 51 4c 49 54 45 5f 49  rror of SQLITE_I
f380: 4e 54 45 52 52 55 50 54 2e 0a 20 20 2a 2f 0a 20  NTERRUPT..  */. 
f390: 20 63 61 73 65 20 44 42 5f 49 4e 54 45 52 52 55   case DB_INTERRU
f3a0: 50 54 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  PT: {.    sqlite
f3b0: 33 5f 69 6e 74 65 72 72 75 70 74 28 70 44 62 2d  3_interrupt(pDb-
f3c0: 3e 64 62 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  >db);.    break;
f3d0: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
f3e0: 20 20 20 20 24 64 62 20 6e 75 6c 6c 76 61 6c 75      $db nullvalu
f3f0: 65 20 3f 53 54 52 49 4e 47 3f 0a 20 20 2a 2a 0a  e ?STRING?.  **.
f400: 20 20 2a 2a 20 43 68 61 6e 67 65 20 74 65 78 74    ** Change text
f410: 20 75 73 65 64 20 77 68 65 6e 20 61 20 4e 55 4c   used when a NUL
f420: 4c 20 63 6f 6d 65 73 20 62 61 63 6b 20 66 72 6f  L comes back fro
f430: 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
f440: 49 66 20 3f 53 54 52 49 4e 47 3f 0a 20 20 2a 2a  If ?STRING?.  **
f450: 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c   is not present,
f460: 20 74 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e   then the curren
f470: 74 20 73 74 72 69 6e 67 20 75 73 65 64 20 66 6f  t string used fo
f480: 72 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  r NULL is return
f490: 65 64 2e 0a 20 20 2a 2a 20 49 66 20 53 54 52 49  ed..  ** If STRI
f4a0: 4e 47 20 69 73 20 70 72 65 73 65 6e 74 2c 20 74  NG is present, t
f4b0: 68 65 6e 20 53 54 52 49 4e 47 20 69 73 20 72 65  hen STRING is re
f4c0: 74 75 72 6e 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  turned..  **.  *
f4d0: 2f 0a 20 20 63 61 73 65 20 44 42 5f 4e 55 4c 4c  /.  case DB_NULL
f4e0: 56 41 4c 55 45 3a 20 7b 0a 20 20 20 20 69 66 28  VALUE: {.    if(
f4f0: 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63   objc!=2 && objc
f500: 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=3 ){.      Tcl
f510: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
f520: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
f530: 4e 55 4c 4c 56 41 4c 55 45 22 29 3b 0a 20 20 20  NULLVALUE");.   
f540: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
f550: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
f560: 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20  f( objc==3 ){.  
f570: 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
f580: 20 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c 20 3d     char *zNull =
f590: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
f5a0: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26  omObj(objv[2], &
f5b0: 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  len);.      if( 
f5c0: 70 44 62 2d 3e 7a 4e 75 6c 6c 20 29 7b 0a 20 20  pDb->zNull ){.  
f5d0: 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70        Tcl_Free(p
f5e0: 44 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20  Db->zNull);.    
f5f0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 4e    }.      if( zN
f600: 75 6c 6c 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a  ull && len>0 ){.
f610: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75          pDb->zNu
f620: 6c 6c 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20  ll = Tcl_Alloc( 
f630: 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20  len + 1 );.     
f640: 20 20 20 73 74 72 6e 63 70 79 28 70 44 62 2d 3e     strncpy(pDb->
f650: 7a 4e 75 6c 6c 2c 20 7a 4e 75 6c 6c 2c 20 6c 65  zNull, zNull, le
f660: 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  n);.        pDb-
f670: 3e 7a 4e 75 6c 6c 5b 6c 65 6e 5d 20 3d 20 27 5c  >zNull[len] = '\
f680: 30 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  0';.      }else{
f690: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e  .        pDb->zN
f6a0: 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ull = 0;.      }
f6b0: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 53  .    }.    Tcl_S
f6c0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
f6d0: 72 70 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a 28  rp, dbTextToObj(
f6e0: 70 44 62 2d 3e 7a 4e 75 6c 6c 29 29 3b 0a 20 20  pDb->zNull));.  
f6f0: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
f700: 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20  /*.  **     $db 
f710: 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
f720: 64 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74  d .  **.  ** Ret
f730: 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77  urn an integer w
f740: 68 69 63 68 20 69 73 20 74 68 65 20 52 4f 57 49  hich is the ROWI
f750: 44 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72  D for the most r
f760: 65 63 65 6e 74 20 69 6e 73 65 72 74 2e 0a 20 20  ecent insert..  
f770: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 4c 41 53  */.  case DB_LAS
f780: 54 5f 49 4e 53 45 52 54 5f 52 4f 57 49 44 3a 20  T_INSERT_ROWID: 
f790: 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  {.    Tcl_Obj *p
f7a0: 52 65 73 75 6c 74 3b 0a 20 20 20 20 54 63 6c 5f  Result;.    Tcl_
f7b0: 57 69 64 65 49 6e 74 20 72 6f 77 69 64 3b 0a 20  WideInt rowid;. 
f7c0: 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29     if( objc!=2 )
f7d0: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
f7e0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
f7f0: 20 32 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20   2, objv, "");. 
f800: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
f810: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
f820: 20 72 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33   rowid = sqlite3
f830: 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  _last_insert_row
f840: 69 64 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20 20  id(pDb->db);.   
f850: 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47   pResult = Tcl_G
f860: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
f870: 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  rp);.    Tcl_Set
f880: 57 69 64 65 49 6e 74 4f 62 6a 28 70 52 65 73 75  WideIntObj(pResu
f890: 6c 74 2c 20 72 6f 77 69 64 29 3b 0a 20 20 20 20  lt, rowid);.    
f8a0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
f8b0: 0a 20 20 2a 2a 20 54 68 65 20 44 42 5f 4f 4e 45  .  ** The DB_ONE
f8c0: 43 4f 4c 55 4d 4e 20 6d 65 74 68 6f 64 20 69 73  COLUMN method is
f8d0: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 74 6f 67   implemented tog
f8e0: 65 74 68 65 72 20 77 69 74 68 20 44 42 5f 45 56  ether with DB_EV
f8f0: 41 4c 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 20  AL..  */..  /*  
f900: 20 20 24 64 62 20 70 72 6f 67 72 65 73 73 20 3f    $db progress ?
f910: 4e 20 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a  N CALLBACK?.  **
f920: 20 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68   .  ** Invoke th
f930: 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b  e given callback
f940: 20 65 76 65 72 79 20 4e 20 76 69 72 74 75 61 6c   every N virtual
f950: 20 6d 61 63 68 69 6e 65 20 6f 70 63 6f 64 65 73   machine opcodes
f960: 20 77 68 69 6c 65 20 65 78 65 63 75 74 69 6e 67   while executing
f970: 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20  .  ** queries.. 
f980: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 50 52   */.  case DB_PR
f990: 4f 47 52 45 53 53 3a 20 7b 0a 20 20 20 20 69 66  OGRESS: {.    if
f9a0: 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20  ( objc==2 ){.   
f9b0: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f     if( pDb->zPro
f9c0: 67 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20  gress ){.       
f9d0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
f9e0: 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a  t(interp, pDb->z
f9f0: 50 72 6f 67 72 65 73 73 2c 20 30 29 3b 0a 20 20  Progress, 0);.  
fa00: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
fa10: 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20  if( objc==4 ){. 
fa20: 20 20 20 20 20 63 68 61 72 20 2a 7a 50 72 6f 67       char *zProg
fa30: 72 65 73 73 3b 0a 20 20 20 20 20 20 69 6e 74 20  ress;.      int 
fa40: 6c 65 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 4e  len;.      int N
fa50: 3b 0a 20 20 20 20 20 20 69 66 28 20 54 43 4c 5f  ;.      if( TCL_
fa60: 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72  OK!=Tcl_GetIntFr
fa70: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
fa80: 6a 76 5b 32 5d 2c 20 26 4e 29 20 29 7b 0a 20 20  jv[2], &N) ){.  
fa90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
faa0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 3b  _ERROR;.      };
fab0: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
fac0: 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20  zProgress ){.   
fad0: 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44       Tcl_Free(pD
fae0: 62 2d 3e 7a 50 72 6f 67 72 65 73 73 29 3b 0a 20  b->zProgress);. 
faf0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 50 72       }.      zPr
fb00: 6f 67 72 65 73 73 20 3d 20 54 63 6c 5f 47 65 74  ogress = Tcl_Get
fb10: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
fb20: 6a 76 5b 33 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20  jv[3], &len);.  
fb30: 20 20 20 20 69 66 28 20 7a 50 72 6f 67 72 65 73      if( zProgres
fb40: 73 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20  s && len>0 ){.  
fb50: 20 20 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f 67        pDb->zProg
fb60: 72 65 73 73 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63  ress = Tcl_Alloc
fb70: 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20  ( len + 1 );.   
fb80: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d       memcpy(pDb-
fb90: 3e 7a 50 72 6f 67 72 65 73 73 2c 20 7a 50 72 6f  >zProgress, zPro
fba0: 67 72 65 73 73 2c 20 6c 65 6e 2b 31 29 3b 0a 20  gress, len+1);. 
fbb0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
fbc0: 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65      pDb->zProgre
fbd0: 73 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ss = 0;.      }.
fbe0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
fbf0: 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c  MIT_PROGRESS_CAL
fc00: 4c 42 41 43 4b 0a 20 20 20 20 20 20 69 66 28 20  LBACK.      if( 
fc10: 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29  pDb->zProgress )
fc20: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69  {.        pDb->i
fc30: 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a  nterp = interp;.
fc40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
fc50: 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72  progress_handler
fc60: 28 70 44 62 2d 3e 64 62 2c 20 4e 2c 20 44 62 50  (pDb->db, N, DbP
fc70: 72 6f 67 72 65 73 73 48 61 6e 64 6c 65 72 2c 20  rogressHandler, 
fc80: 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  pDb);.      }els
fc90: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
fca0: 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64  e3_progress_hand
fcb0: 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20  ler(pDb->db, 0, 
fcc0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23  0, 0);.      }.#
fcd0: 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
fce0: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
fcf0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
fd00: 32 2c 20 6f 62 6a 76 2c 20 22 4e 20 43 41 4c 4c  2, objv, "N CALL
fd10: 42 41 43 4b 22 29 3b 0a 20 20 20 20 20 20 72 65  BACK");.      re
fd20: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
fd30: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
fd40: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
fd50: 62 20 70 72 6f 66 69 6c 65 20 3f 43 41 4c 4c 42  b profile ?CALLB
fd60: 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d  ACK?.  **.  ** M
fd70: 61 6b 65 20 61 72 72 61 6e 67 65 6d 65 6e 74 73  ake arrangements
fd80: 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 43   to invoke the C
fd90: 41 4c 4c 42 41 43 4b 20 72 6f 75 74 69 6e 65 20  ALLBACK routine 
fda0: 61 66 74 65 72 20 65 61 63 68 20 53 51 4c 20 73  after each SQL s
fdb0: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68  tatement.  ** th
fdc0: 61 74 20 68 61 73 20 72 75 6e 2e 20 20 54 68 65  at has run.  The
fdd0: 20 74 65 78 74 20 6f 66 20 74 68 65 20 53 51 4c   text of the SQL
fde0: 20 61 6e 64 20 74 68 65 20 61 6d 6f 75 6e 74 20   and the amount 
fdf0: 6f 66 20 65 6c 61 70 73 65 20 74 69 6d 65 20 61  of elapse time a
fe00: 72 65 0a 20 20 2a 2a 20 61 70 70 65 6e 64 65 64  re.  ** appended
fe10: 20 74 6f 20 43 41 4c 4c 42 41 43 4b 20 62 65 66   to CALLBACK bef
fe20: 6f 72 65 20 74 68 65 20 73 63 72 69 70 74 20 69  ore the script i
fe30: 73 20 72 75 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61  s run..  */.  ca
fe40: 73 65 20 44 42 5f 50 52 4f 46 49 4c 45 3a 20 7b  se DB_PROFILE: {
fe50: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20  .    if( objc>3 
fe60: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
fe70: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
fe80: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c  , 2, objv, "?CAL
fe90: 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20  LBACK?");.      
fea0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
feb0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
fec0: 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20  objc==2 ){.     
fed0: 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69   if( pDb->zProfi
fee0: 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  le ){.        Tc
fef0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
ff00: 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f  nterp, pDb->zPro
ff10: 66 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  file, 0);.      
ff20: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
ff30: 20 20 20 63 68 61 72 20 2a 7a 50 72 6f 66 69 6c     char *zProfil
ff40: 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  e;.      int len
ff50: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ;.      if( pDb-
ff60: 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20  >zProfile ){.   
ff70: 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44       Tcl_Free(pD
ff80: 62 2d 3e 7a 50 72 6f 66 69 6c 65 29 3b 0a 20 20  b->zProfile);.  
ff90: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 50 72 6f      }.      zPro
ffa0: 66 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  file = Tcl_GetSt
ffb0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
ffc0: 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20  [2], &len);.    
ffd0: 20 20 69 66 28 20 7a 50 72 6f 66 69 6c 65 20 26    if( zProfile &
ffe0: 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20  & len>0 ){.     
fff0: 20 20 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65     pDb->zProfile
10000 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65   = Tcl_Alloc( le
10010 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20  n + 1 );.       
10020 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 50 72   memcpy(pDb->zPr
10030 6f 66 69 6c 65 2c 20 7a 50 72 6f 66 69 6c 65 2c  ofile, zProfile,
10040 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d   len+1);.      }
10050 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44  else{.        pD
10060 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 3d 20 30 3b  b->zProfile = 0;
10070 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  .      }.#ifndef
10080 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
10090 43 45 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  CE.      if( pDb
100a0 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20  ->zProfile ){.  
100b0 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72        pDb->inter
100c0 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20  p = interp;.    
100d0 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 66      sqlite3_prof
100e0 69 6c 65 28 70 44 62 2d 3e 64 62 2c 20 44 62 50  ile(pDb->db, DbP
100f0 72 6f 66 69 6c 65 48 61 6e 64 6c 65 72 2c 20 70  rofileHandler, p
10100 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Db);.      }else
10110 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
10120 33 5f 70 72 6f 66 69 6c 65 28 70 44 62 2d 3e 64  3_profile(pDb->d
10130 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  b, 0, 0);.      
10140 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
10150 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
10160 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62   /*.  **     $db
10170 20 72 65 6b 65 79 20 4b 45 59 0a 20 20 2a 2a 0a   rekey KEY.  **.
10180 20 20 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20    ** Change the 
10190 65 6e 63 72 79 70 74 69 6f 6e 20 6b 65 79 20 6f  encryption key o
101a0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20  n the currently 
101b0 6f 70 65 6e 20 64 61 74 61 62 61 73 65 2e 0a 20  open database.. 
101c0 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 52 45   */.  case DB_RE
101d0 4b 45 59 3a 20 7b 0a 20 20 20 20 69 6e 74 20 6e  KEY: {.    int n
101e0 4b 65 79 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70  Key;.    void *p
101f0 4b 65 79 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a  Key;.    if( obj
10200 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=3 ){.      Tc
10210 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
10220 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
10230 22 4b 45 59 22 29 3b 0a 20 20 20 20 20 20 72 65  "KEY");.      re
10240 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
10250 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 20 3d      }.    pKey =
10260 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61   Tcl_GetByteArra
10270 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  yFromObj(objv[2]
10280 2c 20 26 6e 4b 65 79 29 3b 0a 23 69 66 64 65 66  , &nKey);.#ifdef
10290 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
102a0 43 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  C.    rc = sqlit
102b0 65 33 5f 72 65 6b 65 79 28 70 44 62 2d 3e 64 62  e3_rekey(pDb->db
102c0 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20  , pKey, nKey);. 
102d0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
102e0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
102f0 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69  ult(interp, sqli
10300 74 65 33 45 72 72 53 74 72 28 72 63 29 2c 20 30  te3ErrStr(rc), 0
10310 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43  );.      rc = TC
10320 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23  L_ERROR;.    }.#
10330 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b  endif.    break;
10340 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
10350 20 20 20 20 24 64 62 20 74 69 6d 65 6f 75 74 20      $db timeout 
10360 4d 49 4c 4c 45 53 45 43 4f 4e 44 53 0a 20 20 2a  MILLESECONDS.  *
10370 2a 0a 20 20 2a 2a 20 44 65 6c 61 79 20 66 6f 72  *.  ** Delay for
10380 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d   the number of m
10390 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 70 65 63  illiseconds spec
103a0 69 66 69 65 64 20 77 68 65 6e 20 61 20 66 69 6c  ified when a fil
103b0 65 20 69 73 20 6c 6f 63 6b 65 64 2e 0a 20 20 2a  e is locked..  *
103c0 2f 0a 20 20 63 61 73 65 20 44 42 5f 54 49 4d 45  /.  case DB_TIME
103d0 4f 55 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20 6d  OUT: {.    int m
103e0 73 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  s;.    if( objc!
103f0 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =3 ){.      Tcl_
10400 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
10410 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4d  erp, 2, objv, "M
10420 49 4c 4c 49 53 45 43 4f 4e 44 53 22 29 3b 0a 20  ILLISECONDS");. 
10430 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
10440 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
10450 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
10460 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
10470 62 6a 76 5b 32 5d 2c 20 26 6d 73 29 20 29 20 72  bjv[2], &ms) ) r
10480 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10490 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73  .    sqlite3_bus
104a0 79 5f 74 69 6d 65 6f 75 74 28 70 44 62 2d 3e 64  y_timeout(pDb->d
104b0 62 2c 20 6d 73 29 3b 0a 20 20 20 20 62 72 65 61  b, ms);.    brea
104c0 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 0a 20  k;.  }.  .  /*. 
104d0 20 2a 2a 20 20 20 20 20 24 64 62 20 74 6f 74 61   **     $db tota
104e0 6c 5f 63 68 61 6e 67 65 73 0a 20 20 2a 2a 0a 20  l_changes.  **. 
104f0 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e   ** Return the n
10500 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
10510 61 74 20 77 65 72 65 20 6d 6f 64 69 66 69 65 64  at were modified
10520 2c 20 69 6e 73 65 72 74 65 64 2c 20 6f 72 20 64  , inserted, or d
10530 65 6c 65 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e  eleted .  ** sin
10540 63 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ce the database 
10550 68 61 6e 64 6c 65 20 77 61 73 20 63 72 65 61 74  handle was creat
10560 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ed..  */.  case 
10570 44 42 5f 54 4f 54 41 4c 5f 43 48 41 4e 47 45 53  DB_TOTAL_CHANGES
10580 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  : {.    Tcl_Obj 
10590 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 66  *pResult;.    if
105a0 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
105b0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
105c0 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
105d0 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 20 20  bjv, "");.      
105e0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
105f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 52 65 73  ;.    }.    pRes
10600 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a  ult = Tcl_GetObj
10610 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
10620 20 20 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62      Tcl_SetIntOb
10630 6a 28 70 52 65 73 75 6c 74 2c 20 73 71 6c 69 74  j(pResult, sqlit
10640 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73  e3_total_changes
10650 28 70 44 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20  (pDb->db));.    
10660 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
10670 20 20 20 20 24 64 62 20 74 72 61 63 65 20 3f 43      $db trace ?C
10680 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20  ALLBACK?.  **.  
10690 2a 2a 20 4d 61 6b 65 20 61 72 72 61 6e 67 65 6d  ** Make arrangem
106a0 65 6e 74 73 20 74 6f 20 69 6e 76 6f 6b 65 20 74  ents to invoke t
106b0 68 65 20 43 41 4c 4c 42 41 43 4b 20 72 6f 75 74  he CALLBACK rout
106c0 69 6e 65 20 66 6f 72 20 65 61 63 68 20 53 51 4c  ine for each SQL
106d0 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
106e0 74 68 61 74 20 69 73 20 65 78 65 63 75 74 65 64  that is executed
106f0 2e 20 20 54 68 65 20 74 65 78 74 20 6f 66 20 74  .  The text of t
10700 68 65 20 53 51 4c 20 69 73 20 61 70 70 65 6e 64  he SQL is append
10710 65 64 20 74 6f 20 43 41 4c 4c 42 41 43 4b 20 62  ed to CALLBACK b
10720 65 66 6f 72 65 0a 20 20 2a 2a 20 69 74 20 69 73  efore.  ** it is
10730 20 65 78 65 63 75 74 65 64 2e 0a 20 20 2a 2f 0a   executed..  */.
10740 20 20 63 61 73 65 20 44 42 5f 54 52 41 43 45 3a    case DB_TRACE:
10750 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e   {.    if( objc>
10760 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
10770 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
10780 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43  rp, 2, objv, "?C
10790 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20  ALLBACK?");.    
107a0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
107b0 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  OR;.    }else if
107c0 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20  ( objc==2 ){.   
107d0 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61     if( pDb->zTra
107e0 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  ce ){.        Tc
107f0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
10800 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 54 72 61  nterp, pDb->zTra
10810 63 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ce, 0);.      }.
10820 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10830 20 63 68 61 72 20 2a 7a 54 72 61 63 65 3b 0a 20   char *zTrace;. 
10840 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20       int len;.  
10850 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72      if( pDb->zTr
10860 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54  ace ){.        T
10870 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 54 72  cl_Free(pDb->zTr
10880 61 63 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ace);.      }.  
10890 20 20 20 20 7a 54 72 61 63 65 20 3d 20 54 63 6c      zTrace = Tcl
108a0 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
108b0 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29  j(objv[2], &len)
108c0 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 54 72 61  ;.      if( zTra
108d0 63 65 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20  ce && len>0 ){. 
108e0 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 54 72 61         pDb->zTra
108f0 63 65 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20  ce = Tcl_Alloc( 
10900 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20  len + 1 );.     
10910 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a     memcpy(pDb->z
10920 54 72 61 63 65 2c 20 7a 54 72 61 63 65 2c 20 6c  Trace, zTrace, l
10930 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  en+1);.      }el
10940 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  se{.        pDb-
10950 3e 7a 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 20  >zTrace = 0;.   
10960 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
10970 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20  ITE_OMIT_TRACE. 
10980 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54       if( pDb->zT
10990 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  race ){.        
109a0 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e  pDb->interp = in
109b0 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71  terp;.        sq
109c0 6c 69 74 65 33 5f 74 72 61 63 65 28 70 44 62 2d  lite3_trace(pDb-
109d0 3e 64 62 2c 20 44 62 54 72 61 63 65 48 61 6e 64  >db, DbTraceHand
109e0 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20  ler, pDb);.     
109f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
10a00 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28 70 44  sqlite3_trace(pD
10a10 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  b->db, 0, 0);.  
10a20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
10a30 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
10a40 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 74  }..  /*    $db t
10a50 72 61 6e 73 61 63 74 69 6f 6e 20 5b 2d 64 65 66  ransaction [-def
10a60 65 72 72 65 64 7c 2d 69 6d 6d 65 64 69 61 74 65  erred|-immediate
10a70 7c 2d 65 78 63 6c 75 73 69 76 65 5d 20 53 43 52  |-exclusive] SCR
10a80 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 74  IPT.  **.  ** St
10a90 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61  art a new transa
10aa0 63 74 69 6f 6e 20 28 69 66 20 77 65 20 61 72 65  ction (if we are
10ab0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20   not already in 
10ac0 74 68 65 20 6d 69 64 73 74 20 6f 66 20 61 0a 20  the midst of a. 
10ad0 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 29   ** transaction)
10ae0 20 61 6e 64 20 65 78 65 63 75 74 65 20 74 68 65   and execute the
10af0 20 54 43 4c 20 73 63 72 69 70 74 20 53 43 52 49   TCL script SCRI
10b00 50 54 2e 20 20 41 66 74 65 72 20 53 43 52 49 50  PT.  After SCRIP
10b10 54 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 73  T.  ** completes
10b20 2c 20 65 69 74 68 65 72 20 63 6f 6d 6d 69 74 20  , either commit 
10b30 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
10b40 6f 72 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20  or roll it back 
10b50 69 66 20 53 43 52 49 50 54 0a 20 20 2a 2a 20 74  if SCRIPT.  ** t
10b60 68 72 6f 77 73 20 61 6e 20 65 78 63 65 70 74 69  hrows an excepti
10b70 6f 6e 2e 20 20 4f 72 20 69 66 20 6e 6f 20 6e 65  on.  Or if no ne
10b80 77 20 74 72 61 6e 73 61 74 69 6f 6e 20 77 61 73  w transation was
10b90 20 73 74 61 72 74 65 64 2c 20 64 6f 20 6e 6f 74   started, do not
10ba0 68 69 6e 67 2e 0a 20 20 2a 2a 20 70 61 73 73 20  hing..  ** pass 
10bb0 74 68 65 20 65 78 63 65 70 74 69 6f 6e 20 6f 6e  the exception on
10bc0 20 75 70 20 74 68 65 20 73 74 61 63 6b 2e 0a 20   up the stack.. 
10bd0 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63 6f   **.  ** This co
10be0 6d 6d 61 6e 64 20 77 61 73 20 69 6e 73 70 69 72  mmand was inspir
10bf0 65 64 20 62 79 20 44 61 76 65 20 54 68 6f 6d 61  ed by Dave Thoma
10c00 73 27 73 20 74 61 6c 6b 20 6f 6e 20 52 75 62 79  s's talk on Ruby
10c10 20 61 74 20 74 68 65 0a 20 20 2a 2a 20 32 30 30   at the.  ** 200
10c20 35 20 4f 27 52 65 69 6c 6c 79 20 4f 70 65 6e 20  5 O'Reilly Open 
10c30 53 6f 75 72 63 65 20 43 6f 6e 76 65 6e 74 69 6f  Source Conventio
10c40 6e 20 28 4f 53 43 4f 4e 29 2e 0a 20 20 2a 2f 0a  n (OSCON)..  */.
10c50 20 20 63 61 73 65 20 44 42 5f 54 52 41 4e 53 41    case DB_TRANSA
10c60 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 69 6e 74  CTION: {.    int
10c70 20 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 54 63   inTrans;.    Tc
10c80 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 0a  l_Obj *pScript;.
10c90 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
10ca0 7a 42 65 67 69 6e 20 3d 20 22 42 45 47 49 4e 22  zBegin = "BEGIN"
10cb0 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
10cc0 33 20 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a  3 && objc!=4 ){.
10cd0 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
10ce0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
10cf0 2c 20 6f 62 6a 76 2c 20 22 5b 54 59 50 45 5d 20  , objv, "[TYPE] 
10d00 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20  SCRIPT");.      
10d10 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
10d20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
10d30 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20  objc==3 ){.     
10d40 20 70 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b   pScript = objv[
10d50 32 5d 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  2];.    } else {
10d60 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
10d70 6e 73 74 20 63 68 61 72 20 2a 54 54 59 50 45 5f  nst char *TTYPE_
10d80 73 74 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  strs[] = {.     
10d90 20 20 20 22 64 65 66 65 72 72 65 64 22 2c 20 20     "deferred",  
10da0 20 22 65 78 63 6c 75 73 69 76 65 22 2c 20 20 22   "exclusive",  "
10db0 69 6d 6d 65 64 69 61 74 65 22 2c 20 30 0a 20 20  immediate", 0.  
10dc0 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 65 6e 75      };.      enu
10dd0 6d 20 54 54 59 50 45 5f 65 6e 75 6d 20 7b 0a 20  m TTYPE_enum {. 
10de0 20 20 20 20 20 20 20 54 54 59 50 45 5f 44 45 46         TTYPE_DEF
10df0 45 52 52 45 44 2c 20 54 54 59 50 45 5f 45 58 43  ERRED, TTYPE_EXC
10e00 4c 55 53 49 56 45 2c 20 54 54 59 50 45 5f 49 4d  LUSIVE, TTYPE_IM
10e10 4d 45 44 49 41 54 45 0a 20 20 20 20 20 20 7d 3b  MEDIATE.      };
10e20 0a 20 20 20 20 20 20 69 6e 74 20 74 74 79 70 65  .      int ttype
10e30 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f  ;.      if( Tcl_
10e40 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28  GetIndexFromObj(
10e50 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
10e60 20 54 54 59 50 45 5f 73 74 72 73 2c 20 22 74 72   TTYPE_strs, "tr
10e70 61 6e 73 61 63 74 69 6f 6e 20 74 79 70 65 22 2c  ansaction type",
10e80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
10ea0 2c 20 26 74 74 79 70 65 29 20 29 7b 0a 20 20 20  , &ttype) ){.   
10eb0 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
10ec0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
10ed0 20 20 20 20 20 73 77 69 74 63 68 28 20 28 65 6e       switch( (en
10ee0 75 6d 20 54 54 59 50 45 5f 65 6e 75 6d 29 74 74  um TTYPE_enum)tt
10ef0 79 70 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ype ){.        c
10f00 61 73 65 20 54 54 59 50 45 5f 44 45 46 45 52 52  ase TTYPE_DEFERR
10f10 45 44 3a 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20  ED:    /* no-op 
10f20 2a 2f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  */;             
10f30 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
10f40 20 20 20 63 61 73 65 20 54 54 59 50 45 5f 45 58     case TTYPE_EX
10f50 43 4c 55 53 49 56 45 3a 20 20 20 7a 42 65 67 69  CLUSIVE:   zBegi
10f60 6e 20 3d 20 22 42 45 47 49 4e 20 45 58 43 4c 55  n = "BEGIN EXCLU
10f70 53 49 56 45 22 3b 20 20 62 72 65 61 6b 3b 0a 20  SIVE";  break;. 
10f80 20 20 20 20 20 20 20 63 61 73 65 20 54 54 59 50         case TTYP
10f90 45 5f 49 4d 4d 45 44 49 41 54 45 3a 20 20 20 7a  E_IMMEDIATE:   z
10fa0 42 65 67 69 6e 20 3d 20 22 42 45 47 49 4e 20 49  Begin = "BEGIN I
10fb0 4d 4d 45 44 49 41 54 45 22 3b 20 20 62 72 65 61  MMEDIATE";  brea
10fc0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
10fd0 20 70 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b   pScript = objv[
10fe0 33 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e  3];.    }.    in
10ff0 54 72 61 6e 73 20 3d 20 21 73 71 6c 69 74 65 33  Trans = !sqlite3
11000 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28  _get_autocommit(
11010 70 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20 69 66  pDb->db);.    if
11020 28 20 21 69 6e 54 72 61 6e 73 20 29 7b 0a 20 20  ( !inTrans ){.  
11030 20 20 20 20 70 44 62 2d 3e 64 69 73 61 62 6c 65      pDb->disable
11040 41 75 74 68 2b 2b 3b 0a 20 20 20 20 20 20 28 76  Auth++;.      (v
11050 6f 69 64 29 73 71 6c 69 74 65 33 5f 65 78 65 63  oid)sqlite3_exec
11060 28 70 44 62 2d 3e 64 62 2c 20 7a 42 65 67 69 6e  (pDb->db, zBegin
11070 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
11080 20 20 70 44 62 2d 3e 64 69 73 61 62 6c 65 41 75    pDb->disableAu
11090 74 68 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  th--;.    }.    
110a0 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  rc = Tcl_EvalObj
110b0 45 78 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69  Ex(interp, pScri
110c0 70 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  pt, 0);.    if( 
110d0 21 69 6e 54 72 61 6e 73 20 29 7b 0a 20 20 20 20  !inTrans ){.    
110e0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
110f0 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  nd;.      if( rc
11100 3d 3d 54 43 4c 5f 45 52 52 4f 52 20 29 7b 0a 20  ==TCL_ERROR ){. 
11110 20 20 20 20 20 20 20 7a 45 6e 64 20 3d 20 22 52         zEnd = "R
11120 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20 20  OLLBACK";.      
11130 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
11140 20 7a 45 6e 64 20 3d 20 22 43 4f 4d 4d 49 54 22   zEnd = "COMMIT"
11150 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11160 70 44 62 2d 3e 64 69 73 61 62 6c 65 41 75 74 68  pDb->disableAuth
11170 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  ++;.      if( sq
11180 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e  lite3_exec(pDb->
11190 64 62 2c 20 7a 45 6e 64 2c 20 30 2c 20 30 2c 20  db, zEnd, 0, 0, 
111a0 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  0) ){.        sq
111b0 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e  lite3_exec(pDb->
111c0 64 62 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20  db, "ROLLBACK", 
111d0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
111e0 7d 0a 20 20 20 20 20 20 70 44 62 2d 3e 64 69 73  }.      pDb->dis
111f0 61 62 6c 65 41 75 74 68 2d 2d 3b 0a 20 20 20 20  ableAuth--;.    
11200 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
11210 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24  ..  /*.  **    $
11220 64 62 20 75 70 64 61 74 65 5f 68 6f 6f 6b 20 3f  db update_hook ?
11230 73 63 72 69 70 74 3f 0a 20 20 2a 2a 20 20 20 20  script?.  **    
11240 24 64 62 20 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f  $db rollback_hoo
11250 6b 20 3f 73 63 72 69 70 74 3f 0a 20 20 2a 2f 0a  k ?script?.  */.
11260 20 20 63 61 73 65 20 44 42 5f 55 50 44 41 54 45    case DB_UPDATE
11270 5f 48 4f 4f 4b 3a 20 0a 20 20 63 61 73 65 20 44  _HOOK: .  case D
11280 42 5f 52 4f 4c 4c 42 41 43 4b 5f 48 4f 4f 4b 3a  B_ROLLBACK_HOOK:
11290 20 7b 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 70   {..    /* set p
112a0 70 48 6f 6f 6b 20 74 6f 20 70 6f 69 6e 74 20 61  pHook to point a
112b0 74 20 70 55 70 64 61 74 65 48 6f 6f 6b 20 6f 72  t pUpdateHook or
112c0 20 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 2c 20   pRollbackHook, 
112d0 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 0a 20 20  depending on .  
112e0 20 20 2a 2a 20 77 68 65 74 68 65 72 20 5b 24 64    ** whether [$d
112f0 62 20 75 70 64 61 74 65 5f 68 6f 6f 6b 5d 20 6f  b update_hook] o
11300 72 20 5b 24 64 62 20 72 6f 6c 6c 62 61 63 6b 5f  r [$db rollback_
11310 68 6f 6f 6b 5d 20 77 61 73 20 69 6e 76 6f 6b 65  hook] was invoke
11320 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 54 63  d..    */.    Tc
11330 6c 5f 4f 62 6a 20 2a 2a 70 70 48 6f 6f 6b 3b 20  l_Obj **ppHook; 
11340 0a 20 20 20 20 69 66 28 20 63 68 6f 69 63 65 3d  .    if( choice=
11350 3d 44 42 5f 55 50 44 41 54 45 5f 48 4f 4f 4b 20  =DB_UPDATE_HOOK 
11360 29 7b 0a 20 20 20 20 20 20 70 70 48 6f 6f 6b 20  ){.      ppHook 
11370 3d 20 26 70 44 62 2d 3e 70 55 70 64 61 74 65 48  = &pDb->pUpdateH
11380 6f 6f 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ook;.    }else{.
11390 20 20 20 20 20 20 70 70 48 6f 6f 6b 20 3d 20 26        ppHook = &
113a0 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f  pDb->pRollbackHo
113b0 6f 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ok;.    }..    i
113c0 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62  f( objc!=2 && ob
113d0 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20  jc!=3 ){.       
113e0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
113f0 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
11400 2c 20 22 3f 53 43 52 49 50 54 3f 22 29 3b 0a 20  , "?SCRIPT?");. 
11410 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
11420 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
11430 20 20 69 66 28 20 2a 70 70 48 6f 6f 6b 20 29 7b    if( *ppHook ){
11440 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  .      Tcl_SetOb
11450 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
11460 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20 20 20  *ppHook);.      
11470 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20  if( objc==3 ){. 
11480 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52         Tcl_DecrR
11490 65 66 43 6f 75 6e 74 28 2a 70 70 48 6f 6f 6b 29  efCount(*ppHook)
114a0 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 48 6f 6f  ;.        *ppHoo
114b0 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  k = 0;.      }. 
114c0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a     }.    if( obj
114d0 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 61 73  c==3 ){.      as
114e0 73 65 72 74 28 20 21 28 2a 70 70 48 6f 6f 6b 29  sert( !(*ppHook)
114f0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63   );.      if( Tc
11500 6c 5f 47 65 74 43 68 61 72 4c 65 6e 67 74 68 28  l_GetCharLength(
11510 6f 62 6a 76 5b 32 5d 29 3e 30 20 29 7b 0a 20 20  objv[2])>0 ){.  
11520 20 20 20 20 20 20 2a 70 70 48 6f 6f 6b 20 3d 20        *ppHook = 
11530 6f 62 6a 76 5b 32 5d 3b 0a 20 20 20 20 20 20 20  objv[2];.       
11540 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
11550 74 28 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20  t(*ppHook);.    
11560 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73    }.    }..    s
11570 71 6c 69 74 65 33 5f 75 70 64 61 74 65 5f 68 6f  qlite3_update_ho
11580 6f 6b 28 70 44 62 2d 3e 64 62 2c 20 28 70 44 62  ok(pDb->db, (pDb
11590 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 3f 44 62  ->pUpdateHook?Db
115a0 55 70 64 61 74 65 48 61 6e 64 6c 65 72 3a 30 29  UpdateHandler:0)
115b0 2c 20 70 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , pDb);.    sqli
115c0 74 65 33 5f 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f  te3_rollback_hoo
115d0 6b 28 70 44 62 2d 3e 64 62 2c 28 70 44 62 2d 3e  k(pDb->db,(pDb->
115e0 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3f 44 62  pRollbackHook?Db
115f0 52 6f 6c 6c 62 61 63 6b 48 61 6e 64 6c 65 72 3a  RollbackHandler:
11600 30 29 2c 70 44 62 29 3b 0a 0a 20 20 20 20 62 72  0),pDb);..    br
11610 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
11620 20 20 24 64 62 20 76 65 72 73 69 6f 6e 0a 20 20    $db version.  
11630 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74  **.  ** Return t
11640 68 65 20 76 65 72 73 69 6f 6e 20 73 74 72 69 6e  he version strin
11650 67 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62  g for this datab
11660 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ase..  */.  case
11670 20 44 42 5f 56 45 52 53 49 4f 4e 3a 20 7b 0a 20   DB_VERSION: {. 
11680 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
11690 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
116a0 29 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73  )sqlite3_libvers
116b0 69 6f 6e 28 29 2c 20 54 43 4c 5f 53 54 41 54 49  ion(), TCL_STATI
116c0 43 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  C);.    break;. 
116d0 20 7d 0a 0a 0a 20 20 7d 20 2f 2a 20 45 6e 64 20   }...  } /* End 
116e0 6f 66 20 74 68 65 20 53 57 49 54 43 48 20 73 74  of the SWITCH st
116f0 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 72 65 74  atement */.  ret
11700 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
11710 20 20 20 73 71 6c 69 74 65 33 20 44 42 4e 41 4d     sqlite3 DBNAM
11720 45 20 46 49 4c 45 4e 41 4d 45 20 3f 2d 76 66 73  E FILENAME ?-vfs
11730 20 56 46 53 4e 41 4d 45 3f 20 3f 2d 6b 65 79 20   VFSNAME? ?-key 
11740 4b 45 59 3f 20 3f 2d 72 65 61 64 6f 6e 6c 79 20  KEY? ?-readonly 
11750 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a 20 20 20 20 20  BOOLEAN?.**     
11760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11770 20 20 20 20 20 20 3f 2d 63 72 65 61 74 65 20 42        ?-create B
11780 4f 4f 4c 45 41 4e 3f 20 3f 2d 6e 6f 6d 75 74 65  OOLEAN? ?-nomute
11790 78 20 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a 0a 2a 2a  x BOOLEAN?.**.**
117a0 20 54 68 69 73 20 69 73 20 74 68 65 20 6d 61 69   This is the mai
117b0 6e 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 2e 20 20  n Tcl command.  
117c0 57 68 65 6e 20 74 68 65 20 22 73 71 6c 69 74 65  When the "sqlite
117d0 22 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 69 73  " Tcl command is
117e0 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2c 20 74 68 69  .** invoked, thi
117f0 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20 74  s routine runs t
11800 6f 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63  o process that c
11810 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  ommand..**.** Th
11820 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
11830 2c 20 44 42 4e 41 4d 45 2c 20 69 73 20 61 6e 20  , DBNAME, is an 
11840 61 72 62 69 74 72 61 72 79 20 6e 61 6d 65 20 66  arbitrary name f
11850 6f 72 20 61 20 6e 65 77 0a 2a 2a 20 64 61 74 61  or a new.** data
11860 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
11870 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 63    This command c
11880 72 65 61 74 65 73 20 61 20 6e 65 77 20 63 6f 6d  reates a new com
11890 6d 61 6e 64 20 6e 61 6d 65 64 0a 2a 2a 20 44 42  mand named.** DB
118a0 4e 41 4d 45 20 74 68 61 74 20 69 73 20 75 73 65  NAME that is use
118b0 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 61  d to control tha
118c0 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 54  t connection.  T
118d0 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63  he database.** c
118e0 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 64 65 6c  onnection is del
118f0 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 44 42  eted when the DB
11900 4e 41 4d 45 20 63 6f 6d 6d 61 6e 64 20 69 73 20  NAME command is 
11910 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  deleted..**.** T
11920 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
11930 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  nt is the name o
11940 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
11950 69 6c 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69  ile..**.*/.stati
11960 63 20 69 6e 74 20 44 62 4d 61 69 6e 28 76 6f 69  c int DbMain(voi
11970 64 20 2a 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72  d *cd, Tcl_Inter
11980 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
11990 62 6a 63 2c 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  bjc,Tcl_Obj *con
119a0 73 74 2a 6f 62 6a 76 29 7b 0a 20 20 53 71 6c 69  st*objv){.  Sqli
119b0 74 65 44 62 20 2a 70 3b 0a 20 20 76 6f 69 64 20  teDb *p;.  void 
119c0 2a 70 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74  *pKey = 0;.  int
119d0 20 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 63 6f 6e   nKey = 0;.  con
119e0 73 74 20 63 68 61 72 20 2a 7a 41 72 67 3b 0a 20  st char *zArg;. 
119f0 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 3b 0a   char *zErrMsg;.
11a00 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74    int i;.  const
11a10 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20   char *zFile;.  
11a20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73  const char *zVfs
11a30 20 3d 20 30 3b 0a 20 20 69 6e 74 20 66 6c 61 67   = 0;.  int flag
11a40 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s = SQLITE_OPEN_
11a50 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49  READWRITE | SQLI
11a60 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c  TE_OPEN_CREATE |
11a70 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d   SQLITE_OPEN_NOM
11a80 55 54 45 58 3b 0a 20 20 54 63 6c 5f 44 53 74 72  UTEX;.  Tcl_DStr
11a90 69 6e 67 20 74 72 61 6e 73 6c 61 74 65 64 46 69  ing translatedFi
11aa0 6c 65 6e 61 6d 65 3b 0a 20 20 69 66 28 20 6f 62  lename;.  if( ob
11ab0 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a 41 72  jc==2 ){.    zAr
11ac0 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  g = Tcl_GetStrin
11ad0 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d  gFromObj(objv[1]
11ae0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 73 74  , 0);.    if( st
11af0 72 63 6d 70 28 7a 41 72 67 2c 22 2d 76 65 72 73  rcmp(zArg,"-vers
11b00 69 6f 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ion")==0 ){.    
11b10 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
11b20 6c 74 28 69 6e 74 65 72 70 2c 73 71 6c 69 74 65  lt(interp,sqlite
11b30 33 5f 76 65 72 73 69 6f 6e 2c 30 29 3b 0a 20 20  3_version,0);.  
11b40 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
11b50 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
11b60 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 68   strcmp(zArg,"-h
11b70 61 73 2d 63 6f 64 65 63 22 29 3d 3d 30 20 29 7b  as-codec")==0 ){
11b80 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
11b90 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 20 20 54  AS_CODEC.      T
11ba0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
11bb0 69 6e 74 65 72 70 2c 22 31 22 2c 30 29 3b 0a 23  interp,"1",0);.#
11bc0 65 6c 73 65 0a 20 20 20 20 20 20 54 63 6c 5f 41  else.      Tcl_A
11bd0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
11be0 72 70 2c 22 30 22 2c 30 29 3b 0a 23 65 6e 64 69  rp,"0",0);.#endi
11bf0 66 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  f.      return T
11c00 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  CL_OK;.    }.  }
11c10 0a 20 20 66 6f 72 28 69 3d 33 3b 20 69 2b 31 3c  .  for(i=3; i+1<
11c20 6f 62 6a 63 3b 20 69 2b 3d 32 29 7b 0a 20 20 20  objc; i+=2){.   
11c30 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53   zArg = Tcl_GetS
11c40 74 72 69 6e 67 28 6f 62 6a 76 5b 69 5d 29 3b 0a  tring(objv[i]);.
11c50 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
11c60 41 72 67 2c 22 2d 6b 65 79 22 29 3d 3d 30 20 29  Arg,"-key")==0 )
11c70 7b 0a 20 20 20 20 20 20 70 4b 65 79 20 3d 20 54  {.      pKey = T
11c80 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46  cl_GetByteArrayF
11c90 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 69 2b 31 5d  romObj(objv[i+1]
11ca0 2c 20 26 6e 4b 65 79 29 3b 0a 20 20 20 20 7d 65  , &nKey);.    }e
11cb0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
11cc0 41 72 67 2c 20 22 2d 76 66 73 22 29 3d 3d 30 20  Arg, "-vfs")==0 
11cd0 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20  ){.      i++;.  
11ce0 20 20 20 20 7a 56 66 73 20 3d 20 54 63 6c 5f 47      zVfs = Tcl_G
11cf0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69 5d  etString(objv[i]
11d00 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
11d10 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d   strcmp(zArg, "-
11d20 72 65 61 64 6f 6e 6c 79 22 29 3d 3d 30 20 29 7b  readonly")==0 ){
11d30 0a 20 20 20 20 20 20 69 6e 74 20 62 3b 0a 20 20  .      int b;.  
11d40 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42      if( Tcl_GetB
11d50 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
11d60 74 65 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c  terp, objv[i+1],
11d70 20 26 62 29 20 29 20 72 65 74 75 72 6e 20 54 43   &b) ) return TC
11d80 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 69  L_ERROR;.      i
11d90 66 28 20 62 20 29 7b 0a 20 20 20 20 20 20 20 20  f( b ){.        
11da0 66 6c 61 67 73 20 26 3d 20 7e 28 53 51 4c 49 54  flags &= ~(SQLIT
11db0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
11dc0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
11dd0 41 54 45 29 3b 0a 20 20 20 20 20 20 20 20 66 6c  ATE);.        fl
11de0 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50  ags |= SQLITE_OP
11df0 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  EN_READONLY;.   
11e00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11e10 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49    flags &= ~SQLI
11e20 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
11e30 3b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  ;.        flags 
11e40 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  |= SQLITE_OPEN_R
11e50 45 41 44 57 52 49 54 45 3b 0a 20 20 20 20 20 20  EADWRITE;.      
11e60 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
11e70 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d 63  strcmp(zArg, "-c
11e80 72 65 61 74 65 22 29 3d 3d 30 20 29 7b 0a 20 20  reate")==0 ){.  
11e90 20 20 20 20 69 6e 74 20 62 3b 0a 20 20 20 20 20      int b;.     
11ea0 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c   if( Tcl_GetBool
11eb0 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
11ec0 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 62  p, objv[i+1], &b
11ed0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
11ee0 52 52 4f 52 3b 0a 20 20 20 20 20 20 69 66 28 20  RROR;.      if( 
11ef0 62 20 26 26 20 28 66 6c 61 67 73 20 26 20 53 51  b && (flags & SQ
11f00 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
11f10 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LY)==0 ){.      
11f20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54    flags |= SQLIT
11f30 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b 0a 20  E_OPEN_CREATE;. 
11f40 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
11f50 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51      flags &= ~SQ
11f60 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
11f70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
11f80 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
11f90 41 72 67 2c 20 22 2d 6e 6f 6d 75 74 65 78 22 29  Arg, "-nomutex")
11fa0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
11fb0 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63   b;.      if( Tc
11fc0 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
11fd0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
11fe0 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20 72 65 74  [i+1], &b) ) ret
11ff0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
12000 20 20 20 20 20 69 66 28 20 62 20 29 7b 0a 20 20       if( b ){.  
12010 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53        flags |= S
12020 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54  QLITE_OPEN_NOMUT
12030 45 58 3b 0a 20 20 20 20 20 20 20 20 66 6c 61 67  EX;.        flag
12040 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45  s &= ~SQLITE_OPE
12050 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a 20 20 20  N_FULLMUTEX;.   
12060 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12070 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49    flags &= ~SQLI
12080 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b  TE_OPEN_NOMUTEX;
12090 0a 20 20 20 20 20 20 7d 0a 20 20 20 7d 65 6c 73  .      }.   }els
120a0 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72  e if( strcmp(zAr
120b0 67 2c 20 22 2d 66 75 6c 6c 6d 75 74 65 78 22 29  g, "-fullmutex")
120c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
120d0 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63   b;.      if( Tc
120e0 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
120f0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
12100 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20 72 65 74  [i+1], &b) ) ret
12110 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
12120 20 20 20 20 20 69 66 28 20 62 20 29 7b 0a 20 20       if( b ){.  
12130 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53        flags |= S
12140 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d  QLITE_OPEN_FULLM
12150 55 54 45 58 3b 0a 20 20 20 20 20 20 20 20 66 6c  UTEX;.        fl
12160 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f  ags &= ~SQLITE_O
12170 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 20 20 20  PEN_NOMUTEX;.   
12180 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12190 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49    flags &= ~SQLI
121a0 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45  TE_OPEN_FULLMUTE
121b0 58 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  X;.      }.    }
121c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f  else{.      Tcl_
121d0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
121e0 65 72 70 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70  erp, "unknown op
121f0 74 69 6f 6e 3a 20 22 2c 20 7a 41 72 67 2c 20 28  tion: ", zArg, (
12200 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
12210 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
12220 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
12230 28 20 6f 62 6a 63 3c 33 20 7c 7c 20 28 6f 62 6a  ( objc<3 || (obj
12240 63 26 31 29 21 3d 31 20 29 7b 0a 20 20 20 20 54  c&1)!=1 ){.    T
12250 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
12260 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
12270 20 0a 20 20 20 20 20 20 22 48 41 4e 44 4c 45 20   .      "HANDLE 
12280 46 49 4c 45 4e 41 4d 45 20 3f 2d 76 66 73 20 56  FILENAME ?-vfs V
12290 46 53 4e 41 4d 45 3f 20 3f 2d 72 65 61 64 6f 6e  FSNAME? ?-readon
122a0 6c 79 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 63 72  ly BOOLEAN? ?-cr
122b0 65 61 74 65 20 42 4f 4f 4c 45 41 4e 3f 22 0a 20  eate BOOLEAN?". 
122c0 20 20 20 20 20 22 20 3f 2d 6e 6f 6d 75 74 65 78       " ?-nomutex
122d0 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 66 75 6c 6c   BOOLEAN? ?-full
122e0 6d 75 74 65 78 20 42 4f 4f 4c 45 41 4e 3f 22 0a  mutex BOOLEAN?".
122f0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
12300 53 5f 43 4f 44 45 43 0a 20 20 20 20 20 20 22 20  S_CODEC.      " 
12310 3f 2d 6b 65 79 20 43 4f 44 45 43 4b 45 59 3f 22  ?-key CODECKEY?"
12320 0a 23 65 6e 64 69 66 0a 20 20 20 20 29 3b 0a 20  .#endif.    );. 
12330 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
12340 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 45 72 72 4d  ROR;.  }.  zErrM
12350 73 67 20 3d 20 30 3b 0a 20 20 70 20 3d 20 28 53  sg = 0;.  p = (S
12360 71 6c 69 74 65 44 62 2a 29 54 63 6c 5f 41 6c 6c  qliteDb*)Tcl_All
12370 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29  oc( sizeof(*p) )
12380 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a  ;.  if( p==0 ){.
12390 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
123a0 74 28 69 6e 74 65 72 70 2c 20 22 6d 61 6c 6c 6f  t(interp, "mallo
123b0 63 20 66 61 69 6c 65 64 22 2c 20 54 43 4c 5f 53  c failed", TCL_S
123c0 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65 74 75  TATIC);.    retu
123d0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
123e0 7d 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  }.  memset(p, 0,
123f0 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
12400 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53  zFile = Tcl_GetS
12410 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
12420 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 7a 46 69 6c  v[2], 0);.  zFil
12430 65 20 3d 20 54 63 6c 5f 54 72 61 6e 73 6c 61 74  e = Tcl_Translat
12440 65 46 69 6c 65 4e 61 6d 65 28 69 6e 74 65 72 70  eFileName(interp
12450 2c 20 7a 46 69 6c 65 2c 20 26 74 72 61 6e 73 6c  , zFile, &transl
12460 61 74 65 64 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  atedFilename);. 
12470 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32   sqlite3_open_v2
12480 28 7a 46 69 6c 65 2c 20 26 70 2d 3e 64 62 2c 20  (zFile, &p->db, 
12490 66 6c 61 67 73 2c 20 7a 56 66 73 29 3b 0a 20 20  flags, zVfs);.  
124a0 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
124b0 26 74 72 61 6e 73 6c 61 74 65 64 46 69 6c 65 6e  &translatedFilen
124c0 61 6d 65 29 3b 0a 20 20 69 66 28 20 53 51 4c 49  ame);.  if( SQLI
124d0 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 65  TE_OK!=sqlite3_e
124e0 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 20 29 7b  rrcode(p->db) ){
124f0 0a 20 20 20 20 7a 45 72 72 4d 73 67 20 3d 20 73  .    zErrMsg = s
12500 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
12510 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  %s", sqlite3_err
12520 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20  msg(p->db));.   
12530 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70   sqlite3_close(p
12540 2d 3e 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64 62  ->db);.    p->db
12550 20 3d 20 30 3b 0a 20 20 7d 0a 23 69 66 64 65 66   = 0;.  }.#ifdef
12560 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
12570 43 0a 20 20 69 66 28 20 70 2d 3e 64 62 20 29 7b  C.  if( p->db ){
12580 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6b 65 79  .    sqlite3_key
12590 28 70 2d 3e 64 62 2c 20 70 4b 65 79 2c 20 6e 4b  (p->db, pKey, nK
125a0 65 79 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ey);.  }.#endif.
125b0 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29    if( p->db==0 )
125c0 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  {.    Tcl_SetRes
125d0 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72  ult(interp, zErr
125e0 4d 73 67 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c  Msg, TCL_VOLATIL
125f0 45 29 3b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65  E);.    Tcl_Free
12600 28 28 63 68 61 72 2a 29 70 29 3b 0a 20 20 20 20  ((char*)p);.    
12610 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72  sqlite3_free(zEr
12620 72 4d 73 67 29 3b 0a 20 20 20 20 72 65 74 75 72  rMsg);.    retur
12630 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
12640 0a 20 20 70 2d 3e 6d 61 78 53 74 6d 74 20 3d 20  .  p->maxStmt = 
12650 4e 55 4d 5f 50 52 45 50 41 52 45 44 5f 53 54 4d  NUM_PREPARED_STM
12660 54 53 3b 0a 20 20 70 2d 3e 69 6e 74 65 72 70 20  TS;.  p->interp 
12670 3d 20 69 6e 74 65 72 70 3b 0a 20 20 7a 41 72 67  = interp;.  zArg
12680 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
12690 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c  FromObj(objv[1],
126a0 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74   0);.  Tcl_Creat
126b0 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
126c0 72 70 2c 20 7a 41 72 67 2c 20 44 62 4f 62 6a 43  rp, zArg, DbObjC
126d0 6d 64 2c 20 28 63 68 61 72 2a 29 70 2c 20 44 62  md, (char*)p, Db
126e0 44 65 6c 65 74 65 43 6d 64 29 3b 0a 20 20 72 65  DeleteCmd);.  re
126f0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
12700 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20 61 20  /*.** Provide a 
12710 64 75 6d 6d 79 20 54 63 6c 5f 49 6e 69 74 53 74  dummy Tcl_InitSt
12720 75 62 73 20 69 66 20 77 65 20 61 72 65 20 75 73  ubs if we are us
12730 69 6e 67 20 74 68 69 73 20 61 73 20 61 20 73 74  ing this as a st
12740 61 74 69 63 0a 2a 2a 20 6c 69 62 72 61 72 79 2e  atic.** library.
12750 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 55 53 45 5f  .*/.#ifndef USE_
12760 54 43 4c 5f 53 54 55 42 53 0a 23 20 75 6e 64 65  TCL_STUBS.# unde
12770 66 20 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73  f  Tcl_InitStubs
12780 0a 23 20 64 65 66 69 6e 65 20 54 63 6c 5f 49 6e  .# define Tcl_In
12790 69 74 53 74 75 62 73 28 61 2c 62 2c 63 29 0a 23  itStubs(a,b,c).#
127a0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  endif../*.** Mak
127b0 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20 61  e sure we have a
127c0 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e   PACKAGE_VERSION
127d0 20 6d 61 63 72 6f 20 64 65 66 69 6e 65 64 2e 20   macro defined. 
127e0 20 54 68 69 73 20 77 69 6c 6c 20 62 65 0a 2a 2a   This will be.**
127f0 20 64 65 66 69 6e 65 64 20 61 75 74 6f 6d 61 74   defined automat
12800 69 63 61 6c 6c 79 20 62 79 20 74 68 65 20 54 45  ically by the TE
12810 41 20 6d 61 6b 65 66 69 6c 65 2e 20 20 42 75 74  A makefile.  But
12820 20 6f 74 68 65 72 20 6d 61 6b 65 66 69 6c 65 73   other makefiles
12830 0a 2a 2a 20 64 6f 20 6e 6f 74 20 64 65 66 69 6e  .** do not defin
12840 65 20 69 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  e it..*/.#ifndef
12850 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e   PACKAGE_VERSION
12860 0a 23 20 64 65 66 69 6e 65 20 50 41 43 4b 41 47  .# define PACKAG
12870 45 5f 56 45 52 53 49 4f 4e 20 53 51 4c 49 54 45  E_VERSION SQLITE
12880 5f 56 45 52 53 49 4f 4e 0a 23 65 6e 64 69 66 0a  _VERSION.#endif.
12890 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
128a0 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a  e this module..*
128b0 2a 0a 2a 2a 20 54 68 69 73 20 54 63 6c 20 6d 6f  *.** This Tcl mo
128c0 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  dule contains on
128d0 6c 79 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20  ly a single new 
128e0 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65  Tcl command name
128f0 64 20 22 73 71 6c 69 74 65 22 2e 0a 2a 2a 20 28  d "sqlite"..** (
12900 48 65 6e 63 65 20 74 68 65 72 65 20 69 73 20 6e  Hence there is n
12910 6f 20 6e 61 6d 65 73 70 61 63 65 2e 20 20 54 68  o namespace.  Th
12920 65 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20  ere is no point 
12930 69 6e 20 75 73 69 6e 67 20 61 20 6e 61 6d 65 73  in using a names
12940 70 61 63 65 0a 2a 2a 20 69 66 20 74 68 65 20 65  pace.** if the e
12950 78 74 65 6e 73 69 6f 6e 20 6f 6e 6c 79 20 73 75  xtension only su
12960 70 70 6c 69 65 73 20 6f 6e 65 20 6e 65 77 20 6e  pplies one new n
12970 61 6d 65 21 29 20 20 54 68 65 20 22 73 71 6c 69  ame!)  The "sqli
12980 74 65 22 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a  te" command is.*
12990 2a 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 61  * used to open a
129a0 20 6e 65 77 20 53 51 4c 69 74 65 20 64 61 74 61   new SQLite data
129b0 62 61 73 65 2e 20 20 53 65 65 20 74 68 65 20 44  base.  See the D
129c0 62 4d 61 69 6e 28 29 20 72 6f 75 74 69 6e 65 20  bMain() routine 
129d0 61 62 6f 76 65 0a 2a 2a 20 66 6f 72 20 61 64 64  above.** for add
129e0 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
129f0 69 6f 6e 2e 0a 2a 2f 0a 45 58 54 45 52 4e 20 69  ion..*/.EXTERN i
12a00 6e 74 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28  nt Sqlite3_Init(
12a10 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
12a20 72 70 29 7b 0a 20 20 54 63 6c 5f 49 6e 69 74 53  rp){.  Tcl_InitS
12a30 74 75 62 73 28 69 6e 74 65 72 70 2c 20 22 38 2e  tubs(interp, "8.
12a40 34 22 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72  4", 0);.  Tcl_Cr
12a50 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
12a60 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33 22  nterp, "sqlite3"
12a70 2c 20 28 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f  , (Tcl_ObjCmdPro
12a80 63 2a 29 44 62 4d 61 69 6e 2c 20 30 2c 20 30 29  c*)DbMain, 0, 0)
12a90 3b 0a 20 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69  ;.  Tcl_PkgProvi
12aa0 64 65 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  de(interp, "sqli
12ab0 74 65 33 22 2c 20 50 41 43 4b 41 47 45 5f 56 45  te3", PACKAGE_VE
12ac0 52 53 49 4f 4e 29 3b 0a 20 20 54 63 6c 5f 43 72  RSION);.  Tcl_Cr
12ad0 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
12ae0 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 22 2c  nterp, "sqlite",
12af0 20 28 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63   (Tcl_ObjCmdProc
12b00 2a 29 44 62 4d 61 69 6e 2c 20 30 2c 20 30 29 3b  *)DbMain, 0, 0);
12b10 0a 20 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64  .  Tcl_PkgProvid
12b20 65 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  e(interp, "sqlit
12b30 65 22 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53  e", PACKAGE_VERS
12b40 49 4f 4e 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  ION);.  return T
12b50 43 4c 5f 4f 4b 3b 0a 7d 0a 45 58 54 45 52 4e 20  CL_OK;.}.EXTERN 
12b60 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 33 5f 49  int Tclsqlite3_I
12b70 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
12b80 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20  interp){ return 
12b90 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74  Sqlite3_Init(int
12ba0 65 72 70 29 3b 20 7d 0a 45 58 54 45 52 4e 20 69  erp); }.EXTERN i
12bb0 6e 74 20 53 71 6c 69 74 65 33 5f 53 61 66 65 49  nt Sqlite3_SafeI
12bc0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
12bd0 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20  interp){ return 
12be0 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e  TCL_OK; }.EXTERN
12bf0 20 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 33 5f   int Tclsqlite3_
12c00 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74  SafeInit(Tcl_Int
12c10 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65  erp *interp){ re
12c20 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45  turn TCL_OK; }.E
12c30 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65  XTERN int Sqlite
12c40 33 5f 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74  3_Unload(Tcl_Int
12c50 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
12c60 20 66 6c 61 67 73 29 7b 20 72 65 74 75 72 6e 20   flags){ return 
12c70 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e  TCL_OK; }.EXTERN
12c80 20 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 33 5f   int Tclsqlite3_
12c90 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72  Unload(Tcl_Inter
12ca0 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66  p *interp, int f
12cb0 6c 61 67 73 29 7b 20 72 65 74 75 72 6e 20 54 43  lags){ return TC
12cc0 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e 20 69  L_OK; }.EXTERN i
12cd0 6e 74 20 53 71 6c 69 74 65 33 5f 53 61 66 65 55  nt Sqlite3_SafeU
12ce0 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72 70  nload(Tcl_Interp
12cf0 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c   *interp, int fl
12d00 61 67 73 29 7b 20 72 65 74 75 72 6e 20 54 43 4c  ags){ return TCL
12d10 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e  _OK; }.EXTERN in
12d20 74 20 54 63 6c 73 71 6c 69 74 65 33 5f 53 61 66  t Tclsqlite3_Saf
12d30 65 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65  eUnload(Tcl_Inte
12d40 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
12d50 66 6c 61 67 73 29 7b 20 72 65 74 75 72 6e 20 54  flags){ return T
12d60 43 4c 5f 4f 4b 3b 7d 0a 0a 0a 23 69 66 6e 64 65  CL_OK;}...#ifnde
12d70 66 20 53 51 4c 49 54 45 5f 33 5f 53 55 46 46 49  f SQLITE_3_SUFFI
12d80 58 5f 4f 4e 4c 59 0a 45 58 54 45 52 4e 20 69 6e  X_ONLY.EXTERN in
12d90 74 20 53 71 6c 69 74 65 5f 49 6e 69 74 28 54 63  t Sqlite_Init(Tc
12da0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
12db0 29 7b 20 72 65 74 75 72 6e 20 53 71 6c 69 74 65  ){ return Sqlite
12dc0 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 20  3_Init(interp); 
12dd0 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63 6c  }.EXTERN int Tcl
12de0 73 71 6c 69 74 65 5f 49 6e 69 74 28 54 63 6c 5f  sqlite_Init(Tcl_
12df0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
12e00 20 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33 5f   return Sqlite3_
12e10 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a  Init(interp); }.
12e20 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74  EXTERN int Sqlit
12e30 65 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49  e_SafeInit(Tcl_I
12e40 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20  nterp *interp){ 
12e50 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d  return TCL_OK; }
12e60 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73  .EXTERN int Tcls
12e70 71 6c 69 74 65 5f 53 61 66 65 49 6e 69 74 28 54  qlite_SafeInit(T
12e80 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
12e90 70 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  p){ return TCL_O
12ea0 4b 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20  K; }.EXTERN int 
12eb0 53 71 6c 69 74 65 5f 55 6e 6c 6f 61 64 28 54 63  Sqlite_Unload(Tc
12ec0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
12ed0 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 20 72 65  , int flags){ re
12ee0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45  turn TCL_OK; }.E
12ef0 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73 71 6c  XTERN int Tclsql
12f00 69 74 65 5f 55 6e 6c 6f 61 64 28 54 63 6c 5f 49  ite_Unload(Tcl_I
12f10 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
12f20 6e 74 20 66 6c 61 67 73 29 7b 20 72 65 74 75 72  nt flags){ retur
12f30 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45  n TCL_OK; }.EXTE
12f40 52 4e 20 69 6e 74 20 53 71 6c 69 74 65 5f 53 61  RN int Sqlite_Sa
12f50 66 65 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74  feUnload(Tcl_Int
12f60 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
12f70 20 66 6c 61 67 73 29 7b 20 72 65 74 75 72 6e 20   flags){ return 
12f80 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e  TCL_OK; }.EXTERN
12f90 20 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 5f 53   int Tclsqlite_S
12fa0 61 66 65 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e  afeUnload(Tcl_In
12fb0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
12fc0 74 20 66 6c 61 67 73 29 7b 20 72 65 74 75 72 6e  t flags){ return
12fd0 20 54 43 4c 5f 4f 4b 3b 7d 0a 23 65 6e 64 69 66   TCL_OK;}.#endif
12fe0 0a 0a 23 69 66 64 65 66 20 54 43 4c 53 48 0a 2f  ..#ifdef TCLSH./
12ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
13040 20 54 68 65 20 63 6f 64 65 20 74 68 61 74 20 66   The code that f
13050 6f 6c 6c 6f 77 73 20 69 73 20 75 73 65 64 20 74  ollows is used t
13060 6f 20 62 75 69 6c 64 20 73 74 61 6e 64 61 6c 6f  o build standalo
13070 6e 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  ne TCL interpret
13080 65 72 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20  ers.** that are 
13090 73 74 61 74 69 63 61 6c 6c 79 20 6c 69 6e 6b 65  statically linke
130a0 64 20 77 69 74 68 20 53 51 4c 69 74 65 2e 20 20  d with SQLite.  
130b0 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  .*/../*.** If th
130c0 65 20 6d 61 63 72 6f 20 54 43 4c 53 48 20 69 73  e macro TCLSH is
130d0 20 6f 6e 65 2c 20 74 68 65 6e 20 70 75 74 20 69   one, then put i
130e0 6e 20 63 6f 64 65 20 74 68 69 73 20 66 6f 72 20  n code this for 
130f0 74 68 65 0a 2a 2a 20 22 6d 61 69 6e 22 20 72 6f  the.** "main" ro
13100 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20  utine that will 
13110 69 6e 69 74 69 61 6c 69 7a 65 20 54 63 6c 20 61  initialize Tcl a
13120 6e 64 20 74 61 6b 65 20 69 6e 70 75 74 20 66 72  nd take input fr
13130 6f 6d 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20 69  om.** standard i
13140 6e 70 75 74 2c 20 6f 72 20 69 66 20 61 20 66 69  nput, or if a fi
13150 6c 65 20 69 73 20 6e 61 6d 65 64 20 6f 6e 20 74  le is named on t
13160 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 0a  he command line.
13170 2a 2a 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72  ** the TCL inter
13180 70 72 65 74 65 72 20 72 65 61 64 73 20 61 6e 64  preter reads and
13190 20 65 76 61 6c 75 61 74 65 73 20 74 68 61 74 20   evaluates that 
131a0 66 69 6c 65 2e 0a 2a 2f 0a 23 69 66 20 54 43 4c  file..*/.#if TCL
131b0 53 48 3d 3d 31 0a 73 74 61 74 69 63 20 63 68 61  SH==1.static cha
131c0 72 20 7a 4d 61 69 6e 6c 6f 6f 70 5b 5d 20 3d 0a  r zMainloop[] =.
131d0 20 20 22 73 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e    "set line {}\n
131e0 22 0a 20 20 22 77 68 69 6c 65 20 7b 21 5b 65 6f  ".  "while {![eo
131f0 66 20 73 74 64 69 6e 5d 7d 20 7b 5c 6e 22 0a 20  f stdin]} {\n". 
13200 20 20 20 22 69 66 20 7b 24 6c 69 6e 65 21 3d 5c     "if {$line!=\
13210 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20  "\"} {\n".      
13220 22 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65  "puts -nonewline
13230 20 5c 22 3e 20 5c 22 5c 6e 22 0a 20 20 20 20 22   \"> \"\n".    "
13240 7d 20 65 6c 73 65 20 7b 5c 6e 22 0a 20 20 20 20  } else {\n".    
13250 20 20 22 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69    "puts -nonewli
13260 6e 65 20 5c 22 25 20 5c 22 5c 6e 22 0a 20 20 20  ne \"% \"\n".   
13270 20 22 7d 5c 6e 22 0a 20 20 20 20 22 66 6c 75 73   "}\n".    "flus
13280 68 20 73 74 64 6f 75 74 5c 6e 22 0a 20 20 20 20  h stdout\n".    
13290 22 61 70 70 65 6e 64 20 6c 69 6e 65 20 5b 67 65  "append line [ge
132a0 74 73 20 73 74 64 69 6e 5d 5c 6e 22 0a 20 20 20  ts stdin]\n".   
132b0 20 22 69 66 20 7b 5b 69 6e 66 6f 20 63 6f 6d 70   "if {[info comp
132c0 6c 65 74 65 20 24 6c 69 6e 65 5d 7d 20 7b 5c 6e  lete $line]} {\n
132d0 22 0a 20 20 20 20 20 20 22 69 66 20 7b 5b 63 61  ".      "if {[ca
132e0 74 63 68 20 7b 75 70 6c 65 76 65 6c 20 23 30 20  tch {uplevel #0 
132f0 24 6c 69 6e 65 7d 20 72 65 73 75 6c 74 5d 7d 20  $line} result]} 
13300 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 70 75  {\n".        "pu
13310 74 73 20 73 74 64 65 72 72 20 5c 22 45 72 72 6f  ts stderr \"Erro
13320 72 3a 20 24 72 65 73 75 6c 74 5c 22 5c 6e 22 0a  r: $result\"\n".
13330 20 20 20 20 20 20 22 7d 20 65 6c 73 65 69 66 20        "} elseif 
13340 7b 24 72 65 73 75 6c 74 21 3d 5c 22 5c 22 7d 20  {$result!=\"\"} 
13350 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 70 75  {\n".        "pu
13360 74 73 20 24 72 65 73 75 6c 74 5c 6e 22 0a 20 20  ts $result\n".  
13370 20 20 20 20 22 7d 5c 6e 22 0a 20 20 20 20 20 20      "}\n".      
13380 22 73 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a  "set line {}\n".
13390 20 20 20 20 22 7d 20 65 6c 73 65 20 7b 5c 6e 22      "} else {\n"
133a0 0a 20 20 20 20 20 20 22 61 70 70 65 6e 64 20 6c  .      "append l
133b0 69 6e 65 20 5c 5c 6e 5c 6e 22 0a 20 20 20 20 22  ine \\n\n".    "
133c0 7d 5c 6e 22 0a 20 20 22 7d 5c 6e 22 0a 3b 0a 23  }\n".  "}\n".;.#
133d0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  endif../*.** If 
133e0 74 68 65 20 6d 61 63 72 6f 20 54 43 4c 53 48 20  the macro TCLSH 
133f0 69 73 20 74 77 6f 2c 20 74 68 65 6e 20 67 65 74  is two, then get
13400 20 74 68 65 20 6d 61 69 6e 20 6c 6f 6f 70 20 63   the main loop c
13410 6f 64 65 20 6f 75 74 20 6f 66 0a 2a 2a 20 74 68  ode out of.** th
13420 65 20 73 65 70 61 72 61 74 65 20 66 69 6c 65 20  e separate file 
13430 22 73 70 61 63 65 61 6e 61 6c 5f 74 63 6c 2e 68  "spaceanal_tcl.h
13440 22 2e 0a 2a 2f 0a 23 69 66 20 54 43 4c 53 48 3d  "..*/.#if TCLSH=
13450 3d 32 0a 73 74 61 74 69 63 20 63 68 61 72 20 7a  =2.static char z
13460 4d 61 69 6e 6c 6f 6f 70 5b 5d 20 3d 20 0a 23 69  Mainloop[] = .#i
13470 6e 63 6c 75 64 65 20 22 73 70 61 63 65 61 6e 61  nclude "spaceana
13480 6c 5f 74 63 6c 2e 68 22 0a 3b 0a 23 65 6e 64 69  l_tcl.h".;.#endi
13490 66 0a 0a 23 64 65 66 69 6e 65 20 54 43 4c 53 48  f..#define TCLSH
134a0 5f 4d 41 49 4e 20 6d 61 69 6e 20 20 20 2f 2a 20  _MAIN main   /* 
134b0 4e 65 65 64 65 64 20 74 6f 20 66 61 6b 65 20 6f  Needed to fake o
134c0 75 74 20 6d 6b 74 63 6c 61 70 70 20 2a 2f 0a 69  ut mktclapp */.i
134d0 6e 74 20 54 43 4c 53 48 5f 4d 41 49 4e 28 69 6e  nt TCLSH_MAIN(in
134e0 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61  t argc, char **a
134f0 72 67 76 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65  rgv){.  Tcl_Inte
13500 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63  rp *interp;.  Tc
13510 6c 5f 46 69 6e 64 45 78 65 63 75 74 61 62 6c 65  l_FindExecutable
13520 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 6e 74  (argv[0]);.  int
13530 65 72 70 20 3d 20 54 63 6c 5f 43 72 65 61 74 65  erp = Tcl_Create
13540 49 6e 74 65 72 70 28 29 3b 0a 20 20 53 71 6c 69  Interp();.  Sqli
13550 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  te3_Init(interp)
13560 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
13570 54 45 53 54 0a 20 20 7b 0a 20 20 20 20 65 78 74  TEST.  {.    ext
13580 65 72 6e 20 69 6e 74 20 4d 64 35 5f 49 6e 69 74  ern int Md5_Init
13590 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
135a0 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
135b0 6c 69 74 65 63 6f 6e 66 69 67 5f 49 6e 69 74 28  liteconfig_Init(
135c0 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
135d0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
135e0 69 74 65 74 65 73 74 31 5f 49 6e 69 74 28 54 63  itetest1_Init(Tc
135f0 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
13600 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
13610 65 74 65 73 74 32 5f 49 6e 69 74 28 54 63 6c 5f  etest2_Init(Tcl_
13620 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
13630 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
13640 65 73 74 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  est3_Init(Tcl_In
13650 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
13660 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
13670 74 34 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  t4_Init(Tcl_Inte
13680 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
13690 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 35   int Sqlitetest5
136a0 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
136b0 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
136c0 6e 74 20 53 71 6c 69 74 65 74 65 73 74 36 5f 49  nt Sqlitetest6_I
136d0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
136e0 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
136f0 20 53 71 6c 69 74 65 74 65 73 74 37 5f 49 6e 69   Sqlitetest7_Ini
13700 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
13710 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
13720 71 6c 69 74 65 74 65 73 74 38 5f 49 6e 69 74 28  qlitetest8_Init(
13730 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
13740 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
13750 69 74 65 74 65 73 74 39 5f 49 6e 69 74 28 54 63  itetest9_Init(Tc
13760 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
13770 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
13780 65 74 65 73 74 61 73 79 6e 63 5f 49 6e 69 74 28  etestasync_Init(
13790 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
137a0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
137b0 69 74 65 74 65 73 74 5f 61 75 74 6f 65 78 74 5f  itetest_autoext_
137c0 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
137d0 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
137e0 74 20 53 71 6c 69 74 65 74 65 73 74 5f 66 75 6e  t Sqlitetest_fun
137f0 63 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  c_Init(Tcl_Inter
13800 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
13810 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f 68  int Sqlitetest_h
13820 65 78 69 6f 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  exio_Init(Tcl_In
13830 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
13840 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
13850 74 5f 6d 61 6c 6c 6f 63 5f 49 6e 69 74 28 54 63  t_malloc_Init(Tc
13860 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
13870 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
13880 65 74 65 73 74 5f 6d 75 74 65 78 5f 49 6e 69 74  etest_mutex_Init
13890 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
138a0 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
138b0 6c 69 74 65 74 65 73 74 73 63 68 65 6d 61 5f 49  litetestschema_I
138c0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
138d0 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
138e0 20 53 71 6c 69 74 65 74 65 73 74 73 73 65 5f 49   Sqlitetestsse_I
138f0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
13900 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
13910 20 53 71 6c 69 74 65 74 65 73 74 74 63 6c 76 61   Sqlitetesttclva
13920 72 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  r_Init(Tcl_Inter
13930 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
13940 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 54 68  int SqlitetestTh
13950 72 65 61 64 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  read_Init(Tcl_In
13960 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
13970 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
13980 74 4f 6e 65 66 69 6c 65 5f 49 6e 69 74 28 29 3b  tOnefile_Init();
13990 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
139a0 53 71 6c 69 74 65 74 65 73 74 4f 73 69 6e 73 74  SqlitetestOsinst
139b0 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
139c0 2a 29 3b 0a 0a 20 20 20 20 4d 64 35 5f 49 6e 69  *);..    Md5_Ini
139d0 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
139e0 71 6c 69 74 65 63 6f 6e 66 69 67 5f 49 6e 69 74  qliteconfig_Init
139f0 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
13a00 6c 69 74 65 74 65 73 74 31 5f 49 6e 69 74 28 69  litetest1_Init(i
13a10 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
13a20 74 65 74 65 73 74 32 5f 49 6e 69 74 28 69 6e 74  tetest2_Init(int
13a30 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
13a40 74 65 73 74 33 5f 49 6e 69 74 28 69 6e 74 65 72  test3_Init(inter
13a50 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
13a60 73 74 34 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  st4_Init(interp)
13a70 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
13a80 35 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  5_Init(interp);.
13a90 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 36 5f      Sqlitetest6_
13aa0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
13ab0 20 20 53 71 6c 69 74 65 74 65 73 74 37 5f 49 6e    Sqlitetest7_In
13ac0 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
13ad0 53 71 6c 69 74 65 74 65 73 74 38 5f 49 6e 69 74  Sqlitetest8_Init
13ae0 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
13af0 6c 69 74 65 74 65 73 74 39 5f 49 6e 69 74 28 69  litetest9_Init(i
13b00 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
13b10 74 65 74 65 73 74 61 73 79 6e 63 5f 49 6e 69 74  tetestasync_Init
13b20 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
13b30 6c 69 74 65 74 65 73 74 5f 61 75 74 6f 65 78 74  litetest_autoext
13b40 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
13b50 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f 66 75     Sqlitetest_fu
13b60 6e 63 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  nc_Init(interp);
13b70 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f  .    Sqlitetest_
13b80 68 65 78 69 6f 5f 49 6e 69 74 28 69 6e 74 65 72  hexio_Init(inter
13b90 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
13ba0 73 74 5f 6d 61 6c 6c 6f 63 5f 49 6e 69 74 28 69  st_malloc_Init(i
13bb0 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
13bc0 74 65 74 65 73 74 5f 6d 75 74 65 78 5f 49 6e 69  tetest_mutex_Ini
13bd0 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
13be0 71 6c 69 74 65 74 65 73 74 73 63 68 65 6d 61 5f  qlitetestschema_
13bf0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
13c00 20 20 53 71 6c 69 74 65 74 65 73 74 74 63 6c 76    Sqlitetesttclv
13c10 61 72 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  ar_Init(interp);
13c20 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 54  .    SqlitetestT
13c30 68 72 65 61 64 5f 49 6e 69 74 28 69 6e 74 65 72  hread_Init(inter
13c40 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
13c50 73 74 4f 6e 65 66 69 6c 65 5f 49 6e 69 74 28 69  stOnefile_Init(i
13c60 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
13c70 74 65 74 65 73 74 4f 73 69 6e 73 74 5f 49 6e 69  tetestOsinst_Ini
13c80 74 28 69 6e 74 65 72 70 29 3b 0a 0a 23 69 66 64  t(interp);..#ifd
13c90 65 66 20 53 51 4c 49 54 45 5f 53 53 45 0a 20 20  ef SQLITE_SSE.  
13ca0 20 20 53 71 6c 69 74 65 74 65 73 74 73 73 65 5f    Sqlitetestsse_
13cb0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 23 65  Init(interp);.#e
13cc0 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ndif.  }.#endif.
13cd0 20 20 69 66 28 20 61 72 67 63 3e 3d 32 20 7c 7c    if( argc>=2 ||
13ce0 20 54 43 4c 53 48 3d 3d 32 20 29 7b 0a 20 20 20   TCLSH==2 ){.   
13cf0 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 68 61 72   int i;.    char
13d00 20 7a 41 72 67 63 5b 33 32 5d 3b 0a 20 20 20 20   zArgc[32];.    
13d10 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
13d20 28 73 69 7a 65 6f 66 28 7a 41 72 67 63 29 2c 20  (sizeof(zArgc), 
13d30 7a 41 72 67 63 2c 20 22 25 64 22 2c 20 61 72 67  zArgc, "%d", arg
13d40 63 2d 28 33 2d 54 43 4c 53 48 29 29 3b 0a 20 20  c-(3-TCLSH));.  
13d50 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74    Tcl_SetVar(int
13d60 65 72 70 2c 22 61 72 67 63 22 2c 20 7a 41 72 67  erp,"argc", zArg
13d70 63 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e  c, TCL_GLOBAL_ON
13d80 4c 59 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  LY);.    Tcl_Set
13d90 56 61 72 28 69 6e 74 65 72 70 2c 22 61 72 67 76  Var(interp,"argv
13da0 30 22 2c 61 72 67 76 5b 31 5d 2c 54 43 4c 5f 47  0",argv[1],TCL_G
13db0 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20  LOBAL_ONLY);.   
13dc0 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65   Tcl_SetVar(inte
13dd0 72 70 2c 22 61 72 67 76 22 2c 20 22 22 2c 20 54  rp,"argv", "", T
13de0 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
13df0 0a 20 20 20 20 66 6f 72 28 69 3d 33 2d 54 43 4c  .    for(i=3-TCL
13e00 53 48 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29  SH; i<argc; i++)
13e10 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 56  {.      Tcl_SetV
13e20 61 72 28 69 6e 74 65 72 70 2c 20 22 61 72 67 76  ar(interp, "argv
13e30 22 2c 20 61 72 67 76 5b 69 5d 2c 0a 20 20 20 20  ", argv[i],.    
13e40 20 20 20 20 20 20 54 43 4c 5f 47 4c 4f 42 41 4c        TCL_GLOBAL
13e50 5f 4f 4e 4c 59 20 7c 20 54 43 4c 5f 4c 49 53 54  _ONLY | TCL_LIST
13e60 5f 45 4c 45 4d 45 4e 54 20 7c 20 54 43 4c 5f 41  _ELEMENT | TCL_A
13e70 50 50 45 4e 44 5f 56 41 4c 55 45 29 3b 0a 20 20  PPEND_VALUE);.  
13e80 20 20 7d 0a 20 20 20 20 69 66 28 20 54 43 4c 53    }.    if( TCLS
13e90 48 3d 3d 31 20 26 26 20 54 63 6c 5f 45 76 61 6c  H==1 && Tcl_Eval
13ea0 46 69 6c 65 28 69 6e 74 65 72 70 2c 20 61 72 67  File(interp, arg
13eb0 76 5b 31 5d 29 21 3d 54 43 4c 5f 4f 4b 20 29 7b  v[1])!=TCL_OK ){
13ec0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
13ed0 72 20 2a 7a 49 6e 66 6f 20 3d 20 54 63 6c 5f 47  r *zInfo = Tcl_G
13ee0 65 74 56 61 72 28 69 6e 74 65 72 70 2c 20 22 65  etVar(interp, "e
13ef0 72 72 6f 72 49 6e 66 6f 22 2c 20 54 43 4c 5f 47  rrorInfo", TCL_G
13f00 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20  LOBAL_ONLY);.   
13f10 20 20 20 69 66 28 20 7a 49 6e 66 6f 3d 3d 30 20     if( zInfo==0 
13f20 29 20 7a 49 6e 66 6f 20 3d 20 69 6e 74 65 72 70  ) zInfo = interp
13f30 2d 3e 72 65 73 75 6c 74 3b 0a 20 20 20 20 20 20  ->result;.      
13f40 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
13f50 25 73 3a 20 25 73 5c 6e 22 2c 20 2a 61 72 67 76  %s: %s\n", *argv
13f60 2c 20 7a 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  , zInfo);.      
13f70 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
13f80 20 20 7d 0a 20 20 69 66 28 20 61 72 67 63 3c 3d    }.  if( argc<=
13f90 31 20 7c 7c 20 54 43 4c 53 48 3d 3d 32 20 29 7b  1 || TCLSH==2 ){
13fa0 0a 20 20 20 20 54 63 6c 5f 47 6c 6f 62 61 6c 45  .    Tcl_GlobalE
13fb0 76 61 6c 28 69 6e 74 65 72 70 2c 20 7a 4d 61 69  val(interp, zMai
13fc0 6e 6c 6f 6f 70 29 3b 0a 20 20 7d 0a 20 20 72 65  nloop);.  }.  re
13fd0 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
13fe0 20 2f 2a 20 54 43 4c 53 48 20 2a 2f 0a            /* TCLSH */.