/ Hex Artifact Content
Login

Artifact 2877726bf32f7d72ff057b37ed6c93485b667ea1:


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 31 36 20 32 30 30 38  e.c,v 1.216 2008
0220: 2f 30 34 2f 31 36 20 30 30 3a 32 38 3a 31 34 20  /04/16 00:28:14 
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 63 68 61 72  outine */.  char
0e50: 20 2a 7a 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20   *zNull;        
0e60: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 74         /* Text t
0e70: 6f 20 73 75 62 73 74 69 74 75 74 65 20 66 6f 72  o substitute for
0e80: 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 20 76 61 6c   an SQL NULL val
0e90: 75 65 20 2a 2f 0a 20 20 53 71 6c 46 75 6e 63 20  ue */.  SqlFunc 
0ea0: 2a 70 46 75 6e 63 3b 20 20 20 20 20 20 20 20 20  *pFunc;         
0eb0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 53 51     /* List of SQ
0ec0: 4c 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  L functions */. 
0ed0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 55 70 64 61 74   Tcl_Obj *pUpdat
0ee0: 65 48 6f 6f 6b 3b 20 20 20 20 20 20 2f 2a 20 55  eHook;      /* U
0ef0: 70 64 61 74 65 20 68 6f 6f 6b 20 73 63 72 69 70  pdate hook scrip
0f00: 74 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20 20  t (if any) */.  
0f10: 54 63 6c 5f 4f 62 6a 20 2a 70 52 6f 6c 6c 62 61  Tcl_Obj *pRollba
0f20: 63 6b 48 6f 6f 6b 3b 20 20 20 20 2f 2a 20 52 6f  ckHook;    /* Ro
0f30: 6c 6c 62 61 63 6b 20 68 6f 6f 6b 20 73 63 72 69  llback hook scri
0f40: 70 74 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20  pt (if any) */. 
0f50: 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43 6f   SqlCollate *pCo
0f60: 6c 6c 61 74 65 3b 20 20 20 20 20 20 2f 2a 20 4c  llate;      /* L
0f70: 69 73 74 20 6f 66 20 53 51 4c 20 63 6f 6c 6c 61  ist of SQL colla
0f80: 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 73 20 2a  tion functions *
0f90: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
0fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0fb0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 6f 66  * Return code of
0fc0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c   most recent sql
0fd0: 69 74 65 33 5f 65 78 65 63 28 29 20 2a 2f 0a 20  ite3_exec() */. 
0fe0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f 6c 6c 61   Tcl_Obj *pColla
0ff0: 74 65 4e 65 65 64 65 64 3b 20 20 20 2f 2a 20 43  teNeeded;   /* C
1000: 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65 64 65 64 20  ollation needed 
1010: 73 63 72 69 70 74 20 2a 2f 0a 20 20 53 71 6c 50  script */.  SqlP
1020: 72 65 70 61 72 65 64 53 74 6d 74 20 2a 73 74 6d  reparedStmt *stm
1030: 74 4c 69 73 74 3b 20 2f 2a 20 4c 69 73 74 20 6f  tList; /* List o
1040: 66 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  f prepared state
1050: 6d 65 6e 74 73 2a 2f 0a 20 20 53 71 6c 50 72 65  ments*/.  SqlPre
1060: 70 61 72 65 64 53 74 6d 74 20 2a 73 74 6d 74 4c  paredStmt *stmtL
1070: 61 73 74 3b 20 2f 2a 20 4c 61 73 74 20 73 74 61  ast; /* Last sta
1080: 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 6c 69  tement in the li
1090: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 53  st */.  int maxS
10a0: 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tmt;            
10b0: 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 6d     /* The next m
10c0: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
10d0: 20 73 74 6d 74 4c 69 73 74 20 2a 2f 0a 20 20 69   stmtList */.  i
10e0: 6e 74 20 6e 53 74 6d 74 3b 20 20 20 20 20 20 20  nt nStmt;       
10f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1100: 62 65 72 20 6f 66 20 73 74 61 74 65 6d 65 6e 74  ber of statement
1110: 73 20 69 6e 20 73 74 6d 74 4c 69 73 74 20 2a 2f  s in stmtList */
1120: 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  .  IncrblobChann
1130: 65 6c 20 2a 70 49 6e 63 72 62 6c 6f 62 3b 2f 2a  el *pIncrblob;/*
1140: 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   Linked list of 
1150: 6f 70 65 6e 20 69 6e 63 72 62 6c 6f 62 20 63 68  open incrblob ch
1160: 61 6e 6e 65 6c 73 20 2a 2f 0a 7d 3b 0a 0a 73 74  annels */.};..st
1170: 72 75 63 74 20 49 6e 63 72 62 6c 6f 62 43 68 61  ruct IncrblobCha
1180: 6e 6e 65 6c 20 7b 0a 20 20 73 71 6c 69 74 65 33  nnel {.  sqlite3
1190: 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 3b 20 20 20  _blob *pBlob;   
11a0: 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 20 62 6c     /* sqlite3 bl
11b0: 6f 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 53  ob handle */.  S
11c0: 71 6c 69 74 65 44 62 20 2a 70 44 62 3b 20 20 20  qliteDb *pDb;   
11d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f           /* Asso
11e0: 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20  ciated database 
11f0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
1200: 69 6e 74 20 69 53 65 65 6b 3b 20 20 20 20 20 20  int iSeek;      
1210: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
1220: 72 65 6e 74 20 73 65 65 6b 20 6f 66 66 73 65 74  rent seek offset
1230: 20 2a 2f 0a 20 20 54 63 6c 5f 43 68 61 6e 6e 65   */.  Tcl_Channe
1240: 6c 20 63 68 61 6e 6e 65 6c 3b 20 20 20 20 20 20  l channel;      
1250: 2f 2a 20 43 68 61 6e 6e 65 6c 20 69 64 65 6e 74  /* Channel ident
1260: 69 66 69 65 72 20 2a 2f 0a 20 20 49 6e 63 72 62  ifier */.  Incrb
1270: 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 4e 65 78  lobChannel *pNex
1280: 74 3b 20 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c  t;   /* Linked l
1290: 69 73 74 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20  ist of all open 
12a0: 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c  incrblob channel
12b0: 73 20 2a 2f 0a 20 20 49 6e 63 72 62 6c 6f 62 43  s */.  IncrblobC
12c0: 68 61 6e 6e 65 6c 20 2a 70 50 72 65 76 3b 20 20  hannel *pPrev;  
12d0: 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20   /* Linked list 
12e0: 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 69 6e 63 72  of all open incr
12f0: 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 73 20 2a 2f  blob channels */
1300: 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .};..#ifndef SQL
1310: 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
1320: 42 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c  B./*.** Close al
1330: 6c 20 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e  l incrblob chann
1340: 65 6c 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67  els opened using
1350: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
1360: 74 69 6f 6e 20 70 44 62 2e 0a 2a 2a 20 54 68 69  tion pDb..** Thi
1370: 73 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  s is called when
1380: 20 73 68 75 74 74 69 6e 67 20 64 6f 77 6e 20 74   shutting down t
1390: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
13a0: 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ection..*/.stati
13b0: 63 20 76 6f 69 64 20 63 6c 6f 73 65 49 6e 63 72  c void closeIncr
13c0: 62 6c 6f 62 43 68 61 6e 6e 65 6c 73 28 53 71 6c  blobChannels(Sql
13d0: 69 74 65 44 62 20 2a 70 44 62 29 7b 0a 20 20 49  iteDb *pDb){.  I
13e0: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a  ncrblobChannel *
13f0: 70 3b 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61  p;.  IncrblobCha
1400: 6e 6e 65 6c 20 2a 70 4e 65 78 74 3b 0a 0a 20 20  nnel *pNext;..  
1410: 66 6f 72 28 70 3d 70 44 62 2d 3e 70 49 6e 63 72  for(p=pDb->pIncr
1420: 62 6c 6f 62 3b 20 70 3b 20 70 3d 70 4e 65 78 74  blob; p; p=pNext
1430: 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
1440: 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 20 20 2f 2a  ->pNext;..    /*
1450: 20 4e 6f 74 65 3a 20 43 61 6c 6c 69 6e 67 20 75   Note: Calling u
1460: 6e 72 65 67 69 73 74 65 72 20 68 65 72 65 20 63  nregister here c
1470: 61 6c 6c 20 54 63 6c 5f 43 6c 6f 73 65 20 6f 6e  all Tcl_Close on
1480: 20 74 68 65 20 69 6e 63 72 62 6c 6f 62 20 63 68   the incrblob ch
1490: 61 6e 6e 65 6c 2c 20 0a 20 20 20 20 2a 2a 20 77  annel, .    ** w
14a0: 68 69 63 68 20 64 65 6c 65 74 65 73 20 74 68 65  hich deletes the
14b0: 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c   IncrblobChannel
14c0: 20 73 74 72 75 63 74 75 72 65 20 61 74 20 2a 70   structure at *p
14d0: 2e 20 53 6f 20 64 6f 20 6e 6f 74 0a 20 20 20 20  . So do not.    
14e0: 2a 2a 20 63 61 6c 6c 20 54 63 6c 5f 46 72 65 65  ** call Tcl_Free
14f0: 28 29 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a  () here..    */.
1500: 20 20 20 20 54 63 6c 5f 55 6e 72 65 67 69 73 74      Tcl_Unregist
1510: 65 72 43 68 61 6e 6e 65 6c 28 70 44 62 2d 3e 69  erChannel(pDb->i
1520: 6e 74 65 72 70 2c 20 70 2d 3e 63 68 61 6e 6e 65  nterp, p->channe
1530: 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  l);.  }.}../*.**
1540: 20 43 6c 6f 73 65 20 61 6e 20 69 6e 63 72 65 6d   Close an increm
1550: 65 6e 74 61 6c 20 62 6c 6f 62 20 63 68 61 6e 6e  ental blob chann
1560: 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
1570: 74 20 69 6e 63 72 62 6c 6f 62 43 6c 6f 73 65 28  t incrblobClose(
1580: 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61  ClientData insta
1590: 6e 63 65 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74  nceData, Tcl_Int
15a0: 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20  erp *interp){.  
15b0: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20  IncrblobChannel 
15c0: 2a 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68  *p = (IncrblobCh
15d0: 61 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e 63 65  annel *)instance
15e0: 44 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Data;.  int rc =
15f0: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c   sqlite3_blob_cl
1600: 6f 73 65 28 70 2d 3e 70 42 6c 6f 62 29 3b 0a 20  ose(p->pBlob);. 
1610: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1620: 2d 3e 70 44 62 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  ->pDb->db;..  /*
1630: 20 52 65 6d 6f 76 65 20 74 68 65 20 63 68 61 6e   Remove the chan
1640: 6e 65 6c 20 66 72 6f 6d 20 74 68 65 20 53 71 6c  nel from the Sql
1650: 69 74 65 44 62 2e 70 49 6e 63 72 62 6c 6f 62 20  iteDb.pIncrblob 
1660: 6c 69 73 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70  list. */.  if( p
1670: 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70  ->pNext ){.    p
1680: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
1690: 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20   p->pPrev;.  }. 
16a0: 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b   if( p->pPrev ){
16b0: 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70  .    p->pPrev->p
16c0: 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Next = p->pNext;
16d0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 44  .  }.  if( p->pD
16e0: 62 2d 3e 70 49 6e 63 72 62 6c 6f 62 3d 3d 70 20  b->pIncrblob==p 
16f0: 29 7b 0a 20 20 20 20 70 2d 3e 70 44 62 2d 3e 70  ){.    p->pDb->p
1700: 49 6e 63 72 62 6c 6f 62 20 3d 20 70 2d 3e 70 4e  Incrblob = p->pN
1710: 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  ext;.  }..  /* F
1720: 72 65 65 20 74 68 65 20 49 6e 63 72 62 6c 6f 62  ree the Incrblob
1730: 43 68 61 6e 6e 65 6c 20 73 74 72 75 63 74 75 72  Channel structur
1740: 65 20 2a 2f 0a 20 20 54 63 6c 5f 46 72 65 65 28  e */.  Tcl_Free(
1750: 28 63 68 61 72 20 2a 29 70 29 3b 0a 0a 20 20 69  (char *)p);..  i
1760: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1770: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52   ){.    Tcl_SetR
1780: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
1790: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72  har *)sqlite3_er
17a0: 72 6d 73 67 28 64 62 29 2c 20 54 43 4c 5f 56 4f  rmsg(db), TCL_VO
17b0: 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 72 65 74  LATILE);.    ret
17c0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
17d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
17e0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  OK;.}../*.** Rea
17f0: 64 20 64 61 74 61 20 66 72 6f 6d 20 61 6e 20 69  d data from an i
1800: 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20  ncremental blob 
1810: 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74  channel..*/.stat
1820: 69 63 20 69 6e 74 20 69 6e 63 72 62 6c 6f 62 49  ic int incrblobI
1830: 6e 70 75 74 28 0a 20 20 43 6c 69 65 6e 74 44 61  nput(.  ClientDa
1840: 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c  ta instanceData,
1850: 20 0a 20 20 63 68 61 72 20 2a 62 75 66 2c 20 0a   .  char *buf, .
1860: 20 20 69 6e 74 20 62 75 66 53 69 7a 65 2c 0a 20    int bufSize,. 
1870: 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50   int *errorCodeP
1880: 74 72 0a 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62  tr.){.  Incrblob
1890: 43 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28 49 6e  Channel *p = (In
18a0: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29  crblobChannel *)
18b0: 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20  instanceData;.  
18c0: 69 6e 74 20 6e 52 65 61 64 20 3d 20 62 75 66 53  int nRead = bufS
18d0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ize;         /* 
18e0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
18f0: 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74  to read */.  int
1900: 20 6e 42 6c 6f 62 3b 20 20 20 20 20 20 20 20 20   nBlob;         
1910: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
1920: 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62  al size of the b
1930: 6c 6f 62 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  lob */.  int rc;
1940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1950: 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 20        /* sqlite 
1960: 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 0a 20  error code */.. 
1970: 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33   nBlob = sqlite3
1980: 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70  _blob_bytes(p->p
1990: 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20 28 70 2d  Blob);.  if( (p-
19a0: 3e 69 53 65 65 6b 2b 6e 52 65 61 64 29 3e 6e 42  >iSeek+nRead)>nB
19b0: 6c 6f 62 20 29 7b 0a 20 20 20 20 6e 52 65 61 64  lob ){.    nRead
19c0: 20 3d 20 6e 42 6c 6f 62 2d 70 2d 3e 69 53 65 65   = nBlob-p->iSee
19d0: 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65  k;.  }.  if( nRe
19e0: 61 64 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ad<=0 ){.    ret
19f0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 63  urn 0;.  }..  rc
1a00: 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f   = sqlite3_blob_
1a10: 72 65 61 64 28 70 2d 3e 70 42 6c 6f 62 2c 20 28  read(p->pBlob, (
1a20: 76 6f 69 64 20 2a 29 62 75 66 2c 20 6e 52 65 61  void *)buf, nRea
1a30: 64 2c 20 70 2d 3e 69 53 65 65 6b 29 3b 0a 20 20  d, p->iSeek);.  
1a40: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1a50: 4b 20 29 7b 0a 20 20 20 20 2a 65 72 72 6f 72 43  K ){.    *errorC
1a60: 6f 64 65 50 74 72 20 3d 20 72 63 3b 0a 20 20 20  odePtr = rc;.   
1a70: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a   return -1;.  }.
1a80: 0a 20 20 70 2d 3e 69 53 65 65 6b 20 2b 3d 20 6e  .  p->iSeek += n
1a90: 52 65 61 64 3b 0a 20 20 72 65 74 75 72 6e 20 6e  Read;.  return n
1aa0: 52 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  Read;.}../*.** W
1ab0: 72 69 74 65 20 64 61 74 61 20 74 6f 20 61 6e 20  rite data to an 
1ac0: 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62  incremental blob
1ad0: 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61   channel..*/.sta
1ae0: 74 69 63 20 69 6e 74 20 69 6e 63 72 62 6c 6f 62  tic int incrblob
1af0: 4f 75 74 70 75 74 28 0a 20 20 43 6c 69 65 6e 74  Output(.  Client
1b00: 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74  Data instanceDat
1b10: 61 2c 20 0a 20 20 43 4f 4e 53 54 20 63 68 61 72  a, .  CONST char
1b20: 20 2a 62 75 66 2c 20 0a 20 20 69 6e 74 20 74 6f   *buf, .  int to
1b30: 57 72 69 74 65 2c 0a 20 20 69 6e 74 20 2a 65 72  Write,.  int *er
1b40: 72 6f 72 43 6f 64 65 50 74 72 0a 29 7b 0a 20 20  rorCodePtr.){.  
1b50: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20  IncrblobChannel 
1b60: 2a 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68  *p = (IncrblobCh
1b70: 61 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e 63 65  annel *)instance
1b80: 44 61 74 61 3b 0a 20 20 69 6e 74 20 6e 57 72 69  Data;.  int nWri
1b90: 74 65 20 3d 20 74 6f 57 72 69 74 65 3b 20 20 20  te = toWrite;   
1ba0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1bb0: 66 20 62 79 74 65 73 20 74 6f 20 77 72 69 74 65  f bytes to write
1bc0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 6c 6f 62 3b   */.  int nBlob;
1bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be0: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65     /* Total size
1bf0: 20 6f 66 20 74 68 65 20 62 6c 6f 62 20 2a 2f 0a   of the blob */.
1c00: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c20: 2a 20 73 71 6c 69 74 65 20 65 72 72 6f 72 20 63  * sqlite error c
1c30: 6f 64 65 20 2a 2f 0a 0a 20 20 6e 42 6c 6f 62 20  ode */..  nBlob 
1c40: 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62  = sqlite3_blob_b
1c50: 79 74 65 73 28 70 2d 3e 70 42 6c 6f 62 29 3b 0a  ytes(p->pBlob);.
1c60: 20 20 69 66 28 20 28 70 2d 3e 69 53 65 65 6b 2b    if( (p->iSeek+
1c70: 6e 57 72 69 74 65 29 3e 6e 42 6c 6f 62 20 29 7b  nWrite)>nBlob ){
1c80: 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50  .    *errorCodeP
1c90: 74 72 20 3d 20 45 49 4e 56 41 4c 3b 0a 20 20 20  tr = EINVAL;.   
1ca0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a   return -1;.  }.
1cb0: 20 20 69 66 28 20 6e 57 72 69 74 65 3c 3d 30 20    if( nWrite<=0 
1cc0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
1cd0: 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c  .  }..  rc = sql
1ce0: 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65 28  ite3_blob_write(
1cf0: 70 2d 3e 70 42 6c 6f 62 2c 20 28 76 6f 69 64 20  p->pBlob, (void 
1d00: 2a 29 62 75 66 2c 20 6e 57 72 69 74 65 2c 20 70  *)buf, nWrite, p
1d10: 2d 3e 69 53 65 65 6b 29 3b 0a 20 20 69 66 28 20  ->iSeek);.  if( 
1d20: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1d30: 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50  .    *errorCodeP
1d40: 74 72 20 3d 20 45 49 4f 3b 0a 20 20 20 20 72 65  tr = EIO;.    re
1d50: 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20  turn -1;.  }..  
1d60: 70 2d 3e 69 53 65 65 6b 20 2b 3d 20 6e 57 72 69  p->iSeek += nWri
1d70: 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 6e 57 72  te;.  return nWr
1d80: 69 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  ite;.}../*.** Se
1d90: 65 6b 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  ek an incrementa
1da0: 6c 20 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a  l blob channel..
1db0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
1dc0: 63 72 62 6c 6f 62 53 65 65 6b 28 0a 20 20 43 6c  crblobSeek(.  Cl
1dd0: 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63  ientData instanc
1de0: 65 44 61 74 61 2c 20 0a 20 20 6c 6f 6e 67 20 6f  eData, .  long o
1df0: 66 66 73 65 74 2c 0a 20 20 69 6e 74 20 73 65 65  ffset,.  int see
1e00: 6b 4d 6f 64 65 2c 0a 20 20 69 6e 74 20 2a 65 72  kMode,.  int *er
1e10: 72 6f 72 43 6f 64 65 50 74 72 0a 29 7b 0a 20 20  rorCodePtr.){.  
1e20: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20  IncrblobChannel 
1e30: 2a 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68  *p = (IncrblobCh
1e40: 61 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e 63 65  annel *)instance
1e50: 44 61 74 61 3b 0a 0a 20 20 73 77 69 74 63 68 28  Data;..  switch(
1e60: 20 73 65 65 6b 4d 6f 64 65 20 29 7b 0a 20 20 20   seekMode ){.   
1e70: 20 63 61 73 65 20 53 45 45 4b 5f 53 45 54 3a 0a   case SEEK_SET:.
1e80: 20 20 20 20 20 20 70 2d 3e 69 53 65 65 6b 20 3d        p->iSeek =
1e90: 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 62   offset;.      b
1ea0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
1eb0: 45 45 4b 5f 43 55 52 3a 0a 20 20 20 20 20 20 70  EEK_CUR:.      p
1ec0: 2d 3e 69 53 65 65 6b 20 2b 3d 20 6f 66 66 73 65  ->iSeek += offse
1ed0: 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  t;.      break;.
1ee0: 20 20 20 20 63 61 73 65 20 53 45 45 4b 5f 45 4e      case SEEK_EN
1ef0: 44 3a 0a 20 20 20 20 20 20 70 2d 3e 69 53 65 65  D:.      p->iSee
1f00: 6b 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  k = sqlite3_blob
1f10: 5f 62 79 74 65 73 28 70 2d 3e 70 42 6c 6f 62 29  _bytes(p->pBlob)
1f20: 20 2b 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20   + offset;.     
1f30: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66   break;..    def
1f40: 61 75 6c 74 3a 20 61 73 73 65 72 74 28 21 22 42  ault: assert(!"B
1f50: 61 64 20 73 65 65 6b 4d 6f 64 65 22 29 3b 0a 20  ad seekMode");. 
1f60: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e   }..  return p->
1f70: 69 53 65 65 6b 3b 0a 7d 0a 0a 0a 73 74 61 74 69  iSeek;.}...stati
1f80: 63 20 76 6f 69 64 20 69 6e 63 72 62 6c 6f 62 57  c void incrblobW
1f90: 61 74 63 68 28 43 6c 69 65 6e 74 44 61 74 61 20  atch(ClientData 
1fa0: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 69 6e  instanceData, in
1fb0: 74 20 6d 6f 64 65 29 7b 20 0a 20 20 2f 2a 20 4e  t mode){ .  /* N
1fc0: 4f 2d 4f 50 20 2a 2f 20 0a 7d 0a 73 74 61 74 69  O-OP */ .}.stati
1fd0: 63 20 69 6e 74 20 69 6e 63 72 62 6c 6f 62 48 61  c int incrblobHa
1fe0: 6e 64 6c 65 28 43 6c 69 65 6e 74 44 61 74 61 20  ndle(ClientData 
1ff0: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 69 6e  instanceData, in
2000: 74 20 64 69 72 2c 20 43 6c 69 65 6e 74 44 61 74  t dir, ClientDat
2010: 61 20 2a 68 50 74 72 29 7b 0a 20 20 72 65 74 75  a *hPtr){.  retu
2020: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a  rn TCL_ERROR;.}.
2030: 0a 73 74 61 74 69 63 20 54 63 6c 5f 43 68 61 6e  .static Tcl_Chan
2040: 6e 65 6c 54 79 70 65 20 49 6e 63 72 62 6c 6f 62  nelType Incrblob
2050: 43 68 61 6e 6e 65 6c 54 79 70 65 20 3d 20 7b 0a  ChannelType = {.
2060: 20 20 22 69 6e 63 72 62 6c 6f 62 22 2c 20 20 20    "incrblob",   
2070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2080: 20 20 20 20 20 2f 2a 20 74 79 70 65 4e 61 6d 65       /* typeName
2090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
20b0: 20 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45    TCL_CHANNEL_VE
20c0: 52 53 49 4f 4e 5f 32 2c 20 20 20 20 20 20 20 20  RSION_2,        
20d0: 20 20 20 20 20 2f 2a 20 76 65 72 73 69 6f 6e 20       /* version 
20e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
2100: 20 20 69 6e 63 72 62 6c 6f 62 43 6c 6f 73 65 2c    incrblobClose,
2110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2120: 20 20 20 20 20 2f 2a 20 63 6c 6f 73 65 50 72 6f       /* closePro
2130: 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
2140: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
2150: 20 20 69 6e 63 72 62 6c 6f 62 49 6e 70 75 74 2c    incrblobInput,
2160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2170: 20 20 20 20 20 2f 2a 20 69 6e 70 75 74 50 72 6f       /* inputPro
2180: 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
21a0: 20 20 69 6e 63 72 62 6c 6f 62 4f 75 74 70 75 74    incrblobOutput
21b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
21c0: 20 20 20 20 20 2f 2a 20 6f 75 74 70 75 74 50 72       /* outputPr
21d0: 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  oc              
21e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
21f0: 20 20 69 6e 63 72 62 6c 6f 62 53 65 65 6b 2c 20    incrblobSeek, 
2200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2210: 20 20 20 20 20 2f 2a 20 73 65 65 6b 50 72 6f 63       /* seekProc
2220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2230: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
2240: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
2250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2260: 20 20 20 20 20 2f 2a 20 73 65 74 4f 70 74 69 6f       /* setOptio
2270: 6e 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20  nProc           
2280: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
2290: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
22a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b0: 20 20 20 20 20 2f 2a 20 67 65 74 4f 70 74 69 6f       /* getOptio
22c0: 6e 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20  nProc           
22d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
22e0: 20 20 69 6e 63 72 62 6c 6f 62 57 61 74 63 68 2c    incrblobWatch,
22f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2300: 20 20 20 20 20 2f 2a 20 77 61 74 63 68 50 72 6f       /* watchPro
2310: 63 20 28 74 68 69 73 20 69 73 20 61 20 6e 6f 2d  c (this is a no-
2320: 6f 70 29 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  op)          */.
2330: 20 20 69 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65    incrblobHandle
2340: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2350: 20 20 20 20 20 2f 2a 20 67 65 74 48 61 6e 64 6c       /* getHandl
2360: 65 50 72 6f 63 20 28 61 6c 77 61 79 73 20 72 65  eProc (always re
2370: 74 75 72 6e 73 20 65 72 72 6f 72 29 20 2a 2f 0a  turns error) */.
2380: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
2390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a0: 20 20 20 20 20 2f 2a 20 63 6c 6f 73 65 32 50 72       /* close2Pr
23b0: 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  oc              
23c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
23d0: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
23e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f0: 20 20 20 20 20 2f 2a 20 62 6c 6f 63 6b 4d 6f 64       /* blockMod
2400: 65 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20  eProc           
2410: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
2420: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
2430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2440: 20 20 20 20 20 2f 2a 20 66 6c 75 73 68 50 72 6f       /* flushPro
2450: 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
2460: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
2470: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
2480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2490: 20 20 20 20 20 2f 2a 20 68 61 6e 64 6c 65 72 50       /* handlerP
24a0: 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20  roc             
24b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
24c0: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
24d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e0: 20 20 20 20 20 2f 2a 20 77 69 64 65 53 65 65 6b       /* wideSeek
24f0: 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20  Proc            
2500: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
2510: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  };../*.** Create
2520: 20 61 20 6e 65 77 20 69 6e 63 72 62 6c 6f 62 20   a new incrblob 
2530: 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74  channel..*/.stat
2540: 69 63 20 69 6e 74 20 63 72 65 61 74 65 49 6e 63  ic int createInc
2550: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 28 0a 20 20  rblobChannel(.  
2560: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2570: 72 70 2c 20 0a 20 20 53 71 6c 69 74 65 44 62 20  rp, .  SqliteDb 
2580: 2a 70 44 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63  *pDb, .  const c
2590: 68 61 72 20 2a 7a 44 62 2c 0a 20 20 63 6f 6e 73  har *zDb,.  cons
25a0: 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 2c 20  t char *zTable, 
25b0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
25c0: 43 6f 6c 75 6d 6e 2c 20 0a 20 20 73 71 6c 69 74  Column, .  sqlit
25d0: 65 5f 69 6e 74 36 34 20 69 52 6f 77 2c 0a 20 20  e_int64 iRow,.  
25e0: 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 0a 29  int isReadonly.)
25f0: 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e  {.  IncrblobChan
2600: 6e 65 6c 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65  nel *p;.  sqlite
2610: 33 20 2a 64 62 20 3d 20 70 44 62 2d 3e 64 62 3b  3 *db = pDb->db;
2620: 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20  .  sqlite3_blob 
2630: 2a 70 42 6c 6f 62 3b 0a 20 20 69 6e 74 20 72 63  *pBlob;.  int rc
2640: 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  ;.  int flags = 
2650: 54 43 4c 5f 52 45 41 44 41 42 4c 45 7c 28 69 73  TCL_READABLE|(is
2660: 52 65 61 64 6f 6e 6c 79 20 3f 20 30 20 3a 20 54  Readonly ? 0 : T
2670: 43 4c 5f 57 52 49 54 41 42 4c 45 29 3b 0a 0a 20  CL_WRITABLE);.. 
2680: 20 2f 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c   /* This variabl
2690: 65 20 69 73 20 75 73 65 64 20 74 6f 20 6e 61 6d  e is used to nam
26a0: 65 20 74 68 65 20 63 68 61 6e 6e 65 6c 73 3a 20  e the channels: 
26b0: 22 69 6e 63 72 62 6c 6f 62 5f 5b 69 6e 63 72 20  "incrblob_[incr 
26c0: 63 6f 75 6e 74 5d 22 20 2a 2f 0a 20 20 73 74 61  count]" */.  sta
26d0: 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 20 3d 20  tic int count = 
26e0: 30 3b 0a 20 20 63 68 61 72 20 7a 43 68 61 6e 6e  0;.  char zChann
26f0: 65 6c 5b 36 34 5d 3b 0a 0a 20 20 72 63 20 3d 20  el[64];..  rc = 
2700: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65  sqlite3_blob_ope
2710: 6e 28 64 62 2c 20 7a 44 62 2c 20 7a 54 61 62 6c  n(db, zDb, zTabl
2720: 65 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 69 52 6f 77  e, zColumn, iRow
2730: 2c 20 21 69 73 52 65 61 64 6f 6e 6c 79 2c 20 26  , !isReadonly, &
2740: 70 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20 72 63  pBlob);.  if( rc
2750: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2760: 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
2770: 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
2780: 29 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28  )sqlite3_errmsg(
2790: 70 44 62 2d 3e 64 62 29 2c 20 54 43 4c 5f 56 4f  pDb->db), TCL_VO
27a0: 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 72 65 74  LATILE);.    ret
27b0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
27c0: 20 7d 0a 0a 20 20 70 20 3d 20 28 49 6e 63 72 62   }..  p = (Incrb
27d0: 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 54 63 6c  lobChannel *)Tcl
27e0: 5f 41 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 49 6e  _Alloc(sizeof(In
27f0: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 29 29 3b  crblobChannel));
2800: 0a 20 20 70 2d 3e 69 53 65 65 6b 20 3d 20 30 3b  .  p->iSeek = 0;
2810: 0a 20 20 70 2d 3e 70 42 6c 6f 62 20 3d 20 70 42  .  p->pBlob = pB
2820: 6c 6f 62 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  lob;..  sqlite3_
2830: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
2840: 7a 43 68 61 6e 6e 65 6c 29 2c 20 7a 43 68 61 6e  zChannel), zChan
2850: 6e 65 6c 2c 20 22 69 6e 63 72 62 6c 6f 62 5f 25  nel, "incrblob_%
2860: 64 22 2c 20 2b 2b 63 6f 75 6e 74 29 3b 0a 20 20  d", ++count);.  
2870: 70 2d 3e 63 68 61 6e 6e 65 6c 20 3d 20 54 63 6c  p->channel = Tcl
2880: 5f 43 72 65 61 74 65 43 68 61 6e 6e 65 6c 28 26  _CreateChannel(&
2890: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 54  IncrblobChannelT
28a0: 79 70 65 2c 20 7a 43 68 61 6e 6e 65 6c 2c 20 70  ype, zChannel, p
28b0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 54 63 6c 5f  , flags);.  Tcl_
28c0: 52 65 67 69 73 74 65 72 43 68 61 6e 6e 65 6c 28  RegisterChannel(
28d0: 69 6e 74 65 72 70 2c 20 70 2d 3e 63 68 61 6e 6e  interp, p->chann
28e0: 65 6c 29 3b 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20  el);..  /* Link 
28f0: 74 68 65 20 6e 65 77 20 63 68 61 6e 6e 65 6c 20  the new channel 
2900: 69 6e 74 6f 20 74 68 65 20 53 71 6c 69 74 65 44  into the SqliteD
2910: 62 2e 70 49 6e 63 72 62 6c 6f 62 20 6c 69 73 74  b.pIncrblob list
2920: 2e 20 2a 2f 0a 20 20 70 2d 3e 70 4e 65 78 74 20  . */.  p->pNext 
2930: 3d 20 70 44 62 2d 3e 70 49 6e 63 72 62 6c 6f 62  = pDb->pIncrblob
2940: 3b 0a 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30  ;.  p->pPrev = 0
2950: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74  ;.  if( p->pNext
2960: 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74   ){.    p->pNext
2970: 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 7d  ->pPrev = p;.  }
2980: 0a 20 20 70 44 62 2d 3e 70 49 6e 63 72 62 6c 6f  .  pDb->pIncrblo
2990: 62 20 3d 20 70 3b 0a 20 20 70 2d 3e 70 44 62 20  b = p;.  p->pDb 
29a0: 3d 20 70 44 62 3b 0a 0a 20 20 54 63 6c 5f 53 65  = pDb;..  Tcl_Se
29b0: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
29c0: 28 63 68 61 72 20 2a 29 54 63 6c 5f 47 65 74 43  (char *)Tcl_GetC
29d0: 68 61 6e 6e 65 6c 4e 61 6d 65 28 70 2d 3e 63 68  hannelName(p->ch
29e0: 61 6e 6e 65 6c 29 2c 20 54 43 4c 5f 56 4f 4c 41  annel), TCL_VOLA
29f0: 54 49 4c 45 29 3b 0a 20 20 72 65 74 75 72 6e 20  TILE);.  return 
2a00: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6c 73 65 20  TCL_OK;.}.#else 
2a10: 20 2f 2a 20 65 6c 73 65 20 63 6c 61 75 73 65 20   /* else clause 
2a20: 66 6f 72 20 22 23 69 66 6e 64 65 66 20 53 51 4c  for "#ifndef SQL
2a30: 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
2a40: 42 22 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  B" */.  #define 
2a50: 63 6c 6f 73 65 49 6e 63 72 62 6c 6f 62 43 68 61  closeIncrblobCha
2a60: 6e 6e 65 6c 73 28 70 44 62 29 0a 23 65 6e 64 69  nnels(pDb).#endi
2a70: 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 61 74  f../*.** Look at
2a80: 20 74 68 65 20 73 63 72 69 70 74 20 70 72 65 66   the script pref
2a90: 69 78 20 69 6e 20 70 43 6d 64 2e 20 20 57 65 20  ix in pCmd.  We 
2aa0: 77 69 6c 6c 20 62 65 20 65 78 65 63 75 74 69 6e  will be executin
2ab0: 67 20 74 68 69 73 20 73 63 72 69 70 74 0a 2a 2a  g this script.**
2ac0: 20 61 66 74 65 72 20 66 69 72 73 74 20 61 70 70   after first app
2ad0: 65 6e 64 69 6e 67 20 6f 6e 65 20 6f 72 20 6d 6f  ending one or mo
2ae0: 72 65 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 54  re arguments.  T
2af0: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c  his routine anal
2b00: 79 7a 65 73 0a 2a 2a 20 74 68 65 20 73 63 72 69  yzes.** the scri
2b10: 70 74 20 74 6f 20 73 65 65 20 69 66 20 69 74 20  pt to see if it 
2b20: 69 73 20 73 61 66 65 20 74 6f 20 75 73 65 20 54  is safe to use T
2b30: 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 6f 6e  cl_EvalObjv() on
2b40: 20 74 68 65 20 73 63 72 69 70 74 0a 2a 2a 20 72   the script.** r
2b50: 61 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6d  ather than the m
2b60: 6f 72 65 20 67 65 6e 65 72 61 6c 20 54 63 6c 5f  ore general Tcl_
2b70: 45 76 61 6c 45 78 28 29 2e 20 20 54 63 6c 5f 45  EvalEx().  Tcl_E
2b80: 76 61 6c 4f 62 6a 76 28 29 20 69 73 20 6d 75 63  valObjv() is muc
2b90: 68 0a 2a 2a 20 66 61 73 74 65 72 2e 0a 2a 2a 0a  h.** faster..**.
2ba0: 2a 2a 20 53 63 72 69 70 74 73 20 74 68 61 74 20  ** Scripts that 
2bb0: 61 72 65 20 73 61 66 65 20 74 6f 20 75 73 65 20  are safe to use 
2bc0: 77 69 74 68 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  with Tcl_EvalObj
2bd0: 76 28 29 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  v() consists of 
2be0: 61 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d  a.** command nam
2bf0: 65 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 7a 65  e followed by ze
2c00: 72 6f 20 6f 72 20 6d 6f 72 65 20 61 72 67 75 6d  ro or more argum
2c10: 65 6e 74 73 20 77 69 74 68 20 6e 6f 20 5b 2e 2e  ents with no [..
2c20: 2e 5d 20 6f 72 20 24 0a 2a 2a 20 6f 72 20 7b 2e  .] or $.** or {.
2c30: 2e 2e 7d 20 6f 72 20 3b 20 74 6f 20 62 65 20 73  ..} or ; to be s
2c40: 65 65 6e 20 61 6e 79 77 68 65 72 65 2e 20 20 4d  een anywhere.  M
2c50: 6f 73 74 20 63 61 6c 6c 62 61 63 6b 20 73 63 72  ost callback scr
2c60: 69 70 74 73 20 63 6f 6e 73 69 73 74 0a 2a 2a 20  ipts consist.** 
2c70: 6f 66 20 6a 75 73 74 20 61 20 73 69 6e 67 6c 65  of just a single
2c80: 20 70 72 6f 63 65 64 75 72 65 20 6e 61 6d 65 20   procedure name 
2c90: 61 6e 64 20 74 68 65 79 20 6d 65 65 74 20 74 68  and they meet th
2ca0: 69 73 20 72 65 71 75 69 72 65 6d 65 6e 74 2e 0a  is requirement..
2cb0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  */.static int sa
2cc0: 66 65 54 6f 55 73 65 45 76 61 6c 4f 62 6a 76 28  feToUseEvalObjv(
2cd0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2ce0: 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d  rp, Tcl_Obj *pCm
2cf0: 64 29 7b 0a 20 20 2f 2a 20 57 65 20 63 6f 75 6c  d){.  /* We coul
2d00: 64 20 74 72 79 20 74 6f 20 64 6f 20 73 6f 6d 65  d try to do some
2d10: 74 68 69 6e 67 20 77 69 74 68 20 54 63 6c 5f 50  thing with Tcl_P
2d20: 61 72 73 65 28 29 2e 20 20 42 75 74 20 77 65 20  arse().  But we 
2d30: 77 69 6c 6c 20 69 6e 73 74 65 61 64 0a 20 20 2a  will instead.  *
2d40: 2a 20 6a 75 73 74 20 64 6f 20 61 20 73 65 61 72  * just do a sear
2d50: 63 68 20 66 6f 72 20 66 6f 72 62 69 64 64 65 6e  ch for forbidden
2d60: 20 63 68 61 72 61 63 74 65 72 73 2e 20 20 49 66   characters.  If
2d70: 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 72 62   any of the forb
2d80: 69 64 64 65 6e 0a 20 20 2a 2a 20 63 68 61 72 61  idden.  ** chara
2d90: 63 74 65 72 73 20 61 70 70 65 61 72 20 69 6e 20  cters appear in 
2da0: 70 43 6d 64 2c 20 77 65 20 77 69 6c 6c 20 72 65  pCmd, we will re
2db0: 70 6f 72 74 20 74 68 65 20 73 74 72 69 6e 67 20  port the string 
2dc0: 61 73 20 75 6e 73 61 66 65 2e 0a 20 20 2a 2f 0a  as unsafe..  */.
2dd0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
2de0: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 7a 20 3d 20  .  int n;.  z = 
2df0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
2e00: 6d 4f 62 6a 28 70 43 6d 64 2c 20 26 6e 29 3b 0a  mObj(pCmd, &n);.
2e10: 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30    while( n-- > 0
2e20: 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 20 3d 20   ){.    int c = 
2e30: 2a 28 7a 2b 2b 29 3b 0a 20 20 20 20 69 66 28 20  *(z++);.    if( 
2e40: 63 3d 3d 27 24 27 20 7c 7c 20 63 3d 3d 27 5b 27  c=='$' || c=='['
2e50: 20 7c 7c 20 63 3d 3d 27 3b 27 20 29 20 72 65 74   || c==';' ) ret
2e60: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
2e70: 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 1;.}../*.** 
2e80: 46 69 6e 64 20 61 6e 20 53 71 6c 46 75 6e 63 20  Find an SqlFunc 
2e90: 73 74 72 75 63 74 75 72 65 20 77 69 74 68 20 74  structure with t
2ea0: 68 65 20 67 69 76 65 6e 20 6e 61 6d 65 2e 20 20  he given name.  
2eb0: 4f 72 20 63 72 65 61 74 65 20 61 20 6e 65 77 0a  Or create a new.
2ec0: 2a 2a 20 6f 6e 65 20 69 66 20 61 6e 20 65 78 69  ** one if an exi
2ed0: 73 74 69 6e 67 20 6f 6e 65 20 63 61 6e 6e 6f 74  sting one cannot
2ee0: 20 62 65 20 66 6f 75 6e 64 2e 20 20 52 65 74 75   be found.  Retu
2ef0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
2f00: 74 68 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  the.** structure
2f10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 71 6c 46  ..*/.static SqlF
2f20: 75 6e 63 20 2a 66 69 6e 64 53 71 6c 46 75 6e 63  unc *findSqlFunc
2f30: 28 53 71 6c 69 74 65 44 62 20 2a 70 44 62 2c 20  (SqliteDb *pDb, 
2f40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
2f50: 65 29 7b 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70  e){.  SqlFunc *p
2f60: 2c 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69  , *pNew;.  int i
2f70: 3b 0a 20 20 70 4e 65 77 20 3d 20 28 53 71 6c 46  ;.  pNew = (SqlF
2f80: 75 6e 63 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20  unc*)Tcl_Alloc( 
2f90: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20  sizeof(*pNew) + 
2fa0: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 20 2b 20  strlen(zName) + 
2fb0: 31 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 7a 4e 61  1 );.  pNew->zNa
2fc0: 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65  me = (char*)&pNe
2fd0: 77 5b 31 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  w[1];.  for(i=0;
2fe0: 20 7a 4e 61 6d 65 5b 69 5d 3b 20 69 2b 2b 29 7b   zName[i]; i++){
2ff0: 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 5b 69 5d 20   pNew->zName[i] 
3000: 3d 20 74 6f 6c 6f 77 65 72 28 7a 4e 61 6d 65 5b  = tolower(zName[
3010: 69 5d 29 3b 20 7d 0a 20 20 70 4e 65 77 2d 3e 7a  i]); }.  pNew->z
3020: 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 66  Name[i] = 0;.  f
3030: 6f 72 28 70 3d 70 44 62 2d 3e 70 46 75 6e 63 3b  or(p=pDb->pFunc;
3040: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
3050: 20 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70   .    if( strcmp
3060: 28 70 2d 3e 7a 4e 61 6d 65 2c 20 70 4e 65 77 2d  (p->zName, pNew-
3070: 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  >zName)==0 ){.  
3080: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68      Tcl_Free((ch
3090: 61 72 2a 29 70 4e 65 77 29 3b 0a 20 20 20 20 20  ar*)pNew);.     
30a0: 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20 20 7d   return p;.    }
30b0: 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 69 6e 74  .  }.  pNew->int
30c0: 65 72 70 20 3d 20 70 44 62 2d 3e 69 6e 74 65 72  erp = pDb->inter
30d0: 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 63 72 69  p;.  pNew->pScri
30e0: 70 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  pt = 0;.  pNew->
30f0: 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 70 46 75  pNext = pDb->pFu
3100: 6e 63 3b 0a 20 20 70 44 62 2d 3e 70 46 75 6e 63  nc;.  pDb->pFunc
3110: 20 3d 20 70 4e 65 77 3b 0a 20 20 72 65 74 75 72   = pNew;.  retur
3120: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
3130: 20 46 69 6e 61 6c 69 7a 65 20 61 6e 64 20 66 72   Finalize and fr
3140: 65 65 20 61 20 6c 69 73 74 20 6f 66 20 70 72 65  ee a list of pre
3150: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73  pared statements
3160: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3170: 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28 20  flushStmtCache( 
3180: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 29 7b  SqliteDb *pDb ){
3190: 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74  .  SqlPreparedSt
31a0: 6d 74 20 2a 70 50 72 65 53 74 6d 74 3b 0a 0a 20  mt *pPreStmt;.. 
31b0: 20 77 68 69 6c 65 28 20 20 70 44 62 2d 3e 73 74   while(  pDb->st
31c0: 6d 74 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 71  mtList ){.    sq
31d0: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 20  lite3_finalize( 
31e0: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 2d 3e 70  pDb->stmtList->p
31f0: 53 74 6d 74 20 29 3b 0a 20 20 20 20 70 50 72 65  Stmt );.    pPre
3200: 53 74 6d 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74  Stmt = pDb->stmt
3210: 4c 69 73 74 3b 0a 20 20 20 20 70 44 62 2d 3e 73  List;.    pDb->s
3220: 74 6d 74 4c 69 73 74 20 3d 20 70 44 62 2d 3e 73  tmtList = pDb->s
3230: 74 6d 74 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a  tmtList->pNext;.
3240: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 20 28 63      Tcl_Free( (c
3250: 68 61 72 2a 29 70 50 72 65 53 74 6d 74 20 29 3b  har*)pPreStmt );
3260: 0a 20 20 7d 0a 20 20 70 44 62 2d 3e 6e 53 74 6d  .  }.  pDb->nStm
3270: 74 20 3d 20 30 3b 0a 20 20 70 44 62 2d 3e 73 74  t = 0;.  pDb->st
3280: 6d 74 4c 61 73 74 20 3d 20 30 3b 0a 7d 0a 0a 2f  mtLast = 0;.}../
3290: 2a 0a 2a 2a 20 54 43 4c 20 63 61 6c 6c 73 20 74  *.** TCL calls t
32a0: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 77 68  his procedure wh
32b0: 65 6e 20 61 6e 20 73 71 6c 69 74 65 33 20 64 61  en an sqlite3 da
32c0: 74 61 62 61 73 65 20 63 6f 6d 6d 61 6e 64 20 69  tabase command i
32d0: 73 0a 2a 2a 20 64 65 6c 65 74 65 64 2e 0a 2a 2f  s.** deleted..*/
32e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44 62 44  .static void DbD
32f0: 65 6c 65 74 65 43 6d 64 28 76 6f 69 64 20 2a 64  eleteCmd(void *d
3300: 62 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  b){.  SqliteDb *
3310: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a  pDb = (SqliteDb*
3320: 29 64 62 3b 0a 20 20 66 6c 75 73 68 53 74 6d 74  )db;.  flushStmt
3330: 43 61 63 68 65 28 70 44 62 29 3b 0a 20 20 63 6c  Cache(pDb);.  cl
3340: 6f 73 65 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  oseIncrblobChann
3350: 65 6c 73 28 70 44 62 29 3b 0a 20 20 73 71 6c 69  els(pDb);.  sqli
3360: 74 65 33 5f 63 6c 6f 73 65 28 70 44 62 2d 3e 64  te3_close(pDb->d
3370: 62 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 44 62  b);.  while( pDb
3380: 2d 3e 70 46 75 6e 63 20 29 7b 0a 20 20 20 20 53  ->pFunc ){.    S
3390: 71 6c 46 75 6e 63 20 2a 70 46 75 6e 63 20 3d 20  qlFunc *pFunc = 
33a0: 70 44 62 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20  pDb->pFunc;.    
33b0: 70 44 62 2d 3e 70 46 75 6e 63 20 3d 20 70 46 75  pDb->pFunc = pFu
33c0: 6e 63 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 54  nc->pNext;.    T
33d0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
33e0: 70 46 75 6e 63 2d 3e 70 53 63 72 69 70 74 29 3b  pFunc->pScript);
33f0: 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63  .    Tcl_Free((c
3400: 68 61 72 2a 29 70 46 75 6e 63 29 3b 0a 20 20 7d  har*)pFunc);.  }
3410: 0a 20 20 77 68 69 6c 65 28 20 70 44 62 2d 3e 70  .  while( pDb->p
3420: 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 53  Collate ){.    S
3430: 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c  qlCollate *pColl
3440: 61 74 65 20 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c  ate = pDb->pColl
3450: 61 74 65 3b 0a 20 20 20 20 70 44 62 2d 3e 70 43  ate;.    pDb->pC
3460: 6f 6c 6c 61 74 65 20 3d 20 70 43 6f 6c 6c 61 74  ollate = pCollat
3470: 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 54 63  e->pNext;.    Tc
3480: 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 43  l_Free((char*)pC
3490: 6f 6c 6c 61 74 65 29 3b 0a 20 20 7d 0a 20 20 69  ollate);.  }.  i
34a0: 66 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b  f( pDb->zBusy ){
34b0: 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44  .    Tcl_Free(pD
34c0: 62 2d 3e 7a 42 75 73 79 29 3b 0a 20 20 7d 0a 20  b->zBusy);.  }. 
34d0: 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65   if( pDb->zTrace
34e0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65   ){.    Tcl_Free
34f0: 28 70 44 62 2d 3e 7a 54 72 61 63 65 29 3b 0a 20  (pDb->zTrace);. 
3500: 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 50   }.  if( pDb->zP
3510: 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 54 63  rofile ){.    Tc
3520: 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 50 72 6f  l_Free(pDb->zPro
3530: 66 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  file);.  }.  if(
3540: 20 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20   pDb->zAuth ){. 
3550: 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d     Tcl_Free(pDb-
3560: 3e 7a 41 75 74 68 29 3b 0a 20 20 7d 0a 20 20 69  >zAuth);.  }.  i
3570: 66 28 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 29 7b  f( pDb->zNull ){
3580: 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44  .    Tcl_Free(pD
3590: 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20  b->zNull);.  }. 
35a0: 20 69 66 28 20 70 44 62 2d 3e 70 55 70 64 61 74   if( pDb->pUpdat
35b0: 65 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 54 63 6c  eHook ){.    Tcl
35c0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44  _DecrRefCount(pD
35d0: 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 29 3b  b->pUpdateHook);
35e0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e  .  }.  if( pDb->
35f0: 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 20 29 7b  pRollbackHook ){
3600: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
3610: 43 6f 75 6e 74 28 70 44 62 2d 3e 70 52 6f 6c 6c  Count(pDb->pRoll
3620: 62 61 63 6b 48 6f 6f 6b 29 3b 0a 20 20 7d 0a 20  backHook);.  }. 
3630: 20 69 66 28 20 70 44 62 2d 3e 70 43 6f 6c 6c 61   if( pDb->pColla
3640: 74 65 4e 65 65 64 65 64 20 29 7b 0a 20 20 20 20  teNeeded ){.    
3650: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
3660: 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65  (pDb->pCollateNe
3670: 65 64 65 64 29 3b 0a 20 20 7d 0a 20 20 54 63 6c  eded);.  }.  Tcl
3680: 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 44 62  _Free((char*)pDb
3690: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
36a0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
36b0: 65 64 20 77 68 65 6e 20 61 20 64 61 74 61 62 61  ed when a databa
36c0: 73 65 20 66 69 6c 65 20 69 73 20 6c 6f 63 6b 65  se file is locke
36d0: 64 20 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a  d while trying.*
36e0: 2a 20 74 6f 20 65 78 65 63 75 74 65 20 53 51 4c  * to execute SQL
36f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3700: 44 62 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f  DbBusyHandler(vo
3710: 69 64 20 2a 63 64 2c 20 69 6e 74 20 6e 54 72 69  id *cd, int nTri
3720: 65 73 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20  es){.  SqliteDb 
3730: 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62  *pDb = (SqliteDb
3740: 2a 29 63 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  *)cd;.  int rc;.
3750: 20 20 63 68 61 72 20 7a 56 61 6c 5b 33 30 5d 3b    char zVal[30];
3760: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ..  sqlite3_snpr
3770: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 56 61 6c  intf(sizeof(zVal
3780: 29 2c 20 7a 56 61 6c 2c 20 22 25 64 22 2c 20 6e  ), zVal, "%d", n
3790: 54 72 69 65 73 29 3b 0a 20 20 72 63 20 3d 20 54  Tries);.  rc = T
37a0: 63 6c 5f 56 61 72 45 76 61 6c 28 70 44 62 2d 3e  cl_VarEval(pDb->
37b0: 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 42 75  interp, pDb->zBu
37c0: 73 79 2c 20 22 20 22 2c 20 7a 56 61 6c 2c 20 28  sy, " ", zVal, (
37d0: 63 68 61 72 2a 29 30 29 3b 0a 20 20 69 66 28 20  char*)0);.  if( 
37e0: 72 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74  rc!=TCL_OK || at
37f0: 6f 69 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  oi(Tcl_GetString
3800: 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65  Result(pDb->inte
3810: 72 70 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75  rp)) ){.    retu
3820: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
3830: 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn 1;.}../*.** T
3840: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69  his routine is i
3850: 6e 76 6f 6b 65 64 20 61 73 20 74 68 65 20 27 70  nvoked as the 'p
3860: 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b  rogress callback
3870: 27 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  ' for the databa
3880: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
3890: 74 20 44 62 50 72 6f 67 72 65 73 73 48 61 6e 64  t DbProgressHand
38a0: 6c 65 72 28 76 6f 69 64 20 2a 63 64 29 7b 0a 20  ler(void *cd){. 
38b0: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
38c0: 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a   (SqliteDb*)cd;.
38d0: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
38e0: 65 72 74 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72  ert( pDb->zProgr
38f0: 65 73 73 20 29 3b 0a 20 20 72 63 20 3d 20 54 63  ess );.  rc = Tc
3900: 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65  l_Eval(pDb->inte
3910: 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65  rp, pDb->zProgre
3920: 73 73 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 54  ss);.  if( rc!=T
3930: 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28 54 63  CL_OK || atoi(Tc
3940: 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
3950: 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 29 20  t(pDb->interp)) 
3960: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
3970: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
3980: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
3990: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a  TE_OMIT_TRACE./*
39a0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
39b0: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
39c0: 65 20 53 51 4c 69 74 65 20 74 72 61 63 65 20 68  e SQLite trace h
39d0: 61 6e 64 6c 65 72 20 77 68 65 6e 65 76 65 72 20  andler whenever 
39e0: 61 20 6e 65 77 0a 2a 2a 20 62 6c 6f 63 6b 20 6f  a new.** block o
39f0: 66 20 53 51 4c 20 69 73 20 65 78 65 63 75 74 65  f SQL is execute
3a00: 64 2e 20 20 54 68 65 20 54 43 4c 20 73 63 72 69  d.  The TCL scri
3a10: 70 74 20 69 6e 20 70 44 62 2d 3e 7a 54 72 61 63  pt in pDb->zTrac
3a20: 65 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a 2a  e is executed..*
3a30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44 62  /.static void Db
3a40: 54 72 61 63 65 48 61 6e 64 6c 65 72 28 76 6f 69  TraceHandler(voi
3a50: 64 20 2a 63 64 2c 20 63 6f 6e 73 74 20 63 68 61  d *cd, const cha
3a60: 72 20 2a 7a 53 71 6c 29 7b 0a 20 20 53 71 6c 69  r *zSql){.  Sqli
3a70: 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c  teDb *pDb = (Sql
3a80: 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 54 63 6c  iteDb*)cd;.  Tcl
3a90: 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a 0a 20  _DString str;.. 
3aa0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
3ab0: 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f 44 53  (&str);.  Tcl_DS
3ac0: 74 72 69 6e 67 41 70 70 65 6e 64 28 26 73 74 72  tringAppend(&str
3ad0: 2c 20 70 44 62 2d 3e 7a 54 72 61 63 65 2c 20 2d  , pDb->zTrace, -
3ae0: 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  1);.  Tcl_DStrin
3af0: 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26  gAppendElement(&
3b00: 73 74 72 2c 20 7a 53 71 6c 29 3b 0a 20 20 54 63  str, zSql);.  Tc
3b10: 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65  l_Eval(pDb->inte
3b20: 72 70 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56  rp, Tcl_DStringV
3b30: 61 6c 75 65 28 26 73 74 72 29 29 3b 0a 20 20 54  alue(&str));.  T
3b40: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
3b50: 73 74 72 29 3b 0a 20 20 54 63 6c 5f 52 65 73 65  str);.  Tcl_Rese
3b60: 74 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74  tResult(pDb->int
3b70: 65 72 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  erp);.}.#endif..
3b80: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
3b90: 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20  MIT_TRACE./*.** 
3ba0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
3bb0: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 53 51  called by the SQ
3bc0: 4c 69 74 65 20 70 72 6f 66 69 6c 65 20 68 61 6e  Lite profile han
3bd0: 64 6c 65 72 20 61 66 74 65 72 20 61 20 73 74 61  dler after a sta
3be0: 74 65 6d 65 6e 74 0a 2a 2a 20 53 51 4c 20 68 61  tement.** SQL ha
3bf0: 73 20 65 78 65 63 75 74 65 64 2e 20 20 54 68 65  s executed.  The
3c00: 20 54 43 4c 20 73 63 72 69 70 74 20 69 6e 20 70   TCL script in p
3c10: 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 69 73 20  Db->zProfile is 
3c20: 65 76 61 6c 75 61 74 65 64 2e 0a 2a 2f 0a 73 74  evaluated..*/.st
3c30: 61 74 69 63 20 76 6f 69 64 20 44 62 50 72 6f 66  atic void DbProf
3c40: 69 6c 65 48 61 6e 64 6c 65 72 28 76 6f 69 64 20  ileHandler(void 
3c50: 2a 63 64 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *cd, const char 
3c60: 2a 7a 53 71 6c 2c 20 73 71 6c 69 74 65 5f 75 69  *zSql, sqlite_ui
3c70: 6e 74 36 34 20 74 6d 29 7b 0a 20 20 53 71 6c 69  nt64 tm){.  Sqli
3c80: 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c  teDb *pDb = (Sql
3c90: 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 54 63 6c  iteDb*)cd;.  Tcl
3ca0: 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a 20 20  _DString str;.  
3cb0: 63 68 61 72 20 7a 54 6d 5b 31 30 30 5d 3b 0a 0a  char zTm[100];..
3cc0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
3cd0: 74 66 28 73 69 7a 65 6f 66 28 7a 54 6d 29 2d 31  tf(sizeof(zTm)-1
3ce0: 2c 20 7a 54 6d 2c 20 22 25 6c 6c 64 22 2c 20 74  , zTm, "%lld", t
3cf0: 6d 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  m);.  Tcl_DStrin
3d00: 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 54  gInit(&str);.  T
3d10: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
3d20: 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a 50 72 6f  (&str, pDb->zPro
3d30: 66 69 6c 65 2c 20 2d 31 29 3b 0a 20 20 54 63 6c  file, -1);.  Tcl
3d40: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c  _DStringAppendEl
3d50: 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 53 71 6c  ement(&str, zSql
3d60: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
3d70: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73  AppendElement(&s
3d80: 74 72 2c 20 7a 54 6d 29 3b 0a 20 20 54 63 6c 5f  tr, zTm);.  Tcl_
3d90: 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70  Eval(pDb->interp
3da0: 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c  , Tcl_DStringVal
3db0: 75 65 28 26 73 74 72 29 29 3b 0a 20 20 54 63 6c  ue(&str));.  Tcl
3dc0: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 73 74  _DStringFree(&st
3dd0: 72 29 3b 0a 20 20 54 63 6c 5f 52 65 73 65 74 52  r);.  Tcl_ResetR
3de0: 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72  esult(pDb->inter
3df0: 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  p);.}.#endif../*
3e00: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
3e10: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
3e20: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
3e30: 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 54 68 65   committed.  The
3e40: 0a 2a 2a 20 54 43 4c 20 73 63 72 69 70 74 20 69  .** TCL script i
3e50: 6e 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 69  n pDb->zCommit i
3e60: 73 20 65 78 65 63 75 74 65 64 2e 20 20 49 66 20  s executed.  If 
3e70: 69 74 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a  it returns non-z
3e80: 65 72 6f 20 6f 72 0a 2a 2a 20 69 66 20 69 74 20  ero or.** if it 
3e90: 74 68 72 6f 77 73 20 61 6e 20 65 78 63 65 70 74  throws an except
3ea0: 69 6f 6e 2c 20 74 68 65 20 74 72 61 6e 73 61 63  ion, the transac
3eb0: 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
3ec0: 61 63 6b 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f  ack instead.** o
3ed0: 66 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65  f being committe
3ee0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
3ef0: 20 44 62 43 6f 6d 6d 69 74 48 61 6e 64 6c 65 72   DbCommitHandler
3f00: 28 76 6f 69 64 20 2a 63 64 29 7b 0a 20 20 53 71  (void *cd){.  Sq
3f10: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
3f20: 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69  qliteDb*)cd;.  i
3f30: 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 54  nt rc;..  rc = T
3f40: 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74  cl_Eval(pDb->int
3f50: 65 72 70 2c 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69  erp, pDb->zCommi
3f60: 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 54 43  t);.  if( rc!=TC
3f70: 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28 54 63 6c  L_OK || atoi(Tcl
3f80: 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74  _GetStringResult
3f90: 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 29 20 29  (pDb->interp)) )
3fa0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
3fb0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
3fc0: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44  }..static void D
3fd0: 62 52 6f 6c 6c 62 61 63 6b 48 61 6e 64 6c 65 72  bRollbackHandler
3fe0: 28 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74  (void *clientDat
3ff0: 61 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  a){.  SqliteDb *
4000: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a  pDb = (SqliteDb*
4010: 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 61  )clientData;.  a
4020: 73 73 65 72 74 28 70 44 62 2d 3e 70 52 6f 6c 6c  ssert(pDb->pRoll
4030: 62 61 63 6b 48 6f 6f 6b 29 3b 0a 20 20 69 66 28  backHook);.  if(
4040: 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 45 76 61   TCL_OK!=Tcl_Eva
4050: 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65  lObjEx(pDb->inte
4060: 72 70 2c 20 70 44 62 2d 3e 70 52 6f 6c 6c 62 61  rp, pDb->pRollba
4070: 63 6b 48 6f 6f 6b 2c 20 30 29 20 29 7b 0a 20 20  ckHook, 0) ){.  
4080: 20 20 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64    Tcl_Background
4090: 45 72 72 6f 72 28 70 44 62 2d 3e 69 6e 74 65 72  Error(pDb->inter
40a0: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  p);.  }.}..stati
40b0: 63 20 76 6f 69 64 20 44 62 55 70 64 61 74 65 48  c void DbUpdateH
40c0: 61 6e 64 6c 65 72 28 0a 20 20 76 6f 69 64 20 2a  andler(.  void *
40d0: 70 2c 20 0a 20 20 69 6e 74 20 6f 70 2c 0a 20 20  p, .  int op,.  
40e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c  const char *zDb,
40f0: 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
4100: 7a 54 62 6c 2c 20 0a 20 20 73 71 6c 69 74 65 5f  zTbl, .  sqlite_
4110: 69 6e 74 36 34 20 72 6f 77 69 64 0a 29 7b 0a 20  int64 rowid.){. 
4120: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
4130: 20 28 53 71 6c 69 74 65 44 62 20 2a 29 70 3b 0a   (SqliteDb *)p;.
4140: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b    Tcl_Obj *pCmd;
4150: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 2d  ..  assert( pDb-
4160: 3e 70 55 70 64 61 74 65 48 6f 6f 6b 20 29 3b 0a  >pUpdateHook );.
4170: 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 51    assert( op==SQ
4180: 4c 49 54 45 5f 49 4e 53 45 52 54 20 7c 7c 20 6f  LITE_INSERT || o
4190: 70 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45  p==SQLITE_UPDATE
41a0: 20 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 44   || op==SQLITE_D
41b0: 45 4c 45 54 45 20 29 3b 0a 0a 20 20 70 43 6d 64  ELETE );..  pCmd
41c0: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
41d0: 4f 62 6a 28 70 44 62 2d 3e 70 55 70 64 61 74 65  Obj(pDb->pUpdate
41e0: 48 6f 6f 6b 29 3b 0a 20 20 54 63 6c 5f 49 6e 63  Hook);.  Tcl_Inc
41f0: 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b  rRefCount(pCmd);
4200: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
4210: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
4220: 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Cmd, Tcl_NewStri
4230: 6e 67 4f 62 6a 28 0a 20 20 20 20 28 20 28 6f 70  ngObj(.    ( (op
4240: 3d 3d 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 29  ==SQLITE_INSERT)
4250: 3f 22 49 4e 53 45 52 54 22 3a 28 6f 70 3d 3d 53  ?"INSERT":(op==S
4260: 51 4c 49 54 45 5f 55 50 44 41 54 45 29 3f 22 55  QLITE_UPDATE)?"U
4270: 50 44 41 54 45 22 3a 22 44 45 4c 45 54 45 22 29  PDATE":"DELETE")
4280: 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
4290: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
42a0: 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f  nt(0, pCmd, Tcl_
42b0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 44 62  NewStringObj(zDb
42c0: 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
42d0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
42e0: 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f  nt(0, pCmd, Tcl_
42f0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54 62  NewStringObj(zTb
4300: 6c 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c  l, -1));.  Tcl_L
4310: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
4320: 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c  ent(0, pCmd, Tcl
4330: 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 72  _NewWideIntObj(r
4340: 6f 77 69 64 29 29 3b 0a 20 20 54 63 6c 5f 45 76  owid));.  Tcl_Ev
4350: 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69 6e 74  alObjEx(pDb->int
4360: 65 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c 5f 45  erp, pCmd, TCL_E
4370: 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 7d 0a 0a  VAL_DIRECT);.}..
4380: 73 74 61 74 69 63 20 76 6f 69 64 20 74 63 6c 43  static void tclC
4390: 6f 6c 6c 61 74 65 4e 65 65 64 65 64 28 0a 20 20  ollateNeeded(.  
43a0: 76 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20 73 71  void *pCtx,.  sq
43b0: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74  lite3 *db,.  int
43c0: 20 65 6e 63 2c 0a 20 20 63 6f 6e 73 74 20 63 68   enc,.  const ch
43d0: 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 53  ar *zName.){.  S
43e0: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
43f0: 53 71 6c 69 74 65 44 62 20 2a 29 70 43 74 78 3b  SqliteDb *)pCtx;
4400: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72  .  Tcl_Obj *pScr
4410: 69 70 74 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63  ipt = Tcl_Duplic
4420: 61 74 65 4f 62 6a 28 70 44 62 2d 3e 70 43 6f 6c  ateObj(pDb->pCol
4430: 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 54  lateNeeded);.  T
4440: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
4450: 70 53 63 72 69 70 74 29 3b 0a 20 20 54 63 6c 5f  pScript);.  Tcl_
4460: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
4470: 6d 65 6e 74 28 30 2c 20 70 53 63 72 69 70 74 2c  ment(0, pScript,
4480: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
4490: 6a 28 7a 4e 61 6d 65 2c 20 2d 31 29 29 3b 0a 20  j(zName, -1));. 
44a0: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70   Tcl_EvalObjEx(p
44b0: 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 53 63 72  Db->interp, pScr
44c0: 69 70 74 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44  ipt, 0);.  Tcl_D
44d0: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72  ecrRefCount(pScr
44e0: 69 70 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ipt);.}../*.** T
44f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
4500: 61 6c 6c 65 64 20 74 6f 20 65 76 61 6c 75 61 74  alled to evaluat
4510: 65 20 61 6e 20 53 51 4c 20 63 6f 6c 6c 61 74 69  e an SQL collati
4520: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c  on function impl
4530: 65 6d 65 6e 74 65 64 0a 2a 2a 20 75 73 69 6e 67  emented.** using
4540: 20 54 43 4c 20 73 63 72 69 70 74 2e 0a 2a 2f 0a   TCL script..*/.
4550: 73 74 61 74 69 63 20 69 6e 74 20 74 63 6c 53 71  static int tclSq
4560: 6c 43 6f 6c 6c 61 74 65 28 0a 20 20 76 6f 69 64  lCollate(.  void
4570: 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e 41   *pCtx,.  int nA
4580: 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ,.  const void *
4590: 7a 41 2c 0a 20 20 69 6e 74 20 6e 42 2c 0a 20 20  zA,.  int nB,.  
45a0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 0a 29  const void *zB.)
45b0: 7b 0a 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a  {.  SqlCollate *
45c0: 70 20 3d 20 28 53 71 6c 43 6f 6c 6c 61 74 65 20  p = (SqlCollate 
45d0: 2a 29 70 43 74 78 3b 0a 20 20 54 63 6c 5f 4f 62  *)pCtx;.  Tcl_Ob
45e0: 6a 20 2a 70 43 6d 64 3b 0a 0a 20 20 70 43 6d 64  j *pCmd;..  pCmd
45f0: 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
4600: 4f 62 6a 28 70 2d 3e 7a 53 63 72 69 70 74 2c 20  Obj(p->zScript, 
4610: 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52  -1);.  Tcl_IncrR
4620: 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20  efCount(pCmd);. 
4630: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
4640: 6e 64 45 6c 65 6d 65 6e 74 28 70 2d 3e 69 6e 74  ndElement(p->int
4650: 65 72 70 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e  erp, pCmd, Tcl_N
4660: 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 41 2c 20  ewStringObj(zA, 
4670: 6e 41 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  nA));.  Tcl_List
4680: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
4690: 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64  (p->interp, pCmd
46a0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
46b0: 62 6a 28 7a 42 2c 20 6e 42 29 29 3b 0a 20 20 54  bj(zB, nB));.  T
46c0: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e  cl_EvalObjEx(p->
46d0: 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 43  interp, pCmd, TC
46e0: 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a  L_EVAL_DIRECT);.
46f0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
4700: 6e 74 28 70 43 6d 64 29 3b 0a 20 20 72 65 74 75  nt(pCmd);.  retu
4710: 72 6e 20 28 61 74 6f 69 28 54 63 6c 5f 47 65 74  rn (atoi(Tcl_Get
4720: 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e  StringResult(p->
4730: 69 6e 74 65 72 70 29 29 29 3b 0a 7d 0a 0a 2f 2a  interp)));.}../*
4740: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
4750: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 76   is called to ev
4760: 61 6c 75 61 74 65 20 61 6e 20 53 51 4c 20 66 75  aluate an SQL fu
4770: 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74  nction implement
4780: 65 64 0a 2a 2a 20 75 73 69 6e 67 20 54 43 4c 20  ed.** using TCL 
4790: 73 63 72 69 70 74 2e 0a 2a 2f 0a 73 74 61 74 69  script..*/.stati
47a0: 63 20 76 6f 69 64 20 74 63 6c 53 71 6c 46 75 6e  c void tclSqlFun
47b0: 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  c(sqlite3_contex
47c0: 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20  t *context, int 
47d0: 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
47e0: 6c 75 65 2a 2a 61 72 67 76 29 7b 0a 20 20 53 71  lue**argv){.  Sq
47f0: 6c 46 75 6e 63 20 2a 70 20 3d 20 73 71 6c 69 74  lFunc *p = sqlit
4800: 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e  e3_user_data(con
4810: 74 65 78 74 29 3b 0a 20 20 54 63 6c 5f 4f 62 6a  text);.  Tcl_Obj
4820: 20 2a 70 43 6d 64 3b 0a 20 20 69 6e 74 20 69 3b   *pCmd;.  int i;
4830: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
4840: 28 20 61 72 67 63 3d 3d 30 20 29 7b 0a 20 20 20  ( argc==0 ){.   
4850: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
4860: 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20 74 6f   no arguments to
4870: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c 20 63   the function, c
4880: 61 6c 6c 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  all Tcl_EvalObjE
4890: 78 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  x on the.    ** 
48a0: 73 63 72 69 70 74 20 6f 62 6a 65 63 74 20 64 69  script object di
48b0: 72 65 63 74 6c 79 2e 20 20 54 68 69 73 20 61 6c  rectly.  This al
48c0: 6c 6f 77 73 20 74 68 65 20 54 43 4c 20 63 6f 6d  lows the TCL com
48d0: 70 69 6c 65 72 20 74 6f 20 67 65 6e 65 72 61 74  piler to generat
48e0: 65 0a 20 20 20 20 2a 2a 20 62 79 74 65 63 6f 64  e.    ** bytecod
48f0: 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 61 6e  e for the comman
4900: 64 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 69  d on the first i
4910: 6e 76 6f 63 61 74 69 6f 6e 20 61 6e 64 20 74 68  nvocation and th
4920: 75 73 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73  us make.    ** s
4930: 75 62 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61  ubsequent invoca
4940: 74 69 6f 6e 73 20 6d 75 63 68 20 66 61 73 74 65  tions much faste
4950: 72 2e 20 2a 2f 0a 20 20 20 20 70 43 6d 64 20 3d  r. */.    pCmd =
4960: 20 70 2d 3e 70 53 63 72 69 70 74 3b 0a 20 20 20   p->pScript;.   
4970: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
4980: 74 28 70 43 6d 64 29 3b 0a 20 20 20 20 72 63 20  t(pCmd);.    rc 
4990: 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28  = Tcl_EvalObjEx(
49a0: 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c  p->interp, pCmd,
49b0: 20 30 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63   0);.    Tcl_Dec
49c0: 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b  rRefCount(pCmd);
49d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
49e0: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61 72   If there are ar
49f0: 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 66  guments to the f
4a00: 75 6e 63 74 69 6f 6e 2c 20 6d 61 6b 65 20 61 20  unction, make a 
4a10: 73 68 61 6c 6c 6f 77 20 63 6f 70 79 20 6f 66 20  shallow copy of 
4a20: 74 68 65 0a 20 20 20 20 2a 2a 20 73 63 72 69 70  the.    ** scrip
4a30: 74 20 6f 62 6a 65 63 74 2c 20 6c 61 70 70 65 6e  t object, lappen
4a40: 64 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 2c  d the arguments,
4a50: 20 74 68 65 6e 20 65 76 61 6c 75 61 74 65 20 74   then evaluate t
4a60: 68 65 20 63 6f 70 79 2e 0a 20 20 20 20 2a 2a 0a  he copy..    **.
4a70: 20 20 20 20 2a 2a 20 42 79 20 22 73 68 61 6c 6c      ** By "shall
4a80: 6f 77 22 20 63 6f 70 79 2c 20 77 65 20 6d 65 61  ow" copy, we mea
4a90: 6e 20 61 20 6f 6e 6c 79 20 74 68 65 20 6f 75 74  n a only the out
4aa0: 65 72 20 6c 69 73 74 20 54 63 6c 5f 4f 62 6a 20  er list Tcl_Obj 
4ab0: 69 73 20 64 75 70 6c 69 63 61 74 65 64 2e 0a 20  is duplicated.. 
4ac0: 20 20 20 2a 2a 20 54 68 65 20 6e 65 77 20 54 63     ** The new Tc
4ad0: 6c 5f 4f 62 6a 20 63 6f 6e 74 61 69 6e 73 20 70  l_Obj contains p
4ae0: 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65 20 6f  ointers to the o
4af0: 72 69 67 69 6e 61 6c 20 6c 69 73 74 20 65 6c 65  riginal list ele
4b00: 6d 65 6e 74 73 2e 20 0a 20 20 20 20 2a 2a 20 54  ments. .    ** T
4b10: 68 61 74 20 77 61 79 2c 20 77 68 65 6e 20 54 63  hat way, when Tc
4b20: 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 69 73 20  l_EvalObjv() is 
4b30: 72 75 6e 20 61 6e 64 20 73 68 69 6d 6d 65 72 73  run and shimmers
4b40: 20 74 68 65 20 66 69 72 73 74 20 65 6c 65 6d 65   the first eleme
4b50: 6e 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  nt.    ** of the
4b60: 20 6c 69 73 74 20 74 6f 20 74 63 6c 43 6d 64 4e   list to tclCmdN
4b70: 61 6d 65 54 79 70 65 2c 20 74 68 61 74 20 61 6c  ameType, that al
4b80: 74 65 72 6e 61 74 65 20 72 65 70 72 65 73 65 6e  ternate represen
4b90: 74 61 74 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20  tation will.    
4ba0: 2a 2a 20 62 65 20 70 72 65 73 65 72 76 65 64 20  ** be preserved 
4bb0: 61 6e 64 20 72 65 75 73 65 64 20 6f 6e 20 74 68  and reused on th
4bc0: 65 20 6e 65 78 74 20 69 6e 76 6f 63 61 74 69 6f  e next invocatio
4bd0: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 54 63  n..    */.    Tc
4be0: 6c 5f 4f 62 6a 20 2a 2a 61 41 72 67 3b 0a 20 20  l_Obj **aArg;.  
4bf0: 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20    int nArg;.    
4c00: 69 66 28 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 47  if( Tcl_ListObjG
4c10: 65 74 45 6c 65 6d 65 6e 74 73 28 70 2d 3e 69 6e  etElements(p->in
4c20: 74 65 72 70 2c 20 70 2d 3e 70 53 63 72 69 70 74  terp, p->pScript
4c30: 2c 20 26 6e 41 72 67 2c 20 26 61 41 72 67 29 20  , &nArg, &aArg) 
4c40: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
4c50: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
4c60: 6e 74 65 78 74 2c 20 54 63 6c 5f 47 65 74 53 74  ntext, Tcl_GetSt
4c70: 72 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e  ringResult(p->in
4c80: 74 65 72 70 29 2c 20 2d 31 29 3b 20 0a 20 20 20  terp), -1); .   
4c90: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
4ca0: 20 20 20 20 20 0a 20 20 20 20 70 43 6d 64 20 3d       .    pCmd =
4cb0: 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28   Tcl_NewListObj(
4cc0: 6e 41 72 67 2c 20 61 41 72 67 29 3b 0a 20 20 20  nArg, aArg);.   
4cd0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
4ce0: 74 28 70 43 6d 64 29 3b 0a 20 20 20 20 66 6f 72  t(pCmd);.    for
4cf0: 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b  (i=0; i<argc; i+
4d00: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
4d10: 33 5f 76 61 6c 75 65 20 2a 70 49 6e 20 3d 20 61  3_value *pIn = a
4d20: 72 67 76 5b 69 5d 3b 0a 20 20 20 20 20 20 54 63  rgv[i];.      Tc
4d30: 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b 0a 20 20 20  l_Obj *pVal;.   
4d40: 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20           .      
4d50: 2f 2a 20 53 65 74 20 70 56 61 6c 20 74 6f 20 63  /* Set pVal to c
4d60: 6f 6e 74 61 69 6e 20 74 68 65 20 69 27 74 68 20  ontain the i'th 
4d70: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 69 73 20 72  column of this r
4d80: 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 73 77 69  ow. */.      swi
4d90: 74 63 68 28 20 73 71 6c 69 74 65 33 5f 76 61 6c  tch( sqlite3_val
4da0: 75 65 5f 74 79 70 65 28 70 49 6e 29 20 29 7b 0a  ue_type(pIn) ){.
4db0: 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
4dc0: 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20  ITE_BLOB: {.    
4dd0: 20 20 20 20 20 20 69 6e 74 20 62 79 74 65 73 20        int bytes 
4de0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
4df0: 62 79 74 65 73 28 70 49 6e 29 3b 0a 20 20 20 20  bytes(pIn);.    
4e00: 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c        pVal = Tcl
4e10: 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a  _NewByteArrayObj
4e20: 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62  (sqlite3_value_b
4e30: 6c 6f 62 28 70 49 6e 29 2c 20 62 79 74 65 73 29  lob(pIn), bytes)
4e40: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
4e50: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
4e60: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
4e70: 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20  _INTEGER: {.    
4e80: 20 20 20 20 20 20 73 71 6c 69 74 65 5f 69 6e 74        sqlite_int
4e90: 36 34 20 76 20 3d 20 73 71 6c 69 74 65 33 5f 76  64 v = sqlite3_v
4ea0: 61 6c 75 65 5f 69 6e 74 36 34 28 70 49 6e 29 3b  alue_int64(pIn);
4eb0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 76  .          if( v
4ec0: 3e 3d 2d 32 31 34 37 34 38 33 36 34 37 20 26 26  >=-2147483647 &&
4ed0: 20 76 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29   v<=2147483647 )
4ee0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 56  {.            pV
4ef0: 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  al = Tcl_NewIntO
4f00: 62 6a 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  bj(v);.         
4f10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
4f20: 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e      pVal = Tcl_N
4f30: 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 76 29 3b  ewWideIntObj(v);
4f40: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
4f50: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
4f60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4f70: 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41  case SQLITE_FLOA
4f80: 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 64  T: {.          d
4f90: 6f 75 62 6c 65 20 72 20 3d 20 73 71 6c 69 74 65  ouble r = sqlite
4fa0: 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 70  3_value_double(p
4fb0: 49 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  In);.          p
4fc0: 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 44 6f 75  Val = Tcl_NewDou
4fd0: 62 6c 65 4f 62 6a 28 72 29 3b 0a 20 20 20 20 20  bleObj(r);.     
4fe0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4ff0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61      }.        ca
5000: 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20  se SQLITE_NULL: 
5010: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 56 61 6c  {.          pVal
5020: 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
5030: 4f 62 6a 28 22 22 2c 20 30 29 3b 0a 20 20 20 20  Obj("", 0);.    
5040: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5050: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 64       }.        d
5060: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
5070: 20 20 20 20 69 6e 74 20 62 79 74 65 73 20 3d 20      int bytes = 
5080: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
5090: 74 65 73 28 70 49 6e 29 3b 0a 20 20 20 20 20 20  tes(pIn);.      
50a0: 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e      pVal = Tcl_N
50b0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61  ewStringObj((cha
50c0: 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  r *)sqlite3_valu
50d0: 65 5f 74 65 78 74 28 70 49 6e 29 2c 20 62 79 74  e_text(pIn), byt
50e0: 65 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  es);.          b
50f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
5100: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
5110: 20 3d 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70   = Tcl_ListObjAp
5120: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d 3e 69  pendElement(p->i
5130: 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 70 56 61  nterp, pCmd, pVa
5140: 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  l);.      if( rc
5150: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
5160: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d  DecrRefCount(pCm
5170: 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  d);.        sqli
5180: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
5190: 28 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f 47 65  (context, Tcl_Ge
51a0: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 2d  tStringResult(p-
51b0: 3e 69 6e 74 65 72 70 29 2c 20 2d 31 29 3b 20 0a  >interp), -1); .
51c0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
51d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
51e0: 20 20 69 66 28 20 21 70 2d 3e 75 73 65 45 76 61    if( !p->useEva
51f0: 6c 4f 62 6a 76 20 29 7b 0a 20 20 20 20 20 20 2f  lObjv ){.      /
5200: 2a 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28  * Tcl_EvalObjEx(
5210: 29 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63  ) will automatic
5220: 61 6c 6c 79 20 63 61 6c 6c 20 54 63 6c 5f 45 76  ally call Tcl_Ev
5230: 61 6c 4f 62 6a 76 28 29 20 69 66 20 70 43 6d 64  alObjv() if pCmd
5240: 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 20 6c  .      ** is a l
5250: 69 73 74 20 77 69 74 68 6f 75 74 20 61 20 73 74  ist without a st
5260: 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74  ring representat
5270: 69 6f 6e 2e 20 20 54 6f 20 70 72 65 76 65 6e 74  ion.  To prevent
5280: 20 74 68 69 73 20 66 72 6f 6d 0a 20 20 20 20 20   this from.     
5290: 20 2a 2a 20 68 61 70 70 65 6e 69 6e 67 2c 20 6d   ** happening, m
52a0: 61 6b 65 20 73 75 72 65 20 70 43 6d 64 20 68 61  ake sure pCmd ha
52b0: 73 20 61 20 76 61 6c 69 64 20 73 74 72 69 6e 67  s a valid string
52c0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
52d0: 2a 2f 0a 20 20 20 20 20 20 54 63 6c 5f 47 65 74  */.      Tcl_Get
52e0: 53 74 72 69 6e 67 28 70 43 6d 64 29 3b 0a 20 20  String(pCmd);.  
52f0: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 54 63 6c    }.    rc = Tcl
5300: 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e  _EvalObjEx(p->in
5310: 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c 5f  terp, pCmd, TCL_
5320: 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20  EVAL_DIRECT);.  
5330: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
5340: 6e 74 28 70 43 6d 64 29 3b 0a 20 20 7d 0a 0a 20  nt(pCmd);.  }.. 
5350: 20 69 66 28 20 72 63 20 26 26 20 72 63 21 3d 54   if( rc && rc!=T
5360: 43 4c 5f 52 45 54 55 52 4e 20 29 7b 0a 20 20 20  CL_RETURN ){.   
5370: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
5380: 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 54  error(context, T
5390: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
53a0: 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c 20 2d  lt(p->interp), -
53b0: 31 29 3b 20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  1); .  }else{.  
53c0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 72 20    Tcl_Obj *pVar 
53d0: 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75  = Tcl_GetObjResu
53e0: 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 3b 0a 20  lt(p->interp);. 
53f0: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 75 38     int n;.    u8
5400: 20 2a 64 61 74 61 3b 0a 20 20 20 20 63 68 61 72   *data;.    char
5410: 20 2a 7a 54 79 70 65 20 3d 20 70 56 61 72 2d 3e   *zType = pVar->
5420: 74 79 70 65 50 74 72 20 3f 20 70 56 61 72 2d 3e  typePtr ? pVar->
5430: 74 79 70 65 50 74 72 2d 3e 6e 61 6d 65 20 3a 20  typePtr->name : 
5440: 22 22 3b 0a 20 20 20 20 63 68 61 72 20 63 20 3d  "";.    char c =
5450: 20 7a 54 79 70 65 5b 30 5d 3b 0a 20 20 20 20 69   zType[0];.    i
5460: 66 28 20 63 3d 3d 27 62 27 20 26 26 20 73 74 72  f( c=='b' && str
5470: 63 6d 70 28 7a 54 79 70 65 2c 22 62 79 74 65 61  cmp(zType,"bytea
5480: 72 72 61 79 22 29 3d 3d 30 20 26 26 20 70 56 61  rray")==0 && pVa
5490: 72 2d 3e 62 79 74 65 73 3d 3d 30 20 29 7b 0a 20  r->bytes==0 ){. 
54a0: 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 72 65 74       /* Only ret
54b0: 75 72 6e 20 61 20 42 4c 4f 42 20 74 79 70 65 20  urn a BLOB type 
54c0: 69 66 20 74 68 65 20 54 63 6c 20 76 61 72 69 61  if the Tcl varia
54d0: 62 6c 65 20 69 73 20 61 20 62 79 74 65 61 72 72  ble is a bytearr
54e0: 61 79 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  ay and.      ** 
54f0: 68 61 73 20 6e 6f 20 73 74 72 69 6e 67 20 72 65  has no string re
5500: 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20 2a 2f  presentation. */
5510: 0a 20 20 20 20 20 20 64 61 74 61 20 3d 20 54 63  .      data = Tc
5520: 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72  l_GetByteArrayFr
5530: 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b  omObj(pVar, &n);
5540: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
5550: 65 73 75 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65  esult_blob(conte
5560: 78 74 2c 20 64 61 74 61 2c 20 6e 2c 20 53 51 4c  xt, data, n, SQL
5570: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
5580: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
5590: 3d 27 62 27 20 26 26 20 73 74 72 63 6d 70 28 7a  ='b' && strcmp(z
55a0: 54 79 70 65 2c 22 62 6f 6f 6c 65 61 6e 22 29 3d  Type,"boolean")=
55b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =0 ){.      Tcl_
55c0: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 30 2c  GetIntFromObj(0,
55d0: 20 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20   pVar, &n);.    
55e0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
55f0: 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 6e 29  _int(context, n)
5600: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
5610: 63 3d 3d 27 64 27 20 26 26 20 73 74 72 63 6d 70  c=='d' && strcmp
5620: 28 7a 54 79 70 65 2c 22 64 6f 75 62 6c 65 22 29  (zType,"double")
5630: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 6f 75  ==0 ){.      dou
5640: 62 6c 65 20 72 3b 0a 20 20 20 20 20 20 54 63 6c  ble r;.      Tcl
5650: 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62  _GetDoubleFromOb
5660: 6a 28 30 2c 20 70 56 61 72 2c 20 26 72 29 3b 0a  j(0, pVar, &r);.
5670: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
5680: 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74  sult_double(cont
5690: 65 78 74 2c 20 72 29 3b 0a 20 20 20 20 7d 65 6c  ext, r);.    }el
56a0: 73 65 20 69 66 28 20 28 63 3d 3d 27 77 27 20 26  se if( (c=='w' &
56b0: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
56c0: 77 69 64 65 49 6e 74 22 29 3d 3d 30 29 20 7c 7c  wideInt")==0) ||
56d0: 0a 20 20 20 20 20 20 20 20 20 20 28 63 3d 3d 27  .          (c=='
56e0: 69 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79  i' && strcmp(zTy
56f0: 70 65 2c 22 69 6e 74 22 29 3d 3d 30 29 20 29 7b  pe,"int")==0) ){
5700: 0a 20 20 20 20 20 20 54 63 6c 5f 57 69 64 65 49  .      Tcl_WideI
5710: 6e 74 20 76 3b 0a 20 20 20 20 20 20 54 63 6c 5f  nt v;.      Tcl_
5720: 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62  GetWideIntFromOb
5730: 6a 28 30 2c 20 70 56 61 72 2c 20 26 76 29 3b 0a  j(0, pVar, &v);.
5740: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
5750: 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65  sult_int64(conte
5760: 78 74 2c 20 76 29 3b 0a 20 20 20 20 7d 65 6c 73  xt, v);.    }els
5770: 65 7b 0a 20 20 20 20 20 20 64 61 74 61 20 3d 20  e{.      data = 
5780: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
5790: 29 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72  )Tcl_GetStringFr
57a0: 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b  omObj(pVar, &n);
57b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
57c0: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
57d0: 78 74 2c 20 28 63 68 61 72 20 2a 29 64 61 74 61  xt, (char *)data
57e0: 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  , n, SQLITE_TRAN
57f0: 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d 0a 20 20  SIENT);.    }.  
5800: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
5810: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
5820: 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 54 68 69  ZATION./*.** Thi
5830: 73 20 69 73 20 74 68 65 20 61 75 74 68 65 6e 74  s is the authent
5840: 69 63 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  ication function
5850: 2e 20 20 49 74 20 61 70 70 65 6e 64 73 20 74 68  .  It appends th
5860: 65 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e  e authentication
5870: 0a 2a 2a 20 74 79 70 65 20 63 6f 64 65 20 61 6e  .** type code an
5880: 64 20 74 68 65 20 74 77 6f 20 61 72 67 75 6d 65  d the two argume
5890: 6e 74 73 20 74 6f 20 7a 43 6d 64 5b 5d 20 74 68  nts to zCmd[] th
58a0: 65 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 72  en invokes the r
58b0: 65 73 75 6c 74 0a 2a 2a 20 6f 6e 20 74 68 65 20  esult.** on the 
58c0: 69 6e 74 65 72 70 72 65 74 65 72 2e 20 20 54 68  interpreter.  Th
58d0: 65 20 72 65 70 6c 79 20 69 73 20 65 78 61 6d 69  e reply is exami
58e0: 6e 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ned to determine
58f0: 20 69 66 20 74 68 65 0a 2a 2a 20 61 75 74 68 65   if the.** authe
5900: 6e 74 69 63 61 74 69 6f 6e 20 66 61 69 6c 73 20  ntication fails 
5910: 6f 72 20 73 75 63 63 65 65 64 73 2e 0a 2a 2f 0a  or succeeds..*/.
5920: 73 74 61 74 69 63 20 69 6e 74 20 61 75 74 68 5f  static int auth_
5930: 63 61 6c 6c 62 61 63 6b 28 0a 20 20 76 6f 69 64  callback(.  void
5940: 20 2a 70 41 72 67 2c 0a 20 20 69 6e 74 20 63 6f   *pArg,.  int co
5950: 64 65 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  de,.  const char
5960: 20 2a 7a 41 72 67 31 2c 0a 20 20 63 6f 6e 73 74   *zArg1,.  const
5970: 20 63 68 61 72 20 2a 7a 41 72 67 32 2c 0a 20 20   char *zArg2,.  
5980: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
5990: 33 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  3,.  const char 
59a0: 2a 7a 41 72 67 34 0a 29 7b 0a 20 20 63 68 61 72  *zArg4.){.  char
59b0: 20 2a 7a 43 6f 64 65 3b 0a 20 20 54 63 6c 5f 44   *zCode;.  Tcl_D
59c0: 53 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 69 6e  String str;.  in
59d0: 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20 63 68  t rc;.  const ch
59e0: 61 72 20 2a 7a 52 65 70 6c 79 3b 0a 20 20 53 71  ar *zReply;.  Sq
59f0: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
5a00: 71 6c 69 74 65 44 62 2a 29 70 41 72 67 3b 0a 0a  qliteDb*)pArg;..
5a10: 20 20 73 77 69 74 63 68 28 20 63 6f 64 65 20 29    switch( code )
5a20: 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
5a30: 45 5f 43 4f 50 59 20 20 20 20 20 20 20 20 20 20  E_COPY          
5a40: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
5a50: 49 54 45 5f 43 4f 50 59 22 3b 20 62 72 65 61 6b  ITE_COPY"; break
5a60: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
5a70: 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 20 20  E_CREATE_INDEX  
5a80: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
5a90: 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58  ITE_CREATE_INDEX
5aa0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
5ab0: 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45  se SQLITE_CREATE
5ac0: 5f 54 41 42 4c 45 20 20 20 20 20 20 3a 20 7a 43  _TABLE      : zC
5ad0: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41  ode="SQLITE_CREA
5ae0: 54 45 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b  TE_TABLE"; break
5af0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
5b00: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e  E_CREATE_TEMP_IN
5b10: 44 45 58 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c  DEX : zCode="SQL
5b20: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
5b30: 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20  INDEX"; break;. 
5b40: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
5b50: 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45  REATE_TEMP_TABLE
5b60: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
5b70: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42  _CREATE_TEMP_TAB
5b80: 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  LE"; break;.    
5b90: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41  case SQLITE_CREA
5ba0: 54 45 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 3a  TE_TEMP_TRIGGER:
5bb0: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43   zCode="SQLITE_C
5bc0: 52 45 41 54 45 5f 54 45 4d 50 5f 54 52 49 47 47  REATE_TEMP_TRIGG
5bd0: 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  ER"; break;.    
5be0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41  case SQLITE_CREA
5bf0: 54 45 5f 54 45 4d 50 5f 56 49 45 57 20 20 3a 20  TE_TEMP_VIEW  : 
5c00: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52  zCode="SQLITE_CR
5c10: 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 22 3b  EATE_TEMP_VIEW";
5c20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
5c30: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
5c40: 52 49 47 47 45 52 20 20 20 20 3a 20 7a 43 6f 64  RIGGER    : zCod
5c50: 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45  e="SQLITE_CREATE
5c60: 5f 54 52 49 47 47 45 52 22 3b 20 62 72 65 61 6b  _TRIGGER"; break
5c70: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
5c80: 45 5f 43 52 45 41 54 45 5f 56 49 45 57 20 20 20  E_CREATE_VIEW   
5c90: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
5ca0: 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57 22  ITE_CREATE_VIEW"
5cb0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
5cc0: 65 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 20  e SQLITE_DELETE 
5cd0: 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f             : zCo
5ce0: 64 65 3d 22 53 51 4c 49 54 45 5f 44 45 4c 45 54  de="SQLITE_DELET
5cf0: 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  E"; break;.    c
5d00: 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  ase SQLITE_DROP_
5d10: 49 4e 44 45 58 20 20 20 20 20 20 20 20 3a 20 7a  INDEX        : z
5d20: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f  Code="SQLITE_DRO
5d30: 50 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b  P_INDEX"; break;
5d40: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
5d50: 5f 44 52 4f 50 5f 54 41 42 4c 45 20 20 20 20 20  _DROP_TABLE     
5d60: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
5d70: 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 22 3b 20  TE_DROP_TABLE"; 
5d80: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
5d90: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
5da0: 5f 49 4e 44 45 58 20 20 20 3a 20 7a 43 6f 64 65  _INDEX   : zCode
5db0: 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  ="SQLITE_DROP_TE
5dc0: 4d 50 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b  MP_INDEX"; break
5dd0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
5de0: 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c  E_DROP_TEMP_TABL
5df0: 45 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c  E   : zCode="SQL
5e00: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41  ITE_DROP_TEMP_TA
5e10: 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  BLE"; break;.   
5e20: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f   case SQLITE_DRO
5e30: 50 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 20 3a  P_TEMP_TRIGGER :
5e40: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44   zCode="SQLITE_D
5e50: 52 4f 50 5f 54 45 4d 50 5f 54 52 49 47 47 45 52  ROP_TEMP_TRIGGER
5e60: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
5e70: 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54  se SQLITE_DROP_T
5e80: 45 4d 50 5f 56 49 45 57 20 20 20 20 3a 20 7a 43  EMP_VIEW    : zC
5e90: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50  ode="SQLITE_DROP
5ea0: 5f 54 45 4d 50 5f 56 49 45 57 22 3b 20 62 72 65  _TEMP_VIEW"; bre
5eb0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
5ec0: 49 54 45 5f 44 52 4f 50 5f 54 52 49 47 47 45 52  ITE_DROP_TRIGGER
5ed0: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
5ee0: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 52 49 47 47  QLITE_DROP_TRIGG
5ef0: 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  ER"; break;.    
5f00: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50  case SQLITE_DROP
5f10: 5f 56 49 45 57 20 20 20 20 20 20 20 20 20 3a 20  _VIEW         : 
5f20: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52  zCode="SQLITE_DR
5f30: 4f 50 5f 56 49 45 57 22 3b 20 62 72 65 61 6b 3b  OP_VIEW"; break;
5f40: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
5f50: 5f 49 4e 53 45 52 54 20 20 20 20 20 20 20 20 20  _INSERT         
5f60: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
5f70: 54 45 5f 49 4e 53 45 52 54 22 3b 20 62 72 65 61  TE_INSERT"; brea
5f80: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
5f90: 54 45 5f 50 52 41 47 4d 41 20 20 20 20 20 20 20  TE_PRAGMA       
5fa0: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
5fb0: 4c 49 54 45 5f 50 52 41 47 4d 41 22 3b 20 62 72  LITE_PRAGMA"; br
5fc0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
5fd0: 4c 49 54 45 5f 52 45 41 44 20 20 20 20 20 20 20  LITE_READ       
5fe0: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
5ff0: 53 51 4c 49 54 45 5f 52 45 41 44 22 3b 20 62 72  SQLITE_READ"; br
6000: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
6010: 4c 49 54 45 5f 53 45 4c 45 43 54 20 20 20 20 20  LITE_SELECT     
6020: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
6030: 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 22 3b 20  SQLITE_SELECT"; 
6040: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
6050: 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49  SQLITE_TRANSACTI
6060: 4f 4e 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65  ON       : zCode
6070: 3d 22 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43  ="SQLITE_TRANSAC
6080: 54 49 4f 4e 22 3b 20 62 72 65 61 6b 3b 0a 20 20  TION"; break;.  
6090: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55 50    case SQLITE_UP
60a0: 44 41 54 45 20 20 20 20 20 20 20 20 20 20 20 20  DATE            
60b0: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
60c0: 55 50 44 41 54 45 22 3b 20 62 72 65 61 6b 3b 0a  UPDATE"; break;.
60d0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
60e0: 41 54 54 41 43 48 20 20 20 20 20 20 20 20 20 20  ATTACH          
60f0: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
6100: 45 5f 41 54 54 41 43 48 22 3b 20 62 72 65 61 6b  E_ATTACH"; break
6110: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
6120: 45 5f 44 45 54 41 43 48 20 20 20 20 20 20 20 20  E_DETACH        
6130: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
6140: 49 54 45 5f 44 45 54 41 43 48 22 3b 20 62 72 65  ITE_DETACH"; bre
6150: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
6160: 49 54 45 5f 41 4c 54 45 52 5f 54 41 42 4c 45 20  ITE_ALTER_TABLE 
6170: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
6180: 51 4c 49 54 45 5f 41 4c 54 45 52 5f 54 41 42 4c  QLITE_ALTER_TABL
6190: 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  E"; break;.    c
61a0: 61 73 65 20 53 51 4c 49 54 45 5f 52 45 49 4e 44  ase SQLITE_REIND
61b0: 45 58 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a  EX           : z
61c0: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 52 45 49  Code="SQLITE_REI
61d0: 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20  NDEX"; break;.  
61e0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 4e    case SQLITE_AN
61f0: 41 4c 59 5a 45 20 20 20 20 20 20 20 20 20 20 20  ALYZE           
6200: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
6210: 41 4e 41 4c 59 5a 45 22 3b 20 62 72 65 61 6b 3b  ANALYZE"; break;
6220: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
6230: 5f 43 52 45 41 54 45 5f 56 54 41 42 4c 45 20 20  _CREATE_VTABLE  
6240: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
6250: 54 45 5f 43 52 45 41 54 45 5f 56 54 41 42 4c 45  TE_CREATE_VTABLE
6260: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
6270: 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56  se SQLITE_DROP_V
6280: 54 41 42 4c 45 20 20 20 20 20 20 20 3a 20 7a 43  TABLE       : zC
6290: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50  ode="SQLITE_DROP
62a0: 5f 56 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b  _VTABLE"; break;
62b0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
62c0: 5f 46 55 4e 43 54 49 4f 4e 20 20 20 20 20 20 20  _FUNCTION       
62d0: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
62e0: 54 45 5f 46 55 4e 43 54 49 4f 4e 22 3b 20 62 72  TE_FUNCTION"; br
62f0: 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
6300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6310: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
6320: 3f 3f 3f 3f 22 3b 20 62 72 65 61 6b 3b 0a 20 20  ????"; break;.  
6330: 7d 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49  }.  Tcl_DStringI
6340: 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 54 63 6c  nit(&str);.  Tcl
6350: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26  _DStringAppend(&
6360: 73 74 72 2c 20 70 44 62 2d 3e 7a 41 75 74 68 2c  str, pDb->zAuth,
6370: 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72   -1);.  Tcl_DStr
6380: 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ingAppendElement
6390: 28 26 73 74 72 2c 20 7a 43 6f 64 65 29 3b 0a 20  (&str, zCode);. 
63a0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
63b0: 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20  ndElement(&str, 
63c0: 7a 41 72 67 31 20 3f 20 7a 41 72 67 31 20 3a 20  zArg1 ? zArg1 : 
63d0: 22 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  "");.  Tcl_DStri
63e0: 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  ngAppendElement(
63f0: 26 73 74 72 2c 20 7a 41 72 67 32 20 3f 20 7a 41  &str, zArg2 ? zA
6400: 72 67 32 20 3a 20 22 22 29 3b 0a 20 20 54 63 6c  rg2 : "");.  Tcl
6410: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c  _DStringAppendEl
6420: 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41 72 67  ement(&str, zArg
6430: 33 20 3f 20 7a 41 72 67 33 20 3a 20 22 22 29 3b  3 ? zArg3 : "");
6440: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70  .  Tcl_DStringAp
6450: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72  pendElement(&str
6460: 2c 20 7a 41 72 67 34 20 3f 20 7a 41 72 67 34 20  , zArg4 ? zArg4 
6470: 3a 20 22 22 29 3b 0a 20 20 72 63 20 3d 20 54 63  : "");.  rc = Tc
6480: 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 28 70 44 62  l_GlobalEval(pDb
6490: 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53  ->interp, Tcl_DS
64a0: 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29  tringValue(&str)
64b0: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
64c0: 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20 7a 52  Free(&str);.  zR
64d0: 65 70 6c 79 20 3d 20 54 63 6c 5f 47 65 74 53 74  eply = Tcl_GetSt
64e0: 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62 2d 3e  ringResult(pDb->
64f0: 69 6e 74 65 72 70 29 3b 0a 20 20 69 66 28 20 73  interp);.  if( s
6500: 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22 53 51  trcmp(zReply,"SQ
6510: 4c 49 54 45 5f 4f 4b 22 29 3d 3d 30 20 29 7b 0a  LITE_OK")==0 ){.
6520: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
6530: 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  OK;.  }else if( 
6540: 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22 53  strcmp(zReply,"S
6550: 51 4c 49 54 45 5f 44 45 4e 59 22 29 3d 3d 30 20  QLITE_DENY")==0 
6560: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
6570: 54 45 5f 44 45 4e 59 3b 0a 20 20 7d 65 6c 73 65  TE_DENY;.  }else
6580: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 52 65 70   if( strcmp(zRep
6590: 6c 79 2c 22 53 51 4c 49 54 45 5f 49 47 4e 4f 52  ly,"SQLITE_IGNOR
65a0: 45 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  E")==0 ){.    rc
65b0: 20 3d 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45   = SQLITE_IGNORE
65c0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
65d0: 63 20 3d 20 39 39 39 3b 0a 20 20 7d 0a 20 20 72  c = 999;.  }.  r
65e0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
65f0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
6600: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 20  T_AUTHORIZATION 
6610: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 7a 54 65 78 74 20  */../*.** zText 
6620: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
6630: 74 65 78 74 20 6f 62 74 61 69 6e 65 64 20 76 69  text obtained vi
6640: 61 20 61 6e 20 73 71 6c 69 74 65 33 5f 72 65 73  a an sqlite3_res
6650: 75 6c 74 5f 74 65 78 74 28 29 0a 2a 2a 20 6f 72  ult_text().** or
6660: 20 73 69 6d 69 6c 61 72 20 69 6e 74 65 72 66 61   similar interfa
6670: 63 65 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  ce. This routine
6680: 20 72 65 74 75 72 6e 73 20 61 20 54 63 6c 20 73   returns a Tcl s
6690: 74 72 69 6e 67 20 6f 62 6a 65 63 74 2c 20 0a 2a  tring object, .*
66a0: 2a 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  * reference coun
66b0: 74 20 73 65 74 20 74 6f 20 30 2c 20 63 6f 6e 74  t set to 0, cont
66c0: 61 69 6e 69 6e 67 20 74 68 65 20 74 65 78 74 2e  aining the text.
66d0: 20 49 66 20 61 20 74 72 61 6e 73 6c 61 74 69 6f   If a translatio
66e0: 6e 0a 2a 2a 20 62 65 74 77 65 65 6e 20 69 73 6f  n.** between iso
66f0: 38 38 35 39 20 61 6e 64 20 55 54 46 2d 38 20 69  8859 and UTF-8 i
6700: 73 20 72 65 71 75 69 72 65 64 2c 20 69 74 20 69  s required, it i
6710: 73 20 70 72 65 66 6f 72 6d 65 64 2e 0a 2a 2f 0a  s preformed..*/.
6720: 73 74 61 74 69 63 20 54 63 6c 5f 4f 62 6a 20 2a  static Tcl_Obj *
6730: 64 62 54 65 78 74 54 6f 4f 62 6a 28 63 68 61 72  dbTextToObj(char
6740: 20 63 6f 6e 73 74 20 2a 7a 54 65 78 74 29 7b 0a   const *zText){.
6750: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b    Tcl_Obj *pVal;
6760: 0a 23 69 66 64 65 66 20 55 54 46 5f 54 52 41 4e  .#ifdef UTF_TRAN
6770: 53 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 0a 20  SLATION_NEEDED. 
6780: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 43 6f   Tcl_DString dCo
6790: 6c 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  l;.  Tcl_DString
67a0: 49 6e 69 74 28 26 64 43 6f 6c 29 3b 0a 20 20 54  Init(&dCol);.  T
67b0: 63 6c 5f 45 78 74 65 72 6e 61 6c 54 6f 55 74 66  cl_ExternalToUtf
67c0: 44 53 74 72 69 6e 67 28 4e 55 4c 4c 2c 20 7a 54  DString(NULL, zT
67d0: 65 78 74 2c 20 2d 31 2c 20 26 64 43 6f 6c 29 3b  ext, -1, &dCol);
67e0: 0a 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65  .  pVal = Tcl_Ne
67f0: 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 44  wStringObj(Tcl_D
6800: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 64 43 6f  StringValue(&dCo
6810: 6c 29 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44  l), -1);.  Tcl_D
6820: 53 74 72 69 6e 67 46 72 65 65 28 26 64 43 6f 6c  StringFree(&dCol
6830: 29 3b 0a 23 65 6c 73 65 0a 20 20 70 56 61 6c 20  );.#else.  pVal 
6840: 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
6850: 62 6a 28 7a 54 65 78 74 2c 20 2d 31 29 3b 0a 23  bj(zText, -1);.#
6860: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 70  endif.  return p
6870: 56 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Val;.}../*.** Th
6880: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 61 64 73  is routine reads
6890: 20 61 20 6c 69 6e 65 20 6f 66 20 74 65 78 74 20   a line of text 
68a0: 66 72 6f 6d 20 46 49 4c 45 20 69 6e 2c 20 73 74  from FILE in, st
68b0: 6f 72 65 73 0a 2a 2a 20 74 68 65 20 74 65 78 74  ores.** the text
68c0: 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   in memory obtai
68d0: 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28  ned from malloc(
68e0: 29 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20  ) and returns a 
68f0: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
6900: 65 20 74 65 78 74 2e 20 20 4e 55 4c 4c 20 69 73  e text.  NULL is
6910: 20 72 65 74 75 72 6e 65 64 20 61 74 20 65 6e 64   returned at end
6920: 20 6f 66 20 66 69 6c 65 2c 20 6f 72 20 69 66 20   of file, or if 
6930: 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 66 61 69 6c  malloc().** fail
6940: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74  s..**.** The int
6950: 65 72 66 61 63 65 20 69 73 20 6c 69 6b 65 20 22  erface is like "
6960: 72 65 61 64 6c 69 6e 65 22 20 62 75 74 20 6e 6f  readline" but no
6970: 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 65 64   command-line ed
6980: 69 74 69 6e 67 0a 2a 2a 20 69 73 20 64 6f 6e 65  iting.** is done
6990: 2e 0a 2a 2a 0a 2a 2a 20 63 6f 70 69 65 64 20 66  ..**.** copied f
69a0: 72 6f 6d 20 73 68 65 6c 6c 2e 63 20 66 72 6f 6d  rom shell.c from
69b0: 20 27 2e 69 6d 70 6f 72 74 27 20 63 6f 6d 6d 61   '.import' comma
69c0: 6e 64 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  nd.*/.static cha
69d0: 72 20 2a 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65  r *local_getline
69e0: 28 63 68 61 72 20 2a 7a 50 72 6f 6d 70 74 2c 20  (char *zPrompt, 
69f0: 46 49 4c 45 20 2a 69 6e 29 7b 0a 20 20 63 68 61  FILE *in){.  cha
6a00: 72 20 2a 7a 4c 69 6e 65 3b 0a 20 20 69 6e 74 20  r *zLine;.  int 
6a10: 6e 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a  nLine;.  int n;.
6a20: 20 20 69 6e 74 20 65 6f 6c 3b 0a 0a 20 20 6e 4c    int eol;..  nL
6a30: 69 6e 65 20 3d 20 31 30 30 3b 0a 20 20 7a 4c 69  ine = 100;.  zLi
6a40: 6e 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 4c 69  ne = malloc( nLi
6a50: 6e 65 20 29 3b 0a 20 20 69 66 28 20 7a 4c 69 6e  ne );.  if( zLin
6a60: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  e==0 ) return 0;
6a70: 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 65 6f 6c 20  .  n = 0;.  eol 
6a80: 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 21 65  = 0;.  while( !e
6a90: 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 2b  ol ){.    if( n+
6aa0: 31 30 30 3e 6e 4c 69 6e 65 20 29 7b 0a 20 20 20  100>nLine ){.   
6ab0: 20 20 20 6e 4c 69 6e 65 20 3d 20 6e 4c 69 6e 65     nLine = nLine
6ac0: 2a 32 20 2b 20 31 30 30 3b 0a 20 20 20 20 20 20  *2 + 100;.      
6ad0: 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28  zLine = realloc(
6ae0: 7a 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29 3b 0a 20  zLine, nLine);. 
6af0: 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d       if( zLine==
6b00: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
6b10: 20 20 7d 0a 20 20 20 20 69 66 28 20 66 67 65 74    }.    if( fget
6b20: 73 28 26 7a 4c 69 6e 65 5b 6e 5d 2c 20 6e 4c 69  s(&zLine[n], nLi
6b30: 6e 65 20 2d 20 6e 2c 20 69 6e 29 3d 3d 30 20 29  ne - n, in)==0 )
6b40: 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30  {.      if( n==0
6b50: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65   ){.        free
6b60: 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20  (zLine);.       
6b70: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
6b80: 20 7d 0a 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6e   }.      zLine[n
6b90: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 65 6f 6c  ] = 0;.      eol
6ba0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61   = 1;.      brea
6bb0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69  k;.    }.    whi
6bc0: 6c 65 28 20 7a 4c 69 6e 65 5b 6e 5d 20 29 7b 20  le( zLine[n] ){ 
6bd0: 6e 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 6e  n++; }.    if( n
6be0: 3e 30 20 26 26 20 7a 4c 69 6e 65 5b 6e 2d 31 5d  >0 && zLine[n-1]
6bf0: 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20  =='\n' ){.      
6c00: 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a 4c 69 6e 65  n--;.      zLine
6c10: 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 65  [n] = 0;.      e
6c20: 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ol = 1;.    }.  
6c30: 7d 0a 20 20 7a 4c 69 6e 65 20 3d 20 72 65 61 6c  }.  zLine = real
6c40: 6c 6f 63 28 20 7a 4c 69 6e 65 2c 20 6e 2b 31 20  loc( zLine, n+1 
6c50: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4c 69 6e  );.  return zLin
6c60: 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 69 67  e;.}.../*.** Fig
6c70: 75 72 65 20 6f 75 74 20 74 68 65 20 63 6f 6c 75  ure out the colu
6c80: 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 65  mn names for the
6c90: 20 64 61 74 61 20 72 65 74 75 72 6e 65 64 20 62   data returned b
6ca0: 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a  y the statement.
6cb0: 2a 2a 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ** passed as the
6cc0: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
6cd0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
6ce0: 65 74 65 72 20 70 61 70 43 6f 6c 4e 61 6d 65 20  eter papColName 
6cf0: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
6d00: 6e 20 2a 70 61 70 43 6f 6c 4e 61 6d 65 20 69 73  n *papColName is
6d10: 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a   set to point.**
6d20: 20 61 74 20 61 6e 20 61 72 72 61 79 20 61 6c 6c   at an array all
6d30: 6f 63 61 74 65 64 20 75 73 69 6e 67 20 54 63 6c  ocated using Tcl
6d40: 5f 41 6c 6c 6f 63 28 29 2e 20 49 74 20 69 73 20  _Alloc(). It is 
6d50: 74 68 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70  the callers resp
6d60: 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20 74 6f  onsibility.** to
6d70: 20 66 72 65 65 20 74 68 69 73 20 61 72 72 61 79   free this array
6d80: 20 75 73 69 6e 67 20 54 63 6c 5f 46 72 65 65 28   using Tcl_Free(
6d90: 29 2c 20 61 6e 64 20 74 6f 20 64 65 63 72 65 6d  ), and to decrem
6da0: 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63  ent the referenc
6db0: 65 0a 2a 2a 20 63 6f 75 6e 74 20 6f 66 20 65 61  e.** count of ea
6dc0: 63 68 20 54 63 6c 5f 4f 62 6a 2a 20 6d 65 6d 62  ch Tcl_Obj* memb
6dd0: 65 72 20 6f 66 20 74 68 65 20 61 72 72 61 79 2e  er of the array.
6de0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
6df0: 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  n value of this 
6e00: 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 20  function is the 
6e10: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
6e20: 73 20 6f 66 20 64 61 74 61 0a 2a 2a 20 72 65 74  s of data.** ret
6e30: 75 72 6e 65 64 20 62 79 20 70 53 74 6d 74 20 28  urned by pStmt (
6e40: 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20 73 69  and hence the si
6e50: 7a 65 20 6f 66 20 74 68 65 20 2a 70 61 70 43 6f  ze of the *papCo
6e60: 6c 4e 61 6d 65 20 61 72 72 61 79 29 2e 0a 2a 2a  lName array)..**
6e70: 0a 2a 2a 20 49 66 20 70 41 72 72 61 79 20 69 73  .** If pArray is
6e80: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
6e90: 69 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  it contains the 
6ea0: 6e 61 6d 65 20 6f 66 20 61 20 54 63 6c 20 61 72  name of a Tcl ar
6eb0: 72 61 79 0a 2a 2a 20 76 61 72 69 61 62 6c 65 2e  ray.** variable.
6ec0: 20 54 68 65 20 22 2a 22 20 6d 65 6d 62 65 72 20   The "*" member 
6ed0: 6f 66 20 74 68 69 73 20 61 72 72 61 79 20 69 73  of this array is
6ee0: 20 73 65 74 20 74 6f 20 61 20 6c 69 73 74 20 63   set to a list c
6ef0: 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 74 68 65  ontaining.** the
6f00: 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f   names of the co
6f10: 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62  lumns returned b
6f20: 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c  y the statement,
6f30: 20 69 6e 20 6f 72 64 65 72 20 66 72 6f 6d 0a 2a   in order from.*
6f40: 2a 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e  * left to right.
6f50: 20 65 2e 67 2e 20 69 66 20 74 68 65 20 6e 61 6d   e.g. if the nam
6f60: 65 73 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e  es of the return
6f70: 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 61  ed columns are a
6f80: 2c 20 62 20 61 6e 64 0a 2a 2a 20 63 2c 20 69 74  , b and.** c, it
6f90: 20 64 6f 65 73 20 74 68 65 20 65 71 75 69 76 61   does the equiva
6fa0: 6c 65 6e 74 20 6f 66 20 74 68 65 20 74 63 6c 20  lent of the tcl 
6fb0: 63 6f 6d 6d 61 6e 64 3a 0a 2a 2a 0a 2a 2a 20 20  command:.**.**  
6fc0: 20 20 20 73 65 74 20 24 7b 70 41 72 72 61 79 7d     set ${pArray}
6fd0: 28 2a 29 20 7b 61 20 62 20 63 7d 0a 2a 2f 0a 73  (*) {a b c}.*/.s
6fe0: 74 61 74 69 63 20 69 6e 74 0a 63 6f 6d 70 75 74  tatic int.comput
6ff0: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20  eColumnNames(.  
7000: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
7010: 72 70 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 73  rp, .  sqlite3_s
7020: 74 6d 74 20 2a 70 53 74 6d 74 2c 20 20 20 20 20  tmt *pStmt,     
7030: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20           /* SQL 
7040: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54  statement */.  T
7050: 63 6c 5f 4f 62 6a 20 2a 2a 2a 70 61 70 43 6f 6c  cl_Obj ***papCol
7060: 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20  Name,           
7070: 20 2f 2a 20 4f 55 54 3a 20 41 72 72 61 79 20 6f   /* OUT: Array o
7080: 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a  f column names *
7090: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72  /.  Tcl_Obj *pAr
70a0: 72 61 79 20 20 20 20 20 20 20 20 20 20 20 20 20  ray             
70b0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
70c0: 20 61 72 72 61 79 20 76 61 72 69 61 62 6c 65 20   array variable 
70d0: 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f  (may be null) */
70e0: 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a  .){.  int nCol;.
70f0: 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f  .  /* Compute co
7100: 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20  lumn names */.  
7110: 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63  nCol = sqlite3_c
7120: 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d  olumn_count(pStm
7130: 74 29 3b 0a 20 20 69 66 28 20 70 61 70 43 6f 6c  t);.  if( papCol
7140: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  Name ){.    int 
7150: 69 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  i;.    Tcl_Obj *
7160: 2a 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 54 63  *apColName = (Tc
7170: 6c 5f 4f 62 6a 2a 2a 29 54 63 6c 5f 41 6c 6c 6f  l_Obj**)Tcl_Allo
7180: 63 28 20 73 69 7a 65 6f 66 28 54 63 6c 5f 4f 62  c( sizeof(Tcl_Ob
7190: 6a 2a 29 2a 6e 43 6f 6c 20 29 3b 0a 20 20 20 20  j*)*nCol );.    
71a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
71b0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 70 43   i++){.      apC
71c0: 6f 6c 4e 61 6d 65 5b 69 5d 20 3d 20 64 62 54 65  olName[i] = dbTe
71d0: 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f  xtToObj(sqlite3_
71e0: 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d  column_name(pStm
71f0: 74 2c 69 29 29 3b 0a 20 20 20 20 20 20 54 63 6c  t,i));.      Tcl
7200: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 61 70  _IncrRefCount(ap
7210: 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20  ColName[i]);.   
7220: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 72 65   }..    /* If re
7230: 73 75 6c 74 73 20 61 72 65 20 62 65 69 6e 67 20  sults are being 
7240: 73 74 6f 72 65 64 20 69 6e 20 61 6e 20 61 72 72  stored in an arr
7250: 61 79 20 76 61 72 69 61 62 6c 65 2c 20 74 68 65  ay variable, the
7260: 6e 20 63 72 65 61 74 65 0a 20 20 20 20 2a 2a 20  n create.    ** 
7270: 74 68 65 20 61 72 72 61 79 28 2a 29 20 65 6e 74  the array(*) ent
7280: 72 79 20 66 6f 72 20 74 68 61 74 20 61 72 72 61  ry for that arra
7290: 79 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  y.    */.    if(
72a0: 20 70 41 72 72 61 79 20 29 7b 0a 20 20 20 20 20   pArray ){.     
72b0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f 6c 4c 69   Tcl_Obj *pColLi
72c0: 73 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28  st = Tcl_NewObj(
72d0: 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a  );.      Tcl_Obj
72e0: 20 2a 70 53 74 61 72 20 3d 20 54 63 6c 5f 4e 65   *pStar = Tcl_Ne
72f0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 2a 22 2c 20  wStringObj("*", 
7300: 2d 31 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 49  -1);.      Tcl_I
7310: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6f 6c  ncrRefCount(pCol
7320: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 66 6f 72  List);.      for
7330: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
7340: 2b 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  +){.        Tcl_
7350: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
7360: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 43 6f  ment(interp, pCo
7370: 6c 4c 69 73 74 2c 20 61 70 43 6f 6c 4e 61 6d 65  lList, apColName
7380: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [i]);.      }.  
7390: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
73a0: 6f 75 6e 74 28 70 53 74 61 72 29 3b 0a 20 20 20  ount(pStar);.   
73b0: 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72     Tcl_ObjSetVar
73c0: 32 28 69 6e 74 65 72 70 2c 20 70 41 72 72 61 79  2(interp, pArray
73d0: 2c 20 70 53 74 61 72 2c 20 70 43 6f 6c 4c 69 73  , pStar, pColLis
73e0: 74 2c 30 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f  t,0);.      Tcl_
73f0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6f  DecrRefCount(pCo
7400: 6c 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 54 63  lList);.      Tc
7410: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
7420: 53 74 61 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Star);.    }.   
7430: 20 2a 70 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 61   *papColName = a
7440: 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 7d 0a 0a 20  pColName;.  }.. 
7450: 20 72 65 74 75 72 6e 20 6e 43 6f 6c 3b 0a 7d 0a   return nCol;.}.
7460: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 22 73 71 6c 69  ./*.** The "sqli
7470: 74 65 22 20 63 6f 6d 6d 61 6e 64 20 62 65 6c 6f  te" command belo
7480: 77 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 20  w creates a new 
7490: 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 66 6f 72 20  Tcl command for 
74a0: 65 61 63 68 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  each.** connecti
74b0: 6f 6e 20 69 74 20 6f 70 65 6e 73 20 74 6f 20 61  on it opens to a
74c0: 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  n SQLite databas
74d0: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
74e0: 20 69 73 20 69 6e 76 6f 6b 65 64 0a 2a 2a 20 77   is invoked.** w
74f0: 68 65 6e 65 76 65 72 20 6f 6e 65 20 6f 66 20 74  henever one of t
7500: 68 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2d  hose connection-
7510: 73 70 65 63 69 66 69 63 20 63 6f 6d 6d 61 6e 64  specific command
7520: 73 20 69 73 20 65 78 65 63 75 74 65 64 0a 2a 2a  s is executed.**
7530: 20 69 6e 20 54 63 6c 2e 20 20 46 6f 72 20 65 78   in Tcl.  For ex
7540: 61 6d 70 6c 65 2c 20 69 66 20 79 6f 75 20 72 75  ample, if you ru
7550: 6e 20 54 63 6c 20 63 6f 64 65 20 6c 69 6b 65 20  n Tcl code like 
7560: 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
7570: 20 20 73 71 6c 69 74 65 33 20 64 62 31 20 20 22    sqlite3 db1  "
7580: 6d 79 5f 64 61 74 61 62 61 73 65 22 0a 2a 2a 20  my_database".** 
7590: 20 20 20 20 20 20 64 62 31 20 63 6c 6f 73 65 0a        db1 close.
75a0: 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
75b0: 63 6f 6d 6d 61 6e 64 20 6f 70 65 6e 73 20 61 20  command opens a 
75c0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68  connection to th
75d0: 65 20 22 6d 79 5f 64 61 74 61 62 61 73 65 22 20  e "my_database" 
75e0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 61 6e 64 20  database.** and 
75f0: 63 61 6c 6c 73 20 74 68 61 74 20 63 6f 6e 6e 65  calls that conne
7600: 63 74 69 6f 6e 20 22 64 62 31 22 2e 20 20 54 68  ction "db1".  Th
7610: 65 20 73 65 63 6f 6e 64 20 63 6f 6d 6d 61 6e 64  e second command
7620: 20 63 61 75 73 65 73 20 74 68 69 73 0a 2a 2a 20   causes this.** 
7630: 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 62 65  subroutine to be
7640: 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 73 74 61   invoked..*/.sta
7650: 74 69 63 20 69 6e 74 20 44 62 4f 62 6a 43 6d 64  tic int DbObjCmd
7660: 28 76 6f 69 64 20 2a 63 64 2c 20 54 63 6c 5f 49  (void *cd, Tcl_I
7670: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
7680: 6e 74 20 6f 62 6a 63 2c 54 63 6c 5f 4f 62 6a 20  nt objc,Tcl_Obj 
7690: 2a 63 6f 6e 73 74 2a 6f 62 6a 76 29 7b 0a 20 20  *const*objv){.  
76a0: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
76b0: 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20  (SqliteDb*)cd;. 
76c0: 20 69 6e 74 20 63 68 6f 69 63 65 3b 0a 20 20 69   int choice;.  i
76d0: 6e 74 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a  nt rc = TCL_OK;.
76e0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
76f0: 68 61 72 20 2a 44 42 5f 73 74 72 73 5b 5d 20 3d  har *DB_strs[] =
7700: 20 7b 0a 20 20 20 20 22 61 75 74 68 6f 72 69 7a   {.    "authoriz
7710: 65 72 22 2c 20 20 20 20 20 20 20 20 20 22 62 75  er",         "bu
7720: 73 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  sy",            
7730: 20 20 22 63 61 63 68 65 22 2c 0a 20 20 20 20 22    "cache",.    "
7740: 63 68 61 6e 67 65 73 22 2c 20 20 20 20 20 20 20  changes",       
7750: 20 20 20 20 20 22 63 6c 6f 73 65 22 2c 20 20 20       "close",   
7760: 20 20 20 20 20 20 20 20 20 20 22 63 6f 6c 6c 61            "colla
7770: 74 65 22 2c 0a 20 20 20 20 22 63 6f 6c 6c 61 74  te",.    "collat
7780: 69 6f 6e 5f 6e 65 65 64 65 64 22 2c 20 20 20 22  ion_needed",   "
7790: 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 22 2c 20 20 20  commit_hook",   
77a0: 20 20 20 20 22 63 6f 6d 70 6c 65 74 65 22 2c 0a      "complete",.
77b0: 20 20 20 20 22 63 6f 70 79 22 2c 20 20 20 20 20      "copy",     
77c0: 20 20 20 20 20 20 20 20 20 20 22 65 6e 61 62 6c            "enabl
77d0: 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e  e_load_extension
77e0: 22 2c 22 65 72 72 6f 72 63 6f 64 65 22 2c 0a 20  ","errorcode",. 
77f0: 20 20 20 22 65 76 61 6c 22 2c 20 20 20 20 20 20     "eval",      
7800: 20 20 20 20 20 20 20 20 20 22 65 78 69 73 74 73           "exists
7810: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 22 66  ",            "f
7820: 75 6e 63 74 69 6f 6e 22 2c 0a 20 20 20 20 22 69  unction",.    "i
7830: 6e 63 72 62 6c 6f 62 22 2c 20 20 20 20 20 20 20  ncrblob",       
7840: 20 20 20 20 22 69 6e 74 65 72 72 75 70 74 22 2c      "interrupt",
7850: 20 20 20 20 20 20 20 20 20 22 6c 61 73 74 5f 69           "last_i
7860: 6e 73 65 72 74 5f 72 6f 77 69 64 22 2c 0a 20 20  nsert_rowid",.  
7870: 20 20 22 6e 75 6c 6c 76 61 6c 75 65 22 2c 20 20    "nullvalue",  
7880: 20 20 20 20 20 20 20 20 22 6f 6e 65 63 6f 6c 75          "onecolu
7890: 6d 6e 22 2c 20 20 20 20 20 20 20 20 20 22 70 72  mn",         "pr
78a0: 6f 66 69 6c 65 22 2c 0a 20 20 20 20 22 70 72 6f  ofile",.    "pro
78b0: 67 72 65 73 73 22 2c 20 20 20 20 20 20 20 20 20  gress",         
78c0: 20 20 22 72 65 6b 65 79 22 2c 20 20 20 20 20 20    "rekey",      
78d0: 20 20 20 20 20 20 20 22 72 6f 6c 6c 62 61 63 6b         "rollback
78e0: 5f 68 6f 6f 6b 22 2c 0a 20 20 20 20 22 74 69 6d  _hook",.    "tim
78f0: 65 6f 75 74 22 2c 20 20 20 20 20 20 20 20 20 20  eout",          
7900: 20 20 22 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73    "total_changes
7910: 22 2c 20 20 20 20 20 22 74 72 61 63 65 22 2c 0a  ",     "trace",.
7920: 20 20 20 20 22 74 72 61 6e 73 61 63 74 69 6f 6e      "transaction
7930: 22 2c 20 20 20 20 20 20 20 20 22 75 70 64 61 74  ",        "updat
7940: 65 5f 68 6f 6f 6b 22 2c 20 20 20 20 20 20 20 22  e_hook",       "
7950: 76 65 72 73 69 6f 6e 22 2c 0a 20 20 20 20 30 20  version",.    0 
7960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7970: 20 20 20 0a 20 20 7d 3b 0a 20 20 65 6e 75 6d 20     .  };.  enum 
7980: 44 42 5f 65 6e 75 6d 20 7b 0a 20 20 20 20 44 42  DB_enum {.    DB
7990: 5f 41 55 54 48 4f 52 49 5a 45 52 2c 20 20 20 20  _AUTHORIZER,    
79a0: 20 20 20 20 44 42 5f 42 55 53 59 2c 20 20 20 20      DB_BUSY,    
79b0: 20 20 20 20 20 20 20 20 20 44 42 5f 43 41 43 48           DB_CACH
79c0: 45 2c 0a 20 20 20 20 44 42 5f 43 48 41 4e 47 45  E,.    DB_CHANGE
79d0: 53 2c 20 20 20 20 20 20 20 20 20 20 20 44 42 5f  S,           DB_
79e0: 43 4c 4f 53 45 2c 20 20 20 20 20 20 20 20 20 20  CLOSE,          
79f0: 20 20 44 42 5f 43 4f 4c 4c 41 54 45 2c 0a 20 20    DB_COLLATE,.  
7a00: 20 20 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e    DB_COLLATION_N
7a10: 45 45 44 45 44 2c 20 20 44 42 5f 43 4f 4d 4d 49  EEDED,  DB_COMMI
7a20: 54 5f 48 4f 4f 4b 2c 20 20 20 20 20 20 44 42 5f  T_HOOK,      DB_
7a30: 43 4f 4d 50 4c 45 54 45 2c 0a 20 20 20 20 44 42  COMPLETE,.    DB
7a40: 5f 43 4f 50 59 2c 20 20 20 20 20 20 20 20 20 20  _COPY,          
7a50: 20 20 20 20 44 42 5f 45 4e 41 42 4c 45 5f 4c 4f      DB_ENABLE_LO
7a60: 41 44 5f 45 58 54 45 4e 53 49 4f 4e 2c 44 42 5f  AD_EXTENSION,DB_
7a70: 45 52 52 4f 52 43 4f 44 45 2c 0a 20 20 20 20 44  ERRORCODE,.    D
7a80: 42 5f 45 56 41 4c 2c 20 20 20 20 20 20 20 20 20  B_EVAL,         
7a90: 20 20 20 20 20 44 42 5f 45 58 49 53 54 53 2c 20       DB_EXISTS, 
7aa0: 20 20 20 20 20 20 20 20 20 20 44 42 5f 46 55 4e            DB_FUN
7ab0: 43 54 49 4f 4e 2c 0a 20 20 20 20 44 42 5f 49 4e  CTION,.    DB_IN
7ac0: 43 52 42 4c 4f 42 2c 20 20 20 20 20 20 20 20 20  CRBLOB,         
7ad0: 20 44 42 5f 49 4e 54 45 52 52 55 50 54 2c 20 20   DB_INTERRUPT,  
7ae0: 20 20 20 20 20 20 44 42 5f 4c 41 53 54 5f 49 4e        DB_LAST_IN
7af0: 53 45 52 54 5f 52 4f 57 49 44 2c 0a 20 20 20 20  SERT_ROWID,.    
7b00: 44 42 5f 4e 55 4c 4c 56 41 4c 55 45 2c 20 20 20  DB_NULLVALUE,   
7b10: 20 20 20 20 20 20 44 42 5f 4f 4e 45 43 4f 4c 55        DB_ONECOLU
7b20: 4d 4e 2c 20 20 20 20 20 20 20 20 44 42 5f 50 52  MN,        DB_PR
7b30: 4f 46 49 4c 45 2c 0a 20 20 20 20 44 42 5f 50 52  OFILE,.    DB_PR
7b40: 4f 47 52 45 53 53 2c 20 20 20 20 20 20 20 20 20  OGRESS,         
7b50: 20 44 42 5f 52 45 4b 45 59 2c 20 20 20 20 20 20   DB_REKEY,      
7b60: 20 20 20 20 20 20 44 42 5f 52 4f 4c 4c 42 41 43        DB_ROLLBAC
7b70: 4b 5f 48 4f 4f 4b 2c 0a 20 20 20 20 44 42 5f 54  K_HOOK,.    DB_T
7b80: 49 4d 45 4f 55 54 2c 20 20 20 20 20 20 20 20 20  IMEOUT,         
7b90: 20 20 44 42 5f 54 4f 54 41 4c 5f 43 48 41 4e 47    DB_TOTAL_CHANG
7ba0: 45 53 2c 20 20 20 20 44 42 5f 54 52 41 43 45 2c  ES,    DB_TRACE,
7bb0: 0a 20 20 20 20 44 42 5f 54 52 41 4e 53 41 43 54  .    DB_TRANSACT
7bc0: 49 4f 4e 2c 20 20 20 20 20 20 20 44 42 5f 55 50  ION,       DB_UP
7bd0: 44 41 54 45 5f 48 4f 4f 4b 2c 20 20 20 20 20 20  DATE_HOOK,      
7be0: 44 42 5f 56 45 52 53 49 4f 4e 0a 20 20 7d 3b 0a  DB_VERSION.  };.
7bf0: 20 20 2f 2a 20 64 6f 6e 27 74 20 6c 65 61 76 65    /* don't leave
7c00: 20 74 72 61 69 6c 69 6e 67 20 63 6f 6d 6d 61 73   trailing commas
7c10: 20 6f 6e 20 44 42 5f 65 6e 75 6d 2c 20 69 74 20   on DB_enum, it 
7c20: 63 6f 6e 66 75 73 65 73 20 74 68 65 20 41 49 58  confuses the AIX
7c30: 20 78 6c 63 20 63 6f 6d 70 69 6c 65 72 20 2a 2f   xlc compiler */
7c40: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3c 32 20 29  ..  if( objc<2 )
7c50: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
7c60: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
7c70: 2c 20 6f 62 6a 76 2c 20 22 53 55 42 43 4f 4d 4d  , objv, "SUBCOMM
7c80: 41 4e 44 20 2e 2e 2e 22 29 3b 0a 20 20 20 20 72  AND ...");.    r
7c90: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
7ca0: 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47  .  }.  if( Tcl_G
7cb0: 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69  etIndexFromObj(i
7cc0: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20  nterp, objv[1], 
7cd0: 44 42 5f 73 74 72 73 2c 20 22 6f 70 74 69 6f 6e  DB_strs, "option
7ce0: 22 2c 20 30 2c 20 26 63 68 6f 69 63 65 29 20 29  ", 0, &choice) )
7cf0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
7d00: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 73  _ERROR;.  }..  s
7d10: 77 69 74 63 68 28 20 28 65 6e 75 6d 20 44 42 5f  witch( (enum DB_
7d20: 65 6e 75 6d 29 63 68 6f 69 63 65 20 29 7b 0a 0a  enum)choice ){..
7d30: 20 20 2f 2a 20 20 20 20 24 64 62 20 61 75 74 68    /*    $db auth
7d40: 6f 72 69 7a 65 72 20 3f 43 41 4c 4c 42 41 43 4b  orizer ?CALLBACK
7d50: 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f  ?.  **.  ** Invo
7d60: 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c  ke the given cal
7d70: 6c 62 61 63 6b 20 74 6f 20 61 75 74 68 6f 72 69  lback to authori
7d80: 7a 65 20 65 61 63 68 20 53 51 4c 20 6f 70 65 72  ze each SQL oper
7d90: 61 74 69 6f 6e 20 61 73 20 69 74 20 69 73 0a 20  ation as it is. 
7da0: 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 2e 20 20 35   ** compiled.  5
7db0: 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 61   arguments are a
7dc0: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 63  ppended to the c
7dd0: 61 6c 6c 62 61 63 6b 20 62 65 66 6f 72 65 20 69  allback before i
7de0: 74 20 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6b 65  t is.  ** invoke
7df0: 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28  d:.  **.  **   (
7e00: 31 29 20 54 68 65 20 61 75 74 68 6f 72 69 7a 61  1) The authoriza
7e10: 74 69 6f 6e 20 74 79 70 65 20 28 65 78 3a 20 53  tion type (ex: S
7e20: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42  QLITE_CREATE_TAB
7e30: 4c 45 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52  LE, SQLITE_INSER
7e40: 54 2c 20 2e 2e 2e 29 0a 20 20 2a 2a 20 20 20 28  T, ...).  **   (
7e50: 32 29 20 46 69 72 73 74 20 64 65 73 63 72 69 70  2) First descrip
7e60: 74 69 76 65 20 6e 61 6d 65 20 28 64 65 70 65 6e  tive name (depen
7e70: 64 73 20 6f 6e 20 61 75 74 68 6f 72 69 7a 61 74  ds on authorizat
7e80: 69 6f 6e 20 74 79 70 65 29 0a 20 20 2a 2a 20 20  ion type).  **  
7e90: 20 28 33 29 20 53 65 63 6f 6e 64 20 64 65 73 63   (3) Second desc
7ea0: 72 69 70 74 69 76 65 20 6e 61 6d 65 0a 20 20 2a  riptive name.  *
7eb0: 2a 20 20 20 28 34 29 20 4e 61 6d 65 20 6f 66 20  *   (4) Name of 
7ec0: 74 68 65 20 64 61 74 61 62 61 73 65 20 28 65 78  the database (ex
7ed0: 3a 20 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22  : "main", "temp"
7ee0: 29 0a 20 20 2a 2a 20 20 20 28 35 29 20 4e 61 6d  ).  **   (5) Nam
7ef0: 65 20 6f 66 20 74 72 69 67 67 65 72 20 74 68 61  e of trigger tha
7f00: 74 20 69 73 20 64 6f 69 6e 67 20 74 68 65 20 61  t is doing the a
7f10: 63 63 65 73 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ccess.  **.  ** 
7f20: 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 73 68 6f  The callback sho
7f30: 75 6c 64 20 72 65 74 75 72 6e 20 6f 6e 20 6f 66  uld return on of
7f40: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
7f50: 74 72 69 6e 67 73 3a 20 53 51 4c 49 54 45 5f 4f  trings: SQLITE_O
7f60: 4b 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 49  K,.  ** SQLITE_I
7f70: 47 4e 4f 52 45 2c 20 6f 72 20 53 51 4c 49 54 45  GNORE, or SQLITE
7f80: 5f 44 45 4e 59 2e 20 20 41 6e 79 20 6f 74 68 65  _DENY.  Any othe
7f90: 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  r return value i
7fa0: 73 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2a  s an error..  **
7fb0: 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 6d 65  .  ** If this me
7fc0: 74 68 6f 64 20 69 73 20 69 6e 76 6f 6b 65 64 20  thod is invoked 
7fd0: 77 69 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74  with no argument
7fe0: 73 2c 20 74 68 65 20 63 75 72 72 65 6e 74 20 61  s, the current a
7ff0: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 0a 20 20 2a  uthorization.  *
8000: 2a 20 63 61 6c 6c 62 61 63 6b 20 73 74 72 69 6e  * callback strin
8010: 67 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 20  g is returned.. 
8020: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 41 55   */.  case DB_AU
8030: 54 48 4f 52 49 5a 45 52 3a 20 7b 0a 23 69 66 64  THORIZER: {.#ifd
8040: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
8050: 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20  UTHORIZATION.   
8060: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
8070: 74 28 69 6e 74 65 72 70 2c 20 22 61 75 74 68 6f  t(interp, "autho
8080: 72 69 7a 61 74 69 6f 6e 20 6e 6f 74 20 61 76 61  rization not ava
8090: 69 6c 61 62 6c 65 20 69 6e 20 74 68 69 73 20 62  ilable in this b
80a0: 75 69 6c 64 22 2c 20 30 29 3b 0a 20 20 20 20 72  uild", 0);.    r
80b0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
80c0: 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 6f  .#else.    if( o
80d0: 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54  bjc>3 ){.      T
80e0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
80f0: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
8100: 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a   "?CALLBACK?");.
8110: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
8120: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73  _ERROR;.    }els
8130: 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b  e if( objc==2 ){
8140: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
8150: 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 20 20 20  zAuth ){.       
8160: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
8170: 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a  t(interp, pDb->z
8180: 41 75 74 68 2c 20 30 29 3b 0a 20 20 20 20 20 20  Auth, 0);.      
8190: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
81a0: 20 20 20 63 68 61 72 20 2a 7a 41 75 74 68 3b 0a     char *zAuth;.
81b0: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20        int len;. 
81c0: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 41       if( pDb->zA
81d0: 75 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 54  uth ){.        T
81e0: 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 41 75  cl_Free(pDb->zAu
81f0: 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  th);.      }.   
8200: 20 20 20 7a 41 75 74 68 20 3d 20 54 63 6c 5f 47     zAuth = Tcl_G
8210: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
8220: 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a  objv[2], &len);.
8230: 20 20 20 20 20 20 69 66 28 20 7a 41 75 74 68 20        if( zAuth 
8240: 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20  && len>0 ){.    
8250: 20 20 20 20 70 44 62 2d 3e 7a 41 75 74 68 20 3d      pDb->zAuth =
8260: 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20   Tcl_Alloc( len 
8270: 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d  + 1 );.        m
8280: 65 6d 63 70 79 28 70 44 62 2d 3e 7a 41 75 74 68  emcpy(pDb->zAuth
8290: 2c 20 7a 41 75 74 68 2c 20 6c 65 6e 2b 31 29 3b  , zAuth, len+1);
82a0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
82b0: 20 20 20 20 20 20 70 44 62 2d 3e 7a 41 75 74 68        pDb->zAuth
82c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
82d0: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75      if( pDb->zAu
82e0: 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  th ){.        pD
82f0: 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65  b->interp = inte
8300: 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  rp;.        sqli
8310: 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a  te3_set_authoriz
8320: 65 72 28 70 44 62 2d 3e 64 62 2c 20 61 75 74 68  er(pDb->db, auth
8330: 5f 63 61 6c 6c 62 61 63 6b 2c 20 70 44 62 29 3b  _callback, pDb);
8340: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
8350: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65        sqlite3_se
8360: 74 5f 61 75 74 68 6f 72 69 7a 65 72 28 70 44 62  t_authorizer(pDb
8370: 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ->db, 0, 0);.   
8380: 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
8390: 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  f.    break;.  }
83a0: 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 62 75  ..  /*    $db bu
83b0: 73 79 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20  sy ?CALLBACK?.  
83c0: 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74  **.  ** Invoke t
83d0: 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63  he given callbac
83e0: 6b 20 69 66 20 61 6e 20 53 51 4c 20 73 74 61 74  k if an SQL stat
83f0: 65 6d 65 6e 74 20 61 74 74 65 6d 70 74 73 20 74  ement attempts t
8400: 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 6c 6f  o open.  ** a lo
8410: 63 6b 65 64 20 64 61 74 61 62 61 73 65 20 66 69  cked database fi
8420: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  le..  */.  case 
8430: 44 42 5f 42 55 53 59 3a 20 7b 0a 20 20 20 20 69  DB_BUSY: {.    i
8440: 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20  f( objc>3 ){.   
8450: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
8460: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
8470: 62 6a 76 2c 20 22 43 41 4c 4c 42 41 43 4b 22 29  bjv, "CALLBACK")
8480: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
8490: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65  CL_ERROR;.    }e
84a0: 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20  lse if( objc==2 
84b0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  ){.      if( pDb
84c0: 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 20  ->zBusy ){.     
84d0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
84e0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d  ult(interp, pDb-
84f0: 3e 7a 42 75 73 79 2c 20 30 29 3b 0a 20 20 20 20  >zBusy, 0);.    
8500: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
8510: 20 20 20 20 20 63 68 61 72 20 2a 7a 42 75 73 79       char *zBusy
8520: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b  ;.      int len;
8530: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
8540: 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20  zBusy ){.       
8550: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
8560: 42 75 73 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Busy);.      }. 
8570: 20 20 20 20 20 7a 42 75 73 79 20 3d 20 54 63 6c       zBusy = Tcl
8580: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
8590: 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29  j(objv[2], &len)
85a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 42 75 73  ;.      if( zBus
85b0: 79 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20  y && len>0 ){.  
85c0: 20 20 20 20 20 20 70 44 62 2d 3e 7a 42 75 73 79        pDb->zBusy
85d0: 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65   = Tcl_Alloc( le
85e0: 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20  n + 1 );.       
85f0: 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 42 75   memcpy(pDb->zBu
8600: 73 79 2c 20 7a 42 75 73 79 2c 20 6c 65 6e 2b 31  sy, zBusy, len+1
8610: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
8620: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 42 75          pDb->zBu
8630: 73 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  sy = 0;.      }.
8640: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
8650: 42 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Busy ){.        
8660: 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e  pDb->interp = in
8670: 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71  terp;.        sq
8680: 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c  lite3_busy_handl
8690: 65 72 28 70 44 62 2d 3e 64 62 2c 20 44 62 42 75  er(pDb->db, DbBu
86a0: 73 79 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b  syHandler, pDb);
86b0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
86c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75        sqlite3_bu
86d0: 73 79 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e  sy_handler(pDb->
86e0: 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  db, 0, 0);.     
86f0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65   }.    }.    bre
8700: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
8710: 20 20 24 64 62 20 63 61 63 68 65 20 66 6c 75 73    $db cache flus
8720: 68 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63  h.  **     $db c
8730: 61 63 68 65 20 73 69 7a 65 20 6e 0a 20 20 2a 2a  ache size n.  **
8740: 0a 20 20 2a 2a 20 46 6c 75 73 68 20 74 68 65 20  .  ** Flush the 
8750: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
8760: 6e 74 20 63 61 63 68 65 2c 20 6f 72 20 73 65 74  nt cache, or set
8770: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
8780: 62 65 72 20 6f 66 0a 20 20 2a 2a 20 63 61 63 68  ber of.  ** cach
8790: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  ed statements.. 
87a0: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 41   */.  case DB_CA
87b0: 43 48 45 3a 20 7b 0a 20 20 20 20 63 68 61 72 20  CHE: {.    char 
87c0: 2a 73 75 62 43 6d 64 3b 0a 20 20 20 20 69 6e 74  *subCmd;.    int
87d0: 20 6e 3b 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a   n;..    if( obj
87e0: 63 3c 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63  c<=2 ){.      Tc
87f0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
8800: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
8810: 22 63 61 63 68 65 20 6f 70 74 69 6f 6e 20 3f 61  "cache option ?a
8820: 72 67 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74  rg?");.      ret
8830: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
8840: 20 20 20 7d 0a 20 20 20 20 73 75 62 43 6d 64 20     }.    subCmd 
8850: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
8860: 72 6f 6d 4f 62 6a 28 20 6f 62 6a 76 5b 32 5d 2c  romObj( objv[2],
8870: 20 30 20 29 3b 0a 20 20 20 20 69 66 28 20 2a 73   0 );.    if( *s
8880: 75 62 43 6d 64 3d 3d 27 66 27 20 26 26 20 73 74  ubCmd=='f' && st
8890: 72 63 6d 70 28 73 75 62 43 6d 64 2c 22 66 6c 75  rcmp(subCmd,"flu
88a0: 73 68 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  sh")==0 ){.     
88b0: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
88c0: 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e          Tcl_Wron
88d0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
88e0: 20 32 2c 20 6f 62 6a 76 2c 20 22 66 6c 75 73 68   2, objv, "flush
88f0: 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ");.        retu
8900: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
8910: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8920: 20 20 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68     flushStmtCach
8930: 65 28 20 70 44 62 20 29 3b 0a 20 20 20 20 20 20  e( pDb );.      
8940: 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
8950: 2a 73 75 62 43 6d 64 3d 3d 27 73 27 20 26 26 20  *subCmd=='s' && 
8960: 73 74 72 63 6d 70 28 73 75 62 43 6d 64 2c 22 73  strcmp(subCmd,"s
8970: 69 7a 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ize")==0 ){.    
8980: 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b    if( objc!=4 ){
8990: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  .        Tcl_Wro
89a0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
89b0: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 73 69 7a 65  , 2, objv, "size
89c0: 20 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65   n");.        re
89d0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
89e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
89f0: 20 20 20 20 20 69 66 28 20 54 43 4c 5f 45 52 52       if( TCL_ERR
8a00: 4f 52 3d 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72  OR==Tcl_GetIntFr
8a10: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
8a20: 6a 76 5b 33 5d 2c 20 26 6e 29 20 29 7b 0a 20 20  jv[3], &n) ){.  
8a30: 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
8a40: 6e 64 52 65 73 75 6c 74 28 20 69 6e 74 65 72 70  ndResult( interp
8a50: 2c 20 22 63 61 6e 6e 6f 74 20 63 6f 6e 76 65 72  , "cannot conver
8a60: 74 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 20  t \"", .        
8a70: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
8a80: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
8a90: 5b 33 5d 2c 30 29 2c 20 22 5c 22 20 74 6f 20 69  [3],0), "\" to i
8aa0: 6e 74 65 67 65 72 22 2c 20 30 29 3b 0a 20 20 20  nteger", 0);.   
8ab0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
8ac0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  L_ERROR;.       
8ad0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8ae0: 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20    if( n<0 ){.   
8af0: 20 20 20 20 20 20 20 20 20 66 6c 75 73 68 53 74           flushSt
8b00: 6d 74 43 61 63 68 65 28 20 70 44 62 20 29 3b 0a  mtCache( pDb );.
8b10: 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20              n = 
8b20: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  0;.          }el
8b30: 73 65 20 69 66 28 20 6e 3e 4d 41 58 5f 50 52 45  se if( n>MAX_PRE
8b40: 50 41 52 45 44 5f 53 54 4d 54 53 20 29 7b 0a 20  PARED_STMTS ){. 
8b50: 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 4d             n = M
8b60: 41 58 5f 50 52 45 50 41 52 45 44 5f 53 54 4d 54  AX_PREPARED_STMT
8b70: 53 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  S;.          }. 
8b80: 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 6d 61           pDb->ma
8b90: 78 53 74 6d 74 20 3d 20 6e 3b 0a 20 20 20 20 20  xStmt = n;.     
8ba0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
8bb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63   }else{.      Tc
8bc0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 20  l_AppendResult( 
8bd0: 69 6e 74 65 72 70 2c 20 22 62 61 64 20 6f 70 74  interp, "bad opt
8be0: 69 6f 6e 20 5c 22 22 2c 20 0a 20 20 20 20 20 20  ion \"", .      
8bf0: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
8c00: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
8c10: 2c 30 29 2c 20 22 5c 22 3a 20 6d 75 73 74 20 62  ,0), "\": must b
8c20: 65 20 66 6c 75 73 68 20 6f 72 20 73 69 7a 65 22  e flush or size"
8c30: 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , 0);.      retu
8c40: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
8c50: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
8c60: 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 20 24 64 62   }..  /*     $db
8c70: 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 0a 20 20   changes.  **.  
8c80: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
8c90: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61  mber of rows tha
8ca0: 74 20 77 65 72 65 20 6d 6f 64 69 66 69 65 64 2c  t were modified,
8cb0: 20 69 6e 73 65 72 74 65 64 2c 20 6f 72 20 64 65   inserted, or de
8cc0: 6c 65 74 65 64 20 62 79 0a 20 20 2a 2a 20 74 68  leted by.  ** th
8cd0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 49 4e  e most recent IN
8ce0: 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20  SERT, UPDATE or 
8cf0: 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74  DELETE statement
8d00: 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67 20  , not including 
8d10: 0a 20 20 2a 2a 20 61 6e 79 20 63 68 61 6e 67 65  .  ** any change
8d20: 73 20 6d 61 64 65 20 62 79 20 74 72 69 67 67 65  s made by trigge
8d30: 72 20 70 72 6f 67 72 61 6d 73 2e 0a 20 20 2a 2f  r programs..  */
8d40: 0a 20 20 63 61 73 65 20 44 42 5f 43 48 41 4e 47  .  case DB_CHANG
8d50: 45 53 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62  ES: {.    Tcl_Ob
8d60: 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20  j *pResult;.    
8d70: 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
8d80: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
8d90: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
8da0: 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20   objv, "");.    
8db0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
8dc0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 52  OR;.    }.    pR
8dd0: 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f  esult = Tcl_GetO
8de0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  bjResult(interp)
8df0: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 49 6e 74  ;.    Tcl_SetInt
8e00: 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 73 71 6c  Obj(pResult, sql
8e10: 69 74 65 33 5f 63 68 61 6e 67 65 73 28 70 44 62  ite3_changes(pDb
8e20: 2d 3e 64 62 29 29 3b 0a 20 20 20 20 62 72 65 61  ->db));.    brea
8e30: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
8e40: 24 64 62 20 63 6c 6f 73 65 0a 20 20 2a 2a 0a 20  $db close.  **. 
8e50: 20 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65   ** Shutdown the
8e60: 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2f 0a 20   database.  */. 
8e70: 20 63 61 73 65 20 44 42 5f 43 4c 4f 53 45 3a 20   case DB_CLOSE: 
8e80: 7b 0a 20 20 20 20 54 63 6c 5f 44 65 6c 65 74 65  {.    Tcl_Delete
8e90: 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
8ea0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
8eb0: 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
8ec0: 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
8ed0: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
8ee0: 20 24 64 62 20 63 6f 6c 6c 61 74 65 20 4e 41 4d   $db collate NAM
8ef0: 45 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20  E SCRIPT.  **.  
8f00: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
8f10: 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75  SQL collation fu
8f20: 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41  nction called NA
8f30: 4d 45 2e 20 20 57 68 65 6e 65 76 65 72 0a 20 20  ME.  Whenever.  
8f40: 2a 2a 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e  ** that function
8f50: 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f   is called, invo
8f60: 6b 65 20 53 43 52 49 50 54 20 74 6f 20 65 76 61  ke SCRIPT to eva
8f70: 6c 75 61 74 65 20 74 68 65 20 66 75 6e 63 74 69  luate the functi
8f80: 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  on..  */.  case 
8f90: 44 42 5f 43 4f 4c 4c 41 54 45 3a 20 7b 0a 20 20  DB_COLLATE: {.  
8fa0: 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43    SqlCollate *pC
8fb0: 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 63 68 61 72  ollate;.    char
8fc0: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 68 61   *zName;.    cha
8fd0: 72 20 2a 7a 53 63 72 69 70 74 3b 0a 20 20 20 20  r *zScript;.    
8fe0: 69 6e 74 20 6e 53 63 72 69 70 74 3b 0a 20 20 20  int nScript;.   
8ff0: 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a   if( objc!=4 ){.
9000: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
9010: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
9020: 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20 53 43  , objv, "NAME SC
9030: 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65  RIPT");.      re
9040: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
9050: 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20      }.    zName 
9060: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
9070: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
9080: 30 29 3b 0a 20 20 20 20 7a 53 63 72 69 70 74 20  0);.    zScript 
9090: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
90a0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20  romObj(objv[3], 
90b0: 26 6e 53 63 72 69 70 74 29 3b 0a 20 20 20 20 70  &nScript);.    p
90c0: 43 6f 6c 6c 61 74 65 20 3d 20 28 53 71 6c 43 6f  Collate = (SqlCo
90d0: 6c 6c 61 74 65 2a 29 54 63 6c 5f 41 6c 6c 6f 63  llate*)Tcl_Alloc
90e0: 28 20 73 69 7a 65 6f 66 28 2a 70 43 6f 6c 6c 61  ( sizeof(*pColla
90f0: 74 65 29 20 2b 20 6e 53 63 72 69 70 74 20 2b 20  te) + nScript + 
9100: 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f  1 );.    if( pCo
9110: 6c 6c 61 74 65 3d 3d 30 20 29 20 72 65 74 75 72  llate==0 ) retur
9120: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
9130: 20 70 43 6f 6c 6c 61 74 65 2d 3e 69 6e 74 65 72   pCollate->inter
9140: 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20  p = interp;.    
9150: 70 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78 74 20  pCollate->pNext 
9160: 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 3b  = pDb->pCollate;
9170: 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 7a  .    pCollate->z
9180: 53 63 72 69 70 74 20 3d 20 28 63 68 61 72 2a 29  Script = (char*)
9190: 26 70 43 6f 6c 6c 61 74 65 5b 31 5d 3b 0a 20 20  &pCollate[1];.  
91a0: 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20    pDb->pCollate 
91b0: 3d 20 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20  = pCollate;.    
91c0: 6d 65 6d 63 70 79 28 70 43 6f 6c 6c 61 74 65 2d  memcpy(pCollate-
91d0: 3e 7a 53 63 72 69 70 74 2c 20 7a 53 63 72 69 70  >zScript, zScrip
91e0: 74 2c 20 6e 53 63 72 69 70 74 2b 31 29 3b 0a 20  t, nScript+1);. 
91f0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63     if( sqlite3_c
9200: 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28  reate_collation(
9210: 70 44 62 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20  pDb->db, zName, 
9220: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20 20  SQLITE_UTF8, .  
9230: 20 20 20 20 20 20 70 43 6f 6c 6c 61 74 65 2c 20        pCollate, 
9240: 74 63 6c 53 71 6c 43 6f 6c 6c 61 74 65 29 20 29  tclSqlCollate) )
9250: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52  {.      Tcl_SetR
9260: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
9270: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72  har *)sqlite3_er
9280: 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 54  rmsg(pDb->db), T
9290: 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20  CL_VOLATILE);.  
92a0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
92b0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
92c0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
92d0: 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63 6f  .  **     $db co
92e0: 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 20 53  llation_needed S
92f0: 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20  CRIPT.  **.  ** 
9300: 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 51 4c  Create a new SQL
9310: 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74   collation funct
9320: 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e  ion called NAME.
9330: 20 20 57 68 65 6e 65 76 65 72 0a 20 20 2a 2a 20    Whenever.  ** 
9340: 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 69 73  that function is
9350: 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65 20   called, invoke 
9360: 53 43 52 49 50 54 20 74 6f 20 65 76 61 6c 75 61  SCRIPT to evalua
9370: 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e  te the function.
9380: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
9390: 43 4f 4c 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44  COLLATION_NEEDED
93a0: 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  : {.    if( objc
93b0: 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=3 ){.      Tcl
93c0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
93d0: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
93e0: 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20  SCRIPT");.      
93f0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
9400: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
9410: 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65  pDb->pCollateNee
9420: 64 65 64 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  ded ){.      Tcl
9430: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44  _DecrRefCount(pD
9440: 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65  b->pCollateNeede
9450: 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44  d);.    }.    pD
9460: 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65  b->pCollateNeede
9470: 64 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  d = Tcl_Duplicat
9480: 65 4f 62 6a 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  eObj(objv[2]);. 
9490: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
94a0: 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74  unt(pDb->pCollat
94b0: 65 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 73 71  eNeeded);.    sq
94c0: 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  lite3_collation_
94d0: 6e 65 65 64 65 64 28 70 44 62 2d 3e 64 62 2c 20  needed(pDb->db, 
94e0: 70 44 62 2c 20 74 63 6c 43 6f 6c 6c 61 74 65 4e  pDb, tclCollateN
94f0: 65 65 64 65 64 29 3b 0a 20 20 20 20 62 72 65 61  eeded);.    brea
9500: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
9510: 24 64 62 20 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 20  $db commit_hook 
9520: 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a  ?CALLBACK?.  **.
9530: 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20    ** Invoke the 
9540: 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 6a  given callback j
9550: 75 73 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69  ust before commi
9560: 74 74 69 6e 67 20 65 76 65 72 79 20 53 51 4c 20  tting every SQL 
9570: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
9580: 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 62 61 63  * If the callbac
9590: 6b 20 74 68 72 6f 77 73 20 61 6e 20 65 78 63 65  k throws an exce
95a0: 70 74 69 6f 6e 20 6f 72 20 72 65 74 75 72 6e 73  ption or returns
95b0: 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
95c0: 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  the.  ** transac
95d0: 74 69 6f 6e 20 69 73 20 61 62 6f 72 74 65 64 2e  tion is aborted.
95e0: 20 20 49 66 20 43 41 4c 4c 42 41 43 4b 20 69 73    If CALLBACK is
95f0: 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67   an empty string
9600: 2c 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 0a 20  , the callback. 
9610: 20 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e   ** is disabled.
9620: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
9630: 43 4f 4d 4d 49 54 5f 48 4f 4f 4b 3a 20 7b 0a 20  COMMIT_HOOK: {. 
9640: 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b     if( objc>3 ){
9650: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
9660: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
9670: 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42  2, objv, "?CALLB
9680: 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65  ACK?");.      re
9690: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
96a0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62      }else if( ob
96b0: 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69  jc==2 ){.      i
96c0: 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20  f( pDb->zCommit 
96d0: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41  ){.        Tcl_A
96e0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
96f0: 72 70 2c 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74  rp, pDb->zCommit
9700: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
9710: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
9720: 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 0a 20 20  har *zCommit;.  
9730: 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
9740: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d     if( pDb->zCom
9750: 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 54  mit ){.        T
9760: 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 43 6f  cl_Free(pDb->zCo
9770: 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  mmit);.      }. 
9780: 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 54       zCommit = T
9790: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
97a0: 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65  Obj(objv[2], &le
97b0: 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 43  n);.      if( zC
97c0: 6f 6d 6d 69 74 20 26 26 20 6c 65 6e 3e 30 20 29  ommit && len>0 )
97d0: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
97e0: 43 6f 6d 6d 69 74 20 3d 20 54 63 6c 5f 41 6c 6c  Commit = Tcl_All
97f0: 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20  oc( len + 1 );. 
9800: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44         memcpy(pD
9810: 62 2d 3e 7a 43 6f 6d 6d 69 74 2c 20 7a 43 6f 6d  b->zCommit, zCom
9820: 6d 69 74 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20  mit, len+1);.   
9830: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9840: 20 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d    pDb->zCommit =
9850: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
9860: 20 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d    if( pDb->zComm
9870: 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  it ){.        pD
9880: 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65  b->interp = inte
9890: 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  rp;.        sqli
98a0: 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28  te3_commit_hook(
98b0: 70 44 62 2d 3e 64 62 2c 20 44 62 43 6f 6d 6d 69  pDb->db, DbCommi
98c0: 74 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a  tHandler, pDb);.
98d0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
98e0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d       sqlite3_com
98f0: 6d 69 74 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62  mit_hook(pDb->db
9900: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
9910: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
9920: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24  ;.  }..  /*    $
9930: 64 62 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c 0a  db complete SQL.
9940: 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e    **.  ** Return
9950: 20 54 52 55 45 20 69 66 20 53 51 4c 20 69 73 20   TRUE if SQL is 
9960: 61 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c 20 73  a complete SQL s
9970: 74 61 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72  tatement.  Retur
9980: 6e 20 46 41 4c 53 45 20 69 66 0a 20 20 2a 2a 20  n FALSE if.  ** 
9990: 61 64 64 69 74 69 6f 6e 61 6c 20 6c 69 6e 65 73  additional lines
99a0: 20 6f 66 20 69 6e 70 75 74 20 61 72 65 20 6e 65   of input are ne
99b0: 65 64 65 64 2e 20 20 54 68 69 73 20 69 73 20 73  eded.  This is s
99c0: 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 0a 20 20  imilar to the.  
99d0: 2a 2a 20 62 75 69 6c 74 2d 69 6e 20 22 69 6e 66  ** built-in "inf
99e0: 6f 20 63 6f 6d 70 6c 65 74 65 22 20 63 6f 6d 6d  o complete" comm
99f0: 61 6e 64 20 6f 66 20 54 63 6c 2e 0a 20 20 2a 2f  and of Tcl..  */
9a00: 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 4d 50 4c  .  case DB_COMPL
9a10: 45 54 45 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53  ETE: {.#ifndef S
9a20: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c  QLITE_OMIT_COMPL
9a30: 45 54 45 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  ETE.    Tcl_Obj 
9a40: 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 6e  *pResult;.    in
9a50: 74 20 69 73 43 6f 6d 70 6c 65 74 65 3b 0a 20 20  t isComplete;.  
9a60: 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
9a70: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
9a80: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
9a90: 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 22 29 3b  2, objv, "SQL");
9aa0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
9ab0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
9ac0: 20 20 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20     isComplete = 
9ad0: 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65  sqlite3_complete
9ae0: 28 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  ( Tcl_GetStringF
9af0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
9b00: 30 29 20 29 3b 0a 20 20 20 20 70 52 65 73 75 6c  0) );.    pResul
9b10: 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65  t = Tcl_GetObjRe
9b20: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
9b30: 20 20 54 63 6c 5f 53 65 74 42 6f 6f 6c 65 61 6e    Tcl_SetBoolean
9b40: 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 69 73 43  Obj(pResult, isC
9b50: 6f 6d 70 6c 65 74 65 29 3b 0a 23 65 6e 64 69 66  omplete);.#endif
9b60: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
9b70: 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6f 70  .  /*    $db cop
9b80: 79 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72  y conflict-algor
9b90: 69 74 68 6d 20 74 61 62 6c 65 20 66 69 6c 65 6e  ithm table filen
9ba0: 61 6d 65 20 3f 53 45 50 41 52 41 54 4f 52 3f 20  ame ?SEPARATOR? 
9bb0: 3f 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f 0a  ?NULLINDICATOR?.
9bc0: 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 70 79 20 64    **.  ** Copy d
9bd0: 61 74 61 20 69 6e 74 6f 20 74 61 62 6c 65 20 66  ata into table f
9be0: 72 6f 6d 20 66 69 6c 65 6e 61 6d 65 2c 20 6f 70  rom filename, op
9bf0: 74 69 6f 6e 61 6c 6c 79 20 75 73 69 6e 67 20 53  tionally using S
9c00: 45 50 41 52 41 54 4f 52 0a 20 20 2a 2a 20 61 73  EPARATOR.  ** as
9c10: 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f   column separato
9c20: 72 73 2e 20 20 49 66 20 61 20 63 6f 6c 75 6d 6e  rs.  If a column
9c30: 20 63 6f 6e 74 61 69 6e 73 20 61 20 6e 75 6c 6c   contains a null
9c40: 20 73 74 72 69 6e 67 2c 20 6f 72 20 74 68 65 0a   string, or the.
9c50: 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 4e 55    ** value of NU
9c60: 4c 4c 49 4e 44 49 43 41 54 4f 52 2c 20 61 20 4e  LLINDICATOR, a N
9c70: 55 4c 4c 20 69 73 20 69 6e 73 65 72 74 65 64 20  ULL is inserted 
9c80: 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a  for the column..
9c90: 20 20 2a 2a 20 63 6f 6e 66 6c 69 63 74 2d 61 6c    ** conflict-al
9ca0: 67 6f 72 69 74 68 6d 20 69 73 20 6f 6e 65 20 6f  gorithm is one o
9cb0: 66 20 74 68 65 20 73 71 6c 69 74 65 20 63 6f 6e  f the sqlite con
9cc0: 66 6c 69 63 74 20 61 6c 67 6f 72 69 74 68 6d 73  flict algorithms
9cd0: 3a 0a 20 20 2a 2a 20 20 20 20 72 6f 6c 6c 62 61  :.  **    rollba
9ce0: 63 6b 2c 20 61 62 6f 72 74 2c 20 66 61 69 6c 2c  ck, abort, fail,
9cf0: 20 69 67 6e 6f 72 65 2c 20 72 65 70 6c 61 63 65   ignore, replace
9d00: 0a 20 20 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73  .  ** On success
9d10: 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  , return the num
9d20: 62 65 72 20 6f 66 20 6c 69 6e 65 73 20 70 72 6f  ber of lines pro
9d30: 63 65 73 73 65 64 2c 20 6e 6f 74 20 6e 65 63 65  cessed, not nece
9d40: 73 73 61 72 69 6c 79 20 73 61 6d 65 0a 20 20 2a  ssarily same.  *
9d50: 2a 20 61 73 20 27 64 62 20 63 68 61 6e 67 65 73  * as 'db changes
9d60: 27 20 64 75 65 20 74 6f 20 63 6f 6e 66 6c 69 63  ' due to conflic
9d70: 74 2d 61 6c 67 6f 72 69 74 68 6d 20 73 65 6c 65  t-algorithm sele
9d80: 63 74 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  cted..  **.  ** 
9d90: 54 68 69 73 20 63 6f 64 65 20 69 73 20 62 61 73  This code is bas
9da0: 69 63 61 6c 6c 79 20 61 6e 20 69 6d 70 6c 65 6d  ically an implem
9db0: 65 6e 74 61 74 69 6f 6e 2f 65 6e 68 61 6e 63 65  entation/enhance
9dc0: 6d 65 6e 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65  ment of.  ** the
9dd0: 20 73 71 6c 69 74 65 33 20 73 68 65 6c 6c 2e 63   sqlite3 shell.c
9de0: 20 22 2e 69 6d 70 6f 72 74 22 20 63 6f 6d 6d 61   ".import" comma
9df0: 6e 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  nd..  **.  ** Th
9e00: 69 73 20 63 6f 6d 6d 61 6e 64 20 75 73 61 67 65  is command usage
9e10: 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
9e20: 6f 20 74 68 65 20 73 71 6c 69 74 65 32 2e 78 20  o the sqlite2.x 
9e30: 43 4f 50 59 20 73 74 61 74 65 6d 65 6e 74 2c 0a  COPY statement,.
9e40: 20 20 2a 2a 20 77 68 69 63 68 20 69 6d 70 6f 72    ** which impor
9e50: 74 73 20 66 69 6c 65 20 64 61 74 61 20 69 6e 74  ts file data int
9e60: 6f 20 61 20 74 61 62 6c 65 20 75 73 69 6e 67 20  o a table using 
9e70: 74 68 65 20 50 6f 73 74 67 72 65 53 51 4c 20 43  the PostgreSQL C
9e80: 4f 50 59 20 66 69 6c 65 20 66 6f 72 6d 61 74 3a  OPY file format:
9e90: 0a 20 20 2a 2a 20 20 20 24 64 62 20 63 6f 70 79  .  **   $db copy
9ea0: 20 24 63 6f 6e 66 6c 69 74 5f 61 6c 67 6f 20 24   $conflit_algo $
9eb0: 74 61 62 6c 65 5f 6e 61 6d 65 20 24 66 69 6c 65  table_name $file
9ec0: 6e 61 6d 65 20 5c 74 20 5c 5c 4e 0a 20 20 2a 2f  name \t \\N.  */
9ed0: 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 50 59 3a  .  case DB_COPY:
9ee0: 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 61   {.    char *zTa
9ef0: 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ble;            
9f00: 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61 74     /* Insert dat
9f10: 61 20 69 6e 74 6f 20 74 68 69 73 20 74 61 62 6c  a into this tabl
9f20: 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  e */.    char *z
9f30: 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  File;           
9f40: 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65       /* The file
9f50: 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 65   from which to e
9f60: 78 74 72 61 63 74 20 64 61 74 61 20 2a 2f 0a 20  xtract data */. 
9f70: 20 20 20 63 68 61 72 20 2a 7a 43 6f 6e 66 6c 69     char *zConfli
9f80: 63 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ct;            /
9f90: 2a 20 54 68 65 20 63 6f 6e 66 6c 69 63 74 20 61  * The conflict a
9fa0: 6c 67 6f 72 69 74 68 6d 20 74 6f 20 75 73 65 20  lgorithm to use 
9fb0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  */.    sqlite3_s
9fc0: 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20  tmt *pStmt;     
9fd0: 20 20 20 2f 2a 20 41 20 73 74 61 74 65 6d 65 6e     /* A statemen
9fe0: 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f  t */.    int nCo
9ff0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
a000: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
a010: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
a020: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e   table */.    in
a030: 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20  t nByte;        
a040: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
a050: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
a060: 61 6e 20 53 51 4c 20 73 74 72 69 6e 67 20 2a 2f  an SQL string */
a070: 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  .    int i, j;  
a080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a090: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
a0a0: 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65  s */.    int nSe
a0b0: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
a0c0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
a0d0: 66 20 62 79 74 65 73 20 69 6e 20 7a 53 65 70 5b  f bytes in zSep[
a0e0: 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4e 75  ] */.    int nNu
a0f0: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
a100: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
a110: 66 20 62 79 74 65 73 20 69 6e 20 7a 4e 75 6c 6c  f bytes in zNull
a120: 5b 5d 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  [] */.    char *
a130: 7a 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20  zSql;           
a140: 20 20 20 20 20 20 2f 2a 20 41 6e 20 53 51 4c 20        /* An SQL 
a150: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
a160: 20 63 68 61 72 20 2a 7a 4c 69 6e 65 3b 20 20 20   char *zLine;   
a170: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a180: 41 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f 66  A single line of
a190: 20 69 6e 70 75 74 20 66 72 6f 6d 20 74 68 65 20   input from the 
a1a0: 66 69 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72  file */.    char
a1b0: 20 2a 2a 61 7a 43 6f 6c 3b 20 20 20 20 20 20 20   **azCol;       
a1c0: 20 20 20 20 20 20 20 20 2f 2a 20 7a 4c 69 6e 65          /* zLine
a1d0: 5b 5d 20 62 72 6f 6b 65 6e 20 75 70 20 69 6e 74  [] broken up int
a1e0: 6f 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20  o columns */.   
a1f0: 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 20   char *zCommit; 
a200: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a210: 48 6f 77 20 74 6f 20 63 6f 6d 6d 69 74 20 63 68  How to commit ch
a220: 61 6e 67 65 73 20 2a 2f 0a 20 20 20 20 46 49 4c  anges */.    FIL
a230: 45 20 2a 69 6e 3b 20 20 20 20 20 20 20 20 20 20  E *in;          
a240: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
a250: 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20  input file */.  
a260: 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20 30    int lineno = 0
a270: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
a280: 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20   Line number of 
a290: 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20  input file */.  
a2a0: 20 20 63 68 61 72 20 7a 4c 69 6e 65 4e 75 6d 5b    char zLineNum[
a2b0: 38 30 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  80];          /*
a2c0: 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 70 72 69   Line number pri
a2d0: 6e 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20  nt buffer */.   
a2e0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c   Tcl_Obj *pResul
a2f0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
a300: 69 6e 74 65 72 70 20 72 65 73 75 6c 74 20 2a 2f  interp result */
a310: 0a 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 65 70  ..    char *zSep
a320: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 75 6c  ;.    char *zNul
a330: 6c 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3c  l;.    if( objc<
a340: 35 20 7c 7c 20 6f 62 6a 63 3e 37 20 29 7b 0a 20  5 || objc>7 ){. 
a350: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
a360: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
a370: 20 6f 62 6a 76 2c 20 0a 20 20 20 20 20 20 20 20   objv, .        
a380: 20 22 43 4f 4e 46 4c 49 43 54 2d 41 4c 47 4f 52   "CONFLICT-ALGOR
a390: 49 54 48 4d 20 54 41 42 4c 45 20 46 49 4c 45 4e  ITHM TABLE FILEN
a3a0: 41 4d 45 20 3f 53 45 50 41 52 41 54 4f 52 3f 20  AME ?SEPARATOR? 
a3b0: 3f 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f 22  ?NULLINDICATOR?"
a3c0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
a3d0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
a3e0: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 3d 36  .    if( objc>=6
a3f0: 20 29 7b 0a 20 20 20 20 20 20 7a 53 65 70 20 3d   ){.      zSep =
a400: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
a410: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 35 5d 2c 20 30  omObj(objv[5], 0
a420: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
a430: 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 74 22 3b      zSep = "\t";
a440: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f  .    }.    if( o
a450: 62 6a 63 3e 3d 37 20 29 7b 0a 20 20 20 20 20 20  bjc>=7 ){.      
a460: 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 47 65 74 53  zNull = Tcl_GetS
a470: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
a480: 76 5b 36 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 65  v[6], 0);.    }e
a490: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4e 75 6c 6c  lse{.      zNull
a4a0: 20 3d 20 22 22 3b 0a 20 20 20 20 7d 0a 20 20 20   = "";.    }.   
a4b0: 20 7a 43 6f 6e 66 6c 69 63 74 20 3d 20 54 63 6c   zConflict = Tcl
a4c0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
a4d0: 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20  j(objv[2], 0);. 
a4e0: 20 20 20 7a 54 61 62 6c 65 20 3d 20 54 63 6c 5f     zTable = Tcl_
a4f0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
a500: 28 6f 62 6a 76 5b 33 5d 2c 20 30 29 3b 0a 20 20  (objv[3], 0);.  
a510: 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65    zFile = Tcl_Ge
a520: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
a530: 62 6a 76 5b 34 5d 2c 20 30 29 3b 0a 20 20 20 20  bjv[4], 0);.    
a540: 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e 28 7a 53  nSep = strlen(zS
a550: 65 70 29 3b 0a 20 20 20 20 6e 4e 75 6c 6c 20 3d  ep);.    nNull =
a560: 20 73 74 72 6c 65 6e 28 7a 4e 75 6c 6c 29 3b 0a   strlen(zNull);.
a570: 20 20 20 20 69 66 28 20 6e 53 65 70 3d 3d 30 20      if( nSep==0 
a580: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
a590: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
a5a0: 2c 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c  ,"Error: non-nul
a5b0: 6c 20 73 65 70 61 72 61 74 6f 72 20 72 65 71 75  l separator requ
a5c0: 69 72 65 64 20 66 6f 72 20 63 6f 70 79 22 2c 30  ired for copy",0
a5d0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
a5e0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
a5f0: 0a 20 20 20 20 69 66 28 73 74 72 63 61 73 65 63  .    if(strcasec
a600: 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 72  mp(zConflict, "r
a610: 6f 6c 6c 62 61 63 6b 22 29 20 21 3d 20 30 20 26  ollback") != 0 &
a620: 26 0a 20 20 20 20 20 20 20 73 74 72 63 61 73 65  &.       strcase
a630: 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22  cmp(zConflict, "
a640: 61 62 6f 72 74 22 20 20 20 29 20 21 3d 20 30 20  abort"   ) != 0 
a650: 26 26 0a 20 20 20 20 20 20 20 73 74 72 63 61 73  &&.       strcas
a660: 65 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20  ecmp(zConflict, 
a670: 22 66 61 69 6c 22 20 20 20 20 29 20 21 3d 20 30  "fail"    ) != 0
a680: 20 26 26 0a 20 20 20 20 20 20 20 73 74 72 63 61   &&.       strca
a690: 73 65 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c  secmp(zConflict,
a6a0: 20 22 69 67 6e 6f 72 65 22 20 20 29 20 21 3d 20   "ignore"  ) != 
a6b0: 30 20 26 26 0a 20 20 20 20 20 20 20 73 74 72 63  0 &&.       strc
a6c0: 61 73 65 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74  asecmp(zConflict
a6d0: 2c 20 22 72 65 70 6c 61 63 65 22 20 29 20 21 3d  , "replace" ) !=
a6e0: 20 30 20 29 20 7b 0a 20 20 20 20 20 20 54 63 6c   0 ) {.      Tcl
a6f0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
a700: 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 5c 22  terp, "Error: \"
a710: 22 2c 20 7a 43 6f 6e 66 6c 69 63 74 2c 20 0a 20  ", zConflict, . 
a720: 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20             "\", 
a730: 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74  conflict-algorit
a740: 68 6d 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f  hm must be one o
a750: 66 3a 20 72 6f 6c 6c 62 61 63 6b 2c 20 22 0a 20  f: rollback, ". 
a760: 20 20 20 20 20 20 20 20 20 20 20 22 61 62 6f 72             "abor
a770: 74 2c 20 66 61 69 6c 2c 20 69 67 6e 6f 72 65 2c  t, fail, ignore,
a780: 20 6f 72 20 72 65 70 6c 61 63 65 22 2c 20 30 29   or replace", 0)
a790: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
a7a0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
a7b0: 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
a7c0: 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45  e3_mprintf("SELE
a7d0: 43 54 20 2a 20 46 52 4f 4d 20 27 25 71 27 22 2c  CT * FROM '%q'",
a7e0: 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 69 66   zTable);.    if
a7f0: 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20  ( zSql==0 ){.   
a800: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
a810: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72  ult(interp, "Err
a820: 6f 72 3a 20 6e 6f 20 73 75 63 68 20 74 61 62 6c  or: no such tabl
a830: 65 3a 20 22 2c 20 7a 54 61 62 6c 65 2c 20 30 29  e: ", zTable, 0)
a840: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
a850: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
a860: 20 20 20 20 6e 42 79 74 65 20 3d 20 73 74 72 6c      nByte = strl
a870: 65 6e 28 7a 53 71 6c 29 3b 0a 20 20 20 20 72 63  en(zSql);.    rc
a880: 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
a890: 72 65 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c  re(pDb->db, zSql
a8a0: 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
a8b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
a8c0: 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66  ee(zSql);.    if
a8d0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63  ( rc ){.      Tc
a8e0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
a8f0: 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 22  nterp, "Error: "
a900: 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
a910: 28 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20  (pDb->db), 0);. 
a920: 20 20 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20       nCol = 0;. 
a930: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a940: 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63  nCol = sqlite3_c
a950: 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d  olumn_count(pStm
a960: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  t);.    }.    sq
a970: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
a980: 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 6e  Stmt);.    if( n
a990: 43 6f 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20  Col==0 ) {.     
a9a0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
a9b0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71  R;.    }.    zSq
a9c0: 6c 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79 74  l = malloc( nByt
a9d0: 65 20 2b 20 35 30 20 2b 20 6e 43 6f 6c 2a 32 20  e + 50 + nCol*2 
a9e0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d  );.    if( zSql=
a9f0: 3d 30 20 29 20 7b 0a 20 20 20 20 20 20 54 63 6c  =0 ) {.      Tcl
aa00: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
aa10: 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 63 61  terp, "Error: ca
aa20: 6e 27 74 20 6d 61 6c 6c 6f 63 28 29 22 2c 20 30  n't malloc()", 0
aa30: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
aa40: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
aa50: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
aa60: 72 69 6e 74 66 28 6e 42 79 74 65 2b 35 30 2c 20  rintf(nByte+50, 
aa70: 7a 53 71 6c 2c 20 22 49 4e 53 45 52 54 20 4f 52  zSql, "INSERT OR
aa80: 20 25 71 20 49 4e 54 4f 20 27 25 71 27 20 56 41   %q INTO '%q' VA
aa90: 4c 55 45 53 28 3f 22 2c 0a 20 20 20 20 20 20 20  LUES(?",.       
aaa0: 20 20 7a 43 6f 6e 66 6c 69 63 74 2c 20 7a 54 61    zConflict, zTa
aab0: 62 6c 65 29 3b 0a 20 20 20 20 6a 20 3d 20 73 74  ble);.    j = st
aac0: 72 6c 65 6e 28 7a 53 71 6c 29 3b 0a 20 20 20 20  rlen(zSql);.    
aad0: 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 43 6f 6c 3b  for(i=1; i<nCol;
aae0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 53 71   i++){.      zSq
aaf0: 6c 5b 6a 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20  l[j++] = ',';.  
ab00: 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20      zSql[j++] = 
ab10: 27 3f 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  '?';.    }.    z
ab20: 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 29 27 3b 0a  Sql[j++] = ')';.
ab30: 20 20 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20 30 3b      zSql[j] = 0;
ab40: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
ab50: 33 5f 70 72 65 70 61 72 65 28 70 44 62 2d 3e 64  3_prepare(pDb->d
ab60: 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
ab70: 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 66 72 65  tmt, 0);.    fre
ab80: 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28  e(zSql);.    if(
ab90: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c   rc ){.      Tcl
aba0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
abb0: 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 22 2c  terp, "Error: ",
abc0: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
abd0: 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20  pDb->db), 0);.  
abe0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
abf0: 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
ac00: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
ac10: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
ac20: 6e 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c  n = fopen(zFile,
ac30: 20 22 72 62 22 29 3b 0a 20 20 20 20 69 66 28 20   "rb");.    if( 
ac40: 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54  in==0 ){.      T
ac50: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
ac60: 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20  interp, "Error: 
ac70: 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65  cannot open file
ac80: 3a 20 22 2c 20 7a 46 69 6c 65 2c 20 4e 55 4c 4c  : ", zFile, NULL
ac90: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
aca0: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
acb0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
acc0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
acd0: 20 20 20 20 61 7a 43 6f 6c 20 3d 20 6d 61 6c 6c      azCol = mall
ace0: 6f 63 28 20 73 69 7a 65 6f 66 28 61 7a 43 6f 6c  oc( sizeof(azCol
acf0: 5b 30 5d 29 2a 28 6e 43 6f 6c 2b 31 29 20 29 3b  [0])*(nCol+1) );
ad00: 0a 20 20 20 20 69 66 28 20 61 7a 43 6f 6c 3d 3d  .    if( azCol==
ad10: 30 20 29 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f  0 ) {.      Tcl_
ad20: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
ad30: 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e  erp, "Error: can
ad40: 27 74 20 6d 61 6c 6c 6f 63 28 29 22 2c 20 30 29  't malloc()", 0)
ad50: 3b 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28 69  ;.      fclose(i
ad60: 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  n);.      return
ad70: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
ad80: 7d 0a 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69  }.    (void)sqli
ad90: 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62  te3_exec(pDb->db
ada0: 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 2c  , "BEGIN", 0, 0,
adb0: 20 30 29 3b 0a 20 20 20 20 7a 43 6f 6d 6d 69 74   0);.    zCommit
adc0: 20 3d 20 22 43 4f 4d 4d 49 54 22 3b 0a 20 20 20   = "COMMIT";.   
add0: 20 77 68 69 6c 65 28 20 28 7a 4c 69 6e 65 20 3d   while( (zLine =
ade0: 20 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 30   local_getline(0
adf0: 2c 20 69 6e 29 29 21 3d 30 20 29 7b 0a 20 20 20  , in))!=0 ){.   
ae00: 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20     char *z;.    
ae10: 20 20 69 20 3d 20 30 3b 0a 20 20 20 20 20 20 6c    i = 0;.      l
ae20: 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 61  ineno++;.      a
ae30: 7a 43 6f 6c 5b 30 5d 20 3d 20 7a 4c 69 6e 65 3b  zCol[0] = zLine;
ae40: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  .      for(i=0, 
ae50: 7a 3d 7a 4c 69 6e 65 3b 20 2a 7a 3b 20 7a 2b 2b  z=zLine; *z; z++
ae60: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a  ){.        if( *
ae70: 7a 3d 3d 7a 53 65 70 5b 30 5d 20 26 26 20 73 74  z==zSep[0] && st
ae80: 72 6e 63 6d 70 28 7a 2c 20 7a 53 65 70 2c 20 6e  rncmp(z, zSep, n
ae90: 53 65 70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Sep)==0 ){.     
aea0: 20 20 20 20 20 2a 7a 20 3d 20 30 3b 0a 20 20 20       *z = 0;.   
aeb0: 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20         i++;.    
aec0: 20 20 20 20 20 20 69 66 28 20 69 3c 6e 43 6f 6c        if( i<nCol
aed0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
aee0: 61 7a 43 6f 6c 5b 69 5d 20 3d 20 26 7a 5b 6e 53  azCol[i] = &z[nS
aef0: 65 70 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ep];.           
af00: 20 7a 20 2b 3d 20 6e 53 65 70 2d 31 3b 0a 20 20   z += nSep-1;.  
af10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
af20: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
af30: 20 20 69 66 28 20 69 2b 31 21 3d 6e 43 6f 6c 20    if( i+1!=nCol 
af40: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
af50: 2a 7a 45 72 72 3b 0a 20 20 20 20 20 20 20 20 69  *zErr;.        i
af60: 6e 74 20 6e 45 72 72 20 3d 20 73 74 72 6c 65 6e  nt nErr = strlen
af70: 28 7a 46 69 6c 65 29 20 2b 20 32 30 30 3b 0a 20  (zFile) + 200;. 
af80: 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20 6d 61         zErr = ma
af90: 6c 6c 6f 63 28 6e 45 72 72 29 3b 0a 20 20 20 20  lloc(nErr);.    
afa0: 20 20 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a      if( zErr ){.
afb0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
afc0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 45 72 72 2c  3_snprintf(nErr,
afd0: 20 7a 45 72 72 2c 0a 20 20 20 20 20 20 20 20 20   zErr,.         
afe0: 20 20 20 20 22 45 72 72 6f 72 3a 20 25 73 20 6c      "Error: %s l
aff0: 69 6e 65 20 25 64 3a 20 65 78 70 65 63 74 65 64  ine %d: expected
b000: 20 25 64 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64   %d columns of d
b010: 61 74 61 20 62 75 74 20 66 6f 75 6e 64 20 25 64  ata but found %d
b020: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
b030: 7a 46 69 6c 65 2c 20 6c 69 6e 65 6e 6f 2c 20 6e  zFile, lineno, n
b040: 43 6f 6c 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20  Col, i+1);.     
b050: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
b060: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45  esult(interp, zE
b070: 72 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  rr, 0);.        
b080: 20 20 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20    free(zErr);.  
b090: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
b0a0: 7a 43 6f 6d 6d 69 74 20 3d 20 22 52 4f 4c 4c 42  zCommit = "ROLLB
b0b0: 41 43 4b 22 3b 0a 20 20 20 20 20 20 20 20 62 72  ACK";.        br
b0c0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
b0d0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
b0e0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
b0f0: 20 20 2f 2a 20 63 68 65 63 6b 20 66 6f 72 20 6e    /* check for n
b100: 75 6c 6c 20 64 61 74 61 2c 20 69 66 20 73 6f 2c  ull data, if so,
b110: 20 62 69 6e 64 20 61 73 20 6e 75 6c 6c 20 2a 2f   bind as null */
b120: 0a 20 20 20 20 20 20 20 20 69 66 20 28 28 6e 4e  .        if ((nN
b130: 75 6c 6c 3e 30 20 26 26 20 73 74 72 63 6d 70 28  ull>0 && strcmp(
b140: 61 7a 43 6f 6c 5b 69 5d 2c 20 7a 4e 75 6c 6c 29  azCol[i], zNull)
b150: 3d 3d 30 29 20 7c 7c 20 73 74 72 6c 65 6e 28 61  ==0) || strlen(a
b160: 7a 43 6f 6c 5b 69 5d 29 3d 3d 30 29 20 7b 0a 20  zCol[i])==0) {. 
b170: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
b180: 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74  _bind_null(pStmt
b190: 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  , i+1);.        
b1a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
b1b0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
b1c0: 78 74 28 70 53 74 6d 74 2c 20 69 2b 31 2c 20 61  xt(pStmt, i+1, a
b1d0: 7a 43 6f 6c 5b 69 5d 2c 20 2d 31 2c 20 53 51 4c  zCol[i], -1, SQL
b1e0: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
b1f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
b200: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65       sqlite3_ste
b210: 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  p(pStmt);.      
b220: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
b230: 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  et(pStmt);.     
b240: 20 66 72 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20   free(zLine);.  
b250: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
b260: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
b270: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
b280: 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 3a  t(interp,"Error:
b290: 20 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d   ", sqlite3_errm
b2a0: 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b  sg(pDb->db), 0);
b2b0: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74  .        zCommit
b2c0: 20 3d 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20   = "ROLLBACK";. 
b2d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b2e0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
b2f0: 66 72 65 65 28 61 7a 43 6f 6c 29 3b 0a 20 20 20  free(azCol);.   
b300: 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20   fclose(in);.   
b310: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
b320: 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 28 76  e(pStmt);.    (v
b330: 6f 69 64 29 73 71 6c 69 74 65 33 5f 65 78 65 63  oid)sqlite3_exec
b340: 28 70 44 62 2d 3e 64 62 2c 20 7a 43 6f 6d 6d 69  (pDb->db, zCommi
b350: 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 0a 20 20  t, 0, 0, 0);..  
b360: 20 20 69 66 28 20 7a 43 6f 6d 6d 69 74 5b 30 5d    if( zCommit[0]
b370: 20 3d 3d 20 27 43 27 20 29 7b 0a 20 20 20 20 20   == 'C' ){.     
b380: 20 2f 2a 20 73 75 63 63 65 73 73 2c 20 73 65 74   /* success, set
b390: 20 72 65 73 75 6c 74 20 61 73 20 6e 75 6d 62 65   result as numbe
b3a0: 72 20 6f 66 20 6c 69 6e 65 73 20 70 72 6f 63 65  r of lines proce
b3b0: 73 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 70 52  ssed */.      pR
b3c0: 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f  esult = Tcl_GetO
b3d0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  bjResult(interp)
b3e0: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 49  ;.      Tcl_SetI
b3f0: 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 6c  ntObj(pResult, l
b400: 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63  ineno);.      rc
b410: 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d   = TCL_OK;.    }
b420: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 66  else{.      /* f
b430: 61 69 6c 75 72 65 2c 20 61 70 70 65 6e 64 20 6c  ailure, append l
b440: 69 6e 65 6e 6f 20 77 68 65 72 65 20 66 61 69 6c  ineno where fail
b450: 65 64 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ed */.      sqli
b460: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
b470: 65 6f 66 28 7a 4c 69 6e 65 4e 75 6d 29 2c 20 7a  eof(zLineNum), z
b480: 4c 69 6e 65 4e 75 6d 2c 22 25 64 22 2c 6c 69 6e  LineNum,"%d",lin
b490: 65 6e 6f 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f  eno);.      Tcl_
b4a0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
b4b0: 65 72 70 2c 22 2c 20 66 61 69 6c 65 64 20 77 68  erp,", failed wh
b4c0: 69 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6c  ile processing l
b4d0: 69 6e 65 3a 20 22 2c 7a 4c 69 6e 65 4e 75 6d 2c  ine: ",zLineNum,
b4e0: 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54  0);.      rc = T
b4f0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
b500: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
b510: 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62    /*.  **    $db
b520: 20 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74   enable_load_ext
b530: 65 6e 73 69 6f 6e 20 42 4f 4f 4c 45 41 4e 0a 20  ension BOOLEAN. 
b540: 20 2a 2a 0a 20 20 2a 2a 20 54 75 72 6e 20 74 68   **.  ** Turn th
b550: 65 20 65 78 74 65 6e 73 69 6f 6e 20 6c 6f 61 64  e extension load
b560: 69 6e 67 20 66 65 61 74 75 72 65 20 6f 6e 20 6f  ing feature on o
b570: 72 20 6f 66 66 2e 20 20 49 74 20 69 66 20 6f 66  r off.  It if of
b580: 66 20 62 79 0a 20 20 2a 2a 20 64 65 66 61 75 6c  f by.  ** defaul
b590: 74 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  t..  */.  case D
b5a0: 42 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58  B_ENABLE_LOAD_EX
b5b0: 54 45 4e 53 49 4f 4e 3a 20 7b 0a 23 69 66 6e 64  TENSION: {.#ifnd
b5c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ef SQLITE_OMIT_L
b5d0: 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20  OAD_EXTENSION.  
b5e0: 20 20 69 6e 74 20 6f 6e 6f 66 66 3b 0a 20 20 20    int onoff;.   
b5f0: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
b600: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
b610: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
b620: 2c 20 6f 62 6a 76 2c 20 22 42 4f 4f 4c 45 41 4e  , objv, "BOOLEAN
b630: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
b640: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
b650: 7d 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65  }.    if( Tcl_Ge
b660: 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
b670: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
b680: 20 26 6f 6e 6f 66 66 29 20 29 7b 0a 20 20 20 20   &onoff) ){.    
b690: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
b6a0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  OR;.    }.    sq
b6b0: 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61  lite3_enable_loa
b6c0: 64 5f 65 78 74 65 6e 73 69 6f 6e 28 70 44 62 2d  d_extension(pDb-
b6d0: 3e 64 62 2c 20 6f 6e 6f 66 66 29 3b 0a 20 20 20  >db, onoff);.   
b6e0: 20 62 72 65 61 6b 3b 0a 23 65 6c 73 65 0a 20 20   break;.#else.  
b6f0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
b700: 6c 74 28 69 6e 74 65 72 70 2c 20 22 65 78 74 65  lt(interp, "exte
b710: 6e 73 69 6f 6e 20 6c 6f 61 64 69 6e 67 20 69 73  nsion loading is
b720: 20 74 75 72 6e 65 64 20 6f 66 66 20 61 74 20 63   turned off at c
b730: 6f 6d 70 69 6c 65 2d 74 69 6d 65 22 2c 0a 20 20  ompile-time",.  
b740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b750: 20 20 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72     0);.    retur
b760: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6e  n TCL_ERROR;.#en
b770: 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  dif.  }..  /*.  
b780: 2a 2a 20 20 20 20 24 64 62 20 65 72 72 6f 72 63  **    $db errorc
b790: 6f 64 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  ode.  **.  ** Re
b7a0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 65 72 69 63  turn the numeric
b7b0: 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74   error code that
b7c0: 20 77 61 73 20 72 65 74 75 72 6e 65 64 20 62 79   was returned by
b7d0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
b7e0: 0a 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71  .  ** call to sq
b7f0: 6c 69 74 65 33 5f 65 78 65 63 28 29 2e 0a 20 20  lite3_exec()..  
b800: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 45 52 52  */.  case DB_ERR
b810: 4f 52 43 4f 44 45 3a 20 7b 0a 20 20 20 20 54 63  ORCODE: {.    Tc
b820: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
b830: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
b840: 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 72 72  tObj(sqlite3_err
b850: 63 6f 64 65 28 70 44 62 2d 3e 64 62 29 29 29 3b  code(pDb->db)));
b860: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
b870: 20 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20     .  /*.  **   
b880: 20 24 64 62 20 65 76 61 6c 20 24 73 71 6c 20 3f   $db eval $sql ?
b890: 61 72 72 61 79 3f 20 3f 7b 20 20 2e 2e 2e 63 6f  array? ?{  ...co
b8a0: 64 65 2e 2e 2e 20 7d 3f 0a 20 20 2a 2a 20 20 20  de... }?.  **   
b8b0: 20 24 64 62 20 6f 6e 65 63 6f 6c 75 6d 6e 20 24   $db onecolumn $
b8c0: 73 71 6c 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  sql.  **.  ** Th
b8d0: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
b8e0: 69 6e 20 24 73 71 6c 20 69 73 20 65 76 61 6c 75  in $sql is evalu
b8f0: 61 74 65 64 2e 20 20 46 6f 72 20 65 61 63 68 20  ated.  For each 
b900: 72 6f 77 2c 20 74 68 65 20 76 61 6c 75 65 73 20  row, the values 
b910: 61 72 65 0a 20 20 2a 2a 20 70 6c 61 63 65 64 20  are.  ** placed 
b920: 69 6e 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74  in elements of t
b930: 68 65 20 61 72 72 61 79 20 6e 61 6d 65 64 20 22  he array named "
b940: 61 72 72 61 79 22 20 61 6e 64 20 2e 2e 2e 63 6f  array" and ...co
b950: 64 65 2e 2e 2e 20 69 73 20 65 78 65 63 75 74 65  de... is execute
b960: 64 2e 0a 20 20 2a 2a 20 49 66 20 22 61 72 72 61  d..  ** If "arra
b970: 79 22 20 61 6e 64 20 22 63 6f 64 65 22 20 61 72  y" and "code" ar
b980: 65 20 6f 6d 69 74 74 65 64 2c 20 74 68 65 6e 20  e omitted, then 
b990: 6e 6f 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 65  no callback is e
b9a0: 76 65 72 79 20 69 6e 76 6f 6b 65 64 2e 0a 20 20  very invoked..  
b9b0: 2a 2a 20 49 66 20 22 61 72 72 61 79 22 20 69 73  ** If "array" is
b9c0: 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67   an empty string
b9d0: 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
b9e0: 73 20 61 72 65 20 70 6c 61 63 65 64 20 69 6e 20  s are placed in 
b9f0: 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 74  variables.  ** t
ba00: 68 61 74 20 68 61 76 65 20 74 68 65 20 73 61 6d  hat have the sam
ba10: 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 66 69  e name as the fi
ba20: 65 6c 64 73 20 65 78 74 72 61 63 74 65 64 20 62  elds extracted b
ba30: 79 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a  y the query..  *
ba40: 2a 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65 63 6f  *.  ** The oneco
ba50: 6c 75 6d 6e 20 6d 65 74 68 6f 64 20 69 73 20 74  lumn method is t
ba60: 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6f 66  he equivalent of
ba70: 3a 0a 20 20 2a 2a 20 20 20 20 20 6c 69 6e 64 65  :.  **     linde
ba80: 78 20 5b 24 64 62 20 65 76 61 6c 20 24 73 71 6c  x [$db eval $sql
ba90: 5d 20 30 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ] 0.  */.  case 
baa0: 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 3a 0a 20 20  DB_ONECOLUMN:.  
bab0: 63 61 73 65 20 44 42 5f 45 56 41 4c 3a 0a 20 20  case DB_EVAL:.  
bac0: 63 61 73 65 20 44 42 5f 45 58 49 53 54 53 3a 20  case DB_EXISTS: 
bad0: 7b 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74  {.    char const
bae0: 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 2f 2a 20   *zSql;      /* 
baf0: 4e 65 78 74 20 53 51 4c 20 73 74 61 74 65 6d 65  Next SQL stateme
bb00: 6e 74 20 74 6f 20 65 78 65 63 75 74 65 20 2a 2f  nt to execute */
bb10: 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20  .    char const 
bb20: 2a 7a 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 57  *zLeft;     /* W
bb30: 68 61 74 20 69 73 20 6c 65 66 74 20 61 66 74 65  hat is left afte
bb40: 72 20 66 69 72 73 74 20 73 74 6d 74 20 69 6e 20  r first stmt in 
bb50: 7a 53 71 6c 20 2a 2f 0a 20 20 20 20 73 71 6c 69  zSql */.    sqli
bb60: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
bb70: 20 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 64 20 53     /* Compiled S
bb80: 51 4c 20 73 74 61 74 6d 65 6e 74 20 2a 2f 0a 20  QL statment */. 
bb90: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 72     Tcl_Obj *pArr
bba0: 61 79 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  ay;       /* Nam
bbb0: 65 20 6f 66 20 61 72 72 61 79 20 69 6e 74 6f 20  e of array into 
bbc0: 77 68 69 63 68 20 72 65 73 75 6c 74 73 20 61 72  which results ar
bbd0: 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20  e written */.   
bbe0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70   Tcl_Obj *pScrip
bbf0: 74 3b 20 20 20 20 20 20 2f 2a 20 53 63 72 69 70  t;      /* Scrip
bc00: 74 20 74 6f 20 72 75 6e 20 66 6f 72 20 65 61 63  t to run for eac
bc10: 68 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  h result set */.
bc20: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70      Tcl_Obj **ap
bc30: 50 61 72 6d 3b 20 20 20 20 20 20 2f 2a 20 50 61  Parm;      /* Pa
bc40: 72 61 6d 65 74 65 72 73 20 74 68 61 74 20 6e 65  rameters that ne
bc50: 65 64 20 61 20 54 63 6c 5f 44 65 63 72 52 65 66  ed a Tcl_DecrRef
bc60: 43 6f 75 6e 74 28 29 20 2a 2f 0a 20 20 20 20 69  Count() */.    i
bc70: 6e 74 20 6e 50 61 72 6d 3b 20 20 20 20 20 20 20  nt nParm;       
bc80: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
bc90: 6f 66 20 65 6e 74 72 69 65 73 20 75 73 65 64 20  of entries used 
bca0: 69 6e 20 61 70 50 61 72 6d 5b 5d 20 2a 2f 0a 20  in apParm[] */. 
bcb0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 61 50 61 72     Tcl_Obj *aPar
bcc0: 6d 5b 31 30 5d 3b 20 20 20 20 2f 2a 20 53 74 61  m[10];    /* Sta
bcd0: 74 69 63 20 73 70 61 63 65 20 66 6f 72 20 61 70  tic space for ap
bce0: 50 61 72 6d 5b 5d 20 69 6e 20 74 68 65 20 63 6f  Parm[] in the co
bcf0: 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20  mmon case */.   
bd00: 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 20   Tcl_Obj *pRet; 
bd10: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
bd20: 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20   to be returned 
bd30: 2a 2f 0a 20 20 20 20 53 71 6c 50 72 65 70 61 72  */.    SqlPrepar
bd40: 65 64 53 74 6d 74 20 2a 70 50 72 65 53 74 6d 74  edStmt *pPreStmt
bd50: 3b 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  ;  /* Pointer to
bd60: 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
bd70: 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74  ement */.    int
bd80: 20 72 63 32 3b 0a 0a 20 20 20 20 69 66 28 20 63   rc2;..    if( c
bd90: 68 6f 69 63 65 3d 3d 44 42 5f 45 56 41 4c 20 29  hoice==DB_EVAL )
bda0: 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63  {.      if( objc
bdb0: 3c 33 20 7c 7c 20 6f 62 6a 63 3e 35 20 29 7b 0a  <3 || objc>5 ){.
bdc0: 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e          Tcl_Wron
bdd0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
bde0: 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 20 3f   2, objv, "SQL ?
bdf0: 41 52 52 41 59 2d 4e 41 4d 45 3f 20 3f 53 43 52  ARRAY-NAME? ?SCR
be00: 49 50 54 3f 22 29 3b 0a 20 20 20 20 20 20 20 20  IPT?");.        
be10: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
be20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
be30: 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62  pRet = Tcl_NewOb
be40: 6a 28 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 49  j();.      Tcl_I
be50: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 52 65 74  ncrRefCount(pRet
be60: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
be70: 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20      if( objc!=3 
be80: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57  ){.        Tcl_W
be90: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
bea0: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51  rp, 2, objv, "SQ
beb0: 4c 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  L");.        ret
bec0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
bed0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
bee0: 20 63 68 6f 69 63 65 3d 3d 44 42 5f 45 58 49 53   choice==DB_EXIS
bef0: 54 53 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52  TS ){.        pR
bf00: 65 74 20 3d 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c  et = Tcl_NewBool
bf10: 65 61 6e 4f 62 6a 28 30 29 3b 0a 20 20 20 20 20  eanObj(0);.     
bf20: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
bf30: 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20 20  unt(pRet);.     
bf40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
bf50: 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRet = 0;.      
bf60: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
bf70: 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20  objc==3 ){.     
bf80: 20 70 41 72 72 61 79 20 3d 20 70 53 63 72 69 70   pArray = pScrip
bf90: 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  t = 0;.    }else
bfa0: 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a   if( objc==4 ){.
bfb0: 20 20 20 20 20 20 70 41 72 72 61 79 20 3d 20 30        pArray = 0
bfc0: 3b 0a 20 20 20 20 20 20 70 53 63 72 69 70 74 20  ;.      pScript 
bfd0: 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20 7d  = objv[3];.    }
bfe0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 41 72 72  else{.      pArr
bff0: 61 79 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20  ay = objv[3];.  
c000: 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 53      if( Tcl_GetS
c010: 74 72 69 6e 67 28 70 41 72 72 61 79 29 5b 30 5d  tring(pArray)[0]
c020: 3d 3d 30 20 29 20 70 41 72 72 61 79 20 3d 20 30  ==0 ) pArray = 0
c030: 3b 0a 20 20 20 20 20 20 70 53 63 72 69 70 74 20  ;.      pScript 
c040: 3d 20 6f 62 6a 76 5b 34 5d 3b 0a 20 20 20 20 7d  = objv[4];.    }
c050: 0a 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ..    Tcl_IncrRe
c060: 66 43 6f 75 6e 74 28 6f 62 6a 76 5b 32 5d 29 3b  fCount(objv[2]);
c070: 0a 20 20 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f  .    zSql = Tcl_
c080: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
c090: 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20  (objv[2], 0);.  
c0a0: 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 54 43 4c    while( rc==TCL
c0b0: 5f 4f 4b 20 26 26 20 7a 53 71 6c 5b 30 5d 20 29  _OK && zSql[0] )
c0c0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20  {.      int i;  
c0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0e0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
c0f0: 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  er */.      int 
c100: 6e 56 61 72 3b 20 20 20 20 20 20 20 20 20 20 20  nVar;           
c110: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
c120: 20 6f 66 20 62 69 6e 64 20 70 61 72 61 6d 65 74   of bind paramet
c130: 65 72 73 20 69 6e 20 74 68 65 20 70 53 74 6d 74  ers in the pStmt
c140: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 43   */.      int nC
c150: 6f 6c 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20  ol = -1;        
c160: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
c170: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
c180: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
c190: 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61       Tcl_Obj **a
c1a0: 70 43 6f 6c 4e 61 6d 65 20 3d 20 30 3b 20 20 20  pColName = 0;   
c1b0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 6f 6c 75  /* Array of colu
c1c0: 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 20 20  mn names */.    
c1d0: 20 20 69 6e 74 20 6c 65 6e 3b 20 20 20 20 20 20    int len;      
c1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c1f0: 53 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 6f 66  String length of
c200: 20 7a 53 71 6c 20 2a 2f 0a 20 20 0a 20 20 20 20   zSql */.  .    
c210: 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64    /* Try to find
c220: 20 61 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74   a SQL statement
c230: 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64   that has alread
c240: 79 20 62 65 65 6e 20 63 6f 6d 70 69 6c 65 64 20  y been compiled 
c250: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 77 68 69  and.      ** whi
c260: 63 68 20 6d 61 74 63 68 65 73 20 74 68 65 20 6e  ch matches the n
c270: 65 78 74 20 73 65 71 75 65 6e 63 65 20 6f 66 20  ext sequence of 
c280: 53 51 4c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  SQL..      */.  
c290: 20 20 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20      pStmt = 0;. 
c2a0: 20 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65       len = strle
c2b0: 6e 28 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 66  n(zSql);.      f
c2c0: 6f 72 28 70 50 72 65 53 74 6d 74 20 3d 20 70 44  or(pPreStmt = pD
c2d0: 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 20 70 50 72  b->stmtList; pPr
c2e0: 65 53 74 6d 74 3b 20 70 50 72 65 53 74 6d 74 3d  eStmt; pPreStmt=
c2f0: 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 29  pPreStmt->pNext)
c300: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20  {.        int n 
c310: 3d 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c  = pPreStmt->nSql
c320: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 65  ;.        if( le
c330: 6e 3e 3d 6e 20 0a 20 20 20 20 20 20 20 20 20 20  n>=n .          
c340: 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 50 72 65    && memcmp(pPre
c350: 53 74 6d 74 2d 3e 7a 53 71 6c 2c 20 7a 53 71 6c  Stmt->zSql, zSql
c360: 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  , n)==0.        
c370: 20 20 20 20 26 26 20 28 7a 53 71 6c 5b 6e 5d 3d      && (zSql[n]=
c380: 3d 30 20 7c 7c 20 7a 53 71 6c 5b 6e 2d 31 5d 3d  =0 || zSql[n-1]=
c390: 3d 27 3b 27 29 0a 20 20 20 20 20 20 20 20 29 7b  =';').        ){
c3a0: 0a 20 20 20 20 20 20 20 20 20 20 70 53 74 6d 74  .          pStmt
c3b0: 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 53 74   = pPreStmt->pSt
c3c0: 6d 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4c  mt;.          zL
c3d0: 65 66 74 20 3d 20 26 7a 53 71 6c 5b 70 50 72 65  eft = &zSql[pPre
c3e0: 53 74 6d 74 2d 3e 6e 53 71 6c 5d 3b 0a 0a 20 20  Stmt->nSql];..  
c3f0: 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20          /* When 
c400: 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
c410: 6d 65 6e 74 20 69 73 20 66 6f 75 6e 64 2c 20 75  ment is found, u
c420: 6e 6c 69 6e 6b 20 69 74 20 66 72 6f 6d 20 74 68  nlink it from th
c430: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  e.          ** c
c440: 61 63 68 65 20 6c 69 73 74 2e 20 20 49 74 20 77  ache list.  It w
c450: 69 6c 6c 20 6c 61 74 65 72 20 62 65 20 61 64 64  ill later be add
c460: 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65 20 62  ed back to the b
c470: 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 20  eginning.       
c480: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 61 63     ** of the cac
c490: 68 65 20 6c 69 73 74 20 69 6e 20 6f 72 64 65 72  he list in order
c4a0: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 4c 52   to implement LR
c4b0: 55 20 72 65 70 6c 61 63 65 6d 65 6e 74 2e 0a 20  U replacement.. 
c4c0: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
c4d0: 20 20 20 20 20 20 69 66 28 20 70 50 72 65 53 74        if( pPreSt
c4e0: 6d 74 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20  mt->pPrev ){.   
c4f0: 20 20 20 20 20 20 20 20 20 70 50 72 65 53 74 6d           pPreStm
c500: 74 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  t->pPrev->pNext 
c510: 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78  = pPreStmt->pNex
c520: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  t;.          }el
c530: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
c540: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20  pDb->stmtList = 
c550: 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 3b  pPreStmt->pNext;
c560: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
c570: 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65 53         if( pPreS
c580: 74 6d 74 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  tmt->pNext ){.  
c590: 20 20 20 20 20 20 20 20 20 20 70 50 72 65 53 74            pPreSt
c5a0: 6d 74 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76  mt->pNext->pPrev
c5b0: 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72   = pPreStmt->pPr
c5c0: 65 76 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ev;.          }e
c5d0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
c5e0: 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d   pDb->stmtLast =
c5f0: 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76   pPreStmt->pPrev
c600: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
c610: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 6e 53 74          pDb->nSt
c620: 6d 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20  mt--;.          
c630: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
c640: 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  .      }.  .    
c650: 20 20 2f 2a 20 49 66 20 6e 6f 20 70 72 65 70 61    /* If no prepa
c660: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 77 61  red statement wa
c670: 73 20 66 6f 75 6e 64 2e 20 20 43 6f 6d 70 69 6c  s found.  Compil
c680: 65 20 74 68 65 20 53 51 4c 20 74 65 78 74 0a 20  e the SQL text. 
c690: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
c6a0: 28 20 70 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20  ( pStmt==0 ){.  
c6b0: 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
c6c0: 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 70 72 65  _OK!=sqlite3_pre
c6d0: 70 61 72 65 5f 76 32 28 70 44 62 2d 3e 64 62 2c  pare_v2(pDb->db,
c6e0: 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
c6f0: 74 2c 20 26 7a 4c 65 66 74 29 20 29 7b 0a 20 20  t, &zLeft) ){.  
c700: 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f          Tcl_SetO
c710: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
c720: 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c   dbTextToObj(sql
c730: 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d  ite3_errmsg(pDb-
c740: 3e 64 62 29 29 29 3b 0a 20 20 20 20 20 20 20 20  >db)));.        
c750: 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52    rc = TCL_ERROR
c760: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
c770: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
c780: 20 20 20 20 20 69 66 28 20 70 53 74 6d 74 3d 3d       if( pStmt==
c790: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
c7a0: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
c7b0: 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70 44  lite3_errcode(pD
c7c0: 62 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20 20 20  b->db) ){.      
c7d0: 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6d 70 69        /* A compi
c7e0: 6c 65 2d 74 69 6d 65 20 65 72 72 6f 72 20 69 6e  le-time error in
c7f0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 20   the statement. 
c800: 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
c810: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65            Tcl_Se
c820: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
c830: 70 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 73  p, dbTextToObj(s
c840: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44  qlite3_errmsg(pD
c850: 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20 20 20  b->db)));.      
c860: 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45        rc = TCL_E
c870: 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20  RROR;.          
c880: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
c890: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c8a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 74 61        /* The sta
c8b0: 74 65 6d 65 6e 74 20 77 61 73 20 61 20 6e 6f 2d  tement was a no-
c8c0: 6f 70 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f  op.  Continue to
c8d0: 20 74 68 65 20 6e 65 78 74 20 73 74 61 74 65 6d   the next statem
c8e0: 65 6e 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  ent.            
c8f0: 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c 20 73 74  ** in the SQL st
c900: 72 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 20 20  ring..          
c910: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
c920: 20 7a 53 71 6c 20 3d 20 7a 4c 65 66 74 3b 0a 20   zSql = zLeft;. 
c930: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
c940: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nue;.          }
c950: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c960: 20 20 20 61 73 73 65 72 74 28 20 70 50 72 65 53     assert( pPreS
c970: 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  tmt==0 );.      
c980: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 42 69 6e 64  }..      /* Bind
c990: 20 76 61 6c 75 65 73 20 74 6f 20 70 61 72 61 6d   values to param
c9a0: 65 74 65 72 73 20 74 68 61 74 20 62 65 67 69 6e  eters that begin
c9b0: 20 77 69 74 68 20 24 20 6f 72 20 3a 0a 20 20 20   with $ or :.   
c9c0: 20 20 20 2a 2f 20 20 0a 20 20 20 20 20 20 6e 56     */  .      nV
c9d0: 61 72 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e  ar = sqlite3_bin
c9e0: 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e  d_parameter_coun
c9f0: 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  t(pStmt);.      
ca00: 6e 50 61 72 6d 20 3d 20 30 3b 0a 20 20 20 20 20  nParm = 0;.     
ca10: 20 69 66 28 20 6e 56 61 72 3e 73 69 7a 65 6f 66   if( nVar>sizeof
ca20: 28 61 50 61 72 6d 29 2f 73 69 7a 65 6f 66 28 61  (aParm)/sizeof(a
ca30: 50 61 72 6d 5b 30 5d 29 20 29 7b 0a 20 20 20 20  Parm[0]) ){.    
ca40: 20 20 20 20 61 70 50 61 72 6d 20 3d 20 28 54 63      apParm = (Tc
ca50: 6c 5f 4f 62 6a 2a 2a 29 54 63 6c 5f 41 6c 6c 6f  l_Obj**)Tcl_Allo
ca60: 63 28 6e 56 61 72 2a 73 69 7a 65 6f 66 28 61 70  c(nVar*sizeof(ap
ca70: 50 61 72 6d 5b 30 5d 29 29 3b 0a 20 20 20 20 20  Parm[0]));.     
ca80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ca90: 61 70 50 61 72 6d 20 3d 20 61 50 61 72 6d 3b 0a  apParm = aParm;.
caa0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
cab0: 72 28 69 3d 31 3b 20 69 3c 3d 6e 56 61 72 3b 20  r(i=1; i<=nVar; 
cac0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  i++){.        co
cad0: 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 72 20 3d  nst char *zVar =
cae0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61   sqlite3_bind_pa
caf0: 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 70 53 74  rameter_name(pSt
cb00: 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  mt, i);.        
cb10: 69 66 28 20 7a 56 61 72 21 3d 30 20 26 26 20 28  if( zVar!=0 && (
cb20: 7a 56 61 72 5b 30 5d 3d 3d 27 24 27 20 7c 7c 20  zVar[0]=='$' || 
cb30: 7a 56 61 72 5b 30 5d 3d 3d 27 3a 27 20 7c 7c 20  zVar[0]==':' || 
cb40: 7a 56 61 72 5b 30 5d 3d 3d 27 40 27 29 20 29 7b  zVar[0]=='@') ){
cb50: 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4f  .          Tcl_O
cb60: 62 6a 20 2a 70 56 61 72 20 3d 20 54 63 6c 5f 47  bj *pVar = Tcl_G
cb70: 65 74 56 61 72 32 45 78 28 69 6e 74 65 72 70 2c  etVar2Ex(interp,
cb80: 20 26 7a 56 61 72 5b 31 5d 2c 20 30 2c 20 30 29   &zVar[1], 0, 0)
cb90: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
cba0: 70 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20  pVar ){.        
cbb0: 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20      int n;.     
cbc0: 20 20 20 20 20 20 20 75 38 20 2a 64 61 74 61 3b         u8 *data;
cbd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
cbe0: 72 20 2a 7a 54 79 70 65 20 3d 20 70 56 61 72 2d  r *zType = pVar-
cbf0: 3e 74 79 70 65 50 74 72 20 3f 20 70 56 61 72 2d  >typePtr ? pVar-
cc00: 3e 74 79 70 65 50 74 72 2d 3e 6e 61 6d 65 20 3a  >typePtr->name :
cc10: 20 22 22 3b 0a 20 20 20 20 20 20 20 20 20 20 20   "";.           
cc20: 20 63 68 61 72 20 63 20 3d 20 7a 54 79 70 65 5b   char c = zType[
cc30: 30 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0];.            
cc40: 69 66 28 20 7a 56 61 72 5b 30 5d 3d 3d 27 40 27  if( zVar[0]=='@'
cc50: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20   ||.            
cc60: 20 20 20 28 63 3d 3d 27 62 27 20 26 26 20 73 74     (c=='b' && st
cc70: 72 63 6d 70 28 7a 54 79 70 65 2c 22 62 79 74 65  rcmp(zType,"byte
cc80: 61 72 72 61 79 22 29 3d 3d 30 20 26 26 20 70 56  array")==0 && pV
cc90: 61 72 2d 3e 62 79 74 65 73 3d 3d 30 29 20 29 7b  ar->bytes==0) ){
cca0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  .              /
ccb0: 2a 20 4c 6f 61 64 20 61 20 42 4c 4f 42 20 74 79  * Load a BLOB ty
ccc0: 70 65 20 69 66 20 74 68 65 20 54 63 6c 20 76 61  pe if the Tcl va
ccd0: 72 69 61 62 6c 65 20 69 73 20 61 20 62 79 74 65  riable is a byte
cce0: 61 72 72 61 79 20 61 6e 64 0a 20 20 20 20 20 20  array and.      
ccf0: 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 68 61          ** it ha
cd00: 73 20 6e 6f 20 73 74 72 69 6e 67 20 72 65 70 72  s no string repr
cd10: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 72 20 74 68  esentation or th
cd20: 65 20 68 6f 73 74 0a 20 20 20 20 20 20 20 20 20  e host.         
cd30: 20 20 20 20 20 2a 2a 20 70 61 72 61 6d 65 74 65       ** paramete
cd40: 72 20 6e 61 6d 65 20 62 65 67 69 6e 73 20 77 69  r name begins wi
cd50: 74 68 20 22 40 22 2e 20 2a 2f 0a 20 20 20 20 20  th "@". */.     
cd60: 20 20 20 20 20 20 20 20 20 64 61 74 61 20 3d 20           data = 
cd70: 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
cd80: 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e  FromObj(pVar, &n
cd90: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
cda0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c   sqlite3_bind_bl
cdb0: 6f 62 28 70 53 74 6d 74 2c 20 69 2c 20 64 61 74  ob(pStmt, i, dat
cdc0: 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41  a, n, SQLITE_STA
cdd0: 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20  TIC);.          
cde0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
cdf0: 6f 75 6e 74 28 70 56 61 72 29 3b 0a 20 20 20 20  ount(pVar);.    
ce00: 20 20 20 20 20 20 20 20 20 20 61 70 50 61 72 6d            apParm
ce10: 5b 6e 50 61 72 6d 2b 2b 5d 20 3d 20 70 56 61 72  [nParm++] = pVar
ce20: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
ce30: 6c 73 65 20 69 66 28 20 63 3d 3d 27 62 27 20 26  lse if( c=='b' &
ce40: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
ce50: 62 6f 6f 6c 65 61 6e 22 29 3d 3d 30 20 29 7b 0a  boolean")==0 ){.
ce60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
ce70: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
ce80: 69 6e 74 65 72 70 2c 20 70 56 61 72 2c 20 26 6e  interp, pVar, &n
ce90: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
cea0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
ceb0: 74 28 70 53 74 6d 74 2c 20 69 2c 20 6e 29 3b 0a  t(pStmt, i, n);.
cec0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
ced0: 65 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20  e if( c=='d' && 
cee0: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 64 6f  strcmp(zType,"do
cef0: 75 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  uble")==0 ){.   
cf00: 20 20 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c             doubl
cf10: 65 20 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  e r;.           
cf20: 20 20 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65     Tcl_GetDouble
cf30: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
cf40: 70 56 61 72 2c 20 26 72 29 3b 0a 20 20 20 20 20  pVar, &r);.     
cf50: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
cf60: 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28 70 53 74  _bind_double(pSt
cf70: 6d 74 2c 20 69 2c 20 72 29 3b 0a 20 20 20 20 20  mt, i, r);.     
cf80: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
cf90: 20 28 63 3d 3d 27 77 27 20 26 26 20 73 74 72 63   (c=='w' && strc
cfa0: 6d 70 28 7a 54 79 70 65 2c 22 77 69 64 65 49 6e  mp(zType,"wideIn
cfb0: 74 22 29 3d 3d 30 29 20 7c 7c 0a 20 20 20 20 20  t")==0) ||.     
cfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 3d               (c=
cfd0: 3d 27 69 27 20 26 26 20 73 74 72 63 6d 70 28 7a  ='i' && strcmp(z
cfe0: 54 79 70 65 2c 22 69 6e 74 22 29 3d 3d 30 29 20  Type,"int")==0) 
cff0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
d000: 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 76 3b 0a   Tcl_WideInt v;.
d010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
d020: 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d  l_GetWideIntFrom
d030: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 56 61 72  Obj(interp, pVar
d040: 2c 20 26 76 29 3b 0a 20 20 20 20 20 20 20 20 20  , &v);.         
d050: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
d060: 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 69  d_int64(pStmt, i
d070: 2c 20 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , v);.          
d080: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
d090: 20 20 20 20 20 20 20 64 61 74 61 20 3d 20 28 75         data = (u
d0a0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 54  nsigned char *)T
d0b0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
d0c0: 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20  Obj(pVar, &n);. 
d0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
d0e0: 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70  ite3_bind_text(p
d0f0: 53 74 6d 74 2c 20 69 2c 20 28 63 68 61 72 20 2a  Stmt, i, (char *
d100: 29 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45  )data, n, SQLITE
d110: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
d120: 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72          Tcl_Incr
d130: 52 65 66 43 6f 75 6e 74 28 70 56 61 72 29 3b 0a  RefCount(pVar);.
d140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70                ap
d150: 50 61 72 6d 5b 6e 50 61 72 6d 2b 2b 5d 20 3d 20  Parm[nParm++] = 
d160: 70 56 61 72 3b 0a 20 20 20 20 20 20 20 20 20 20  pVar;.          
d170: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
d180: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
d190: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75   sqlite3_bind_nu
d1a0: 6c 6c 28 20 70 53 74 6d 74 2c 20 69 20 29 3b 0a  ll( pStmt, i );.
d1b0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
d1c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
d1d0: 20 20 20 20 20 2f 2a 20 45 78 65 63 75 74 65 20       /* Execute 
d1e0: 74 68 65 20 53 51 4c 0a 20 20 20 20 20 20 2a 2f  the SQL.      */
d1f0: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 72 63  .      while( rc
d200: 3d 3d 54 43 4c 5f 4f 4b 20 26 26 20 70 53 74 6d  ==TCL_OK && pStm
d210: 74 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d  t && SQLITE_ROW=
d220: 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
d230: 74 6d 74 29 20 29 7b 0a 0a 09 2f 2a 20 43 6f 6d  tmt) ){.../* Com
d240: 70 75 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  pute column name
d250: 73 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65 20  s. This must be 
d260: 64 6f 6e 65 20 61 66 74 65 72 20 74 68 65 20 66  done after the f
d270: 69 72 73 74 20 73 75 63 63 65 73 73 66 75 6c 0a  irst successful.
d280: 09 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  .** call to sqli
d290: 74 65 33 5f 73 74 65 70 28 29 2c 20 69 6e 20 63  te3_step(), in c
d2a0: 61 73 65 20 74 68 65 20 71 75 65 72 79 20 69 73  ase the query is
d2b0: 20 72 65 63 6f 6d 70 69 6c 65 64 20 61 6e 64 20   recompiled and 
d2c0: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  the.        ** n
d2d0: 75 6d 62 65 72 20 6f 72 20 6e 61 6d 65 73 20 6f  umber or names o
d2e0: 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 63  f the returned c
d2f0: 6f 6c 75 6d 6e 73 20 63 68 61 6e 67 65 73 2e 20  olumns changes. 
d300: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
d310: 20 20 20 20 61 73 73 65 72 74 28 21 70 41 72 72      assert(!pArr
d320: 61 79 7c 7c 70 53 63 72 69 70 74 29 3b 0a 20 20  ay||pScript);.  
d330: 20 20 20 20 20 20 69 66 20 28 6e 43 6f 6c 20 3c        if (nCol <
d340: 20 30 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20   0) {.          
d350: 54 63 6c 5f 4f 62 6a 20 2a 2a 2a 61 70 20 3d 20  Tcl_Obj ***ap = 
d360: 28 70 53 63 72 69 70 74 3f 26 61 70 43 6f 6c 4e  (pScript?&apColN
d370: 61 6d 65 3a 30 29 3b 0a 20 20 20 20 20 20 20 20  ame:0);.        
d380: 20 20 6e 43 6f 6c 20 3d 20 63 6f 6d 70 75 74 65    nCol = compute
d390: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 69 6e 74 65  ColumnNames(inte
d3a0: 72 70 2c 20 70 53 74 6d 74 2c 20 61 70 2c 20 70  rp, pStmt, ap, p
d3b0: 41 72 72 61 79 29 3b 0a 20 20 20 20 20 20 20 20  Array);.        
d3c0: 7d 0a 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  }..        for(i
d3d0: 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
d3e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  {.          Tcl_
d3f0: 4f 62 6a 20 2a 70 56 61 6c 3b 0a 20 20 20 20 20  Obj *pVal;.     
d400: 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20       .          
d410: 2f 2a 20 53 65 74 20 70 56 61 6c 20 74 6f 20 63  /* Set pVal to c
d420: 6f 6e 74 61 69 6e 20 74 68 65 20 69 27 74 68 20  ontain the i'th 
d430: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 69 73 20 72  column of this r
d440: 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ow. */.         
d450: 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33   switch( sqlite3
d460: 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74  _column_type(pSt
d470: 6d 74 2c 20 69 29 20 29 7b 0a 20 20 20 20 20 20  mt, i) ){.      
d480: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
d490: 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20  E_BLOB: {.      
d4a0: 20 20 20 20 20 20 20 20 69 6e 74 20 62 79 74 65          int byte
d4b0: 73 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  s = sqlite3_colu
d4c0: 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20  mn_bytes(pStmt, 
d4d0: 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i);.            
d4e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42    const char *zB
d4f0: 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  lob = sqlite3_co
d500: 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c  lumn_blob(pStmt,
d510: 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   i);.           
d520: 20 20 20 69 66 28 20 21 7a 42 6c 6f 62 20 29 20     if( !zBlob ) 
d530: 62 79 74 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  bytes = 0;.     
d540: 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20           pVal = 
d550: 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79  Tcl_NewByteArray
d560: 4f 62 6a 28 28 75 38 2a 29 7a 42 6c 6f 62 2c 20  Obj((u8*)zBlob, 
d570: 62 79 74 65 73 29 3b 0a 20 20 20 20 20 20 20 20  bytes);.        
d580: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
d590: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
d5a0: 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
d5b0: 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20  TE_INTEGER: {.  
d5c0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
d5d0: 74 65 5f 69 6e 74 36 34 20 76 20 3d 20 73 71 6c  te_int64 v = sql
d5e0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  ite3_column_int6
d5f0: 34 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20  4(pStmt, i);.   
d600: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 76             if( v
d610: 3e 3d 2d 32 31 34 37 34 38 33 36 34 37 20 26 26  >=-2147483647 &&
d620: 20 76 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29   v<=2147483647 )
d630: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
d640: 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77    pVal = Tcl_New
d650: 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20 20  IntObj(v);.     
d660: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
d670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d680: 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 57 69  pVal = Tcl_NewWi
d690: 64 65 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20  deIntObj(v);.   
d6a0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
d6b0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
d6c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
d6d0: 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65              case
d6e0: 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b   SQLITE_FLOAT: {
d6f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  .              d
d700: 6f 75 62 6c 65 20 72 20 3d 20 73 71 6c 69 74 65  ouble r = sqlite
d710: 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28  3_column_double(
d720: 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20  pStmt, i);.     
d730: 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20           pVal = 
d740: 54 63 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f 62 6a  Tcl_NewDoubleObj
d750: 28 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (r);.           
d760: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
d770: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d780: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
d790: 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20  NULL: {.        
d7a0: 20 20 20 20 20 20 70 56 61 6c 20 3d 20 64 62 54        pVal = dbT
d7b0: 65 78 74 54 6f 4f 62 6a 28 70 44 62 2d 3e 7a 4e  extToObj(pDb->zN
d7c0: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ull);.          
d7d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
d7e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d7f0: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a       default: {.
d800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56                pV
d810: 61 6c 20 3d 20 64 62 54 65 78 74 54 6f 4f 62 6a  al = dbTextToObj
d820: 28 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33  ((char *)sqlite3
d830: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
d840: 6d 74 2c 20 69 29 29 3b 0a 20 20 20 20 20 20 20  mt, i));.       
d850: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
d860: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
d870: 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
d880: 20 20 20 20 20 69 66 28 20 70 53 63 72 69 70 74       if( pScript
d890: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
d8a0: 69 66 28 20 70 41 72 72 61 79 3d 3d 30 20 29 7b  if( pArray==0 ){
d8b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54  .              T
d8c0: 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e  cl_ObjSetVar2(in
d8d0: 74 65 72 70 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b  terp, apColName[
d8e0: 69 5d 2c 20 30 2c 20 70 56 61 6c 2c 20 30 29 3b  i], 0, pVal, 0);
d8f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
d900: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
d910: 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32    Tcl_ObjSetVar2
d920: 28 69 6e 74 65 72 70 2c 20 70 41 72 72 61 79 2c  (interp, pArray,
d930: 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 70   apColName[i], p
d940: 56 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Val, 0);.       
d950: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
d960: 20 7d 65 6c 73 65 20 69 66 28 20 63 68 6f 69 63   }else if( choic
d970: 65 3d 3d 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 20  e==DB_ONECOLUMN 
d980: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
d990: 73 73 65 72 74 28 20 70 52 65 74 3d 3d 30 20 29  ssert( pRet==0 )
d9a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
d9b0: 28 20 70 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20  ( pRet==0 ){.   
d9c0: 20 20 20 20 20 20 20 20 20 20 20 70 52 65 74 20             pRet 
d9d0: 3d 20 70 56 61 6c 3b 0a 20 20 20 20 20 20 20 20  = pVal;.        
d9e0: 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65        Tcl_IncrRe
d9f0: 66 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20  fCount(pRet);.  
da00: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
da10: 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c          rc = TCL
da20: 5f 42 52 45 41 4b 3b 0a 20 20 20 20 20 20 20 20  _BREAK;.        
da30: 20 20 20 20 69 20 3d 20 6e 43 6f 6c 3b 0a 20 20      i = nCol;.  
da40: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
da50: 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f 45 58 49  ( choice==DB_EXI
da60: 53 54 53 20 29 7b 0a 20 20 20 20 20 20 20 20 20  STS ){.         
da70: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
da80: 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20 20  unt(pRet);.     
da90: 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 54 63         pRet = Tc
daa0: 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28  l_NewBooleanObj(
dab0: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
dac0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
dad0: 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20 20 20  (pRet);.        
dae0: 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 42 52 45      rc = TCL_BRE
daf0: 41 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  AK;.            
db00: 69 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  i = nCol;.      
db10: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
db20: 20 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f         Tcl_ListO
db30: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
db40: 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 70 56  interp, pRet, pV
db50: 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  al);.          }
db60: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  .        }.  .  
db70: 20 20 20 20 20 20 69 66 28 20 70 53 63 72 69 70        if( pScrip
db80: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  t ){.          r
db90: 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  c = Tcl_EvalObjE
dba0: 78 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70  x(interp, pScrip
dbb0: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  t, 0);.         
dbc0: 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 43 4f 4e   if( rc==TCL_CON
dbd0: 54 49 4e 55 45 20 29 7b 0a 20 20 20 20 20 20 20  TINUE ){.       
dbe0: 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b       rc = TCL_OK
dbf0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
dc00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
dc10: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43        if( rc==TC
dc20: 4c 5f 42 52 45 41 4b 20 29 7b 0a 20 20 20 20 20  L_BREAK ){.     
dc30: 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a     rc = TCL_OK;.
dc40: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
dc50: 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6c 75 6d  * Free the colum
dc60: 6e 20 6e 61 6d 65 20 6f 62 6a 65 63 74 73 20 2a  n name objects *
dc70: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 53 63 72  /.      if( pScr
dc80: 69 70 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ipt ){.        /
dc90: 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20 72  * If the query r
dca0: 65 74 75 72 6e 65 64 20 6e 6f 20 72 6f 77 73 2c  eturned no rows,
dcb0: 20 62 75 74 20 61 6e 20 61 72 72 61 79 20 76 61   but an array va
dcc0: 72 69 61 62 6c 65 20 77 61 73 20 0a 20 20 20 20  riable was .    
dcd0: 20 20 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64      ** specified
dce0: 2c 20 63 61 6c 6c 20 63 6f 6d 70 75 74 65 43 6f  , call computeCo
dcf0: 6c 75 6d 6e 4e 61 6d 65 73 28 29 20 6e 6f 77 20  lumnNames() now 
dd00: 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  to populate the 
dd10: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 72 72 61  .        ** arra
dd20: 79 6e 61 6d 65 28 2a 29 20 76 61 72 69 61 62 6c  yname(*) variabl
dd30: 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
dd40: 20 20 20 20 20 20 69 66 20 28 70 41 72 72 61 79        if (pArray
dd50: 20 26 26 20 6e 43 6f 6c 20 3c 20 30 29 20 7b 0a   && nCol < 0) {.
dd60: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62            Tcl_Ob
dd70: 6a 20 2a 2a 2a 61 70 20 3d 20 28 70 53 63 72 69  j ***ap = (pScri
dd80: 70 74 3f 26 61 70 43 6f 6c 4e 61 6d 65 3a 30 29  pt?&apColName:0)
dd90: 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43 6f 6c  ;.          nCol
dda0: 20 3d 20 63 6f 6d 70 75 74 65 43 6f 6c 75 6d 6e   = computeColumn
ddb0: 4e 61 6d 65 73 28 69 6e 74 65 72 70 2c 20 70 53  Names(interp, pS
ddc0: 74 6d 74 2c 20 61 70 2c 20 70 41 72 72 61 79 29  tmt, ap, pArray)
ddd0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
dde0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
ddf0: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
de00: 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
de10: 43 6f 75 6e 74 28 61 70 43 6f 6c 4e 61 6d 65 5b  Count(apColName[
de20: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  i]);.        }. 
de30: 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28         Tcl_Free(
de40: 28 63 68 61 72 2a 29 61 70 43 6f 6c 4e 61 6d 65  (char*)apColName
de50: 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
de60: 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20 62 6f    /* Free the bo
de70: 75 6e 64 20 73 74 72 69 6e 67 20 61 6e 64 20 62  und string and b
de80: 6c 6f 62 20 70 61 72 61 6d 65 74 65 72 73 20 2a  lob parameters *
de90: 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  /.      for(i=0;
dea0: 20 69 3c 6e 50 61 72 6d 3b 20 69 2b 2b 29 7b 0a   i<nParm; i++){.
deb0: 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72          Tcl_Decr
dec0: 52 65 66 43 6f 75 6e 74 28 61 70 50 61 72 6d 5b  RefCount(apParm[
ded0: 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
dee0: 20 20 20 69 66 28 20 61 70 50 61 72 6d 21 3d 61     if( apParm!=a
def0: 50 61 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  Parm ){.        
df00: 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29  Tcl_Free((char*)
df10: 61 70 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d  apParm);.      }
df20: 0a 0a 20 20 20 20 20 20 2f 2a 20 52 65 73 65 74  ..      /* Reset
df30: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20   the statement. 
df40: 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 20 63   If the result c
df50: 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f 53 43  ode is SQLITE_SC
df60: 48 45 4d 41 2c 20 74 68 65 6e 0a 20 20 20 20 20  HEMA, then.     
df70: 20 2a 2a 20 66 6c 75 73 68 20 74 68 65 20 73 74   ** flush the st
df80: 61 74 65 6d 65 6e 74 20 63 61 63 68 65 20 61 6e  atement cache an
df90: 64 20 74 72 79 20 74 68 65 20 73 74 61 74 65 6d  d try the statem
dfa0: 65 6e 74 20 61 67 61 69 6e 2e 0a 20 20 20 20 20  ent again..     
dfb0: 20 2a 2f 0a 20 20 20 20 20 20 72 63 32 20 3d 20   */.      rc2 = 
dfc0: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
dfd0: 74 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tmt);.      if( 
dfe0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 32 20 29  SQLITE_OK!=rc2 )
dff0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
e000: 61 20 72 75 6e 2d 74 69 6d 65 20 65 72 72 6f 72  a run-time error
e010: 20 6f 63 63 75 72 73 2c 20 72 65 70 6f 72 74 20   occurs, report 
e020: 74 68 65 20 65 72 72 6f 72 20 61 6e 64 20 73 74  the error and st
e030: 6f 70 20 72 65 61 64 69 6e 67 0a 20 20 20 20 20  op reading.     
e040: 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 0a 20 20     ** the SQL.  
e050: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
e060: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
e070: 74 28 69 6e 74 65 72 70 2c 20 64 62 54 65 78 74  t(interp, dbText
e080: 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 72  ToObj(sqlite3_er
e090: 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 29 29 3b  rmsg(pDb->db)));
e0a0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e0b0: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
e0c0: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 54  ;.        rc = T
e0d0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
e0e0: 20 20 69 66 28 20 70 50 72 65 53 74 6d 74 20 29    if( pPreStmt )
e0f0: 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a   Tcl_Free((char*
e100: 29 70 50 72 65 53 74 6d 74 29 3b 0a 20 20 20 20  )pPreStmt);.    
e110: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
e120: 20 7d 65 6c 73 65 20 69 66 28 20 70 44 62 2d 3e   }else if( pDb->
e130: 6d 61 78 53 74 6d 74 3c 3d 30 20 29 7b 0a 20 20  maxStmt<=0 ){.  
e140: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
e150: 63 61 63 68 65 20 69 73 20 74 75 72 6e 65 64 20  cache is turned 
e160: 6f 66 66 2c 20 64 65 61 6c 6c 6f 63 61 74 65 64  off, deallocated
e170: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a   the statement *
e180: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  /.        if( pP
e190: 72 65 53 74 6d 74 20 29 20 54 63 6c 5f 46 72 65  reStmt ) Tcl_Fre
e1a0: 65 28 28 63 68 61 72 2a 29 70 50 72 65 53 74 6d  e((char*)pPreStm
e1b0: 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
e1c0: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
e1d0: 6d 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  mt);.      }else
e1e0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 76 65  {.        /* Eve
e1f0: 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 20 61  rything worked a
e200: 6e 64 20 74 68 65 20 63 61 63 68 65 20 69 73 20  nd the cache is 
e210: 6f 70 65 72 61 74 69 6f 6e 61 6c 2e 0a 20 20 20  operational..   
e220: 20 20 20 20 20 2a 2a 20 43 72 65 61 74 65 20 61       ** Create a
e230: 20 6e 65 77 20 53 71 6c 50 72 65 70 61 72 65 64   new SqlPrepared
e240: 53 74 6d 74 20 73 74 72 75 63 74 75 72 65 20 69  Stmt structure i
e250: 66 20 77 65 20 6e 65 65 64 20 6f 6e 65 2e 0a 20  f we need one.. 
e260: 20 20 20 20 20 20 20 2a 2a 20 28 49 66 20 77 65         ** (If we
e270: 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 6f 6e   already have on
e280: 65 20 77 65 20 63 61 6e 20 6a 75 73 74 20 72 65  e we can just re
e290: 75 73 65 20 69 74 2e 29 0a 20 20 20 20 20 20 20  use it.).       
e2a0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
e2b0: 70 50 72 65 53 74 6d 74 3d 3d 30 20 29 7b 0a 20  pPreStmt==0 ){. 
e2c0: 20 20 20 20 20 20 20 20 20 6c 65 6e 20 3d 20 7a           len = z
e2d0: 4c 65 66 74 20 2d 20 7a 53 71 6c 3b 0a 20 20 20  Left - zSql;.   
e2e0: 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 20         pPreStmt 
e2f0: 3d 20 28 53 71 6c 50 72 65 70 61 72 65 64 53 74  = (SqlPreparedSt
e300: 6d 74 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73  mt*)Tcl_Alloc( s
e310: 69 7a 65 6f 66 28 2a 70 50 72 65 53 74 6d 74 29  izeof(*pPreStmt)
e320: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
e330: 28 20 70 50 72 65 53 74 6d 74 3d 3d 30 20 29 20  ( pPreStmt==0 ) 
e340: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
e350: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 72 65  ;.          pPre
e360: 53 74 6d 74 2d 3e 70 53 74 6d 74 20 3d 20 70 53  Stmt->pStmt = pS
e370: 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70  tmt;.          p
e380: 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 20 3d 20  PreStmt->nSql = 
e390: 6c 65 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 70  len;.          p
e3a0: 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 20 3d 20  PreStmt->zSql = 
e3b0: 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d  sqlite3_sql(pStm
e3c0: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  t);.          as
e3d0: 73 65 72 74 28 20 73 74 72 6c 65 6e 28 70 50 72  sert( strlen(pPr
e3e0: 65 53 74 6d 74 2d 3e 7a 53 71 6c 29 3d 3d 6c 65  eStmt->zSql)==le
e3f0: 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  n );.          a
e400: 73 73 65 72 74 28 20 30 3d 3d 6d 65 6d 63 6d 70  ssert( 0==memcmp
e410: 28 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c  (pPreStmt->zSql,
e420: 20 7a 53 71 6c 2c 20 6c 65 6e 29 20 29 3b 0a 20   zSql, len) );. 
e430: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
e440: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 70 72 65    /* Add the pre
e450: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
e460: 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
e470: 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 6c 69   of the cache li
e480: 73 74 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  st.        */.  
e490: 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e        pPreStmt->
e4a0: 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 73 74 6d  pNext = pDb->stm
e4b0: 74 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 70  tList;.        p
e4c0: 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 20 3d  PreStmt->pPrev =
e4d0: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
e4e0: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 29 7b  pDb->stmtList ){
e4f0: 0a 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73  .         pDb->s
e500: 74 6d 74 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d  tmtList->pPrev =
e510: 20 70 50 72 65 53 74 6d 74 3b 0a 20 20 20 20 20   pPreStmt;.     
e520: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 44 62     }.        pDb
e530: 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20 70 50 72  ->stmtList = pPr
e540: 65 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 69  eStmt;.        i
e550: 66 28 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74  f( pDb->stmtLast
e560: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
e570: 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 6e 53   assert( pDb->nS
e580: 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  tmt==0 );.      
e590: 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73      pDb->stmtLas
e5a0: 74 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20 20  t = pPreStmt;.  
e5b0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e5c0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
e5d0: 44 62 2d 3e 6e 53 74 6d 74 3e 30 20 29 3b 0a 20  Db->nStmt>0 );. 
e5e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e5f0: 20 70 44 62 2d 3e 6e 53 74 6d 74 2b 2b 3b 0a 20   pDb->nStmt++;. 
e600: 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66    .        /* If
e610: 20 77 65 20 68 61 76 65 20 74 6f 6f 20 6d 61 6e   we have too man
e620: 79 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 63  y statement in c
e630: 61 63 68 65 2c 20 72 65 6d 6f 76 65 20 74 68 65  ache, remove the
e640: 20 73 75 72 70 6c 75 73 20 66 72 6f 6d 20 74 68   surplus from th
e650: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 6e 64  e.        ** end
e660: 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 6c 69   of the cache li
e670: 73 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  st..        */. 
e680: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 44         while( pD
e690: 62 2d 3e 6e 53 74 6d 74 3e 70 44 62 2d 3e 6d 61  b->nStmt>pDb->ma
e6a0: 78 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20  xStmt ){.       
e6b0: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
e6c0: 69 7a 65 28 70 44 62 2d 3e 73 74 6d 74 4c 61 73  ize(pDb->stmtLas
e6d0: 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  t->pStmt);.     
e6e0: 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61       pDb->stmtLa
e6f0: 73 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 61  st = pDb->stmtLa
e700: 73 74 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20  st->pPrev;.     
e710: 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63       Tcl_Free((c
e720: 68 61 72 2a 29 70 44 62 2d 3e 73 74 6d 74 4c 61  har*)pDb->stmtLa
e730: 73 74 2d 3e 70 4e 65 78 74 29 3b 0a 20 20 20 20  st->pNext);.    
e740: 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c        pDb->stmtL
e750: 61 73 74 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a  ast->pNext = 0;.
e760: 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 6e            pDb->n
e770: 53 74 6d 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20  Stmt--;.        
e780: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
e790: 20 2f 2a 20 50 72 6f 63 65 65 64 20 74 6f 20 74   /* Proceed to t
e7a0: 68 65 20 6e 65 78 74 20 73 74 61 74 65 6d 65 6e  he next statemen
e7b0: 74 20 2a 2f 0a 20 20 20 20 20 20 7a 53 71 6c 20  t */.      zSql 
e7c0: 3d 20 7a 4c 65 66 74 3b 0a 20 20 20 20 7d 0a 20  = zLeft;.    }. 
e7d0: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
e7e0: 75 6e 74 28 6f 62 6a 76 5b 32 5d 29 3b 0a 0a 20  unt(objv[2]);.. 
e7f0: 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20     if( pRet ){. 
e800: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c       if( rc==TCL
e810: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54  _OK ){.        T
e820: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
e830: 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20  interp, pRet);. 
e840: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 63 6c       }.      Tcl
e850: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 52  _DecrRefCount(pR
e860: 65 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  et);.    }else i
e870: 66 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b  f( rc==TCL_OK ){
e880: 0a 20 20 20 20 20 20 54 63 6c 5f 52 65 73 65 74  .      Tcl_Reset
e890: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
e8a0: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
e8b0: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
e8c0: 20 20 20 20 24 64 62 20 66 75 6e 63 74 69 6f 6e      $db function
e8d0: 20 4e 41 4d 45 20 53 43 52 49 50 54 0a 20 20 2a   NAME SCRIPT.  *
e8e0: 2a 0a 20 20 2a 2a 20 43 72 65 61 74 65 20 61 20  *.  ** Create a 
e8f0: 6e 65 77 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  new SQL function
e900: 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 57   called NAME.  W
e910: 68 65 6e 65 76 65 72 20 74 68 61 74 20 66 75 6e  henever that fun
e920: 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 61  ction is.  ** ca
e930: 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53 43 52  lled, invoke SCR
e940: 49 50 54 20 74 6f 20 65 76 61 6c 75 61 74 65 20  IPT to evaluate 
e950: 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  the function..  
e960: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 46 55 4e  */.  case DB_FUN
e970: 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 53 71 6c  CTION: {.    Sql
e980: 46 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20 20  Func *pFunc;.   
e990: 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70   Tcl_Obj *pScrip
e9a0: 74 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61  t;.    char *zNa
e9b0: 6d 65 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  me;.    if( objc
e9c0: 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=4 ){.      Tcl
e9d0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
e9e0: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
e9f0: 4e 41 4d 45 20 53 43 52 49 50 54 22 29 3b 0a 20  NAME SCRIPT");. 
ea00: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
ea10: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
ea20: 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74   zName = Tcl_Get
ea30: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
ea40: 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20 70  jv[2], 0);.    p
ea50: 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 33 5d  Script = objv[3]
ea60: 3b 0a 20 20 20 20 70 46 75 6e 63 20 3d 20 66 69  ;.    pFunc = fi
ea70: 6e 64 53 71 6c 46 75 6e 63 28 70 44 62 2c 20 7a  ndSqlFunc(pDb, z
ea80: 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Name);.    if( p
ea90: 46 75 6e 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  Func==0 ) return
eaa0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
eab0: 69 66 28 20 70 46 75 6e 63 2d 3e 70 53 63 72 69  if( pFunc->pScri
eac0: 70 74 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  pt ){.      Tcl_
ead0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 46 75  DecrRefCount(pFu
eae0: 6e 63 2d 3e 70 53 63 72 69 70 74 29 3b 0a 20 20  nc->pScript);.  
eaf0: 20 20 7d 0a 20 20 20 20 70 46 75 6e 63 2d 3e 70    }.    pFunc->p
eb00: 53 63 72 69 70 74 20 3d 20 70 53 63 72 69 70 74  Script = pScript
eb10: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ;.    Tcl_IncrRe
eb20: 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b  fCount(pScript);
eb30: 0a 20 20 20 20 70 46 75 6e 63 2d 3e 75 73 65 45  .    pFunc->useE
eb40: 76 61 6c 4f 62 6a 76 20 3d 20 73 61 66 65 54 6f  valObjv = safeTo
eb50: 55 73 65 45 76 61 6c 4f 62 6a 76 28 69 6e 74 65  UseEvalObjv(inte
eb60: 72 70 2c 20 70 53 63 72 69 70 74 29 3b 0a 20 20  rp, pScript);.  
eb70: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
eb80: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70  reate_function(p
eb90: 44 62 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 2d  Db->db, zName, -
eba0: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a  1, SQLITE_UTF8,.
ebb0: 20 20 20 20 20 20 20 20 70 46 75 6e 63 2c 20 74          pFunc, t
ebc0: 63 6c 53 71 6c 46 75 6e 63 2c 20 30 2c 20 30 29  clSqlFunc, 0, 0)
ebd0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
ebe0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
ebf0: 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b   rc = TCL_ERROR;
ec00: 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65  .      Tcl_SetRe
ec10: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
ec20: 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72  ar *)sqlite3_err
ec30: 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 54 43  msg(pDb->db), TC
ec40: 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20  L_VOLATILE);.   
ec50: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
ec60: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
ec70: 20 24 64 62 20 69 6e 63 72 62 6c 6f 62 20 3f 2d   $db incrblob ?-
ec80: 72 65 61 64 6f 6e 6c 79 3f 20 3f 44 42 3f 20 54  readonly? ?DB? T
ec90: 41 42 4c 45 20 43 4f 4c 55 4d 4e 20 52 4f 57 49  ABLE COLUMN ROWI
eca0: 44 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  D.  */.  case DB
ecb0: 5f 49 4e 43 52 42 4c 4f 42 3a 20 7b 0a 23 69 66  _INCRBLOB: {.#if
ecc0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ecd0: 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 54 63 6c  INCRBLOB.    Tcl
ece0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
ecf0: 74 65 72 70 2c 20 22 69 6e 63 72 62 6c 6f 62 20  terp, "incrblob 
ed00: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 69 6e  not available in
ed10: 20 74 68 69 73 20 62 75 69 6c 64 22 2c 20 30 29   this build", 0)
ed20: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
ed30: 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20  _ERROR;.#else.  
ed40: 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79    int isReadonly
ed50: 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   = 0;.    const 
ed60: 63 68 61 72 20 2a 7a 44 62 20 3d 20 22 6d 61 69  char *zDb = "mai
ed70: 6e 22 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  n";.    const ch
ed80: 61 72 20 2a 7a 54 61 62 6c 65 3b 0a 20 20 20 20  ar *zTable;.    
ed90: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
eda0: 75 6d 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 5f  umn;.    sqlite_
edb0: 69 6e 74 36 34 20 69 52 6f 77 3b 0a 0a 20 20 20  int64 iRow;..   
edc0: 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 74 68   /* Check for th
edd0: 65 20 2d 72 65 61 64 6f 6e 6c 79 20 6f 70 74 69  e -readonly opti
ede0: 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 62  on */.    if( ob
edf0: 6a 63 3e 33 20 26 26 20 73 74 72 63 6d 70 28 54  jc>3 && strcmp(T
ee00: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
ee10: 76 5b 32 5d 29 2c 20 22 2d 72 65 61 64 6f 6e 6c  v[2]), "-readonl
ee20: 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  y")==0 ){.      
ee30: 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a  isReadonly = 1;.
ee40: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f      }..    if( o
ee50: 62 6a 63 21 3d 28 35 2b 69 73 52 65 61 64 6f 6e  bjc!=(5+isReadon
ee60: 6c 79 29 20 26 26 20 6f 62 6a 63 21 3d 28 36 2b  ly) && objc!=(6+
ee70: 69 73 52 65 61 64 6f 6e 6c 79 29 20 29 7b 0a 20  isReadonly) ){. 
ee80: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
ee90: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
eea0: 20 6f 62 6a 76 2c 20 22 3f 2d 72 65 61 64 6f 6e   objv, "?-readon
eeb0: 6c 79 3f 20 3f 44 42 3f 20 54 41 42 4c 45 20 43  ly? ?DB? TABLE C
eec0: 4f 4c 55 4d 4e 20 52 4f 57 49 44 22 29 3b 0a 20  OLUMN ROWID");. 
eed0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
eee0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
eef0: 20 20 69 66 28 20 6f 62 6a 63 3d 3d 28 36 2b 69    if( objc==(6+i
ef00: 73 52 65 61 64 6f 6e 6c 79 29 20 29 7b 0a 20 20  sReadonly) ){.  
ef10: 20 20 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65      zDb = Tcl_Ge
ef20: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
ef30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 54 61 62  ;.    }.    zTab
ef40: 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  le = Tcl_GetStri
ef50: 6e 67 28 6f 62 6a 76 5b 6f 62 6a 63 2d 33 5d 29  ng(objv[objc-3])
ef60: 3b 0a 20 20 20 20 7a 43 6f 6c 75 6d 6e 20 3d 20  ;.    zColumn = 
ef70: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
ef80: 6a 76 5b 6f 62 6a 63 2d 32 5d 29 3b 0a 20 20 20  jv[objc-2]);.   
ef90: 20 72 63 20 3d 20 54 63 6c 5f 47 65 74 57 69 64   rc = Tcl_GetWid
efa0: 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  eIntFromObj(inte
efb0: 72 70 2c 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d  rp, objv[objc-1]
efc0: 2c 20 26 69 52 6f 77 29 3b 0a 0a 20 20 20 20 69  , &iRow);..    i
efd0: 66 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b  f( rc==TCL_OK ){
efe0: 0a 20 20 20 20 20 20 72 63 20 3d 20 63 72 65 61  .      rc = crea
eff0: 74 65 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65  teIncrblobChanne
f000: 6c 28 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  l(.          int
f010: 65 72 70 2c 20 70 44 62 2c 20 7a 44 62 2c 20 7a  erp, pDb, zDb, z
f020: 54 61 62 6c 65 2c 20 7a 43 6f 6c 75 6d 6e 2c 20  Table, zColumn, 
f030: 69 52 6f 77 2c 20 69 73 52 65 61 64 6f 6e 6c 79  iRow, isReadonly
f040: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
f050: 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b  #endif.    break
f060: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
f070: 20 20 20 20 20 24 64 62 20 69 6e 74 65 72 72 75       $db interru
f080: 70 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 74  pt.  **.  ** Int
f090: 65 72 72 75 70 74 20 74 68 65 20 65 78 65 63 75  errupt the execu
f0a0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 69 6e 6e 65  tion of the inne
f0b0: 72 2d 6d 6f 73 74 20 53 51 4c 20 69 6e 74 65 72  r-most SQL inter
f0c0: 70 72 65 74 65 72 2e 20 20 54 68 69 73 0a 20 20  preter.  This.  
f0d0: 2a 2a 20 63 61 75 73 65 73 20 74 68 65 20 53 51  ** causes the SQ
f0e0: 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 72  L statement to r
f0f0: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 6f  eturn an error o
f100: 66 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  f SQLITE_INTERRU
f110: 50 54 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  PT..  */.  case 
f120: 44 42 5f 49 4e 54 45 52 52 55 50 54 3a 20 7b 0a  DB_INTERRUPT: {.
f130: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 65      sqlite3_inte
f140: 72 72 75 70 74 28 70 44 62 2d 3e 64 62 29 3b 0a  rrupt(pDb->db);.
f150: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
f160: 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64    /*.  **     $d
f170: 62 20 6e 75 6c 6c 76 61 6c 75 65 20 3f 53 54 52  b nullvalue ?STR
f180: 49 4e 47 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43  ING?.  **.  ** C
f190: 68 61 6e 67 65 20 74 65 78 74 20 75 73 65 64 20  hange text used 
f1a0: 77 68 65 6e 20 61 20 4e 55 4c 4c 20 63 6f 6d 65  when a NULL come
f1b0: 73 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  s back from the 
f1c0: 64 61 74 61 62 61 73 65 2e 20 49 66 20 3f 53 54  database. If ?ST
f1d0: 52 49 4e 47 3f 0a 20 20 2a 2a 20 69 73 20 6e 6f  RING?.  ** is no
f1e0: 74 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20  t present, then 
f1f0: 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 72 69  the current stri
f200: 6e 67 20 75 73 65 64 20 66 6f 72 20 4e 55 4c 4c  ng used for NULL
f210: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20   is returned..  
f220: 2a 2a 20 49 66 20 53 54 52 49 4e 47 20 69 73 20  ** If STRING is 
f230: 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 53 54  present, then ST
f240: 52 49 4e 47 20 69 73 20 72 65 74 75 72 6e 65 64  RING is returned
f250: 2e 0a 20 20 2a 2a 0a 20 20 2a 2f 0a 20 20 63 61  ..  **.  */.  ca
f260: 73 65 20 44 42 5f 4e 55 4c 4c 56 41 4c 55 45 3a  se DB_NULLVALUE:
f270: 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21   {.    if( objc!
f280: 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b  =2 && objc!=3 ){
f290: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
f2a0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
f2b0: 32 2c 20 6f 62 6a 76 2c 20 22 4e 55 4c 4c 56 41  2, objv, "NULLVA
f2c0: 4c 55 45 22 29 3b 0a 20 20 20 20 20 20 72 65 74  LUE");.      ret
f2d0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
f2e0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a     }.    if( obj
f2f0: 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 69 6e  c==3 ){.      in
f300: 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 63 68 61  t len;.      cha
f310: 72 20 2a 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 47  r *zNull = Tcl_G
f320: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
f330: 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a  objv[2], &len);.
f340: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
f350: 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Null ){.        
f360: 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 4e  Tcl_Free(pDb->zN
f370: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ull);.      }.  
f380: 20 20 20 20 69 66 28 20 7a 4e 75 6c 6c 20 26 26      if( zNull &&
f390: 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20   len>0 ){.      
f3a0: 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 3d 20 54    pDb->zNull = T
f3b0: 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20  cl_Alloc( len + 
f3c0: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 73 74 72  1 );.        str
f3d0: 6e 63 70 79 28 70 44 62 2d 3e 7a 4e 75 6c 6c 2c  ncpy(pDb->zNull,
f3e0: 20 7a 4e 75 6c 6c 2c 20 6c 65 6e 29 3b 0a 20 20   zNull, len);.  
f3f0: 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c        pDb->zNull
f400: 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  [len] = '\0';.  
f410: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f420: 20 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 3d 20     pDb->zNull = 
f430: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
f440: 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
f450: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 64 62  esult(interp, db
f460: 54 65 78 74 54 6f 4f 62 6a 28 70 44 62 2d 3e 7a  TextToObj(pDb->z
f470: 4e 75 6c 6c 29 29 3b 0a 20 20 20 20 62 72 65 61  Null));.    brea
f480: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
f490: 2a 20 20 20 20 20 24 64 62 20 6c 61 73 74 5f 69  *     $db last_i
f4a0: 6e 73 65 72 74 5f 72 6f 77 69 64 20 0a 20 20 2a  nsert_rowid .  *
f4b0: 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 61 6e  *.  ** Return an
f4c0: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
f4d0: 73 20 74 68 65 20 52 4f 57 49 44 20 66 6f 72 20  s the ROWID for 
f4e0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
f4f0: 69 6e 73 65 72 74 2e 0a 20 20 2a 2f 0a 20 20 63  insert..  */.  c
f500: 61 73 65 20 44 42 5f 4c 41 53 54 5f 49 4e 53 45  ase DB_LAST_INSE
f510: 52 54 5f 52 4f 57 49 44 3a 20 7b 0a 20 20 20 20  RT_ROWID: {.    
f520: 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74  Tcl_Obj *pResult
f530: 3b 0a 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e  ;.    Tcl_WideIn
f540: 74 20 72 6f 77 69 64 3b 0a 20 20 20 20 69 66 28  t rowid;.    if(
f550: 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
f560: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
f570: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
f580: 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 72  jv, "");.      r
f590: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
f5a0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 6f 77 69 64  .    }.    rowid
f5b0: 20 3d 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f   = sqlite3_last_
f5c0: 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 70 44 62  insert_rowid(pDb
f5d0: 2d 3e 64 62 29 3b 0a 20 20 20 20 70 52 65 73 75  ->db);.    pResu
f5e0: 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52  lt = Tcl_GetObjR
f5f0: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
f600: 20 20 20 54 63 6c 5f 53 65 74 57 69 64 65 49 6e     Tcl_SetWideIn
f610: 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 72 6f  tObj(pResult, ro
f620: 77 69 64 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  wid);.    break;
f630: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
f640: 54 68 65 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e  The DB_ONECOLUMN
f650: 20 6d 65 74 68 6f 64 20 69 73 20 69 6d 70 6c 65   method is imple
f660: 6d 65 6e 74 65 64 20 74 6f 67 65 74 68 65 72 20  mented together 
f670: 77 69 74 68 20 44 42 5f 45 56 41 4c 2e 0a 20 20  with DB_EVAL..  
f680: 2a 2f 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20  */..  /*    $db 
f690: 70 72 6f 67 72 65 73 73 20 3f 4e 20 43 41 4c 4c  progress ?N CALL
f6a0: 42 41 43 4b 3f 0a 20 20 2a 2a 20 0a 20 20 2a 2a  BACK?.  ** .  **
f6b0: 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65   Invoke the give
f6c0: 6e 20 63 61 6c 6c 62 61 63 6b 20 65 76 65 72 79  n callback every
f6d0: 20 4e 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69   N virtual machi
f6e0: 6e 65 20 6f 70 63 6f 64 65 73 20 77 68 69 6c 65  ne opcodes while
f6f0: 20 65 78 65 63 75 74 69 6e 67 0a 20 20 2a 2a 20   executing.  ** 
f700: 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20  queries..  */.  
f710: 63 61 73 65 20 44 42 5f 50 52 4f 47 52 45 53 53  case DB_PROGRESS
f720: 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  : {.    if( objc
f730: 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==2 ){.      if(
f740: 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20   pDb->zProgress 
f750: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41  ){.        Tcl_A
f760: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
f770: 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65  rp, pDb->zProgre
f780: 73 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ss, 0);.      }.
f790: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62      }else if( ob
f7a0: 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 63  jc==4 ){.      c
f7b0: 68 61 72 20 2a 7a 50 72 6f 67 72 65 73 73 3b 0a  har *zProgress;.
f7c0: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20        int len;. 
f7d0: 20 20 20 20 20 69 6e 74 20 4e 3b 0a 20 20 20 20       int N;.    
f7e0: 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63    if( TCL_OK!=Tc
f7f0: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
f800: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
f810: 20 26 4e 29 20 29 7b 0a 20 20 20 20 20 20 20 20   &N) ){.        
f820: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
f830: 3b 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20  ;.      };.     
f840: 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72   if( pDb->zProgr
f850: 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20 54  ess ){.        T
f860: 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 50 72  cl_Free(pDb->zPr
f870: 6f 67 72 65 73 73 29 3b 0a 20 20 20 20 20 20 7d  ogress);.      }
f880: 0a 20 20 20 20 20 20 7a 50 72 6f 67 72 65 73 73  .      zProgress
f890: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
f8a0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c  FromObj(objv[3],
f8b0: 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66   &len);.      if
f8c0: 28 20 7a 50 72 6f 67 72 65 73 73 20 26 26 20 6c  ( zProgress && l
f8d0: 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  en>0 ){.        
f8e0: 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 3d  pDb->zProgress =
f8f0: 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20   Tcl_Alloc( len 
f900: 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d  + 1 );.        m
f910: 65 6d 63 70 79 28 70 44 62 2d 3e 7a 50 72 6f 67  emcpy(pDb->zProg
f920: 72 65 73 73 2c 20 7a 50 72 6f 67 72 65 73 73 2c  ress, zProgress,
f930: 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d   len+1);.      }
f940: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44  else{.        pD
f950: 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 3d 20 30  b->zProgress = 0
f960: 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
f970: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52  f SQLITE_OMIT_PR
f980: 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a  OGRESS_CALLBACK.
f990: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
f9a0: 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20  Progress ){.    
f9b0: 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20      pDb->interp 
f9c0: 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20  = interp;.      
f9d0: 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65    sqlite3_progre
f9e0: 73 73 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e  ss_handler(pDb->
f9f0: 64 62 2c 20 4e 2c 20 44 62 50 72 6f 67 72 65 73  db, N, DbProgres
fa00: 73 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a  sHandler, pDb);.
fa10: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
fa20: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f       sqlite3_pro
fa30: 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 70 44  gress_handler(pD
fa40: 62 2d 3e 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b  b->db, 0, 0, 0);
fa50: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
fa60: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
fa70: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
fa80: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
fa90: 76 2c 20 22 4e 20 43 41 4c 4c 42 41 43 4b 22 29  v, "N CALLBACK")
faa0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
fab0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
fac0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
fad0: 20 20 2f 2a 20 20 20 20 24 64 62 20 70 72 6f 66    /*    $db prof
fae0: 69 6c 65 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20  ile ?CALLBACK?. 
faf0: 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 61 72   **.  ** Make ar
fb00: 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20 69 6e  rangements to in
fb10: 76 6f 6b 65 20 74 68 65 20 43 41 4c 4c 42 41 43  voke the CALLBAC
fb20: 4b 20 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20  K routine after 
fb30: 65 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65  each SQL stateme
fb40: 6e 74 0a 20 20 2a 2a 20 74 68 61 74 20 68 61 73  nt.  ** that has
fb50: 20 72 75 6e 2e 20 20 54 68 65 20 74 65 78 74 20   run.  The text 
fb60: 6f 66 20 74 68 65 20 53 51 4c 20 61 6e 64 20 74  of the SQL and t
fb70: 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 65 6c 61  he amount of ela
fb80: 70 73 65 20 74 69 6d 65 20 61 72 65 0a 20 20 2a  pse time are.  *
fb90: 2a 20 61 70 70 65 6e 64 65 64 20 74 6f 20 43 41  * appended to CA
fba0: 4c 4c 42 41 43 4b 20 62 65 66 6f 72 65 20 74 68  LLBACK before th
fbb0: 65 20 73 63 72 69 70 74 20 69 73 20 72 75 6e 2e  e script is run.
fbc0: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
fbd0: 50 52 4f 46 49 4c 45 3a 20 7b 0a 20 20 20 20 69  PROFILE: {.    i
fbe0: 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20  f( objc>3 ){.   
fbf0: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
fc00: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
fc10: 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f  bjv, "?CALLBACK?
fc20: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
fc30: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
fc40: 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d  }else if( objc==
fc50: 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  2 ){.      if( p
fc60: 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a  Db->zProfile ){.
fc70: 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
fc80: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
fc90: 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20   pDb->zProfile, 
fca0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
fcb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61  }else{.      cha
fcc0: 72 20 2a 7a 50 72 6f 66 69 6c 65 3b 0a 20 20 20  r *zProfile;.   
fcd0: 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
fce0: 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66    if( pDb->zProf
fcf0: 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54  ile ){.        T
fd00: 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 50 72  cl_Free(pDb->zPr
fd10: 6f 66 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a  ofile);.      }.
fd20: 20 20 20 20 20 20 7a 50 72 6f 66 69 6c 65 20 3d        zProfile =
fd30: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
fd40: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26  omObj(objv[2], &
fd50: 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  len);.      if( 
fd60: 7a 50 72 6f 66 69 6c 65 20 26 26 20 6c 65 6e 3e  zProfile && len>
fd70: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  0 ){.        pDb
fd80: 2d 3e 7a 50 72 6f 66 69 6c 65 20 3d 20 54 63 6c  ->zProfile = Tcl
fd90: 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20  _Alloc( len + 1 
fda0: 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  );.        memcp
fdb0: 79 28 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c  y(pDb->zProfile,
fdc0: 20 7a 50 72 6f 66 69 6c 65 2c 20 6c 65 6e 2b 31   zProfile, len+1
fdd0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
fde0: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50 72          pDb->zPr
fdf0: 6f 66 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20  ofile = 0;.     
fe00: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
fe10: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 20  E_OMIT_TRACE.   
fe20: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f     if( pDb->zPro
fe30: 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  file ){.        
fe40: 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e  pDb->interp = in
fe50: 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71  terp;.        sq
fe60: 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 70 44  lite3_profile(pD
fe70: 62 2d 3e 64 62 2c 20 44 62 50 72 6f 66 69 6c 65  b->db, DbProfile
fe80: 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20  Handler, pDb);. 
fe90: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
fea0: 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 66      sqlite3_prof
feb0: 69 6c 65 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20  ile(pDb->db, 0, 
fec0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  0);.      }.#end
fed0: 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  if.    }.    bre
fee0: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
fef0: 2a 2a 20 20 20 20 20 24 64 62 20 72 65 6b 65 79  **     $db rekey
ff00: 20 4b 45 59 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43   KEY.  **.  ** C
ff10: 68 61 6e 67 65 20 74 68 65 20 65 6e 63 72 79 70  hange the encryp
ff20: 74 69 6f 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20  tion key on the 
ff30: 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 64  currently open d
ff40: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
ff50: 63 61 73 65 20 44 42 5f 52 45 4b 45 59 3a 20 7b  case DB_REKEY: {
ff60: 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20  .    int nKey;. 
ff70: 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 3b 0a 20     void *pKey;. 
ff80: 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29     if( objc!=3 )
ff90: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
ffa0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
ffb0: 20 32 2c 20 6f 62 6a 76 2c 20 22 4b 45 59 22 29   2, objv, "KEY")
ffc0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
ffd0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
ffe0: 20 20 20 20 70 4b 65 79 20 3d 20 54 63 6c 5f 47      pKey = Tcl_G
fff0: 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f  etByteArrayFromO
10000 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6e 4b 65  bj(objv[2], &nKe
10010 79 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  y);.#ifdef SQLIT
10020 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20  E_HAS_CODEC.    
10030 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 6b  rc = sqlite3_rek
10040 65 79 28 70 44 62 2d 3e 64 62 2c 20 70 4b 65 79  ey(pDb->db, pKey
10050 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20 69 66 28  , nKey);.    if(
10060 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c   rc ){.      Tcl
10070 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
10080 74 65 72 70 2c 20 73 71 6c 69 74 65 33 45 72 72  terp, sqlite3Err
10090 53 74 72 28 72 63 29 2c 20 30 29 3b 0a 20 20 20  Str(rc), 0);.   
100a0 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f     rc = TCL_ERRO
100b0 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  R;.    }.#endif.
100c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
100d0 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64    /*.  **     $d
100e0 62 20 74 69 6d 65 6f 75 74 20 4d 49 4c 4c 45 53  b timeout MILLES
100f0 45 43 4f 4e 44 53 0a 20 20 2a 2a 0a 20 20 2a 2a  ECONDS.  **.  **
10100 20 44 65 6c 61 79 20 66 6f 72 20 74 68 65 20 6e   Delay for the n
10110 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65  umber of millise
10120 63 6f 6e 64 73 20 73 70 65 63 69 66 69 65 64 20  conds specified 
10130 77 68 65 6e 20 61 20 66 69 6c 65 20 69 73 20 6c  when a file is l
10140 6f 63 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61  ocked..  */.  ca
10150 73 65 20 44 42 5f 54 49 4d 45 4f 55 54 3a 20 7b  se DB_TIMEOUT: {
10160 0a 20 20 20 20 69 6e 74 20 6d 73 3b 0a 20 20 20  .    int ms;.   
10170 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
10180 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
10190 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
101a0 2c 20 6f 62 6a 76 2c 20 22 4d 49 4c 4c 49 53 45  , objv, "MILLISE
101b0 43 4f 4e 44 53 22 29 3b 0a 20 20 20 20 20 20 72  CONDS");.      r
101c0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
101d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 54  .    }.    if( T
101e0 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
101f0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
10200 2c 20 26 6d 73 29 20 29 20 72 65 74 75 72 6e 20  , &ms) ) return 
10210 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73  TCL_ERROR;.    s
10220 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65  qlite3_busy_time
10230 6f 75 74 28 70 44 62 2d 3e 64 62 2c 20 6d 73 29  out(pDb->db, ms)
10240 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
10250 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20  .  .  /*.  **   
10260 20 20 24 64 62 20 74 6f 74 61 6c 5f 63 68 61 6e    $db total_chan
10270 67 65 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  ges.  **.  ** Re
10280 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
10290 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 65 72  of rows that wer
102a0 65 20 6d 6f 64 69 66 69 65 64 2c 20 69 6e 73 65  e modified, inse
102b0 72 74 65 64 2c 20 6f 72 20 64 65 6c 65 74 65 64  rted, or deleted
102c0 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65   .  ** since the
102d0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
102e0 20 77 61 73 20 63 72 65 61 74 65 64 2e 0a 20 20   was created..  
102f0 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54 4f 54  */.  case DB_TOT
10300 41 4c 5f 43 48 41 4e 47 45 53 3a 20 7b 0a 20 20  AL_CHANGES: {.  
10310 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75    Tcl_Obj *pResu
10320 6c 74 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  lt;.    if( objc
10330 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=2 ){.      Tcl
10340 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
10350 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
10360 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
10370 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
10380 7d 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20  }.    pResult = 
10390 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_GetObjResult
103a0 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63  (interp);.    Tc
103b0 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52 65 73  l_SetIntObj(pRes
103c0 75 6c 74 2c 20 73 71 6c 69 74 65 33 5f 74 6f 74  ult, sqlite3_tot
103d0 61 6c 5f 63 68 61 6e 67 65 73 28 70 44 62 2d 3e  al_changes(pDb->
103e0 64 62 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  db));.    break;
103f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
10400 62 20 74 72 61 63 65 20 3f 43 41 4c 4c 42 41 43  b trace ?CALLBAC
10410 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b  K?.  **.  ** Mak
10420 65 20 61 72 72 61 6e 67 65 6d 65 6e 74 73 20 74  e arrangements t
10430 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 43 41 4c  o invoke the CAL
10440 4c 42 41 43 4b 20 72 6f 75 74 69 6e 65 20 66 6f  LBACK routine fo
10450 72 20 65 61 63 68 20 53 51 4c 20 73 74 61 74 65  r each SQL state
10460 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 61 74 20 69  ment.  ** that i
10470 73 20 65 78 65 63 75 74 65 64 2e 20 20 54 68 65  s executed.  The
10480 20 74 65 78 74 20 6f 66 20 74 68 65 20 53 51 4c   text of the SQL
10490 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20   is appended to 
104a0 43 41 4c 4c 42 41 43 4b 20 62 65 66 6f 72 65 0a  CALLBACK before.
104b0 20 20 2a 2a 20 69 74 20 69 73 20 65 78 65 63 75    ** it is execu
104c0 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ted..  */.  case
104d0 20 44 42 5f 54 52 41 43 45 3a 20 7b 0a 20 20 20   DB_TRACE: {.   
104e0 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20   if( objc>3 ){. 
104f0 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
10500 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
10510 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43   objv, "?CALLBAC
10520 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  K?");.      retu
10530 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
10540 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63    }else if( objc
10550 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==2 ){.      if(
10560 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a   pDb->zTrace ){.
10570 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
10580 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
10590 20 70 44 62 2d 3e 7a 54 72 61 63 65 2c 20 30 29   pDb->zTrace, 0)
105a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
105b0 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20  lse{.      char 
105c0 2a 7a 54 72 61 63 65 3b 0a 20 20 20 20 20 20 69  *zTrace;.      i
105d0 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66  nt len;.      if
105e0 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b  ( pDb->zTrace ){
105f0 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65  .        Tcl_Fre
10600 65 28 70 44 62 2d 3e 7a 54 72 61 63 65 29 3b 0a  e(pDb->zTrace);.
10610 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54        }.      zT
10620 72 61 63 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  race = Tcl_GetSt
10630 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
10640 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20  [2], &len);.    
10650 20 20 69 66 28 20 7a 54 72 61 63 65 20 26 26 20    if( zTrace && 
10660 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  len>0 ){.       
10670 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 3d 20 54   pDb->zTrace = T
10680 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20  cl_Alloc( len + 
10690 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  1 );.        mem
106a0 63 70 79 28 70 44 62 2d 3e 7a 54 72 61 63 65 2c  cpy(pDb->zTrace,
106b0 20 7a 54 72 61 63 65 2c 20 6c 65 6e 2b 31 29 3b   zTrace, len+1);
106c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
106d0 20 20 20 20 20 20 70 44 62 2d 3e 7a 54 72 61 63        pDb->zTrac
106e0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23  e = 0;.      }.#
106f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10700 49 54 5f 54 52 41 43 45 0a 20 20 20 20 20 20 69  IT_TRACE.      i
10710 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29  f( pDb->zTrace )
10720 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69  {.        pDb->i
10730 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a  nterp = interp;.
10740 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
10750 74 72 61 63 65 28 70 44 62 2d 3e 64 62 2c 20 44  trace(pDb->db, D
10760 62 54 72 61 63 65 48 61 6e 64 6c 65 72 2c 20 70  bTraceHandler, p
10770 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Db);.      }else
10780 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
10790 33 5f 74 72 61 63 65 28 70 44 62 2d 3e 64 62 2c  3_trace(pDb->db,
107a0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
107b0 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
107c0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
107d0 2a 20 20 20 20 24 64 62 20 74 72 61 6e 73 61 63  *    $db transac
107e0 74 69 6f 6e 20 5b 2d 64 65 66 65 72 72 65 64 7c  tion [-deferred|
107f0 2d 69 6d 6d 65 64 69 61 74 65 7c 2d 65 78 63 6c  -immediate|-excl
10800 75 73 69 76 65 5d 20 53 43 52 49 50 54 0a 20 20  usive] SCRIPT.  
10810 2a 2a 0a 20 20 2a 2a 20 53 74 61 72 74 20 61 20  **.  ** Start a 
10820 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  new transaction 
10830 28 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61  (if we are not a
10840 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6d 69  lready in the mi
10850 64 73 74 20 6f 66 20 61 0a 20 20 2a 2a 20 74 72  dst of a.  ** tr
10860 61 6e 73 61 63 74 69 6f 6e 29 20 61 6e 64 20 65  ansaction) and e
10870 78 65 63 75 74 65 20 74 68 65 20 54 43 4c 20 73  xecute the TCL s
10880 63 72 69 70 74 20 53 43 52 49 50 54 2e 20 20 41  cript SCRIPT.  A
10890 66 74 65 72 20 53 43 52 49 50 54 0a 20 20 2a 2a  fter SCRIPT.  **
108a0 20 63 6f 6d 70 6c 65 74 65 73 2c 20 65 69 74 68   completes, eith
108b0 65 72 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72  er commit the tr
108c0 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 72 6f 6c  ansaction or rol
108d0 6c 20 69 74 20 62 61 63 6b 20 69 66 20 53 43 52  l it back if SCR
108e0 49 50 54 0a 20 20 2a 2a 20 74 68 72 6f 77 73 20  IPT.  ** throws 
108f0 61 6e 20 65 78 63 65 70 74 69 6f 6e 2e 20 20 4f  an exception.  O
10900 72 20 69 66 20 6e 6f 20 6e 65 77 20 74 72 61 6e  r if no new tran
10910 73 61 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74  sation was start
10920 65 64 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a  ed, do nothing..
10930 20 20 2a 2a 20 70 61 73 73 20 74 68 65 20 65 78    ** pass the ex
10940 63 65 70 74 69 6f 6e 20 6f 6e 20 75 70 20 74 68  ception on up th
10950 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20  e stack..  **.  
10960 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ** This command 
10970 77 61 73 20 69 6e 73 70 69 72 65 64 20 62 79 20  was inspired by 
10980 44 61 76 65 20 54 68 6f 6d 61 73 27 73 20 74 61  Dave Thomas's ta
10990 6c 6b 20 6f 6e 20 52 75 62 79 20 61 74 20 74 68  lk on Ruby at th
109a0 65 0a 20 20 2a 2a 20 32 30 30 35 20 4f 27 52 65  e.  ** 2005 O'Re
109b0 69 6c 6c 79 20 4f 70 65 6e 20 53 6f 75 72 63 65  illy Open Source
109c0 20 43 6f 6e 76 65 6e 74 69 6f 6e 20 28 4f 53 43   Convention (OSC
109d0 4f 4e 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ON)..  */.  case
109e0 20 44 42 5f 54 52 41 4e 53 41 43 54 49 4f 4e 3a   DB_TRANSACTION:
109f0 20 7b 0a 20 20 20 20 69 6e 74 20 69 6e 54 72 61   {.    int inTra
10a00 6e 73 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  ns;.    Tcl_Obj 
10a10 2a 70 53 63 72 69 70 74 3b 0a 20 20 20 20 63 6f  *pScript;.    co
10a20 6e 73 74 20 63 68 61 72 20 2a 7a 42 65 67 69 6e  nst char *zBegin
10a30 20 3d 20 22 42 45 47 49 4e 22 3b 0a 20 20 20 20   = "BEGIN";.    
10a40 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26 20 6f  if( objc!=3 && o
10a50 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20  bjc!=4 ){.      
10a60 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
10a70 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
10a80 2c 20 22 5b 54 59 50 45 5d 20 53 43 52 49 50 54  , "[TYPE] SCRIPT
10a90 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
10aa0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
10ab0 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d  }.    if( objc==
10ac0 33 20 29 7b 0a 20 20 20 20 20 20 70 53 63 72 69  3 ){.      pScri
10ad0 70 74 20 3d 20 6f 62 6a 76 5b 32 5d 3b 0a 20 20  pt = objv[2];.  
10ae0 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
10af0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
10b00 61 72 20 2a 54 54 59 50 45 5f 73 74 72 73 5b 5d  ar *TTYPE_strs[]
10b10 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 22 64 65   = {.        "de
10b20 66 65 72 72 65 64 22 2c 20 20 20 22 65 78 63 6c  ferred",   "excl
10b30 75 73 69 76 65 22 2c 20 20 22 69 6d 6d 65 64 69  usive",  "immedi
10b40 61 74 65 22 2c 20 30 0a 20 20 20 20 20 20 7d 3b  ate", 0.      };
10b50 0a 20 20 20 20 20 20 65 6e 75 6d 20 54 54 59 50  .      enum TTYP
10b60 45 5f 65 6e 75 6d 20 7b 0a 20 20 20 20 20 20 20  E_enum {.       
10b70 20 54 54 59 50 45 5f 44 45 46 45 52 52 45 44 2c   TTYPE_DEFERRED,
10b80 20 54 54 59 50 45 5f 45 58 43 4c 55 53 49 56 45   TTYPE_EXCLUSIVE
10b90 2c 20 54 54 59 50 45 5f 49 4d 4d 45 44 49 41 54  , TTYPE_IMMEDIAT
10ba0 45 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20  E.      };.     
10bb0 20 69 6e 74 20 74 74 79 70 65 3b 0a 20 20 20 20   int ttype;.    
10bc0 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 64    if( Tcl_GetInd
10bd0 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  exFromObj(interp
10be0 2c 20 6f 62 6a 76 5b 32 5d 2c 20 54 54 59 50 45  , objv[2], TTYPE
10bf0 5f 73 74 72 73 2c 20 22 74 72 61 6e 73 61 63 74  _strs, "transact
10c00 69 6f 6e 20 74 79 70 65 22 2c 0a 20 20 20 20 20  ion type",.     
10c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c20 20 20 20 20 20 20 20 20 20 30 2c 20 26 74 74 79           0, &tty
10c30 70 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pe) ){.        r
10c40 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10c50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
10c60 77 69 74 63 68 28 20 28 65 6e 75 6d 20 54 54 59  witch( (enum TTY
10c70 50 45 5f 65 6e 75 6d 29 74 74 79 70 65 20 29 7b  PE_enum)ttype ){
10c80 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 54 54  .        case TT
10c90 59 50 45 5f 44 45 46 45 52 52 45 44 3a 20 20 20  YPE_DEFERRED:   
10ca0 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 3b 20 20 20   /* no-op */;   
10cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
10cc0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
10cd0 65 20 54 54 59 50 45 5f 45 58 43 4c 55 53 49 56  e TTYPE_EXCLUSIV
10ce0 45 3a 20 20 20 7a 42 65 67 69 6e 20 3d 20 22 42  E:   zBegin = "B
10cf0 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45 22 3b  EGIN EXCLUSIVE";
10d00 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
10d10 20 63 61 73 65 20 54 54 59 50 45 5f 49 4d 4d 45   case TTYPE_IMME
10d20 44 49 41 54 45 3a 20 20 20 7a 42 65 67 69 6e 20  DIATE:   zBegin 
10d30 3d 20 22 42 45 47 49 4e 20 49 4d 4d 45 44 49 41  = "BEGIN IMMEDIA
10d40 54 45 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  TE";  break;.   
10d50 20 20 20 7d 0a 20 20 20 20 20 20 70 53 63 72 69     }.      pScri
10d60 70 74 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20  pt = objv[3];.  
10d70 20 20 7d 0a 20 20 20 20 69 6e 54 72 61 6e 73 20    }.    inTrans 
10d80 3d 20 21 73 71 6c 69 74 65 33 5f 67 65 74 5f 61  = !sqlite3_get_a
10d90 75 74 6f 63 6f 6d 6d 69 74 28 70 44 62 2d 3e 64  utocommit(pDb->d
10da0 62 29 3b 0a 20 20 20 20 69 66 28 20 21 69 6e 54  b);.    if( !inT
10db0 72 61 6e 73 20 29 7b 0a 20 20 20 20 20 20 28 76  rans ){.      (v
10dc0 6f 69 64 29 73 71 6c 69 74 65 33 5f 65 78 65 63  oid)sqlite3_exec
10dd0 28 70 44 62 2d 3e 64 62 2c 20 7a 42 65 67 69 6e  (pDb->db, zBegin
10de0 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
10df0 7d 0a 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 45  }.    rc = Tcl_E
10e00 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c  valObjEx(interp,
10e10 20 70 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20   pScript, 0);.  
10e20 20 20 69 66 28 20 21 69 6e 54 72 61 6e 73 20 29    if( !inTrans )
10e30 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
10e40 61 72 20 2a 7a 45 6e 64 3b 0a 20 20 20 20 20 20  ar *zEnd;.      
10e50 69 66 28 20 72 63 3d 3d 54 43 4c 5f 45 52 52 4f  if( rc==TCL_ERRO
10e60 52 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 45 6e  R ){.        zEn
10e70 64 20 3d 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a  d = "ROLLBACK";.
10e80 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
10e90 20 20 20 20 20 20 20 7a 45 6e 64 20 3d 20 22 43         zEnd = "C
10ea0 4f 4d 4d 49 54 22 3b 0a 20 20 20 20 20 20 7d 0a  OMMIT";.      }.
10eb0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
10ec0 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20  3_exec(pDb->db, 
10ed0 7a 45 6e 64 2c 20 30 2c 20 30 2c 20 30 29 20 29  zEnd, 0, 0, 0) )
10ee0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
10ef0 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20  3_exec(pDb->db, 
10f00 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20 30  "ROLLBACK", 0, 0
10f10 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
10f20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
10f30 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
10f40 20 24 64 62 20 75 70 64 61 74 65 5f 68 6f 6f 6b   $db update_hook
10f50 20 3f 73 63 72 69 70 74 3f 0a 20 20 2a 2a 20 20   ?script?.  **  
10f60 20 20 24 64 62 20 72 6f 6c 6c 62 61 63 6b 5f 68    $db rollback_h
10f70 6f 6f 6b 20 3f 73 63 72 69 70 74 3f 0a 20 20 2a  ook ?script?.  *
10f80 2f 0a 20 20 63 61 73 65 20 44 42 5f 55 50 44 41  /.  case DB_UPDA
10f90 54 45 5f 48 4f 4f 4b 3a 20 0a 20 20 63 61 73 65  TE_HOOK: .  case
10fa0 20 44 42 5f 52 4f 4c 4c 42 41 43 4b 5f 48 4f 4f   DB_ROLLBACK_HOO
10fb0 4b 3a 20 7b 0a 0a 20 20 20 20 2f 2a 20 73 65 74  K: {..    /* set
10fc0 20 70 70 48 6f 6f 6b 20 74 6f 20 70 6f 69 6e 74   ppHook to point
10fd0 20 61 74 20 70 55 70 64 61 74 65 48 6f 6f 6b 20   at pUpdateHook 
10fe0 6f 72 20 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b  or pRollbackHook
10ff0 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 0a  , depending on .
11000 20 20 20 20 2a 2a 20 77 68 65 74 68 65 72 20 5b      ** whether [
11010 24 64 62 20 75 70 64 61 74 65 5f 68 6f 6f 6b 5d  $db update_hook]
11020 20 6f 72 20 5b 24 64 62 20 72 6f 6c 6c 62 61 63   or [$db rollbac
11030 6b 5f 68 6f 6f 6b 5d 20 77 61 73 20 69 6e 76 6f  k_hook] was invo
11040 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ked..    */.    
11050 54 63 6c 5f 4f 62 6a 20 2a 2a 70 70 48 6f 6f 6b  Tcl_Obj **ppHook
11060 3b 20 0a 20 20 20 20 69 66 28 20 63 68 6f 69 63  ; .    if( choic
11070 65 3d 3d 44 42 5f 55 50 44 41 54 45 5f 48 4f 4f  e==DB_UPDATE_HOO
11080 4b 20 29 7b 0a 20 20 20 20 20 20 70 70 48 6f 6f  K ){.      ppHoo
11090 6b 20 3d 20 26 70 44 62 2d 3e 70 55 70 64 61 74  k = &pDb->pUpdat
110a0 65 48 6f 6f 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  eHook;.    }else
110b0 7b 0a 20 20 20 20 20 20 70 70 48 6f 6f 6b 20 3d  {.      ppHook =
110c0 20 26 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b   &pDb->pRollback
110d0 48 6f 6f 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Hook;.    }..   
110e0 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20   if( objc!=2 && 
110f0 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20  objc!=3 ){.     
11100 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
11110 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
11120 6a 76 2c 20 22 3f 53 43 52 49 50 54 3f 22 29 3b  jv, "?SCRIPT?");
11130 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  .       return T
11140 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
11150 20 20 20 20 69 66 28 20 2a 70 70 48 6f 6f 6b 20      if( *ppHook 
11160 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  ){.      Tcl_Set
11170 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
11180 2c 20 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20  , *ppHook);.    
11190 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b    if( objc==3 ){
111a0 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63  .        Tcl_Dec
111b0 72 52 65 66 43 6f 75 6e 74 28 2a 70 70 48 6f 6f  rRefCount(*ppHoo
111c0 6b 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 48  k);.        *ppH
111d0 6f 6f 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ook = 0;.      }
111e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f  .    }.    if( o
111f0 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc==3 ){.      
11200 61 73 73 65 72 74 28 20 21 28 2a 70 70 48 6f 6f  assert( !(*ppHoo
11210 6b 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  k) );.      if( 
11220 54 63 6c 5f 47 65 74 43 68 61 72 4c 65 6e 67 74  Tcl_GetCharLengt
11230 68 28 6f 62 6a 76 5b 32 5d 29 3e 30 20 29 7b 0a  h(objv[2])>0 ){.
11240 20 20 20 20 20 20 20 20 2a 70 70 48 6f 6f 6b 20          *ppHook 
11250 3d 20 6f 62 6a 76 5b 32 5d 3b 0a 20 20 20 20 20  = objv[2];.     
11260 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
11270 75 6e 74 28 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20  unt(*ppHook);.  
11280 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
11290 20 73 71 6c 69 74 65 33 5f 75 70 64 61 74 65 5f   sqlite3_update_
112a0 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20 28 70  hook(pDb->db, (p
112b0 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 3f  Db->pUpdateHook?
112c0 44 62 55 70 64 61 74 65 48 61 6e 64 6c 65 72 3a  DbUpdateHandler:
112d0 30 29 2c 20 70 44 62 29 3b 0a 20 20 20 20 73 71  0), pDb);.    sq
112e0 6c 69 74 65 33 5f 72 6f 6c 6c 62 61 63 6b 5f 68  lite3_rollback_h
112f0 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 28 70 44 62  ook(pDb->db,(pDb
11300 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3f  ->pRollbackHook?
11310 44 62 52 6f 6c 6c 62 61 63 6b 48 61 6e 64 6c 65  DbRollbackHandle
11320 72 3a 30 29 2c 70 44 62 29 3b 0a 0a 20 20 20 20  r:0),pDb);..    
11330 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
11340 20 20 20 20 24 64 62 20 76 65 72 73 69 6f 6e 0a      $db version.
11350 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e    **.  ** Return
11360 20 74 68 65 20 76 65 72 73 69 6f 6e 20 73 74 72   the version str
11370 69 6e 67 20 66 6f 72 20 74 68 69 73 20 64 61 74  ing for this dat
11380 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61  abase..  */.  ca
11390 73 65 20 44 42 5f 56 45 52 53 49 4f 4e 3a 20 7b  se DB_VERSION: {
113a0 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
113b0 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
113c0 20 2a 29 73 71 6c 69 74 65 33 5f 6c 69 62 76 65   *)sqlite3_libve
113d0 72 73 69 6f 6e 28 29 2c 20 54 43 4c 5f 53 54 41  rsion(), TCL_STA
113e0 54 49 43 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  TIC);.    break;
113f0 0a 20 20 7d 0a 0a 0a 20 20 7d 20 2f 2a 20 45 6e  .  }...  } /* En
11400 64 20 6f 66 20 74 68 65 20 53 57 49 54 43 48 20  d of the SWITCH 
11410 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 72  statement */.  r
11420 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
11430 2a 2a 20 20 20 73 71 6c 69 74 65 33 20 44 42 4e  **   sqlite3 DBN
11440 41 4d 45 20 46 49 4c 45 4e 41 4d 45 20 3f 2d 76  AME FILENAME ?-v
11450 66 73 20 56 46 53 4e 41 4d 45 3f 20 3f 2d 6b 65  fs VFSNAME? ?-ke
11460 79 20 4b 45 59 3f 20 3f 2d 72 65 61 64 6f 6e 6c  y KEY? ?-readonl
11470 79 20 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a 20 20 20  y BOOLEAN?.**   
11480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11490 20 20 20 20 20 20 20 20 3f 2d 63 72 65 61 74 65          ?-create
114a0 20 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a 0a 2a 2a 20   BOOLEAN?.**.** 
114b0 54 68 69 73 20 69 73 20 74 68 65 20 6d 61 69 6e  This is the main
114c0 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 2e 20 20 57   Tcl command.  W
114d0 68 65 6e 20 74 68 65 20 22 73 71 6c 69 74 65 22  hen the "sqlite"
114e0 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 69 73 0a   Tcl command is.
114f0 2a 2a 20 69 6e 76 6f 6b 65 64 2c 20 74 68 69 73  ** invoked, this
11500 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20 74 6f   routine runs to
11510 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 6f   process that co
11520 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  mmand..**.** The
11530 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2c   first argument,
11540 20 44 42 4e 41 4d 45 2c 20 69 73 20 61 6e 20 61   DBNAME, is an a
11550 72 62 69 74 72 61 72 79 20 6e 61 6d 65 20 66 6f  rbitrary name fo
11560 72 20 61 20 6e 65 77 0a 2a 2a 20 64 61 74 61 62  r a new.** datab
11570 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  ase connection. 
11580 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 63 72   This command cr
11590 65 61 74 65 73 20 61 20 6e 65 77 20 63 6f 6d 6d  eates a new comm
115a0 61 6e 64 20 6e 61 6d 65 64 0a 2a 2a 20 44 42 4e  and named.** DBN
115b0 41 4d 45 20 74 68 61 74 20 69 73 20 75 73 65 64  AME that is used
115c0 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 61 74   to control that
115d0 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 54 68   connection.  Th
115e0 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  e database.** co
115f0 6e 6e 65 63 74 69 6f 6e 20 69 73 20 64 65 6c 65  nnection is dele
11600 74 65 64 20 77 68 65 6e 20 74 68 65 20 44 42 4e  ted when the DBN
11610 41 4d 45 20 63 6f 6d 6d 61 6e 64 20 69 73 20 64  AME command is d
11620 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  eleted..**.** Th
11630 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
11640 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  t is the name of
11650 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
11660 6c 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  le..**.*/.static
11670 20 69 6e 74 20 44 62 4d 61 69 6e 28 76 6f 69 64   int DbMain(void
11680 20 2a 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70   *cd, Tcl_Interp
11690 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62   *interp, int ob
116a0 6a 63 2c 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  jc,Tcl_Obj *cons
116b0 74 2a 6f 62 6a 76 29 7b 0a 20 20 53 71 6c 69 74  t*objv){.  Sqlit
116c0 65 44 62 20 2a 70 3b 0a 20 20 76 6f 69 64 20 2a  eDb *p;.  void *
116d0 70 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  pKey = 0;.  int 
116e0 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 63 6f 6e 73  nKey = 0;.  cons
116f0 74 20 63 68 61 72 20 2a 7a 41 72 67 3b 0a 20 20  t char *zArg;.  
11700 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 3b 0a 20  char *zErrMsg;. 
11710 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20   int i;.  const 
11720 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 63  char *zFile;.  c
11730 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20  onst char *zVfs 
11740 3d 20 30 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73  = 0;.  int flags
11750 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
11760 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54  EADWRITE | SQLIT
11770 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b 0a 20  E_OPEN_CREATE;. 
11780 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 74 72 61   Tcl_DString tra
11790 6e 73 6c 61 74 65 64 46 69 6c 65 6e 61 6d 65 3b  nslatedFilename;
117a0 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29  .  if( objc==2 )
117b0 7b 0a 20 20 20 20 7a 41 72 67 20 3d 20 54 63 6c  {.    zArg = Tcl
117c0 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
117d0 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20  j(objv[1], 0);. 
117e0 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41     if( strcmp(zA
117f0 72 67 2c 22 2d 76 65 72 73 69 6f 6e 22 29 3d 3d  rg,"-version")==
11800 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  0 ){.      Tcl_A
11810 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
11820 72 70 2c 73 71 6c 69 74 65 33 5f 76 65 72 73 69  rp,sqlite3_versi
11830 6f 6e 2c 30 29 3b 0a 20 20 20 20 20 20 72 65 74  on,0);.      ret
11840 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20  urn TCL_OK;.    
11850 7d 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  }.    if( strcmp
11860 28 7a 41 72 67 2c 22 2d 68 61 73 2d 63 6f 64 65  (zArg,"-has-code
11870 63 22 29 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66  c")==0 ){.#ifdef
11880 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
11890 43 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  C.      Tcl_Appe
118a0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
118b0 22 31 22 2c 30 29 3b 0a 23 65 6c 73 65 0a 20 20  "1",0);.#else.  
118c0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
118d0 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 30 22 2c  sult(interp,"0",
118e0 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  0);.#endif.     
118f0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
11900 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
11910 69 3d 33 3b 20 69 2b 31 3c 6f 62 6a 63 3b 20 69  i=3; i+1<objc; i
11920 2b 3d 32 29 7b 0a 20 20 20 20 7a 41 72 67 20 3d  +=2){.    zArg =
11930 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
11940 62 6a 76 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28  bjv[i]);.    if(
11950 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 6b   strcmp(zArg,"-k
11960 65 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ey")==0 ){.     
11970 20 70 4b 65 79 20 3d 20 54 63 6c 5f 47 65 74 42   pKey = Tcl_GetB
11980 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28  yteArrayFromObj(
11990 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 6e 4b 65 79  objv[i+1], &nKey
119a0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
119b0 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d   strcmp(zArg, "-
119c0 76 66 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  vfs")==0 ){.    
119d0 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7a 56 66    i++;.      zVf
119e0 73 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  s = Tcl_GetStrin
119f0 67 28 6f 62 6a 76 5b 69 5d 29 3b 0a 20 20 20 20  g(objv[i]);.    
11a00 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
11a10 28 7a 41 72 67 2c 20 22 2d 72 65 61 64 6f 6e 6c  (zArg, "-readonl
11a20 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  y")==0 ){.      
11a30 69 6e 74 20 62 3b 0a 20 20 20 20 20 20 69 66 28  int b;.      if(
11a40 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46   Tcl_GetBooleanF
11a50 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
11a60 62 6a 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20  bjv[i+1], &b) ) 
11a70 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
11a80 3b 0a 20 20 20 20 20 20 69 66 28 20 62 20 29 7b  ;.      if( b ){
11a90 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 26  .        flags &
11aa0 3d 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  = ~(SQLITE_OPEN_
11ab0 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
11ac0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20  _OPEN_CREATE);. 
11ad0 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20         flags |= 
11ae0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
11af0 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ONLY;.      }els
11b00 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  e{.        flags
11b10 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e   &= ~SQLITE_OPEN
11b20 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20  _READONLY;.     
11b30 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49     flags |= SQLI
11b40 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
11b50 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
11b60 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
11b70 7a 41 72 67 2c 20 22 2d 63 72 65 61 74 65 22 29  zArg, "-create")
11b80 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
11b90 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63   b;.      if( Tc
11ba0 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
11bb0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
11bc0 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20 72 65 74  [i+1], &b) ) ret
11bd0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
11be0 20 20 20 20 20 69 66 28 20 62 20 26 26 20 28 66       if( b && (f
11bf0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
11c00 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d 30 20  EN_READONLY)==0 
11c10 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  ){.        flags
11c20 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   |= SQLITE_OPEN_
11c30 43 52 45 41 54 45 3b 0a 20 20 20 20 20 20 7d 65  CREATE;.      }e
11c40 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 61  lse{.        fla
11c50 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50  gs &= ~SQLITE_OP
11c60 45 4e 5f 43 52 45 41 54 45 3b 0a 20 20 20 20 20  EN_CREATE;.     
11c70 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
11c80 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
11c90 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e  sult(interp, "un
11ca0 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 22 2c  known option: ",
11cb0 20 7a 41 72 67 2c 20 28 63 68 61 72 2a 29 30 29   zArg, (char*)0)
11cc0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
11cd0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
11ce0 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3c 33    }.  if( objc<3
11cf0 20 7c 7c 20 28 6f 62 6a 63 26 31 29 21 3d 31 20   || (objc&1)!=1 
11d00 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
11d10 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
11d20 31 2c 20 6f 62 6a 76 2c 20 0a 20 20 20 20 20 20  1, objv, .      
11d30 22 48 41 4e 44 4c 45 20 46 49 4c 45 4e 41 4d 45  "HANDLE FILENAME
11d40 20 3f 2d 76 66 73 20 56 46 53 4e 41 4d 45 3f 20   ?-vfs VFSNAME? 
11d50 3f 2d 72 65 61 64 6f 6e 6c 79 20 42 4f 4f 4c 45  ?-readonly BOOLE
11d60 41 4e 3f 20 3f 2d 63 72 65 61 74 65 20 42 4f 4f  AN? ?-create BOO
11d70 4c 45 41 4e 3f 22 0a 23 69 66 64 65 66 20 53 51  LEAN?".#ifdef SQ
11d80 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
11d90 20 20 20 20 20 22 20 3f 2d 6b 65 79 20 43 4f 44       " ?-key COD
11da0 45 43 4b 45 59 3f 22 0a 23 65 6e 64 69 66 0a 20  ECKEY?".#endif. 
11db0 20 20 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e     );.    return
11dc0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
11dd0 20 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20    zErrMsg = 0;. 
11de0 20 70 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29   p = (SqliteDb*)
11df0 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f  Tcl_Alloc( sizeo
11e00 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70  f(*p) );.  if( p
11e10 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53  ==0 ){.    Tcl_S
11e20 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
11e30 20 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 22   "malloc failed"
11e40 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
11e50 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
11e60 52 4f 52 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  ROR;.  }.  memse
11e70 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  t(p, 0, sizeof(*
11e80 70 29 29 3b 0a 20 20 7a 46 69 6c 65 20 3d 20 54  p));.  zFile = T
11e90 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
11ea0 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b  Obj(objv[2], 0);
11eb0 0a 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 54  .  zFile = Tcl_T
11ec0 72 61 6e 73 6c 61 74 65 46 69 6c 65 4e 61 6d 65  ranslateFileName
11ed0 28 69 6e 74 65 72 70 2c 20 7a 46 69 6c 65 2c 20  (interp, zFile, 
11ee0 26 74 72 61 6e 73 6c 61 74 65 64 46 69 6c 65 6e  &translatedFilen
11ef0 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ame);.  sqlite3_
11f00 6f 70 65 6e 5f 76 32 28 7a 46 69 6c 65 2c 20 26  open_v2(zFile, &
11f10 70 2d 3e 64 62 2c 20 66 6c 61 67 73 2c 20 7a 56  p->db, flags, zV
11f20 66 73 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  fs);.  Tcl_DStri
11f30 6e 67 46 72 65 65 28 26 74 72 61 6e 73 6c 61 74  ngFree(&translat
11f40 65 64 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69  edFilename);.  i
11f50 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
11f60 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70 2d  lite3_errcode(p-
11f70 3e 64 62 29 20 29 7b 0a 20 20 20 20 7a 45 72 72  >db) ){.    zErr
11f80 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Msg = sqlite3_mp
11f90 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69  rintf("%s", sqli
11fa0 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62  te3_errmsg(p->db
11fb0 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ));.    sqlite3_
11fc0 63 6c 6f 73 65 28 70 2d 3e 64 62 29 3b 0a 20 20  close(p->db);.  
11fd0 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 7d    p->db = 0;.  }
11fe0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
11ff0 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 70  AS_CODEC.  if( p
12000 2d 3e 64 62 20 29 7b 0a 20 20 20 20 73 71 6c 69  ->db ){.    sqli
12010 74 65 33 5f 6b 65 79 28 70 2d 3e 64 62 2c 20 70  te3_key(p->db, p
12020 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 7d 0a  Key, nKey);.  }.
12030 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e  #endif.  if( p->
12040 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c  db==0 ){.    Tcl
12050 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
12060 70 2c 20 7a 45 72 72 4d 73 67 2c 20 54 43 4c 5f  p, zErrMsg, TCL_
12070 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 54  VOLATILE);.    T
12080 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70  cl_Free((char*)p
12090 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
120a0 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ree(zErrMsg);.  
120b0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
120c0 4f 52 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 78  OR;.  }.  p->max
120d0 53 74 6d 74 20 3d 20 4e 55 4d 5f 50 52 45 50 41  Stmt = NUM_PREPA
120e0 52 45 44 5f 53 54 4d 54 53 3b 0a 20 20 70 2d 3e  RED_STMTS;.  p->
120f0 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b  interp = interp;
12100 0a 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65  .  zArg = Tcl_Ge
12110 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
12120 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 54 63  bjv[1], 0);.  Tc
12130 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
12140 6e 64 28 69 6e 74 65 72 70 2c 20 7a 41 72 67 2c  nd(interp, zArg,
12150 20 44 62 4f 62 6a 43 6d 64 2c 20 28 63 68 61 72   DbObjCmd, (char
12160 2a 29 70 2c 20 44 62 44 65 6c 65 74 65 43 6d 64  *)p, DbDeleteCmd
12170 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
12180 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f  OK;.}../*.** Pro
12190 76 69 64 65 20 61 20 64 75 6d 6d 79 20 54 63 6c  vide a dummy Tcl
121a0 5f 49 6e 69 74 53 74 75 62 73 20 69 66 20 77 65  _InitStubs if we
121b0 20 61 72 65 20 75 73 69 6e 67 20 74 68 69 73 20   are using this 
121c0 61 73 20 61 20 73 74 61 74 69 63 0a 2a 2a 20 6c  as a static.** l
121d0 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64  ibrary..*/.#ifnd
121e0 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53  ef USE_TCL_STUBS
121f0 0a 23 20 75 6e 64 65 66 20 20 54 63 6c 5f 49 6e  .# undef  Tcl_In
12200 69 74 53 74 75 62 73 0a 23 20 64 65 66 69 6e 65  itStubs.# define
12210 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 61   Tcl_InitStubs(a
12220 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ,b,c).#endif../*
12230 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65  .** Make sure we
12240 20 68 61 76 65 20 61 20 50 41 43 4b 41 47 45 5f   have a PACKAGE_
12250 56 45 52 53 49 4f 4e 20 6d 61 63 72 6f 20 64 65  VERSION macro de
12260 66 69 6e 65 64 2e 20 20 54 68 69 73 20 77 69 6c  fined.  This wil
12270 6c 20 62 65 0a 2a 2a 20 64 65 66 69 6e 65 64 20  l be.** defined 
12280 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 62 79  automatically by
12290 20 74 68 65 20 54 45 41 20 6d 61 6b 65 66 69 6c   the TEA makefil
122a0 65 2e 20 20 42 75 74 20 6f 74 68 65 72 20 6d 61  e.  But other ma
122b0 6b 65 66 69 6c 65 73 0a 2a 2a 20 64 6f 20 6e 6f  kefiles.** do no
122c0 74 20 64 65 66 69 6e 65 20 69 74 2e 0a 2a 2f 0a  t define it..*/.
122d0 23 69 66 6e 64 65 66 20 50 41 43 4b 41 47 45 5f  #ifndef PACKAGE_
122e0 56 45 52 53 49 4f 4e 0a 23 20 64 65 66 69 6e 65  VERSION.# define
122f0 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e   PACKAGE_VERSION
12300 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 0a   SQLITE_VERSION.
12310 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
12320 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f  itialize this mo
12330 64 75 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  dule..**.** This
12340 20 54 63 6c 20 6d 6f 64 75 6c 65 20 63 6f 6e 74   Tcl module cont
12350 61 69 6e 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67  ains only a sing
12360 6c 65 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d 61  le new Tcl comma
12370 6e 64 20 6e 61 6d 65 64 20 22 73 71 6c 69 74 65  nd named "sqlite
12380 22 2e 0a 2a 2a 20 28 48 65 6e 63 65 20 74 68 65  "..** (Hence the
12390 72 65 20 69 73 20 6e 6f 20 6e 61 6d 65 73 70 61  re is no namespa
123a0 63 65 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f  ce.  There is no
123b0 20 70 6f 69 6e 74 20 69 6e 20 75 73 69 6e 67 20   point in using 
123c0 61 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69  a namespace.** i
123d0 66 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 20  f the extension 
123e0 6f 6e 6c 79 20 73 75 70 70 6c 69 65 73 20 6f 6e  only supplies on
123f0 65 20 6e 65 77 20 6e 61 6d 65 21 29 20 20 54 68  e new name!)  Th
12400 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d 61  e "sqlite" comma
12410 6e 64 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f  nd is.** used to
12420 20 6f 70 65 6e 20 61 20 6e 65 77 20 53 51 4c 69   open a new SQLi
12430 74 65 20 64 61 74 61 62 61 73 65 2e 20 20 53 65  te database.  Se
12440 65 20 74 68 65 20 44 62 4d 61 69 6e 28 29 20 72  e the DbMain() r
12450 6f 75 74 69 6e 65 20 61 62 6f 76 65 0a 2a 2a 20  outine above.** 
12460 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
12470 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 45  nformation..*/.E
12480 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65  XTERN int Sqlite
12490 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  3_Init(Tcl_Inter
124a0 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 54 63  p *interp){.  Tc
124b0 6c 5f 49 6e 69 74 53 74 75 62 73 28 69 6e 74 65  l_InitStubs(inte
124c0 72 70 2c 20 22 38 2e 34 22 2c 20 30 29 3b 0a 20  rp, "8.4", 0);. 
124d0 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
124e0 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 73  mmand(interp, "s
124f0 71 6c 69 74 65 33 22 2c 20 28 54 63 6c 5f 4f 62  qlite3", (Tcl_Ob
12500 6a 43 6d 64 50 72 6f 63 2a 29 44 62 4d 61 69 6e  jCmdProc*)DbMain
12510 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 50  , 0, 0);.  Tcl_P
12520 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70  kgProvide(interp
12530 2c 20 22 73 71 6c 69 74 65 33 22 2c 20 50 41 43  , "sqlite3", PAC
12540 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29 3b 0a 20  KAGE_VERSION);. 
12550 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
12560 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 73  mmand(interp, "s
12570 71 6c 69 74 65 22 2c 20 28 54 63 6c 5f 4f 62 6a  qlite", (Tcl_Obj
12580 43 6d 64 50 72 6f 63 2a 29 44 62 4d 61 69 6e 2c  CmdProc*)DbMain,
12590 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 50 6b   0, 0);.  Tcl_Pk
125a0 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70 2c  gProvide(interp,
125b0 20 22 73 71 6c 69 74 65 22 2c 20 50 41 43 4b 41   "sqlite", PACKA
125c0 47 45 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20 72  GE_VERSION);.  r
125d0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
125e0 45 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73 71  EXTERN int Tclsq
125f0 6c 69 74 65 33 5f 49 6e 69 74 28 54 63 6c 5f 49  lite3_Init(Tcl_I
12600 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20  nterp *interp){ 
12610 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33 5f 49  return Sqlite3_I
12620 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a 45  nit(interp); }.E
12630 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65  XTERN int Sqlite
12640 33 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49  3_SafeInit(Tcl_I
12650 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20  nterp *interp){ 
12660 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d  return TCL_OK; }
12670 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73  .EXTERN int Tcls
12680 71 6c 69 74 65 33 5f 53 61 66 65 49 6e 69 74 28  qlite3_SafeInit(
12690 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
126a0 72 70 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f  rp){ return TCL_
126b0 4f 4b 3b 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK; }..#ifndef S
126c0 51 4c 49 54 45 5f 33 5f 53 55 46 46 49 58 5f 4f  QLITE_3_SUFFIX_O
126d0 4e 4c 59 0a 45 58 54 45 52 4e 20 69 6e 74 20 53  NLY.EXTERN int S
126e0 71 6c 69 74 65 5f 49 6e 69 74 28 54 63 6c 5f 49  qlite_Init(Tcl_I
126f0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20  nterp *interp){ 
12700 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33 5f 49  return Sqlite3_I
12710 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a 45  nit(interp); }.E
12720 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73 71 6c  XTERN int Tclsql
12730 69 74 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  ite_Init(Tcl_Int
12740 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65  erp *interp){ re
12750 74 75 72 6e 20 53 71 6c 69 74 65 33 5f 49 6e 69  turn Sqlite3_Ini
12760 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a 45 58 54  t(interp); }.EXT
12770 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65 5f 53  ERN int Sqlite_S
12780 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  afeInit(Tcl_Inte
12790 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74  rp *interp){ ret
127a0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58  urn TCL_OK; }.EX
127b0 54 45 52 4e 20 69 6e 74 20 54 63 6c 73 71 6c 69  TERN int Tclsqli
127c0 74 65 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f  te_SafeInit(Tcl_
127d0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
127e0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
127f0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
12800 20 54 43 4c 53 48 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a   TCLSH./********
12810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12850 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  *****.** The cod
12860 65 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69  e that follows i
12870 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20  s used to build 
12880 73 74 61 6e 64 61 6c 6f 6e 65 20 54 43 4c 20 69  standalone TCL i
12890 6e 74 65 72 70 72 65 74 65 72 73 0a 2a 2a 20 74  nterpreters.** t
128a0 68 61 74 20 61 72 65 20 73 74 61 74 69 63 61 6c  hat are statical
128b0 6c 79 20 6c 69 6e 6b 65 64 20 77 69 74 68 20 53  ly linked with S
128c0 51 4c 69 74 65 2e 20 20 0a 2a 2f 0a 0a 2f 2a 0a  QLite.  .*/../*.
128d0 2a 2a 20 49 66 20 74 68 65 20 6d 61 63 72 6f 20  ** If the macro 
128e0 54 43 4c 53 48 20 69 73 20 6f 6e 65 2c 20 74 68  TCLSH is one, th
128f0 65 6e 20 70 75 74 20 69 6e 20 63 6f 64 65 20 74  en put in code t
12900 68 69 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 22  his for the.** "
12910 6d 61 69 6e 22 20 72 6f 75 74 69 6e 65 20 74 68  main" routine th
12920 61 74 20 77 69 6c 6c 20 69 6e 69 74 69 61 6c 69  at will initiali
12930 7a 65 20 54 63 6c 20 61 6e 64 20 74 61 6b 65 20  ze Tcl and take 
12940 69 6e 70 75 74 20 66 72 6f 6d 0a 2a 2a 20 73 74  input from.** st
12950 61 6e 64 61 72 64 20 69 6e 70 75 74 2c 20 6f 72  andard input, or
12960 20 69 66 20 61 20 66 69 6c 65 20 69 73 20 6e 61   if a file is na
12970 6d 65 64 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61  med on the comma
12980 6e 64 20 6c 69 6e 65 0a 2a 2a 20 74 68 65 20 54  nd line.** the T
12990 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 72  CL interpreter r
129a0 65 61 64 73 20 61 6e 64 20 65 76 61 6c 75 61 74  eads and evaluat
129b0 65 73 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2f  es that file..*/
129c0 0a 23 69 66 20 54 43 4c 53 48 3d 3d 31 0a 73 74  .#if TCLSH==1.st
129d0 61 74 69 63 20 63 68 61 72 20 7a 4d 61 69 6e 6c  atic char zMainl
129e0 6f 6f 70 5b 5d 20 3d 0a 20 20 22 73 65 74 20 6c  oop[] =.  "set l
129f0 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20 22 77 68 69  ine {}\n".  "whi
12a00 6c 65 20 7b 21 5b 65 6f 66 20 73 74 64 69 6e 5d  le {![eof stdin]
12a10 7d 20 7b 5c 6e 22 0a 20 20 20 20 22 69 66 20 7b  } {\n".    "if {
12a20 24 6c 69 6e 65 21 3d 5c 22 5c 22 7d 20 7b 5c 6e  $line!=\"\"} {\n
12a30 22 0a 20 20 20 20 20 20 22 70 75 74 73 20 2d 6e  ".      "puts -n
12a40 6f 6e 65 77 6c 69 6e 65 20 5c 22 3e 20 5c 22 5c  onewline \"> \"\
12a50 6e 22 0a 20 20 20 20 22 7d 20 65 6c 73 65 20 7b  n".    "} else {
12a60 5c 6e 22 0a 20 20 20 20 20 20 22 70 75 74 73 20  \n".      "puts 
12a70 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22 25 20 5c  -nonewline \"% \
12a80 22 5c 6e 22 0a 20 20 20 20 22 7d 5c 6e 22 0a 20  "\n".    "}\n". 
12a90 20 20 20 22 66 6c 75 73 68 20 73 74 64 6f 75 74     "flush stdout
12aa0 5c 6e 22 0a 20 20 20 20 22 61 70 70 65 6e 64 20  \n".    "append 
12ab0 6c 69 6e 65 20 5b 67 65 74 73 20 73 74 64 69 6e  line [gets stdin
12ac0 5d 5c 6e 22 0a 20 20 20 20 22 69 66 20 7b 5b 69  ]\n".    "if {[i
12ad0 6e 66 6f 20 63 6f 6d 70 6c 65 74 65 20 24 6c 69  nfo complete $li
12ae0 6e 65 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20  ne]} {\n".      
12af0 22 69 66 20 7b 5b 63 61 74 63 68 20 7b 75 70 6c  "if {[catch {upl
12b00 65 76 65 6c 20 23 30 20 24 6c 69 6e 65 7d 20 72  evel #0 $line} r
12b10 65 73 75 6c 74 5d 7d 20 7b 5c 6e 22 0a 20 20 20  esult]} {\n".   
12b20 20 20 20 20 20 22 70 75 74 73 20 73 74 64 65 72       "puts stder
12b30 72 20 5c 22 45 72 72 6f 72 3a 20 24 72 65 73 75  r \"Error: $resu
12b40 6c 74 5c 22 5c 6e 22 0a 20 20 20 20 20 20 22 7d  lt\"\n".      "}
12b50 20 65 6c 73 65 69 66 20 7b 24 72 65 73 75 6c 74   elseif {$result
12b60 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20  !=\"\"} {\n".   
12b70 20 20 20 20 20 22 70 75 74 73 20 24 72 65 73 75       "puts $resu
12b80 6c 74 5c 6e 22 0a 20 20 20 20 20 20 22 7d 5c 6e  lt\n".      "}\n
12b90 22 0a 20 20 20 20 20 20 22 73 65 74 20 6c 69 6e  ".      "set lin
12ba0 65 20 7b 7d 5c 6e 22 0a 20 20 20 20 22 7d 20 65  e {}\n".    "} e
12bb0 6c 73 65 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22  lse {\n".      "
12bc0 61 70 70 65 6e 64 20 6c 69 6e 65 20 5c 5c 6e 5c  append line \\n\
12bd0 6e 22 0a 20 20 20 20 22 7d 5c 6e 22 0a 20 20 22  n".    "}\n".  "
12be0 7d 5c 6e 22 0a 3b 0a 23 65 6e 64 69 66 0a 0a 2f  }\n".;.#endif../
12bf0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 63 72  *.** If the macr
12c00 6f 20 54 43 4c 53 48 20 69 73 20 74 77 6f 2c 20  o TCLSH is two, 
12c10 74 68 65 6e 20 67 65 74 20 74 68 65 20 6d 61 69  then get the mai
12c20 6e 20 6c 6f 6f 70 20 63 6f 64 65 20 6f 75 74 20  n loop code out 
12c30 6f 66 0a 2a 2a 20 74 68 65 20 73 65 70 61 72 61  of.** the separa
12c40 74 65 20 66 69 6c 65 20 22 73 70 61 63 65 61 6e  te file "spacean
12c50 61 6c 5f 74 63 6c 2e 68 22 2e 0a 2a 2f 0a 23 69  al_tcl.h"..*/.#i
12c60 66 20 54 43 4c 53 48 3d 3d 32 0a 73 74 61 74 69  f TCLSH==2.stati
12c70 63 20 63 68 61 72 20 7a 4d 61 69 6e 6c 6f 6f 70  c char zMainloop
12c80 5b 5d 20 3d 20 0a 23 69 6e 63 6c 75 64 65 20 22  [] = .#include "
12c90 73 70 61 63 65 61 6e 61 6c 5f 74 63 6c 2e 68 22  spaceanal_tcl.h"
12ca0 0a 3b 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  .;.#endif..#defi
12cb0 6e 65 20 54 43 4c 53 48 5f 4d 41 49 4e 20 6d 61  ne TCLSH_MAIN ma
12cc0 69 6e 20 20 20 2f 2a 20 4e 65 65 64 65 64 20 74  in   /* Needed t
12cd0 6f 20 66 61 6b 65 20 6f 75 74 20 6d 6b 74 63 6c  o fake out mktcl
12ce0 61 70 70 20 2a 2f 0a 69 6e 74 20 54 43 4c 53 48  app */.int TCLSH
12cf0 5f 4d 41 49 4e 28 69 6e 74 20 61 72 67 63 2c 20  _MAIN(int argc, 
12d00 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20  char **argv){.  
12d10 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
12d20 72 70 3b 0a 20 20 54 63 6c 5f 46 69 6e 64 45 78  rp;.  Tcl_FindEx
12d30 65 63 75 74 61 62 6c 65 28 61 72 67 76 5b 30 5d  ecutable(argv[0]
12d40 29 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20 54 63  );.  interp = Tc
12d50 6c 5f 43 72 65 61 74 65 49 6e 74 65 72 70 28 29  l_CreateInterp()
12d60 3b 0a 20 20 53 71 6c 69 74 65 33 5f 49 6e 69 74  ;.  Sqlite3_Init
12d70 28 69 6e 74 65 72 70 29 3b 0a 23 69 66 64 65 66  (interp);.#ifdef
12d80 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 7b   SQLITE_TEST.  {
12d90 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
12da0 4d 64 35 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  Md5_Init(Tcl_Int
12db0 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
12dc0 6e 20 69 6e 74 20 53 71 6c 69 74 65 63 6f 6e 66  n int Sqliteconf
12dd0 69 67 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  ig_Init(Tcl_Inte
12de0 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
12df0 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 31   int Sqlitetest1
12e00 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
12e10 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
12e20 6e 74 20 53 71 6c 69 74 65 74 65 73 74 32 5f 49  nt Sqlitetest2_I
12e30 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
12e40 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
12e50 20 53 71 6c 69 74 65 74 65 73 74 33 5f 49 6e 69   Sqlitetest3_Ini
12e60 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
12e70 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
12e80 71 6c 69 74 65 74 65 73 74 34 5f 49 6e 69 74 28  qlitetest4_Init(
12e90 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
12ea0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
12eb0 69 74 65 74 65 73 74 35 5f 49 6e 69 74 28 54 63  itetest5_Init(Tc
12ec0 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
12ed0 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
12ee0 65 74 65 73 74 36 5f 49 6e 69 74 28 54 63 6c 5f  etest6_Init(Tcl_
12ef0 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
12f00 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
12f10 65 73 74 37 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  est7_Init(Tcl_In
12f20 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
12f30 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
12f40 74 38 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  t8_Init(Tcl_Inte
12f50 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
12f60 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 39   int Sqlitetest9
12f70 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
12f80 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
12f90 6e 74 20 53 71 6c 69 74 65 74 65 73 74 61 73 79  nt Sqlitetestasy
12fa0 6e 63 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  nc_Init(Tcl_Inte
12fb0 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
12fc0 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f   int Sqlitetest_
12fd0 61 75 74 6f 65 78 74 5f 49 6e 69 74 28 54 63 6c  autoext_Init(Tcl
12fe0 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
12ff0 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
13000 74 65 73 74 5f 66 75 6e 63 5f 49 6e 69 74 28 54  test_func_Init(T
13010 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
13020 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
13030 74 65 74 65 73 74 5f 68 65 78 69 6f 5f 49 6e 69  tetest_hexio_Ini
13040 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
13050 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
13060 71 6c 69 74 65 74 65 73 74 5f 6d 61 6c 6c 6f 63  qlitetest_malloc
13070 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
13080 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
13090 6e 74 20 53 71 6c 69 74 65 74 65 73 74 73 63 68  nt Sqlitetestsch
130a0 65 6d 61 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  ema_Init(Tcl_Int
130b0 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
130c0 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
130d0 73 73 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  sse_Init(Tcl_Int
130e0 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
130f0 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
13100 74 63 6c 76 61 72 5f 49 6e 69 74 28 54 63 6c 5f  tclvar_Init(Tcl_
13110 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
13120 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
13130 65 73 74 54 68 72 65 61 64 5f 49 6e 69 74 28 54  estThread_Init(T
13140 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
13150 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
13160 74 65 74 65 73 74 4f 6e 65 66 69 6c 65 5f 49 6e  tetestOnefile_In
13170 69 74 28 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  it();.    extern
13180 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 4f   int SqlitetestO
13190 73 69 6e 73 74 5f 49 6e 69 74 28 54 63 6c 5f 49  sinst_Init(Tcl_I
131a0 6e 74 65 72 70 2a 29 3b 0a 0a 20 20 20 20 4d 64  nterp*);..    Md
131b0 35 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  5_Init(interp);.
131c0 20 20 20 20 53 71 6c 69 74 65 63 6f 6e 66 69 67      Sqliteconfig
131d0 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
131e0 20 20 20 53 71 6c 69 74 65 74 65 73 74 31 5f 49     Sqlitetest1_I
131f0 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
13200 20 53 71 6c 69 74 65 74 65 73 74 32 5f 49 6e 69   Sqlitetest2_Ini
13210 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
13220 71 6c 69 74 65 74 65 73 74 33 5f 49 6e 69 74 28  qlitetest3_Init(
13230 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
13240 69 74 65 74 65 73 74 34 5f 49 6e 69 74 28 69 6e  itetest4_Init(in
13250 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
13260 65 74 65 73 74 35 5f 49 6e 69 74 28 69 6e 74 65  etest5_Init(inte
13270 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
13280 65 73 74 36 5f 49 6e 69 74 28 69 6e 74 65 72 70  est6_Init(interp
13290 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
132a0 74 37 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  t7_Init(interp);
132b0 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 38  .    Sqlitetest8
132c0 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
132d0 20 20 20 53 71 6c 69 74 65 74 65 73 74 39 5f 49     Sqlitetest9_I
132e0 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
132f0 20 53 71 6c 69 74 65 74 65 73 74 61 73 79 6e 63   Sqlitetestasync
13300 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
13310 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f 61 75     Sqlitetest_au
13320 74 6f 65 78 74 5f 49 6e 69 74 28 69 6e 74 65 72  toext_Init(inter
13330 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
13340 73 74 5f 66 75 6e 63 5f 49 6e 69 74 28 69 6e 74  st_func_Init(int
13350 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
13360 74 65 73 74 5f 68 65 78 69 6f 5f 49 6e 69 74 28  test_hexio_Init(
13370 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
13380 69 74 65 74 65 73 74 5f 6d 61 6c 6c 6f 63 5f 49  itetest_malloc_I
13390 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
133a0 20 53 71 6c 69 74 65 74 65 73 74 73 63 68 65 6d   Sqlitetestschem
133b0 61 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  a_Init(interp);.
133c0 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 74 63      Sqlitetesttc
133d0 6c 76 61 72 5f 49 6e 69 74 28 69 6e 74 65 72 70  lvar_Init(interp
133e0 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
133f0 74 54 68 72 65 61 64 5f 49 6e 69 74 28 69 6e 74  tThread_Init(int
13400 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
13410 74 65 73 74 4f 6e 65 66 69 6c 65 5f 49 6e 69 74  testOnefile_Init
13420 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
13430 6c 69 74 65 74 65 73 74 4f 73 69 6e 73 74 5f 49  litetestOsinst_I
13440 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 0a 23 69  nit(interp);..#i
13450 66 64 65 66 20 53 51 4c 49 54 45 5f 53 53 45 0a  fdef SQLITE_SSE.
13460 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 73 73      Sqlitetestss
13470 65 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  e_Init(interp);.
13480 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69  #endif.  }.#endi
13490 66 0a 20 20 69 66 28 20 61 72 67 63 3e 3d 32 20  f.  if( argc>=2 
134a0 7c 7c 20 54 43 4c 53 48 3d 3d 32 20 29 7b 0a 20  || TCLSH==2 ){. 
134b0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 68     int i;.    ch
134c0 61 72 20 7a 41 72 67 63 5b 33 32 5d 3b 0a 20 20  ar zArgc[32];.  
134d0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
134e0 74 66 28 73 69 7a 65 6f 66 28 7a 41 72 67 63 29  tf(sizeof(zArgc)
134f0 2c 20 7a 41 72 67 63 2c 20 22 25 64 22 2c 20 61  , zArgc, "%d", a
13500 72 67 63 2d 28 33 2d 54 43 4c 53 48 29 29 3b 0a  rgc-(3-TCLSH));.
13510 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69      Tcl_SetVar(i
13520 6e 74 65 72 70 2c 22 61 72 67 63 22 2c 20 7a 41  nterp,"argc", zA
13530 72 67 63 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f  rgc, TCL_GLOBAL_
13540 4f 4e 4c 59 29 3b 0a 20 20 20 20 54 63 6c 5f 53  ONLY);.    Tcl_S
13550 65 74 56 61 72 28 69 6e 74 65 72 70 2c 22 61 72  etVar(interp,"ar
13560 67 76 30 22 2c 61 72 67 76 5b 31 5d 2c 54 43 4c  gv0",argv[1],TCL
13570 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20  _GLOBAL_ONLY);. 
13580 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e     Tcl_SetVar(in
13590 74 65 72 70 2c 22 61 72 67 76 22 2c 20 22 22 2c  terp,"argv", "",
135a0 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59   TCL_GLOBAL_ONLY
135b0 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 33 2d 54  );.    for(i=3-T
135c0 43 4c 53 48 3b 20 69 3c 61 72 67 63 3b 20 69 2b  CLSH; i<argc; i+
135d0 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65  +){.      Tcl_Se
135e0 74 56 61 72 28 69 6e 74 65 72 70 2c 20 22 61 72  tVar(interp, "ar
135f0 67 76 22 2c 20 61 72 67 76 5b 69 5d 2c 0a 20 20  gv", argv[i],.  
13600 20 20 20 20 20 20 20 20 54 43 4c 5f 47 4c 4f 42          TCL_GLOB
13610 41 4c 5f 4f 4e 4c 59 20 7c 20 54 43 4c 5f 4c 49  AL_ONLY | TCL_LI
13620 53 54 5f 45 4c 45 4d 45 4e 54 20 7c 20 54 43 4c  ST_ELEMENT | TCL
13630 5f 41 50 50 45 4e 44 5f 56 41 4c 55 45 29 3b 0a  _APPEND_VALUE);.
13640 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 54 43      }.    if( TC
13650 4c 53 48 3d 3d 31 20 26 26 20 54 63 6c 5f 45 76  LSH==1 && Tcl_Ev
13660 61 6c 46 69 6c 65 28 69 6e 74 65 72 70 2c 20 61  alFile(interp, a
13670 72 67 76 5b 31 5d 29 21 3d 54 43 4c 5f 4f 4b 20  rgv[1])!=TCL_OK 
13680 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
13690 68 61 72 20 2a 7a 49 6e 66 6f 20 3d 20 54 63 6c  har *zInfo = Tcl
136a0 5f 47 65 74 56 61 72 28 69 6e 74 65 72 70 2c 20  _GetVar(interp, 
136b0 22 65 72 72 6f 72 49 6e 66 6f 22 2c 20 54 43 4c  "errorInfo", TCL
136c0 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20  _GLOBAL_ONLY);. 
136d0 20 20 20 20 20 69 66 28 20 7a 49 6e 66 6f 3d 3d       if( zInfo==
136e0 30 20 29 20 7a 49 6e 66 6f 20 3d 20 69 6e 74 65  0 ) zInfo = inte
136f0 72 70 2d 3e 72 65 73 75 6c 74 3b 0a 20 20 20 20  rp->result;.    
13700 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
13710 2c 22 25 73 3a 20 25 73 5c 6e 22 2c 20 2a 61 72  ,"%s: %s\n", *ar
13720 67 76 2c 20 7a 49 6e 66 6f 29 3b 0a 20 20 20 20  gv, zInfo);.    
13730 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
13740 7d 0a 20 20 7d 0a 20 20 69 66 28 20 61 72 67 63  }.  }.  if( argc
13750 3c 3d 31 20 7c 7c 20 54 43 4c 53 48 3d 3d 32 20  <=1 || TCLSH==2 
13760 29 7b 0a 20 20 20 20 54 63 6c 5f 47 6c 6f 62 61  ){.    Tcl_Globa
13770 6c 45 76 61 6c 28 69 6e 74 65 72 70 2c 20 7a 4d  lEval(interp, zM
13780 61 69 6e 6c 6f 6f 70 29 3b 0a 20 20 7d 0a 20 20  ainloop);.  }.  
13790 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
137a0 69 66 20 2f 2a 20 54 43 4c 53 48 20 2a 2f 0a     if /* TCLSH */.