/ Hex Artifact Content
Login

Artifact 420c7936d71f8318ea23b254c0d2cfc365135403:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 41 20 54 43 4c 20  ******.** A TCL 
0180: 49 6e 74 65 72 66 61 63 65 20 74 6f 20 53 51 4c  Interface to SQL
0190: 69 74 65 2e 20 20 41 70 70 65 6e 64 20 74 68 69  ite.  Append thi
01a0: 73 20 66 69 6c 65 20 74 6f 20 73 71 6c 69 74 65  s file to sqlite
01b0: 33 2e 63 20 61 6e 64 0a 2a 2a 20 63 6f 6d 70 69  3.c and.** compi
01c0: 6c 65 20 74 68 65 20 77 68 6f 6c 65 20 74 68 69  le the whole thi
01d0: 6e 67 20 74 6f 20 62 75 69 6c 64 20 61 20 54 43  ng to build a TC
01e0: 4c 2d 65 6e 61 62 6c 65 64 20 76 65 72 73 69 6f  L-enabled versio
01f0: 6e 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a 0a  n of SQLite..**.
0200: 2a 2a 20 24 49 64 3a 20 74 63 6c 73 71 6c 69 74  ** $Id: tclsqlit
0210: 65 2e 63 2c 76 20 31 2e 32 32 30 20 32 30 30 38  e.c,v 1.220 2008
0220: 2f 30 38 2f 32 36 20 32 31 3a 33 33 3a 33 34 20  /08/26 21:33:34 
0230: 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e  drh Exp $.*/.#in
0240: 63 6c 75 64 65 20 22 74 63 6c 2e 68 22 0a 23 69  clude "tcl.h".#i
0250: 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e 68 3e  nclude <errno.h>
0260: 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 61 64 64  ../*.** Some add
0270: 69 74 69 6f 6e 61 6c 20 69 6e 63 6c 75 64 65 20  itional include 
0280: 66 69 6c 65 73 20 61 72 65 20 6e 65 65 64 65 64  files are needed
0290: 20 69 66 20 74 68 69 73 20 66 69 6c 65 20 69 73   if this file is
02a0: 20 6e 6f 74 0a 2a 2a 20 61 70 70 65 6e 64 65 64   not.** appended
02b0: 20 74 6f 20 74 68 65 20 61 6d 61 6c 67 61 6d 61   to the amalgama
02c0: 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tion..*/.#ifndef
02d0: 20 53 51 4c 49 54 45 5f 41 4d 41 4c 47 41 4d 41   SQLITE_AMALGAMA
02e0: 54 49 4f 4e 0a 23 20 69 6e 63 6c 75 64 65 20 22  TION.# include "
02f0: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 20 69  sqliteInt.h".# i
0300: 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e 68  nclude <stdlib.h
0310: 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 74 72  >.# include <str
0320: 69 6e 67 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65  ing.h>.# include
0330: 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23 20 69 6e   <assert.h>.# in
0340: 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a  clude <ctype.h>.
0350: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 57 69  #endif../*. * Wi
0360: 6e 64 6f 77 73 20 6e 65 65 64 73 20 74 6f 20 6b  ndows needs to k
0370: 6e 6f 77 20 77 68 69 63 68 20 73 79 6d 62 6f 6c  now which symbol
0380: 73 20 74 6f 20 65 78 70 6f 72 74 2e 20 20 55 6e  s to export.  Un
0390: 69 78 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 2a 20  ix does not.. * 
03a0: 42 55 49 4c 44 5f 73 71 6c 69 74 65 20 73 68 6f  BUILD_sqlite sho
03b0: 75 6c 64 20 62 65 20 75 6e 64 65 66 69 6e 65 64  uld be undefined
03c0: 20 66 6f 72 20 55 6e 69 78 2e 0a 20 2a 2f 0a 23   for Unix.. */.#
03d0: 69 66 64 65 66 20 42 55 49 4c 44 5f 73 71 6c 69  ifdef BUILD_sqli
03e0: 74 65 0a 23 75 6e 64 65 66 20 54 43 4c 5f 53 54  te.#undef TCL_ST
03f0: 4f 52 41 47 45 5f 43 4c 41 53 53 0a 23 64 65 66  ORAGE_CLASS.#def
0400: 69 6e 65 20 54 43 4c 5f 53 54 4f 52 41 47 45 5f  ine TCL_STORAGE_
0410: 43 4c 41 53 53 20 44 4c 4c 45 58 50 4f 52 54 0a  CLASS DLLEXPORT.
0420: 23 65 6e 64 69 66 20 2f 2a 20 42 55 49 4c 44 5f  #endif /* BUILD_
0430: 73 71 6c 69 74 65 20 2a 2f 0a 0a 23 64 65 66 69  sqlite */..#defi
0440: 6e 65 20 4e 55 4d 5f 50 52 45 50 41 52 45 44 5f  ne NUM_PREPARED_
0450: 53 54 4d 54 53 20 31 30 0a 23 64 65 66 69 6e 65  STMTS 10.#define
0460: 20 4d 41 58 5f 50 52 45 50 41 52 45 44 5f 53 54   MAX_PREPARED_ST
0470: 4d 54 53 20 31 30 30 0a 0a 2f 2a 0a 2a 2a 20 49  MTS 100../*.** I
0480: 66 20 54 43 4c 20 75 73 65 73 20 55 54 46 2d 38  f TCL uses UTF-8
0490: 20 61 6e 64 20 53 51 4c 69 74 65 20 69 73 20 63   and SQLite is c
04a0: 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73 65  onfigured to use
04b0: 20 69 73 6f 38 38 35 39 2c 20 74 68 65 6e 20 77   iso8859, then w
04c0: 65 0a 2a 2a 20 68 61 76 65 20 74 6f 20 64 6f 20  e.** have to do 
04d0: 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 77 68  a translation wh
04e0: 65 6e 20 67 6f 69 6e 67 20 62 65 74 77 65 65 6e  en going between
04f0: 20 74 68 65 20 74 77 6f 2e 20 20 53 65 74 20 74   the two.  Set t
0500: 68 65 20 0a 2a 2a 20 55 54 46 5f 54 52 41 4e 53  he .** UTF_TRANS
0510: 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 20 6d 61  LATION_NEEDED ma
0520: 63 72 6f 20 74 6f 20 69 6e 64 69 63 61 74 65 20  cro to indicate 
0530: 74 68 61 74 20 77 65 20 6e 65 65 64 20 74 6f 20  that we need to 
0540: 64 6f 0a 2a 2a 20 74 68 69 73 20 74 72 61 6e 73  do.** this trans
0550: 6c 61 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 23 69 66  lation.  .*/.#if
0560: 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 55 54 46   defined(TCL_UTF
0570: 5f 4d 41 58 29 20 26 26 20 21 64 65 66 69 6e 65  _MAX) && !define
0580: 64 28 53 51 4c 49 54 45 5f 55 54 46 38 29 0a 23  d(SQLITE_UTF8).#
0590: 20 64 65 66 69 6e 65 20 55 54 46 5f 54 52 41 4e   define UTF_TRAN
05a0: 53 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 20 31  SLATION_NEEDED 1
05b0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4e  .#endif../*.** N
05c0: 65 77 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73  ew SQL functions
05d0: 20 63 61 6e 20 62 65 20 63 72 65 61 74 65 64 20   can be created 
05e0: 61 73 20 54 43 4c 20 73 63 72 69 70 74 73 2e 20  as TCL scripts. 
05f0: 20 45 61 63 68 20 73 75 63 68 20 66 75 6e 63 74   Each such funct
0600: 69 6f 6e 0a 2a 2a 20 69 73 20 64 65 73 63 72 69  ion.** is descri
0610: 62 65 64 20 62 79 20 61 6e 20 69 6e 73 74 61 6e  bed by an instan
0620: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
0630: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ing structure..*
0640: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0650: 20 53 71 6c 46 75 6e 63 20 53 71 6c 46 75 6e 63   SqlFunc SqlFunc
0660: 3b 0a 73 74 72 75 63 74 20 53 71 6c 46 75 6e 63  ;.struct SqlFunc
0670: 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20   {.  Tcl_Interp 
0680: 2a 69 6e 74 65 72 70 3b 20 20 20 2f 2a 20 54 68  *interp;   /* Th
0690: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 20  e TCL interpret 
06a0: 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20 66  to execute the f
06b0: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
06c0: 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 20 20  _Obj *pScript;  
06d0: 20 20 20 2f 2a 20 54 68 65 20 54 63 6c 5f 4f 62     /* The Tcl_Ob
06e0: 6a 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  j representation
06f0: 20 6f 66 20 74 68 65 20 73 63 72 69 70 74 20 2a   of the script *
0700: 2f 0a 20 20 69 6e 74 20 75 73 65 45 76 61 6c 4f  /.  int useEvalO
0710: 62 6a 76 3b 20 20 20 20 20 20 2f 2a 20 54 72 75  bjv;      /* Tru
0720: 65 20 69 66 20 69 74 20 69 73 20 73 61 66 65 20  e if it is safe 
0730: 74 6f 20 75 73 65 20 54 63 6c 5f 45 76 61 6c 4f  to use Tcl_EvalO
0740: 62 6a 76 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  bjv */.  char *z
0750: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 2f  Name;          /
0760: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 69 73 20 66  * Name of this f
0770: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 53 71 6c  unction */.  Sql
0780: 46 75 6e 63 20 2a 70 4e 65 78 74 3b 20 20 20 20  Func *pNext;    
0790: 20 20 20 2f 2a 20 4e 65 78 74 20 66 75 6e 63 74     /* Next funct
07a0: 69 6f 6e 20 6f 6e 20 74 68 65 20 6c 69 73 74 20  ion on the list 
07b0: 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 7d  of them all */.}
07c0: 3b 0a 0a 2f 2a 0a 2a 2a 20 4e 65 77 20 63 6f 6c  ;../*.** New col
07d0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73  lation sequences
07e0: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 62 65   function can be
07f0: 20 63 72 65 61 74 65 64 20 61 73 20 54 43 4c 20   created as TCL 
0800: 73 63 72 69 70 74 73 2e 20 20 45 61 63 68 20 73  scripts.  Each s
0810: 75 63 68 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  uch.** function 
0820: 69 73 20 64 65 73 63 72 69 62 65 64 20 62 79 20  is described by 
0830: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
0840: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
0850: 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65 64  ucture..*/.typed
0860: 65 66 20 73 74 72 75 63 74 20 53 71 6c 43 6f 6c  ef struct SqlCol
0870: 6c 61 74 65 20 53 71 6c 43 6f 6c 6c 61 74 65 3b  late SqlCollate;
0880: 0a 73 74 72 75 63 74 20 53 71 6c 43 6f 6c 6c 61  .struct SqlColla
0890: 74 65 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72  te {.  Tcl_Inter
08a0: 70 20 2a 69 6e 74 65 72 70 3b 20 20 20 2f 2a 20  p *interp;   /* 
08b0: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
08c0: 74 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  t to execute the
08d0: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 63   function */.  c
08e0: 68 61 72 20 2a 7a 53 63 72 69 70 74 3b 20 20 20  har *zScript;   
08f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 63 72 69       /* The scri
0900: 70 74 20 74 6f 20 62 65 20 72 75 6e 20 2a 2f 0a  pt to be run */.
0910: 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 4e    SqlCollate *pN
0920: 65 78 74 3b 20 20 20 20 2f 2a 20 4e 65 78 74 20  ext;    /* Next 
0930: 66 75 6e 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  function on the 
0940: 6c 69 73 74 20 6f 66 20 74 68 65 6d 20 61 6c 6c  list of them all
0950: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72   */.};../*.** Pr
0960: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
0970: 73 20 61 72 65 20 63 61 63 68 65 64 20 66 6f 72  s are cached for
0980: 20 66 61 73 74 65 72 20 65 78 65 63 75 74 69 6f   faster executio
0990: 6e 2e 20 20 45 61 63 68 20 70 72 65 70 61 72 65  n.  Each prepare
09a0: 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 69  d.** statement i
09b0: 73 20 64 65 73 63 72 69 62 65 64 20 62 79 20 61  s described by a
09c0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
09d0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
09e0: 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65 64 65  cture..*/.typede
09f0: 66 20 73 74 72 75 63 74 20 53 71 6c 50 72 65 70  f struct SqlPrep
0a00: 61 72 65 64 53 74 6d 74 20 53 71 6c 50 72 65 70  aredStmt SqlPrep
0a10: 61 72 65 64 53 74 6d 74 3b 0a 73 74 72 75 63 74  aredStmt;.struct
0a20: 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74   SqlPreparedStmt
0a30: 20 7b 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64   {.  SqlPrepared
0a40: 53 74 6d 74 20 2a 70 4e 65 78 74 3b 20 20 2f 2a  Stmt *pNext;  /*
0a50: 20 4e 65 78 74 20 69 6e 20 6c 69 6e 6b 65 64 20   Next in linked 
0a60: 6c 69 73 74 20 2a 2f 0a 20 20 53 71 6c 50 72 65  list */.  SqlPre
0a70: 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65 76  paredStmt *pPrev
0a80: 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 6f  ;  /* Previous o
0a90: 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20  n the list */.  
0aa0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
0ab0: 74 6d 74 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  tmt;     /* The 
0ac0: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
0ad0: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 71 6c  nt */.  int nSql
0ae0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0af0: 20 2f 2a 20 63 68 61 72 73 20 69 6e 20 7a 53 71   /* chars in zSq
0b00: 6c 5b 5d 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  l[] */.  const c
0b10: 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20  har *zSql;      
0b20: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65    /* Text of the
0b30: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a   SQL statement *
0b40: 2f 0a 7d 3b 0a 0a 74 79 70 65 64 65 66 20 73 74  /.};..typedef st
0b50: 72 75 63 74 20 49 6e 63 72 62 6c 6f 62 43 68 61  ruct IncrblobCha
0b60: 6e 6e 65 6c 20 49 6e 63 72 62 6c 6f 62 43 68 61  nnel IncrblobCha
0b70: 6e 6e 65 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  nnel;../*.** The
0b80: 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e  re is one instan
0b90: 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  ce of this struc
0ba0: 74 75 72 65 20 66 6f 72 20 65 61 63 68 20 53 51  ture for each SQ
0bb0: 4c 69 74 65 20 64 61 74 61 62 61 73 65 0a 2a 2a  Lite database.**
0bc0: 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 6f   that has been o
0bd0: 70 65 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c  pened by the SQL
0be0: 69 74 65 20 54 43 4c 20 69 6e 74 65 72 66 61 63  ite TCL interfac
0bf0: 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  e..*/.typedef st
0c00: 72 75 63 74 20 53 71 6c 69 74 65 44 62 20 53 71  ruct SqliteDb Sq
0c10: 6c 69 74 65 44 62 3b 0a 73 74 72 75 63 74 20 53  liteDb;.struct S
0c20: 71 6c 69 74 65 44 62 20 7b 0a 20 20 73 71 6c 69  qliteDb {.  sqli
0c30: 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
0c40: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 72         /* The "r
0c50: 65 61 6c 22 20 64 61 74 61 62 61 73 65 20 73 74  eal" database st
0c60: 72 75 63 74 75 72 65 2e 20 4d 55 53 54 20 42 45  ructure. MUST BE
0c70: 20 46 49 52 53 54 20 2a 2f 0a 20 20 54 63 6c 5f   FIRST */.  Tcl_
0c80: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 20  Interp *interp; 
0c90: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
0ca0: 74 65 72 70 72 65 74 65 72 20 75 73 65 64 20 66  terpreter used f
0cb0: 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65  or this database
0cc0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 42 75 73   */.  char *zBus
0cd0: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
0ce0: 20 2f 2a 20 54 68 65 20 62 75 73 79 20 63 61 6c   /* The busy cal
0cf0: 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f  lback routine */
0d00: 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74  .  char *zCommit
0d10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
0d20: 20 54 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b   The commit hook
0d30: 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e   callback routin
0d40: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 72  e */.  char *zTr
0d50: 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
0d60: 20 20 2f 2a 20 54 68 65 20 74 72 61 63 65 20 63    /* The trace c
0d70: 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20  allback routine 
0d80: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 72 6f 66  */.  char *zProf
0d90: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
0da0: 2f 2a 20 54 68 65 20 70 72 6f 66 69 6c 65 20 63  /* The profile c
0db0: 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20  allback routine 
0dc0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 72 6f 67  */.  char *zProg
0dd0: 72 65 73 73 3b 20 20 20 20 20 20 20 20 20 20 20  ress;           
0de0: 2f 2a 20 54 68 65 20 70 72 6f 67 72 65 73 73 20  /* The progress 
0df0: 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65  callback routine
0e00: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 75 74   */.  char *zAut
0e10: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
0e20: 20 2f 2a 20 54 68 65 20 61 75 74 68 6f 72 69 7a   /* The authoriz
0e30: 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 20 72  ation callback r
0e40: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
0e50: 64 69 73 61 62 6c 65 41 75 74 68 3b 20 20 20 20  disableAuth;    
0e60: 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c         /* Disabl
0e70: 65 20 74 68 65 20 61 75 74 68 6f 72 69 7a 65 72  e the authorizer
0e80: 20 69 66 20 69 74 20 65 78 69 73 74 73 20 2a 2f   if it exists */
0e90: 0a 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c 3b 20  .  char *zNull; 
0ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0eb0: 20 54 65 78 74 20 74 6f 20 73 75 62 73 74 69 74   Text to substit
0ec0: 75 74 65 20 66 6f 72 20 61 6e 20 53 51 4c 20 4e  ute for an SQL N
0ed0: 55 4c 4c 20 76 61 6c 75 65 20 2a 2f 0a 20 20 53  ULL value */.  S
0ee0: 71 6c 46 75 6e 63 20 2a 70 46 75 6e 63 3b 20 20  qlFunc *pFunc;  
0ef0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
0f00: 74 20 6f 66 20 53 51 4c 20 66 75 6e 63 74 69 6f  t of SQL functio
0f10: 6e 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ns */.  Tcl_Obj 
0f20: 2a 70 55 70 64 61 74 65 48 6f 6f 6b 3b 20 20 20  *pUpdateHook;   
0f30: 20 20 20 2f 2a 20 55 70 64 61 74 65 20 68 6f 6f     /* Update hoo
0f40: 6b 20 73 63 72 69 70 74 20 28 69 66 20 61 6e 79  k script (if any
0f50: 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  ) */.  Tcl_Obj *
0f60: 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3b 20 20  pRollbackHook;  
0f70: 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 68 6f    /* Rollback ho
0f80: 6f 6b 20 73 63 72 69 70 74 20 28 69 66 20 61 6e  ok script (if an
0f90: 79 29 20 2a 2f 0a 20 20 53 71 6c 43 6f 6c 6c 61  y) */.  SqlColla
0fa0: 74 65 20 2a 70 43 6f 6c 6c 61 74 65 3b 20 20 20  te *pCollate;   
0fb0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 53 51     /* List of SQ
0fc0: 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63  L collation func
0fd0: 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 72  tions */.  int r
0fe0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
0ff0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1000: 63 6f 64 65 20 6f 66 20 6d 6f 73 74 20 72 65 63  code of most rec
1010: 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63  ent sqlite3_exec
1020: 28 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  () */.  Tcl_Obj 
1030: 2a 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 3b  *pCollateNeeded;
1040: 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20     /* Collation 
1050: 6e 65 65 64 65 64 20 73 63 72 69 70 74 20 2a 2f  needed script */
1060: 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74  .  SqlPreparedSt
1070: 6d 74 20 2a 73 74 6d 74 4c 69 73 74 3b 20 2f 2a  mt *stmtList; /*
1080: 20 4c 69 73 74 20 6f 66 20 70 72 65 70 61 72 65   List of prepare
1090: 64 20 73 74 61 74 65 6d 65 6e 74 73 2a 2f 0a 20  d statements*/. 
10a0: 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74   SqlPreparedStmt
10b0: 20 2a 73 74 6d 74 4c 61 73 74 3b 20 2f 2a 20 4c   *stmtLast; /* L
10c0: 61 73 74 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  ast statement in
10d0: 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69   the list */.  i
10e0: 6e 74 20 6d 61 78 53 74 6d 74 3b 20 20 20 20 20  nt maxStmt;     
10f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1100: 20 6e 65 78 74 20 6d 61 78 69 6d 75 6d 20 6e 75   next maximum nu
1110: 6d 62 65 72 20 6f 66 20 73 74 6d 74 4c 69 73 74  mber of stmtList
1120: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 74 6d 74 3b   */.  int nStmt;
1130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1140: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 74   /* Number of st
1150: 61 74 65 6d 65 6e 74 73 20 69 6e 20 73 74 6d 74  atements in stmt
1160: 4c 69 73 74 20 2a 2f 0a 20 20 49 6e 63 72 62 6c  List */.  Incrbl
1170: 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 49 6e 63 72  obChannel *pIncr
1180: 62 6c 6f 62 3b 2f 2a 20 4c 69 6e 6b 65 64 20 6c  blob;/* Linked l
1190: 69 73 74 20 6f 66 20 6f 70 65 6e 20 69 6e 63 72  ist of open incr
11a0: 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 73 20 2a 2f  blob channels */
11b0: 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 49 6e 63 72  .};..struct Incr
11c0: 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 7b 0a 20 20  blobChannel {.  
11d0: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42  sqlite3_blob *pB
11e0: 6c 6f 62 3b 20 20 20 20 20 20 2f 2a 20 73 71 6c  lob;      /* sql
11f0: 69 74 65 33 20 62 6c 6f 62 20 68 61 6e 64 6c 65  ite3 blob handle
1200: 20 2a 2f 0a 20 20 53 71 6c 69 74 65 44 62 20 2a   */.  SqliteDb *
1210: 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  pDb;            
1220: 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20 64 61  /* Associated da
1230: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1240: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65 65 6b  n */.  int iSeek
1250: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1260: 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 65 65 6b   /* Current seek
1270: 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 54 63 6c   offset */.  Tcl
1280: 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 6e 65 6c  _Channel channel
1290: 3b 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 6e 65  ;      /* Channe
12a0: 6c 20 69 64 65 6e 74 69 66 69 65 72 20 2a 2f 0a  l identifier */.
12b0: 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65    IncrblobChanne
12c0: 6c 20 2a 70 4e 65 78 74 3b 20 20 20 2f 2a 20 4c  l *pNext;   /* L
12d0: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 61 6c  inked list of al
12e0: 6c 20 6f 70 65 6e 20 69 6e 63 72 62 6c 6f 62 20  l open incrblob 
12f0: 63 68 61 6e 6e 65 6c 73 20 2a 2f 0a 20 20 49 6e  channels */.  In
1300: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70  crblobChannel *p
1310: 50 72 65 76 3b 20 20 20 2f 2a 20 4c 69 6e 6b 65  Prev;   /* Linke
1320: 64 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 6f 70  d list of all op
1330: 65 6e 20 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e  en incrblob chan
1340: 6e 65 6c 73 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 6e  nels */.};..#ifn
1350: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1360: 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 43  INCRBLOB./*.** C
1370: 6c 6f 73 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f  lose all incrblo
1380: 62 20 63 68 61 6e 6e 65 6c 73 20 6f 70 65 6e 65  b channels opene
1390: 64 20 75 73 69 6e 67 20 64 61 74 61 62 61 73 65  d using database
13a0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 44 62 2e   connection pDb.
13b0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c  .** This is call
13c0: 65 64 20 77 68 65 6e 20 73 68 75 74 74 69 6e 67  ed when shutting
13d0: 20 64 6f 77 6e 20 74 68 65 20 64 61 74 61 62 61   down the databa
13e0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
13f0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c  /.static void cl
1400: 6f 73 65 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  oseIncrblobChann
1410: 65 6c 73 28 53 71 6c 69 74 65 44 62 20 2a 70 44  els(SqliteDb *pD
1420: 62 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68  b){.  IncrblobCh
1430: 61 6e 6e 65 6c 20 2a 70 3b 0a 20 20 49 6e 63 72  annel *p;.  Incr
1440: 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 4e 65  blobChannel *pNe
1450: 78 74 3b 0a 0a 20 20 66 6f 72 28 70 3d 70 44 62  xt;..  for(p=pDb
1460: 2d 3e 70 49 6e 63 72 62 6c 6f 62 3b 20 70 3b 20  ->pIncrblob; p; 
1470: 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e  p=pNext){.    pN
1480: 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
1490: 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 43 61  .    /* Note: Ca
14a0: 6c 6c 69 6e 67 20 75 6e 72 65 67 69 73 74 65 72  lling unregister
14b0: 20 68 65 72 65 20 63 61 6c 6c 20 54 63 6c 5f 43   here call Tcl_C
14c0: 6c 6f 73 65 20 6f 6e 20 74 68 65 20 69 6e 63 72  lose on the incr
14d0: 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2c 20 0a 20  blob channel, . 
14e0: 20 20 20 2a 2a 20 77 68 69 63 68 20 64 65 6c 65     ** which dele
14f0: 74 65 73 20 74 68 65 20 49 6e 63 72 62 6c 6f 62  tes the Incrblob
1500: 43 68 61 6e 6e 65 6c 20 73 74 72 75 63 74 75 72  Channel structur
1510: 65 20 61 74 20 2a 70 2e 20 53 6f 20 64 6f 20 6e  e at *p. So do n
1520: 6f 74 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 54  ot.    ** call T
1530: 63 6c 5f 46 72 65 65 28 29 20 68 65 72 65 2e 0a  cl_Free() here..
1540: 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 55      */.    Tcl_U
1550: 6e 72 65 67 69 73 74 65 72 43 68 61 6e 6e 65 6c  nregisterChannel
1560: 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 2d  (pDb->interp, p-
1570: 3e 63 68 61 6e 6e 65 6c 29 3b 0a 20 20 7d 0a 7d  >channel);.  }.}
1580: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e  ../*.** Close an
1590: 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f   incremental blo
15a0: 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74  b channel..*/.st
15b0: 61 74 69 63 20 69 6e 74 20 69 6e 63 72 62 6c 6f  atic int incrblo
15c0: 62 43 6c 6f 73 65 28 43 6c 69 65 6e 74 44 61 74  bClose(ClientDat
15d0: 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20  a instanceData, 
15e0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
15f0: 72 70 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43  rp){.  IncrblobC
1600: 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28 49 6e 63  hannel *p = (Inc
1610: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 69  rblobChannel *)i
1620: 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 69  nstanceData;.  i
1630: 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  nt rc = sqlite3_
1640: 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 2d 3e 70 42  blob_close(p->pB
1650: 6c 6f 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 20  lob);.  sqlite3 
1660: 2a 64 62 20 3d 20 70 2d 3e 70 44 62 2d 3e 64 62  *db = p->pDb->db
1670: 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74  ;..  /* Remove t
1680: 68 65 20 63 68 61 6e 6e 65 6c 20 66 72 6f 6d 20  he channel from 
1690: 74 68 65 20 53 71 6c 69 74 65 44 62 2e 70 49 6e  the SqliteDb.pIn
16a0: 63 72 62 6c 6f 62 20 6c 69 73 74 2e 20 2a 2f 0a  crblob list. */.
16b0: 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
16c0: 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e  {.    p->pNext->
16d0: 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76  pPrev = p->pPrev
16e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
16f0: 50 72 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70  Prev ){.    p->p
1700: 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d  Prev->pNext = p-
1710: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  >pNext;.  }.  if
1720: 28 20 70 2d 3e 70 44 62 2d 3e 70 49 6e 63 72 62  ( p->pDb->pIncrb
1730: 6c 6f 62 3d 3d 70 20 29 7b 0a 20 20 20 20 70 2d  lob==p ){.    p-
1740: 3e 70 44 62 2d 3e 70 49 6e 63 72 62 6c 6f 62 20  >pDb->pIncrblob 
1750: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  = p->pNext;.  }.
1760: 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20 49  .  /* Free the I
1770: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 73  ncrblobChannel s
1780: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 54 63  tructure */.  Tc
1790: 6c 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 70  l_Free((char *)p
17a0: 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  );..  if( rc!=SQ
17b0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
17c0: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
17d0: 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c  erp, (char *)sql
17e0: 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c  ite3_errmsg(db),
17f0: 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a   TCL_VOLATILE);.
1800: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1810: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
1820: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1830: 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66 72  .** Read data fr
1840: 6f 6d 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  om an incrementa
1850: 6c 20 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a  l blob channel..
1860: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
1870: 63 72 62 6c 6f 62 49 6e 70 75 74 28 0a 20 20 43  crblobInput(.  C
1880: 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e  lientData instan
1890: 63 65 44 61 74 61 2c 20 0a 20 20 63 68 61 72 20  ceData, .  char 
18a0: 2a 62 75 66 2c 20 0a 20 20 69 6e 74 20 62 75 66  *buf, .  int buf
18b0: 53 69 7a 65 2c 0a 20 20 69 6e 74 20 2a 65 72 72  Size,.  int *err
18c0: 6f 72 43 6f 64 65 50 74 72 0a 29 7b 0a 20 20 49  orCodePtr.){.  I
18d0: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a  ncrblobChannel *
18e0: 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68 61  p = (IncrblobCha
18f0: 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e 63 65 44  nnel *)instanceD
1900: 61 74 61 3b 0a 20 20 69 6e 74 20 6e 52 65 61 64  ata;.  int nRead
1910: 20 3d 20 62 75 66 53 69 7a 65 3b 20 20 20 20 20   = bufSize;     
1920: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1930: 20 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a   bytes to read *
1940: 2f 0a 20 20 69 6e 74 20 6e 42 6c 6f 62 3b 20 20  /.  int nBlob;  
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1960: 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f   /* Total size o
1970: 66 20 74 68 65 20 62 6c 6f 62 20 2a 2f 0a 20 20  f the blob */.  
1980: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19a0: 73 71 6c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  sqlite error cod
19b0: 65 20 2a 2f 0a 0a 20 20 6e 42 6c 6f 62 20 3d 20  e */..  nBlob = 
19c0: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74  sqlite3_blob_byt
19d0: 65 73 28 70 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20  es(p->pBlob);.  
19e0: 69 66 28 20 28 70 2d 3e 69 53 65 65 6b 2b 6e 52  if( (p->iSeek+nR
19f0: 65 61 64 29 3e 6e 42 6c 6f 62 20 29 7b 0a 20 20  ead)>nBlob ){.  
1a00: 20 20 6e 52 65 61 64 20 3d 20 6e 42 6c 6f 62 2d    nRead = nBlob-
1a10: 70 2d 3e 69 53 65 65 6b 3b 0a 20 20 7d 0a 20 20  p->iSeek;.  }.  
1a20: 69 66 28 20 6e 52 65 61 64 3c 3d 30 20 29 7b 0a  if( nRead<=0 ){.
1a30: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1a40: 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  }..  rc = sqlite
1a50: 33 5f 62 6c 6f 62 5f 72 65 61 64 28 70 2d 3e 70  3_blob_read(p->p
1a60: 42 6c 6f 62 2c 20 28 76 6f 69 64 20 2a 29 62 75  Blob, (void *)bu
1a70: 66 2c 20 6e 52 65 61 64 2c 20 70 2d 3e 69 53 65  f, nRead, p->iSe
1a80: 65 6b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ek);.  if( rc!=S
1a90: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1aa0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20  *errorCodePtr = 
1ab0: 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d  rc;.    return -
1ac0: 31 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69 53 65  1;.  }..  p->iSe
1ad0: 65 6b 20 2b 3d 20 6e 52 65 61 64 3b 0a 20 20 72  ek += nRead;.  r
1ae0: 65 74 75 72 6e 20 6e 52 65 61 64 3b 0a 7d 0a 0a  eturn nRead;.}..
1af0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61  /*.** Write data
1b00: 20 74 6f 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74   to an increment
1b10: 61 6c 20 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e  al blob channel.
1b20: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
1b30: 6e 63 72 62 6c 6f 62 4f 75 74 70 75 74 28 0a 20  ncrblobOutput(. 
1b40: 20 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74   ClientData inst
1b50: 61 6e 63 65 44 61 74 61 2c 20 0a 20 20 43 4f 4e  anceData, .  CON
1b60: 53 54 20 63 68 61 72 20 2a 62 75 66 2c 20 0a 20  ST char *buf, . 
1b70: 20 69 6e 74 20 74 6f 57 72 69 74 65 2c 0a 20 20   int toWrite,.  
1b80: 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 74  int *errorCodePt
1b90: 72 0a 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43  r.){.  IncrblobC
1ba0: 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28 49 6e 63  hannel *p = (Inc
1bb0: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 69  rblobChannel *)i
1bc0: 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 69  nstanceData;.  i
1bd0: 6e 74 20 6e 57 72 69 74 65 20 3d 20 74 6f 57 72  nt nWrite = toWr
1be0: 69 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e  ite;        /* N
1bf0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
1c00: 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 69 6e 74  o write */.  int
1c10: 20 6e 42 6c 6f 62 3b 20 20 20 20 20 20 20 20 20   nBlob;         
1c20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
1c30: 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62  al size of the b
1c40: 6c 6f 62 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  lob */.  int rc;
1c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c60: 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 20        /* sqlite 
1c70: 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 0a 20  error code */.. 
1c80: 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33   nBlob = sqlite3
1c90: 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70  _blob_bytes(p->p
1ca0: 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20 28 70 2d  Blob);.  if( (p-
1cb0: 3e 69 53 65 65 6b 2b 6e 57 72 69 74 65 29 3e 6e  >iSeek+nWrite)>n
1cc0: 42 6c 6f 62 20 29 7b 0a 20 20 20 20 2a 65 72 72  Blob ){.    *err
1cd0: 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 49 4e 56  orCodePtr = EINV
1ce0: 41 4c 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d  AL;.    return -
1cf0: 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 57 72  1;.  }.  if( nWr
1d00: 69 74 65 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65  ite<=0 ){.    re
1d10: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 72  turn 0;.  }..  r
1d20: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
1d30: 5f 77 72 69 74 65 28 70 2d 3e 70 42 6c 6f 62 2c  _write(p->pBlob,
1d40: 20 28 76 6f 69 64 20 2a 29 62 75 66 2c 20 6e 57   (void *)buf, nW
1d50: 72 69 74 65 2c 20 70 2d 3e 69 53 65 65 6b 29 3b  rite, p->iSeek);
1d60: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1d70: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 65 72 72  E_OK ){.    *err
1d80: 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 49 4f 3b  orCodePtr = EIO;
1d90: 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .    return -1;.
1da0: 20 20 7d 0a 0a 20 20 70 2d 3e 69 53 65 65 6b 20    }..  p->iSeek 
1db0: 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20 72 65 74  += nWrite;.  ret
1dc0: 75 72 6e 20 6e 57 72 69 74 65 3b 0a 7d 0a 0a 2f  urn nWrite;.}../
1dd0: 2a 0a 2a 2a 20 53 65 65 6b 20 61 6e 20 69 6e 63  *.** Seek an inc
1de0: 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 68  remental blob ch
1df0: 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  annel..*/.static
1e00: 20 69 6e 74 20 69 6e 63 72 62 6c 6f 62 53 65 65   int incrblobSee
1e10: 6b 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  k(.  ClientData 
1e20: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 0a 20  instanceData, . 
1e30: 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c 0a 20 20   long offset,.  
1e40: 69 6e 74 20 73 65 65 6b 4d 6f 64 65 2c 0a 20 20  int seekMode,.  
1e50: 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 74  int *errorCodePt
1e60: 72 0a 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43  r.){.  IncrblobC
1e70: 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28 49 6e 63  hannel *p = (Inc
1e80: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 69  rblobChannel *)i
1e90: 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 0a 20 20  nstanceData;..  
1ea0: 73 77 69 74 63 68 28 20 73 65 65 6b 4d 6f 64 65  switch( seekMode
1eb0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 45 45   ){.    case SEE
1ec0: 4b 5f 53 45 54 3a 0a 20 20 20 20 20 20 70 2d 3e  K_SET:.      p->
1ed0: 69 53 65 65 6b 20 3d 20 6f 66 66 73 65 74 3b 0a  iSeek = offset;.
1ee0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1ef0: 20 63 61 73 65 20 53 45 45 4b 5f 43 55 52 3a 0a   case SEEK_CUR:.
1f00: 20 20 20 20 20 20 70 2d 3e 69 53 65 65 6b 20 2b        p->iSeek +
1f10: 3d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  = offset;.      
1f20: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1f30: 53 45 45 4b 5f 45 4e 44 3a 0a 20 20 20 20 20 20  SEEK_END:.      
1f40: 70 2d 3e 69 53 65 65 6b 20 3d 20 73 71 6c 69 74  p->iSeek = sqlit
1f50: 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d  e3_blob_bytes(p-
1f60: 3e 70 42 6c 6f 62 29 20 2b 20 6f 66 66 73 65 74  >pBlob) + offset
1f70: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
1f80: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73      default: ass
1f90: 65 72 74 28 21 22 42 61 64 20 73 65 65 6b 4d 6f  ert(!"Bad seekMo
1fa0: 64 65 22 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  de");.  }..  ret
1fb0: 75 72 6e 20 70 2d 3e 69 53 65 65 6b 3b 0a 7d 0a  urn p->iSeek;.}.
1fc0: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  ..static void in
1fd0: 63 72 62 6c 6f 62 57 61 74 63 68 28 43 6c 69 65  crblobWatch(Clie
1fe0: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44  ntData instanceD
1ff0: 61 74 61 2c 20 69 6e 74 20 6d 6f 64 65 29 7b 20  ata, int mode){ 
2000: 0a 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 20 0a  .  /* NO-OP */ .
2010: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63  }.static int inc
2020: 72 62 6c 6f 62 48 61 6e 64 6c 65 28 43 6c 69 65  rblobHandle(Clie
2030: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44  ntData instanceD
2040: 61 74 61 2c 20 69 6e 74 20 64 69 72 2c 20 43 6c  ata, int dir, Cl
2050: 69 65 6e 74 44 61 74 61 20 2a 68 50 74 72 29 7b  ientData *hPtr){
2060: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  .  return TCL_ER
2070: 52 4f 52 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 54  ROR;.}..static T
2080: 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20 49  cl_ChannelType I
2090: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 54 79  ncrblobChannelTy
20a0: 70 65 20 3d 20 7b 0a 20 20 22 69 6e 63 72 62 6c  pe = {.  "incrbl
20b0: 6f 62 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ob",            
20c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74              /* t
20d0: 79 70 65 4e 61 6d 65 20 20 20 20 20 20 20 20 20  ypeName         
20e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f0: 20 20 20 20 2a 2f 0a 20 20 54 43 4c 5f 43 48 41      */.  TCL_CHA
2100: 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 32 2c 20  NNEL_VERSION_2, 
2110: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 76              /* v
2120: 65 72 73 69 6f 6e 20 20 20 20 20 20 20 20 20 20  ersion          
2130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2140: 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f      */.  incrblo
2150: 62 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  bClose,         
2160: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63              /* c
2170: 6c 6f 73 65 50 72 6f 63 20 20 20 20 20 20 20 20  loseProc        
2180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2190: 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f      */.  incrblo
21a0: 62 49 6e 70 75 74 2c 20 20 20 20 20 20 20 20 20  bInput,         
21b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
21c0: 6e 70 75 74 50 72 6f 63 20 20 20 20 20 20 20 20  nputProc        
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e0: 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f      */.  incrblo
21f0: 62 4f 75 74 70 75 74 2c 20 20 20 20 20 20 20 20  bOutput,        
2200: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f              /* o
2210: 75 74 70 75 74 50 72 6f 63 20 20 20 20 20 20 20  utputProc       
2220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2230: 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f      */.  incrblo
2240: 62 53 65 65 6b 2c 20 20 20 20 20 20 20 20 20 20  bSeek,          
2250: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
2260: 65 65 6b 50 72 6f 63 20 20 20 20 20 20 20 20 20  eekProc         
2270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2280: 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20      */.  0,     
2290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
22b0: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 20 20 20  etOptionProc    
22c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d0: 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20      */.  0,     
22e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 67              /* g
2300: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 20 20 20  etOptionProc    
2310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2320: 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f      */.  incrblo
2330: 62 57 61 74 63 68 2c 20 20 20 20 20 20 20 20 20  bWatch,         
2340: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 77              /* w
2350: 61 74 63 68 50 72 6f 63 20 28 74 68 69 73 20 69  atchProc (this i
2360: 73 20 61 20 6e 6f 2d 6f 70 29 20 20 20 20 20 20  s a no-op)      
2370: 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f      */.  incrblo
2380: 62 48 61 6e 64 6c 65 2c 20 20 20 20 20 20 20 20  bHandle,        
2390: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 67              /* g
23a0: 65 74 48 61 6e 64 6c 65 50 72 6f 63 20 28 61 6c  etHandleProc (al
23b0: 77 61 79 73 20 72 65 74 75 72 6e 73 20 65 72 72  ways returns err
23c0: 6f 72 29 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  or) */.  0,     
23d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63              /* c
23f0: 6c 6f 73 65 32 50 72 6f 63 20 20 20 20 20 20 20  lose2Proc       
2400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2410: 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20      */.  0,     
2420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2430: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 62              /* b
2440: 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 20 20 20 20  lockModeProc    
2450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2460: 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20      */.  0,     
2470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2480: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
2490: 6c 75 73 68 50 72 6f 63 20 20 20 20 20 20 20 20  lushProc        
24a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b0: 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20      */.  0,     
24c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 68              /* h
24e0: 61 6e 64 6c 65 72 50 72 6f 63 20 20 20 20 20 20  andlerProc      
24f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2500: 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20      */.  0,     
2510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2520: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 77              /* w
2530: 69 64 65 53 65 65 6b 50 72 6f 63 20 20 20 20 20  ideSeekProc     
2540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2550: 20 20 20 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a      */.};../*.**
2560: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e   Create a new in
2570: 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a  crblob channel..
2580: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 72  */.static int cr
2590: 65 61 74 65 49 6e 63 72 62 6c 6f 62 43 68 61 6e  eateIncrblobChan
25a0: 6e 65 6c 28 0a 20 20 54 63 6c 5f 49 6e 74 65 72  nel(.  Tcl_Inter
25b0: 70 20 2a 69 6e 74 65 72 70 2c 20 0a 20 20 53 71  p *interp, .  Sq
25c0: 6c 69 74 65 44 62 20 2a 70 44 62 2c 20 0a 20 20  liteDb *pDb, .  
25d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c  const char *zDb,
25e0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
25f0: 54 61 62 6c 65 2c 20 0a 20 20 63 6f 6e 73 74 20  Table, .  const 
2600: 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 2c 20 0a  char *zColumn, .
2610: 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69    sqlite_int64 i
2620: 52 6f 77 2c 0a 20 20 69 6e 74 20 69 73 52 65 61  Row,.  int isRea
2630: 64 6f 6e 6c 79 0a 29 7b 0a 20 20 49 6e 63 72 62  donly.){.  Incrb
2640: 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 3b 0a 20  lobChannel *p;. 
2650: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
2660: 44 62 2d 3e 64 62 3b 0a 20 20 73 71 6c 69 74 65  Db->db;.  sqlite
2670: 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 3b 0a 20  3_blob *pBlob;. 
2680: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 66   int rc;.  int f
2690: 6c 61 67 73 20 3d 20 54 43 4c 5f 52 45 41 44 41  lags = TCL_READA
26a0: 42 4c 45 7c 28 69 73 52 65 61 64 6f 6e 6c 79 20  BLE|(isReadonly 
26b0: 3f 20 30 20 3a 20 54 43 4c 5f 57 52 49 54 41 42  ? 0 : TCL_WRITAB
26c0: 4c 45 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  LE);..  /* This 
26d0: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
26e0: 20 74 6f 20 6e 61 6d 65 20 74 68 65 20 63 68 61   to name the cha
26f0: 6e 6e 65 6c 73 3a 20 22 69 6e 63 72 62 6c 6f 62  nnels: "incrblob
2700: 5f 5b 69 6e 63 72 20 63 6f 75 6e 74 5d 22 20 2a  _[incr count]" *
2710: 2f 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 63  /.  static int c
2720: 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 63 68 61 72  ount = 0;.  char
2730: 20 7a 43 68 61 6e 6e 65 6c 5b 36 34 5d 3b 0a 0a   zChannel[64];..
2740: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
2750: 6c 6f 62 5f 6f 70 65 6e 28 64 62 2c 20 7a 44 62  lob_open(db, zDb
2760: 2c 20 7a 54 61 62 6c 65 2c 20 7a 43 6f 6c 75 6d  , zTable, zColum
2770: 6e 2c 20 69 52 6f 77 2c 20 21 69 73 52 65 61 64  n, iRow, !isRead
2780: 6f 6e 6c 79 2c 20 26 70 42 6c 6f 62 29 3b 0a 20  only, &pBlob);. 
2790: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
27a0: 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65  OK ){.    Tcl_Se
27b0: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
27c0: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
27d0: 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c  errmsg(pDb->db),
27e0: 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a   TCL_VOLATILE);.
27f0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2800: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d  RROR;.  }..  p =
2810: 20 28 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65   (IncrblobChanne
2820: 6c 20 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 73 69  l *)Tcl_Alloc(si
2830: 7a 65 6f 66 28 49 6e 63 72 62 6c 6f 62 43 68 61  zeof(IncrblobCha
2840: 6e 6e 65 6c 29 29 3b 0a 20 20 70 2d 3e 69 53 65  nnel));.  p->iSe
2850: 65 6b 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 42 6c  ek = 0;.  p->pBl
2860: 6f 62 20 3d 20 70 42 6c 6f 62 3b 0a 0a 20 20 73  ob = pBlob;..  s
2870: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2880: 73 69 7a 65 6f 66 28 7a 43 68 61 6e 6e 65 6c 29  sizeof(zChannel)
2890: 2c 20 7a 43 68 61 6e 6e 65 6c 2c 20 22 69 6e 63  , zChannel, "inc
28a0: 72 62 6c 6f 62 5f 25 64 22 2c 20 2b 2b 63 6f 75  rblob_%d", ++cou
28b0: 6e 74 29 3b 0a 20 20 70 2d 3e 63 68 61 6e 6e 65  nt);.  p->channe
28c0: 6c 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 43 68  l = Tcl_CreateCh
28d0: 61 6e 6e 65 6c 28 26 49 6e 63 72 62 6c 6f 62 43  annel(&IncrblobC
28e0: 68 61 6e 6e 65 6c 54 79 70 65 2c 20 7a 43 68 61  hannelType, zCha
28f0: 6e 6e 65 6c 2c 20 70 2c 20 66 6c 61 67 73 29 3b  nnel, p, flags);
2900: 0a 20 20 54 63 6c 5f 52 65 67 69 73 74 65 72 43  .  Tcl_RegisterC
2910: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 70  hannel(interp, p
2920: 2d 3e 63 68 61 6e 6e 65 6c 29 3b 0a 0a 20 20 2f  ->channel);..  /
2930: 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20 63  * Link the new c
2940: 68 61 6e 6e 65 6c 20 69 6e 74 6f 20 74 68 65 20  hannel into the 
2950: 53 71 6c 69 74 65 44 62 2e 70 49 6e 63 72 62 6c  SqliteDb.pIncrbl
2960: 6f 62 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 70 2d  ob list. */.  p-
2970: 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 70 49  >pNext = pDb->pI
2980: 6e 63 72 62 6c 6f 62 3b 0a 20 20 70 2d 3e 70 50  ncrblob;.  p->pP
2990: 72 65 76 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  rev = 0;.  if( p
29a0: 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70  ->pNext ){.    p
29b0: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
29c0: 20 70 3b 0a 20 20 7d 0a 20 20 70 44 62 2d 3e 70   p;.  }.  pDb->p
29d0: 49 6e 63 72 62 6c 6f 62 20 3d 20 70 3b 0a 20 20  Incrblob = p;.  
29e0: 70 2d 3e 70 44 62 20 3d 20 70 44 62 3b 0a 0a 20  p->pDb = pDb;.. 
29f0: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
2a00: 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 54  nterp, (char *)T
2a10: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
2a20: 65 28 70 2d 3e 63 68 61 6e 6e 65 6c 29 2c 20 54  e(p->channel), T
2a30: 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20  CL_VOLATILE);.  
2a40: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
2a50: 0a 23 65 6c 73 65 20 20 2f 2a 20 65 6c 73 65 20  .#else  /* else 
2a60: 63 6c 61 75 73 65 20 66 6f 72 20 22 23 69 66 6e  clause for "#ifn
2a70: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2a80: 49 4e 43 52 42 4c 4f 42 22 20 2a 2f 0a 20 20 23  INCRBLOB" */.  #
2a90: 64 65 66 69 6e 65 20 63 6c 6f 73 65 49 6e 63 72  define closeIncr
2aa0: 62 6c 6f 62 43 68 61 6e 6e 65 6c 73 28 70 44 62  blobChannels(pDb
2ab0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
2ac0: 4c 6f 6f 6b 20 61 74 20 74 68 65 20 73 63 72 69  Look at the scri
2ad0: 70 74 20 70 72 65 66 69 78 20 69 6e 20 70 43 6d  pt prefix in pCm
2ae0: 64 2e 20 20 57 65 20 77 69 6c 6c 20 62 65 20 65  d.  We will be e
2af0: 78 65 63 75 74 69 6e 67 20 74 68 69 73 20 73 63  xecuting this sc
2b00: 72 69 70 74 0a 2a 2a 20 61 66 74 65 72 20 66 69  ript.** after fi
2b10: 72 73 74 20 61 70 70 65 6e 64 69 6e 67 20 6f 6e  rst appending on
2b20: 65 20 6f 72 20 6d 6f 72 65 20 61 72 67 75 6d 65  e or more argume
2b30: 6e 74 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69  nts.  This routi
2b40: 6e 65 20 61 6e 61 6c 79 7a 65 73 0a 2a 2a 20 74  ne analyzes.** t
2b50: 68 65 20 73 63 72 69 70 74 20 74 6f 20 73 65 65  he script to see
2b60: 20 69 66 20 69 74 20 69 73 20 73 61 66 65 20 74   if it is safe t
2b70: 6f 20 75 73 65 20 54 63 6c 5f 45 76 61 6c 4f 62  o use Tcl_EvalOb
2b80: 6a 76 28 29 20 6f 6e 20 74 68 65 20 73 63 72 69  jv() on the scri
2b90: 70 74 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61  pt.** rather tha
2ba0: 6e 20 74 68 65 20 6d 6f 72 65 20 67 65 6e 65 72  n the more gener
2bb0: 61 6c 20 54 63 6c 5f 45 76 61 6c 45 78 28 29 2e  al Tcl_EvalEx().
2bc0: 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29    Tcl_EvalObjv()
2bd0: 20 69 73 20 6d 75 63 68 0a 2a 2a 20 66 61 73 74   is much.** fast
2be0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 63 72 69 70 74  er..**.** Script
2bf0: 73 20 74 68 61 74 20 61 72 65 20 73 61 66 65 20  s that are safe 
2c00: 74 6f 20 75 73 65 20 77 69 74 68 20 54 63 6c 5f  to use with Tcl_
2c10: 45 76 61 6c 4f 62 6a 76 28 29 20 63 6f 6e 73 69  EvalObjv() consi
2c20: 73 74 73 20 6f 66 20 61 0a 2a 2a 20 63 6f 6d 6d  sts of a.** comm
2c30: 61 6e 64 20 6e 61 6d 65 20 66 6f 6c 6c 6f 77 65  and name followe
2c40: 64 20 62 79 20 7a 65 72 6f 20 6f 72 20 6d 6f 72  d by zero or mor
2c50: 65 20 61 72 67 75 6d 65 6e 74 73 20 77 69 74 68  e arguments with
2c60: 20 6e 6f 20 5b 2e 2e 2e 5d 20 6f 72 20 24 0a 2a   no [...] or $.*
2c70: 2a 20 6f 72 20 7b 2e 2e 2e 7d 20 6f 72 20 3b 20  * or {...} or ; 
2c80: 74 6f 20 62 65 20 73 65 65 6e 20 61 6e 79 77 68  to be seen anywh
2c90: 65 72 65 2e 20 20 4d 6f 73 74 20 63 61 6c 6c 62  ere.  Most callb
2ca0: 61 63 6b 20 73 63 72 69 70 74 73 20 63 6f 6e 73  ack scripts cons
2cb0: 69 73 74 0a 2a 2a 20 6f 66 20 6a 75 73 74 20 61  ist.** of just a
2cc0: 20 73 69 6e 67 6c 65 20 70 72 6f 63 65 64 75 72   single procedur
2cd0: 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 79 20  e name and they 
2ce0: 6d 65 65 74 20 74 68 69 73 20 72 65 71 75 69 72  meet this requir
2cf0: 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ement..*/.static
2d00: 20 69 6e 74 20 73 61 66 65 54 6f 55 73 65 45 76   int safeToUseEv
2d10: 61 6c 4f 62 6a 76 28 54 63 6c 5f 49 6e 74 65 72  alObjv(Tcl_Inter
2d20: 70 20 2a 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f  p *interp, Tcl_O
2d30: 62 6a 20 2a 70 43 6d 64 29 7b 0a 20 20 2f 2a 20  bj *pCmd){.  /* 
2d40: 57 65 20 63 6f 75 6c 64 20 74 72 79 20 74 6f 20  We could try to 
2d50: 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77 69 74  do something wit
2d60: 68 20 54 63 6c 5f 50 61 72 73 65 28 29 2e 20 20  h Tcl_Parse().  
2d70: 42 75 74 20 77 65 20 77 69 6c 6c 20 69 6e 73 74  But we will inst
2d80: 65 61 64 0a 20 20 2a 2a 20 6a 75 73 74 20 64 6f  ead.  ** just do
2d90: 20 61 20 73 65 61 72 63 68 20 66 6f 72 20 66 6f   a search for fo
2da0: 72 62 69 64 64 65 6e 20 63 68 61 72 61 63 74 65  rbidden characte
2db0: 72 73 2e 20 20 49 66 20 61 6e 79 20 6f 66 20 74  rs.  If any of t
2dc0: 68 65 20 66 6f 72 62 69 64 64 65 6e 0a 20 20 2a  he forbidden.  *
2dd0: 2a 20 63 68 61 72 61 63 74 65 72 73 20 61 70 70  * characters app
2de0: 65 61 72 20 69 6e 20 70 43 6d 64 2c 20 77 65 20  ear in pCmd, we 
2df0: 77 69 6c 6c 20 72 65 70 6f 72 74 20 74 68 65 20  will report the 
2e00: 73 74 72 69 6e 67 20 61 73 20 75 6e 73 61 66 65  string as unsafe
2e10: 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ..  */.  const c
2e20: 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 3b  har *z;.  int n;
2e30: 0a 20 20 7a 20 3d 20 54 63 6c 5f 47 65 74 53 74  .  z = Tcl_GetSt
2e40: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 43 6d 64  ringFromObj(pCmd
2e50: 2c 20 26 6e 29 3b 0a 20 20 77 68 69 6c 65 28 20  , &n);.  while( 
2e60: 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 69  n-- > 0 ){.    i
2e70: 6e 74 20 63 20 3d 20 2a 28 7a 2b 2b 29 3b 0a 20  nt c = *(z++);. 
2e80: 20 20 20 69 66 28 20 63 3d 3d 27 24 27 20 7c 7c     if( c=='$' ||
2e90: 20 63 3d 3d 27 5b 27 20 7c 7c 20 63 3d 3d 27 3b   c=='[' || c==';
2ea0: 27 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ' ) return 0;.  
2eb0: 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
2ec0: 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 6e 20 53  ./*.** Find an S
2ed0: 71 6c 46 75 6e 63 20 73 74 72 75 63 74 75 72 65  qlFunc structure
2ee0: 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
2ef0: 6e 61 6d 65 2e 20 20 4f 72 20 63 72 65 61 74 65  name.  Or create
2f00: 20 61 20 6e 65 77 0a 2a 2a 20 6f 6e 65 20 69 66   a new.** one if
2f10: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6f 6e 65   an existing one
2f20: 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
2f30: 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
2f40: 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73 74  ter to the.** st
2f50: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
2f60: 69 63 20 53 71 6c 46 75 6e 63 20 2a 66 69 6e 64  ic SqlFunc *find
2f70: 53 71 6c 46 75 6e 63 28 53 71 6c 69 74 65 44 62  SqlFunc(SqliteDb
2f80: 20 2a 70 44 62 2c 20 63 6f 6e 73 74 20 63 68 61   *pDb, const cha
2f90: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 53 71 6c  r *zName){.  Sql
2fa0: 46 75 6e 63 20 2a 70 2c 20 2a 70 4e 65 77 3b 0a  Func *p, *pNew;.
2fb0: 20 20 69 6e 74 20 69 3b 0a 20 20 70 4e 65 77 20    int i;.  pNew 
2fc0: 3d 20 28 53 71 6c 46 75 6e 63 2a 29 54 63 6c 5f  = (SqlFunc*)Tcl_
2fd0: 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  Alloc( sizeof(*p
2fe0: 4e 65 77 29 20 2b 20 73 74 72 6c 65 6e 28 7a 4e  New) + strlen(zN
2ff0: 61 6d 65 29 20 2b 20 31 20 29 3b 0a 20 20 70 4e  ame) + 1 );.  pN
3000: 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61  ew->zName = (cha
3010: 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 66  r*)&pNew[1];.  f
3020: 6f 72 28 69 3d 30 3b 20 7a 4e 61 6d 65 5b 69 5d  or(i=0; zName[i]
3030: 3b 20 69 2b 2b 29 7b 20 70 4e 65 77 2d 3e 7a 4e  ; i++){ pNew->zN
3040: 61 6d 65 5b 69 5d 20 3d 20 74 6f 6c 6f 77 65 72  ame[i] = tolower
3050: 28 7a 4e 61 6d 65 5b 69 5d 29 3b 20 7d 0a 20 20  (zName[i]); }.  
3060: 70 4e 65 77 2d 3e 7a 4e 61 6d 65 5b 69 5d 20 3d  pNew->zName[i] =
3070: 20 30 3b 0a 20 20 66 6f 72 28 70 3d 70 44 62 2d   0;.  for(p=pDb-
3080: 3e 70 46 75 6e 63 3b 20 70 3b 20 70 3d 70 2d 3e  >pFunc; p; p=p->
3090: 70 4e 65 78 74 29 7b 20 0a 20 20 20 20 69 66 28  pNext){ .    if(
30a0: 20 73 74 72 63 6d 70 28 70 2d 3e 7a 4e 61 6d 65   strcmp(p->zName
30b0: 2c 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 29 3d 3d  , pNew->zName)==
30c0: 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 46  0 ){.      Tcl_F
30d0: 72 65 65 28 28 63 68 61 72 2a 29 70 4e 65 77 29  ree((char*)pNew)
30e0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  ;.      return p
30f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e  ;.    }.  }.  pN
3100: 65 77 2d 3e 69 6e 74 65 72 70 20 3d 20 70 44 62  ew->interp = pDb
3110: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 70 4e 65 77  ->interp;.  pNew
3120: 2d 3e 70 53 63 72 69 70 74 20 3d 20 30 3b 0a 20  ->pScript = 0;. 
3130: 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70   pNew->pNext = p
3140: 44 62 2d 3e 70 46 75 6e 63 3b 0a 20 20 70 44 62  Db->pFunc;.  pDb
3150: 2d 3e 70 46 75 6e 63 20 3d 20 70 4e 65 77 3b 0a  ->pFunc = pNew;.
3160: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
3170: 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 61 6c 69 7a 65  ../*.** Finalize
3180: 20 61 6e 64 20 66 72 65 65 20 61 20 6c 69 73 74   and free a list
3190: 20 6f 66 20 70 72 65 70 61 72 65 64 20 73 74 61   of prepared sta
31a0: 74 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69  tements.*/.stati
31b0: 63 20 76 6f 69 64 20 66 6c 75 73 68 53 74 6d 74  c void flushStmt
31c0: 43 61 63 68 65 28 20 53 71 6c 69 74 65 44 62 20  Cache( SqliteDb 
31d0: 2a 70 44 62 20 29 7b 0a 20 20 53 71 6c 50 72 65  *pDb ){.  SqlPre
31e0: 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65 53  paredStmt *pPreS
31f0: 74 6d 74 3b 0a 0a 20 20 77 68 69 6c 65 28 20 20  tmt;..  while(  
3200: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 29 7b  pDb->stmtList ){
3210: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
3220: 61 6c 69 7a 65 28 20 70 44 62 2d 3e 73 74 6d 74  alize( pDb->stmt
3230: 4c 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20  List->pStmt );. 
3240: 20 20 20 70 50 72 65 53 74 6d 74 20 3d 20 70 44     pPreStmt = pD
3250: 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 0a 20 20 20  b->stmtList;.   
3260: 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d   pDb->stmtList =
3270: 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 2d 3e   pDb->stmtList->
3280: 70 4e 65 78 74 3b 0a 20 20 20 20 54 63 6c 5f 46  pNext;.    Tcl_F
3290: 72 65 65 28 20 28 63 68 61 72 2a 29 70 50 72 65  ree( (char*)pPre
32a0: 53 74 6d 74 20 29 3b 0a 20 20 7d 0a 20 20 70 44  Stmt );.  }.  pD
32b0: 62 2d 3e 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  b->nStmt = 0;.  
32c0: 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20  pDb->stmtLast = 
32d0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 43 4c 20  0;.}../*.** TCL 
32e0: 63 61 6c 6c 73 20 74 68 69 73 20 70 72 6f 63 65  calls this proce
32f0: 64 75 72 65 20 77 68 65 6e 20 61 6e 20 73 71 6c  dure when an sql
3300: 69 74 65 33 20 64 61 74 61 62 61 73 65 20 63 6f  ite3 database co
3310: 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 64 65 6c 65  mmand is.** dele
3320: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ted..*/.static v
3330: 6f 69 64 20 44 62 44 65 6c 65 74 65 43 6d 64 28  oid DbDeleteCmd(
3340: 76 6f 69 64 20 2a 64 62 29 7b 0a 20 20 53 71 6c  void *db){.  Sql
3350: 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71  iteDb *pDb = (Sq
3360: 6c 69 74 65 44 62 2a 29 64 62 3b 0a 20 20 66 6c  liteDb*)db;.  fl
3370: 75 73 68 53 74 6d 74 43 61 63 68 65 28 70 44 62  ushStmtCache(pDb
3380: 29 3b 0a 20 20 63 6c 6f 73 65 49 6e 63 72 62 6c  );.  closeIncrbl
3390: 6f 62 43 68 61 6e 6e 65 6c 73 28 70 44 62 29 3b  obChannels(pDb);
33a0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  .  sqlite3_close
33b0: 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20 77 68 69  (pDb->db);.  whi
33c0: 6c 65 28 20 70 44 62 2d 3e 70 46 75 6e 63 20 29  le( pDb->pFunc )
33d0: 7b 0a 20 20 20 20 53 71 6c 46 75 6e 63 20 2a 70  {.    SqlFunc *p
33e0: 46 75 6e 63 20 3d 20 70 44 62 2d 3e 70 46 75 6e  Func = pDb->pFun
33f0: 63 3b 0a 20 20 20 20 70 44 62 2d 3e 70 46 75 6e  c;.    pDb->pFun
3400: 63 20 3d 20 70 46 75 6e 63 2d 3e 70 4e 65 78 74  c = pFunc->pNext
3410: 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  ;.    Tcl_DecrRe
3420: 66 43 6f 75 6e 74 28 70 46 75 6e 63 2d 3e 70 53  fCount(pFunc->pS
3430: 63 72 69 70 74 29 3b 0a 20 20 20 20 54 63 6c 5f  cript);.    Tcl_
3440: 46 72 65 65 28 28 63 68 61 72 2a 29 70 46 75 6e  Free((char*)pFun
3450: 63 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28  c);.  }.  while(
3460: 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20 29   pDb->pCollate )
3470: 7b 0a 20 20 20 20 53 71 6c 43 6f 6c 6c 61 74 65  {.    SqlCollate
3480: 20 2a 70 43 6f 6c 6c 61 74 65 20 3d 20 70 44 62   *pCollate = pDb
3490: 2d 3e 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20  ->pCollate;.    
34a0: 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20 3d 20  pDb->pCollate = 
34b0: 70 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78 74 3b  pCollate->pNext;
34c0: 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63  .    Tcl_Free((c
34d0: 68 61 72 2a 29 70 43 6f 6c 6c 61 74 65 29 3b 0a  har*)pCollate);.
34e0: 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a    }.  if( pDb->z
34f0: 42 75 73 79 20 29 7b 0a 20 20 20 20 54 63 6c 5f  Busy ){.    Tcl_
3500: 46 72 65 65 28 70 44 62 2d 3e 7a 42 75 73 79 29  Free(pDb->zBusy)
3510: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d  ;.  }.  if( pDb-
3520: 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20 20 20 54  >zTrace ){.    T
3530: 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 54 72  cl_Free(pDb->zTr
3540: 61 63 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ace);.  }.  if( 
3550: 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b  pDb->zProfile ){
3560: 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44  .    Tcl_Free(pD
3570: 62 2d 3e 7a 50 72 6f 66 69 6c 65 29 3b 0a 20 20  b->zProfile);.  
3580: 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75  }.  if( pDb->zAu
3590: 74 68 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72  th ){.    Tcl_Fr
35a0: 65 65 28 70 44 62 2d 3e 7a 41 75 74 68 29 3b 0a  ee(pDb->zAuth);.
35b0: 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a    }.  if( pDb->z
35c0: 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 54 63 6c 5f  Null ){.    Tcl_
35d0: 46 72 65 65 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29  Free(pDb->zNull)
35e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d  ;.  }.  if( pDb-
35f0: 3e 70 55 70 64 61 74 65 48 6f 6f 6b 20 29 7b 0a  >pUpdateHook ){.
3600: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
3610: 6f 75 6e 74 28 70 44 62 2d 3e 70 55 70 64 61 74  ount(pDb->pUpdat
3620: 65 48 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20 69 66  eHook);.  }.  if
3630: 28 20 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b  ( pDb->pRollback
3640: 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  Hook ){.    Tcl_
3650: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62  DecrRefCount(pDb
3660: 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 29  ->pRollbackHook)
3670: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d  ;.  }.  if( pDb-
3680: 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 20  >pCollateNeeded 
3690: 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52  ){.    Tcl_DecrR
36a0: 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f  efCount(pDb->pCo
36b0: 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20  llateNeeded);.  
36c0: 7d 0a 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68  }.  Tcl_Free((ch
36d0: 61 72 2a 29 70 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a  ar*)pDb);.}../*.
36e0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
36f0: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
3700: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
3710: 73 20 6c 6f 63 6b 65 64 20 77 68 69 6c 65 20 74  s locked while t
3720: 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 65 78 65 63  rying.** to exec
3730: 75 74 65 20 53 51 4c 2e 0a 2a 2f 0a 73 74 61 74  ute SQL..*/.stat
3740: 69 63 20 69 6e 74 20 44 62 42 75 73 79 48 61 6e  ic int DbBusyHan
3750: 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 2c 20 69  dler(void *cd, i
3760: 6e 74 20 6e 54 72 69 65 73 29 7b 0a 20 20 53 71  nt nTries){.  Sq
3770: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
3780: 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69  qliteDb*)cd;.  i
3790: 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 56  nt rc;.  char zV
37a0: 61 6c 5b 33 30 5d 3b 0a 0a 20 20 73 71 6c 69 74  al[30];..  sqlit
37b0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
37c0: 6f 66 28 7a 56 61 6c 29 2c 20 7a 56 61 6c 2c 20  of(zVal), zVal, 
37d0: 22 25 64 22 2c 20 6e 54 72 69 65 73 29 3b 0a 20  "%d", nTries);. 
37e0: 20 72 63 20 3d 20 54 63 6c 5f 56 61 72 45 76 61   rc = Tcl_VarEva
37f0: 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70  l(pDb->interp, p
3800: 44 62 2d 3e 7a 42 75 73 79 2c 20 22 20 22 2c 20  Db->zBusy, " ", 
3810: 7a 56 61 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b  zVal, (char*)0);
3820: 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f  .  if( rc!=TCL_O
3830: 4b 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65  K || atoi(Tcl_Ge
3840: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44  tStringResult(pD
3850: 62 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a 20  b->interp)) ){. 
3860: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
3870: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
3880: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
3890: 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c  MIT_PROGRESS_CAL
38a0: 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73  LBACK./*.** This
38b0: 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f   routine is invo
38c0: 6b 65 64 20 61 73 20 74 68 65 20 27 70 72 6f 67  ked as the 'prog
38d0: 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 27 20 66  ress callback' f
38e0: 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  or the database.
38f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44  .*/.static int D
3900: 62 50 72 6f 67 72 65 73 73 48 61 6e 64 6c 65 72  bProgressHandler
3910: 28 76 6f 69 64 20 2a 63 64 29 7b 0a 20 20 53 71  (void *cd){.  Sq
3920: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
3930: 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69  qliteDb*)cd;.  i
3940: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
3950: 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73  ( pDb->zProgress
3960: 20 29 3b 0a 20 20 72 63 20 3d 20 54 63 6c 5f 45   );.  rc = Tcl_E
3970: 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  val(pDb->interp,
3980: 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 29   pDb->zProgress)
3990: 3b 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f  ;.  if( rc!=TCL_
39a0: 4f 4b 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47  OK || atoi(Tcl_G
39b0: 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70  etStringResult(p
39c0: 44 62 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a  Db->interp)) ){.
39d0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
39e0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
39f0: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
3a00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
3a10: 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E./*.** This rou
3a20: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
3a30: 79 20 74 68 65 20 53 51 4c 69 74 65 20 74 72 61  y the SQLite tra
3a40: 63 65 20 68 61 6e 64 6c 65 72 20 77 68 65 6e 65  ce handler whene
3a50: 76 65 72 20 61 20 6e 65 77 0a 2a 2a 20 62 6c 6f  ver a new.** blo
3a60: 63 6b 20 6f 66 20 53 51 4c 20 69 73 20 65 78 65  ck of SQL is exe
3a70: 63 75 74 65 64 2e 20 20 54 68 65 20 54 43 4c 20  cuted.  The TCL 
3a80: 73 63 72 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a  script in pDb->z
3a90: 54 72 61 63 65 20 69 73 20 65 78 65 63 75 74 65  Trace is execute
3aa0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
3ab0: 64 20 44 62 54 72 61 63 65 48 61 6e 64 6c 65 72  d DbTraceHandler
3ac0: 28 76 6f 69 64 20 2a 63 64 2c 20 63 6f 6e 73 74  (void *cd, const
3ad0: 20 63 68 61 72 20 2a 7a 53 71 6c 29 7b 0a 20 20   char *zSql){.  
3ae0: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
3af0: 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20  (SqliteDb*)cd;. 
3b00: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72   Tcl_DString str
3b10: 3b 0a 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  ;..  Tcl_DString
3b20: 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 54 63  Init(&str);.  Tc
3b30: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28  l_DStringAppend(
3b40: 26 73 74 72 2c 20 70 44 62 2d 3e 7a 54 72 61 63  &str, pDb->zTrac
3b50: 65 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53  e, -1);.  Tcl_DS
3b60: 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65  tringAppendEleme
3b70: 6e 74 28 26 73 74 72 2c 20 7a 53 71 6c 29 3b 0a  nt(&str, zSql);.
3b80: 20 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e    Tcl_Eval(pDb->
3b90: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53 74 72  interp, Tcl_DStr
3ba0: 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29 29 3b  ingValue(&str));
3bb0: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72  .  Tcl_DStringFr
3bc0: 65 65 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f  ee(&str);.  Tcl_
3bd0: 52 65 73 65 74 52 65 73 75 6c 74 28 70 44 62 2d  ResetResult(pDb-
3be0: 3e 69 6e 74 65 72 70 29 3b 0a 7d 0a 23 65 6e 64  >interp);.}.#end
3bf0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
3c00: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a  TE_OMIT_TRACE./*
3c10: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
3c20: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
3c30: 65 20 53 51 4c 69 74 65 20 70 72 6f 66 69 6c 65  e SQLite profile
3c40: 20 68 61 6e 64 6c 65 72 20 61 66 74 65 72 20 61   handler after a
3c50: 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 53 51   statement.** SQ
3c60: 4c 20 68 61 73 20 65 78 65 63 75 74 65 64 2e 20  L has executed. 
3c70: 20 54 68 65 20 54 43 4c 20 73 63 72 69 70 74 20   The TCL script 
3c80: 69 6e 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65  in pDb->zProfile
3c90: 20 69 73 20 65 76 61 6c 75 61 74 65 64 2e 0a 2a   is evaluated..*
3ca0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44 62  /.static void Db
3cb0: 50 72 6f 66 69 6c 65 48 61 6e 64 6c 65 72 28 76  ProfileHandler(v
3cc0: 6f 69 64 20 2a 63 64 2c 20 63 6f 6e 73 74 20 63  oid *cd, const c
3cd0: 68 61 72 20 2a 7a 53 71 6c 2c 20 73 71 6c 69 74  har *zSql, sqlit
3ce0: 65 5f 75 69 6e 74 36 34 20 74 6d 29 7b 0a 20 20  e_uint64 tm){.  
3cf0: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
3d00: 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20  (SqliteDb*)cd;. 
3d10: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72   Tcl_DString str
3d20: 3b 0a 20 20 63 68 61 72 20 7a 54 6d 5b 31 30 30  ;.  char zTm[100
3d30: 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  ];..  sqlite3_sn
3d40: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 54  printf(sizeof(zT
3d50: 6d 29 2d 31 2c 20 7a 54 6d 2c 20 22 25 6c 6c 64  m)-1, zTm, "%lld
3d60: 22 2c 20 74 6d 29 3b 0a 20 20 54 63 6c 5f 44 53  ", tm);.  Tcl_DS
3d70: 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b  tringInit(&str);
3d80: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70  .  Tcl_DStringAp
3d90: 70 65 6e 64 28 26 73 74 72 2c 20 70 44 62 2d 3e  pend(&str, pDb->
3da0: 7a 50 72 6f 66 69 6c 65 2c 20 2d 31 29 3b 0a 20  zProfile, -1);. 
3db0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
3dc0: 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20  ndElement(&str, 
3dd0: 7a 53 71 6c 29 3b 0a 20 20 54 63 6c 5f 44 53 74  zSql);.  Tcl_DSt
3de0: 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e  ringAppendElemen
3df0: 74 28 26 73 74 72 2c 20 7a 54 6d 29 3b 0a 20 20  t(&str, zTm);.  
3e00: 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e  Tcl_Eval(pDb->in
3e10: 74 65 72 70 2c 20 54 63 6c 5f 44 53 74 72 69 6e  terp, Tcl_DStrin
3e20: 67 56 61 6c 75 65 28 26 73 74 72 29 29 3b 0a 20  gValue(&str));. 
3e30: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
3e40: 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f 52 65  (&str);.  Tcl_Re
3e50: 73 65 74 52 65 73 75 6c 74 28 70 44 62 2d 3e 69  setResult(pDb->i
3e60: 6e 74 65 72 70 29 3b 0a 7d 0a 23 65 6e 64 69 66  nterp);.}.#endif
3e70: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
3e80: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
3e90: 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hen a transactio
3ea0: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 20  n is committed. 
3eb0: 20 54 68 65 0a 2a 2a 20 54 43 4c 20 73 63 72 69   The.** TCL scri
3ec0: 70 74 20 69 6e 20 70 44 62 2d 3e 7a 43 6f 6d 6d  pt in pDb->zComm
3ed0: 69 74 20 69 73 20 65 78 65 63 75 74 65 64 2e 20  it is executed. 
3ee0: 20 49 66 20 69 74 20 72 65 74 75 72 6e 73 20 6e   If it returns n
3ef0: 6f 6e 2d 7a 65 72 6f 20 6f 72 0a 2a 2a 20 69 66  on-zero or.** if
3f00: 20 69 74 20 74 68 72 6f 77 73 20 61 6e 20 65 78   it throws an ex
3f10: 63 65 70 74 69 6f 6e 2c 20 74 68 65 20 74 72 61  ception, the tra
3f20: 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
3f30: 65 64 20 62 61 63 6b 20 69 6e 73 74 65 61 64 0a  ed back instead.
3f40: 2a 2a 20 6f 66 20 62 65 69 6e 67 20 63 6f 6d 6d  ** of being comm
3f50: 69 74 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  itted..*/.static
3f60: 20 69 6e 74 20 44 62 43 6f 6d 6d 69 74 48 61 6e   int DbCommitHan
3f70: 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 29 7b 0a  dler(void *cd){.
3f80: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
3f90: 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b  = (SqliteDb*)cd;
3fa0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63  .  int rc;..  rc
3fb0: 20 3d 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d   = Tcl_Eval(pDb-
3fc0: 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 43  >interp, pDb->zC
3fd0: 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63  ommit);.  if( rc
3fe0: 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69  !=TCL_OK || atoi
3ff0: 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65  (Tcl_GetStringRe
4000: 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70  sult(pDb->interp
4010: 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  )) ){.    return
4020: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
4030: 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f   0;.}..static vo
4040: 69 64 20 44 62 52 6f 6c 6c 62 61 63 6b 48 61 6e  id DbRollbackHan
4050: 64 6c 65 72 28 76 6f 69 64 20 2a 63 6c 69 65 6e  dler(void *clien
4060: 74 44 61 74 61 29 7b 0a 20 20 53 71 6c 69 74 65  tData){.  Sqlite
4070: 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74  Db *pDb = (Sqlit
4080: 65 44 62 2a 29 63 6c 69 65 6e 74 44 61 74 61 3b  eDb*)clientData;
4090: 0a 20 20 61 73 73 65 72 74 28 70 44 62 2d 3e 70  .  assert(pDb->p
40a0: 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 29 3b 0a 20  RollbackHook);. 
40b0: 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c   if( TCL_OK!=Tcl
40c0: 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e  _EvalObjEx(pDb->
40d0: 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 70 52 6f  interp, pDb->pRo
40e0: 6c 6c 62 61 63 6b 48 6f 6f 6b 2c 20 30 29 20 29  llbackHook, 0) )
40f0: 7b 0a 20 20 20 20 54 63 6c 5f 42 61 63 6b 67 72  {.    Tcl_Backgr
4100: 6f 75 6e 64 45 72 72 6f 72 28 70 44 62 2d 3e 69  oundError(pDb->i
4110: 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 73  nterp);.  }.}..s
4120: 74 61 74 69 63 20 76 6f 69 64 20 44 62 55 70 64  tatic void DbUpd
4130: 61 74 65 48 61 6e 64 6c 65 72 28 0a 20 20 76 6f  ateHandler(.  vo
4140: 69 64 20 2a 70 2c 20 0a 20 20 69 6e 74 20 6f 70  id *p, .  int op
4150: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
4160: 7a 44 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68  zDb, .  const ch
4170: 61 72 20 2a 7a 54 62 6c 2c 20 0a 20 20 73 71 6c  ar *zTbl, .  sql
4180: 69 74 65 5f 69 6e 74 36 34 20 72 6f 77 69 64 0a  ite_int64 rowid.
4190: 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  ){.  SqliteDb *p
41a0: 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 20 2a  Db = (SqliteDb *
41b0: 29 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  )p;.  Tcl_Obj *p
41c0: 43 6d 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Cmd;..  assert( 
41d0: 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b  pDb->pUpdateHook
41e0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
41f0: 3d 3d 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 20  ==SQLITE_INSERT 
4200: 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 55 50  || op==SQLITE_UP
4210: 44 41 54 45 20 7c 7c 20 6f 70 3d 3d 53 51 4c 49  DATE || op==SQLI
4220: 54 45 5f 44 45 4c 45 54 45 20 29 3b 0a 0a 20 20  TE_DELETE );..  
4230: 70 43 6d 64 20 3d 20 54 63 6c 5f 44 75 70 6c 69  pCmd = Tcl_Dupli
4240: 63 61 74 65 4f 62 6a 28 70 44 62 2d 3e 70 55 70  cateObj(pDb->pUp
4250: 64 61 74 65 48 6f 6f 6b 29 3b 0a 20 20 54 63 6c  dateHook);.  Tcl
4260: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43  _IncrRefCount(pC
4270: 6d 64 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  md);.  Tcl_ListO
4280: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
4290: 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77  0, pCmd, Tcl_New
42a0: 53 74 72 69 6e 67 4f 62 6a 28 0a 20 20 20 20 28  StringObj(.    (
42b0: 20 28 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 53   (op==SQLITE_INS
42c0: 45 52 54 29 3f 22 49 4e 53 45 52 54 22 3a 28 6f  ERT)?"INSERT":(o
42d0: 70 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45  p==SQLITE_UPDATE
42e0: 29 3f 22 55 50 44 41 54 45 22 3a 22 44 45 4c 45  )?"UPDATE":"DELE
42f0: 54 45 22 29 2c 20 2d 31 29 29 3b 0a 20 20 54 63  TE"), -1));.  Tc
4300: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
4310: 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20  lement(0, pCmd, 
4320: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
4330: 28 7a 44 62 2c 20 2d 31 29 29 3b 0a 20 20 54 63  (zDb, -1));.  Tc
4340: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
4350: 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20  lement(0, pCmd, 
4360: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
4370: 28 7a 54 62 6c 2c 20 2d 31 29 29 3b 0a 20 20 54  (zTbl, -1));.  T
4380: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
4390: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c  Element(0, pCmd,
43a0: 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f   Tcl_NewWideIntO
43b0: 62 6a 28 72 6f 77 69 64 29 29 3b 0a 20 20 54 63  bj(rowid));.  Tc
43c0: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d  l_EvalObjEx(pDb-
43d0: 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54  >interp, pCmd, T
43e0: 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b  CL_EVAL_DIRECT);
43f0: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
4400: 74 63 6c 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64  tclCollateNeeded
4410: 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 0a  (.  void *pCtx,.
4420: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
4430: 20 69 6e 74 20 65 6e 63 2c 0a 20 20 63 6f 6e 73   int enc,.  cons
4440: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b  t char *zName.){
4450: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
4460: 20 3d 20 28 53 71 6c 69 74 65 44 62 20 2a 29 70   = (SqliteDb *)p
4470: 43 74 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  Ctx;.  Tcl_Obj *
4480: 70 53 63 72 69 70 74 20 3d 20 54 63 6c 5f 44 75  pScript = Tcl_Du
4490: 70 6c 69 63 61 74 65 4f 62 6a 28 70 44 62 2d 3e  plicateObj(pDb->
44a0: 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b  pCollateNeeded);
44b0: 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  .  Tcl_IncrRefCo
44c0: 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 20 20  unt(pScript);.  
44d0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
44e0: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 53 63 72  dElement(0, pScr
44f0: 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  ipt, Tcl_NewStri
4500: 6e 67 4f 62 6a 28 7a 4e 61 6d 65 2c 20 2d 31 29  ngObj(zName, -1)
4510: 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  );.  Tcl_EvalObj
4520: 45 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  Ex(pDb->interp, 
4530: 70 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20 54  pScript, 0);.  T
4540: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
4550: 70 53 63 72 69 70 74 29 3b 0a 7d 0a 0a 2f 2a 0a  pScript);.}../*.
4560: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
4570: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 76 61  is called to eva
4580: 6c 75 61 74 65 20 61 6e 20 53 51 4c 20 63 6f 6c  luate an SQL col
4590: 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  lation function 
45a0: 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 75  implemented.** u
45b0: 73 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74 2e  sing TCL script.
45c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
45d0: 63 6c 53 71 6c 43 6f 6c 6c 61 74 65 28 0a 20 20  clSqlCollate(.  
45e0: 76 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20 69 6e  void *pCtx,.  in
45f0: 74 20 6e 41 2c 0a 20 20 63 6f 6e 73 74 20 76 6f  t nA,.  const vo
4600: 69 64 20 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e 42  id *zA,.  int nB
4610: 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ,.  const void *
4620: 7a 42 0a 29 7b 0a 20 20 53 71 6c 43 6f 6c 6c 61  zB.){.  SqlColla
4630: 74 65 20 2a 70 20 3d 20 28 53 71 6c 43 6f 6c 6c  te *p = (SqlColl
4640: 61 74 65 20 2a 29 70 43 74 78 3b 0a 20 20 54 63  ate *)pCtx;.  Tc
4650: 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 0a 20 20  l_Obj *pCmd;..  
4660: 70 43 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 53 74  pCmd = Tcl_NewSt
4670: 72 69 6e 67 4f 62 6a 28 70 2d 3e 7a 53 63 72 69  ringObj(p->zScri
4680: 70 74 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49  pt, -1);.  Tcl_I
4690: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64  ncrRefCount(pCmd
46a0: 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
46b0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d  AppendElement(p-
46c0: 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54  >interp, pCmd, T
46d0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
46e0: 7a 41 2c 20 6e 41 29 29 3b 0a 20 20 54 63 6c 5f  zA, nA));.  Tcl_
46f0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
4700: 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c 20  ment(p->interp, 
4710: 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72  pCmd, Tcl_NewStr
4720: 69 6e 67 4f 62 6a 28 7a 42 2c 20 6e 42 29 29 3b  ingObj(zB, nB));
4730: 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78  .  Tcl_EvalObjEx
4740: 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64  (p->interp, pCmd
4750: 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43  , TCL_EVAL_DIREC
4760: 54 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65  T);.  Tcl_DecrRe
4770: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
4780: 72 65 74 75 72 6e 20 28 61 74 6f 69 28 54 63 6c  return (atoi(Tcl
4790: 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74  _GetStringResult
47a0: 28 70 2d 3e 69 6e 74 65 72 70 29 29 29 3b 0a 7d  (p->interp)));.}
47b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
47c0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
47d0: 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20 53 51  o evaluate an SQ
47e0: 4c 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65  L function imple
47f0: 6d 65 6e 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20  mented.** using 
4800: 54 43 4c 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 73  TCL script..*/.s
4810: 74 61 74 69 63 20 76 6f 69 64 20 74 63 6c 53 71  tatic void tclSq
4820: 6c 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  lFunc(sqlite3_co
4830: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20  ntext *context, 
4840: 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
4850: 33 5f 76 61 6c 75 65 2a 2a 61 72 67 76 29 7b 0a  3_value**argv){.
4860: 20 20 53 71 6c 46 75 6e 63 20 2a 70 20 3d 20 73    SqlFunc *p = s
4870: 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
4880: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 54 63 6c  (context);.  Tcl
4890: 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 20 20 69 6e  _Obj *pCmd;.  in
48a0: 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  t i;.  int rc;..
48b0: 20 20 69 66 28 20 61 72 67 63 3d 3d 30 20 29 7b    if( argc==0 ){
48c0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
48d0: 20 61 72 65 20 6e 6f 20 61 72 67 75 6d 65 6e 74   are no argument
48e0: 73 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f  s to the functio
48f0: 6e 2c 20 63 61 6c 6c 20 54 63 6c 5f 45 76 61 6c  n, call Tcl_Eval
4900: 4f 62 6a 45 78 20 6f 6e 20 74 68 65 0a 20 20 20  ObjEx on the.   
4910: 20 2a 2a 20 73 63 72 69 70 74 20 6f 62 6a 65 63   ** script objec
4920: 74 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68 69  t directly.  Thi
4930: 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 54 43 4c  s allows the TCL
4940: 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20 67 65 6e   compiler to gen
4950: 65 72 61 74 65 0a 20 20 20 20 2a 2a 20 62 79 74  erate.    ** byt
4960: 65 63 6f 64 65 20 66 6f 72 20 74 68 65 20 63 6f  ecode for the co
4970: 6d 6d 61 6e 64 20 6f 6e 20 74 68 65 20 66 69 72  mmand on the fir
4980: 73 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 61 6e  st invocation an
4990: 64 20 74 68 75 73 20 6d 61 6b 65 0a 20 20 20 20  d thus make.    
49a0: 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20 69 6e  ** subsequent in
49b0: 76 6f 63 61 74 69 6f 6e 73 20 6d 75 63 68 20 66  vocations much f
49c0: 61 73 74 65 72 2e 20 2a 2f 0a 20 20 20 20 70 43  aster. */.    pC
49d0: 6d 64 20 3d 20 70 2d 3e 70 53 63 72 69 70 74 3b  md = p->pScript;
49e0: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
49f0: 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20  Count(pCmd);.   
4a00: 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62   rc = Tcl_EvalOb
4a10: 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70  jEx(p->interp, p
4a20: 43 6d 64 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c  Cmd, 0);.    Tcl
4a30: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43  _DecrRefCount(pC
4a40: 6d 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  md);.  }else{.  
4a50: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
4a60: 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74  e arguments to t
4a70: 68 65 20 66 75 6e 63 74 69 6f 6e 2c 20 6d 61 6b  he function, mak
4a80: 65 20 61 20 73 68 61 6c 6c 6f 77 20 63 6f 70 79  e a shallow copy
4a90: 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 73   of the.    ** s
4aa0: 63 72 69 70 74 20 6f 62 6a 65 63 74 2c 20 6c 61  cript object, la
4ab0: 70 70 65 6e 64 20 74 68 65 20 61 72 67 75 6d 65  ppend the argume
4ac0: 6e 74 73 2c 20 74 68 65 6e 20 65 76 61 6c 75 61  nts, then evalua
4ad0: 74 65 20 74 68 65 20 63 6f 70 79 2e 0a 20 20 20  te the copy..   
4ae0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 42 79 20 22 73   **.    ** By "s
4af0: 68 61 6c 6c 6f 77 22 20 63 6f 70 79 2c 20 77 65  hallow" copy, we
4b00: 20 6d 65 61 6e 20 61 20 6f 6e 6c 79 20 74 68 65   mean a only the
4b10: 20 6f 75 74 65 72 20 6c 69 73 74 20 54 63 6c 5f   outer list Tcl_
4b20: 4f 62 6a 20 69 73 20 64 75 70 6c 69 63 61 74 65  Obj is duplicate
4b30: 64 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6e 65  d..    ** The ne
4b40: 77 20 54 63 6c 5f 4f 62 6a 20 63 6f 6e 74 61 69  w Tcl_Obj contai
4b50: 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74  ns pointers to t
4b60: 68 65 20 6f 72 69 67 69 6e 61 6c 20 6c 69 73 74  he original list
4b70: 20 65 6c 65 6d 65 6e 74 73 2e 20 0a 20 20 20 20   elements. .    
4b80: 2a 2a 20 54 68 61 74 20 77 61 79 2c 20 77 68 65  ** That way, whe
4b90: 6e 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29  n Tcl_EvalObjv()
4ba0: 20 69 73 20 72 75 6e 20 61 6e 64 20 73 68 69 6d   is run and shim
4bb0: 6d 65 72 73 20 74 68 65 20 66 69 72 73 74 20 65  mers the first e
4bc0: 6c 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 6f 66  lement.    ** of
4bd0: 20 74 68 65 20 6c 69 73 74 20 74 6f 20 74 63 6c   the list to tcl
4be0: 43 6d 64 4e 61 6d 65 54 79 70 65 2c 20 74 68 61  CmdNameType, tha
4bf0: 74 20 61 6c 74 65 72 6e 61 74 65 20 72 65 70 72  t alternate repr
4c00: 65 73 65 6e 74 61 74 69 6f 6e 20 77 69 6c 6c 0a  esentation will.
4c10: 20 20 20 20 2a 2a 20 62 65 20 70 72 65 73 65 72      ** be preser
4c20: 76 65 64 20 61 6e 64 20 72 65 75 73 65 64 20 6f  ved and reused o
4c30: 6e 20 74 68 65 20 6e 65 78 74 20 69 6e 76 6f 63  n the next invoc
4c40: 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ation..    */.  
4c50: 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 41 72 67    Tcl_Obj **aArg
4c60: 3b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a  ;.    int nArg;.
4c70: 20 20 20 20 69 66 28 20 54 63 6c 5f 4c 69 73 74      if( Tcl_List
4c80: 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 70  ObjGetElements(p
4c90: 2d 3e 69 6e 74 65 72 70 2c 20 70 2d 3e 70 53 63  ->interp, p->pSc
4ca0: 72 69 70 74 2c 20 26 6e 41 72 67 2c 20 26 61 41  ript, &nArg, &aA
4cb0: 72 67 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  rg) ){.      sql
4cc0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
4cd0: 72 28 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f 47  r(context, Tcl_G
4ce0: 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70  etStringResult(p
4cf0: 2d 3e 69 6e 74 65 72 70 29 2c 20 2d 31 29 3b 20  ->interp), -1); 
4d00: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
4d10: 20 20 20 7d 20 20 20 20 20 0a 20 20 20 20 70 43     }     .    pC
4d20: 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74  md = Tcl_NewList
4d30: 4f 62 6a 28 6e 41 72 67 2c 20 61 41 72 67 29 3b  Obj(nArg, aArg);
4d40: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
4d50: 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20  Count(pCmd);.   
4d60: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63   for(i=0; i<argc
4d70: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
4d80: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 49 6e  lite3_value *pIn
4d90: 20 3d 20 61 72 67 76 5b 69 5d 3b 0a 20 20 20 20   = argv[i];.    
4da0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b    Tcl_Obj *pVal;
4db0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20  .            .  
4dc0: 20 20 20 20 2f 2a 20 53 65 74 20 70 56 61 6c 20      /* Set pVal 
4dd0: 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 69  to contain the i
4de0: 27 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  'th column of th
4df0: 69 73 20 72 6f 77 2e 20 2a 2f 0a 20 20 20 20 20  is row. */.     
4e00: 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33   switch( sqlite3
4e10: 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 49 6e 29  _value_type(pIn)
4e20: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65   ){.        case
4e30: 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a   SQLITE_BLOB: {.
4e40: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 62 79            int by
4e50: 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  tes = sqlite3_va
4e60: 6c 75 65 5f 62 79 74 65 73 28 70 49 6e 29 3b 0a  lue_bytes(pIn);.
4e70: 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d            pVal =
4e80: 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61   Tcl_NewByteArra
4e90: 79 4f 62 6a 28 73 71 6c 69 74 65 33 5f 76 61 6c  yObj(sqlite3_val
4ea0: 75 65 5f 62 6c 6f 62 28 70 49 6e 29 2c 20 62 79  ue_blob(pIn), by
4eb0: 74 65 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tes);.          
4ec0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
4ed0: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51  .        case SQ
4ee0: 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a  LITE_INTEGER: {.
4ef0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
4f00: 5f 69 6e 74 36 34 20 76 20 3d 20 73 71 6c 69 74  _int64 v = sqlit
4f10: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 70  e3_value_int64(p
4f20: 49 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  In);.          i
4f30: 66 28 20 76 3e 3d 2d 32 31 34 37 34 38 33 36 34  f( v>=-214748364
4f40: 37 20 26 26 20 76 3c 3d 32 31 34 37 34 38 33 36  7 && v<=21474836
4f50: 34 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  47 ){.          
4f60: 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77    pVal = Tcl_New
4f70: 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20 20  IntObj(v);.     
4f80: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4f90: 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54          pVal = T
4fa0: 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a  cl_NewWideIntObj
4fb0: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  (v);.          }
4fc0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
4fd0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
4fe0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
4ff0: 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 20  FLOAT: {.       
5000: 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 73 71     double r = sq
5010: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62  lite3_value_doub
5020: 6c 65 28 70 49 6e 29 3b 0a 20 20 20 20 20 20 20  le(pIn);.       
5030: 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65     pVal = Tcl_Ne
5040: 77 44 6f 75 62 6c 65 4f 62 6a 28 72 29 3b 0a 20  wDoubleObj(r);. 
5050: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
5060: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5070: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55    case SQLITE_NU
5080: 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  LL: {.          
5090: 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74  pVal = Tcl_NewSt
50a0: 72 69 6e 67 4f 62 6a 28 22 22 2c 20 30 29 3b 0a  ringObj("", 0);.
50b0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
50c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
50d0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
50e0: 20 20 20 20 20 20 20 20 69 6e 74 20 62 79 74 65          int byte
50f0: 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  s = sqlite3_valu
5100: 65 5f 62 79 74 65 73 28 70 49 6e 29 3b 0a 20 20  e_bytes(pIn);.  
5110: 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54          pVal = T
5120: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
5130: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
5140: 76 61 6c 75 65 5f 74 65 78 74 28 70 49 6e 29 2c  value_text(pIn),
5150: 20 62 79 74 65 73 29 3b 0a 20 20 20 20 20 20 20   bytes);.       
5160: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
5170: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
5180: 20 20 72 63 20 3d 20 54 63 6c 5f 4c 69 73 74 4f    rc = Tcl_ListO
5190: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
51a0: 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c  p->interp, pCmd,
51b0: 20 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 69 66   pVal);.      if
51c0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
51d0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
51e0: 28 70 43 6d 64 29 3b 0a 20 20 20 20 20 20 20 20  (pCmd);.        
51f0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
5200: 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 54 63  rror(context, Tc
5210: 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
5220: 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c 20 2d 31  t(p->interp), -1
5230: 29 3b 20 0a 20 20 20 20 20 20 20 20 72 65 74 75  ); .        retu
5240: 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
5250: 7d 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 75 73  }.    if( !p->us
5260: 65 45 76 61 6c 4f 62 6a 76 20 29 7b 0a 20 20 20  eEvalObjv ){.   
5270: 20 20 20 2f 2a 20 54 63 6c 5f 45 76 61 6c 4f 62     /* Tcl_EvalOb
5280: 6a 45 78 28 29 20 77 69 6c 6c 20 61 75 74 6f 6d  jEx() will autom
5290: 61 74 69 63 61 6c 6c 79 20 63 61 6c 6c 20 54 63  atically call Tc
52a0: 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 69 66 20  l_EvalObjv() if 
52b0: 70 43 6d 64 0a 20 20 20 20 20 20 2a 2a 20 69 73  pCmd.      ** is
52c0: 20 61 20 6c 69 73 74 20 77 69 74 68 6f 75 74 20   a list without 
52d0: 61 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65  a string represe
52e0: 6e 74 61 74 69 6f 6e 2e 20 20 54 6f 20 70 72 65  ntation.  To pre
52f0: 76 65 6e 74 20 74 68 69 73 20 66 72 6f 6d 0a 20  vent this from. 
5300: 20 20 20 20 20 2a 2a 20 68 61 70 70 65 6e 69 6e       ** happenin
5310: 67 2c 20 6d 61 6b 65 20 73 75 72 65 20 70 43 6d  g, make sure pCm
5320: 64 20 68 61 73 20 61 20 76 61 6c 69 64 20 73 74  d has a valid st
5330: 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74  ring representat
5340: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 54 63 6c  ion */.      Tcl
5350: 5f 47 65 74 53 74 72 69 6e 67 28 70 43 6d 64 29  _GetString(pCmd)
5360: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
5370: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70   Tcl_EvalObjEx(p
5380: 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20  ->interp, pCmd, 
5390: 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29  TCL_EVAL_DIRECT)
53a0: 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  ;.    Tcl_DecrRe
53b0: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
53c0: 7d 0a 0a 20 20 69 66 28 20 72 63 20 26 26 20 72  }..  if( rc && r
53d0: 63 21 3d 54 43 4c 5f 52 45 54 55 52 4e 20 29 7b  c!=TCL_RETURN ){
53e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
53f0: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
5400: 74 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  t, Tcl_GetString
5410: 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70  Result(p->interp
5420: 29 2c 20 2d 31 29 3b 20 0a 20 20 7d 65 6c 73 65  ), -1); .  }else
5430: 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  {.    Tcl_Obj *p
5440: 56 61 72 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a  Var = Tcl_GetObj
5450: 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70  Result(p->interp
5460: 29 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  );.    int n;.  
5470: 20 20 75 38 20 2a 64 61 74 61 3b 0a 20 20 20 20    u8 *data;.    
5480: 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 70 56  char *zType = pV
5490: 61 72 2d 3e 74 79 70 65 50 74 72 20 3f 20 70 56  ar->typePtr ? pV
54a0: 61 72 2d 3e 74 79 70 65 50 74 72 2d 3e 6e 61 6d  ar->typePtr->nam
54b0: 65 20 3a 20 22 22 3b 0a 20 20 20 20 63 68 61 72  e : "";.    char
54c0: 20 63 20 3d 20 7a 54 79 70 65 5b 30 5d 3b 0a 20   c = zType[0];. 
54d0: 20 20 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26     if( c=='b' &&
54e0: 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 62   strcmp(zType,"b
54f0: 79 74 65 61 72 72 61 79 22 29 3d 3d 30 20 26 26  ytearray")==0 &&
5500: 20 70 56 61 72 2d 3e 62 79 74 65 73 3d 3d 30 20   pVar->bytes==0 
5510: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79  ){.      /* Only
5520: 20 72 65 74 75 72 6e 20 61 20 42 4c 4f 42 20 74   return a BLOB t
5530: 79 70 65 20 69 66 20 74 68 65 20 54 63 6c 20 76  ype if the Tcl v
5540: 61 72 69 61 62 6c 65 20 69 73 20 61 20 62 79 74  ariable is a byt
5550: 65 61 72 72 61 79 20 61 6e 64 0a 20 20 20 20 20  earray and.     
5560: 20 2a 2a 20 68 61 73 20 6e 6f 20 73 74 72 69 6e   ** has no strin
5570: 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  g representation
5580: 2e 20 2a 2f 0a 20 20 20 20 20 20 64 61 74 61 20  . */.      data 
5590: 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  = Tcl_GetByteArr
55a0: 61 79 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20  ayFromObj(pVar, 
55b0: 26 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  &n);.      sqlit
55c0: 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 28 63  e3_result_blob(c
55d0: 6f 6e 74 65 78 74 2c 20 64 61 74 61 2c 20 6e 2c  ontext, data, n,
55e0: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
55f0: 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  T);.    }else if
5600: 28 20 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63  ( c=='b' && strc
5610: 6d 70 28 7a 54 79 70 65 2c 22 62 6f 6f 6c 65 61  mp(zType,"boolea
5620: 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  n")==0 ){.      
5630: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
5640: 6a 28 30 2c 20 70 56 61 72 2c 20 26 6e 29 3b 0a  j(0, pVar, &n);.
5650: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
5660: 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74  sult_int(context
5670: 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  , n);.    }else 
5680: 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20 73 74  if( c=='d' && st
5690: 72 63 6d 70 28 7a 54 79 70 65 2c 22 64 6f 75 62  rcmp(zType,"doub
56a0: 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  le")==0 ){.     
56b0: 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20 20   double r;.     
56c0: 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72   Tcl_GetDoubleFr
56d0: 6f 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c 20 26  omObj(0, pVar, &
56e0: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
56f0: 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28  3_result_double(
5700: 63 6f 6e 74 65 78 74 2c 20 72 29 3b 0a 20 20 20  context, r);.   
5710: 20 7d 65 6c 73 65 20 69 66 28 20 28 63 3d 3d 27   }else if( (c=='
5720: 77 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79  w' && strcmp(zTy
5730: 70 65 2c 22 77 69 64 65 49 6e 74 22 29 3d 3d 30  pe,"wideInt")==0
5740: 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 28  ) ||.          (
5750: 63 3d 3d 27 69 27 20 26 26 20 73 74 72 63 6d 70  c=='i' && strcmp
5760: 28 7a 54 79 70 65 2c 22 69 6e 74 22 29 3d 3d 30  (zType,"int")==0
5770: 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  ) ){.      Tcl_W
5780: 69 64 65 49 6e 74 20 76 3b 0a 20 20 20 20 20 20  ideInt v;.      
5790: 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72  Tcl_GetWideIntFr
57a0: 6f 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c 20 26  omObj(0, pVar, &
57b0: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
57c0: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63  3_result_int64(c
57d0: 6f 6e 74 65 78 74 2c 20 76 29 3b 0a 20 20 20 20  ontext, v);.    
57e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 61 74  }else{.      dat
57f0: 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  a = (unsigned ch
5800: 61 72 20 2a 29 54 63 6c 5f 47 65 74 53 74 72 69  ar *)Tcl_GetStri
5810: 6e 67 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20  ngFromObj(pVar, 
5820: 26 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  &n);.      sqlit
5830: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
5840: 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 20 2a 29  ontext, (char *)
5850: 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f  data, n, SQLITE_
5860: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
5870: 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  }.  }.}..#ifndef
5880: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
5890: 48 4f 52 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a  HORIZATION./*.**
58a0: 20 54 68 69 73 20 69 73 20 74 68 65 20 61 75 74   This is the aut
58b0: 68 65 6e 74 69 63 61 74 69 6f 6e 20 66 75 6e 63  hentication func
58c0: 74 69 6f 6e 2e 20 20 49 74 20 61 70 70 65 6e 64  tion.  It append
58d0: 73 20 74 68 65 20 61 75 74 68 65 6e 74 69 63 61  s the authentica
58e0: 74 69 6f 6e 0a 2a 2a 20 74 79 70 65 20 63 6f 64  tion.** type cod
58f0: 65 20 61 6e 64 20 74 68 65 20 74 77 6f 20 61 72  e and the two ar
5900: 67 75 6d 65 6e 74 73 20 74 6f 20 7a 43 6d 64 5b  guments to zCmd[
5910: 5d 20 74 68 65 6e 20 69 6e 76 6f 6b 65 73 20 74  ] then invokes t
5920: 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 6f 6e 20  he result.** on 
5930: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e  the interpreter.
5940: 20 20 54 68 65 20 72 65 70 6c 79 20 69 73 20 65    The reply is e
5950: 78 61 6d 69 6e 65 64 20 74 6f 20 64 65 74 65 72  xamined to deter
5960: 6d 69 6e 65 20 69 66 20 74 68 65 0a 2a 2a 20 61  mine if the.** a
5970: 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 66 61  uthentication fa
5980: 69 6c 73 20 6f 72 20 73 75 63 63 65 65 64 73 2e  ils or succeeds.
5990: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
59a0: 75 74 68 5f 63 61 6c 6c 62 61 63 6b 28 0a 20 20  uth_callback(.  
59b0: 76 6f 69 64 20 2a 70 41 72 67 2c 0a 20 20 69 6e  void *pArg,.  in
59c0: 74 20 63 6f 64 65 2c 0a 20 20 63 6f 6e 73 74 20  t code,.  const 
59d0: 63 68 61 72 20 2a 7a 41 72 67 31 2c 0a 20 20 63  char *zArg1,.  c
59e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 32  onst char *zArg2
59f0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
5a00: 7a 41 72 67 33 2c 0a 20 20 63 6f 6e 73 74 20 63  zArg3,.  const c
5a10: 68 61 72 20 2a 7a 41 72 67 34 0a 29 7b 0a 20 20  har *zArg4.){.  
5a20: 63 68 61 72 20 2a 7a 43 6f 64 65 3b 0a 20 20 54  char *zCode;.  T
5a30: 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a  cl_DString str;.
5a40: 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73    int rc;.  cons
5a50: 74 20 63 68 61 72 20 2a 7a 52 65 70 6c 79 3b 0a  t char *zReply;.
5a60: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
5a70: 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 70 41 72  = (SqliteDb*)pAr
5a80: 67 3b 0a 20 20 69 66 28 20 70 44 62 2d 3e 64 69  g;.  if( pDb->di
5a90: 73 61 62 6c 65 41 75 74 68 20 29 20 72 65 74 75  sableAuth ) retu
5aa0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
5ab0: 20 73 77 69 74 63 68 28 20 63 6f 64 65 20 29 7b   switch( code ){
5ac0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
5ad0: 5f 43 4f 50 59 20 20 20 20 20 20 20 20 20 20 20  _COPY           
5ae0: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
5af0: 54 45 5f 43 4f 50 59 22 3b 20 62 72 65 61 6b 3b  TE_COPY"; break;
5b00: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
5b10: 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 20 20 20  _CREATE_INDEX   
5b20: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
5b30: 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 22  TE_CREATE_INDEX"
5b40: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
5b50: 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  e SQLITE_CREATE_
5b60: 54 41 42 4c 45 20 20 20 20 20 20 3a 20 7a 43 6f  TABLE      : zCo
5b70: 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54  de="SQLITE_CREAT
5b80: 45 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b  E_TABLE"; break;
5b90: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
5ba0: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44  _CREATE_TEMP_IND
5bb0: 45 58 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49  EX : zCode="SQLI
5bc0: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49  TE_CREATE_TEMP_I
5bd0: 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20  NDEX"; break;.  
5be0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52    case SQLITE_CR
5bf0: 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 20  EATE_TEMP_TABLE 
5c00: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
5c10: 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c  CREATE_TEMP_TABL
5c20: 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  E"; break;.    c
5c30: 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54  ase SQLITE_CREAT
5c40: 45 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 3a 20  E_TEMP_TRIGGER: 
5c50: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52  zCode="SQLITE_CR
5c60: 45 41 54 45 5f 54 45 4d 50 5f 54 52 49 47 47 45  EATE_TEMP_TRIGGE
5c70: 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  R"; break;.    c
5c80: 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54  ase SQLITE_CREAT
5c90: 45 5f 54 45 4d 50 5f 56 49 45 57 20 20 3a 20 7a  E_TEMP_VIEW  : z
5ca0: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45  Code="SQLITE_CRE
5cb0: 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 22 3b 20  ATE_TEMP_VIEW"; 
5cc0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
5cd0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 52  SQLITE_CREATE_TR
5ce0: 49 47 47 45 52 20 20 20 20 3a 20 7a 43 6f 64 65  IGGER    : zCode
5cf0: 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  ="SQLITE_CREATE_
5d00: 54 52 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b  TRIGGER"; break;
5d10: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
5d20: 5f 43 52 45 41 54 45 5f 56 49 45 57 20 20 20 20  _CREATE_VIEW    
5d30: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
5d40: 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57 22 3b  TE_CREATE_VIEW";
5d50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
5d60: 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 20   SQLITE_DELETE  
5d70: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
5d80: 65 3d 22 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  e="SQLITE_DELETE
5d90: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
5da0: 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49  se SQLITE_DROP_I
5db0: 4e 44 45 58 20 20 20 20 20 20 20 20 3a 20 7a 43  NDEX        : zC
5dc0: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50  ode="SQLITE_DROP
5dd0: 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a  _INDEX"; break;.
5de0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
5df0: 44 52 4f 50 5f 54 41 42 4c 45 20 20 20 20 20 20  DROP_TABLE      
5e00: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
5e10: 45 5f 44 52 4f 50 5f 54 41 42 4c 45 22 3b 20 62  E_DROP_TABLE"; b
5e20: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
5e30: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
5e40: 49 4e 44 45 58 20 20 20 3a 20 7a 43 6f 64 65 3d  INDEX   : zCode=
5e50: 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d  "SQLITE_DROP_TEM
5e60: 50 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b  P_INDEX"; break;
5e70: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
5e80: 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45  _DROP_TEMP_TABLE
5e90: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
5ea0: 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42  TE_DROP_TEMP_TAB
5eb0: 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  LE"; break;.    
5ec0: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50  case SQLITE_DROP
5ed0: 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 20 3a 20  _TEMP_TRIGGER : 
5ee0: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52  zCode="SQLITE_DR
5ef0: 4f 50 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 22  OP_TEMP_TRIGGER"
5f00: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
5f10: 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  e SQLITE_DROP_TE
5f20: 4d 50 5f 56 49 45 57 20 20 20 20 3a 20 7a 43 6f  MP_VIEW    : zCo
5f30: 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f  de="SQLITE_DROP_
5f40: 54 45 4d 50 5f 56 49 45 57 22 3b 20 62 72 65 61  TEMP_VIEW"; brea
5f50: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
5f60: 54 45 5f 44 52 4f 50 5f 54 52 49 47 47 45 52 20  TE_DROP_TRIGGER 
5f70: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
5f80: 4c 49 54 45 5f 44 52 4f 50 5f 54 52 49 47 47 45  LITE_DROP_TRIGGE
5f90: 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  R"; break;.    c
5fa0: 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  ase SQLITE_DROP_
5fb0: 56 49 45 57 20 20 20 20 20 20 20 20 20 3a 20 7a  VIEW         : z
5fc0: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f  Code="SQLITE_DRO
5fd0: 50 5f 56 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a  P_VIEW"; break;.
5fe0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
5ff0: 49 4e 53 45 52 54 20 20 20 20 20 20 20 20 20 20  INSERT          
6000: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
6010: 45 5f 49 4e 53 45 52 54 22 3b 20 62 72 65 61 6b  E_INSERT"; break
6020: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
6030: 45 5f 50 52 41 47 4d 41 20 20 20 20 20 20 20 20  E_PRAGMA        
6040: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
6050: 49 54 45 5f 50 52 41 47 4d 41 22 3b 20 62 72 65  ITE_PRAGMA"; bre
6060: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
6070: 49 54 45 5f 52 45 41 44 20 20 20 20 20 20 20 20  ITE_READ        
6080: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
6090: 51 4c 49 54 45 5f 52 45 41 44 22 3b 20 62 72 65  QLITE_READ"; bre
60a0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
60b0: 49 54 45 5f 53 45 4c 45 43 54 20 20 20 20 20 20  ITE_SELECT      
60c0: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
60d0: 51 4c 49 54 45 5f 53 45 4c 45 43 54 22 3b 20 62  QLITE_SELECT"; b
60e0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
60f0: 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f  QLITE_TRANSACTIO
6100: 4e 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d  N       : zCode=
6110: 22 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54  "SQLITE_TRANSACT
6120: 49 4f 4e 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ION"; break;.   
6130: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55 50 44   case SQLITE_UPD
6140: 41 54 45 20 20 20 20 20 20 20 20 20 20 20 20 3a  ATE            :
6150: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 55   zCode="SQLITE_U
6160: 50 44 41 54 45 22 3b 20 62 72 65 61 6b 3b 0a 20  PDATE"; break;. 
6170: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
6180: 54 54 41 43 48 20 20 20 20 20 20 20 20 20 20 20  TTACH           
6190: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
61a0: 5f 41 54 54 41 43 48 22 3b 20 62 72 65 61 6b 3b  _ATTACH"; break;
61b0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
61c0: 5f 44 45 54 41 43 48 20 20 20 20 20 20 20 20 20  _DETACH         
61d0: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
61e0: 54 45 5f 44 45 54 41 43 48 22 3b 20 62 72 65 61  TE_DETACH"; brea
61f0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
6200: 54 45 5f 41 4c 54 45 52 5f 54 41 42 4c 45 20 20  TE_ALTER_TABLE  
6210: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
6220: 4c 49 54 45 5f 41 4c 54 45 52 5f 54 41 42 4c 45  LITE_ALTER_TABLE
6230: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
6240: 73 65 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45  se SQLITE_REINDE
6250: 58 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43  X           : zC
6260: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 52 45 49 4e  ode="SQLITE_REIN
6270: 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  DEX"; break;.   
6280: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 4e 41   case SQLITE_ANA
6290: 4c 59 5a 45 20 20 20 20 20 20 20 20 20 20 20 3a  LYZE           :
62a0: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 41   zCode="SQLITE_A
62b0: 4e 41 4c 59 5a 45 22 3b 20 62 72 65 61 6b 3b 0a  NALYZE"; break;.
62c0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
62d0: 43 52 45 41 54 45 5f 56 54 41 42 4c 45 20 20 20  CREATE_VTABLE   
62e0: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
62f0: 45 5f 43 52 45 41 54 45 5f 56 54 41 42 4c 45 22  E_CREATE_VTABLE"
6300: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
6310: 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54  e SQLITE_DROP_VT
6320: 41 42 4c 45 20 20 20 20 20 20 20 3a 20 7a 43 6f  ABLE       : zCo
6330: 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f  de="SQLITE_DROP_
6340: 56 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a  VTABLE"; break;.
6350: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
6360: 46 55 4e 43 54 49 4f 4e 20 20 20 20 20 20 20 20  FUNCTION        
6370: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
6380: 45 5f 46 55 4e 43 54 49 4f 4e 22 3b 20 62 72 65  E_FUNCTION"; bre
6390: 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 20  ak;.    default 
63a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63b0: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 3f        : zCode="?
63c0: 3f 3f 3f 22 3b 20 62 72 65 61 6b 3b 0a 20 20 7d  ???"; break;.  }
63d0: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e  .  Tcl_DStringIn
63e0: 69 74 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f  it(&str);.  Tcl_
63f0: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 73  DStringAppend(&s
6400: 74 72 2c 20 70 44 62 2d 3e 7a 41 75 74 68 2c 20  tr, pDb->zAuth, 
6410: 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  -1);.  Tcl_DStri
6420: 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  ngAppendElement(
6430: 26 73 74 72 2c 20 7a 43 6f 64 65 29 3b 0a 20 20  &str, zCode);.  
6440: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
6450: 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a  dElement(&str, z
6460: 41 72 67 31 20 3f 20 7a 41 72 67 31 20 3a 20 22  Arg1 ? zArg1 : "
6470: 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  ");.  Tcl_DStrin
6480: 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26  gAppendElement(&
6490: 73 74 72 2c 20 7a 41 72 67 32 20 3f 20 7a 41 72  str, zArg2 ? zAr
64a0: 67 32 20 3a 20 22 22 29 3b 0a 20 20 54 63 6c 5f  g2 : "");.  Tcl_
64b0: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65  DStringAppendEle
64c0: 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41 72 67 33  ment(&str, zArg3
64d0: 20 3f 20 7a 41 72 67 33 20 3a 20 22 22 29 3b 0a   ? zArg3 : "");.
64e0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
64f0: 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c  endElement(&str,
6500: 20 7a 41 72 67 34 20 3f 20 7a 41 72 67 34 20 3a   zArg4 ? zArg4 :
6510: 20 22 22 29 3b 0a 20 20 72 63 20 3d 20 54 63 6c   "");.  rc = Tcl
6520: 5f 47 6c 6f 62 61 6c 45 76 61 6c 28 70 44 62 2d  _GlobalEval(pDb-
6530: 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53 74  >interp, Tcl_DSt
6540: 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29 29  ringValue(&str))
6550: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46  ;.  Tcl_DStringF
6560: 72 65 65 28 26 73 74 72 29 3b 0a 20 20 7a 52 65  ree(&str);.  zRe
6570: 70 6c 79 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ply = Tcl_GetStr
6580: 69 6e 67 52 65 73 75 6c 74 28 70 44 62 2d 3e 69  ingResult(pDb->i
6590: 6e 74 65 72 70 29 3b 0a 20 20 69 66 28 20 73 74  nterp);.  if( st
65a0: 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22 53 51 4c  rcmp(zReply,"SQL
65b0: 49 54 45 5f 4f 4b 22 29 3d 3d 30 20 29 7b 0a 20  ITE_OK")==0 ){. 
65c0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
65d0: 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  K;.  }else if( s
65e0: 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22 53 51  trcmp(zReply,"SQ
65f0: 4c 49 54 45 5f 44 45 4e 59 22 29 3d 3d 30 20 29  LITE_DENY")==0 )
6600: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
6610: 45 5f 44 45 4e 59 3b 0a 20 20 7d 65 6c 73 65 20  E_DENY;.  }else 
6620: 69 66 28 20 73 74 72 63 6d 70 28 7a 52 65 70 6c  if( strcmp(zRepl
6630: 79 2c 22 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  y,"SQLITE_IGNORE
6640: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ")==0 ){.    rc 
6650: 3d 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 3b  = SQLITE_IGNORE;
6660: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
6670: 20 3d 20 39 39 39 3b 0a 20 20 7d 0a 20 20 72 65   = 999;.  }.  re
6680: 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
6690: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
66a0: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 20 2a  _AUTHORIZATION *
66b0: 2f 0a 0a 2f 2a 0a 2a 2a 20 7a 54 65 78 74 20 69  /../*.** zText i
66c0: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
66d0: 65 78 74 20 6f 62 74 61 69 6e 65 64 20 76 69 61  ext obtained via
66e0: 20 61 6e 20 73 71 6c 69 74 65 33 5f 72 65 73 75   an sqlite3_resu
66f0: 6c 74 5f 74 65 78 74 28 29 0a 2a 2a 20 6f 72 20  lt_text().** or 
6700: 73 69 6d 69 6c 61 72 20 69 6e 74 65 72 66 61 63  similar interfac
6710: 65 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  e. This routine 
6720: 72 65 74 75 72 6e 73 20 61 20 54 63 6c 20 73 74  returns a Tcl st
6730: 72 69 6e 67 20 6f 62 6a 65 63 74 2c 20 0a 2a 2a  ring object, .**
6740: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
6750: 20 73 65 74 20 74 6f 20 30 2c 20 63 6f 6e 74 61   set to 0, conta
6760: 69 6e 69 6e 67 20 74 68 65 20 74 65 78 74 2e 20  ining the text. 
6770: 49 66 20 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e  If a translation
6780: 0a 2a 2a 20 62 65 74 77 65 65 6e 20 69 73 6f 38  .** between iso8
6790: 38 35 39 20 61 6e 64 20 55 54 46 2d 38 20 69 73  859 and UTF-8 is
67a0: 20 72 65 71 75 69 72 65 64 2c 20 69 74 20 69 73   required, it is
67b0: 20 70 72 65 66 6f 72 6d 65 64 2e 0a 2a 2f 0a 73   preformed..*/.s
67c0: 74 61 74 69 63 20 54 63 6c 5f 4f 62 6a 20 2a 64  tatic Tcl_Obj *d
67d0: 62 54 65 78 74 54 6f 4f 62 6a 28 63 68 61 72 20  bTextToObj(char 
67e0: 63 6f 6e 73 74 20 2a 7a 54 65 78 74 29 7b 0a 20  const *zText){. 
67f0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b 0a   Tcl_Obj *pVal;.
6800: 23 69 66 64 65 66 20 55 54 46 5f 54 52 41 4e 53  #ifdef UTF_TRANS
6810: 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 0a 20 20  LATION_NEEDED.  
6820: 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 43 6f 6c  Tcl_DString dCol
6830: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49  ;.  Tcl_DStringI
6840: 6e 69 74 28 26 64 43 6f 6c 29 3b 0a 20 20 54 63  nit(&dCol);.  Tc
6850: 6c 5f 45 78 74 65 72 6e 61 6c 54 6f 55 74 66 44  l_ExternalToUtfD
6860: 53 74 72 69 6e 67 28 4e 55 4c 4c 2c 20 7a 54 65  String(NULL, zTe
6870: 78 74 2c 20 2d 31 2c 20 26 64 43 6f 6c 29 3b 0a  xt, -1, &dCol);.
6880: 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77    pVal = Tcl_New
6890: 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 44 53  StringObj(Tcl_DS
68a0: 74 72 69 6e 67 56 61 6c 75 65 28 26 64 43 6f 6c  tringValue(&dCol
68b0: 29 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53  ), -1);.  Tcl_DS
68c0: 74 72 69 6e 67 46 72 65 65 28 26 64 43 6f 6c 29  tringFree(&dCol)
68d0: 3b 0a 23 65 6c 73 65 0a 20 20 70 56 61 6c 20 3d  ;.#else.  pVal =
68e0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
68f0: 6a 28 7a 54 65 78 74 2c 20 2d 31 29 3b 0a 23 65  j(zText, -1);.#e
6900: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 70 56  ndif.  return pV
6910: 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  al;.}../*.** Thi
6920: 73 20 72 6f 75 74 69 6e 65 20 72 65 61 64 73 20  s routine reads 
6930: 61 20 6c 69 6e 65 20 6f 66 20 74 65 78 74 20 66  a line of text f
6940: 72 6f 6d 20 46 49 4c 45 20 69 6e 2c 20 73 74 6f  rom FILE in, sto
6950: 72 65 73 0a 2a 2a 20 74 68 65 20 74 65 78 74 20  res.** the text 
6960: 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  in memory obtain
6970: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29  ed from malloc()
6980: 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 70   and returns a p
6990: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
69a0: 20 74 65 78 74 2e 20 20 4e 55 4c 4c 20 69 73 20   text.  NULL is 
69b0: 72 65 74 75 72 6e 65 64 20 61 74 20 65 6e 64 20  returned at end 
69c0: 6f 66 20 66 69 6c 65 2c 20 6f 72 20 69 66 20 6d  of file, or if m
69d0: 61 6c 6c 6f 63 28 29 0a 2a 2a 20 66 61 69 6c 73  alloc().** fails
69e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65  ..**.** The inte
69f0: 72 66 61 63 65 20 69 73 20 6c 69 6b 65 20 22 72  rface is like "r
6a00: 65 61 64 6c 69 6e 65 22 20 62 75 74 20 6e 6f 20  eadline" but no 
6a10: 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 65 64 69  command-line edi
6a20: 74 69 6e 67 0a 2a 2a 20 69 73 20 64 6f 6e 65 2e  ting.** is done.
6a30: 0a 2a 2a 0a 2a 2a 20 63 6f 70 69 65 64 20 66 72  .**.** copied fr
6a40: 6f 6d 20 73 68 65 6c 6c 2e 63 20 66 72 6f 6d 20  om shell.c from 
6a50: 27 2e 69 6d 70 6f 72 74 27 20 63 6f 6d 6d 61 6e  '.import' comman
6a60: 64 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  d.*/.static char
6a70: 20 2a 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28   *local_getline(
6a80: 63 68 61 72 20 2a 7a 50 72 6f 6d 70 74 2c 20 46  char *zPrompt, F
6a90: 49 4c 45 20 2a 69 6e 29 7b 0a 20 20 63 68 61 72  ILE *in){.  char
6aa0: 20 2a 7a 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e   *zLine;.  int n
6ab0: 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  Line;.  int n;. 
6ac0: 20 69 6e 74 20 65 6f 6c 3b 0a 0a 20 20 6e 4c 69   int eol;..  nLi
6ad0: 6e 65 20 3d 20 31 30 30 3b 0a 20 20 7a 4c 69 6e  ne = 100;.  zLin
6ae0: 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 4c 69 6e  e = malloc( nLin
6af0: 65 20 29 3b 0a 20 20 69 66 28 20 7a 4c 69 6e 65  e );.  if( zLine
6b00: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
6b10: 20 20 6e 20 3d 20 30 3b 0a 20 20 65 6f 6c 20 3d    n = 0;.  eol =
6b20: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 21 65 6f   0;.  while( !eo
6b30: 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 2b 31  l ){.    if( n+1
6b40: 30 30 3e 6e 4c 69 6e 65 20 29 7b 0a 20 20 20 20  00>nLine ){.    
6b50: 20 20 6e 4c 69 6e 65 20 3d 20 6e 4c 69 6e 65 2a    nLine = nLine*
6b60: 32 20 2b 20 31 30 30 3b 0a 20 20 20 20 20 20 7a  2 + 100;.      z
6b70: 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28 7a  Line = realloc(z
6b80: 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29 3b 0a 20 20  Line, nLine);.  
6b90: 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d 30      if( zLine==0
6ba0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
6bb0: 20 7d 0a 20 20 20 20 69 66 28 20 66 67 65 74 73   }.    if( fgets
6bc0: 28 26 7a 4c 69 6e 65 5b 6e 5d 2c 20 6e 4c 69 6e  (&zLine[n], nLin
6bd0: 65 20 2d 20 6e 2c 20 69 6e 29 3d 3d 30 20 29 7b  e - n, in)==0 ){
6be0: 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20  .      if( n==0 
6bf0: 29 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 28  ){.        free(
6c00: 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20  zLine);.        
6c10: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
6c20: 7d 0a 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d  }.      zLine[n]
6c30: 20 3d 20 30 3b 0a 20 20 20 20 20 20 65 6f 6c 20   = 0;.      eol 
6c40: 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 1;.      break
6c50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c  ;.    }.    whil
6c60: 65 28 20 7a 4c 69 6e 65 5b 6e 5d 20 29 7b 20 6e  e( zLine[n] ){ n
6c70: 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e  ++; }.    if( n>
6c80: 30 20 26 26 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d  0 && zLine[n-1]=
6c90: 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20 6e  ='\n' ){.      n
6ca0: 2d 2d 3b 0a 20 20 20 20 20 20 7a 4c 69 6e 65 5b  --;.      zLine[
6cb0: 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 65 6f  n] = 0;.      eo
6cc0: 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  l = 1;.    }.  }
6cd0: 0a 20 20 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c  .  zLine = reall
6ce0: 6f 63 28 20 7a 4c 69 6e 65 2c 20 6e 2b 31 20 29  oc( zLine, n+1 )
6cf0: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4c 69 6e 65  ;.  return zLine
6d00: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 69 67 75  ;.}.../*.** Figu
6d10: 72 65 20 6f 75 74 20 74 68 65 20 63 6f 6c 75 6d  re out the colum
6d20: 6e 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 65 20  n names for the 
6d30: 64 61 74 61 20 72 65 74 75 72 6e 65 64 20 62 79  data returned by
6d40: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a   the statement.*
6d50: 2a 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  * passed as the 
6d60: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
6d70: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
6d80: 74 65 72 20 70 61 70 43 6f 6c 4e 61 6d 65 20 69  ter papColName i
6d90: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
6da0: 20 2a 70 61 70 43 6f 6c 4e 61 6d 65 20 69 73 20   *papColName is 
6db0: 73 65 74 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20  set to point.** 
6dc0: 61 74 20 61 6e 20 61 72 72 61 79 20 61 6c 6c 6f  at an array allo
6dd0: 63 61 74 65 64 20 75 73 69 6e 67 20 54 63 6c 5f  cated using Tcl_
6de0: 41 6c 6c 6f 63 28 29 2e 20 49 74 20 69 73 20 74  Alloc(). It is t
6df0: 68 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f  he callers respo
6e00: 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20 74 6f 20  nsibility.** to 
6e10: 66 72 65 65 20 74 68 69 73 20 61 72 72 61 79 20  free this array 
6e20: 75 73 69 6e 67 20 54 63 6c 5f 46 72 65 65 28 29  using Tcl_Free()
6e30: 2c 20 61 6e 64 20 74 6f 20 64 65 63 72 65 6d 65  , and to decreme
6e40: 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
6e50: 0a 2a 2a 20 63 6f 75 6e 74 20 6f 66 20 65 61 63  .** count of eac
6e60: 68 20 54 63 6c 5f 4f 62 6a 2a 20 6d 65 6d 62 65  h Tcl_Obj* membe
6e70: 72 20 6f 66 20 74 68 65 20 61 72 72 61 79 2e 0a  r of the array..
6e80: 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
6e90: 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66   value of this f
6ea0: 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 20 6e  unction is the n
6eb0: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
6ec0: 20 6f 66 20 64 61 74 61 0a 2a 2a 20 72 65 74 75   of data.** retu
6ed0: 72 6e 65 64 20 62 79 20 70 53 74 6d 74 20 28 61  rned by pStmt (a
6ee0: 6e 64 20 68 65 6e 63 65 20 74 68 65 20 73 69 7a  nd hence the siz
6ef0: 65 20 6f 66 20 74 68 65 20 2a 70 61 70 43 6f 6c  e of the *papCol
6f00: 4e 61 6d 65 20 61 72 72 61 79 29 2e 0a 2a 2a 0a  Name array)..**.
6f10: 2a 2a 20 49 66 20 70 41 72 72 61 79 20 69 73 20  ** If pArray is 
6f20: 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69  not NULL, then i
6f30: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e  t contains the n
6f40: 61 6d 65 20 6f 66 20 61 20 54 63 6c 20 61 72 72  ame of a Tcl arr
6f50: 61 79 0a 2a 2a 20 76 61 72 69 61 62 6c 65 2e 20  ay.** variable. 
6f60: 54 68 65 20 22 2a 22 20 6d 65 6d 62 65 72 20 6f  The "*" member o
6f70: 66 20 74 68 69 73 20 61 72 72 61 79 20 69 73 20  f this array is 
6f80: 73 65 74 20 74 6f 20 61 20 6c 69 73 74 20 63 6f  set to a list co
6f90: 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 74 68 65 20  ntaining.** the 
6fa0: 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c  names of the col
6fb0: 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79  umns returned by
6fc0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20   the statement, 
6fd0: 69 6e 20 6f 72 64 65 72 20 66 72 6f 6d 0a 2a 2a  in order from.**
6fe0: 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e 20   left to right. 
6ff0: 65 2e 67 2e 20 69 66 20 74 68 65 20 6e 61 6d 65  e.g. if the name
7000: 73 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65  s of the returne
7010: 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 61 2c  d columns are a,
7020: 20 62 20 61 6e 64 0a 2a 2a 20 63 2c 20 69 74 20   b and.** c, it 
7030: 64 6f 65 73 20 74 68 65 20 65 71 75 69 76 61 6c  does the equival
7040: 65 6e 74 20 6f 66 20 74 68 65 20 74 63 6c 20 63  ent of the tcl c
7050: 6f 6d 6d 61 6e 64 3a 0a 2a 2a 0a 2a 2a 20 20 20  ommand:.**.**   
7060: 20 20 73 65 74 20 24 7b 70 41 72 72 61 79 7d 28    set ${pArray}(
7070: 2a 29 20 7b 61 20 62 20 63 7d 0a 2a 2f 0a 73 74  *) {a b c}.*/.st
7080: 61 74 69 63 20 69 6e 74 0a 63 6f 6d 70 75 74 65  atic int.compute
7090: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 54  ColumnNames(.  T
70a0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
70b0: 70 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  p, .  sqlite3_st
70c0: 6d 74 20 2a 70 53 74 6d 74 2c 20 20 20 20 20 20  mt *pStmt,      
70d0: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 73          /* SQL s
70e0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 63  tatement */.  Tc
70f0: 6c 5f 4f 62 6a 20 2a 2a 2a 70 61 70 43 6f 6c 4e  l_Obj ***papColN
7100: 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ame,            
7110: 2f 2a 20 4f 55 54 3a 20 41 72 72 61 79 20 6f 66  /* OUT: Array of
7120: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   column names */
7130: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 72  .  Tcl_Obj *pArr
7140: 61 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ay              
7150: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
7160: 61 72 72 61 79 20 76 61 72 69 61 62 6c 65 20 28  array variable (
7170: 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a  may be null) */.
7180: 29 7b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 0a  ){.  int nCol;..
7190: 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c    /* Compute col
71a0: 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 6e  umn names */.  n
71b0: 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Col = sqlite3_co
71c0: 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74  lumn_count(pStmt
71d0: 29 3b 0a 20 20 69 66 28 20 70 61 70 43 6f 6c 4e  );.  if( papColN
71e0: 61 6d 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ame ){.    int i
71f0: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a  ;.    Tcl_Obj **
7200: 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 54 63 6c  apColName = (Tcl
7210: 5f 4f 62 6a 2a 2a 29 54 63 6c 5f 41 6c 6c 6f 63  _Obj**)Tcl_Alloc
7220: 28 20 73 69 7a 65 6f 66 28 54 63 6c 5f 4f 62 6a  ( sizeof(Tcl_Obj
7230: 2a 29 2a 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 66  *)*nCol );.    f
7240: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
7250: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 70 43 6f  i++){.      apCo
7260: 6c 4e 61 6d 65 5b 69 5d 20 3d 20 64 62 54 65 78  lName[i] = dbTex
7270: 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63  tToObj(sqlite3_c
7280: 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74  olumn_name(pStmt
7290: 2c 69 29 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f  ,i));.      Tcl_
72a0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 61 70 43  IncrRefCount(apC
72b0: 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20  olName[i]);.    
72c0: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 72 65 73  }..    /* If res
72d0: 75 6c 74 73 20 61 72 65 20 62 65 69 6e 67 20 73  ults are being s
72e0: 74 6f 72 65 64 20 69 6e 20 61 6e 20 61 72 72 61  tored in an arra
72f0: 79 20 76 61 72 69 61 62 6c 65 2c 20 74 68 65 6e  y variable, then
7300: 20 63 72 65 61 74 65 0a 20 20 20 20 2a 2a 20 74   create.    ** t
7310: 68 65 20 61 72 72 61 79 28 2a 29 20 65 6e 74 72  he array(*) entr
7320: 79 20 66 6f 72 20 74 68 61 74 20 61 72 72 61 79  y for that array
7330: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
7340: 70 41 72 72 61 79 20 29 7b 0a 20 20 20 20 20 20  pArray ){.      
7350: 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f 6c 4c 69 73  Tcl_Obj *pColLis
7360: 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29  t = Tcl_NewObj()
7370: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20  ;.      Tcl_Obj 
7380: 2a 70 53 74 61 72 20 3d 20 54 63 6c 5f 4e 65 77  *pStar = Tcl_New
7390: 53 74 72 69 6e 67 4f 62 6a 28 22 2a 22 2c 20 2d  StringObj("*", -
73a0: 31 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e  1);.      Tcl_In
73b0: 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6f 6c 4c  crRefCount(pColL
73c0: 69 73 74 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  ist);.      for(
73d0: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
73e0: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4c  ){.        Tcl_L
73f0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
7400: 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 43 6f 6c  ent(interp, pCol
7410: 4c 69 73 74 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b  List, apColName[
7420: 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
7430: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
7440: 75 6e 74 28 70 53 74 61 72 29 3b 0a 20 20 20 20  unt(pStar);.    
7450: 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32    Tcl_ObjSetVar2
7460: 28 69 6e 74 65 72 70 2c 20 70 41 72 72 61 79 2c  (interp, pArray,
7470: 20 70 53 74 61 72 2c 20 70 43 6f 6c 4c 69 73 74   pStar, pColList
7480: 2c 30 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 44  ,0);.      Tcl_D
7490: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6f 6c  ecrRefCount(pCol
74a0: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 54 63 6c  List);.      Tcl
74b0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 53  _DecrRefCount(pS
74c0: 74 61 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tar);.    }.    
74d0: 2a 70 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 61 70  *papColName = ap
74e0: 43 6f 6c 4e 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20  ColName;.  }..  
74f0: 72 65 74 75 72 6e 20 6e 43 6f 6c 3b 0a 7d 0a 0a  return nCol;.}..
7500: 2f 2a 0a 2a 2a 20 54 68 65 20 22 73 71 6c 69 74  /*.** The "sqlit
7510: 65 22 20 63 6f 6d 6d 61 6e 64 20 62 65 6c 6f 77  e" command below
7520: 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 20 54   creates a new T
7530: 63 6c 20 63 6f 6d 6d 61 6e 64 20 66 6f 72 20 65  cl command for e
7540: 61 63 68 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  ach.** connectio
7550: 6e 20 69 74 20 6f 70 65 6e 73 20 74 6f 20 61 6e  n it opens to an
7560: 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
7570: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
7580: 69 73 20 69 6e 76 6f 6b 65 64 0a 2a 2a 20 77 68  is invoked.** wh
7590: 65 6e 65 76 65 72 20 6f 6e 65 20 6f 66 20 74 68  enever one of th
75a0: 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2d 73  ose connection-s
75b0: 70 65 63 69 66 69 63 20 63 6f 6d 6d 61 6e 64 73  pecific commands
75c0: 20 69 73 20 65 78 65 63 75 74 65 64 0a 2a 2a 20   is executed.** 
75d0: 69 6e 20 54 63 6c 2e 20 20 46 6f 72 20 65 78 61  in Tcl.  For exa
75e0: 6d 70 6c 65 2c 20 69 66 20 79 6f 75 20 72 75 6e  mple, if you run
75f0: 20 54 63 6c 20 63 6f 64 65 20 6c 69 6b 65 20 74   Tcl code like t
7600: 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
7610: 20 73 71 6c 69 74 65 33 20 64 62 31 20 20 22 6d   sqlite3 db1  "m
7620: 79 5f 64 61 74 61 62 61 73 65 22 0a 2a 2a 20 20  y_database".**  
7630: 20 20 20 20 20 64 62 31 20 63 6c 6f 73 65 0a 2a       db1 close.*
7640: 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 63  *.** The first c
7650: 6f 6d 6d 61 6e 64 20 6f 70 65 6e 73 20 61 20 63  ommand opens a c
7660: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65  onnection to the
7670: 20 22 6d 79 5f 64 61 74 61 62 61 73 65 22 20 64   "my_database" d
7680: 61 74 61 62 61 73 65 0a 2a 2a 20 61 6e 64 20 63  atabase.** and c
7690: 61 6c 6c 73 20 74 68 61 74 20 63 6f 6e 6e 65 63  alls that connec
76a0: 74 69 6f 6e 20 22 64 62 31 22 2e 20 20 54 68 65  tion "db1".  The
76b0: 20 73 65 63 6f 6e 64 20 63 6f 6d 6d 61 6e 64 20   second command 
76c0: 63 61 75 73 65 73 20 74 68 69 73 0a 2a 2a 20 73  causes this.** s
76d0: 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 62 65 20  ubroutine to be 
76e0: 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74  invoked..*/.stat
76f0: 69 63 20 69 6e 74 20 44 62 4f 62 6a 43 6d 64 28  ic int DbObjCmd(
7700: 76 6f 69 64 20 2a 63 64 2c 20 54 63 6c 5f 49 6e  void *cd, Tcl_In
7710: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
7720: 74 20 6f 62 6a 63 2c 54 63 6c 5f 4f 62 6a 20 2a  t objc,Tcl_Obj *
7730: 63 6f 6e 73 74 2a 6f 62 6a 76 29 7b 0a 20 20 53  const*objv){.  S
7740: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
7750: 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20  SqliteDb*)cd;.  
7760: 69 6e 74 20 63 68 6f 69 63 65 3b 0a 20 20 69 6e  int choice;.  in
7770: 74 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20  t rc = TCL_OK;. 
7780: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
7790: 61 72 20 2a 44 42 5f 73 74 72 73 5b 5d 20 3d 20  ar *DB_strs[] = 
77a0: 7b 0a 20 20 20 20 22 61 75 74 68 6f 72 69 7a 65  {.    "authorize
77b0: 72 22 2c 20 20 20 20 20 20 20 20 20 22 62 75 73  r",         "bus
77c0: 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  y",             
77d0: 20 22 63 61 63 68 65 22 2c 0a 20 20 20 20 22 63   "cache",.    "c
77e0: 68 61 6e 67 65 73 22 2c 20 20 20 20 20 20 20 20  hanges",        
77f0: 20 20 20 20 22 63 6c 6f 73 65 22 2c 20 20 20 20      "close",    
7800: 20 20 20 20 20 20 20 20 20 22 63 6f 6c 6c 61 74           "collat
7810: 65 22 2c 0a 20 20 20 20 22 63 6f 6c 6c 61 74 69  e",.    "collati
7820: 6f 6e 5f 6e 65 65 64 65 64 22 2c 20 20 20 22 63  on_needed",   "c
7830: 6f 6d 6d 69 74 5f 68 6f 6f 6b 22 2c 20 20 20 20  ommit_hook",    
7840: 20 20 20 22 63 6f 6d 70 6c 65 74 65 22 2c 0a 20     "complete",. 
7850: 20 20 20 22 63 6f 70 79 22 2c 20 20 20 20 20 20     "copy",      
7860: 20 20 20 20 20 20 20 20 20 22 65 6e 61 62 6c 65           "enable
7870: 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 22  _load_extension"
7880: 2c 22 65 72 72 6f 72 63 6f 64 65 22 2c 0a 20 20  ,"errorcode",.  
7890: 20 20 22 65 76 61 6c 22 2c 20 20 20 20 20 20 20    "eval",       
78a0: 20 20 20 20 20 20 20 20 22 65 78 69 73 74 73 22          "exists"
78b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 22 66 75  ,            "fu
78c0: 6e 63 74 69 6f 6e 22 2c 0a 20 20 20 20 22 69 6e  nction",.    "in
78d0: 63 72 62 6c 6f 62 22 2c 20 20 20 20 20 20 20 20  crblob",        
78e0: 20 20 20 22 69 6e 74 65 72 72 75 70 74 22 2c 20     "interrupt", 
78f0: 20 20 20 20 20 20 20 20 22 6c 61 73 74 5f 69 6e          "last_in
7900: 73 65 72 74 5f 72 6f 77 69 64 22 2c 0a 20 20 20  sert_rowid",.   
7910: 20 22 6e 75 6c 6c 76 61 6c 75 65 22 2c 20 20 20   "nullvalue",   
7920: 20 20 20 20 20 20 20 22 6f 6e 65 63 6f 6c 75 6d         "onecolum
7930: 6e 22 2c 20 20 20 20 20 20 20 20 20 22 70 72 6f  n",         "pro
7940: 66 69 6c 65 22 2c 0a 20 20 20 20 22 70 72 6f 67  file",.    "prog
7950: 72 65 73 73 22 2c 20 20 20 20 20 20 20 20 20 20  ress",          
7960: 20 22 72 65 6b 65 79 22 2c 20 20 20 20 20 20 20   "rekey",       
7970: 20 20 20 20 20 20 22 72 6f 6c 6c 62 61 63 6b 5f        "rollback_
7980: 68 6f 6f 6b 22 2c 0a 20 20 20 20 22 74 69 6d 65  hook",.    "time
7990: 6f 75 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  out",           
79a0: 20 22 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 22   "total_changes"
79b0: 2c 20 20 20 20 20 22 74 72 61 63 65 22 2c 0a 20  ,     "trace",. 
79c0: 20 20 20 22 74 72 61 6e 73 61 63 74 69 6f 6e 22     "transaction"
79d0: 2c 20 20 20 20 20 20 20 20 22 75 70 64 61 74 65  ,        "update
79e0: 5f 68 6f 6f 6b 22 2c 20 20 20 20 20 20 20 22 76  _hook",       "v
79f0: 65 72 73 69 6f 6e 22 2c 0a 20 20 20 20 30 20 20  ersion",.    0  
7a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a10: 20 20 0a 20 20 7d 3b 0a 20 20 65 6e 75 6d 20 44    .  };.  enum D
7a20: 42 5f 65 6e 75 6d 20 7b 0a 20 20 20 20 44 42 5f  B_enum {.    DB_
7a30: 41 55 54 48 4f 52 49 5a 45 52 2c 20 20 20 20 20  AUTHORIZER,     
7a40: 20 20 20 44 42 5f 42 55 53 59 2c 20 20 20 20 20     DB_BUSY,     
7a50: 20 20 20 20 20 20 20 20 44 42 5f 43 41 43 48 45          DB_CACHE
7a60: 2c 0a 20 20 20 20 44 42 5f 43 48 41 4e 47 45 53  ,.    DB_CHANGES
7a70: 2c 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 43  ,           DB_C
7a80: 4c 4f 53 45 2c 20 20 20 20 20 20 20 20 20 20 20  LOSE,           
7a90: 20 44 42 5f 43 4f 4c 4c 41 54 45 2c 0a 20 20 20   DB_COLLATE,.   
7aa0: 20 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e 45   DB_COLLATION_NE
7ab0: 45 44 45 44 2c 20 20 44 42 5f 43 4f 4d 4d 49 54  EDED,  DB_COMMIT
7ac0: 5f 48 4f 4f 4b 2c 20 20 20 20 20 20 44 42 5f 43  _HOOK,      DB_C
7ad0: 4f 4d 50 4c 45 54 45 2c 0a 20 20 20 20 44 42 5f  OMPLETE,.    DB_
7ae0: 43 4f 50 59 2c 20 20 20 20 20 20 20 20 20 20 20  COPY,           
7af0: 20 20 20 44 42 5f 45 4e 41 42 4c 45 5f 4c 4f 41     DB_ENABLE_LOA
7b00: 44 5f 45 58 54 45 4e 53 49 4f 4e 2c 44 42 5f 45  D_EXTENSION,DB_E
7b10: 52 52 4f 52 43 4f 44 45 2c 0a 20 20 20 20 44 42  RRORCODE,.    DB
7b20: 5f 45 56 41 4c 2c 20 20 20 20 20 20 20 20 20 20  _EVAL,          
7b30: 20 20 20 20 44 42 5f 45 58 49 53 54 53 2c 20 20      DB_EXISTS,  
7b40: 20 20 20 20 20 20 20 20 20 44 42 5f 46 55 4e 43           DB_FUNC
7b50: 54 49 4f 4e 2c 0a 20 20 20 20 44 42 5f 49 4e 43  TION,.    DB_INC
7b60: 52 42 4c 4f 42 2c 20 20 20 20 20 20 20 20 20 20  RBLOB,          
7b70: 44 42 5f 49 4e 54 45 52 52 55 50 54 2c 20 20 20  DB_INTERRUPT,   
7b80: 20 20 20 20 20 44 42 5f 4c 41 53 54 5f 49 4e 53       DB_LAST_INS
7b90: 45 52 54 5f 52 4f 57 49 44 2c 0a 20 20 20 20 44  ERT_ROWID,.    D
7ba0: 42 5f 4e 55 4c 4c 56 41 4c 55 45 2c 20 20 20 20  B_NULLVALUE,    
7bb0: 20 20 20 20 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d       DB_ONECOLUM
7bc0: 4e 2c 20 20 20 20 20 20 20 20 44 42 5f 50 52 4f  N,        DB_PRO
7bd0: 46 49 4c 45 2c 0a 20 20 20 20 44 42 5f 50 52 4f  FILE,.    DB_PRO
7be0: 47 52 45 53 53 2c 20 20 20 20 20 20 20 20 20 20  GRESS,          
7bf0: 44 42 5f 52 45 4b 45 59 2c 20 20 20 20 20 20 20  DB_REKEY,       
7c00: 20 20 20 20 20 44 42 5f 52 4f 4c 4c 42 41 43 4b       DB_ROLLBACK
7c10: 5f 48 4f 4f 4b 2c 0a 20 20 20 20 44 42 5f 54 49  _HOOK,.    DB_TI
7c20: 4d 45 4f 55 54 2c 20 20 20 20 20 20 20 20 20 20  MEOUT,          
7c30: 20 44 42 5f 54 4f 54 41 4c 5f 43 48 41 4e 47 45   DB_TOTAL_CHANGE
7c40: 53 2c 20 20 20 20 44 42 5f 54 52 41 43 45 2c 0a  S,    DB_TRACE,.
7c50: 20 20 20 20 44 42 5f 54 52 41 4e 53 41 43 54 49      DB_TRANSACTI
7c60: 4f 4e 2c 20 20 20 20 20 20 20 44 42 5f 55 50 44  ON,       DB_UPD
7c70: 41 54 45 5f 48 4f 4f 4b 2c 20 20 20 20 20 20 44  ATE_HOOK,      D
7c80: 42 5f 56 45 52 53 49 4f 4e 0a 20 20 7d 3b 0a 20  B_VERSION.  };. 
7c90: 20 2f 2a 20 64 6f 6e 27 74 20 6c 65 61 76 65 20   /* don't leave 
7ca0: 74 72 61 69 6c 69 6e 67 20 63 6f 6d 6d 61 73 20  trailing commas 
7cb0: 6f 6e 20 44 42 5f 65 6e 75 6d 2c 20 69 74 20 63  on DB_enum, it c
7cc0: 6f 6e 66 75 73 65 73 20 74 68 65 20 41 49 58 20  onfuses the AIX 
7cd0: 78 6c 63 20 63 6f 6d 70 69 6c 65 72 20 2a 2f 0a  xlc compiler */.
7ce0: 0a 20 20 69 66 28 20 6f 62 6a 63 3c 32 20 29 7b  .  if( objc<2 ){
7cf0: 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
7d00: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
7d10: 20 6f 62 6a 76 2c 20 22 53 55 42 43 4f 4d 4d 41   objv, "SUBCOMMA
7d20: 4e 44 20 2e 2e 2e 22 29 3b 0a 20 20 20 20 72 65  ND ...");.    re
7d30: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
7d40: 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65    }.  if( Tcl_Ge
7d50: 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e  tIndexFromObj(in
7d60: 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 44  terp, objv[1], D
7d70: 42 5f 73 74 72 73 2c 20 22 6f 70 74 69 6f 6e 22  B_strs, "option"
7d80: 2c 20 30 2c 20 26 63 68 6f 69 63 65 29 20 29 7b  , 0, &choice) ){
7d90: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
7da0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 73 77  ERROR;.  }..  sw
7db0: 69 74 63 68 28 20 28 65 6e 75 6d 20 44 42 5f 65  itch( (enum DB_e
7dc0: 6e 75 6d 29 63 68 6f 69 63 65 20 29 7b 0a 0a 20  num)choice ){.. 
7dd0: 20 2f 2a 20 20 20 20 24 64 62 20 61 75 74 68 6f   /*    $db autho
7de0: 72 69 7a 65 72 20 3f 43 41 4c 4c 42 41 43 4b 3f  rizer ?CALLBACK?
7df0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b  .  **.  ** Invok
7e00: 65 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c  e the given call
7e10: 62 61 63 6b 20 74 6f 20 61 75 74 68 6f 72 69 7a  back to authoriz
7e20: 65 20 65 61 63 68 20 53 51 4c 20 6f 70 65 72 61  e each SQL opera
7e30: 74 69 6f 6e 20 61 73 20 69 74 20 69 73 0a 20 20  tion as it is.  
7e40: 2a 2a 20 63 6f 6d 70 69 6c 65 64 2e 20 20 35 20  ** compiled.  5 
7e50: 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 61 70  arguments are ap
7e60: 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 63 61  pended to the ca
7e70: 6c 6c 62 61 63 6b 20 62 65 66 6f 72 65 20 69 74  llback before it
7e80: 20 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6b 65 64   is.  ** invoked
7e90: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 31  :.  **.  **   (1
7ea0: 29 20 54 68 65 20 61 75 74 68 6f 72 69 7a 61 74  ) The authorizat
7eb0: 69 6f 6e 20 74 79 70 65 20 28 65 78 3a 20 53 51  ion type (ex: SQ
7ec0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c  LITE_CREATE_TABL
7ed0: 45 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  E, SQLITE_INSERT
7ee0: 2c 20 2e 2e 2e 29 0a 20 20 2a 2a 20 20 20 28 32  , ...).  **   (2
7ef0: 29 20 46 69 72 73 74 20 64 65 73 63 72 69 70 74  ) First descript
7f00: 69 76 65 20 6e 61 6d 65 20 28 64 65 70 65 6e 64  ive name (depend
7f10: 73 20 6f 6e 20 61 75 74 68 6f 72 69 7a 61 74 69  s on authorizati
7f20: 6f 6e 20 74 79 70 65 29 0a 20 20 2a 2a 20 20 20  on type).  **   
7f30: 28 33 29 20 53 65 63 6f 6e 64 20 64 65 73 63 72  (3) Second descr
7f40: 69 70 74 69 76 65 20 6e 61 6d 65 0a 20 20 2a 2a  iptive name.  **
7f50: 20 20 20 28 34 29 20 4e 61 6d 65 20 6f 66 20 74     (4) Name of t
7f60: 68 65 20 64 61 74 61 62 61 73 65 20 28 65 78 3a  he database (ex:
7f70: 20 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 29   "main", "temp")
7f80: 0a 20 20 2a 2a 20 20 20 28 35 29 20 4e 61 6d 65  .  **   (5) Name
7f90: 20 6f 66 20 74 72 69 67 67 65 72 20 74 68 61 74   of trigger that
7fa0: 20 69 73 20 64 6f 69 6e 67 20 74 68 65 20 61 63   is doing the ac
7fb0: 63 65 73 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  cess.  **.  ** T
7fc0: 68 65 20 63 61 6c 6c 62 61 63 6b 20 73 68 6f 75  he callback shou
7fd0: 6c 64 20 72 65 74 75 72 6e 20 6f 6e 20 6f 66 20  ld return on of 
7fe0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
7ff0: 72 69 6e 67 73 3a 20 53 51 4c 49 54 45 5f 4f 4b  rings: SQLITE_OK
8000: 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 49 47  ,.  ** SQLITE_IG
8010: 4e 4f 52 45 2c 20 6f 72 20 53 51 4c 49 54 45 5f  NORE, or SQLITE_
8020: 44 45 4e 59 2e 20 20 41 6e 79 20 6f 74 68 65 72  DENY.  Any other
8030: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
8040: 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2a 0a   an error..  **.
8050: 20 20 2a 2a 20 49 66 20 74 68 69 73 20 6d 65 74    ** If this met
8060: 68 6f 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 77  hod is invoked w
8070: 69 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73  ith no arguments
8080: 2c 20 74 68 65 20 63 75 72 72 65 6e 74 20 61 75  , the current au
8090: 74 68 6f 72 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a  thorization.  **
80a0: 20 63 61 6c 6c 62 61 63 6b 20 73 74 72 69 6e 67   callback string
80b0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20   is returned..  
80c0: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 41 55 54  */.  case DB_AUT
80d0: 48 4f 52 49 5a 45 52 3a 20 7b 0a 23 69 66 64 65  HORIZER: {.#ifde
80e0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
80f0: 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20  THORIZATION.    
8100: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
8110: 28 69 6e 74 65 72 70 2c 20 22 61 75 74 68 6f 72  (interp, "author
8120: 69 7a 61 74 69 6f 6e 20 6e 6f 74 20 61 76 61 69  ization not avai
8130: 6c 61 62 6c 65 20 69 6e 20 74 68 69 73 20 62 75  lable in this bu
8140: 69 6c 64 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  ild", 0);.    re
8150: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8160: 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 6f 62  #else.    if( ob
8170: 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63  jc>3 ){.      Tc
8180: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
8190: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
81a0: 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20  "?CALLBACK?");. 
81b0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
81c0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65  ERROR;.    }else
81d0: 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a   if( objc==2 ){.
81e0: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
81f0: 41 75 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Auth ){.        
8200: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
8210: 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 41  (interp, pDb->zA
8220: 75 74 68 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  uth, 0);.      }
8230: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8240: 20 20 63 68 61 72 20 2a 7a 41 75 74 68 3b 0a 20    char *zAuth;. 
8250: 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20       int len;.  
8260: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75      if( pDb->zAu
8270: 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  th ){.        Tc
8280: 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 41 75 74  l_Free(pDb->zAut
8290: 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  h);.      }.    
82a0: 20 20 7a 41 75 74 68 20 3d 20 54 63 6c 5f 47 65    zAuth = Tcl_Ge
82b0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
82c0: 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20  bjv[2], &len);. 
82d0: 20 20 20 20 20 69 66 28 20 7a 41 75 74 68 20 26       if( zAuth &
82e0: 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20  & len>0 ){.     
82f0: 20 20 20 70 44 62 2d 3e 7a 41 75 74 68 20 3d 20     pDb->zAuth = 
8300: 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b  Tcl_Alloc( len +
8310: 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65   1 );.        me
8320: 6d 63 70 79 28 70 44 62 2d 3e 7a 41 75 74 68 2c  mcpy(pDb->zAuth,
8330: 20 7a 41 75 74 68 2c 20 6c 65 6e 2b 31 29 3b 0a   zAuth, len+1);.
8340: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8350: 20 20 20 20 20 70 44 62 2d 3e 7a 41 75 74 68 20       pDb->zAuth 
8360: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
8370: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74     if( pDb->zAut
8380: 68 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  h ){.        pDb
8390: 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  ->interp = inter
83a0: 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  p;.        sqlit
83b0: 65 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65  e3_set_authorize
83c0: 72 28 70 44 62 2d 3e 64 62 2c 20 61 75 74 68 5f  r(pDb->db, auth_
83d0: 63 61 6c 6c 62 61 63 6b 2c 20 70 44 62 29 3b 0a  callback, pDb);.
83e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
83f0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74       sqlite3_set
8400: 5f 61 75 74 68 6f 72 69 7a 65 72 28 70 44 62 2d  _authorizer(pDb-
8410: 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  >db, 0, 0);.    
8420: 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
8430: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
8440: 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 62 75 73  .  /*    $db bus
8450: 79 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a  y ?CALLBACK?.  *
8460: 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  *.  ** Invoke th
8470: 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b  e given callback
8480: 20 69 66 20 61 6e 20 53 51 4c 20 73 74 61 74 65   if an SQL state
8490: 6d 65 6e 74 20 61 74 74 65 6d 70 74 73 20 74 6f  ment attempts to
84a0: 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 6c 6f 63   open.  ** a loc
84b0: 6b 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  ked database fil
84c0: 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  e..  */.  case D
84d0: 42 5f 42 55 53 59 3a 20 7b 0a 20 20 20 20 69 66  B_BUSY: {.    if
84e0: 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20  ( objc>3 ){.    
84f0: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
8500: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
8510: 6a 76 2c 20 22 43 41 4c 4c 42 41 43 4b 22 29 3b  jv, "CALLBACK");
8520: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
8530: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c  L_ERROR;.    }el
8540: 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29  se if( objc==2 )
8550: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  {.      if( pDb-
8560: 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 20 20  >zBusy ){.      
8570: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
8580: 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e  lt(interp, pDb->
8590: 7a 42 75 73 79 2c 20 30 29 3b 0a 20 20 20 20 20  zBusy, 0);.     
85a0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
85b0: 20 20 20 20 63 68 61 72 20 2a 7a 42 75 73 79 3b      char *zBusy;
85c0: 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  .      int len;.
85d0: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
85e0: 42 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Busy ){.        
85f0: 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 42  Tcl_Free(pDb->zB
8600: 75 73 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  usy);.      }.  
8610: 20 20 20 20 7a 42 75 73 79 20 3d 20 54 63 6c 5f      zBusy = Tcl_
8620: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
8630: 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b  (objv[2], &len);
8640: 0a 20 20 20 20 20 20 69 66 28 20 7a 42 75 73 79  .      if( zBusy
8650: 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20   && len>0 ){.   
8660: 20 20 20 20 20 70 44 62 2d 3e 7a 42 75 73 79 20       pDb->zBusy 
8670: 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e  = Tcl_Alloc( len
8680: 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20   + 1 );.        
8690: 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 42 75 73  memcpy(pDb->zBus
86a0: 79 2c 20 7a 42 75 73 79 2c 20 6c 65 6e 2b 31 29  y, zBusy, len+1)
86b0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
86c0: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 42 75 73         pDb->zBus
86d0: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  y = 0;.      }. 
86e0: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 42       if( pDb->zB
86f0: 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70  usy ){.        p
8700: 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74  Db->interp = int
8710: 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  erp;.        sql
8720: 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65  ite3_busy_handle
8730: 72 28 70 44 62 2d 3e 64 62 2c 20 44 62 42 75 73  r(pDb->db, DbBus
8740: 79 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a  yHandler, pDb);.
8750: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8760: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73       sqlite3_bus
8770: 79 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64  y_handler(pDb->d
8780: 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  b, 0, 0);.      
8790: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  }.    }.    brea
87a0: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
87b0: 20 24 64 62 20 63 61 63 68 65 20 66 6c 75 73 68   $db cache flush
87c0: 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63 61  .  **     $db ca
87d0: 63 68 65 20 73 69 7a 65 20 6e 0a 20 20 2a 2a 0a  che size n.  **.
87e0: 20 20 2a 2a 20 46 6c 75 73 68 20 74 68 65 20 70    ** Flush the p
87f0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
8800: 74 20 63 61 63 68 65 2c 20 6f 72 20 73 65 74 20  t cache, or set 
8810: 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
8820: 65 72 20 6f 66 0a 20 20 2a 2a 20 63 61 63 68 65  er of.  ** cache
8830: 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20  d statements..  
8840: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 41 43  */.  case DB_CAC
8850: 48 45 3a 20 7b 0a 20 20 20 20 63 68 61 72 20 2a  HE: {.    char *
8860: 73 75 62 43 6d 64 3b 0a 20 20 20 20 69 6e 74 20  subCmd;.    int 
8870: 6e 3b 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  n;..    if( objc
8880: 3c 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  <=2 ){.      Tcl
8890: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
88a0: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
88b0: 63 61 63 68 65 20 6f 70 74 69 6f 6e 20 3f 61 72  cache option ?ar
88c0: 67 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  g?");.      retu
88d0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
88e0: 20 20 7d 0a 20 20 20 20 73 75 62 43 6d 64 20 3d    }.    subCmd =
88f0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
8900: 6f 6d 4f 62 6a 28 20 6f 62 6a 76 5b 32 5d 2c 20  omObj( objv[2], 
8910: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 2a 73 75  0 );.    if( *su
8920: 62 43 6d 64 3d 3d 27 66 27 20 26 26 20 73 74 72  bCmd=='f' && str
8930: 63 6d 70 28 73 75 62 43 6d 64 2c 22 66 6c 75 73  cmp(subCmd,"flus
8940: 68 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  h")==0 ){.      
8950: 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
8960: 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67         Tcl_Wrong
8970: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
8980: 32 2c 20 6f 62 6a 76 2c 20 22 66 6c 75 73 68 22  2, objv, "flush"
8990: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
89a0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
89b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
89c0: 20 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65    flushStmtCache
89d0: 28 20 70 44 62 20 29 3b 0a 20 20 20 20 20 20 7d  ( pDb );.      }
89e0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 2a  .    }else if( *
89f0: 73 75 62 43 6d 64 3d 3d 27 73 27 20 26 26 20 73  subCmd=='s' && s
8a00: 74 72 63 6d 70 28 73 75 62 43 6d 64 2c 22 73 69  trcmp(subCmd,"si
8a10: 7a 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ze")==0 ){.     
8a20: 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a   if( objc!=4 ){.
8a30: 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e          Tcl_Wron
8a40: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
8a50: 20 32 2c 20 6f 62 6a 76 2c 20 22 73 69 7a 65 20   2, objv, "size 
8a60: 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  n");.        ret
8a70: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
8a80: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8a90: 20 20 20 20 69 66 28 20 54 43 4c 5f 45 52 52 4f      if( TCL_ERRO
8aa0: 52 3d 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  R==Tcl_GetIntFro
8ab0: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
8ac0: 76 5b 33 5d 2c 20 26 6e 29 20 29 7b 0a 20 20 20  v[3], &n) ){.   
8ad0: 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
8ae0: 64 52 65 73 75 6c 74 28 20 69 6e 74 65 72 70 2c  dResult( interp,
8af0: 20 22 63 61 6e 6e 6f 74 20 63 6f 6e 76 65 72 74   "cannot convert
8b00: 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 20 20   \"", .         
8b10: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
8b20: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
8b30: 33 5d 2c 30 29 2c 20 22 5c 22 20 74 6f 20 69 6e  3],0), "\" to in
8b40: 74 65 67 65 72 22 2c 20 30 29 3b 0a 20 20 20 20  teger", 0);.    
8b50: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
8b60: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
8b70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
8b80: 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20   if( n<0 ){.    
8b90: 20 20 20 20 20 20 20 20 66 6c 75 73 68 53 74 6d          flushStm
8ba0: 74 43 61 63 68 65 28 20 70 44 62 20 29 3b 0a 20  tCache( pDb );. 
8bb0: 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 30             n = 0
8bc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
8bd0: 65 20 69 66 28 20 6e 3e 4d 41 58 5f 50 52 45 50  e if( n>MAX_PREP
8be0: 41 52 45 44 5f 53 54 4d 54 53 20 29 7b 0a 20 20  ARED_STMTS ){.  
8bf0: 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 4d 41            n = MA
8c00: 58 5f 50 52 45 50 41 52 45 44 5f 53 54 4d 54 53  X_PREPARED_STMTS
8c10: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
8c20: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 6d 61 78          pDb->max
8c30: 53 74 6d 74 20 3d 20 6e 3b 0a 20 20 20 20 20 20  Stmt = n;.      
8c40: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
8c50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c  }else{.      Tcl
8c60: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 20 69  _AppendResult( i
8c70: 6e 74 65 72 70 2c 20 22 62 61 64 20 6f 70 74 69  nterp, "bad opti
8c80: 6f 6e 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  on \"", .       
8c90: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
8ca0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
8cb0: 30 29 2c 20 22 5c 22 3a 20 6d 75 73 74 20 62 65  0), "\": must be
8cc0: 20 66 6c 75 73 68 20 6f 72 20 73 69 7a 65 22 2c   flush or size",
8cd0: 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   0);.      retur
8ce0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
8cf0: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
8d00: 7d 0a 0a 20 20 2f 2a 20 20 20 20 20 24 64 62 20  }..  /*     $db 
8d10: 63 68 61 6e 67 65 73 0a 20 20 2a 2a 0a 20 20 2a  changes.  **.  *
8d20: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
8d30: 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
8d40: 20 77 65 72 65 20 6d 6f 64 69 66 69 65 64 2c 20   were modified, 
8d50: 69 6e 73 65 72 74 65 64 2c 20 6f 72 20 64 65 6c  inserted, or del
8d60: 65 74 65 64 20 62 79 0a 20 20 2a 2a 20 74 68 65  eted by.  ** the
8d70: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 49 4e 53   most recent INS
8d80: 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44  ERT, UPDATE or D
8d90: 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c  ELETE statement,
8da0: 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67 20 0a   not including .
8db0: 20 20 2a 2a 20 61 6e 79 20 63 68 61 6e 67 65 73    ** any changes
8dc0: 20 6d 61 64 65 20 62 79 20 74 72 69 67 67 65 72   made by trigger
8dd0: 20 70 72 6f 67 72 61 6d 73 2e 0a 20 20 2a 2f 0a   programs..  */.
8de0: 20 20 63 61 73 65 20 44 42 5f 43 48 41 4e 47 45    case DB_CHANGE
8df0: 53 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  S: {.    Tcl_Obj
8e00: 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 69   *pResult;.    i
8e10: 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
8e20: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
8e30: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
8e40: 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 20  objv, "");.     
8e50: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
8e60: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 52 65  R;.    }.    pRe
8e70: 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62  sult = Tcl_GetOb
8e80: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  jResult(interp);
8e90: 0a 20 20 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f  .    Tcl_SetIntO
8ea0: 62 6a 28 70 52 65 73 75 6c 74 2c 20 73 71 6c 69  bj(pResult, sqli
8eb0: 74 65 33 5f 63 68 61 6e 67 65 73 28 70 44 62 2d  te3_changes(pDb-
8ec0: 3e 64 62 29 29 3b 0a 20 20 20 20 62 72 65 61 6b  >db));.    break
8ed0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24  ;.  }..  /*    $
8ee0: 64 62 20 63 6c 6f 73 65 0a 20 20 2a 2a 0a 20 20  db close.  **.  
8ef0: 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20  ** Shutdown the 
8f00: 64 61 74 61 62 61 73 65 0a 20 20 2a 2f 0a 20 20  database.  */.  
8f10: 63 61 73 65 20 44 42 5f 43 4c 4f 53 45 3a 20 7b  case DB_CLOSE: {
8f20: 0a 20 20 20 20 54 63 6c 5f 44 65 6c 65 74 65 43  .    Tcl_DeleteC
8f30: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 54  ommand(interp, T
8f40: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
8f50: 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 29  Obj(objv[0], 0))
8f60: 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
8f70: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  /*.  **     
8f80: 24 64 62 20 63 6f 6c 6c 61 74 65 20 4e 41 4d 45  $db collate NAME
8f90: 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a   SCRIPT.  **.  *
8fa0: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53  * Create a new S
8fb0: 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e  QL collation fun
8fc0: 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d  ction called NAM
8fd0: 45 2e 20 20 57 68 65 6e 65 76 65 72 0a 20 20 2a  E.  Whenever.  *
8fe0: 2a 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20  * that function 
8ff0: 69 73 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b  is called, invok
9000: 65 20 53 43 52 49 50 54 20 74 6f 20 65 76 61 6c  e SCRIPT to eval
9010: 75 61 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f  uate the functio
9020: 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  n..  */.  case D
9030: 42 5f 43 4f 4c 4c 41 54 45 3a 20 7b 0a 20 20 20  B_COLLATE: {.   
9040: 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43 6f   SqlCollate *pCo
9050: 6c 6c 61 74 65 3b 0a 20 20 20 20 63 68 61 72 20  llate;.    char 
9060: 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 68 61 72  *zName;.    char
9070: 20 2a 7a 53 63 72 69 70 74 3b 0a 20 20 20 20 69   *zScript;.    i
9080: 6e 74 20 6e 53 63 72 69 70 74 3b 0a 20 20 20 20  nt nScript;.    
9090: 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
90a0: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
90b0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
90c0: 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20 53 43 52   objv, "NAME SCR
90d0: 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74  IPT");.      ret
90e0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
90f0: 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d     }.    zName =
9100: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
9110: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30  omObj(objv[2], 0
9120: 29 3b 0a 20 20 20 20 7a 53 63 72 69 70 74 20 3d  );.    zScript =
9130: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
9140: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26  omObj(objv[3], &
9150: 6e 53 63 72 69 70 74 29 3b 0a 20 20 20 20 70 43  nScript);.    pC
9160: 6f 6c 6c 61 74 65 20 3d 20 28 53 71 6c 43 6f 6c  ollate = (SqlCol
9170: 6c 61 74 65 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28  late*)Tcl_Alloc(
9180: 20 73 69 7a 65 6f 66 28 2a 70 43 6f 6c 6c 61 74   sizeof(*pCollat
9190: 65 29 20 2b 20 6e 53 63 72 69 70 74 20 2b 20 31  e) + nScript + 1
91a0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c   );.    if( pCol
91b0: 6c 61 74 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  late==0 ) return
91c0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
91d0: 70 43 6f 6c 6c 61 74 65 2d 3e 69 6e 74 65 72 70  pCollate->interp
91e0: 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 70   = interp;.    p
91f0: 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78 74 20 3d  Collate->pNext =
9200: 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 3b 0a   pDb->pCollate;.
9210: 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 7a 53      pCollate->zS
9220: 63 72 69 70 74 20 3d 20 28 63 68 61 72 2a 29 26  cript = (char*)&
9230: 70 43 6f 6c 6c 61 74 65 5b 31 5d 3b 0a 20 20 20  pCollate[1];.   
9240: 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20 3d   pDb->pCollate =
9250: 20 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 6d   pCollate;.    m
9260: 65 6d 63 70 79 28 70 43 6f 6c 6c 61 74 65 2d 3e  emcpy(pCollate->
9270: 7a 53 63 72 69 70 74 2c 20 7a 53 63 72 69 70 74  zScript, zScript
9280: 2c 20 6e 53 63 72 69 70 74 2b 31 29 3b 0a 20 20  , nScript+1);.  
9290: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 72    if( sqlite3_cr
92a0: 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 70  eate_collation(p
92b0: 44 62 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 53  Db->db, zName, S
92c0: 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20 20 20  QLITE_UTF8, .   
92d0: 20 20 20 20 20 70 43 6f 6c 6c 61 74 65 2c 20 74       pCollate, t
92e0: 63 6c 53 71 6c 43 6f 6c 6c 61 74 65 29 20 29 7b  clSqlCollate) ){
92f0: 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65  .      Tcl_SetRe
9300: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
9310: 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72  ar *)sqlite3_err
9320: 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 54 43  msg(pDb->db), TC
9330: 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20  L_VOLATILE);.   
9340: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
9350: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  ROR;.    }.    b
9360: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
9370: 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63 6f 6c    **     $db col
9380: 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 20 53 43  lation_needed SC
9390: 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43  RIPT.  **.  ** C
93a0: 72 65 61 74 65 20 61 20 6e 65 77 20 53 51 4c 20  reate a new SQL 
93b0: 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69  collation functi
93c0: 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20  on called NAME. 
93d0: 20 57 68 65 6e 65 76 65 72 0a 20 20 2a 2a 20 74   Whenever.  ** t
93e0: 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  hat function is 
93f0: 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53  called, invoke S
9400: 43 52 49 50 54 20 74 6f 20 65 76 61 6c 75 61 74  CRIPT to evaluat
9410: 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a  e the function..
9420: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43    */.  case DB_C
9430: 4f 4c 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 3a  OLLATION_NEEDED:
9440: 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21   {.    if( objc!
9450: 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =3 ){.      Tcl_
9460: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
9470: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53  erp, 2, objv, "S
9480: 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72  CRIPT");.      r
9490: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
94a0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
94b0: 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64  Db->pCollateNeed
94c0: 65 64 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  ed ){.      Tcl_
94d0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62  DecrRefCount(pDb
94e0: 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64  ->pCollateNeeded
94f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 62  );.    }.    pDb
9500: 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64  ->pCollateNeeded
9510: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
9520: 4f 62 6a 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  Obj(objv[2]);.  
9530: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
9540: 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65  nt(pDb->pCollate
9550: 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 73 71 6c  Needed);.    sql
9560: 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e  ite3_collation_n
9570: 65 65 64 65 64 28 70 44 62 2d 3e 64 62 2c 20 70  eeded(pDb->db, p
9580: 44 62 2c 20 74 63 6c 43 6f 6c 6c 61 74 65 4e 65  Db, tclCollateNe
9590: 65 64 65 64 29 3b 0a 20 20 20 20 62 72 65 61 6b  eded);.    break
95a0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24  ;.  }..  /*    $
95b0: 64 62 20 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 20 3f  db commit_hook ?
95c0: 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20  CALLBACK?.  **. 
95d0: 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67   ** Invoke the g
95e0: 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 6a 75  iven callback ju
95f0: 73 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74  st before commit
9600: 74 69 6e 67 20 65 76 65 72 79 20 53 51 4c 20 74  ting every SQL t
9610: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a  ransaction..  **
9620: 20 49 66 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   If the callback
9630: 20 74 68 72 6f 77 73 20 61 6e 20 65 78 63 65 70   throws an excep
9640: 74 69 6f 6e 20 6f 72 20 72 65 74 75 72 6e 73 20  tion or returns 
9650: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74  non-zero, then t
9660: 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  he.  ** transact
9670: 69 6f 6e 20 69 73 20 61 62 6f 72 74 65 64 2e 20  ion is aborted. 
9680: 20 49 66 20 43 41 4c 4c 42 41 43 4b 20 69 73 20   If CALLBACK is 
9690: 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c  an empty string,
96a0: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 0a 20 20   the callback.  
96b0: 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e 0a  ** is disabled..
96c0: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43    */.  case DB_C
96d0: 4f 4d 4d 49 54 5f 48 4f 4f 4b 3a 20 7b 0a 20 20  OMMIT_HOOK: {.  
96e0: 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a    if( objc>3 ){.
96f0: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
9700: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
9710: 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41  , objv, "?CALLBA
9720: 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74  CK?");.      ret
9730: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9740: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a     }else if( obj
9750: 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66  c==2 ){.      if
9760: 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29  ( pDb->zCommit )
9770: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  {.        Tcl_Ap
9780: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
9790: 70 2c 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 2c  p, pDb->zCommit,
97a0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
97b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
97c0: 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 0a 20 20 20  ar *zCommit;.   
97d0: 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
97e0: 20 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d    if( pDb->zComm
97f0: 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  it ){.        Tc
9800: 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 43 6f 6d  l_Free(pDb->zCom
9810: 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mit);.      }.  
9820: 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 54 63      zCommit = Tc
9830: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
9840: 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e  bj(objv[2], &len
9850: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6f  );.      if( zCo
9860: 6d 6d 69 74 20 26 26 20 6c 65 6e 3e 30 20 29 7b  mmit && len>0 ){
9870: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 43  .        pDb->zC
9880: 6f 6d 6d 69 74 20 3d 20 54 63 6c 5f 41 6c 6c 6f  ommit = Tcl_Allo
9890: 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20  c( len + 1 );.  
98a0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62        memcpy(pDb
98b0: 2d 3e 7a 43 6f 6d 6d 69 74 2c 20 7a 43 6f 6d 6d  ->zCommit, zComm
98c0: 69 74 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20  it, len+1);.    
98d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
98e0: 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20   pDb->zCommit = 
98f0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
9900: 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69   if( pDb->zCommi
9910: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  t ){.        pDb
9920: 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  ->interp = inter
9930: 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  p;.        sqlit
9940: 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 70  e3_commit_hook(p
9950: 44 62 2d 3e 64 62 2c 20 44 62 43 6f 6d 6d 69 74  Db->db, DbCommit
9960: 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20  Handler, pDb);. 
9970: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9980: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d      sqlite3_comm
9990: 69 74 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c  it_hook(pDb->db,
99a0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
99b0: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
99c0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
99d0: 62 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c 0a 20  b complete SQL. 
99e0: 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
99f0: 54 52 55 45 20 69 66 20 53 51 4c 20 69 73 20 61  TRUE if SQL is a
9a00: 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c 20 73 74   complete SQL st
9a10: 61 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e  atement.  Return
9a20: 20 46 41 4c 53 45 20 69 66 0a 20 20 2a 2a 20 61   FALSE if.  ** a
9a30: 64 64 69 74 69 6f 6e 61 6c 20 6c 69 6e 65 73 20  dditional lines 
9a40: 6f 66 20 69 6e 70 75 74 20 61 72 65 20 6e 65 65  of input are nee
9a50: 64 65 64 2e 20 20 54 68 69 73 20 69 73 20 73 69  ded.  This is si
9a60: 6d 69 6c 61 72 20 74 6f 20 74 68 65 0a 20 20 2a  milar to the.  *
9a70: 2a 20 62 75 69 6c 74 2d 69 6e 20 22 69 6e 66 6f  * built-in "info
9a80: 20 63 6f 6d 70 6c 65 74 65 22 20 63 6f 6d 6d 61   complete" comma
9a90: 6e 64 20 6f 66 20 54 63 6c 2e 0a 20 20 2a 2f 0a  nd of Tcl..  */.
9aa0: 20 20 63 61 73 65 20 44 42 5f 43 4f 4d 50 4c 45    case DB_COMPLE
9ab0: 54 45 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53 51  TE: {.#ifndef SQ
9ac0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45  LITE_OMIT_COMPLE
9ad0: 54 45 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  TE.    Tcl_Obj *
9ae0: 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74  pResult;.    int
9af0: 20 69 73 43 6f 6d 70 6c 65 74 65 3b 0a 20 20 20   isComplete;.   
9b00: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
9b10: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
9b20: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
9b30: 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 22 29 3b 0a  , objv, "SQL");.
9b40: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
9b50: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
9b60: 20 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 73    isComplete = s
9b70: 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 28  qlite3_complete(
9b80: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
9b90: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30  omObj(objv[2], 0
9ba0: 29 20 29 3b 0a 20 20 20 20 70 52 65 73 75 6c 74  ) );.    pResult
9bb0: 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73   = Tcl_GetObjRes
9bc0: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  ult(interp);.   
9bd0: 20 54 63 6c 5f 53 65 74 42 6f 6f 6c 65 61 6e 4f   Tcl_SetBooleanO
9be0: 62 6a 28 70 52 65 73 75 6c 74 2c 20 69 73 43 6f  bj(pResult, isCo
9bf0: 6d 70 6c 65 74 65 29 3b 0a 23 65 6e 64 69 66 0a  mplete);.#endif.
9c00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
9c10: 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6f 70 79    /*    $db copy
9c20: 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69   conflict-algori
9c30: 74 68 6d 20 74 61 62 6c 65 20 66 69 6c 65 6e 61  thm table filena
9c40: 6d 65 20 3f 53 45 50 41 52 41 54 4f 52 3f 20 3f  me ?SEPARATOR? ?
9c50: 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f 0a 20  NULLINDICATOR?. 
9c60: 20 2a 2a 0a 20 20 2a 2a 20 43 6f 70 79 20 64 61   **.  ** Copy da
9c70: 74 61 20 69 6e 74 6f 20 74 61 62 6c 65 20 66 72  ta into table fr
9c80: 6f 6d 20 66 69 6c 65 6e 61 6d 65 2c 20 6f 70 74  om filename, opt
9c90: 69 6f 6e 61 6c 6c 79 20 75 73 69 6e 67 20 53 45  ionally using SE
9ca0: 50 41 52 41 54 4f 52 0a 20 20 2a 2a 20 61 73 20  PARATOR.  ** as 
9cb0: 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72  column separator
9cc0: 73 2e 20 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20  s.  If a column 
9cd0: 63 6f 6e 74 61 69 6e 73 20 61 20 6e 75 6c 6c 20  contains a null 
9ce0: 73 74 72 69 6e 67 2c 20 6f 72 20 74 68 65 0a 20  string, or the. 
9cf0: 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 4e 55 4c   ** value of NUL
9d00: 4c 49 4e 44 49 43 41 54 4f 52 2c 20 61 20 4e 55  LINDICATOR, a NU
9d10: 4c 4c 20 69 73 20 69 6e 73 65 72 74 65 64 20 66  LL is inserted f
9d20: 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 20  or the column.. 
9d30: 20 2a 2a 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67   ** conflict-alg
9d40: 6f 72 69 74 68 6d 20 69 73 20 6f 6e 65 20 6f 66  orithm is one of
9d50: 20 74 68 65 20 73 71 6c 69 74 65 20 63 6f 6e 66   the sqlite conf
9d60: 6c 69 63 74 20 61 6c 67 6f 72 69 74 68 6d 73 3a  lict algorithms:
9d70: 0a 20 20 2a 2a 20 20 20 20 72 6f 6c 6c 62 61 63  .  **    rollbac
9d80: 6b 2c 20 61 62 6f 72 74 2c 20 66 61 69 6c 2c 20  k, abort, fail, 
9d90: 69 67 6e 6f 72 65 2c 20 72 65 70 6c 61 63 65 0a  ignore, replace.
9da0: 20 20 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c    ** On success,
9db0: 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   return the numb
9dc0: 65 72 20 6f 66 20 6c 69 6e 65 73 20 70 72 6f 63  er of lines proc
9dd0: 65 73 73 65 64 2c 20 6e 6f 74 20 6e 65 63 65 73  essed, not neces
9de0: 73 61 72 69 6c 79 20 73 61 6d 65 0a 20 20 2a 2a  sarily same.  **
9df0: 20 61 73 20 27 64 62 20 63 68 61 6e 67 65 73 27   as 'db changes'
9e00: 20 64 75 65 20 74 6f 20 63 6f 6e 66 6c 69 63 74   due to conflict
9e10: 2d 61 6c 67 6f 72 69 74 68 6d 20 73 65 6c 65 63  -algorithm selec
9e20: 74 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ted..  **.  ** T
9e30: 68 69 73 20 63 6f 64 65 20 69 73 20 62 61 73 69  his code is basi
9e40: 63 61 6c 6c 79 20 61 6e 20 69 6d 70 6c 65 6d 65  cally an impleme
9e50: 6e 74 61 74 69 6f 6e 2f 65 6e 68 61 6e 63 65 6d  ntation/enhancem
9e60: 65 6e 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  ent of.  ** the 
9e70: 73 71 6c 69 74 65 33 20 73 68 65 6c 6c 2e 63 20  sqlite3 shell.c 
9e80: 22 2e 69 6d 70 6f 72 74 22 20 63 6f 6d 6d 61 6e  ".import" comman
9e90: 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  d..  **.  ** Thi
9ea0: 73 20 63 6f 6d 6d 61 6e 64 20 75 73 61 67 65 20  s command usage 
9eb0: 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
9ec0: 20 74 68 65 20 73 71 6c 69 74 65 32 2e 78 20 43   the sqlite2.x C
9ed0: 4f 50 59 20 73 74 61 74 65 6d 65 6e 74 2c 0a 20  OPY statement,. 
9ee0: 20 2a 2a 20 77 68 69 63 68 20 69 6d 70 6f 72 74   ** which import
9ef0: 73 20 66 69 6c 65 20 64 61 74 61 20 69 6e 74 6f  s file data into
9f00: 20 61 20 74 61 62 6c 65 20 75 73 69 6e 67 20 74   a table using t
9f10: 68 65 20 50 6f 73 74 67 72 65 53 51 4c 20 43 4f  he PostgreSQL CO
9f20: 50 59 20 66 69 6c 65 20 66 6f 72 6d 61 74 3a 0a  PY file format:.
9f30: 20 20 2a 2a 20 20 20 24 64 62 20 63 6f 70 79 20    **   $db copy 
9f40: 24 63 6f 6e 66 6c 69 74 5f 61 6c 67 6f 20 24 74  $conflit_algo $t
9f50: 61 62 6c 65 5f 6e 61 6d 65 20 24 66 69 6c 65 6e  able_name $filen
9f60: 61 6d 65 20 5c 74 20 5c 5c 4e 0a 20 20 2a 2f 0a  ame \t \\N.  */.
9f70: 20 20 63 61 73 65 20 44 42 5f 43 4f 50 59 3a 20    case DB_COPY: 
9f80: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62  {.    char *zTab
9f90: 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
9fa0: 20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61 74 61    /* Insert data
9fb0: 20 69 6e 74 6f 20 74 68 69 73 20 74 61 62 6c 65   into this table
9fc0: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 46   */.    char *zF
9fd0: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
9fe0: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
9ff0: 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 65 78  from which to ex
a000: 74 72 61 63 74 20 64 61 74 61 20 2a 2f 0a 20 20  tract data */.  
a010: 20 20 63 68 61 72 20 2a 7a 43 6f 6e 66 6c 69 63    char *zConflic
a020: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
a030: 20 54 68 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c   The conflict al
a040: 67 6f 72 69 74 68 6d 20 74 6f 20 75 73 65 20 2a  gorithm to use *
a050: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  /.    sqlite3_st
a060: 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20  mt *pStmt;      
a070: 20 20 2f 2a 20 41 20 73 74 61 74 65 6d 65 6e 74    /* A statement
a080: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c   */.    int nCol
a090: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a0a0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
a0b0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
a0c0: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74  table */.    int
a0d0: 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20   nByte;         
a0e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
a0f0: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61  er of bytes in a
a100: 6e 20 53 51 4c 20 73 74 72 69 6e 67 20 2a 2f 0a  n SQL string */.
a110: 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20      int i, j;   
a120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a130: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
a140: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 70   */.    int nSep
a150: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a160: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
a170: 20 62 79 74 65 73 20 69 6e 20 7a 53 65 70 5b 5d   bytes in zSep[]
a180: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4e 75 6c   */.    int nNul
a190: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
a1a0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
a1b0: 20 62 79 74 65 73 20 69 6e 20 7a 4e 75 6c 6c 5b   bytes in zNull[
a1c0: 5d 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  ] */.    char *z
a1d0: 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sql;            
a1e0: 20 20 20 20 20 2f 2a 20 41 6e 20 53 51 4c 20 73       /* An SQL s
a1f0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
a200: 63 68 61 72 20 2a 7a 4c 69 6e 65 3b 20 20 20 20  char *zLine;    
a210: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
a220: 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f 66 20   single line of 
a230: 69 6e 70 75 74 20 66 72 6f 6d 20 74 68 65 20 66  input from the f
a240: 69 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  ile */.    char 
a250: 2a 2a 61 7a 43 6f 6c 3b 20 20 20 20 20 20 20 20  **azCol;        
a260: 20 20 20 20 20 20 20 2f 2a 20 7a 4c 69 6e 65 5b         /* zLine[
a270: 5d 20 62 72 6f 6b 65 6e 20 75 70 20 69 6e 74 6f  ] broken up into
a280: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20   columns */.    
a290: 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 20 20  char *zCommit;  
a2a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
a2b0: 6f 77 20 74 6f 20 63 6f 6d 6d 69 74 20 63 68 61  ow to commit cha
a2c0: 6e 67 65 73 20 2a 2f 0a 20 20 20 20 46 49 4c 45  nges */.    FILE
a2d0: 20 2a 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20   *in;           
a2e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
a2f0: 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 20  nput file */.   
a300: 20 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20 30 3b   int lineno = 0;
a310: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a320: 4c 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 69  Line number of i
a330: 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 20  nput file */.   
a340: 20 63 68 61 72 20 7a 4c 69 6e 65 4e 75 6d 5b 38   char zLineNum[8
a350: 30 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0];          /* 
a360: 4c 69 6e 65 20 6e 75 6d 62 65 72 20 70 72 69 6e  Line number prin
a370: 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20  t buffer */.    
a380: 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74  Tcl_Obj *pResult
a390: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69  ;           /* i
a3a0: 6e 74 65 72 70 20 72 65 73 75 6c 74 20 2a 2f 0a  nterp result */.
a3b0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 65 70 3b  .    char *zSep;
a3c0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c  .    char *zNull
a3d0: 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3c 35  ;.    if( objc<5
a3e0: 20 7c 7c 20 6f 62 6a 63 3e 37 20 29 7b 0a 20 20   || objc>7 ){.  
a3f0: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
a400: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
a410: 6f 62 6a 76 2c 20 0a 20 20 20 20 20 20 20 20 20  objv, .         
a420: 22 43 4f 4e 46 4c 49 43 54 2d 41 4c 47 4f 52 49  "CONFLICT-ALGORI
a430: 54 48 4d 20 54 41 42 4c 45 20 46 49 4c 45 4e 41  THM TABLE FILENA
a440: 4d 45 20 3f 53 45 50 41 52 41 54 4f 52 3f 20 3f  ME ?SEPARATOR? ?
a450: 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f 22 29  NULLINDICATOR?")
a460: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
a470: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
a480: 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 3d 36 20      if( objc>=6 
a490: 29 7b 0a 20 20 20 20 20 20 7a 53 65 70 20 3d 20  ){.      zSep = 
a4a0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
a4b0: 6d 4f 62 6a 28 6f 62 6a 76 5b 35 5d 2c 20 30 29  mObj(objv[5], 0)
a4c0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
a4d0: 20 20 20 7a 53 65 70 20 3d 20 22 5c 74 22 3b 0a     zSep = "\t";.
a4e0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62      }.    if( ob
a4f0: 6a 63 3e 3d 37 20 29 7b 0a 20 20 20 20 20 20 7a  jc>=7 ){.      z
a500: 4e 75 6c 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74  Null = Tcl_GetSt
a510: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
a520: 5b 36 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  [6], 0);.    }el
a530: 73 65 7b 0a 20 20 20 20 20 20 7a 4e 75 6c 6c 20  se{.      zNull 
a540: 3d 20 22 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = "";.    }.    
a550: 7a 43 6f 6e 66 6c 69 63 74 20 3d 20 54 63 6c 5f  zConflict = Tcl_
a560: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
a570: 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20  (objv[2], 0);.  
a580: 20 20 7a 54 61 62 6c 65 20 3d 20 54 63 6c 5f 47    zTable = Tcl_G
a590: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
a5a0: 6f 62 6a 76 5b 33 5d 2c 20 30 29 3b 0a 20 20 20  objv[3], 0);.   
a5b0: 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74   zFile = Tcl_Get
a5c0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
a5d0: 6a 76 5b 34 5d 2c 20 30 29 3b 0a 20 20 20 20 6e  jv[4], 0);.    n
a5e0: 53 65 70 20 3d 20 73 74 72 6c 65 6e 28 7a 53 65  Sep = strlen(zSe
a5f0: 70 29 3b 0a 20 20 20 20 6e 4e 75 6c 6c 20 3d 20  p);.    nNull = 
a600: 73 74 72 6c 65 6e 28 7a 4e 75 6c 6c 29 3b 0a 20  strlen(zNull);. 
a610: 20 20 20 69 66 28 20 6e 53 65 70 3d 3d 30 20 29     if( nSep==0 )
a620: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
a630: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
a640: 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c  "Error: non-null
a650: 20 73 65 70 61 72 61 74 6f 72 20 72 65 71 75 69   separator requi
a660: 72 65 64 20 66 6f 72 20 63 6f 70 79 22 2c 30 29  red for copy",0)
a670: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
a680: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
a690: 20 20 20 20 69 66 28 73 74 72 63 61 73 65 63 6d      if(strcasecm
a6a0: 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 72 6f  p(zConflict, "ro
a6b0: 6c 6c 62 61 63 6b 22 29 20 21 3d 20 30 20 26 26  llback") != 0 &&
a6c0: 0a 20 20 20 20 20 20 20 73 74 72 63 61 73 65 63  .       strcasec
a6d0: 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 61  mp(zConflict, "a
a6e0: 62 6f 72 74 22 20 20 20 29 20 21 3d 20 30 20 26  bort"   ) != 0 &
a6f0: 26 0a 20 20 20 20 20 20 20 73 74 72 63 61 73 65  &.       strcase
a700: 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22  cmp(zConflict, "
a710: 66 61 69 6c 22 20 20 20 20 29 20 21 3d 20 30 20  fail"    ) != 0 
a720: 26 26 0a 20 20 20 20 20 20 20 73 74 72 63 61 73  &&.       strcas
a730: 65 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20  ecmp(zConflict, 
a740: 22 69 67 6e 6f 72 65 22 20 20 29 20 21 3d 20 30  "ignore"  ) != 0
a750: 20 26 26 0a 20 20 20 20 20 20 20 73 74 72 63 61   &&.       strca
a760: 73 65 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c  secmp(zConflict,
a770: 20 22 72 65 70 6c 61 63 65 22 20 29 20 21 3d 20   "replace" ) != 
a780: 30 20 29 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f  0 ) {.      Tcl_
a790: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
a7a0: 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 5c 22 22  erp, "Error: \""
a7b0: 2c 20 7a 43 6f 6e 66 6c 69 63 74 2c 20 0a 20 20  , zConflict, .  
a7c0: 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 63            "\", c
a7d0: 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68  onflict-algorith
a7e0: 6d 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66  m must be one of
a7f0: 3a 20 72 6f 6c 6c 62 61 63 6b 2c 20 22 0a 20 20  : rollback, ".  
a800: 20 20 20 20 20 20 20 20 20 20 22 61 62 6f 72 74            "abort
a810: 2c 20 66 61 69 6c 2c 20 69 67 6e 6f 72 65 2c 20  , fail, ignore, 
a820: 6f 72 20 72 65 70 6c 61 63 65 22 2c 20 30 29 3b  or replace", 0);
a830: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
a840: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
a850: 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
a860: 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43  3_mprintf("SELEC
a870: 54 20 2a 20 46 52 4f 4d 20 27 25 71 27 22 2c 20  T * FROM '%q'", 
a880: 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 69 66 28  zTable);.    if(
a890: 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   zSql==0 ){.    
a8a0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
a8b0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f  lt(interp, "Erro
a8c0: 72 3a 20 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  r: no such table
a8d0: 3a 20 22 2c 20 7a 54 61 62 6c 65 2c 20 30 29 3b  : ", zTable, 0);
a8e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
a8f0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
a900: 20 20 20 6e 42 79 74 65 20 3d 20 73 74 72 6c 65     nByte = strle
a910: 6e 28 7a 53 71 6c 29 3b 0a 20 20 20 20 72 63 20  n(zSql);.    rc 
a920: 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
a930: 65 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c  e(pDb->db, zSql,
a940: 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
a950: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
a960: 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28  e(zSql);.    if(
a970: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c   rc ){.      Tcl
a980: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
a990: 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 22 2c  terp, "Error: ",
a9a0: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
a9b0: 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20  pDb->db), 0);.  
a9c0: 20 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20      nCol = 0;.  
a9d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
a9e0: 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Col = sqlite3_co
a9f0: 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74  lumn_count(pStmt
aa00: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
aa10: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
aa20: 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 6e 43  tmt);.    if( nC
aa30: 6f 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20 20  ol==0 ) {.      
aa40: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
aa50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c  ;.    }.    zSql
aa60: 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65   = malloc( nByte
aa70: 20 2b 20 35 30 20 2b 20 6e 43 6f 6c 2a 32 20 29   + 50 + nCol*2 )
aa80: 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d  ;.    if( zSql==
aa90: 30 20 29 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f  0 ) {.      Tcl_
aaa0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
aab0: 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e  erp, "Error: can
aac0: 27 74 20 6d 61 6c 6c 6f 63 28 29 22 2c 20 30 29  't malloc()", 0)
aad0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
aae0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
aaf0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
ab00: 69 6e 74 66 28 6e 42 79 74 65 2b 35 30 2c 20 7a  intf(nByte+50, z
ab10: 53 71 6c 2c 20 22 49 4e 53 45 52 54 20 4f 52 20  Sql, "INSERT OR 
ab20: 25 71 20 49 4e 54 4f 20 27 25 71 27 20 56 41 4c  %q INTO '%q' VAL
ab30: 55 45 53 28 3f 22 2c 0a 20 20 20 20 20 20 20 20  UES(?",.        
ab40: 20 7a 43 6f 6e 66 6c 69 63 74 2c 20 7a 54 61 62   zConflict, zTab
ab50: 6c 65 29 3b 0a 20 20 20 20 6a 20 3d 20 73 74 72  le);.    j = str
ab60: 6c 65 6e 28 7a 53 71 6c 29 3b 0a 20 20 20 20 66  len(zSql);.    f
ab70: 6f 72 28 69 3d 31 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=1; i<nCol; 
ab80: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c  i++){.      zSql
ab90: 5b 6a 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20  [j++] = ',';.   
aba0: 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27     zSql[j++] = '
abb0: 3f 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53  ?';.    }.    zS
abc0: 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20  ql[j++] = ')';. 
abd0: 20 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20 30 3b 0a     zSql[j] = 0;.
abe0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
abf0: 5f 70 72 65 70 61 72 65 28 70 44 62 2d 3e 64 62  _prepare(pDb->db
ac00: 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
ac10: 6d 74 2c 20 30 29 3b 0a 20 20 20 20 66 72 65 65  mt, 0);.    free
ac20: 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20  (zSql);.    if( 
ac30: 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  rc ){.      Tcl_
ac40: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
ac50: 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 22 2c 20  erp, "Error: ", 
ac60: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
ac70: 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20  Db->db), 0);.   
ac80: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
ac90: 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
aca0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
acb0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e  OR;.    }.    in
acc0: 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 20   = fopen(zFile, 
acd0: 22 72 62 22 29 3b 0a 20 20 20 20 69 66 28 20 69  "rb");.    if( i
ace0: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63  n==0 ){.      Tc
acf0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
ad00: 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 63  nterp, "Error: c
ad10: 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65 3a  annot open file:
ad20: 20 22 2c 20 7a 46 69 6c 65 2c 20 4e 55 4c 4c 29   ", zFile, NULL)
ad30: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
ad40: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
ad50: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
ad60: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
ad70: 20 20 20 61 7a 43 6f 6c 20 3d 20 6d 61 6c 6c 6f     azCol = mallo
ad80: 63 28 20 73 69 7a 65 6f 66 28 61 7a 43 6f 6c 5b  c( sizeof(azCol[
ad90: 30 5d 29 2a 28 6e 43 6f 6c 2b 31 29 20 29 3b 0a  0])*(nCol+1) );.
ada0: 20 20 20 20 69 66 28 20 61 7a 43 6f 6c 3d 3d 30      if( azCol==0
adb0: 20 29 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41   ) {.      Tcl_A
adc0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
add0: 72 70 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 27  rp, "Error: can'
ade0: 74 20 6d 61 6c 6c 6f 63 28 29 22 2c 20 30 29 3b  t malloc()", 0);
adf0: 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28 69 6e  .      fclose(in
ae00: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
ae10: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
ae20: 0a 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74  .    (void)sqlit
ae30: 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c  e3_exec(pDb->db,
ae40: 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 2c 20   "BEGIN", 0, 0, 
ae50: 30 29 3b 0a 20 20 20 20 7a 43 6f 6d 6d 69 74 20  0);.    zCommit 
ae60: 3d 20 22 43 4f 4d 4d 49 54 22 3b 0a 20 20 20 20  = "COMMIT";.    
ae70: 77 68 69 6c 65 28 20 28 7a 4c 69 6e 65 20 3d 20  while( (zLine = 
ae80: 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 30 2c  local_getline(0,
ae90: 20 69 6e 29 29 21 3d 30 20 29 7b 0a 20 20 20 20   in))!=0 ){.    
aea0: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20    char *z;.     
aeb0: 20 69 20 3d 20 30 3b 0a 20 20 20 20 20 20 6c 69   i = 0;.      li
aec0: 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 61 7a  neno++;.      az
aed0: 43 6f 6c 5b 30 5d 20 3d 20 7a 4c 69 6e 65 3b 0a  Col[0] = zLine;.
aee0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 7a        for(i=0, z
aef0: 3d 7a 4c 69 6e 65 3b 20 2a 7a 3b 20 7a 2b 2b 29  =zLine; *z; z++)
af00: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 7a  {.        if( *z
af10: 3d 3d 7a 53 65 70 5b 30 5d 20 26 26 20 73 74 72  ==zSep[0] && str
af20: 6e 63 6d 70 28 7a 2c 20 7a 53 65 70 2c 20 6e 53  ncmp(z, zSep, nS
af30: 65 70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ep)==0 ){.      
af40: 20 20 20 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20      *z = 0;.    
af50: 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
af60: 20 20 20 20 20 69 66 28 20 69 3c 6e 43 6f 6c 20       if( i<nCol 
af70: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
af80: 7a 43 6f 6c 5b 69 5d 20 3d 20 26 7a 5b 6e 53 65  zCol[i] = &z[nSe
af90: 70 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  p];.            
afa0: 7a 20 2b 3d 20 6e 53 65 70 2d 31 3b 0a 20 20 20  z += nSep-1;.   
afb0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
afc0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
afd0: 20 69 66 28 20 69 2b 31 21 3d 6e 43 6f 6c 20 29   if( i+1!=nCol )
afe0: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
aff0: 7a 45 72 72 3b 0a 20 20 20 20 20 20 20 20 69 6e  zErr;.        in
b000: 74 20 6e 45 72 72 20 3d 20 73 74 72 6c 65 6e 28  t nErr = strlen(
b010: 7a 46 69 6c 65 29 20 2b 20 32 30 30 3b 0a 20 20  zFile) + 200;.  
b020: 20 20 20 20 20 20 7a 45 72 72 20 3d 20 6d 61 6c        zErr = mal
b030: 6c 6f 63 28 6e 45 72 72 29 3b 0a 20 20 20 20 20  loc(nErr);.     
b040: 20 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20     if( zErr ){. 
b050: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
b060: 5f 73 6e 70 72 69 6e 74 66 28 6e 45 72 72 2c 20  _snprintf(nErr, 
b070: 7a 45 72 72 2c 0a 20 20 20 20 20 20 20 20 20 20  zErr,.          
b080: 20 20 20 22 45 72 72 6f 72 3a 20 25 73 20 6c 69     "Error: %s li
b090: 6e 65 20 25 64 3a 20 65 78 70 65 63 74 65 64 20  ne %d: expected 
b0a0: 25 64 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61  %d columns of da
b0b0: 74 61 20 62 75 74 20 66 6f 75 6e 64 20 25 64 22  ta but found %d"
b0c0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  ,.             z
b0d0: 46 69 6c 65 2c 20 6c 69 6e 65 6e 6f 2c 20 6e 43  File, lineno, nC
b0e0: 6f 6c 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20  ol, i+1);.      
b0f0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
b100: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45 72  sult(interp, zEr
b110: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  r, 0);.         
b120: 20 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 20   free(zErr);.   
b130: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
b140: 43 6f 6d 6d 69 74 20 3d 20 22 52 4f 4c 4c 42 41  Commit = "ROLLBA
b150: 43 4b 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65  CK";.        bre
b160: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
b170: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
b180: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
b190: 20 2f 2a 20 63 68 65 63 6b 20 66 6f 72 20 6e 75   /* check for nu
b1a0: 6c 6c 20 64 61 74 61 2c 20 69 66 20 73 6f 2c 20  ll data, if so, 
b1b0: 62 69 6e 64 20 61 73 20 6e 75 6c 6c 20 2a 2f 0a  bind as null */.
b1c0: 20 20 20 20 20 20 20 20 69 66 20 28 28 6e 4e 75          if ((nNu
b1d0: 6c 6c 3e 30 20 26 26 20 73 74 72 63 6d 70 28 61  ll>0 && strcmp(a
b1e0: 7a 43 6f 6c 5b 69 5d 2c 20 7a 4e 75 6c 6c 29 3d  zCol[i], zNull)=
b1f0: 3d 30 29 20 7c 7c 20 73 74 72 6c 65 6e 28 61 7a  =0) || strlen(az
b200: 43 6f 6c 5b 69 5d 29 3d 3d 30 29 20 7b 0a 20 20  Col[i])==0) {.  
b210: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
b220: 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c  bind_null(pStmt,
b230: 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 7d   i+1);.        }
b240: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
b250: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
b260: 74 28 70 53 74 6d 74 2c 20 69 2b 31 2c 20 61 7a  t(pStmt, i+1, az
b270: 43 6f 6c 5b 69 5d 2c 20 2d 31 2c 20 53 51 4c 49  Col[i], -1, SQLI
b280: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
b290: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
b2a0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70      sqlite3_step
b2b0: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72  (pStmt);.      r
b2c0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
b2d0: 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  t(pStmt);.      
b2e0: 66 72 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20  free(zLine);.   
b2f0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
b300: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
b310: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
b320: 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 3a 20  (interp,"Error: 
b330: 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
b340: 67 28 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a  g(pDb->db), 0);.
b350: 20 20 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20          zCommit 
b360: 3d 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20  = "ROLLBACK";.  
b370: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b380: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66     }.    }.    f
b390: 72 65 65 28 61 7a 43 6f 6c 29 3b 0a 20 20 20 20  ree(azCol);.    
b3a0: 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20  fclose(in);.    
b3b0: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
b3c0: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 28 76 6f  (pStmt);.    (vo
b3d0: 69 64 29 73 71 6c 69 74 65 33 5f 65 78 65 63 28  id)sqlite3_exec(
b3e0: 70 44 62 2d 3e 64 62 2c 20 7a 43 6f 6d 6d 69 74  pDb->db, zCommit
b3f0: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20  , 0, 0, 0);..   
b400: 20 69 66 28 20 7a 43 6f 6d 6d 69 74 5b 30 5d 20   if( zCommit[0] 
b410: 3d 3d 20 27 43 27 20 29 7b 0a 20 20 20 20 20 20  == 'C' ){.      
b420: 2f 2a 20 73 75 63 63 65 73 73 2c 20 73 65 74 20  /* success, set 
b430: 72 65 73 75 6c 74 20 61 73 20 6e 75 6d 62 65 72  result as number
b440: 20 6f 66 20 6c 69 6e 65 73 20 70 72 6f 63 65 73   of lines proces
b450: 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 70 52 65  sed */.      pRe
b460: 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62  sult = Tcl_GetOb
b470: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  jResult(interp);
b480: 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 49 6e  .      Tcl_SetIn
b490: 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 6c 69  tObj(pResult, li
b4a0: 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63 20  neno);.      rc 
b4b0: 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 65  = TCL_OK;.    }e
b4c0: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 66 61  lse{.      /* fa
b4d0: 69 6c 75 72 65 2c 20 61 70 70 65 6e 64 20 6c 69  ilure, append li
b4e0: 6e 65 6e 6f 20 77 68 65 72 65 20 66 61 69 6c 65  neno where faile
b4f0: 64 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  d */.      sqlit
b500: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
b510: 6f 66 28 7a 4c 69 6e 65 4e 75 6d 29 2c 20 7a 4c  of(zLineNum), zL
b520: 69 6e 65 4e 75 6d 2c 22 25 64 22 2c 6c 69 6e 65  ineNum,"%d",line
b530: 6e 6f 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 41  no);.      Tcl_A
b540: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
b550: 72 70 2c 22 2c 20 66 61 69 6c 65 64 20 77 68 69  rp,", failed whi
b560: 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 69  le processing li
b570: 6e 65 3a 20 22 2c 7a 4c 69 6e 65 4e 75 6d 2c 30  ne: ",zLineNum,0
b580: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43  );.      rc = TC
b590: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
b5a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
b5b0: 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20   /*.  **    $db 
b5c0: 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65  enable_load_exte
b5d0: 6e 73 69 6f 6e 20 42 4f 4f 4c 45 41 4e 0a 20 20  nsion BOOLEAN.  
b5e0: 2a 2a 0a 20 20 2a 2a 20 54 75 72 6e 20 74 68 65  **.  ** Turn the
b5f0: 20 65 78 74 65 6e 73 69 6f 6e 20 6c 6f 61 64 69   extension loadi
b600: 6e 67 20 66 65 61 74 75 72 65 20 6f 6e 20 6f 72  ng feature on or
b610: 20 6f 66 66 2e 20 20 49 74 20 69 66 20 6f 66 66   off.  It if off
b620: 20 62 79 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74   by.  ** default
b630: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
b640: 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54  _ENABLE_LOAD_EXT
b650: 45 4e 53 49 4f 4e 3a 20 7b 0a 23 69 66 6e 64 65  ENSION: {.#ifnde
b660: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
b670: 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20  AD_EXTENSION.   
b680: 20 69 6e 74 20 6f 6e 6f 66 66 3b 0a 20 20 20 20   int onoff;.    
b690: 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
b6a0: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
b6b0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
b6c0: 20 6f 62 6a 76 2c 20 22 42 4f 4f 4c 45 41 4e 22   objv, "BOOLEAN"
b6d0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
b6e0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
b6f0: 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74  .    if( Tcl_Get
b700: 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
b710: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
b720: 26 6f 6e 6f 66 66 29 20 29 7b 0a 20 20 20 20 20  &onoff) ){.     
b730: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
b740: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  R;.    }.    sql
b750: 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64  ite3_enable_load
b760: 5f 65 78 74 65 6e 73 69 6f 6e 28 70 44 62 2d 3e  _extension(pDb->
b770: 64 62 2c 20 6f 6e 6f 66 66 29 3b 0a 20 20 20 20  db, onoff);.    
b780: 62 72 65 61 6b 3b 0a 23 65 6c 73 65 0a 20 20 20  break;.#else.   
b790: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
b7a0: 74 28 69 6e 74 65 72 70 2c 20 22 65 78 74 65 6e  t(interp, "exten
b7b0: 73 69 6f 6e 20 6c 6f 61 64 69 6e 67 20 69 73 20  sion loading is 
b7c0: 74 75 72 6e 65 64 20 6f 66 66 20 61 74 20 63 6f  turned off at co
b7d0: 6d 70 69 6c 65 2d 74 69 6d 65 22 2c 0a 20 20 20  mpile-time",.   
b7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7f0: 20 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e    0);.    return
b800: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6e 64   TCL_ERROR;.#end
b810: 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  if.  }..  /*.  *
b820: 2a 20 20 20 20 24 64 62 20 65 72 72 6f 72 63 6f  *    $db errorco
b830: 64 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74  de.  **.  ** Ret
b840: 75 72 6e 20 74 68 65 20 6e 75 6d 65 72 69 63 20  urn the numeric 
b850: 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74 20  error code that 
b860: 77 61 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  was returned by 
b870: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a  the most recent.
b880: 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c    ** call to sql
b890: 69 74 65 33 5f 65 78 65 63 28 29 2e 0a 20 20 2a  ite3_exec()..  *
b8a0: 2f 0a 20 20 63 61 73 65 20 44 42 5f 45 52 52 4f  /.  case DB_ERRO
b8b0: 52 43 4f 44 45 3a 20 7b 0a 20 20 20 20 54 63 6c  RCODE: {.    Tcl
b8c0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
b8d0: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
b8e0: 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 63  Obj(sqlite3_errc
b8f0: 6f 64 65 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a  ode(pDb->db)));.
b900: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
b910: 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20    .  /*.  **    
b920: 24 64 62 20 65 76 61 6c 20 24 73 71 6c 20 3f 61  $db eval $sql ?a
b930: 72 72 61 79 3f 20 3f 7b 20 20 2e 2e 2e 63 6f 64  rray? ?{  ...cod
b940: 65 2e 2e 2e 20 7d 3f 0a 20 20 2a 2a 20 20 20 20  e... }?.  **    
b950: 24 64 62 20 6f 6e 65 63 6f 6c 75 6d 6e 20 24 73  $db onecolumn $s
b960: 71 6c 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  ql.  **.  ** The
b970: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69   SQL statement i
b980: 6e 20 24 73 71 6c 20 69 73 20 65 76 61 6c 75 61  n $sql is evalua
b990: 74 65 64 2e 20 20 46 6f 72 20 65 61 63 68 20 72  ted.  For each r
b9a0: 6f 77 2c 20 74 68 65 20 76 61 6c 75 65 73 20 61  ow, the values a
b9b0: 72 65 0a 20 20 2a 2a 20 70 6c 61 63 65 64 20 69  re.  ** placed i
b9c0: 6e 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  n elements of th
b9d0: 65 20 61 72 72 61 79 20 6e 61 6d 65 64 20 22 61  e array named "a
b9e0: 72 72 61 79 22 20 61 6e 64 20 2e 2e 2e 63 6f 64  rray" and ...cod
b9f0: 65 2e 2e 2e 20 69 73 20 65 78 65 63 75 74 65 64  e... is executed
ba00: 2e 0a 20 20 2a 2a 20 49 66 20 22 61 72 72 61 79  ..  ** If "array
ba10: 22 20 61 6e 64 20 22 63 6f 64 65 22 20 61 72 65  " and "code" are
ba20: 20 6f 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 6e   omitted, then n
ba30: 6f 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 65 76  o callback is ev
ba40: 65 72 79 20 69 6e 76 6f 6b 65 64 2e 0a 20 20 2a  ery invoked..  *
ba50: 2a 20 49 66 20 22 61 72 72 61 79 22 20 69 73 20  * If "array" is 
ba60: 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c  an empty string,
ba70: 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 73   then the values
ba80: 20 61 72 65 20 70 6c 61 63 65 64 20 69 6e 20 76   are placed in v
ba90: 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 74 68  ariables.  ** th
baa0: 61 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  at have the same
bab0: 20 6e 61 6d 65 20 61 73 20 74 68 65 20 66 69 65   name as the fie
bac0: 6c 64 73 20 65 78 74 72 61 63 74 65 64 20 62 79  lds extracted by
bad0: 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2a   the query..  **
bae0: 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65 63 6f 6c  .  ** The onecol
baf0: 75 6d 6e 20 6d 65 74 68 6f 64 20 69 73 20 74 68  umn method is th
bb00: 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 3a  e equivalent of:
bb10: 0a 20 20 2a 2a 20 20 20 20 20 6c 69 6e 64 65 78  .  **     lindex
bb20: 20 5b 24 64 62 20 65 76 61 6c 20 24 73 71 6c 5d   [$db eval $sql]
bb30: 20 30 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44   0.  */.  case D
bb40: 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 3a 0a 20 20 63  B_ONECOLUMN:.  c
bb50: 61 73 65 20 44 42 5f 45 56 41 4c 3a 0a 20 20 63  ase DB_EVAL:.  c
bb60: 61 73 65 20 44 42 5f 45 58 49 53 54 53 3a 20 7b  ase DB_EXISTS: {
bb70: 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20  .    char const 
bb80: 2a 7a 53 71 6c 3b 20 20 20 20 20 20 2f 2a 20 4e  *zSql;      /* N
bb90: 65 78 74 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ext SQL statemen
bba0: 74 20 74 6f 20 65 78 65 63 75 74 65 20 2a 2f 0a  t to execute */.
bbb0: 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a      char const *
bbc0: 7a 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 57 68  zLeft;     /* Wh
bbd0: 61 74 20 69 73 20 6c 65 66 74 20 61 66 74 65 72  at is left after
bbe0: 20 66 69 72 73 74 20 73 74 6d 74 20 69 6e 20 7a   first stmt in z
bbf0: 53 71 6c 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  Sql */.    sqlit
bc00: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20  e3_stmt *pStmt; 
bc10: 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 64 20 53 51    /* Compiled SQ
bc20: 4c 20 73 74 61 74 6d 65 6e 74 20 2a 2f 0a 20 20  L statment */.  
bc30: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 72 61    Tcl_Obj *pArra
bc40: 79 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  y;       /* Name
bc50: 20 6f 66 20 61 72 72 61 79 20 69 6e 74 6f 20 77   of array into w
bc60: 68 69 63 68 20 72 65 73 75 6c 74 73 20 61 72 65  hich results are
bc70: 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20   written */.    
bc80: 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74  Tcl_Obj *pScript
bc90: 3b 20 20 20 20 20 20 2f 2a 20 53 63 72 69 70 74  ;      /* Script
bca0: 20 74 6f 20 72 75 6e 20 66 6f 72 20 65 61 63 68   to run for each
bcb0: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
bcc0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 50     Tcl_Obj **apP
bcd0: 61 72 6d 3b 20 20 20 20 20 20 2f 2a 20 50 61 72  arm;      /* Par
bce0: 61 6d 65 74 65 72 73 20 74 68 61 74 20 6e 65 65  ameters that nee
bcf0: 64 20 61 20 54 63 6c 5f 44 65 63 72 52 65 66 43  d a Tcl_DecrRefC
bd00: 6f 75 6e 74 28 29 20 2a 2f 0a 20 20 20 20 69 6e  ount() */.    in
bd10: 74 20 6e 50 61 72 6d 3b 20 20 20 20 20 20 20 20  t nParm;        
bd20: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
bd30: 66 20 65 6e 74 72 69 65 73 20 75 73 65 64 20 69  f entries used i
bd40: 6e 20 61 70 50 61 72 6d 5b 5d 20 2a 2f 0a 20 20  n apParm[] */.  
bd50: 20 20 54 63 6c 5f 4f 62 6a 20 2a 61 50 61 72 6d    Tcl_Obj *aParm
bd60: 5b 31 30 5d 3b 20 20 20 20 2f 2a 20 53 74 61 74  [10];    /* Stat
bd70: 69 63 20 73 70 61 63 65 20 66 6f 72 20 61 70 50  ic space for apP
bd80: 61 72 6d 5b 5d 20 69 6e 20 74 68 65 20 63 6f 6d  arm[] in the com
bd90: 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20  mon case */.    
bda0: 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 20 20  Tcl_Obj *pRet;  
bdb0: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
bdc0: 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 2a  to be returned *
bdd0: 2f 0a 20 20 20 20 53 71 6c 50 72 65 70 61 72 65  /.    SqlPrepare
bde0: 64 53 74 6d 74 20 2a 70 50 72 65 53 74 6d 74 3b  dStmt *pPreStmt;
bdf0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
be00: 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
be10: 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ment */.    int 
be20: 72 63 32 3b 0a 0a 20 20 20 20 69 66 28 20 63 68  rc2;..    if( ch
be30: 6f 69 63 65 3d 3d 44 42 5f 45 56 41 4c 20 29 7b  oice==DB_EVAL ){
be40: 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 3c  .      if( objc<
be50: 33 20 7c 7c 20 6f 62 6a 63 3e 35 20 29 7b 0a 20  3 || objc>5 ){. 
be60: 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67         Tcl_Wrong
be70: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
be80: 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 20 3f 41  2, objv, "SQL ?A
be90: 52 52 41 59 2d 4e 41 4d 45 3f 20 3f 53 43 52 49  RRAY-NAME? ?SCRI
bea0: 50 54 3f 22 29 3b 0a 20 20 20 20 20 20 20 20 72  PT?");.        r
beb0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
bec0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
bed0: 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a  Ret = Tcl_NewObj
bee0: 28 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e  ();.      Tcl_In
bef0: 63 72 52 65 66 43 6f 75 6e 74 28 70 52 65 74 29  crRefCount(pRet)
bf00: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
bf10: 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29     if( objc!=3 )
bf20: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72  {.        Tcl_Wr
bf30: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
bf40: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c  p, 2, objv, "SQL
bf50: 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ");.        retu
bf60: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
bf70: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
bf80: 63 68 6f 69 63 65 3d 3d 44 42 5f 45 58 49 53 54  choice==DB_EXIST
bf90: 53 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52 65  S ){.        pRe
bfa0: 74 20 3d 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65  t = Tcl_NewBoole
bfb0: 61 6e 4f 62 6a 28 30 29 3b 0a 20 20 20 20 20 20  anObj(0);.      
bfc0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
bfd0: 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20  nt(pRet);.      
bfe0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
bff0: 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  Ret = 0;.      }
c000: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f  .    }.    if( o
c010: 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc==3 ){.      
c020: 70 41 72 72 61 79 20 3d 20 70 53 63 72 69 70 74  pArray = pScript
c030: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
c040: 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20  if( objc==4 ){. 
c050: 20 20 20 20 20 70 41 72 72 61 79 20 3d 20 30 3b       pArray = 0;
c060: 0a 20 20 20 20 20 20 70 53 63 72 69 70 74 20 3d  .      pScript =
c070: 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20 7d 65   objv[3];.    }e
c080: 6c 73 65 7b 0a 20 20 20 20 20 20 70 41 72 72 61  lse{.      pArra
c090: 79 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20  y = objv[3];.   
c0a0: 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 53 74     if( Tcl_GetSt
c0b0: 72 69 6e 67 28 70 41 72 72 61 79 29 5b 30 5d 3d  ring(pArray)[0]=
c0c0: 3d 30 20 29 20 70 41 72 72 61 79 20 3d 20 30 3b  =0 ) pArray = 0;
c0d0: 0a 20 20 20 20 20 20 70 53 63 72 69 70 74 20 3d  .      pScript =
c0e0: 20 6f 62 6a 76 5b 34 5d 3b 0a 20 20 20 20 7d 0a   objv[4];.    }.
c0f0: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
c100: 43 6f 75 6e 74 28 6f 62 6a 76 5b 32 5d 29 3b 0a  Count(objv[2]);.
c110: 20 20 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f 47      zSql = Tcl_G
c120: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
c130: 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20  objv[2], 0);.   
c140: 20 77 68 69 6c 65 28 20 72 63 3d 3d 54 43 4c 5f   while( rc==TCL_
c150: 4f 4b 20 26 26 20 7a 53 71 6c 5b 30 5d 20 29 7b  OK && zSql[0] ){
c160: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20  .      int i;   
c170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c180: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
c190: 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  r */.      int n
c1a0: 56 61 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Var;            
c1b0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
c1c0: 6f 66 20 62 69 6e 64 20 70 61 72 61 6d 65 74 65  of bind paramete
c1d0: 72 73 20 69 6e 20 74 68 65 20 70 53 74 6d 74 20  rs in the pStmt 
c1e0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  */.      int nCo
c1f0: 6c 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20  l = -1;         
c200: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
c210: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
c220: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
c230: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70      Tcl_Obj **ap
c240: 43 6f 6c 4e 61 6d 65 20 3d 20 30 3b 20 20 20 2f  ColName = 0;   /
c250: 2a 20 41 72 72 61 79 20 6f 66 20 63 6f 6c 75 6d  * Array of colum
c260: 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 20 20 20  n names */.     
c270: 20 69 6e 74 20 6c 65 6e 3b 20 20 20 20 20 20 20   int len;       
c280: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
c290: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 6f 66 20  tring length of 
c2a0: 7a 53 71 6c 20 2a 2f 0a 20 20 0a 20 20 20 20 20  zSql */.  .     
c2b0: 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20   /* Try to find 
c2c0: 61 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  a SQL statement 
c2d0: 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64 79  that has already
c2e0: 20 62 65 65 6e 20 63 6f 6d 70 69 6c 65 64 20 61   been compiled a
c2f0: 6e 64 0a 20 20 20 20 20 20 2a 2a 20 77 68 69 63  nd.      ** whic
c300: 68 20 6d 61 74 63 68 65 73 20 74 68 65 20 6e 65  h matches the ne
c310: 78 74 20 73 65 71 75 65 6e 63 65 20 6f 66 20 53  xt sequence of S
c320: 51 4c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  QL..      */.   
c330: 20 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20     pStmt = 0;.  
c340: 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e      len = strlen
c350: 28 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 66 6f  (zSql);.      fo
c360: 72 28 70 50 72 65 53 74 6d 74 20 3d 20 70 44 62  r(pPreStmt = pDb
c370: 2d 3e 73 74 6d 74 4c 69 73 74 3b 20 70 50 72 65  ->stmtList; pPre
c380: 53 74 6d 74 3b 20 70 50 72 65 53 74 6d 74 3d 70  Stmt; pPreStmt=p
c390: 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 29 7b  PreStmt->pNext){
c3a0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  .        int n =
c3b0: 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 3b   pPreStmt->nSql;
c3c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e  .        if( len
c3d0: 3e 3d 6e 20 0a 20 20 20 20 20 20 20 20 20 20 20  >=n .           
c3e0: 20 26 26 20 6d 65 6d 63 6d 70 28 70 50 72 65 53   && memcmp(pPreS
c3f0: 74 6d 74 2d 3e 7a 53 71 6c 2c 20 7a 53 71 6c 2c  tmt->zSql, zSql,
c400: 20 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20   n)==0.         
c410: 20 20 20 26 26 20 28 7a 53 71 6c 5b 6e 5d 3d 3d     && (zSql[n]==
c420: 30 20 7c 7c 20 7a 53 71 6c 5b 6e 2d 31 5d 3d 3d  0 || zSql[n-1]==
c430: 27 3b 27 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  ';').        ){.
c440: 20 20 20 20 20 20 20 20 20 20 70 53 74 6d 74 20            pStmt 
c450: 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d  = pPreStmt->pStm
c460: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4c 65  t;.          zLe
c470: 66 74 20 3d 20 26 7a 53 71 6c 5b 70 50 72 65 53  ft = &zSql[pPreS
c480: 74 6d 74 2d 3e 6e 53 71 6c 5d 3b 0a 0a 20 20 20  tmt->nSql];..   
c490: 20 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 61         /* When a
c4a0: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
c4b0: 65 6e 74 20 69 73 20 66 6f 75 6e 64 2c 20 75 6e  ent is found, un
c4c0: 6c 69 6e 6b 20 69 74 20 66 72 6f 6d 20 74 68 65  link it from the
c4d0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61  .          ** ca
c4e0: 63 68 65 20 6c 69 73 74 2e 20 20 49 74 20 77 69  che list.  It wi
c4f0: 6c 6c 20 6c 61 74 65 72 20 62 65 20 61 64 64 65  ll later be adde
c500: 64 20 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65  d back to the be
c510: 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 20 20  ginning.        
c520: 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 61 63 68    ** of the cach
c530: 65 20 6c 69 73 74 20 69 6e 20 6f 72 64 65 72 20  e list in order 
c540: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 4c 52 55  to implement LRU
c550: 20 72 65 70 6c 61 63 65 6d 65 6e 74 2e 0a 20 20   replacement..  
c560: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
c570: 20 20 20 20 20 69 66 28 20 70 50 72 65 53 74 6d       if( pPreStm
c580: 74 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20  t->pPrev ){.    
c590: 20 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74          pPreStmt
c5a0: 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d  ->pPrev->pNext =
c5b0: 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74   pPreStmt->pNext
c5c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
c5d0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e{.            p
c5e0: 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20 70  Db->stmtList = p
c5f0: 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 3b 0a  PreStmt->pNext;.
c600: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
c610: 20 20 20 20 20 20 69 66 28 20 70 50 72 65 53 74        if( pPreSt
c620: 6d 74 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20  mt->pNext ){.   
c630: 20 20 20 20 20 20 20 20 20 70 50 72 65 53 74 6d           pPreStm
c640: 74 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  t->pNext->pPrev 
c650: 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65  = pPreStmt->pPre
c660: 76 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  v;.          }el
c670: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
c680: 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20  pDb->stmtLast = 
c690: 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 3b  pPreStmt->pPrev;
c6a0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
c6b0: 20 20 20 20 20 20 20 70 44 62 2d 3e 6e 53 74 6d         pDb->nStm
c6c0: 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 62  t--;.          b
c6d0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
c6e0: 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
c6f0: 20 2f 2a 20 49 66 20 6e 6f 20 70 72 65 70 61 72   /* If no prepar
c700: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73  ed statement was
c710: 20 66 6f 75 6e 64 2e 20 20 43 6f 6d 70 69 6c 65   found.  Compile
c720: 20 74 68 65 20 53 51 4c 20 74 65 78 74 0a 20 20   the SQL text.  
c730: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
c740: 20 70 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20   pStmt==0 ){.   
c750: 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
c760: 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 70 72 65 70  OK!=sqlite3_prep
c770: 61 72 65 5f 76 32 28 70 44 62 2d 3e 64 62 2c 20  are_v2(pDb->db, 
c780: 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74  zSql, -1, &pStmt
c790: 2c 20 26 7a 4c 65 66 74 29 20 29 7b 0a 20 20 20  , &zLeft) ){.   
c7a0: 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62         Tcl_SetOb
c7b0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
c7c0: 64 62 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69  dbTextToObj(sqli
c7d0: 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
c7e0: 64 62 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20  db)));.         
c7f0: 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b   rc = TCL_ERROR;
c800: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
c810: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
c820: 20 20 20 20 69 66 28 20 70 53 74 6d 74 3d 3d 30      if( pStmt==0
c830: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
c840: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
c850: 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70 44 62  ite3_errcode(pDb
c860: 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20 20 20 20  ->db) ){.       
c870: 20 20 20 20 20 2f 2a 20 41 20 63 6f 6d 70 69 6c       /* A compil
c880: 65 2d 74 69 6d 65 20 65 72 72 6f 72 20 69 6e 20  e-time error in 
c890: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  the statement.  
c8a0: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
c8b0: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74           Tcl_Set
c8c0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
c8d0: 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 73 71  , dbTextToObj(sq
c8e0: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
c8f0: 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20 20 20 20  ->db)));.       
c900: 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52       rc = TCL_ER
c910: 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ROR;.           
c920: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
c930: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
c940: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 74 61 74       /* The stat
c950: 65 6d 65 6e 74 20 77 61 73 20 61 20 6e 6f 2d 6f  ement was a no-o
c960: 70 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20  p.  Continue to 
c970: 74 68 65 20 6e 65 78 74 20 73 74 61 74 65 6d 65  the next stateme
c980: 6e 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  nt.            *
c990: 2a 20 69 6e 20 74 68 65 20 53 51 4c 20 73 74 72  * in the SQL str
c9a0: 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ing..           
c9b0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
c9c0: 7a 53 71 6c 20 3d 20 7a 4c 65 66 74 3b 0a 20 20  zSql = zLeft;.  
c9d0: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
c9e0: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ue;.          }.
c9f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ca00: 20 20 61 73 73 65 72 74 28 20 70 50 72 65 53 74    assert( pPreSt
ca10: 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  mt==0 );.      }
ca20: 0a 0a 20 20 20 20 20 20 2f 2a 20 42 69 6e 64 20  ..      /* Bind 
ca30: 76 61 6c 75 65 73 20 74 6f 20 70 61 72 61 6d 65  values to parame
ca40: 74 65 72 73 20 74 68 61 74 20 62 65 67 69 6e 20  ters that begin 
ca50: 77 69 74 68 20 24 20 6f 72 20 3a 0a 20 20 20 20  with $ or :.    
ca60: 20 20 2a 2f 20 20 0a 20 20 20 20 20 20 6e 56 61    */  .      nVa
ca70: 72 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  r = sqlite3_bind
ca80: 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74  _parameter_count
ca90: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 6e  (pStmt);.      n
caa0: 50 61 72 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20  Parm = 0;.      
cab0: 69 66 28 20 6e 56 61 72 3e 73 69 7a 65 6f 66 28  if( nVar>sizeof(
cac0: 61 50 61 72 6d 29 2f 73 69 7a 65 6f 66 28 61 50  aParm)/sizeof(aP
cad0: 61 72 6d 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  arm[0]) ){.     
cae0: 20 20 20 61 70 50 61 72 6d 20 3d 20 28 54 63 6c     apParm = (Tcl
caf0: 5f 4f 62 6a 2a 2a 29 54 63 6c 5f 41 6c 6c 6f 63  _Obj**)Tcl_Alloc
cb00: 28 6e 56 61 72 2a 73 69 7a 65 6f 66 28 61 70 50  (nVar*sizeof(apP
cb10: 61 72 6d 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20  arm[0]));.      
cb20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
cb30: 70 50 61 72 6d 20 3d 20 61 50 61 72 6d 3b 0a 20  pParm = aParm;. 
cb40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
cb50: 28 69 3d 31 3b 20 69 3c 3d 6e 56 61 72 3b 20 69  (i=1; i<=nVar; i
cb60: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  ++){.        con
cb70: 73 74 20 63 68 61 72 20 2a 7a 56 61 72 20 3d 20  st char *zVar = 
cb80: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
cb90: 61 6d 65 74 65 72 5f 6e 61 6d 65 28 70 53 74 6d  ameter_name(pStm
cba0: 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69  t, i);.        i
cbb0: 66 28 20 7a 56 61 72 21 3d 30 20 26 26 20 28 7a  f( zVar!=0 && (z
cbc0: 56 61 72 5b 30 5d 3d 3d 27 24 27 20 7c 7c 20 7a  Var[0]=='$' || z
cbd0: 56 61 72 5b 30 5d 3d 3d 27 3a 27 20 7c 7c 20 7a  Var[0]==':' || z
cbe0: 56 61 72 5b 30 5d 3d 3d 27 40 27 29 20 29 7b 0a  Var[0]=='@') ){.
cbf0: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62            Tcl_Ob
cc00: 6a 20 2a 70 56 61 72 20 3d 20 54 63 6c 5f 47 65  j *pVar = Tcl_Ge
cc10: 74 56 61 72 32 45 78 28 69 6e 74 65 72 70 2c 20  tVar2Ex(interp, 
cc20: 26 7a 56 61 72 5b 31 5d 2c 20 30 2c 20 30 29 3b  &zVar[1], 0, 0);
cc30: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
cc40: 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Var ){.         
cc50: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
cc60: 20 20 20 20 20 20 75 38 20 2a 64 61 74 61 3b 0a        u8 *data;.
cc70: 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
cc80: 20 2a 7a 54 79 70 65 20 3d 20 70 56 61 72 2d 3e   *zType = pVar->
cc90: 74 79 70 65 50 74 72 20 3f 20 70 56 61 72 2d 3e  typePtr ? pVar->
cca0: 74 79 70 65 50 74 72 2d 3e 6e 61 6d 65 20 3a 20  typePtr->name : 
ccb0: 22 22 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  "";.            
ccc0: 63 68 61 72 20 63 20 3d 20 7a 54 79 70 65 5b 30  char c = zType[0
ccd0: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ];.            i
cce0: 66 28 20 7a 56 61 72 5b 30 5d 3d 3d 27 40 27 20  f( zVar[0]=='@' 
ccf0: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ||.             
cd00: 20 20 28 63 3d 3d 27 62 27 20 26 26 20 73 74 72    (c=='b' && str
cd10: 63 6d 70 28 7a 54 79 70 65 2c 22 62 79 74 65 61  cmp(zType,"bytea
cd20: 72 72 61 79 22 29 3d 3d 30 20 26 26 20 70 56 61  rray")==0 && pVa
cd30: 72 2d 3e 62 79 74 65 73 3d 3d 30 29 20 29 7b 0a  r->bytes==0) ){.
cd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cd50: 20 4c 6f 61 64 20 61 20 42 4c 4f 42 20 74 79 70   Load a BLOB typ
cd60: 65 20 69 66 20 74 68 65 20 54 63 6c 20 76 61 72  e if the Tcl var
cd70: 69 61 62 6c 65 20 69 73 20 61 20 62 79 74 65 61  iable is a bytea
cd80: 72 72 61 79 20 61 6e 64 0a 20 20 20 20 20 20 20  rray and.       
cd90: 20 20 20 20 20 20 20 2a 2a 20 69 74 20 68 61 73         ** it has
cda0: 20 6e 6f 20 73 74 72 69 6e 67 20 72 65 70 72 65   no string repre
cdb0: 73 65 6e 74 61 74 69 6f 6e 20 6f 72 20 74 68 65  sentation or the
cdc0: 20 68 6f 73 74 0a 20 20 20 20 20 20 20 20 20 20   host.          
cdd0: 20 20 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72      ** parameter
cde0: 20 6e 61 6d 65 20 62 65 67 69 6e 73 20 77 69 74   name begins wit
cdf0: 68 20 22 40 22 2e 20 2a 2f 0a 20 20 20 20 20 20  h "@". */.      
ce00: 20 20 20 20 20 20 20 20 64 61 74 61 20 3d 20 54          data = T
ce10: 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46  cl_GetByteArrayF
ce20: 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29  romObj(pVar, &n)
ce30: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
ce40: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f  sqlite3_bind_blo
ce50: 62 28 70 53 74 6d 74 2c 20 69 2c 20 64 61 74 61  b(pStmt, i, data
ce60: 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  , n, SQLITE_STAT
ce70: 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  IC);.           
ce80: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
ce90: 75 6e 74 28 70 56 61 72 29 3b 0a 20 20 20 20 20  unt(pVar);.     
cea0: 20 20 20 20 20 20 20 20 20 61 70 50 61 72 6d 5b           apParm[
ceb0: 6e 50 61 72 6d 2b 2b 5d 20 3d 20 70 56 61 72 3b  nParm++] = pVar;
cec0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
ced0: 73 65 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26  se if( c=='b' &&
cee0: 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 62   strcmp(zType,"b
cef0: 6f 6f 6c 65 61 6e 22 29 3d 3d 30 20 29 7b 0a 20  oolean")==0 ){. 
cf00: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c               Tcl
cf10: 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
cf20: 6e 74 65 72 70 2c 20 70 56 61 72 2c 20 26 6e 29  nterp, pVar, &n)
cf30: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
cf40: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
cf50: 28 70 53 74 6d 74 2c 20 69 2c 20 6e 29 3b 0a 20  (pStmt, i, n);. 
cf60: 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
cf70: 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20 73   if( c=='d' && s
cf80: 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 64 6f 75  trcmp(zType,"dou
cf90: 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ble")==0 ){.    
cfa0: 20 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65            double
cfb0: 20 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   r;.            
cfc0: 20 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46    Tcl_GetDoubleF
cfd0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70  romObj(interp, p
cfe0: 56 61 72 2c 20 26 72 29 3b 0a 20 20 20 20 20 20  Var, &r);.      
cff0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
d000: 62 69 6e 64 5f 64 6f 75 62 6c 65 28 70 53 74 6d  bind_double(pStm
d010: 74 2c 20 69 2c 20 72 29 3b 0a 20 20 20 20 20 20  t, i, r);.      
d020: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
d030: 28 63 3d 3d 27 77 27 20 26 26 20 73 74 72 63 6d  (c=='w' && strcm
d040: 70 28 7a 54 79 70 65 2c 22 77 69 64 65 49 6e 74  p(zType,"wideInt
d050: 22 29 3d 3d 30 29 20 7c 7c 0a 20 20 20 20 20 20  ")==0) ||.      
d060: 20 20 20 20 20 20 20 20 20 20 20 20 28 63 3d 3d              (c==
d070: 27 69 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54  'i' && strcmp(zT
d080: 79 70 65 2c 22 69 6e 74 22 29 3d 3d 30 29 20 29  ype,"int")==0) )
d090: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
d0a0: 54 63 6c 5f 57 69 64 65 49 6e 74 20 76 3b 0a 20  Tcl_WideInt v;. 
d0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c               Tcl
d0c0: 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f  _GetWideIntFromO
d0d0: 62 6a 28 69 6e 74 65 72 70 2c 20 70 56 61 72 2c  bj(interp, pVar,
d0e0: 20 26 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20   &v);.          
d0f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
d100: 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 69 2c  _int64(pStmt, i,
d110: 20 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   v);.           
d120: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
d130: 20 20 20 20 20 20 64 61 74 61 20 3d 20 28 75 6e        data = (un
d140: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 54 63  signed char *)Tc
d150: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
d160: 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20  bj(pVar, &n);.  
d170: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
d180: 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53  te3_bind_text(pS
d190: 74 6d 74 2c 20 69 2c 20 28 63 68 61 72 20 2a 29  tmt, i, (char *)
d1a0: 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f  data, n, SQLITE_
d1b0: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20  STATIC);.       
d1c0: 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52         Tcl_IncrR
d1d0: 65 66 43 6f 75 6e 74 28 70 56 61 72 29 3b 0a 20  efCount(pVar);. 
d1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70 50               apP
d1f0: 61 72 6d 5b 6e 50 61 72 6d 2b 2b 5d 20 3d 20 70  arm[nParm++] = p
d200: 56 61 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Var;.           
d210: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c   }.          }el
d220: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
d230: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c  sqlite3_bind_nul
d240: 6c 28 20 70 53 74 6d 74 2c 20 69 20 29 3b 0a 20  l( pStmt, i );. 
d250: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
d260: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
d270: 20 20 20 20 2f 2a 20 45 78 65 63 75 74 65 20 74      /* Execute t
d280: 68 65 20 53 51 4c 0a 20 20 20 20 20 20 2a 2f 0a  he SQL.      */.
d290: 20 20 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d        while( rc=
d2a0: 3d 54 43 4c 5f 4f 4b 20 26 26 20 70 53 74 6d 74  =TCL_OK && pStmt
d2b0: 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d   && SQLITE_ROW==
d2c0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
d2d0: 6d 74 29 20 29 7b 0a 0a 09 2f 2a 20 43 6f 6d 70  mt) ){.../* Comp
d2e0: 75 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ute column names
d2f0: 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65 20 64  . This must be d
d300: 6f 6e 65 20 61 66 74 65 72 20 74 68 65 20 66 69  one after the fi
d310: 72 73 74 20 73 75 63 63 65 73 73 66 75 6c 0a 09  rst successful..
d320: 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  ** call to sqlit
d330: 65 33 5f 73 74 65 70 28 29 2c 20 69 6e 20 63 61  e3_step(), in ca
d340: 73 65 20 74 68 65 20 71 75 65 72 79 20 69 73 20  se the query is 
d350: 72 65 63 6f 6d 70 69 6c 65 64 20 61 6e 64 20 74  recompiled and t
d360: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75  he.        ** nu
d370: 6d 62 65 72 20 6f 72 20 6e 61 6d 65 73 20 6f 66  mber or names of
d380: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 63 6f   the returned co
d390: 6c 75 6d 6e 73 20 63 68 61 6e 67 65 73 2e 20 0a  lumns changes. .
d3a0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
d3b0: 20 20 20 61 73 73 65 72 74 28 21 70 41 72 72 61     assert(!pArra
d3c0: 79 7c 7c 70 53 63 72 69 70 74 29 3b 0a 20 20 20  y||pScript);.   
d3d0: 20 20 20 20 20 69 66 20 28 6e 43 6f 6c 20 3c 20       if (nCol < 
d3e0: 30 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 54  0) {.          T
d3f0: 63 6c 5f 4f 62 6a 20 2a 2a 2a 61 70 20 3d 20 28  cl_Obj ***ap = (
d400: 70 53 63 72 69 70 74 3f 26 61 70 43 6f 6c 4e 61  pScript?&apColNa
d410: 6d 65 3a 30 29 3b 0a 20 20 20 20 20 20 20 20 20  me:0);.         
d420: 20 6e 43 6f 6c 20 3d 20 63 6f 6d 70 75 74 65 43   nCol = computeC
d430: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 69 6e 74 65 72  olumnNames(inter
d440: 70 2c 20 70 53 74 6d 74 2c 20 61 70 2c 20 70 41  p, pStmt, ap, pA
d450: 72 72 61 79 29 3b 0a 20 20 20 20 20 20 20 20 7d  rray);.        }
d460: 0a 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ..        for(i=
d470: 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
d480: 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4f  .          Tcl_O
d490: 62 6a 20 2a 70 56 61 6c 3b 0a 20 20 20 20 20 20  bj *pVal;.      
d4a0: 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 2f      .          /
d4b0: 2a 20 53 65 74 20 70 56 61 6c 20 74 6f 20 63 6f  * Set pVal to co
d4c0: 6e 74 61 69 6e 20 74 68 65 20 69 27 74 68 20 63  ntain the i'th c
d4d0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 69 73 20 72 6f  olumn of this ro
d4e0: 77 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  w. */.          
d4f0: 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f  switch( sqlite3_
d500: 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d  column_type(pStm
d510: 74 2c 20 69 29 20 29 7b 0a 20 20 20 20 20 20 20  t, i) ){.       
d520: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
d530: 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 20  _BLOB: {.       
d540: 20 20 20 20 20 20 20 69 6e 74 20 62 79 74 65 73         int bytes
d550: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
d560: 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20 69  n_bytes(pStmt, i
d570: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
d580: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 6c   const char *zBl
d590: 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ob = sqlite3_col
d5a0: 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20  umn_blob(pStmt, 
d5b0: 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i);.            
d5c0: 20 20 69 66 28 20 21 7a 42 6c 6f 62 20 29 20 62    if( !zBlob ) b
d5d0: 79 74 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  ytes = 0;.      
d5e0: 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54          pVal = T
d5f0: 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f  cl_NewByteArrayO
d600: 62 6a 28 28 75 38 2a 29 7a 42 6c 6f 62 2c 20 62  bj((u8*)zBlob, b
d610: 79 74 65 73 29 3b 0a 20 20 20 20 20 20 20 20 20  ytes);.         
d620: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d630: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d640: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
d650: 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20  E_INTEGER: {.   
d660: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
d670: 65 5f 69 6e 74 36 34 20 76 20 3d 20 73 71 6c 69  e_int64 v = sqli
d680: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
d690: 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  (pStmt, i);.    
d6a0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 76 3e            if( v>
d6b0: 3d 2d 32 31 34 37 34 38 33 36 34 37 20 26 26 20  =-2147483647 && 
d6c0: 76 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29 7b  v<=2147483647 ){
d6d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d6e0: 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 49   pVal = Tcl_NewI
d6f0: 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20 20 20  ntObj(v);.      
d700: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
d710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
d720: 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 57 69 64  Val = Tcl_NewWid
d730: 65 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20  eIntObj(v);.    
d740: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
d750: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
d760: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
d770: 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20             case 
d780: 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a  SQLITE_FLOAT: {.
d790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 6f                do
d7a0: 75 62 6c 65 20 72 20 3d 20 73 71 6c 69 74 65 33  uble r = sqlite3
d7b0: 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70  _column_double(p
d7c0: 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Stmt, i);.      
d7d0: 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54          pVal = T
d7e0: 63 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f 62 6a 28  cl_NewDoubleObj(
d7f0: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
d800: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
d810: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
d820: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
d830: 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  ULL: {.         
d840: 20 20 20 20 20 70 56 61 6c 20 3d 20 64 62 54 65       pVal = dbTe
d850: 78 74 54 6f 4f 62 6a 28 70 44 62 2d 3e 7a 4e 75  xtToObj(pDb->zNu
d860: 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ll);.           
d870: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
d880: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d890: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
d8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56 61               pVa
d8b0: 6c 20 3d 20 64 62 54 65 78 74 54 6f 4f 62 6a 28  l = dbTextToObj(
d8c0: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
d8d0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d  column_text(pStm
d8e0: 74 2c 20 69 29 29 3b 0a 20 20 20 20 20 20 20 20  t, i));.        
d8f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
d900: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
d910: 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
d920: 20 20 20 20 69 66 28 20 70 53 63 72 69 70 74 20      if( pScript 
d930: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
d940: 66 28 20 70 41 72 72 61 79 3d 3d 30 20 29 7b 0a  f( pArray==0 ){.
d950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
d960: 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74  l_ObjSetVar2(int
d970: 65 72 70 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b 69  erp, apColName[i
d980: 5d 2c 20 30 2c 20 70 56 61 6c 2c 20 30 29 3b 0a  ], 0, pVal, 0);.
d990: 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
d9a0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
d9b0: 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28   Tcl_ObjSetVar2(
d9c0: 69 6e 74 65 72 70 2c 20 70 41 72 72 61 79 2c 20  interp, pArray, 
d9d0: 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 70 56  apColName[i], pV
d9e0: 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  al, 0);.        
d9f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
da00: 7d 65 6c 73 65 20 69 66 28 20 63 68 6f 69 63 65  }else if( choice
da10: 3d 3d 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 20 29  ==DB_ONECOLUMN )
da20: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
da30: 73 65 72 74 28 20 70 52 65 74 3d 3d 30 20 29 3b  sert( pRet==0 );
da40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
da50: 20 70 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20   pRet==0 ){.    
da60: 20 20 20 20 20 20 20 20 20 20 70 52 65 74 20 3d            pRet =
da70: 20 70 56 61 6c 3b 0a 20 20 20 20 20 20 20 20 20   pVal;.         
da80: 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66       Tcl_IncrRef
da90: 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20  Count(pRet);.   
daa0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
dab0: 20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f         rc = TCL_
dac0: 42 52 45 41 4b 3b 0a 20 20 20 20 20 20 20 20 20  BREAK;.         
dad0: 20 20 20 69 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20     i = nCol;.   
dae0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
daf0: 20 63 68 6f 69 63 65 3d 3d 44 42 5f 45 58 49 53   choice==DB_EXIS
db00: 54 53 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  TS ){.          
db10: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
db20: 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20  nt(pRet);.      
db30: 20 20 20 20 20 20 70 52 65 74 20 3d 20 54 63 6c        pRet = Tcl
db40: 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 31  _NewBooleanObj(1
db50: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 54  );.            T
db60: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
db70: 70 52 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20  pRet);.         
db80: 20 20 20 72 63 20 3d 20 54 43 4c 5f 42 52 45 41     rc = TCL_BREA
db90: 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  K;.            i
dba0: 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20   = nCol;.       
dbb0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
dbc0: 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62        Tcl_ListOb
dbd0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
dbe0: 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 70 56 61  nterp, pRet, pVa
dbf0: 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  l);.          }.
dc00: 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20          }.  .   
dc10: 20 20 20 20 20 69 66 28 20 70 53 63 72 69 70 74       if( pScript
dc20: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
dc30: 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78   = Tcl_EvalObjEx
dc40: 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74  (interp, pScript
dc50: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
dc60: 69 66 28 20 72 63 3d 3d 54 43 4c 5f 43 4f 4e 54  if( rc==TCL_CONT
dc70: 49 4e 55 45 20 29 7b 0a 20 20 20 20 20 20 20 20  INUE ){.        
dc80: 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b      rc = TCL_OK;
dc90: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
dca0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
dcb0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c       if( rc==TCL
dcc0: 5f 42 52 45 41 4b 20 29 7b 0a 20 20 20 20 20 20  _BREAK ){.      
dcd0: 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20    rc = TCL_OK;. 
dce0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
dcf0: 20 46 72 65 65 20 74 68 65 20 63 6f 6c 75 6d 6e   Free the column
dd00: 20 6e 61 6d 65 20 6f 62 6a 65 63 74 73 20 2a 2f   name objects */
dd10: 0a 20 20 20 20 20 20 69 66 28 20 70 53 63 72 69  .      if( pScri
dd20: 70 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  pt ){.        /*
dd30: 20 49 66 20 74 68 65 20 71 75 65 72 79 20 72 65   If the query re
dd40: 74 75 72 6e 65 64 20 6e 6f 20 72 6f 77 73 2c 20  turned no rows, 
dd50: 62 75 74 20 61 6e 20 61 72 72 61 79 20 76 61 72  but an array var
dd60: 69 61 62 6c 65 20 77 61 73 20 0a 20 20 20 20 20  iable was .     
dd70: 20 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64 2c     ** specified,
dd80: 20 63 61 6c 6c 20 63 6f 6d 70 75 74 65 43 6f 6c   call computeCol
dd90: 75 6d 6e 4e 61 6d 65 73 28 29 20 6e 6f 77 20 74  umnNames() now t
dda0: 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 0a  o populate the .
ddb0: 20 20 20 20 20 20 20 20 2a 2a 20 61 72 72 61 79          ** array
ddc0: 6e 61 6d 65 28 2a 29 20 76 61 72 69 61 62 6c 65  name(*) variable
ddd0: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
dde0: 20 20 20 20 20 69 66 20 28 70 41 72 72 61 79 20       if (pArray 
ddf0: 26 26 20 6e 43 6f 6c 20 3c 20 30 29 20 7b 0a 20  && nCol < 0) {. 
de00: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a           Tcl_Obj
de10: 20 2a 2a 2a 61 70 20 3d 20 28 70 53 63 72 69 70   ***ap = (pScrip
de20: 74 3f 26 61 70 43 6f 6c 4e 61 6d 65 3a 30 29 3b  t?&apColName:0);
de30: 0a 20 20 20 20 20 20 20 20 20 20 6e 43 6f 6c 20  .          nCol 
de40: 3d 20 63 6f 6d 70 75 74 65 43 6f 6c 75 6d 6e 4e  = computeColumnN
de50: 61 6d 65 73 28 69 6e 74 65 72 70 2c 20 70 53 74  ames(interp, pSt
de60: 6d 74 2c 20 61 70 2c 20 70 41 72 72 61 79 29 3b  mt, ap, pArray);
de70: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
de80: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
de90: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
dea0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
deb0: 6f 75 6e 74 28 61 70 43 6f 6c 4e 61 6d 65 5b 69  ount(apColName[i
dec0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ]);.        }.  
ded0: 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28        Tcl_Free((
dee0: 63 68 61 72 2a 29 61 70 43 6f 6c 4e 61 6d 65 29  char*)apColName)
def0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
df00: 20 2f 2a 20 46 72 65 65 20 74 68 65 20 62 6f 75   /* Free the bou
df10: 6e 64 20 73 74 72 69 6e 67 20 61 6e 64 20 62 6c  nd string and bl
df20: 6f 62 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f  ob parameters */
df30: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
df40: 69 3c 6e 50 61 72 6d 3b 20 69 2b 2b 29 7b 0a 20  i<nParm; i++){. 
df50: 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52         Tcl_DecrR
df60: 65 66 43 6f 75 6e 74 28 61 70 50 61 72 6d 5b 69  efCount(apParm[i
df70: 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
df80: 20 20 69 66 28 20 61 70 50 61 72 6d 21 3d 61 50    if( apParm!=aP
df90: 61 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 54  arm ){.        T
dfa0: 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 61  cl_Free((char*)a
dfb0: 70 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a  pParm);.      }.
dfc0: 0a 20 20 20 20 20 20 2f 2a 20 52 65 73 65 74 20  .      /* Reset 
dfd0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  the statement.  
dfe0: 49 66 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  If the result co
dff0: 64 65 20 69 73 20 53 51 4c 49 54 45 5f 53 43 48  de is SQLITE_SCH
e000: 45 4d 41 2c 20 74 68 65 6e 0a 20 20 20 20 20 20  EMA, then.      
e010: 2a 2a 20 66 6c 75 73 68 20 74 68 65 20 73 74 61  ** flush the sta
e020: 74 65 6d 65 6e 74 20 63 61 63 68 65 20 61 6e 64  tement cache and
e030: 20 74 72 79 20 74 68 65 20 73 74 61 74 65 6d 65   try the stateme
e040: 6e 74 20 61 67 61 69 6e 2e 0a 20 20 20 20 20 20  nt again..      
e050: 2a 2f 0a 20 20 20 20 20 20 72 63 32 20 3d 20 73  */.      rc2 = s
e060: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74  qlite3_reset(pSt
e070: 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53  mt);.      if( S
e080: 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 32 20 29 7b  QLITE_OK!=rc2 ){
e090: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61  .        /* If a
e0a0: 20 72 75 6e 2d 74 69 6d 65 20 65 72 72 6f 72 20   run-time error 
e0b0: 6f 63 63 75 72 73 2c 20 72 65 70 6f 72 74 20 74  occurs, report t
e0c0: 68 65 20 65 72 72 6f 72 20 61 6e 64 20 73 74 6f  he error and sto
e0d0: 70 20 72 65 61 64 69 6e 67 0a 20 20 20 20 20 20  p reading.      
e0e0: 20 20 2a 2a 20 74 68 65 20 53 51 4c 0a 20 20 20    ** the SQL.   
e0f0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
e100: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
e110: 28 69 6e 74 65 72 70 2c 20 64 62 54 65 78 74 54  (interp, dbTextT
e120: 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 72 72  oObj(sqlite3_err
e130: 6d 73 67 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a  msg(pDb->db)));.
e140: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
e150: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
e160: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 43  .        rc = TC
e170: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  L_ERROR;.       
e180: 20 69 66 28 20 70 50 72 65 53 74 6d 74 20 29 20   if( pPreStmt ) 
e190: 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29  Tcl_Free((char*)
e1a0: 70 50 72 65 53 74 6d 74 29 3b 0a 20 20 20 20 20  pPreStmt);.     
e1b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
e1c0: 7d 65 6c 73 65 20 69 66 28 20 70 44 62 2d 3e 6d  }else if( pDb->m
e1d0: 61 78 53 74 6d 74 3c 3d 30 20 29 7b 0a 20 20 20  axStmt<=0 ){.   
e1e0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63       /* If the c
e1f0: 61 63 68 65 20 69 73 20 74 75 72 6e 65 64 20 6f  ache is turned o
e200: 66 66 2c 20 64 65 61 6c 6c 6f 63 61 74 65 64 20  ff, deallocated 
e210: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  the statement */
e220: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72  .        if( pPr
e230: 65 53 74 6d 74 20 29 20 54 63 6c 5f 46 72 65 65  eStmt ) Tcl_Free
e240: 28 28 63 68 61 72 2a 29 70 50 72 65 53 74 6d 74  ((char*)pPreStmt
e250: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
e260: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
e270: 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
e280: 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 76 65 72  .        /* Ever
e290: 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 20 61 6e  ything worked an
e2a0: 64 20 74 68 65 20 63 61 63 68 65 20 69 73 20 6f  d the cache is o
e2b0: 70 65 72 61 74 69 6f 6e 61 6c 2e 0a 20 20 20 20  perational..    
e2c0: 20 20 20 20 2a 2a 20 43 72 65 61 74 65 20 61 20      ** Create a 
e2d0: 6e 65 77 20 53 71 6c 50 72 65 70 61 72 65 64 53  new SqlPreparedS
e2e0: 74 6d 74 20 73 74 72 75 63 74 75 72 65 20 69 66  tmt structure if
e2f0: 20 77 65 20 6e 65 65 64 20 6f 6e 65 2e 0a 20 20   we need one..  
e300: 20 20 20 20 20 20 2a 2a 20 28 49 66 20 77 65 20        ** (If we 
e310: 61 6c 72 65 61 64 79 20 68 61 76 65 20 6f 6e 65  already have one
e320: 20 77 65 20 63 61 6e 20 6a 75 73 74 20 72 65 75   we can just reu
e330: 73 65 20 69 74 2e 29 0a 20 20 20 20 20 20 20 20  se it.).        
e340: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
e350: 50 72 65 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20  PreStmt==0 ){.  
e360: 20 20 20 20 20 20 20 20 6c 65 6e 20 3d 20 7a 4c          len = zL
e370: 65 66 74 20 2d 20 7a 53 71 6c 3b 0a 20 20 20 20  eft - zSql;.    
e380: 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 20 3d        pPreStmt =
e390: 20 28 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d   (SqlPreparedStm
e3a0: 74 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69  t*)Tcl_Alloc( si
e3b0: 7a 65 6f 66 28 2a 70 50 72 65 53 74 6d 74 29 20  zeof(*pPreStmt) 
e3c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
e3d0: 20 70 50 72 65 53 74 6d 74 3d 3d 30 20 29 20 72   pPreStmt==0 ) r
e3e0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
e3f0: 0a 20 20 20 20 20 20 20 20 20 20 70 50 72 65 53  .          pPreS
e400: 74 6d 74 2d 3e 70 53 74 6d 74 20 3d 20 70 53 74  tmt->pStmt = pSt
e410: 6d 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  mt;.          pP
e420: 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 20 3d 20 6c  reStmt->nSql = l
e430: 65 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  en;.          pP
e440: 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 20 3d 20 73  reStmt->zSql = s
e450: 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d 74  qlite3_sql(pStmt
e460: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
e470: 65 72 74 28 20 73 74 72 6c 65 6e 28 70 50 72 65  ert( strlen(pPre
e480: 53 74 6d 74 2d 3e 7a 53 71 6c 29 3d 3d 6c 65 6e  Stmt->zSql)==len
e490: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   );.          as
e4a0: 73 65 72 74 28 20 30 3d 3d 6d 65 6d 63 6d 70 28  sert( 0==memcmp(
e4b0: 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c 20  pPreStmt->zSql, 
e4c0: 7a 53 71 6c 2c 20 6c 65 6e 29 20 29 3b 0a 20 20  zSql, len) );.  
e4d0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
e4e0: 20 2f 2a 20 41 64 64 20 74 68 65 20 70 72 65 70   /* Add the prep
e4f0: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 74  ared statement t
e500: 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  o the beginning 
e510: 6f 66 20 74 68 65 20 63 61 63 68 65 20 6c 69 73  of the cache lis
e520: 74 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  t.        */.   
e530: 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70       pPreStmt->p
e540: 4e 65 78 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74  Next = pDb->stmt
e550: 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 70 50  List;.        pP
e560: 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 20 3d 20  reStmt->pPrev = 
e570: 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  0;.        if( p
e580: 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 29 7b 0a  Db->stmtList ){.
e590: 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73 74           pDb->st
e5a0: 6d 74 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d 20  mtList->pPrev = 
e5b0: 70 50 72 65 53 74 6d 74 3b 0a 20 20 20 20 20 20  pPreStmt;.      
e5c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 70 44 62 2d    }.        pDb-
e5d0: 3e 73 74 6d 74 4c 69 73 74 20 3d 20 70 50 72 65  >stmtList = pPre
e5e0: 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 69 66  Stmt;.        if
e5f0: 28 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 3d  ( pDb->stmtLast=
e600: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
e610: 61 73 73 65 72 74 28 20 70 44 62 2d 3e 6e 53 74  assert( pDb->nSt
e620: 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  mt==0 );.       
e630: 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74     pDb->stmtLast
e640: 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20 20 20   = pPreStmt;.   
e650: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
e660: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44        assert( pD
e670: 62 2d 3e 6e 53 74 6d 74 3e 30 20 29 3b 0a 20 20  b->nStmt>0 );.  
e680: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e690: 70 44 62 2d 3e 6e 53 74 6d 74 2b 2b 3b 0a 20 20  pDb->nStmt++;.  
e6a0: 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20   .        /* If 
e6b0: 77 65 20 68 61 76 65 20 74 6f 6f 20 6d 61 6e 79  we have too many
e6c0: 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 63 61   statement in ca
e6d0: 63 68 65 2c 20 72 65 6d 6f 76 65 20 74 68 65 20  che, remove the 
e6e0: 73 75 72 70 6c 75 73 20 66 72 6f 6d 20 74 68 65  surplus from the
e6f0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 6e 64 20  .        ** end 
e700: 6f 66 20 74 68 65 20 63 61 63 68 65 20 6c 69 73  of the cache lis
e710: 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  t..        */.  
e720: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 44 62        while( pDb
e730: 2d 3e 6e 53 74 6d 74 3e 70 44 62 2d 3e 6d 61 78  ->nStmt>pDb->max
e740: 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Stmt ){.        
e750: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
e760: 7a 65 28 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74  ze(pDb->stmtLast
e770: 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  ->pStmt);.      
e780: 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73      pDb->stmtLas
e790: 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73  t = pDb->stmtLas
e7a0: 74 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20  t->pPrev;.      
e7b0: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68      Tcl_Free((ch
e7c0: 61 72 2a 29 70 44 62 2d 3e 73 74 6d 74 4c 61 73  ar*)pDb->stmtLas
e7d0: 74 2d 3e 70 4e 65 78 74 29 3b 0a 20 20 20 20 20  t->pNext);.     
e7e0: 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61       pDb->stmtLa
e7f0: 73 74 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  st->pNext = 0;. 
e800: 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 6e 53           pDb->nS
e810: 74 6d 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7d  tmt--;.        }
e820: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
e830: 2f 2a 20 50 72 6f 63 65 65 64 20 74 6f 20 74 68  /* Proceed to th
e840: 65 20 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74  e next statement
e850: 20 2a 2f 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d   */.      zSql =
e860: 20 7a 4c 65 66 74 3b 0a 20 20 20 20 7d 0a 20 20   zLeft;.    }.  
e870: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
e880: 6e 74 28 6f 62 6a 76 5b 32 5d 29 3b 0a 0a 20 20  nt(objv[2]);..  
e890: 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20    if( pRet ){.  
e8a0: 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f      if( rc==TCL_
e8b0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  OK ){.        Tc
e8c0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
e8d0: 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20 20  nterp, pRet);.  
e8e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 54 63 6c 5f      }.      Tcl_
e8f0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 52 65  DecrRefCount(pRe
e900: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  t);.    }else if
e910: 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a  ( rc==TCL_OK ){.
e920: 20 20 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52        Tcl_ResetR
e930: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
e940: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
e950: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
e960: 20 20 20 24 64 62 20 66 75 6e 63 74 69 6f 6e 20     $db function 
e970: 4e 41 4d 45 20 53 43 52 49 50 54 0a 20 20 2a 2a  NAME SCRIPT.  **
e980: 0a 20 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  .  ** Create a n
e990: 65 77 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  ew SQL function 
e9a0: 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 57 68  called NAME.  Wh
e9b0: 65 6e 65 76 65 72 20 74 68 61 74 20 66 75 6e 63  enever that func
e9c0: 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 61 6c  tion is.  ** cal
e9d0: 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53 43 52 49  led, invoke SCRI
e9e0: 50 54 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  PT to evaluate t
e9f0: 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a  he function..  *
ea00: 2f 0a 20 20 63 61 73 65 20 44 42 5f 46 55 4e 43  /.  case DB_FUNC
ea10: 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 53 71 6c 46  TION: {.    SqlF
ea20: 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20 20 20  unc *pFunc;.    
ea30: 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74  Tcl_Obj *pScript
ea40: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d  ;.    char *zNam
ea50: 65 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  e;.    if( objc!
ea60: 3d 34 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =4 ){.      Tcl_
ea70: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
ea80: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e  erp, 2, objv, "N
ea90: 41 4d 45 20 53 43 52 49 50 54 22 29 3b 0a 20 20  AME SCRIPT");.  
eaa0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
eab0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
eac0: 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53  zName = Tcl_GetS
ead0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
eae0: 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20 70 53  v[2], 0);.    pS
eaf0: 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 33 5d 3b  cript = objv[3];
eb00: 0a 20 20 20 20 70 46 75 6e 63 20 3d 20 66 69 6e  .    pFunc = fin
eb10: 64 53 71 6c 46 75 6e 63 28 70 44 62 2c 20 7a 4e  dSqlFunc(pDb, zN
eb20: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 46  ame);.    if( pF
eb30: 75 6e 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  unc==0 ) return 
eb40: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 69  TCL_ERROR;.    i
eb50: 66 28 20 70 46 75 6e 63 2d 3e 70 53 63 72 69 70  f( pFunc->pScrip
eb60: 74 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44  t ){.      Tcl_D
eb70: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 46 75 6e  ecrRefCount(pFun
eb80: 63 2d 3e 70 53 63 72 69 70 74 29 3b 0a 20 20 20  c->pScript);.   
eb90: 20 7d 0a 20 20 20 20 70 46 75 6e 63 2d 3e 70 53   }.    pFunc->pS
eba0: 63 72 69 70 74 20 3d 20 70 53 63 72 69 70 74 3b  cript = pScript;
ebb0: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
ebc0: 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a  Count(pScript);.
ebd0: 20 20 20 20 70 46 75 6e 63 2d 3e 75 73 65 45 76      pFunc->useEv
ebe0: 61 6c 4f 62 6a 76 20 3d 20 73 61 66 65 54 6f 55  alObjv = safeToU
ebf0: 73 65 45 76 61 6c 4f 62 6a 76 28 69 6e 74 65 72  seEvalObjv(inter
ec00: 70 2c 20 70 53 63 72 69 70 74 29 3b 0a 20 20 20  p, pScript);.   
ec10: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
ec20: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 44  eate_function(pD
ec30: 62 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31  b->db, zName, -1
ec40: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20  , SQLITE_UTF8,. 
ec50: 20 20 20 20 20 20 20 70 46 75 6e 63 2c 20 74 63         pFunc, tc
ec60: 6c 53 71 6c 46 75 6e 63 2c 20 30 2c 20 30 29 3b  lSqlFunc, 0, 0);
ec70: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
ec80: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
ec90: 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  rc = TCL_ERROR;.
eca0: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73        Tcl_SetRes
ecb0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
ecc0: 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72 6d  r *)sqlite3_errm
ecd0: 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 54 43 4c  sg(pDb->db), TCL
ece0: 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20  _VOLATILE);.    
ecf0: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
ed00: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  /*.  **     
ed10: 24 64 62 20 69 6e 63 72 62 6c 6f 62 20 3f 2d 72  $db incrblob ?-r
ed20: 65 61 64 6f 6e 6c 79 3f 20 3f 44 42 3f 20 54 41  eadonly? ?DB? TA
ed30: 42 4c 45 20 43 4f 4c 55 4d 4e 20 52 4f 57 49 44  BLE COLUMN ROWID
ed40: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
ed50: 49 4e 43 52 42 4c 4f 42 3a 20 7b 0a 23 69 66 64  INCRBLOB: {.#ifd
ed60: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
ed70: 4e 43 52 42 4c 4f 42 0a 20 20 20 20 54 63 6c 5f  NCRBLOB.    Tcl_
ed80: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
ed90: 65 72 70 2c 20 22 69 6e 63 72 62 6c 6f 62 20 6e  erp, "incrblob n
eda0: 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  ot available in 
edb0: 74 68 69 73 20 62 75 69 6c 64 22 2c 20 30 29 3b  this build", 0);
edc0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
edd0: 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 20  ERROR;.#else.   
ede0: 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20   int isReadonly 
edf0: 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  = 0;.    const c
ee00: 68 61 72 20 2a 7a 44 62 20 3d 20 22 6d 61 69 6e  har *zDb = "main
ee10: 22 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ";.    const cha
ee20: 72 20 2a 7a 54 61 62 6c 65 3b 0a 20 20 20 20 63  r *zTable;.    c
ee30: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75  onst char *zColu
ee40: 6d 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 5f 69  mn;.    sqlite_i
ee50: 6e 74 36 34 20 69 52 6f 77 3b 0a 0a 20 20 20 20  nt64 iRow;..    
ee60: 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 74 68 65  /* Check for the
ee70: 20 2d 72 65 61 64 6f 6e 6c 79 20 6f 70 74 69 6f   -readonly optio
ee80: 6e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 62 6a  n */.    if( obj
ee90: 63 3e 33 20 26 26 20 73 74 72 63 6d 70 28 54 63  c>3 && strcmp(Tc
eea0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
eeb0: 5b 32 5d 29 2c 20 22 2d 72 65 61 64 6f 6e 6c 79  [2]), "-readonly
eec0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
eed0: 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20  sReadonly = 1;. 
eee0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62     }..    if( ob
eef0: 6a 63 21 3d 28 35 2b 69 73 52 65 61 64 6f 6e 6c  jc!=(5+isReadonl
ef00: 79 29 20 26 26 20 6f 62 6a 63 21 3d 28 36 2b 69  y) && objc!=(6+i
ef10: 73 52 65 61 64 6f 6e 6c 79 29 20 29 7b 0a 20 20  sReadonly) ){.  
ef20: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
ef30: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
ef40: 6f 62 6a 76 2c 20 22 3f 2d 72 65 61 64 6f 6e 6c  objv, "?-readonl
ef50: 79 3f 20 3f 44 42 3f 20 54 41 42 4c 45 20 43 4f  y? ?DB? TABLE CO
ef60: 4c 55 4d 4e 20 52 4f 57 49 44 22 29 3b 0a 20 20  LUMN ROWID");.  
ef70: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
ef80: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
ef90: 20 69 66 28 20 6f 62 6a 63 3d 3d 28 36 2b 69 73   if( objc==(6+is
efa0: 52 65 61 64 6f 6e 6c 79 29 20 29 7b 0a 20 20 20  Readonly) ){.   
efb0: 20 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74     zDb = Tcl_Get
efc0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
efd0: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 54 61 62 6c  .    }.    zTabl
efe0: 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
eff0: 67 28 6f 62 6a 76 5b 6f 62 6a 63 2d 33 5d 29 3b  g(objv[objc-3]);
f000: 0a 20 20 20 20 7a 43 6f 6c 75 6d 6e 20 3d 20 54  .    zColumn = T
f010: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
f020: 76 5b 6f 62 6a 63 2d 32 5d 29 3b 0a 20 20 20 20  v[objc-2]);.    
f030: 72 63 20 3d 20 54 63 6c 5f 47 65 74 57 69 64 65  rc = Tcl_GetWide
f040: 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
f050: 70 2c 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 2c  p, objv[objc-1],
f060: 20 26 69 52 6f 77 29 3b 0a 0a 20 20 20 20 69 66   &iRow);..    if
f070: 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a  ( rc==TCL_OK ){.
f080: 20 20 20 20 20 20 72 63 20 3d 20 63 72 65 61 74        rc = creat
f090: 65 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c  eIncrblobChannel
f0a0: 28 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 65  (.          inte
f0b0: 72 70 2c 20 70 44 62 2c 20 7a 44 62 2c 20 7a 54  rp, pDb, zDb, zT
f0c0: 61 62 6c 65 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 69  able, zColumn, i
f0d0: 52 6f 77 2c 20 69 73 52 65 61 64 6f 6e 6c 79 0a  Row, isReadonly.
f0e0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 23        );.    }.#
f0f0: 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b  endif.    break;
f100: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
f110: 20 20 20 20 24 64 62 20 69 6e 74 65 72 72 75 70      $db interrup
f120: 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 74 65  t.  **.  ** Inte
f130: 72 72 75 70 74 20 74 68 65 20 65 78 65 63 75 74  rrupt the execut
f140: 69 6f 6e 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  ion of the inner
f150: 2d 6d 6f 73 74 20 53 51 4c 20 69 6e 74 65 72 70  -most SQL interp
f160: 72 65 74 65 72 2e 20 20 54 68 69 73 0a 20 20 2a  reter.  This.  *
f170: 2a 20 63 61 75 73 65 73 20 74 68 65 20 53 51 4c  * causes the SQL
f180: 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 72 65   statement to re
f190: 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 6f 66  turn an error of
f1a0: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
f1b0: 54 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  T..  */.  case D
f1c0: 42 5f 49 4e 54 45 52 52 55 50 54 3a 20 7b 0a 20  B_INTERRUPT: {. 
f1d0: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72     sqlite3_inter
f1e0: 72 75 70 74 28 70 44 62 2d 3e 64 62 29 3b 0a 20  rupt(pDb->db);. 
f1f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
f200: 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62   /*.  **     $db
f210: 20 6e 75 6c 6c 76 61 6c 75 65 20 3f 53 54 52 49   nullvalue ?STRI
f220: 4e 47 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 68  NG?.  **.  ** Ch
f230: 61 6e 67 65 20 74 65 78 74 20 75 73 65 64 20 77  ange text used w
f240: 68 65 6e 20 61 20 4e 55 4c 4c 20 63 6f 6d 65 73  hen a NULL comes
f250: 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 64   back from the d
f260: 61 74 61 62 61 73 65 2e 20 49 66 20 3f 53 54 52  atabase. If ?STR
f270: 49 4e 47 3f 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  ING?.  ** is not
f280: 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 74   present, then t
f290: 68 65 20 63 75 72 72 65 6e 74 20 73 74 72 69 6e  he current strin
f2a0: 67 20 75 73 65 64 20 66 6f 72 20 4e 55 4c 4c 20  g used for NULL 
f2b0: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a  is returned..  *
f2c0: 2a 20 49 66 20 53 54 52 49 4e 47 20 69 73 20 70  * If STRING is p
f2d0: 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 53 54 52  resent, then STR
f2e0: 49 4e 47 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ING is returned.
f2f0: 0a 20 20 2a 2a 0a 20 20 2a 2f 0a 20 20 63 61 73  .  **.  */.  cas
f300: 65 20 44 42 5f 4e 55 4c 4c 56 41 4c 55 45 3a 20  e DB_NULLVALUE: 
f310: 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  {.    if( objc!=
f320: 32 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a  2 && objc!=3 ){.
f330: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
f340: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
f350: 2c 20 6f 62 6a 76 2c 20 22 4e 55 4c 4c 56 41 4c  , objv, "NULLVAL
f360: 55 45 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  UE");.      retu
f370: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
f380: 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63    }.    if( objc
f390: 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==3 ){.      int
f3a0: 20 6c 65 6e 3b 0a 20 20 20 20 20 20 63 68 61 72   len;.      char
f3b0: 20 2a 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 47 65   *zNull = Tcl_Ge
f3c0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
f3d0: 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20  bjv[2], &len);. 
f3e0: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 4e       if( pDb->zN
f3f0: 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 54  ull ){.        T
f400: 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 4e 75  cl_Free(pDb->zNu
f410: 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ll);.      }.   
f420: 20 20 20 69 66 28 20 7a 4e 75 6c 6c 20 26 26 20     if( zNull && 
f430: 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  len>0 ){.       
f440: 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 3d 20 54 63   pDb->zNull = Tc
f450: 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31  l_Alloc( len + 1
f460: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 74 72 6e   );.        strn
f470: 63 70 79 28 70 44 62 2d 3e 7a 4e 75 6c 6c 2c 20  cpy(pDb->zNull, 
f480: 7a 4e 75 6c 6c 2c 20 6c 65 6e 29 3b 0a 20 20 20  zNull, len);.   
f490: 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c 5b       pDb->zNull[
f4a0: 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  len] = '\0';.   
f4b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f4c0: 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 3d 20 30    pDb->zNull = 0
f4d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
f4e0: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
f4f0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 64 62 54  sult(interp, dbT
f500: 65 78 74 54 6f 4f 62 6a 28 70 44 62 2d 3e 7a 4e  extToObj(pDb->zN
f510: 75 6c 6c 29 29 3b 0a 20 20 20 20 62 72 65 61 6b  ull));.    break
f520: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
f530: 20 20 20 20 20 24 64 62 20 6c 61 73 74 5f 69 6e       $db last_in
f540: 73 65 72 74 5f 72 6f 77 69 64 20 0a 20 20 2a 2a  sert_rowid .  **
f550: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20  .  ** Return an 
f560: 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
f570: 20 74 68 65 20 52 4f 57 49 44 20 66 6f 72 20 74   the ROWID for t
f580: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 69  he most recent i
f590: 6e 73 65 72 74 2e 0a 20 20 2a 2f 0a 20 20 63 61  nsert..  */.  ca
f5a0: 73 65 20 44 42 5f 4c 41 53 54 5f 49 4e 53 45 52  se DB_LAST_INSER
f5b0: 54 5f 52 4f 57 49 44 3a 20 7b 0a 20 20 20 20 54  T_ROWID: {.    T
f5c0: 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b  cl_Obj *pResult;
f5d0: 0a 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74  .    Tcl_WideInt
f5e0: 20 72 6f 77 69 64 3b 0a 20 20 20 20 69 66 28 20   rowid;.    if( 
f5f0: 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 20  objc!=2 ){.     
f600: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
f610: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
f620: 76 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 72 65  v, "");.      re
f630: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
f640: 20 20 20 20 7d 0a 20 20 20 20 72 6f 77 69 64 20      }.    rowid 
f650: 3d 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69  = sqlite3_last_i
f660: 6e 73 65 72 74 5f 72 6f 77 69 64 28 70 44 62 2d  nsert_rowid(pDb-
f670: 3e 64 62 29 3b 0a 20 20 20 20 70 52 65 73 75 6c  >db);.    pResul
f680: 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65  t = Tcl_GetObjRe
f690: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
f6a0: 20 20 54 63 6c 5f 53 65 74 57 69 64 65 49 6e 74    Tcl_SetWideInt
f6b0: 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 72 6f 77  Obj(pResult, row
f6c0: 69 64 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  id);.    break;.
f6d0: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54    }..  /*.  ** T
f6e0: 68 65 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 20  he DB_ONECOLUMN 
f6f0: 6d 65 74 68 6f 64 20 69 73 20 69 6d 70 6c 65 6d  method is implem
f700: 65 6e 74 65 64 20 74 6f 67 65 74 68 65 72 20 77  ented together w
f710: 69 74 68 20 44 42 5f 45 56 41 4c 2e 0a 20 20 2a  ith DB_EVAL..  *
f720: 2f 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 70  /..  /*    $db p
f730: 72 6f 67 72 65 73 73 20 3f 4e 20 43 41 4c 4c 42  rogress ?N CALLB
f740: 41 43 4b 3f 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20  ACK?.  ** .  ** 
f750: 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e  Invoke the given
f760: 20 63 61 6c 6c 62 61 63 6b 20 65 76 65 72 79 20   callback every 
f770: 4e 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  N virtual machin
f780: 65 20 6f 70 63 6f 64 65 73 20 77 68 69 6c 65 20  e opcodes while 
f790: 65 78 65 63 75 74 69 6e 67 0a 20 20 2a 2a 20 71  executing.  ** q
f7a0: 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 63  ueries..  */.  c
f7b0: 61 73 65 20 44 42 5f 50 52 4f 47 52 45 53 53 3a  ase DB_PROGRESS:
f7c0: 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d   {.    if( objc=
f7d0: 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =2 ){.      if( 
f7e0: 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29  pDb->zProgress )
f7f0: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  {.        Tcl_Ap
f800: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
f810: 70 2c 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73  p, pDb->zProgres
f820: 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  s, 0);.      }. 
f830: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a     }else if( obj
f840: 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 63 68  c==4 ){.      ch
f850: 61 72 20 2a 7a 50 72 6f 67 72 65 73 73 3b 0a 20  ar *zProgress;. 
f860: 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20       int len;.  
f870: 20 20 20 20 69 6e 74 20 4e 3b 0a 20 20 20 20 20      int N;.     
f880: 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c   if( TCL_OK!=Tcl
f890: 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
f8a0: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
f8b0: 26 4e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  &N) ){.        r
f8c0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
f8d0: 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  .      };.      
f8e0: 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65  if( pDb->zProgre
f8f0: 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  ss ){.        Tc
f900: 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 50 72 6f  l_Free(pDb->zPro
f910: 67 72 65 73 73 29 3b 0a 20 20 20 20 20 20 7d 0a  gress);.      }.
f920: 20 20 20 20 20 20 7a 50 72 6f 67 72 65 73 73 20        zProgress 
f930: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
f940: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20  romObj(objv[3], 
f950: 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  &len);.      if(
f960: 20 7a 50 72 6f 67 72 65 73 73 20 26 26 20 6c 65   zProgress && le
f970: 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  n>0 ){.        p
f980: 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 3d 20  Db->zProgress = 
f990: 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b  Tcl_Alloc( len +
f9a0: 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65   1 );.        me
f9b0: 6d 63 70 79 28 70 44 62 2d 3e 7a 50 72 6f 67 72  mcpy(pDb->zProgr
f9c0: 65 73 73 2c 20 7a 50 72 6f 67 72 65 73 73 2c 20  ess, zProgress, 
f9d0: 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65  len+1);.      }e
f9e0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62  lse{.        pDb
f9f0: 2d 3e 7a 50 72 6f 67 72 65 73 73 20 3d 20 30 3b  ->zProgress = 0;
fa00: 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  .      }.#ifndef
fa10: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f   SQLITE_OMIT_PRO
fa20: 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 20  GRESS_CALLBACK. 
fa30: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50       if( pDb->zP
fa40: 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20 20  rogress ){.     
fa50: 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d     pDb->interp =
fa60: 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20   interp;.       
fa70: 20 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65 73   sqlite3_progres
fa80: 73 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64  s_handler(pDb->d
fa90: 62 2c 20 4e 2c 20 44 62 50 72 6f 67 72 65 73 73  b, N, DbProgress
faa0: 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20  Handler, pDb);. 
fab0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
fac0: 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 67      sqlite3_prog
fad0: 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 70 44 62  ress_handler(pDb
fae0: 2d 3e 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  ->db, 0, 0, 0);.
faf0: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
fb00: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fb10: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
fb20: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
fb30: 2c 20 22 4e 20 43 41 4c 4c 42 41 43 4b 22 29 3b  , "N CALLBACK");
fb40: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
fb50: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
fb60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
fb70: 20 2f 2a 20 20 20 20 24 64 62 20 70 72 6f 66 69   /*    $db profi
fb80: 6c 65 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20  le ?CALLBACK?.  
fb90: 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 61 72 72  **.  ** Make arr
fba0: 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20 69 6e 76  angements to inv
fbb0: 6f 6b 65 20 74 68 65 20 43 41 4c 4c 42 41 43 4b  oke the CALLBACK
fbc0: 20 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20 65   routine after e
fbd0: 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ach SQL statemen
fbe0: 74 0a 20 20 2a 2a 20 74 68 61 74 20 68 61 73 20  t.  ** that has 
fbf0: 72 75 6e 2e 20 20 54 68 65 20 74 65 78 74 20 6f  run.  The text o
fc00: 66 20 74 68 65 20 53 51 4c 20 61 6e 64 20 74 68  f the SQL and th
fc10: 65 20 61 6d 6f 75 6e 74 20 6f 66 20 65 6c 61 70  e amount of elap
fc20: 73 65 20 74 69 6d 65 20 61 72 65 0a 20 20 2a 2a  se time are.  **
fc30: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 43 41 4c   appended to CAL
fc40: 4c 42 41 43 4b 20 62 65 66 6f 72 65 20 74 68 65  LBACK before the
fc50: 20 73 63 72 69 70 74 20 69 73 20 72 75 6e 2e 0a   script is run..
fc60: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 50    */.  case DB_P
fc70: 52 4f 46 49 4c 45 3a 20 7b 0a 20 20 20 20 69 66  ROFILE: {.    if
fc80: 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20  ( objc>3 ){.    
fc90: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
fca0: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
fcb0: 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22  jv, "?CALLBACK?"
fcc0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
fcd0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
fce0: 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32  else if( objc==2
fcf0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44   ){.      if( pD
fd00: 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20  b->zProfile ){. 
fd10: 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
fd20: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
fd30: 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20 30  pDb->zProfile, 0
fd40: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
fd50: 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72  else{.      char
fd60: 20 2a 7a 50 72 6f 66 69 6c 65 3b 0a 20 20 20 20   *zProfile;.    
fd70: 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20    int len;.     
fd80: 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69   if( pDb->zProfi
fd90: 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  le ){.        Tc
fda0: 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 50 72 6f  l_Free(pDb->zPro
fdb0: 66 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  file);.      }. 
fdc0: 20 20 20 20 20 7a 50 72 6f 66 69 6c 65 20 3d 20       zProfile = 
fdd0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
fde0: 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c  mObj(objv[2], &l
fdf0: 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  en);.      if( z
fe00: 50 72 6f 66 69 6c 65 20 26 26 20 6c 65 6e 3e 30  Profile && len>0
fe10: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
fe20: 3e 7a 50 72 6f 66 69 6c 65 20 3d 20 54 63 6c 5f  >zProfile = Tcl_
fe30: 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29  Alloc( len + 1 )
fe40: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
fe50: 28 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20  (pDb->zProfile, 
fe60: 7a 50 72 6f 66 69 6c 65 2c 20 6c 65 6e 2b 31 29  zProfile, len+1)
fe70: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
fe80: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f         pDb->zPro
fe90: 66 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  file = 0;.      
fea0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
feb0: 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 20 20  _OMIT_TRACE.    
fec0: 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66    if( pDb->zProf
fed0: 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ile ){.        p
fee0: 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74  Db->interp = int
fef0: 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  erp;.        sql
ff00: 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 70 44 62  ite3_profile(pDb
ff10: 2d 3e 64 62 2c 20 44 62 50 72 6f 66 69 6c 65 48  ->db, DbProfileH
ff20: 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20  andler, pDb);.  
ff30: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ff40: 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 66 69     sqlite3_profi
ff50: 6c 65 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30  le(pDb->db, 0, 0
ff60: 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
ff70: 66 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  f.    }.    brea
ff80: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
ff90: 2a 20 20 20 20 20 24 64 62 20 72 65 6b 65 79 20  *     $db rekey 
ffa0: 4b 45 59 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 68  KEY.  **.  ** Ch
ffb0: 61 6e 67 65 20 74 68 65 20 65 6e 63 72 79 70 74  ange the encrypt
ffc0: 69 6f 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 63  ion key on the c
ffd0: 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 64 61  urrently open da
ffe0: 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63  tabase..  */.  c
fff0: 61 73 65 20 44 42 5f 52 45 4b 45 59 3a 20 7b 0a  ase DB_REKEY: {.
10000 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20      int nKey;.  
10010 20 20 76 6f 69 64 20 2a 70 4b 65 79 3b 0a 20 20    void *pKey;.  
10020 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
10030 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
10040 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
10050 32 2c 20 6f 62 6a 76 2c 20 22 4b 45 59 22 29 3b  2, objv, "KEY");
10060 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
10070 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
10080 20 20 20 70 4b 65 79 20 3d 20 54 63 6c 5f 47 65     pKey = Tcl_Ge
10090 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62  tByteArrayFromOb
100a0 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6e 4b 65 79  j(objv[2], &nKey
100b0 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
100c0 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 72  _HAS_CODEC.    r
100d0 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 6b 65  c = sqlite3_reke
100e0 79 28 70 44 62 2d 3e 64 62 2c 20 70 4b 65 79 2c  y(pDb->db, pKey,
100f0 20 6e 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20   nKey);.    if( 
10100 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  rc ){.      Tcl_
10110 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
10120 65 72 70 2c 20 73 71 6c 69 74 65 33 45 72 72 53  erp, sqlite3ErrS
10130 74 72 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20  tr(rc), 0);.    
10140 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52    rc = TCL_ERROR
10150 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
10160 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
10170 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62   /*.  **     $db
10180 20 74 69 6d 65 6f 75 74 20 4d 49 4c 4c 45 53 45   timeout MILLESE
10190 43 4f 4e 44 53 0a 20 20 2a 2a 0a 20 20 2a 2a 20  CONDS.  **.  ** 
101a0 44 65 6c 61 79 20 66 6f 72 20 74 68 65 20 6e 75  Delay for the nu
101b0 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63  mber of millisec
101c0 6f 6e 64 73 20 73 70 65 63 69 66 69 65 64 20 77  onds specified w
101d0 68 65 6e 20 61 20 66 69 6c 65 20 69 73 20 6c 6f  hen a file is lo
101e0 63 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  cked..  */.  cas
101f0 65 20 44 42 5f 54 49 4d 45 4f 55 54 3a 20 7b 0a  e DB_TIMEOUT: {.
10200 20 20 20 20 69 6e 74 20 6d 73 3b 0a 20 20 20 20      int ms;.    
10210 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
10220 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
10230 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
10240 20 6f 62 6a 76 2c 20 22 4d 49 4c 4c 49 53 45 43   objv, "MILLISEC
10250 4f 4e 44 53 22 29 3b 0a 20 20 20 20 20 20 72 65  ONDS");.      re
10260 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
10270 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 54 63      }.    if( Tc
10280 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
10290 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
102a0 20 26 6d 73 29 20 29 20 72 65 74 75 72 6e 20 54   &ms) ) return T
102b0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71  CL_ERROR;.    sq
102c0 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f  lite3_busy_timeo
102d0 75 74 28 70 44 62 2d 3e 64 62 2c 20 6d 73 29 3b  ut(pDb->db, ms);
102e0 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
102f0 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20    .  /*.  **    
10300 20 24 64 62 20 74 6f 74 61 6c 5f 63 68 61 6e 67   $db total_chang
10310 65 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74  es.  **.  ** Ret
10320 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
10330 66 20 72 6f 77 73 20 74 68 61 74 20 77 65 72 65  f rows that were
10340 20 6d 6f 64 69 66 69 65 64 2c 20 69 6e 73 65 72   modified, inser
10350 74 65 64 2c 20 6f 72 20 64 65 6c 65 74 65 64 20  ted, or deleted 
10360 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 20  .  ** since the 
10370 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
10380 77 61 73 20 63 72 65 61 74 65 64 2e 0a 20 20 2a  was created..  *
10390 2f 0a 20 20 63 61 73 65 20 44 42 5f 54 4f 54 41  /.  case DB_TOTA
103a0 4c 5f 43 48 41 4e 47 45 53 3a 20 7b 0a 20 20 20  L_CHANGES: {.   
103b0 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c   Tcl_Obj *pResul
103c0 74 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  t;.    if( objc!
103d0 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =2 ){.      Tcl_
103e0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
103f0 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22  erp, 2, objv, ""
10400 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
10410 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
10420 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54  .    pResult = T
10430 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_GetObjResult(
10440 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c  interp);.    Tcl
10450 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52 65 73 75  _SetIntObj(pResu
10460 6c 74 2c 20 73 71 6c 69 74 65 33 5f 74 6f 74 61  lt, sqlite3_tota
10470 6c 5f 63 68 61 6e 67 65 73 28 70 44 62 2d 3e 64  l_changes(pDb->d
10480 62 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  b));.    break;.
10490 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62    }..  /*    $db
104a0 20 74 72 61 63 65 20 3f 43 41 4c 4c 42 41 43 4b   trace ?CALLBACK
104b0 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65  ?.  **.  ** Make
104c0 20 61 72 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f   arrangements to
104d0 20 69 6e 76 6f 6b 65 20 74 68 65 20 43 41 4c 4c   invoke the CALL
104e0 42 41 43 4b 20 72 6f 75 74 69 6e 65 20 66 6f 72  BACK routine for
104f0 20 65 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d   each SQL statem
10500 65 6e 74 0a 20 20 2a 2a 20 74 68 61 74 20 69 73  ent.  ** that is
10510 20 65 78 65 63 75 74 65 64 2e 20 20 54 68 65 20   executed.  The 
10520 74 65 78 74 20 6f 66 20 74 68 65 20 53 51 4c 20  text of the SQL 
10530 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 43  is appended to C
10540 41 4c 4c 42 41 43 4b 20 62 65 66 6f 72 65 0a 20  ALLBACK before. 
10550 20 2a 2a 20 69 74 20 69 73 20 65 78 65 63 75 74   ** it is execut
10560 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ed..  */.  case 
10570 44 42 5f 54 52 41 43 45 3a 20 7b 0a 20 20 20 20  DB_TRACE: {.    
10580 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20  if( objc>3 ){.  
10590 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
105a0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
105b0 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b  objv, "?CALLBACK
105c0 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ?");.      retur
105d0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
105e0 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d   }else if( objc=
105f0 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =2 ){.      if( 
10600 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20  pDb->zTrace ){. 
10610 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
10620 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
10630 70 44 62 2d 3e 7a 54 72 61 63 65 2c 20 30 29 3b  pDb->zTrace, 0);
10640 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
10650 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  se{.      char *
10660 7a 54 72 61 63 65 3b 0a 20 20 20 20 20 20 69 6e  zTrace;.      in
10670 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28  t len;.      if(
10680 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a   pDb->zTrace ){.
10690 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65          Tcl_Free
106a0 28 70 44 62 2d 3e 7a 54 72 61 63 65 29 3b 0a 20  (pDb->zTrace);. 
106b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 72       }.      zTr
106c0 61 63 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ace = Tcl_GetStr
106d0 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
106e0 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20  2], &len);.     
106f0 20 69 66 28 20 7a 54 72 61 63 65 20 26 26 20 6c   if( zTrace && l
10700 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  en>0 ){.        
10710 70 44 62 2d 3e 7a 54 72 61 63 65 20 3d 20 54 63  pDb->zTrace = Tc
10720 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31  l_Alloc( len + 1
10730 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   );.        memc
10740 70 79 28 70 44 62 2d 3e 7a 54 72 61 63 65 2c 20  py(pDb->zTrace, 
10750 7a 54 72 61 63 65 2c 20 6c 65 6e 2b 31 29 3b 0a  zTrace, len+1);.
10760 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
10770 20 20 20 20 20 70 44 62 2d 3e 7a 54 72 61 63 65       pDb->zTrace
10780 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69   = 0;.      }.#i
10790 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
107a0 54 5f 54 52 41 43 45 0a 20 20 20 20 20 20 69 66  T_TRACE.      if
107b0 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b  ( pDb->zTrace ){
107c0 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e  .        pDb->in
107d0 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20  terp = interp;. 
107e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74         sqlite3_t
107f0 72 61 63 65 28 70 44 62 2d 3e 64 62 2c 20 44 62  race(pDb->db, Db
10800 54 72 61 63 65 48 61 6e 64 6c 65 72 2c 20 70 44  TraceHandler, pD
10810 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  b);.      }else{
10820 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
10830 5f 74 72 61 63 65 28 70 44 62 2d 3e 64 62 2c 20  _trace(pDb->db, 
10840 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23  0, 0);.      }.#
10850 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
10860 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
10870 20 20 20 20 24 64 62 20 74 72 61 6e 73 61 63 74      $db transact
10880 69 6f 6e 20 5b 2d 64 65 66 65 72 72 65 64 7c 2d  ion [-deferred|-
10890 69 6d 6d 65 64 69 61 74 65 7c 2d 65 78 63 6c 75  immediate|-exclu
108a0 73 69 76 65 5d 20 53 43 52 49 50 54 0a 20 20 2a  sive] SCRIPT.  *
108b0 2a 0a 20 20 2a 2a 20 53 74 61 72 74 20 61 20 6e  *.  ** Start a n
108c0 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28  ew transaction (
108d0 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c  if we are not al
108e0 72 65 61 64 79 20 69 6e 20 74 68 65 20 6d 69 64  ready in the mid
108f0 73 74 20 6f 66 20 61 0a 20 20 2a 2a 20 74 72 61  st of a.  ** tra
10900 6e 73 61 63 74 69 6f 6e 29 20 61 6e 64 20 65 78  nsaction) and ex
10910 65 63 75 74 65 20 74 68 65 20 54 43 4c 20 73 63  ecute the TCL sc
10920 72 69 70 74 20 53 43 52 49 50 54 2e 20 20 41 66  ript SCRIPT.  Af
10930 74 65 72 20 53 43 52 49 50 54 0a 20 20 2a 2a 20  ter SCRIPT.  ** 
10940 63 6f 6d 70 6c 65 74 65 73 2c 20 65 69 74 68 65  completes, eithe
10950 72 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  r commit the tra
10960 6e 73 61 63 74 69 6f 6e 20 6f 72 20 72 6f 6c 6c  nsaction or roll
10970 20 69 74 20 62 61 63 6b 20 69 66 20 53 43 52 49   it back if SCRI
10980 50 54 0a 20 20 2a 2a 20 74 68 72 6f 77 73 20 61  PT.  ** throws a
10990 6e 20 65 78 63 65 70 74 69 6f 6e 2e 20 20 4f 72  n exception.  Or
109a0 20 69 66 20 6e 6f 20 6e 65 77 20 74 72 61 6e 73   if no new trans
109b0 61 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65  ation was starte
109c0 64 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 20  d, do nothing.. 
109d0 20 2a 2a 20 70 61 73 73 20 74 68 65 20 65 78 63   ** pass the exc
109e0 65 70 74 69 6f 6e 20 6f 6e 20 75 70 20 74 68 65  eption on up the
109f0 20 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a   stack..  **.  *
10a00 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 77  * This command w
10a10 61 73 20 69 6e 73 70 69 72 65 64 20 62 79 20 44  as inspired by D
10a20 61 76 65 20 54 68 6f 6d 61 73 27 73 20 74 61 6c  ave Thomas's tal
10a30 6b 20 6f 6e 20 52 75 62 79 20 61 74 20 74 68 65  k on Ruby at the
10a40 0a 20 20 2a 2a 20 32 30 30 35 20 4f 27 52 65 69  .  ** 2005 O'Rei
10a50 6c 6c 79 20 4f 70 65 6e 20 53 6f 75 72 63 65 20  lly Open Source 
10a60 43 6f 6e 76 65 6e 74 69 6f 6e 20 28 4f 53 43 4f  Convention (OSCO
10a70 4e 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  N)..  */.  case 
10a80 44 42 5f 54 52 41 4e 53 41 43 54 49 4f 4e 3a 20  DB_TRANSACTION: 
10a90 7b 0a 20 20 20 20 69 6e 74 20 69 6e 54 72 61 6e  {.    int inTran
10aa0 73 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  s;.    Tcl_Obj *
10ab0 70 53 63 72 69 70 74 3b 0a 20 20 20 20 63 6f 6e  pScript;.    con
10ac0 73 74 20 63 68 61 72 20 2a 7a 42 65 67 69 6e 20  st char *zBegin 
10ad0 3d 20 22 42 45 47 49 4e 22 3b 0a 20 20 20 20 69  = "BEGIN";.    i
10ae0 66 28 20 6f 62 6a 63 21 3d 33 20 26 26 20 6f 62  f( objc!=3 && ob
10af0 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 54  jc!=4 ){.      T
10b00 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
10b10 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
10b20 20 22 5b 54 59 50 45 5d 20 53 43 52 49 50 54 22   "[TYPE] SCRIPT"
10b30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
10b40 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
10b50 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33  .    if( objc==3
10b60 20 29 7b 0a 20 20 20 20 20 20 70 53 63 72 69 70   ){.      pScrip
10b70 74 20 3d 20 6f 62 6a 76 5b 32 5d 3b 0a 20 20 20  t = objv[2];.   
10b80 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
10b90 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
10ba0 72 20 2a 54 54 59 50 45 5f 73 74 72 73 5b 5d 20  r *TTYPE_strs[] 
10bb0 3d 20 7b 0a 20 20 20 20 20 20 20 20 22 64 65 66  = {.        "def
10bc0 65 72 72 65 64 22 2c 20 20 20 22 65 78 63 6c 75  erred",   "exclu
10bd0 73 69 76 65 22 2c 20 20 22 69 6d 6d 65 64 69 61  sive",  "immedia
10be0 74 65 22 2c 20 30 0a 20 20 20 20 20 20 7d 3b 0a  te", 0.      };.
10bf0 20 20 20 20 20 20 65 6e 75 6d 20 54 54 59 50 45        enum TTYPE
10c00 5f 65 6e 75 6d 20 7b 0a 20 20 20 20 20 20 20 20  _enum {.        
10c10 54 54 59 50 45 5f 44 45 46 45 52 52 45 44 2c 20  TTYPE_DEFERRED, 
10c20 54 54 59 50 45 5f 45 58 43 4c 55 53 49 56 45 2c  TTYPE_EXCLUSIVE,
10c30 20 54 54 59 50 45 5f 49 4d 4d 45 44 49 41 54 45   TTYPE_IMMEDIATE
10c40 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  .      };.      
10c50 69 6e 74 20 74 74 79 70 65 3b 0a 20 20 20 20 20  int ttype;.     
10c60 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 64 65   if( Tcl_GetInde
10c70 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  xFromObj(interp,
10c80 20 6f 62 6a 76 5b 32 5d 2c 20 54 54 59 50 45 5f   objv[2], TTYPE_
10c90 73 74 72 73 2c 20 22 74 72 61 6e 73 61 63 74 69  strs, "transacti
10ca0 6f 6e 20 74 79 70 65 22 2c 0a 20 20 20 20 20 20  on type",.      
10cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cc0 20 20 20 20 20 20 20 20 30 2c 20 26 74 74 79 70          0, &ttyp
10cd0 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  e) ){.        re
10ce0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
10cf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 77        }.      sw
10d00 69 74 63 68 28 20 28 65 6e 75 6d 20 54 54 59 50  itch( (enum TTYP
10d10 45 5f 65 6e 75 6d 29 74 74 79 70 65 20 29 7b 0a  E_enum)ttype ){.
10d20 20 20 20 20 20 20 20 20 63 61 73 65 20 54 54 59          case TTY
10d30 50 45 5f 44 45 46 45 52 52 45 44 3a 20 20 20 20  PE_DEFERRED:    
10d40 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 3b 20 20 20 20  /* no-op */;    
10d50 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
10d60 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
10d70 20 54 54 59 50 45 5f 45 58 43 4c 55 53 49 56 45   TTYPE_EXCLUSIVE
10d80 3a 20 20 20 7a 42 65 67 69 6e 20 3d 20 22 42 45  :   zBegin = "BE
10d90 47 49 4e 20 45 58 43 4c 55 53 49 56 45 22 3b 20  GIN EXCLUSIVE"; 
10da0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
10db0 63 61 73 65 20 54 54 59 50 45 5f 49 4d 4d 45 44  case TTYPE_IMMED
10dc0 49 41 54 45 3a 20 20 20 7a 42 65 67 69 6e 20 3d  IATE:   zBegin =
10dd0 20 22 42 45 47 49 4e 20 49 4d 4d 45 44 49 41 54   "BEGIN IMMEDIAT
10de0 45 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  E";  break;.    
10df0 20 20 7d 0a 20 20 20 20 20 20 70 53 63 72 69 70    }.      pScrip
10e00 74 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20  t = objv[3];.   
10e10 20 7d 0a 20 20 20 20 69 6e 54 72 61 6e 73 20 3d   }.    inTrans =
10e20 20 21 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75   !sqlite3_get_au
10e30 74 6f 63 6f 6d 6d 69 74 28 70 44 62 2d 3e 64 62  tocommit(pDb->db
10e40 29 3b 0a 20 20 20 20 69 66 28 20 21 69 6e 54 72  );.    if( !inTr
10e50 61 6e 73 20 29 7b 0a 20 20 20 20 20 20 70 44 62  ans ){.      pDb
10e60 2d 3e 64 69 73 61 62 6c 65 41 75 74 68 2b 2b 3b  ->disableAuth++;
10e70 0a 20 20 20 20 20 20 28 76 6f 69 64 29 73 71 6c  .      (void)sql
10e80 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64  ite3_exec(pDb->d
10e90 62 2c 20 7a 42 65 67 69 6e 2c 20 30 2c 20 30 2c  b, zBegin, 0, 0,
10ea0 20 30 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e   0);.      pDb->
10eb0 64 69 73 61 62 6c 65 41 75 74 68 2d 2d 3b 0a 20  disableAuth--;. 
10ec0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 54 63     }.    rc = Tc
10ed0 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65  l_EvalObjEx(inte
10ee0 72 70 2c 20 70 53 63 72 69 70 74 2c 20 30 29 3b  rp, pScript, 0);
10ef0 0a 20 20 20 20 69 66 28 20 21 69 6e 54 72 61 6e  .    if( !inTran
10f00 73 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  s ){.      const
10f10 20 63 68 61 72 20 2a 7a 45 6e 64 3b 0a 20 20 20   char *zEnd;.   
10f20 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 45     if( rc==TCL_E
10f30 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 20 20  RROR ){.        
10f40 7a 45 6e 64 20 3d 20 22 52 4f 4c 4c 42 41 43 4b  zEnd = "ROLLBACK
10f50 22 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ";.      } else 
10f60 7b 0a 20 20 20 20 20 20 20 20 7a 45 6e 64 20 3d  {.        zEnd =
10f70 20 22 43 4f 4d 4d 49 54 22 3b 0a 20 20 20 20 20   "COMMIT";.     
10f80 20 7d 0a 20 20 20 20 20 20 70 44 62 2d 3e 64 69   }.      pDb->di
10f90 73 61 62 6c 65 41 75 74 68 2b 2b 3b 0a 20 20 20  sableAuth++;.   
10fa0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 65     if( sqlite3_e
10fb0 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a 45 6e  xec(pDb->db, zEn
10fc0 64 2c 20 30 2c 20 30 2c 20 30 29 20 29 7b 0a 20  d, 0, 0, 0) ){. 
10fd0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
10fe0 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 22 52 4f  xec(pDb->db, "RO
10ff0 4c 4c 42 41 43 4b 22 2c 20 30 2c 20 30 2c 20 30  LLBACK", 0, 0, 0
11000 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
11010 20 70 44 62 2d 3e 64 69 73 61 62 6c 65 41 75 74   pDb->disableAut
11020 68 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  h--;.    }.    b
11030 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
11040 20 20 2a 2a 20 20 20 20 24 64 62 20 75 70 64 61    **    $db upda
11050 74 65 5f 68 6f 6f 6b 20 3f 73 63 72 69 70 74 3f  te_hook ?script?
11060 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 72 6f 6c  .  **    $db rol
11070 6c 62 61 63 6b 5f 68 6f 6f 6b 20 3f 73 63 72 69  lback_hook ?scri
11080 70 74 3f 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  pt?.  */.  case 
11090 44 42 5f 55 50 44 41 54 45 5f 48 4f 4f 4b 3a 20  DB_UPDATE_HOOK: 
110a0 0a 20 20 63 61 73 65 20 44 42 5f 52 4f 4c 4c 42  .  case DB_ROLLB
110b0 41 43 4b 5f 48 4f 4f 4b 3a 20 7b 0a 0a 20 20 20  ACK_HOOK: {..   
110c0 20 2f 2a 20 73 65 74 20 70 70 48 6f 6f 6b 20 74   /* set ppHook t
110d0 6f 20 70 6f 69 6e 74 20 61 74 20 70 55 70 64 61  o point at pUpda
110e0 74 65 48 6f 6f 6b 20 6f 72 20 70 52 6f 6c 6c 62  teHook or pRollb
110f0 61 63 6b 48 6f 6f 6b 2c 20 64 65 70 65 6e 64 69  ackHook, dependi
11100 6e 67 20 6f 6e 20 0a 20 20 20 20 2a 2a 20 77 68  ng on .    ** wh
11110 65 74 68 65 72 20 5b 24 64 62 20 75 70 64 61 74  ether [$db updat
11120 65 5f 68 6f 6f 6b 5d 20 6f 72 20 5b 24 64 62 20  e_hook] or [$db 
11130 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 5d 20 77  rollback_hook] w
11140 61 73 20 69 6e 76 6f 6b 65 64 2e 0a 20 20 20 20  as invoked..    
11150 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  */.    Tcl_Obj *
11160 2a 70 70 48 6f 6f 6b 3b 20 0a 20 20 20 20 69 66  *ppHook; .    if
11170 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f 55 50 44  ( choice==DB_UPD
11180 41 54 45 5f 48 4f 4f 4b 20 29 7b 0a 20 20 20 20  ATE_HOOK ){.    
11190 20 20 70 70 48 6f 6f 6b 20 3d 20 26 70 44 62 2d    ppHook = &pDb-
111a0 3e 70 55 70 64 61 74 65 48 6f 6f 6b 3b 0a 20 20  >pUpdateHook;.  
111b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
111c0 70 48 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e 70 52  pHook = &pDb->pR
111d0 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3b 0a 20 20 20  ollbackHook;.   
111e0 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63   }..    if( objc
111f0 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33 20 29  !=2 && objc!=3 )
11200 7b 0a 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  {.       Tcl_Wro
11210 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
11220 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 53 43 52  , 2, objv, "?SCR
11230 49 50 54 3f 22 29 3b 0a 20 20 20 20 20 20 20 72  IPT?");.       r
11240 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
11250 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 2a  .    }.    if( *
11260 70 70 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 20 20  ppHook ){.      
11270 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
11280 28 69 6e 74 65 72 70 2c 20 2a 70 70 48 6f 6f 6b  (interp, *ppHook
11290 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a  );.      if( obj
112a0 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20  c==3 ){.        
112b0 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
112c0 28 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20 20  (*ppHook);.     
112d0 20 20 20 2a 70 70 48 6f 6f 6b 20 3d 20 30 3b 0a     *ppHook = 0;.
112e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
112f0 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b    if( objc==3 ){
11300 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
11310 28 2a 70 70 48 6f 6f 6b 29 20 29 3b 0a 20 20 20  (*ppHook) );.   
11320 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 43 68     if( Tcl_GetCh
11330 61 72 4c 65 6e 67 74 68 28 6f 62 6a 76 5b 32 5d  arLength(objv[2]
11340 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  )>0 ){.        *
11350 70 70 48 6f 6f 6b 20 3d 20 6f 62 6a 76 5b 32 5d  ppHook = objv[2]
11360 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e  ;.        Tcl_In
11370 63 72 52 65 66 43 6f 75 6e 74 28 2a 70 70 48 6f  crRefCount(*ppHo
11380 6f 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ok);.      }.   
11390 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   }..    sqlite3_
113a0 75 70 64 61 74 65 5f 68 6f 6f 6b 28 70 44 62 2d  update_hook(pDb-
113b0 3e 64 62 2c 20 28 70 44 62 2d 3e 70 55 70 64 61  >db, (pDb->pUpda
113c0 74 65 48 6f 6f 6b 3f 44 62 55 70 64 61 74 65 48  teHook?DbUpdateH
113d0 61 6e 64 6c 65 72 3a 30 29 2c 20 70 44 62 29 3b  andler:0), pDb);
113e0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 6f 6c  .    sqlite3_rol
113f0 6c 62 61 63 6b 5f 68 6f 6f 6b 28 70 44 62 2d 3e  lback_hook(pDb->
11400 64 62 2c 28 70 44 62 2d 3e 70 52 6f 6c 6c 62 61  db,(pDb->pRollba
11410 63 6b 48 6f 6f 6b 3f 44 62 52 6f 6c 6c 62 61 63  ckHook?DbRollbac
11420 6b 48 61 6e 64 6c 65 72 3a 30 29 2c 70 44 62 29  kHandler:0),pDb)
11430 3b 0a 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;..    break;.  
11440 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 76  }..  /*    $db v
11450 65 72 73 69 6f 6e 0a 20 20 2a 2a 0a 20 20 2a 2a  ersion.  **.  **
11460 20 52 65 74 75 72 6e 20 74 68 65 20 76 65 72 73   Return the vers
11470 69 6f 6e 20 73 74 72 69 6e 67 20 66 6f 72 20 74  ion string for t
11480 68 69 73 20 64 61 74 61 62 61 73 65 2e 0a 20 20  his database..  
11490 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 56 45 52  */.  case DB_VER
114a0 53 49 4f 4e 3a 20 7b 0a 20 20 20 20 54 63 6c 5f  SION: {.    Tcl_
114b0 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
114c0 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  , (char *)sqlite
114d0 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28 29 2c 20  3_libversion(), 
114e0 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  TCL_STATIC);.   
114f0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 0a 20 20   break;.  }...  
11500 7d 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  } /* End of the 
11510 53 57 49 54 43 48 20 73 74 61 74 65 6d 65 6e 74  SWITCH statement
11520 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   */.  return rc;
11530 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 73 71 6c 69  .}../*.**   sqli
11540 74 65 33 20 44 42 4e 41 4d 45 20 46 49 4c 45 4e  te3 DBNAME FILEN
11550 41 4d 45 20 3f 2d 76 66 73 20 56 46 53 4e 41 4d  AME ?-vfs VFSNAM
11560 45 3f 20 3f 2d 6b 65 79 20 4b 45 59 3f 20 3f 2d  E? ?-key KEY? ?-
11570 72 65 61 64 6f 6e 6c 79 20 42 4f 4f 4c 45 41 4e  readonly BOOLEAN
11580 3f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ?.**            
11590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3f                 ?
115a0 2d 63 72 65 61 74 65 20 42 4f 4f 4c 45 41 4e 3f  -create BOOLEAN?
115b0 20 3f 2d 6e 6f 6d 75 74 65 78 20 42 4f 4f 4c 45   ?-nomutex BOOLE
115c0 41 4e 3f 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  AN?.**.** This i
115d0 73 20 74 68 65 20 6d 61 69 6e 20 54 63 6c 20 63  s the main Tcl c
115e0 6f 6d 6d 61 6e 64 2e 20 20 57 68 65 6e 20 74 68  ommand.  When th
115f0 65 20 22 73 71 6c 69 74 65 22 20 54 63 6c 20 63  e "sqlite" Tcl c
11600 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 69 6e 76  ommand is.** inv
11610 6f 6b 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69  oked, this routi
11620 6e 65 20 72 75 6e 73 20 74 6f 20 70 72 6f 63 65  ne runs to proce
11630 73 73 20 74 68 61 74 20 63 6f 6d 6d 61 6e 64 2e  ss that command.
11640 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
11650 20 61 72 67 75 6d 65 6e 74 2c 20 44 42 4e 41 4d   argument, DBNAM
11660 45 2c 20 69 73 20 61 6e 20 61 72 62 69 74 72 61  E, is an arbitra
11670 72 79 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65  ry name for a ne
11680 77 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f  w.** database co
11690 6e 6e 65 63 74 69 6f 6e 2e 20 20 54 68 69 73 20  nnection.  This 
116a0 63 6f 6d 6d 61 6e 64 20 63 72 65 61 74 65 73 20  command creates 
116b0 61 20 6e 65 77 20 63 6f 6d 6d 61 6e 64 20 6e 61  a new command na
116c0 6d 65 64 0a 2a 2a 20 44 42 4e 41 4d 45 20 74 68  med.** DBNAME th
116d0 61 74 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f  at is used to co
116e0 6e 74 72 6f 6c 20 74 68 61 74 20 63 6f 6e 6e 65  ntrol that conne
116f0 63 74 69 6f 6e 2e 20 20 54 68 65 20 64 61 74 61  ction.  The data
11700 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  base.** connecti
11710 6f 6e 20 69 73 20 64 65 6c 65 74 65 64 20 77 68  on is deleted wh
11720 65 6e 20 74 68 65 20 44 42 4e 41 4d 45 20 63 6f  en the DBNAME co
11730 6d 6d 61 6e 64 20 69 73 20 64 65 6c 65 74 65 64  mmand is deleted
11740 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f  ..**.** The seco
11750 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  nd argument is t
11760 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
11770 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
11780 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44  .*/.static int D
11790 62 4d 61 69 6e 28 76 6f 69 64 20 2a 63 64 2c 20  bMain(void *cd, 
117a0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
117b0 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 54 63 6c  rp, int objc,Tcl
117c0 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76  _Obj *const*objv
117d0 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  ){.  SqliteDb *p
117e0 3b 0a 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d  ;.  void *pKey =
117f0 20 30 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 20 3d   0;.  int nKey =
11800 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   0;.  const char
11810 20 2a 7a 41 72 67 3b 0a 20 20 63 68 61 72 20 2a   *zArg;.  char *
11820 7a 45 72 72 4d 73 67 3b 0a 20 20 69 6e 74 20 69  zErrMsg;.  int i
11830 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
11840 7a 46 69 6c 65 3b 0a 20 20 63 6f 6e 73 74 20 63  zFile;.  const c
11850 68 61 72 20 2a 7a 56 66 73 20 3d 20 30 3b 0a 20  har *zVfs = 0;. 
11860 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 53 51 4c   int flags = SQL
11870 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
11880 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
11890 5f 43 52 45 41 54 45 3b 0a 20 20 54 63 6c 5f 44  _CREATE;.  Tcl_D
118a0 53 74 72 69 6e 67 20 74 72 61 6e 73 6c 61 74 65  String translate
118b0 64 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 69 66 28  dFilename;.  if(
118c0 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20   objc==2 ){.    
118d0 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74  zArg = Tcl_GetSt
118e0 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
118f0 5b 31 5d 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  [1], 0);.    if(
11900 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 76   strcmp(zArg,"-v
11910 65 72 73 69 6f 6e 22 29 3d 3d 30 20 29 7b 0a 20  ersion")==0 ){. 
11920 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
11930 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 73 71 6c  esult(interp,sql
11940 69 74 65 33 5f 76 65 72 73 69 6f 6e 2c 30 29 3b  ite3_version,0);
11950 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
11960 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  L_OK;.    }.    
11970 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c  if( strcmp(zArg,
11980 22 2d 68 61 73 2d 63 6f 64 65 63 22 29 3d 3d 30  "-has-codec")==0
11990 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
119a0 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20  E_HAS_CODEC.    
119b0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
119c0 6c 74 28 69 6e 74 65 72 70 2c 22 31 22 2c 30 29  lt(interp,"1",0)
119d0 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 54 63  ;.#else.      Tc
119e0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
119f0 6e 74 65 72 70 2c 22 30 22 2c 30 29 3b 0a 23 65  nterp,"0",0);.#e
11a00 6e 64 69 66 0a 20 20 20 20 20 20 72 65 74 75 72  ndif.      retur
11a10 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  n TCL_OK;.    }.
11a20 20 20 7d 0a 20 20 66 6f 72 28 69 3d 33 3b 20 69    }.  for(i=3; i
11a30 2b 31 3c 6f 62 6a 63 3b 20 69 2b 3d 32 29 7b 0a  +1<objc; i+=2){.
11a40 20 20 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47      zArg = Tcl_G
11a50 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69 5d  etString(objv[i]
11a60 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  );.    if( strcm
11a70 70 28 7a 41 72 67 2c 22 2d 6b 65 79 22 29 3d 3d  p(zArg,"-key")==
11a80 30 20 29 7b 0a 20 20 20 20 20 20 70 4b 65 79 20  0 ){.      pKey 
11a90 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  = Tcl_GetByteArr
11aa0 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 69  ayFromObj(objv[i
11ab0 2b 31 5d 2c 20 26 6e 4b 65 79 29 3b 0a 20 20 20  +1], &nKey);.   
11ac0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
11ad0 70 28 7a 41 72 67 2c 20 22 2d 76 66 73 22 29 3d  p(zArg, "-vfs")=
11ae0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b  =0 ){.      i++;
11af0 0a 20 20 20 20 20 20 7a 56 66 73 20 3d 20 54 63  .      zVfs = Tc
11b00 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
11b10 5b 69 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  [i]);.    }else 
11b20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c  if( strcmp(zArg,
11b30 20 22 2d 72 65 61 64 6f 6e 6c 79 22 29 3d 3d 30   "-readonly")==0
11b40 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 3b   ){.      int b;
11b50 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47  .      if( Tcl_G
11b60 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
11b70 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 2b  (interp, objv[i+
11b80 31 5d 2c 20 26 62 29 20 29 20 72 65 74 75 72 6e  1], &b) ) return
11b90 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
11ba0 20 20 69 66 28 20 62 20 29 7b 0a 20 20 20 20 20    if( b ){.     
11bb0 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 28 53 51     flags &= ~(SQ
11bc0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
11bd0 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
11be0 43 52 45 41 54 45 29 3b 0a 20 20 20 20 20 20 20  CREATE);.       
11bf0 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45   flags |= SQLITE
11c00 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a  _OPEN_READONLY;.
11c10 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11c20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53       flags &= ~S
11c30 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
11c40 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 66 6c 61  NLY;.        fla
11c50 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
11c60 4e 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20 20  N_READWRITE;.   
11c70 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
11c80 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20  f( strcmp(zArg, 
11c90 22 2d 63 72 65 61 74 65 22 29 3d 3d 30 20 29 7b  "-create")==0 ){
11ca0 0a 20 20 20 20 20 20 69 6e 74 20 62 3b 0a 20 20  .      int b;.  
11cb0 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42      if( Tcl_GetB
11cc0 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
11cd0 74 65 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c  terp, objv[i+1],
11ce0 20 26 62 29 20 29 20 72 65 74 75 72 6e 20 54 43   &b) ) return TC
11cf0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 69  L_ERROR;.      i
11d00 66 28 20 62 20 26 26 20 28 66 6c 61 67 73 20 26  f( b && (flags &
11d10 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
11d20 44 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20  DONLY)==0 ){.   
11d30 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51       flags |= SQ
11d40 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
11d50 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
11d60 20 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20         flags &= 
11d70 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  ~SQLITE_OPEN_CRE
11d80 41 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ATE;.      }.   
11d90 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
11da0 70 28 7a 41 72 67 2c 20 22 2d 6e 6f 6d 75 74 65  p(zArg, "-nomute
11db0 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  x")==0 ){.      
11dc0 69 6e 74 20 62 3b 0a 20 20 20 20 20 20 69 66 28  int b;.      if(
11dd0 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46   Tcl_GetBooleanF
11de0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
11df0 62 6a 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20  bjv[i+1], &b) ) 
11e00 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
11e10 3b 0a 20 20 20 20 20 20 69 66 28 20 62 20 29 7b  ;.      if( b ){
11e20 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c  .        flags |
11e30 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f  = SQLITE_OPEN_NO
11e40 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 7d 65 6c  MUTEX;.      }el
11e50 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67  se{.        flag
11e60 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45  s &= ~SQLITE_OPE
11e70 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 20 20 20 20 20  N_NOMUTEX;.     
11e80 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
11e90 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
11ea0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e  sult(interp, "un
11eb0 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 22 2c  known option: ",
11ec0 20 7a 41 72 67 2c 20 28 63 68 61 72 2a 29 30 29   zArg, (char*)0)
11ed0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
11ee0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
11ef0 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3c 33    }.  if( objc<3
11f00 20 7c 7c 20 28 6f 62 6a 63 26 31 29 21 3d 31 20   || (objc&1)!=1 
11f10 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
11f20 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
11f30 31 2c 20 6f 62 6a 76 2c 20 0a 20 20 20 20 20 20  1, objv, .      
11f40 22 48 41 4e 44 4c 45 20 46 49 4c 45 4e 41 4d 45  "HANDLE FILENAME
11f50 20 3f 2d 76 66 73 20 56 46 53 4e 41 4d 45 3f 20   ?-vfs VFSNAME? 
11f60 3f 2d 72 65 61 64 6f 6e 6c 79 20 42 4f 4f 4c 45  ?-readonly BOOLE
11f70 41 4e 3f 20 3f 2d 63 72 65 61 74 65 20 42 4f 4f  AN? ?-create BOO
11f80 4c 45 41 4e 3f 22 0a 20 20 20 20 20 20 22 20 3f  LEAN?".      " ?
11f90 2d 6e 6f 6d 75 74 65 78 20 42 4f 4f 4c 45 41 4e  -nomutex BOOLEAN
11fa0 3f 22 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ?".#ifdef SQLITE
11fb0 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 20  _HAS_CODEC.     
11fc0 20 22 20 3f 2d 6b 65 79 20 43 4f 44 45 43 4b 45   " ?-key CODECKE
11fd0 59 3f 22 0a 23 65 6e 64 69 66 0a 20 20 20 20 29  Y?".#endif.    )
11fe0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
11ff0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 45  _ERROR;.  }.  zE
12000 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 20 3d  rrMsg = 0;.  p =
12010 20 28 53 71 6c 69 74 65 44 62 2a 29 54 63 6c 5f   (SqliteDb*)Tcl_
12020 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  Alloc( sizeof(*p
12030 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ) );.  if( p==0 
12040 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65  ){.    Tcl_SetRe
12050 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6d 61  sult(interp, "ma
12060 6c 6c 6f 63 20 66 61 69 6c 65 64 22 2c 20 54 43  lloc failed", TC
12070 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72  L_STATIC);.    r
12080 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
12090 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 2c  .  }.  memset(p,
120a0 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b   0, sizeof(*p));
120b0 0a 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47  .  zFile = Tcl_G
120c0 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
120d0 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 7a  objv[2], 0);.  z
120e0 46 69 6c 65 20 3d 20 54 63 6c 5f 54 72 61 6e 73  File = Tcl_Trans
120f0 6c 61 74 65 46 69 6c 65 4e 61 6d 65 28 69 6e 74  lateFileName(int
12100 65 72 70 2c 20 7a 46 69 6c 65 2c 20 26 74 72 61  erp, zFile, &tra
12110 6e 73 6c 61 74 65 64 46 69 6c 65 6e 61 6d 65 29  nslatedFilename)
12120 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  ;.  sqlite3_open
12130 5f 76 32 28 7a 46 69 6c 65 2c 20 26 70 2d 3e 64  _v2(zFile, &p->d
12140 62 2c 20 66 6c 61 67 73 2c 20 7a 56 66 73 29 3b  b, flags, zVfs);
12150 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72  .  Tcl_DStringFr
12160 65 65 28 26 74 72 61 6e 73 6c 61 74 65 64 46 69  ee(&translatedFi
12170 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 53  lename);.  if( S
12180 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
12190 33 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29  3_errcode(p->db)
121a0 20 29 7b 0a 20 20 20 20 7a 45 72 72 4d 73 67 20   ){.    zErrMsg 
121b0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
121c0 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f  f("%s", sqlite3_
121d0 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a  errmsg(p->db));.
121e0 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
121f0 65 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 70 2d  e(p->db);.    p-
12200 3e 64 62 20 3d 20 30 3b 0a 20 20 7d 0a 23 69 66  >db = 0;.  }.#if
12210 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
12220 4f 44 45 43 0a 20 20 69 66 28 20 70 2d 3e 64 62  ODEC.  if( p->db
12230 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
12240 6b 65 79 28 70 2d 3e 64 62 2c 20 70 4b 65 79 2c  key(p->db, pKey,
12250 20 6e 4b 65 79 29 3b 0a 20 20 7d 0a 23 65 6e 64   nKey);.  }.#end
12260 69 66 0a 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d  if.  if( p->db==
12270 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  0 ){.    Tcl_Set
12280 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
12290 45 72 72 4d 73 67 2c 20 54 43 4c 5f 56 4f 4c 41  ErrMsg, TCL_VOLA
122a0 54 49 4c 45 29 3b 0a 20 20 20 20 54 63 6c 5f 46  TILE);.    Tcl_F
122b0 72 65 65 28 28 63 68 61 72 2a 29 70 29 3b 0a 20  ree((char*)p);. 
122c0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
122d0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 72 65  zErrMsg);.    re
122e0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
122f0 20 20 7d 0a 20 20 70 2d 3e 6d 61 78 53 74 6d 74    }.  p->maxStmt
12300 20 3d 20 4e 55 4d 5f 50 52 45 50 41 52 45 44 5f   = NUM_PREPARED_
12310 53 54 4d 54 53 3b 0a 20 20 70 2d 3e 69 6e 74 65  STMTS;.  p->inte
12320 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 7a  rp = interp;.  z
12330 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Arg = Tcl_GetStr
12340 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
12350 31 5d 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72  1], 0);.  Tcl_Cr
12360 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
12370 6e 74 65 72 70 2c 20 7a 41 72 67 2c 20 44 62 4f  nterp, zArg, DbO
12380 62 6a 43 6d 64 2c 20 28 63 68 61 72 2a 29 70 2c  bjCmd, (char*)p,
12390 20 44 62 44 65 6c 65 74 65 43 6d 64 29 3b 0a 20   DbDeleteCmd);. 
123a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
123b0 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65  }../*.** Provide
123c0 20 61 20 64 75 6d 6d 79 20 54 63 6c 5f 49 6e 69   a dummy Tcl_Ini
123d0 74 53 74 75 62 73 20 69 66 20 77 65 20 61 72 65  tStubs if we are
123e0 20 75 73 69 6e 67 20 74 68 69 73 20 61 73 20 61   using this as a
123f0 20 73 74 61 74 69 63 0a 2a 2a 20 6c 69 62 72 61   static.** libra
12400 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 55  ry..*/.#ifndef U
12410 53 45 5f 54 43 4c 5f 53 54 55 42 53 0a 23 20 75  SE_TCL_STUBS.# u
12420 6e 64 65 66 20 20 54 63 6c 5f 49 6e 69 74 53 74  ndef  Tcl_InitSt
12430 75 62 73 0a 23 20 64 65 66 69 6e 65 20 54 63 6c  ubs.# define Tcl
12440 5f 49 6e 69 74 53 74 75 62 73 28 61 2c 62 2c 63  _InitStubs(a,b,c
12450 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
12460 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76  Make sure we hav
12470 65 20 61 20 50 41 43 4b 41 47 45 5f 56 45 52 53  e a PACKAGE_VERS
12480 49 4f 4e 20 6d 61 63 72 6f 20 64 65 66 69 6e 65  ION macro define
12490 64 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 62 65  d.  This will be
124a0 0a 2a 2a 20 64 65 66 69 6e 65 64 20 61 75 74 6f  .** defined auto
124b0 6d 61 74 69 63 61 6c 6c 79 20 62 79 20 74 68 65  matically by the
124c0 20 54 45 41 20 6d 61 6b 65 66 69 6c 65 2e 20 20   TEA makefile.  
124d0 42 75 74 20 6f 74 68 65 72 20 6d 61 6b 65 66 69  But other makefi
124e0 6c 65 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 64 65  les.** do not de
124f0 66 69 6e 65 20 69 74 2e 0a 2a 2f 0a 23 69 66 6e  fine it..*/.#ifn
12500 64 65 66 20 50 41 43 4b 41 47 45 5f 56 45 52 53  def PACKAGE_VERS
12510 49 4f 4e 0a 23 20 64 65 66 69 6e 65 20 50 41 43  ION.# define PAC
12520 4b 41 47 45 5f 56 45 52 53 49 4f 4e 20 53 51 4c  KAGE_VERSION SQL
12530 49 54 45 5f 56 45 52 53 49 4f 4e 0a 23 65 6e 64  ITE_VERSION.#end
12540 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  if../*.** Initia
12550 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c 65  lize this module
12560 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 63 6c  ..**.** This Tcl
12570 20 6d 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73   module contains
12580 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 6e   only a single n
12590 65 77 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 6e  ew Tcl command n
125a0 61 6d 65 64 20 22 73 71 6c 69 74 65 22 2e 0a 2a  amed "sqlite"..*
125b0 2a 20 28 48 65 6e 63 65 20 74 68 65 72 65 20 69  * (Hence there i
125c0 73 20 6e 6f 20 6e 61 6d 65 73 70 61 63 65 2e 20  s no namespace. 
125d0 20 54 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69   There is no poi
125e0 6e 74 20 69 6e 20 75 73 69 6e 67 20 61 20 6e 61  nt in using a na
125f0 6d 65 73 70 61 63 65 0a 2a 2a 20 69 66 20 74 68  mespace.** if th
12600 65 20 65 78 74 65 6e 73 69 6f 6e 20 6f 6e 6c 79  e extension only
12610 20 73 75 70 70 6c 69 65 73 20 6f 6e 65 20 6e 65   supplies one ne
12620 77 20 6e 61 6d 65 21 29 20 20 54 68 65 20 22 73  w name!)  The "s
12630 71 6c 69 74 65 22 20 63 6f 6d 6d 61 6e 64 20 69  qlite" command i
12640 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 6f 70 65  s.** used to ope
12650 6e 20 61 20 6e 65 77 20 53 51 4c 69 74 65 20 64  n a new SQLite d
12660 61 74 61 62 61 73 65 2e 20 20 53 65 65 20 74 68  atabase.  See th
12670 65 20 44 62 4d 61 69 6e 28 29 20 72 6f 75 74 69  e DbMain() routi
12680 6e 65 20 61 62 6f 76 65 0a 2a 2a 20 66 6f 72 20  ne above.** for 
12690 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
126a0 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 45 58 54 45 52  mation..*/.EXTER
126b0 4e 20 69 6e 74 20 53 71 6c 69 74 65 33 5f 49 6e  N int Sqlite3_In
126c0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
126d0 6e 74 65 72 70 29 7b 0a 20 20 54 63 6c 5f 49 6e  nterp){.  Tcl_In
126e0 69 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c 20  itStubs(interp, 
126f0 22 38 2e 34 22 2c 20 30 29 3b 0a 20 20 54 63 6c  "8.4", 0);.  Tcl
12700 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
12710 64 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  d(interp, "sqlit
12720 65 33 22 2c 20 28 54 63 6c 5f 4f 62 6a 43 6d 64  e3", (Tcl_ObjCmd
12730 50 72 6f 63 2a 29 44 62 4d 61 69 6e 2c 20 30 2c  Proc*)DbMain, 0,
12740 20 30 29 3b 0a 20 20 54 63 6c 5f 50 6b 67 50 72   0);.  Tcl_PkgPr
12750 6f 76 69 64 65 28 69 6e 74 65 72 70 2c 20 22 73  ovide(interp, "s
12760 71 6c 69 74 65 33 22 2c 20 50 41 43 4b 41 47 45  qlite3", PACKAGE
12770 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20 54 63 6c  _VERSION);.  Tcl
12780 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
12790 64 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  d(interp, "sqlit
127a0 65 22 2c 20 28 54 63 6c 5f 4f 62 6a 43 6d 64 50  e", (Tcl_ObjCmdP
127b0 72 6f 63 2a 29 44 62 4d 61 69 6e 2c 20 30 2c 20  roc*)DbMain, 0, 
127c0 30 29 3b 0a 20 20 54 63 6c 5f 50 6b 67 50 72 6f  0);.  Tcl_PkgPro
127d0 76 69 64 65 28 69 6e 74 65 72 70 2c 20 22 73 71  vide(interp, "sq
127e0 6c 69 74 65 22 2c 20 50 41 43 4b 41 47 45 5f 56  lite", PACKAGE_V
127f0 45 52 53 49 4f 4e 29 3b 0a 20 20 72 65 74 75 72  ERSION);.  retur
12800 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 45 58 54 45  n TCL_OK;.}.EXTE
12810 52 4e 20 69 6e 74 20 54 63 6c 73 71 6c 69 74 65  RN int Tclsqlite
12820 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  3_Init(Tcl_Inter
12830 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75  p *interp){ retu
12840 72 6e 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28  rn Sqlite3_Init(
12850 69 6e 74 65 72 70 29 3b 20 7d 0a 45 58 54 45 52  interp); }.EXTER
12860 4e 20 69 6e 74 20 53 71 6c 69 74 65 33 5f 53 61  N int Sqlite3_Sa
12870 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  feInit(Tcl_Inter
12880 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75  p *interp){ retu
12890 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58 54  rn TCL_OK; }.EXT
128a0 45 52 4e 20 69 6e 74 20 54 63 6c 73 71 6c 69 74  ERN int Tclsqlit
128b0 65 33 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f  e3_SafeInit(Tcl_
128c0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
128d0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
128e0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
128f0 45 5f 33 5f 53 55 46 46 49 58 5f 4f 4e 4c 59 0a  E_3_SUFFIX_ONLY.
12900 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74  EXTERN int Sqlit
12910 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  e_Init(Tcl_Inter
12920 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75  p *interp){ retu
12930 72 6e 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28  rn Sqlite3_Init(
12940 69 6e 74 65 72 70 29 3b 20 7d 0a 45 58 54 45 52  interp); }.EXTER
12950 4e 20 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 5f  N int Tclsqlite_
12960 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
12970 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e  *interp){ return
12980 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e   Sqlite3_Init(in
12990 74 65 72 70 29 3b 20 7d 0a 45 58 54 45 52 4e 20  terp); }.EXTERN 
129a0 69 6e 74 20 53 71 6c 69 74 65 5f 53 61 66 65 49  int Sqlite_SafeI
129b0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
129c0 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20  interp){ return 
129d0 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e  TCL_OK; }.EXTERN
129e0 20 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 5f 53   int Tclsqlite_S
129f0 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  afeInit(Tcl_Inte
12a00 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74  rp *interp){ ret
12a10 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 23 65  urn TCL_OK; }.#e
12a20 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 54 43 4c  ndif..#ifdef TCL
12a30 53 48 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  SH./************
12a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12a80 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 74 68  *.** The code th
12a90 61 74 20 66 6f 6c 6c 6f 77 73 20 69 73 20 75 73  at follows is us
12aa0 65 64 20 74 6f 20 62 75 69 6c 64 20 73 74 61 6e  ed to build stan
12ab0 64 61 6c 6f 6e 65 20 54 43 4c 20 69 6e 74 65 72  dalone TCL inter
12ac0 70 72 65 74 65 72 73 0a 2a 2a 20 74 68 61 74 20  preters.** that 
12ad0 61 72 65 20 73 74 61 74 69 63 61 6c 6c 79 20 6c  are statically l
12ae0 69 6e 6b 65 64 20 77 69 74 68 20 53 51 4c 69 74  inked with SQLit
12af0 65 2e 20 20 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49  e.  .*/../*.** I
12b00 66 20 74 68 65 20 6d 61 63 72 6f 20 54 43 4c 53  f the macro TCLS
12b10 48 20 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 70  H is one, then p
12b20 75 74 20 69 6e 20 63 6f 64 65 20 74 68 69 73 20  ut in code this 
12b30 66 6f 72 20 74 68 65 0a 2a 2a 20 22 6d 61 69 6e  for the.** "main
12b40 22 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77  " routine that w
12b50 69 6c 6c 20 69 6e 69 74 69 61 6c 69 7a 65 20 54  ill initialize T
12b60 63 6c 20 61 6e 64 20 74 61 6b 65 20 69 6e 70 75  cl and take inpu
12b70 74 20 66 72 6f 6d 0a 2a 2a 20 73 74 61 6e 64 61  t from.** standa
12b80 72 64 20 69 6e 70 75 74 2c 20 6f 72 20 69 66 20  rd input, or if 
12b90 61 20 66 69 6c 65 20 69 73 20 6e 61 6d 65 64 20  a file is named 
12ba0 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c  on the command l
12bb0 69 6e 65 0a 2a 2a 20 74 68 65 20 54 43 4c 20 69  ine.** the TCL i
12bc0 6e 74 65 72 70 72 65 74 65 72 20 72 65 61 64 73  nterpreter reads
12bd0 20 61 6e 64 20 65 76 61 6c 75 61 74 65 73 20 74   and evaluates t
12be0 68 61 74 20 66 69 6c 65 2e 0a 2a 2f 0a 23 69 66  hat file..*/.#if
12bf0 20 54 43 4c 53 48 3d 3d 31 0a 73 74 61 74 69 63   TCLSH==1.static
12c00 20 63 68 61 72 20 7a 4d 61 69 6e 6c 6f 6f 70 5b   char zMainloop[
12c10 5d 20 3d 0a 20 20 22 73 65 74 20 6c 69 6e 65 20  ] =.  "set line 
12c20 7b 7d 5c 6e 22 0a 20 20 22 77 68 69 6c 65 20 7b  {}\n".  "while {
12c30 21 5b 65 6f 66 20 73 74 64 69 6e 5d 7d 20 7b 5c  ![eof stdin]} {\
12c40 6e 22 0a 20 20 20 20 22 69 66 20 7b 24 6c 69 6e  n".    "if {$lin
12c50 65 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20  e!=\"\"} {\n".  
12c60 20 20 20 20 22 70 75 74 73 20 2d 6e 6f 6e 65 77      "puts -nonew
12c70 6c 69 6e 65 20 5c 22 3e 20 5c 22 5c 6e 22 0a 20  line \"> \"\n". 
12c80 20 20 20 22 7d 20 65 6c 73 65 20 7b 5c 6e 22 0a     "} else {\n".
12c90 20 20 20 20 20 20 22 70 75 74 73 20 2d 6e 6f 6e        "puts -non
12ca0 65 77 6c 69 6e 65 20 5c 22 25 20 5c 22 5c 6e 22  ewline \"% \"\n"
12cb0 0a 20 20 20 20 22 7d 5c 6e 22 0a 20 20 20 20 22  .    "}\n".    "
12cc0 66 6c 75 73 68 20 73 74 64 6f 75 74 5c 6e 22 0a  flush stdout\n".
12cd0 20 20 20 20 22 61 70 70 65 6e 64 20 6c 69 6e 65      "append line
12ce0 20 5b 67 65 74 73 20 73 74 64 69 6e 5d 5c 6e 22   [gets stdin]\n"
12cf0 0a 20 20 20 20 22 69 66 20 7b 5b 69 6e 66 6f 20  .    "if {[info 
12d00 63 6f 6d 70 6c 65 74 65 20 24 6c 69 6e 65 5d 7d  complete $line]}
12d10 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 69 66 20   {\n".      "if 
12d20 7b 5b 63 61 74 63 68 20 7b 75 70 6c 65 76 65 6c  {[catch {uplevel
12d30 20 23 30 20 24 6c 69 6e 65 7d 20 72 65 73 75 6c   #0 $line} resul
12d40 74 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20  t]} {\n".       
12d50 20 22 70 75 74 73 20 73 74 64 65 72 72 20 5c 22   "puts stderr \"
12d60 45 72 72 6f 72 3a 20 24 72 65 73 75 6c 74 5c 22  Error: $result\"
12d70 5c 6e 22 0a 20 20 20 20 20 20 22 7d 20 65 6c 73  \n".      "} els
12d80 65 69 66 20 7b 24 72 65 73 75 6c 74 21 3d 5c 22  eif {$result!=\"
12d90 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20  \"} {\n".       
12da0 20 22 70 75 74 73 20 24 72 65 73 75 6c 74 5c 6e   "puts $result\n
12db0 22 0a 20 20 20 20 20 20 22 7d 5c 6e 22 0a 20 20  ".      "}\n".  
12dc0 20 20 20 20 22 73 65 74 20 6c 69 6e 65 20 7b 7d      "set line {}
12dd0 5c 6e 22 0a 20 20 20 20 22 7d 20 65 6c 73 65 20  \n".    "} else 
12de0 7b 5c 6e 22 0a 20 20 20 20 20 20 22 61 70 70 65  {\n".      "appe
12df0 6e 64 20 6c 69 6e 65 20 5c 5c 6e 5c 6e 22 0a 20  nd line \\n\n". 
12e00 20 20 20 22 7d 5c 6e 22 0a 20 20 22 7d 5c 6e 22     "}\n".  "}\n"
12e10 0a 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .;.#endif../*.**
12e20 20 49 66 20 74 68 65 20 6d 61 63 72 6f 20 54 43   If the macro TC
12e30 4c 53 48 20 69 73 20 74 77 6f 2c 20 74 68 65 6e  LSH is two, then
12e40 20 67 65 74 20 74 68 65 20 6d 61 69 6e 20 6c 6f   get the main lo
12e50 6f 70 20 63 6f 64 65 20 6f 75 74 20 6f 66 0a 2a  op code out of.*
12e60 2a 20 74 68 65 20 73 65 70 61 72 61 74 65 20 66  * the separate f
12e70 69 6c 65 20 22 73 70 61 63 65 61 6e 61 6c 5f 74  ile "spaceanal_t
12e80 63 6c 2e 68 22 2e 0a 2a 2f 0a 23 69 66 20 54 43  cl.h"..*/.#if TC
12e90 4c 53 48 3d 3d 32 0a 73 74 61 74 69 63 20 63 68  LSH==2.static ch
12ea0 61 72 20 7a 4d 61 69 6e 6c 6f 6f 70 5b 5d 20 3d  ar zMainloop[] =
12eb0 20 0a 23 69 6e 63 6c 75 64 65 20 22 73 70 61 63   .#include "spac
12ec0 65 61 6e 61 6c 5f 74 63 6c 2e 68 22 0a 3b 0a 23  eanal_tcl.h".;.#
12ed0 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 54  endif..#define T
12ee0 43 4c 53 48 5f 4d 41 49 4e 20 6d 61 69 6e 20 20  CLSH_MAIN main  
12ef0 20 2f 2a 20 4e 65 65 64 65 64 20 74 6f 20 66 61   /* Needed to fa
12f00 6b 65 20 6f 75 74 20 6d 6b 74 63 6c 61 70 70 20  ke out mktclapp 
12f10 2a 2f 0a 69 6e 74 20 54 43 4c 53 48 5f 4d 41 49  */.int TCLSH_MAI
12f20 4e 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72  N(int argc, char
12f30 20 2a 2a 61 72 67 76 29 7b 0a 20 20 54 63 6c 5f   **argv){.  Tcl_
12f40 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a  Interp *interp;.
12f50 20 20 54 63 6c 5f 46 69 6e 64 45 78 65 63 75 74    Tcl_FindExecut
12f60 61 62 6c 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20  able(argv[0]);. 
12f70 20 69 6e 74 65 72 70 20 3d 20 54 63 6c 5f 43 72   interp = Tcl_Cr
12f80 65 61 74 65 49 6e 74 65 72 70 28 29 3b 0a 20 20  eateInterp();.  
12f90 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74  Sqlite3_Init(int
12fa0 65 72 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  erp);.#ifdef SQL
12fb0 49 54 45 5f 54 45 53 54 0a 20 20 7b 0a 20 20 20  ITE_TEST.  {.   
12fc0 20 65 78 74 65 72 6e 20 69 6e 74 20 4d 64 35 5f   extern int Md5_
12fd0 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
12fe0 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
12ff0 74 20 53 71 6c 69 74 65 63 6f 6e 66 69 67 5f 49  t Sqliteconfig_I
13000 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
13010 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
13020 20 53 71 6c 69 74 65 74 65 73 74 31 5f 49 6e 69   Sqlitetest1_Ini
13030 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
13040 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
13050 71 6c 69 74 65 74 65 73 74 32 5f 49 6e 69 74 28  qlitetest2_Init(
13060 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
13070 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
13080 69 74 65 74 65 73 74 33 5f 49 6e 69 74 28 54 63  itetest3_Init(Tc
13090 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
130a0 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
130b0 65 74 65 73 74 34 5f 49 6e 69 74 28 54 63 6c 5f  etest4_Init(Tcl_
130c0 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
130d0 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
130e0 65 73 74 35 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  est5_Init(Tcl_In
130f0 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
13100 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
13110 74 36 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  t6_Init(Tcl_Inte
13120 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
13130 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 37   int Sqlitetest7
13140 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
13150 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
13160 6e 74 20 53 71 6c 69 74 65 74 65 73 74 38 5f 49  nt Sqlitetest8_I
13170 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
13180 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
13190 20 53 71 6c 69 74 65 74 65 73 74 39 5f 49 6e 69   Sqlitetest9_Ini
131a0 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
131b0 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
131c0 71 6c 69 74 65 74 65 73 74 61 73 79 6e 63 5f 49  qlitetestasync_I
131d0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
131e0 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
131f0 20 53 71 6c 69 74 65 74 65 73 74 5f 61 75 74 6f   Sqlitetest_auto
13200 65 78 74 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  ext_Init(Tcl_Int
13210 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
13220 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
13230 5f 66 75 6e 63 5f 49 6e 69 74 28 54 63 6c 5f 49  _func_Init(Tcl_I
13240 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
13250 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
13260 73 74 5f 68 65 78 69 6f 5f 49 6e 69 74 28 54 63  st_hexio_Init(Tc
13270 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
13280 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
13290 65 74 65 73 74 5f 6d 61 6c 6c 6f 63 5f 49 6e 69  etest_malloc_Ini
132a0 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
132b0 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
132c0 71 6c 69 74 65 74 65 73 74 5f 6d 75 74 65 78 5f  qlitetest_mutex_
132d0 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
132e0 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
132f0 74 20 53 71 6c 69 74 65 74 65 73 74 73 63 68 65  t Sqlitetestsche
13300 6d 61 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  ma_Init(Tcl_Inte
13310 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
13320 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 73   int Sqlitetests
13330 73 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  se_Init(Tcl_Inte
13340 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
13350 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 74   int Sqlitetestt
13360 63 6c 76 61 72 5f 49 6e 69 74 28 54 63 6c 5f 49  clvar_Init(Tcl_I
13370 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
13380 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
13390 73 74 54 68 72 65 61 64 5f 49 6e 69 74 28 54 63  stThread_Init(Tc
133a0 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
133b0 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
133c0 65 74 65 73 74 4f 6e 65 66 69 6c 65 5f 49 6e 69  etestOnefile_Ini
133d0 74 28 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  t();.    extern 
133e0 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 4f 73  int SqlitetestOs
133f0 69 6e 73 74 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  inst_Init(Tcl_In
13400 74 65 72 70 2a 29 3b 0a 0a 20 20 20 20 4d 64 35  terp*);..    Md5
13410 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
13420 20 20 20 53 71 6c 69 74 65 63 6f 6e 66 69 67 5f     Sqliteconfig_
13430 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
13440 20 20 53 71 6c 69 74 65 74 65 73 74 31 5f 49 6e    Sqlitetest1_In
13450 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
13460 53 71 6c 69 74 65 74 65 73 74 32 5f 49 6e 69 74  Sqlitetest2_Init
13470 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
13480 6c 69 74 65 74 65 73 74 33 5f 49 6e 69 74 28 69  litetest3_Init(i
13490 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
134a0 74 65 74 65 73 74 34 5f 49 6e 69 74 28 69 6e 74  tetest4_Init(int
134b0 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
134c0 74 65 73 74 35 5f 49 6e 69 74 28 69 6e 74 65 72  test5_Init(inter
134d0 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
134e0 73 74 36 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  st6_Init(interp)
134f0 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
13500 37 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  7_Init(interp);.
13510 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 38 5f      Sqlitetest8_
13520 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
13530 20 20 53 71 6c 69 74 65 74 65 73 74 39 5f 49 6e    Sqlitetest9_In
13540 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
13550 53 71 6c 69 74 65 74 65 73 74 61 73 79 6e 63 5f  Sqlitetestasync_
13560 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
13570 20 20 53 71 6c 69 74 65 74 65 73 74 5f 61 75 74    Sqlitetest_aut
13580 6f 65 78 74 5f 49 6e 69 74 28 69 6e 74 65 72 70  oext_Init(interp
13590 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
135a0 74 5f 66 75 6e 63 5f 49 6e 69 74 28 69 6e 74 65  t_func_Init(inte
135b0 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
135c0 65 73 74 5f 68 65 78 69 6f 5f 49 6e 69 74 28 69  est_hexio_Init(i
135d0 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
135e0 74 65 74 65 73 74 5f 6d 61 6c 6c 6f 63 5f 49 6e  tetest_malloc_In
135f0 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
13600 53 71 6c 69 74 65 74 65 73 74 5f 6d 75 74 65 78  Sqlitetest_mutex
13610 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
13620 20 20 20 53 71 6c 69 74 65 74 65 73 74 73 63 68     Sqlitetestsch
13630 65 6d 61 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  ema_Init(interp)
13640 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
13650 74 63 6c 76 61 72 5f 49 6e 69 74 28 69 6e 74 65  tclvar_Init(inte
13660 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
13670 65 73 74 54 68 72 65 61 64 5f 49 6e 69 74 28 69  estThread_Init(i
13680 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
13690 74 65 74 65 73 74 4f 6e 65 66 69 6c 65 5f 49 6e  tetestOnefile_In
136a0 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
136b0 53 71 6c 69 74 65 74 65 73 74 4f 73 69 6e 73 74  SqlitetestOsinst
136c0 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 0a  _Init(interp);..
136d0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 53  #ifdef SQLITE_SS
136e0 45 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  E.    Sqlitetest
136f0 73 73 65 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  sse_Init(interp)
13700 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e  ;.#endif.  }.#en
13710 64 69 66 0a 20 20 69 66 28 20 61 72 67 63 3e 3d  dif.  if( argc>=
13720 32 20 7c 7c 20 54 43 4c 53 48 3d 3d 32 20 29 7b  2 || TCLSH==2 ){
13730 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
13740 63 68 61 72 20 7a 41 72 67 63 5b 33 32 5d 3b 0a  char zArgc[32];.
13750 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
13760 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 41 72 67  intf(sizeof(zArg
13770 63 29 2c 20 7a 41 72 67 63 2c 20 22 25 64 22 2c  c), zArgc, "%d",
13780 20 61 72 67 63 2d 28 33 2d 54 43 4c 53 48 29 29   argc-(3-TCLSH))
13790 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72  ;.    Tcl_SetVar
137a0 28 69 6e 74 65 72 70 2c 22 61 72 67 63 22 2c 20  (interp,"argc", 
137b0 7a 41 72 67 63 2c 20 54 43 4c 5f 47 4c 4f 42 41  zArgc, TCL_GLOBA
137c0 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 54 63 6c  L_ONLY);.    Tcl
137d0 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 22  _SetVar(interp,"
137e0 61 72 67 76 30 22 2c 61 72 67 76 5b 31 5d 2c 54  argv0",argv[1],T
137f0 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
13800 0a 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28  .    Tcl_SetVar(
13810 69 6e 74 65 72 70 2c 22 61 72 67 76 22 2c 20 22  interp,"argv", "
13820 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e  ", TCL_GLOBAL_ON
13830 4c 59 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 33  LY);.    for(i=3
13840 2d 54 43 4c 53 48 3b 20 69 3c 61 72 67 63 3b 20  -TCLSH; i<argc; 
13850 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  i++){.      Tcl_
13860 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 20 22  SetVar(interp, "
13870 61 72 67 76 22 2c 20 61 72 67 76 5b 69 5d 2c 0a  argv", argv[i],.
13880 20 20 20 20 20 20 20 20 20 20 54 43 4c 5f 47 4c            TCL_GL
13890 4f 42 41 4c 5f 4f 4e 4c 59 20 7c 20 54 43 4c 5f  OBAL_ONLY | TCL_
138a0 4c 49 53 54 5f 45 4c 45 4d 45 4e 54 20 7c 20 54  LIST_ELEMENT | T
138b0 43 4c 5f 41 50 50 45 4e 44 5f 56 41 4c 55 45 29  CL_APPEND_VALUE)
138c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
138d0 54 43 4c 53 48 3d 3d 31 20 26 26 20 54 63 6c 5f  TCLSH==1 && Tcl_
138e0 45 76 61 6c 46 69 6c 65 28 69 6e 74 65 72 70 2c  EvalFile(interp,
138f0 20 61 72 67 76 5b 31 5d 29 21 3d 54 43 4c 5f 4f   argv[1])!=TCL_O
13900 4b 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  K ){.      const
13910 20 63 68 61 72 20 2a 7a 49 6e 66 6f 20 3d 20 54   char *zInfo = T
13920 63 6c 5f 47 65 74 56 61 72 28 69 6e 74 65 72 70  cl_GetVar(interp
13930 2c 20 22 65 72 72 6f 72 49 6e 66 6f 22 2c 20 54  , "errorInfo", T
13940 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
13950 0a 20 20 20 20 20 20 69 66 28 20 7a 49 6e 66 6f  .      if( zInfo
13960 3d 3d 30 20 29 20 7a 49 6e 66 6f 20 3d 20 69 6e  ==0 ) zInfo = in
13970 74 65 72 70 2d 3e 72 65 73 75 6c 74 3b 0a 20 20  terp->result;.  
13980 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
13990 72 72 2c 22 25 73 3a 20 25 73 5c 6e 22 2c 20 2a  rr,"%s: %s\n", *
139a0 61 72 67 76 2c 20 7a 49 6e 66 6f 29 3b 0a 20 20  argv, zInfo);.  
139b0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
139c0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 61 72    }.  }.  if( ar
139d0 67 63 3c 3d 31 20 7c 7c 20 54 43 4c 53 48 3d 3d  gc<=1 || TCLSH==
139e0 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 47 6c 6f  2 ){.    Tcl_Glo
139f0 62 61 6c 45 76 61 6c 28 69 6e 74 65 72 70 2c 20  balEval(interp, 
13a00 7a 4d 61 69 6e 6c 6f 6f 70 29 3b 0a 20 20 7d 0a  zMainloop);.  }.
13a10 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
13a20 6e 64 69 66 20 2f 2a 20 54 43 4c 53 48 20 2a 2f  ndif /* TCLSH */
13a30 0a                                               .