/ Hex Artifact Content
Login

Artifact f431fe065a024e80b32a4691bab73beaccda024e:


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 32 20 32 30 30 38  e.c,v 1.222 2008
0220: 2f 30 39 2f 30 33 20 30 30 3a 34 33 3a 31 35 20  /09/03 00:43:15 
0230: 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e  drh Exp $.*/.#in
0240: 63 6c 75 64 65 20 22 74 63 6c 2e 68 22 0a 23 69  clude "tcl.h".#i
0250: 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e 68 3e  nclude <errno.h>
0260: 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 61 64 64  ../*.** Some add
0270: 69 74 69 6f 6e 61 6c 20 69 6e 63 6c 75 64 65 20  itional include 
0280: 66 69 6c 65 73 20 61 72 65 20 6e 65 65 64 65 64  files are needed
0290: 20 69 66 20 74 68 69 73 20 66 69 6c 65 20 69 73   if this file is
02a0: 20 6e 6f 74 0a 2a 2a 20 61 70 70 65 6e 64 65 64   not.** appended
02b0: 20 74 6f 20 74 68 65 20 61 6d 61 6c 67 61 6d 61   to the amalgama
02c0: 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tion..*/.#ifndef
02d0: 20 53 51 4c 49 54 45 5f 41 4d 41 4c 47 41 4d 41   SQLITE_AMALGAMA
02e0: 54 49 4f 4e 0a 23 20 69 6e 63 6c 75 64 65 20 22  TION.# include "
02f0: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 20 69  sqliteInt.h".# i
0300: 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e 68  nclude <stdlib.h
0310: 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 74 72  >.# include <str
0320: 69 6e 67 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65  ing.h>.# include
0330: 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23 20 69 6e   <assert.h>.# in
0340: 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a  clude <ctype.h>.
0350: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 57 69  #endif../*. * Wi
0360: 6e 64 6f 77 73 20 6e 65 65 64 73 20 74 6f 20 6b  ndows needs to k
0370: 6e 6f 77 20 77 68 69 63 68 20 73 79 6d 62 6f 6c  now which symbol
0380: 73 20 74 6f 20 65 78 70 6f 72 74 2e 20 20 55 6e  s to export.  Un
0390: 69 78 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 2a 20  ix does not.. * 
03a0: 42 55 49 4c 44 5f 73 71 6c 69 74 65 20 73 68 6f  BUILD_sqlite sho
03b0: 75 6c 64 20 62 65 20 75 6e 64 65 66 69 6e 65 64  uld be undefined
03c0: 20 66 6f 72 20 55 6e 69 78 2e 0a 20 2a 2f 0a 23   for Unix.. */.#
03d0: 69 66 64 65 66 20 42 55 49 4c 44 5f 73 71 6c 69  ifdef BUILD_sqli
03e0: 74 65 0a 23 75 6e 64 65 66 20 54 43 4c 5f 53 54  te.#undef TCL_ST
03f0: 4f 52 41 47 45 5f 43 4c 41 53 53 0a 23 64 65 66  ORAGE_CLASS.#def
0400: 69 6e 65 20 54 43 4c 5f 53 54 4f 52 41 47 45 5f  ine TCL_STORAGE_
0410: 43 4c 41 53 53 20 44 4c 4c 45 58 50 4f 52 54 0a  CLASS DLLEXPORT.
0420: 23 65 6e 64 69 66 20 2f 2a 20 42 55 49 4c 44 5f  #endif /* BUILD_
0430: 73 71 6c 69 74 65 20 2a 2f 0a 0a 23 64 65 66 69  sqlite */..#defi
0440: 6e 65 20 4e 55 4d 5f 50 52 45 50 41 52 45 44 5f  ne NUM_PREPARED_
0450: 53 54 4d 54 53 20 31 30 0a 23 64 65 66 69 6e 65  STMTS 10.#define
0460: 20 4d 41 58 5f 50 52 45 50 41 52 45 44 5f 53 54   MAX_PREPARED_ST
0470: 4d 54 53 20 31 30 30 0a 0a 2f 2a 0a 2a 2a 20 49  MTS 100../*.** I
0480: 66 20 54 43 4c 20 75 73 65 73 20 55 54 46 2d 38  f TCL uses UTF-8
0490: 20 61 6e 64 20 53 51 4c 69 74 65 20 69 73 20 63   and SQLite is c
04a0: 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73 65  onfigured to use
04b0: 20 69 73 6f 38 38 35 39 2c 20 74 68 65 6e 20 77   iso8859, then w
04c0: 65 0a 2a 2a 20 68 61 76 65 20 74 6f 20 64 6f 20  e.** have to do 
04d0: 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 77 68  a translation wh
04e0: 65 6e 20 67 6f 69 6e 67 20 62 65 74 77 65 65 6e  en going between
04f0: 20 74 68 65 20 74 77 6f 2e 20 20 53 65 74 20 74   the two.  Set t
0500: 68 65 20 0a 2a 2a 20 55 54 46 5f 54 52 41 4e 53  he .** UTF_TRANS
0510: 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 20 6d 61  LATION_NEEDED ma
0520: 63 72 6f 20 74 6f 20 69 6e 64 69 63 61 74 65 20  cro to indicate 
0530: 74 68 61 74 20 77 65 20 6e 65 65 64 20 74 6f 20  that we need to 
0540: 64 6f 0a 2a 2a 20 74 68 69 73 20 74 72 61 6e 73  do.** this trans
0550: 6c 61 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 23 69 66  lation.  .*/.#if
0560: 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 55 54 46   defined(TCL_UTF
0570: 5f 4d 41 58 29 20 26 26 20 21 64 65 66 69 6e 65  _MAX) && !define
0580: 64 28 53 51 4c 49 54 45 5f 55 54 46 38 29 0a 23  d(SQLITE_UTF8).#
0590: 20 64 65 66 69 6e 65 20 55 54 46 5f 54 52 41 4e   define UTF_TRAN
05a0: 53 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 20 31  SLATION_NEEDED 1
05b0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4e  .#endif../*.** N
05c0: 65 77 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73  ew SQL functions
05d0: 20 63 61 6e 20 62 65 20 63 72 65 61 74 65 64 20   can be created 
05e0: 61 73 20 54 43 4c 20 73 63 72 69 70 74 73 2e 20  as TCL scripts. 
05f0: 20 45 61 63 68 20 73 75 63 68 20 66 75 6e 63 74   Each such funct
0600: 69 6f 6e 0a 2a 2a 20 69 73 20 64 65 73 63 72 69  ion.** is descri
0610: 62 65 64 20 62 79 20 61 6e 20 69 6e 73 74 61 6e  bed by an instan
0620: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
0630: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ing structure..*
0640: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0650: 20 53 71 6c 46 75 6e 63 20 53 71 6c 46 75 6e 63   SqlFunc SqlFunc
0660: 3b 0a 73 74 72 75 63 74 20 53 71 6c 46 75 6e 63  ;.struct SqlFunc
0670: 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20   {.  Tcl_Interp 
0680: 2a 69 6e 74 65 72 70 3b 20 20 20 2f 2a 20 54 68  *interp;   /* Th
0690: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 20  e TCL interpret 
06a0: 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20 66  to execute the f
06b0: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
06c0: 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 20 20  _Obj *pScript;  
06d0: 20 20 20 2f 2a 20 54 68 65 20 54 63 6c 5f 4f 62     /* The Tcl_Ob
06e0: 6a 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  j representation
06f0: 20 6f 66 20 74 68 65 20 73 63 72 69 70 74 20 2a   of the script *
0700: 2f 0a 20 20 69 6e 74 20 75 73 65 45 76 61 6c 4f  /.  int useEvalO
0710: 62 6a 76 3b 20 20 20 20 20 20 2f 2a 20 54 72 75  bjv;      /* Tru
0720: 65 20 69 66 20 69 74 20 69 73 20 73 61 66 65 20  e if it is safe 
0730: 74 6f 20 75 73 65 20 54 63 6c 5f 45 76 61 6c 4f  to use Tcl_EvalO
0740: 62 6a 76 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  bjv */.  char *z
0750: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 2f  Name;          /
0760: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 69 73 20 66  * Name of this f
0770: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 53 71 6c  unction */.  Sql
0780: 46 75 6e 63 20 2a 70 4e 65 78 74 3b 20 20 20 20  Func *pNext;    
0790: 20 20 20 2f 2a 20 4e 65 78 74 20 66 75 6e 63 74     /* Next funct
07a0: 69 6f 6e 20 6f 6e 20 74 68 65 20 6c 69 73 74 20  ion on the list 
07b0: 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 7d  of them all */.}
07c0: 3b 0a 0a 2f 2a 0a 2a 2a 20 4e 65 77 20 63 6f 6c  ;../*.** New col
07d0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73  lation sequences
07e0: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 62 65   function can be
07f0: 20 63 72 65 61 74 65 64 20 61 73 20 54 43 4c 20   created as TCL 
0800: 73 63 72 69 70 74 73 2e 20 20 45 61 63 68 20 73  scripts.  Each s
0810: 75 63 68 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  uch.** function 
0820: 69 73 20 64 65 73 63 72 69 62 65 64 20 62 79 20  is described by 
0830: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
0840: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
0850: 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65 64  ucture..*/.typed
0860: 65 66 20 73 74 72 75 63 74 20 53 71 6c 43 6f 6c  ef struct SqlCol
0870: 6c 61 74 65 20 53 71 6c 43 6f 6c 6c 61 74 65 3b  late SqlCollate;
0880: 0a 73 74 72 75 63 74 20 53 71 6c 43 6f 6c 6c 61  .struct SqlColla
0890: 74 65 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72  te {.  Tcl_Inter
08a0: 70 20 2a 69 6e 74 65 72 70 3b 20 20 20 2f 2a 20  p *interp;   /* 
08b0: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
08c0: 74 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  t to execute the
08d0: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 63   function */.  c
08e0: 68 61 72 20 2a 7a 53 63 72 69 70 74 3b 20 20 20  har *zScript;   
08f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 63 72 69       /* The scri
0900: 70 74 20 74 6f 20 62 65 20 72 75 6e 20 2a 2f 0a  pt to be run */.
0910: 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 4e    SqlCollate *pN
0920: 65 78 74 3b 20 20 20 20 2f 2a 20 4e 65 78 74 20  ext;    /* Next 
0930: 66 75 6e 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  function on the 
0940: 6c 69 73 74 20 6f 66 20 74 68 65 6d 20 61 6c 6c  list of them all
0950: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72   */.};../*.** Pr
0960: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
0970: 73 20 61 72 65 20 63 61 63 68 65 64 20 66 6f 72  s are cached for
0980: 20 66 61 73 74 65 72 20 65 78 65 63 75 74 69 6f   faster executio
0990: 6e 2e 20 20 45 61 63 68 20 70 72 65 70 61 72 65  n.  Each prepare
09a0: 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 69  d.** statement i
09b0: 73 20 64 65 73 63 72 69 62 65 64 20 62 79 20 61  s described by a
09c0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
09d0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
09e0: 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65 64 65  cture..*/.typede
09f0: 66 20 73 74 72 75 63 74 20 53 71 6c 50 72 65 70  f struct SqlPrep
0a00: 61 72 65 64 53 74 6d 74 20 53 71 6c 50 72 65 70  aredStmt SqlPrep
0a10: 61 72 65 64 53 74 6d 74 3b 0a 73 74 72 75 63 74  aredStmt;.struct
0a20: 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74   SqlPreparedStmt
0a30: 20 7b 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64   {.  SqlPrepared
0a40: 53 74 6d 74 20 2a 70 4e 65 78 74 3b 20 20 2f 2a  Stmt *pNext;  /*
0a50: 20 4e 65 78 74 20 69 6e 20 6c 69 6e 6b 65 64 20   Next in linked 
0a60: 6c 69 73 74 20 2a 2f 0a 20 20 53 71 6c 50 72 65  list */.  SqlPre
0a70: 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65 76  paredStmt *pPrev
0a80: 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 6f  ;  /* Previous o
0a90: 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20  n the list */.  
0aa0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
0ab0: 74 6d 74 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  tmt;     /* The 
0ac0: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
0ad0: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 71 6c  nt */.  int nSql
0ae0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0af0: 20 2f 2a 20 63 68 61 72 73 20 69 6e 20 7a 53 71   /* chars in zSq
0b00: 6c 5b 5d 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  l[] */.  const c
0b10: 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20  har *zSql;      
0b20: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65    /* Text of the
0b30: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a   SQL statement *
0b40: 2f 0a 7d 3b 0a 0a 74 79 70 65 64 65 66 20 73 74  /.};..typedef st
0b50: 72 75 63 74 20 49 6e 63 72 62 6c 6f 62 43 68 61  ruct IncrblobCha
0b60: 6e 6e 65 6c 20 49 6e 63 72 62 6c 6f 62 43 68 61  nnel IncrblobCha
0b70: 6e 6e 65 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  nnel;../*.** The
0b80: 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e  re is one instan
0b90: 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  ce of this struc
0ba0: 74 75 72 65 20 66 6f 72 20 65 61 63 68 20 53 51  ture for each SQ
0bb0: 4c 69 74 65 20 64 61 74 61 62 61 73 65 0a 2a 2a  Lite database.**
0bc0: 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 6f   that has been o
0bd0: 70 65 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c  pened by the SQL
0be0: 69 74 65 20 54 43 4c 20 69 6e 74 65 72 66 61 63  ite TCL interfac
0bf0: 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  e..*/.typedef st
0c00: 72 75 63 74 20 53 71 6c 69 74 65 44 62 20 53 71  ruct SqliteDb Sq
0c10: 6c 69 74 65 44 62 3b 0a 73 74 72 75 63 74 20 53  liteDb;.struct S
0c20: 71 6c 69 74 65 44 62 20 7b 0a 20 20 73 71 6c 69  qliteDb {.  sqli
0c30: 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
0c40: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 72         /* The "r
0c50: 65 61 6c 22 20 64 61 74 61 62 61 73 65 20 73 74  eal" database st
0c60: 72 75 63 74 75 72 65 2e 20 4d 55 53 54 20 42 45  ructure. MUST BE
0c70: 20 46 49 52 53 54 20 2a 2f 0a 20 20 54 63 6c 5f   FIRST */.  Tcl_
0c80: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 20  Interp *interp; 
0c90: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
0ca0: 74 65 72 70 72 65 74 65 72 20 75 73 65 64 20 66  terpreter used f
0cb0: 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65  or this database
0cc0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 42 75 73   */.  char *zBus
0cd0: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
0ce0: 20 2f 2a 20 54 68 65 20 62 75 73 79 20 63 61 6c   /* The busy cal
0cf0: 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f  lback routine */
0d00: 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74  .  char *zCommit
0d10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
0d20: 20 54 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b   The commit hook
0d30: 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e   callback routin
0d40: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 72  e */.  char *zTr
0d50: 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
0d60: 20 20 2f 2a 20 54 68 65 20 74 72 61 63 65 20 63    /* The trace c
0d70: 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20  allback routine 
0d80: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 72 6f 66  */.  char *zProf
0d90: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
0da0: 2f 2a 20 54 68 65 20 70 72 6f 66 69 6c 65 20 63  /* The profile c
0db0: 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20  allback routine 
0dc0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 72 6f 67  */.  char *zProg
0dd0: 72 65 73 73 3b 20 20 20 20 20 20 20 20 20 20 20  ress;           
0de0: 2f 2a 20 54 68 65 20 70 72 6f 67 72 65 73 73 20  /* The progress 
0df0: 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65  callback routine
0e00: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 75 74   */.  char *zAut
0e10: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
0e20: 20 2f 2a 20 54 68 65 20 61 75 74 68 6f 72 69 7a   /* The authoriz
0e30: 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 20 72  ation callback r
0e40: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
0e50: 64 69 73 61 62 6c 65 41 75 74 68 3b 20 20 20 20  disableAuth;    
0e60: 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c         /* Disabl
0e70: 65 20 74 68 65 20 61 75 74 68 6f 72 69 7a 65 72  e the authorizer
0e80: 20 69 66 20 69 74 20 65 78 69 73 74 73 20 2a 2f   if it exists */
0e90: 0a 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c 3b 20  .  char *zNull; 
0ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0eb0: 20 54 65 78 74 20 74 6f 20 73 75 62 73 74 69 74   Text to substit
0ec0: 75 74 65 20 66 6f 72 20 61 6e 20 53 51 4c 20 4e  ute for an SQL N
0ed0: 55 4c 4c 20 76 61 6c 75 65 20 2a 2f 0a 20 20 53  ULL value */.  S
0ee0: 71 6c 46 75 6e 63 20 2a 70 46 75 6e 63 3b 20 20  qlFunc *pFunc;  
0ef0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
0f00: 74 20 6f 66 20 53 51 4c 20 66 75 6e 63 74 69 6f  t of SQL functio
0f10: 6e 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ns */.  Tcl_Obj 
0f20: 2a 70 55 70 64 61 74 65 48 6f 6f 6b 3b 20 20 20  *pUpdateHook;   
0f30: 20 20 20 2f 2a 20 55 70 64 61 74 65 20 68 6f 6f     /* Update hoo
0f40: 6b 20 73 63 72 69 70 74 20 28 69 66 20 61 6e 79  k script (if any
0f50: 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  ) */.  Tcl_Obj *
0f60: 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3b 20 20  pRollbackHook;  
0f70: 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 68 6f    /* Rollback ho
0f80: 6f 6b 20 73 63 72 69 70 74 20 28 69 66 20 61 6e  ok script (if an
0f90: 79 29 20 2a 2f 0a 20 20 53 71 6c 43 6f 6c 6c 61  y) */.  SqlColla
0fa0: 74 65 20 2a 70 43 6f 6c 6c 61 74 65 3b 20 20 20  te *pCollate;   
0fb0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 53 51     /* List of SQ
0fc0: 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63  L collation func
0fd0: 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 72  tions */.  int r
0fe0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
0ff0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1000: 63 6f 64 65 20 6f 66 20 6d 6f 73 74 20 72 65 63  code of most rec
1010: 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63  ent sqlite3_exec
1020: 28 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  () */.  Tcl_Obj 
1030: 2a 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 3b  *pCollateNeeded;
1040: 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20     /* Collation 
1050: 6e 65 65 64 65 64 20 73 63 72 69 70 74 20 2a 2f  needed script */
1060: 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74  .  SqlPreparedSt
1070: 6d 74 20 2a 73 74 6d 74 4c 69 73 74 3b 20 2f 2a  mt *stmtList; /*
1080: 20 4c 69 73 74 20 6f 66 20 70 72 65 70 61 72 65   List of prepare
1090: 64 20 73 74 61 74 65 6d 65 6e 74 73 2a 2f 0a 20  d statements*/. 
10a0: 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74   SqlPreparedStmt
10b0: 20 2a 73 74 6d 74 4c 61 73 74 3b 20 2f 2a 20 4c   *stmtLast; /* L
10c0: 61 73 74 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  ast statement in
10d0: 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69   the list */.  i
10e0: 6e 74 20 6d 61 78 53 74 6d 74 3b 20 20 20 20 20  nt maxStmt;     
10f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1100: 20 6e 65 78 74 20 6d 61 78 69 6d 75 6d 20 6e 75   next maximum nu
1110: 6d 62 65 72 20 6f 66 20 73 74 6d 74 4c 69 73 74  mber of stmtList
1120: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 74 6d 74 3b   */.  int nStmt;
1130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1140: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 74   /* Number of st
1150: 61 74 65 6d 65 6e 74 73 20 69 6e 20 73 74 6d 74  atements in stmt
1160: 4c 69 73 74 20 2a 2f 0a 20 20 49 6e 63 72 62 6c  List */.  Incrbl
1170: 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 49 6e 63 72  obChannel *pIncr
1180: 62 6c 6f 62 3b 2f 2a 20 4c 69 6e 6b 65 64 20 6c  blob;/* Linked l
1190: 69 73 74 20 6f 66 20 6f 70 65 6e 20 69 6e 63 72  ist of open incr
11a0: 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 73 20 2a 2f  blob channels */
11b0: 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 49 6e 63 72  .};..struct Incr
11c0: 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 7b 0a 20 20  blobChannel {.  
11d0: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42  sqlite3_blob *pB
11e0: 6c 6f 62 3b 20 20 20 20 20 20 2f 2a 20 73 71 6c  lob;      /* sql
11f0: 69 74 65 33 20 62 6c 6f 62 20 68 61 6e 64 6c 65  ite3 blob handle
1200: 20 2a 2f 0a 20 20 53 71 6c 69 74 65 44 62 20 2a   */.  SqliteDb *
1210: 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  pDb;            
1220: 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20 64 61  /* Associated da
1230: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1240: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65 65 6b  n */.  int iSeek
1250: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1260: 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 65 65 6b   /* Current seek
1270: 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 54 63 6c   offset */.  Tcl
1280: 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 6e 65 6c  _Channel channel
1290: 3b 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 6e 65  ;      /* Channe
12a0: 6c 20 69 64 65 6e 74 69 66 69 65 72 20 2a 2f 0a  l identifier */.
12b0: 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65    IncrblobChanne
12c0: 6c 20 2a 70 4e 65 78 74 3b 20 20 20 2f 2a 20 4c  l *pNext;   /* L
12d0: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 61 6c  inked list of al
12e0: 6c 20 6f 70 65 6e 20 69 6e 63 72 62 6c 6f 62 20  l open incrblob 
12f0: 63 68 61 6e 6e 65 6c 73 20 2a 2f 0a 20 20 49 6e  channels */.  In
1300: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70  crblobChannel *p
1310: 50 72 65 76 3b 20 20 20 2f 2a 20 4c 69 6e 6b 65  Prev;   /* Linke
1320: 64 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 6f 70  d list of all op
1330: 65 6e 20 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e  en incrblob chan
1340: 6e 65 6c 73 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 6e  nels */.};..#ifn
1350: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1360: 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 43  INCRBLOB./*.** C
1370: 6c 6f 73 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f  lose all incrblo
1380: 62 20 63 68 61 6e 6e 65 6c 73 20 6f 70 65 6e 65  b channels opene
1390: 64 20 75 73 69 6e 67 20 64 61 74 61 62 61 73 65  d using database
13a0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 44 62 2e   connection pDb.
13b0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c  .** This is call
13c0: 65 64 20 77 68 65 6e 20 73 68 75 74 74 69 6e 67  ed when shutting
13d0: 20 64 6f 77 6e 20 74 68 65 20 64 61 74 61 62 61   down the databa
13e0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
13f0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c  /.static void cl
1400: 6f 73 65 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  oseIncrblobChann
1410: 65 6c 73 28 53 71 6c 69 74 65 44 62 20 2a 70 44  els(SqliteDb *pD
1420: 62 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68  b){.  IncrblobCh
1430: 61 6e 6e 65 6c 20 2a 70 3b 0a 20 20 49 6e 63 72  annel *p;.  Incr
1440: 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 4e 65  blobChannel *pNe
1450: 78 74 3b 0a 0a 20 20 66 6f 72 28 70 3d 70 44 62  xt;..  for(p=pDb
1460: 2d 3e 70 49 6e 63 72 62 6c 6f 62 3b 20 70 3b 20  ->pIncrblob; p; 
1470: 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e  p=pNext){.    pN
1480: 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
1490: 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 43 61  .    /* Note: Ca
14a0: 6c 6c 69 6e 67 20 75 6e 72 65 67 69 73 74 65 72  lling unregister
14b0: 20 68 65 72 65 20 63 61 6c 6c 20 54 63 6c 5f 43   here call Tcl_C
14c0: 6c 6f 73 65 20 6f 6e 20 74 68 65 20 69 6e 63 72  lose on the incr
14d0: 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2c 20 0a 20  blob channel, . 
14e0: 20 20 20 2a 2a 20 77 68 69 63 68 20 64 65 6c 65     ** which dele
14f0: 74 65 73 20 74 68 65 20 49 6e 63 72 62 6c 6f 62  tes the Incrblob
1500: 43 68 61 6e 6e 65 6c 20 73 74 72 75 63 74 75 72  Channel structur
1510: 65 20 61 74 20 2a 70 2e 20 53 6f 20 64 6f 20 6e  e at *p. So do n
1520: 6f 74 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 54  ot.    ** call T
1530: 63 6c 5f 46 72 65 65 28 29 20 68 65 72 65 2e 0a  cl_Free() here..
1540: 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 55      */.    Tcl_U
1550: 6e 72 65 67 69 73 74 65 72 43 68 61 6e 6e 65 6c  nregisterChannel
1560: 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 2d  (pDb->interp, p-
1570: 3e 63 68 61 6e 6e 65 6c 29 3b 0a 20 20 7d 0a 7d  >channel);.  }.}
1580: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e  ../*.** Close an
1590: 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f   incremental blo
15a0: 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74  b channel..*/.st
15b0: 61 74 69 63 20 69 6e 74 20 69 6e 63 72 62 6c 6f  atic int incrblo
15c0: 62 43 6c 6f 73 65 28 43 6c 69 65 6e 74 44 61 74  bClose(ClientDat
15d0: 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20  a instanceData, 
15e0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
15f0: 72 70 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43  rp){.  IncrblobC
1600: 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28 49 6e 63  hannel *p = (Inc
1610: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 69  rblobChannel *)i
1620: 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 69  nstanceData;.  i
1630: 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  nt rc = sqlite3_
1640: 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 2d 3e 70 42  blob_close(p->pB
1650: 6c 6f 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 20  lob);.  sqlite3 
1660: 2a 64 62 20 3d 20 70 2d 3e 70 44 62 2d 3e 64 62  *db = p->pDb->db
1670: 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74  ;..  /* Remove t
1680: 68 65 20 63 68 61 6e 6e 65 6c 20 66 72 6f 6d 20  he channel from 
1690: 74 68 65 20 53 71 6c 69 74 65 44 62 2e 70 49 6e  the SqliteDb.pIn
16a0: 63 72 62 6c 6f 62 20 6c 69 73 74 2e 20 2a 2f 0a  crblob list. */.
16b0: 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
16c0: 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e  {.    p->pNext->
16d0: 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76  pPrev = p->pPrev
16e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
16f0: 50 72 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70  Prev ){.    p->p
1700: 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d  Prev->pNext = p-
1710: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  >pNext;.  }.  if
1720: 28 20 70 2d 3e 70 44 62 2d 3e 70 49 6e 63 72 62  ( p->pDb->pIncrb
1730: 6c 6f 62 3d 3d 70 20 29 7b 0a 20 20 20 20 70 2d  lob==p ){.    p-
1740: 3e 70 44 62 2d 3e 70 49 6e 63 72 62 6c 6f 62 20  >pDb->pIncrblob 
1750: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  = p->pNext;.  }.
1760: 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20 49  .  /* Free the I
1770: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 73  ncrblobChannel s
1780: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 54 63  tructure */.  Tc
1790: 6c 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 70  l_Free((char *)p
17a0: 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  );..  if( rc!=SQ
17b0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
17c0: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
17d0: 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c  erp, (char *)sql
17e0: 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c  ite3_errmsg(db),
17f0: 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a   TCL_VOLATILE);.
1800: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1810: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
1820: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1830: 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66 72  .** Read data fr
1840: 6f 6d 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  om an incrementa
1850: 6c 20 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a  l blob channel..
1860: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
1870: 63 72 62 6c 6f 62 49 6e 70 75 74 28 0a 20 20 43  crblobInput(.  C
1880: 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e  lientData instan
1890: 63 65 44 61 74 61 2c 20 0a 20 20 63 68 61 72 20  ceData, .  char 
18a0: 2a 62 75 66 2c 20 0a 20 20 69 6e 74 20 62 75 66  *buf, .  int buf
18b0: 53 69 7a 65 2c 0a 20 20 69 6e 74 20 2a 65 72 72  Size,.  int *err
18c0: 6f 72 43 6f 64 65 50 74 72 0a 29 7b 0a 20 20 49  orCodePtr.){.  I
18d0: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a  ncrblobChannel *
18e0: 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68 61  p = (IncrblobCha
18f0: 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e 63 65 44  nnel *)instanceD
1900: 61 74 61 3b 0a 20 20 69 6e 74 20 6e 52 65 61 64  ata;.  int nRead
1910: 20 3d 20 62 75 66 53 69 7a 65 3b 20 20 20 20 20   = bufSize;     
1920: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1930: 20 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a   bytes to read *
1940: 2f 0a 20 20 69 6e 74 20 6e 42 6c 6f 62 3b 20 20  /.  int nBlob;  
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1960: 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f   /* Total size o
1970: 66 20 74 68 65 20 62 6c 6f 62 20 2a 2f 0a 20 20  f the blob */.  
1980: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19a0: 73 71 6c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  sqlite error cod
19b0: 65 20 2a 2f 0a 0a 20 20 6e 42 6c 6f 62 20 3d 20  e */..  nBlob = 
19c0: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74  sqlite3_blob_byt
19d0: 65 73 28 70 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20  es(p->pBlob);.  
19e0: 69 66 28 20 28 70 2d 3e 69 53 65 65 6b 2b 6e 52  if( (p->iSeek+nR
19f0: 65 61 64 29 3e 6e 42 6c 6f 62 20 29 7b 0a 20 20  ead)>nBlob ){.  
1a00: 20 20 6e 52 65 61 64 20 3d 20 6e 42 6c 6f 62 2d    nRead = nBlob-
1a10: 70 2d 3e 69 53 65 65 6b 3b 0a 20 20 7d 0a 20 20  p->iSeek;.  }.  
1a20: 69 66 28 20 6e 52 65 61 64 3c 3d 30 20 29 7b 0a  if( nRead<=0 ){.
1a30: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1a40: 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  }..  rc = sqlite
1a50: 33 5f 62 6c 6f 62 5f 72 65 61 64 28 70 2d 3e 70  3_blob_read(p->p
1a60: 42 6c 6f 62 2c 20 28 76 6f 69 64 20 2a 29 62 75  Blob, (void *)bu
1a70: 66 2c 20 6e 52 65 61 64 2c 20 70 2d 3e 69 53 65  f, nRead, p->iSe
1a80: 65 6b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ek);.  if( rc!=S
1a90: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1aa0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20  *errorCodePtr = 
1ab0: 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d  rc;.    return -
1ac0: 31 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69 53 65  1;.  }..  p->iSe
1ad0: 65 6b 20 2b 3d 20 6e 52 65 61 64 3b 0a 20 20 72  ek += nRead;.  r
1ae0: 65 74 75 72 6e 20 6e 52 65 61 64 3b 0a 7d 0a 0a  eturn nRead;.}..
1af0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61  /*.** Write data
1b00: 20 74 6f 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74   to an increment
1b10: 61 6c 20 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e  al blob channel.
1b20: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
1b30: 6e 63 72 62 6c 6f 62 4f 75 74 70 75 74 28 0a 20  ncrblobOutput(. 
1b40: 20 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74   ClientData inst
1b50: 61 6e 63 65 44 61 74 61 2c 20 0a 20 20 43 4f 4e  anceData, .  CON
1b60: 53 54 20 63 68 61 72 20 2a 62 75 66 2c 20 0a 20  ST char *buf, . 
1b70: 20 69 6e 74 20 74 6f 57 72 69 74 65 2c 0a 20 20   int toWrite,.  
1b80: 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 74  int *errorCodePt
1b90: 72 0a 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43  r.){.  IncrblobC
1ba0: 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28 49 6e 63  hannel *p = (Inc
1bb0: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 69  rblobChannel *)i
1bc0: 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 69  nstanceData;.  i
1bd0: 6e 74 20 6e 57 72 69 74 65 20 3d 20 74 6f 57 72  nt nWrite = toWr
1be0: 69 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e  ite;        /* N
1bf0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
1c00: 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 69 6e 74  o write */.  int
1c10: 20 6e 42 6c 6f 62 3b 20 20 20 20 20 20 20 20 20   nBlob;         
1c20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
1c30: 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62  al size of the b
1c40: 6c 6f 62 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  lob */.  int rc;
1c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c60: 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 20        /* sqlite 
1c70: 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 0a 20  error code */.. 
1c80: 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33   nBlob = sqlite3
1c90: 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70  _blob_bytes(p->p
1ca0: 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20 28 70 2d  Blob);.  if( (p-
1cb0: 3e 69 53 65 65 6b 2b 6e 57 72 69 74 65 29 3e 6e  >iSeek+nWrite)>n
1cc0: 42 6c 6f 62 20 29 7b 0a 20 20 20 20 2a 65 72 72  Blob ){.    *err
1cd0: 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 49 4e 56  orCodePtr = EINV
1ce0: 41 4c 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d  AL;.    return -
1cf0: 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 57 72  1;.  }.  if( nWr
1d00: 69 74 65 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65  ite<=0 ){.    re
1d10: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 72  turn 0;.  }..  r
1d20: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
1d30: 5f 77 72 69 74 65 28 70 2d 3e 70 42 6c 6f 62 2c  _write(p->pBlob,
1d40: 20 28 76 6f 69 64 20 2a 29 62 75 66 2c 20 6e 57   (void *)buf, nW
1d50: 72 69 74 65 2c 20 70 2d 3e 69 53 65 65 6b 29 3b  rite, p->iSeek);
1d60: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1d70: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 65 72 72  E_OK ){.    *err
1d80: 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 49 4f 3b  orCodePtr = EIO;
1d90: 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .    return -1;.
1da0: 20 20 7d 0a 0a 20 20 70 2d 3e 69 53 65 65 6b 20    }..  p->iSeek 
1db0: 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20 72 65 74  += nWrite;.  ret
1dc0: 75 72 6e 20 6e 57 72 69 74 65 3b 0a 7d 0a 0a 2f  urn nWrite;.}../
1dd0: 2a 0a 2a 2a 20 53 65 65 6b 20 61 6e 20 69 6e 63  *.** Seek an inc
1de0: 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 68  remental blob ch
1df0: 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  annel..*/.static
1e00: 20 69 6e 74 20 69 6e 63 72 62 6c 6f 62 53 65 65   int incrblobSee
1e10: 6b 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  k(.  ClientData 
1e20: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 0a 20  instanceData, . 
1e30: 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c 0a 20 20   long offset,.  
1e40: 69 6e 74 20 73 65 65 6b 4d 6f 64 65 2c 0a 20 20  int seekMode,.  
1e50: 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 74  int *errorCodePt
1e60: 72 0a 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43  r.){.  IncrblobC
1e70: 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28 49 6e 63  hannel *p = (Inc
1e80: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 69  rblobChannel *)i
1e90: 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 0a 20 20  nstanceData;..  
1ea0: 73 77 69 74 63 68 28 20 73 65 65 6b 4d 6f 64 65  switch( seekMode
1eb0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 45 45   ){.    case SEE
1ec0: 4b 5f 53 45 54 3a 0a 20 20 20 20 20 20 70 2d 3e  K_SET:.      p->
1ed0: 69 53 65 65 6b 20 3d 20 6f 66 66 73 65 74 3b 0a  iSeek = offset;.
1ee0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1ef0: 20 63 61 73 65 20 53 45 45 4b 5f 43 55 52 3a 0a   case SEEK_CUR:.
1f00: 20 20 20 20 20 20 70 2d 3e 69 53 65 65 6b 20 2b        p->iSeek +
1f10: 3d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  = offset;.      
1f20: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1f30: 53 45 45 4b 5f 45 4e 44 3a 0a 20 20 20 20 20 20  SEEK_END:.      
1f40: 70 2d 3e 69 53 65 65 6b 20 3d 20 73 71 6c 69 74  p->iSeek = sqlit
1f50: 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d  e3_blob_bytes(p-
1f60: 3e 70 42 6c 6f 62 29 20 2b 20 6f 66 66 73 65 74  >pBlob) + offset
1f70: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
1f80: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73      default: ass
1f90: 65 72 74 28 21 22 42 61 64 20 73 65 65 6b 4d 6f  ert(!"Bad seekMo
1fa0: 64 65 22 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  de");.  }..  ret
1fb0: 75 72 6e 20 70 2d 3e 69 53 65 65 6b 3b 0a 7d 0a  urn p->iSeek;.}.
1fc0: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  ..static void in
1fd0: 63 72 62 6c 6f 62 57 61 74 63 68 28 43 6c 69 65  crblobWatch(Clie
1fe0: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44  ntData instanceD
1ff0: 61 74 61 2c 20 69 6e 74 20 6d 6f 64 65 29 7b 20  ata, int mode){ 
2000: 0a 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 20 0a  .  /* NO-OP */ .
2010: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63  }.static int inc
2020: 72 62 6c 6f 62 48 61 6e 64 6c 65 28 43 6c 69 65  rblobHandle(Clie
2030: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44  ntData instanceD
2040: 61 74 61 2c 20 69 6e 74 20 64 69 72 2c 20 43 6c  ata, int dir, Cl
2050: 69 65 6e 74 44 61 74 61 20 2a 68 50 74 72 29 7b  ientData *hPtr){
2060: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  .  return TCL_ER
2070: 52 4f 52 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 54  ROR;.}..static T
2080: 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20 49  cl_ChannelType I
2090: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 54 79  ncrblobChannelTy
20a0: 70 65 20 3d 20 7b 0a 20 20 22 69 6e 63 72 62 6c  pe = {.  "incrbl
20b0: 6f 62 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ob",            
20c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74              /* t
20d0: 79 70 65 4e 61 6d 65 20 20 20 20 20 20 20 20 20  ypeName         
20e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f0: 20 20 20 20 2a 2f 0a 20 20 54 43 4c 5f 43 48 41      */.  TCL_CHA
2100: 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 32 2c 20  NNEL_VERSION_2, 
2110: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 76              /* v
2120: 65 72 73 69 6f 6e 20 20 20 20 20 20 20 20 20 20  ersion          
2130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2140: 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f      */.  incrblo
2150: 62 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  bClose,         
2160: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63              /* c
2170: 6c 6f 73 65 50 72 6f 63 20 20 20 20 20 20 20 20  loseProc        
2180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2190: 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f      */.  incrblo
21a0: 62 49 6e 70 75 74 2c 20 20 20 20 20 20 20 20 20  bInput,         
21b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
21c0: 6e 70 75 74 50 72 6f 63 20 20 20 20 20 20 20 20  nputProc        
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e0: 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f      */.  incrblo
21f0: 62 4f 75 74 70 75 74 2c 20 20 20 20 20 20 20 20  bOutput,        
2200: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f              /* o
2210: 75 74 70 75 74 50 72 6f 63 20 20 20 20 20 20 20  utputProc       
2220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2230: 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f      */.  incrblo
2240: 62 53 65 65 6b 2c 20 20 20 20 20 20 20 20 20 20  bSeek,          
2250: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
2260: 65 65 6b 50 72 6f 63 20 20 20 20 20 20 20 20 20  eekProc         
2270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2280: 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20      */.  0,     
2290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
22b0: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 20 20 20  etOptionProc    
22c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d0: 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20      */.  0,     
22e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 67              /* g
2300: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 20 20 20  etOptionProc    
2310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2320: 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f      */.  incrblo
2330: 62 57 61 74 63 68 2c 20 20 20 20 20 20 20 20 20  bWatch,         
2340: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 77              /* w
2350: 61 74 63 68 50 72 6f 63 20 28 74 68 69 73 20 69  atchProc (this i
2360: 73 20 61 20 6e 6f 2d 6f 70 29 20 20 20 20 20 20  s a no-op)      
2370: 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f      */.  incrblo
2380: 62 48 61 6e 64 6c 65 2c 20 20 20 20 20 20 20 20  bHandle,        
2390: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 67              /* g
23a0: 65 74 48 61 6e 64 6c 65 50 72 6f 63 20 28 61 6c  etHandleProc (al
23b0: 77 61 79 73 20 72 65 74 75 72 6e 73 20 65 72 72  ways returns err
23c0: 6f 72 29 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  or) */.  0,     
23d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63              /* c
23f0: 6c 6f 73 65 32 50 72 6f 63 20 20 20 20 20 20 20  lose2Proc       
2400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2410: 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20      */.  0,     
2420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2430: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 62              /* b
2440: 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 20 20 20 20  lockModeProc    
2450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2460: 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20      */.  0,     
2470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2480: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
2490: 6c 75 73 68 50 72 6f 63 20 20 20 20 20 20 20 20  lushProc        
24a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b0: 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20      */.  0,     
24c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 68              /* h
24e0: 61 6e 64 6c 65 72 50 72 6f 63 20 20 20 20 20 20  andlerProc      
24f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2500: 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20      */.  0,     
2510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2520: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 77              /* w
2530: 69 64 65 53 65 65 6b 50 72 6f 63 20 20 20 20 20  ideSeekProc     
2540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2550: 20 20 20 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a      */.};../*.**
2560: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e   Create a new in
2570: 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a  crblob channel..
2580: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 72  */.static int cr
2590: 65 61 74 65 49 6e 63 72 62 6c 6f 62 43 68 61 6e  eateIncrblobChan
25a0: 6e 65 6c 28 0a 20 20 54 63 6c 5f 49 6e 74 65 72  nel(.  Tcl_Inter
25b0: 70 20 2a 69 6e 74 65 72 70 2c 20 0a 20 20 53 71  p *interp, .  Sq
25c0: 6c 69 74 65 44 62 20 2a 70 44 62 2c 20 0a 20 20  liteDb *pDb, .  
25d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c  const char *zDb,
25e0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
25f0: 54 61 62 6c 65 2c 20 0a 20 20 63 6f 6e 73 74 20  Table, .  const 
2600: 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 2c 20 0a  char *zColumn, .
2610: 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69    sqlite_int64 i
2620: 52 6f 77 2c 0a 20 20 69 6e 74 20 69 73 52 65 61  Row,.  int isRea
2630: 64 6f 6e 6c 79 0a 29 7b 0a 20 20 49 6e 63 72 62  donly.){.  Incrb
2640: 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 3b 0a 20  lobChannel *p;. 
2650: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
2660: 44 62 2d 3e 64 62 3b 0a 20 20 73 71 6c 69 74 65  Db->db;.  sqlite
2670: 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 3b 0a 20  3_blob *pBlob;. 
2680: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 66   int rc;.  int f
2690: 6c 61 67 73 20 3d 20 54 43 4c 5f 52 45 41 44 41  lags = TCL_READA
26a0: 42 4c 45 7c 28 69 73 52 65 61 64 6f 6e 6c 79 20  BLE|(isReadonly 
26b0: 3f 20 30 20 3a 20 54 43 4c 5f 57 52 49 54 41 42  ? 0 : TCL_WRITAB
26c0: 4c 45 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  LE);..  /* This 
26d0: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
26e0: 20 74 6f 20 6e 61 6d 65 20 74 68 65 20 63 68 61   to name the cha
26f0: 6e 6e 65 6c 73 3a 20 22 69 6e 63 72 62 6c 6f 62  nnels: "incrblob
2700: 5f 5b 69 6e 63 72 20 63 6f 75 6e 74 5d 22 20 2a  _[incr count]" *
2710: 2f 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 63  /.  static int c
2720: 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 63 68 61 72  ount = 0;.  char
2730: 20 7a 43 68 61 6e 6e 65 6c 5b 36 34 5d 3b 0a 0a   zChannel[64];..
2740: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
2750: 6c 6f 62 5f 6f 70 65 6e 28 64 62 2c 20 7a 44 62  lob_open(db, zDb
2760: 2c 20 7a 54 61 62 6c 65 2c 20 7a 43 6f 6c 75 6d  , zTable, zColum
2770: 6e 2c 20 69 52 6f 77 2c 20 21 69 73 52 65 61 64  n, iRow, !isRead
2780: 6f 6e 6c 79 2c 20 26 70 42 6c 6f 62 29 3b 0a 20  only, &pBlob);. 
2790: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
27a0: 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65  OK ){.    Tcl_Se
27b0: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
27c0: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
27d0: 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c  errmsg(pDb->db),
27e0: 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a   TCL_VOLATILE);.
27f0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2800: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d  RROR;.  }..  p =
2810: 20 28 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65   (IncrblobChanne
2820: 6c 20 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 73 69  l *)Tcl_Alloc(si
2830: 7a 65 6f 66 28 49 6e 63 72 62 6c 6f 62 43 68 61  zeof(IncrblobCha
2840: 6e 6e 65 6c 29 29 3b 0a 20 20 70 2d 3e 69 53 65  nnel));.  p->iSe
2850: 65 6b 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 42 6c  ek = 0;.  p->pBl
2860: 6f 62 20 3d 20 70 42 6c 6f 62 3b 0a 0a 20 20 73  ob = pBlob;..  s
2870: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2880: 73 69 7a 65 6f 66 28 7a 43 68 61 6e 6e 65 6c 29  sizeof(zChannel)
2890: 2c 20 7a 43 68 61 6e 6e 65 6c 2c 20 22 69 6e 63  , zChannel, "inc
28a0: 72 62 6c 6f 62 5f 25 64 22 2c 20 2b 2b 63 6f 75  rblob_%d", ++cou
28b0: 6e 74 29 3b 0a 20 20 70 2d 3e 63 68 61 6e 6e 65  nt);.  p->channe
28c0: 6c 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 43 68  l = Tcl_CreateCh
28d0: 61 6e 6e 65 6c 28 26 49 6e 63 72 62 6c 6f 62 43  annel(&IncrblobC
28e0: 68 61 6e 6e 65 6c 54 79 70 65 2c 20 7a 43 68 61  hannelType, zCha
28f0: 6e 6e 65 6c 2c 20 70 2c 20 66 6c 61 67 73 29 3b  nnel, p, flags);
2900: 0a 20 20 54 63 6c 5f 52 65 67 69 73 74 65 72 43  .  Tcl_RegisterC
2910: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 70  hannel(interp, p
2920: 2d 3e 63 68 61 6e 6e 65 6c 29 3b 0a 0a 20 20 2f  ->channel);..  /
2930: 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20 63  * Link the new c
2940: 68 61 6e 6e 65 6c 20 69 6e 74 6f 20 74 68 65 20  hannel into the 
2950: 53 71 6c 69 74 65 44 62 2e 70 49 6e 63 72 62 6c  SqliteDb.pIncrbl
2960: 6f 62 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 70 2d  ob list. */.  p-
2970: 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 70 49  >pNext = pDb->pI
2980: 6e 63 72 62 6c 6f 62 3b 0a 20 20 70 2d 3e 70 50  ncrblob;.  p->pP
2990: 72 65 76 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  rev = 0;.  if( p
29a0: 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70  ->pNext ){.    p
29b0: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
29c0: 20 70 3b 0a 20 20 7d 0a 20 20 70 44 62 2d 3e 70   p;.  }.  pDb->p
29d0: 49 6e 63 72 62 6c 6f 62 20 3d 20 70 3b 0a 20 20  Incrblob = p;.  
29e0: 70 2d 3e 70 44 62 20 3d 20 70 44 62 3b 0a 0a 20  p->pDb = pDb;.. 
29f0: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
2a00: 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 54  nterp, (char *)T
2a10: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
2a20: 65 28 70 2d 3e 63 68 61 6e 6e 65 6c 29 2c 20 54  e(p->channel), T
2a30: 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20  CL_VOLATILE);.  
2a40: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
2a50: 0a 23 65 6c 73 65 20 20 2f 2a 20 65 6c 73 65 20  .#else  /* else 
2a60: 63 6c 61 75 73 65 20 66 6f 72 20 22 23 69 66 6e  clause for "#ifn
2a70: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2a80: 49 4e 43 52 42 4c 4f 42 22 20 2a 2f 0a 20 20 23  INCRBLOB" */.  #
2a90: 64 65 66 69 6e 65 20 63 6c 6f 73 65 49 6e 63 72  define closeIncr
2aa0: 62 6c 6f 62 43 68 61 6e 6e 65 6c 73 28 70 44 62  blobChannels(pDb
2ab0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
2ac0: 4c 6f 6f 6b 20 61 74 20 74 68 65 20 73 63 72 69  Look at the scri
2ad0: 70 74 20 70 72 65 66 69 78 20 69 6e 20 70 43 6d  pt prefix in pCm
2ae0: 64 2e 20 20 57 65 20 77 69 6c 6c 20 62 65 20 65  d.  We will be e
2af0: 78 65 63 75 74 69 6e 67 20 74 68 69 73 20 73 63  xecuting this sc
2b00: 72 69 70 74 0a 2a 2a 20 61 66 74 65 72 20 66 69  ript.** after fi
2b10: 72 73 74 20 61 70 70 65 6e 64 69 6e 67 20 6f 6e  rst appending on
2b20: 65 20 6f 72 20 6d 6f 72 65 20 61 72 67 75 6d 65  e or more argume
2b30: 6e 74 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69  nts.  This routi
2b40: 6e 65 20 61 6e 61 6c 79 7a 65 73 0a 2a 2a 20 74  ne analyzes.** t
2b50: 68 65 20 73 63 72 69 70 74 20 74 6f 20 73 65 65  he script to see
2b60: 20 69 66 20 69 74 20 69 73 20 73 61 66 65 20 74   if it is safe t
2b70: 6f 20 75 73 65 20 54 63 6c 5f 45 76 61 6c 4f 62  o use Tcl_EvalOb
2b80: 6a 76 28 29 20 6f 6e 20 74 68 65 20 73 63 72 69  jv() on the scri
2b90: 70 74 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61  pt.** rather tha
2ba0: 6e 20 74 68 65 20 6d 6f 72 65 20 67 65 6e 65 72  n the more gener
2bb0: 61 6c 20 54 63 6c 5f 45 76 61 6c 45 78 28 29 2e  al Tcl_EvalEx().
2bc0: 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29    Tcl_EvalObjv()
2bd0: 20 69 73 20 6d 75 63 68 0a 2a 2a 20 66 61 73 74   is much.** fast
2be0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 63 72 69 70 74  er..**.** Script
2bf0: 73 20 74 68 61 74 20 61 72 65 20 73 61 66 65 20  s that are safe 
2c00: 74 6f 20 75 73 65 20 77 69 74 68 20 54 63 6c 5f  to use with Tcl_
2c10: 45 76 61 6c 4f 62 6a 76 28 29 20 63 6f 6e 73 69  EvalObjv() consi
2c20: 73 74 73 20 6f 66 20 61 0a 2a 2a 20 63 6f 6d 6d  sts of a.** comm
2c30: 61 6e 64 20 6e 61 6d 65 20 66 6f 6c 6c 6f 77 65  and name followe
2c40: 64 20 62 79 20 7a 65 72 6f 20 6f 72 20 6d 6f 72  d by zero or mor
2c50: 65 20 61 72 67 75 6d 65 6e 74 73 20 77 69 74 68  e arguments with
2c60: 20 6e 6f 20 5b 2e 2e 2e 5d 20 6f 72 20 24 0a 2a   no [...] or $.*
2c70: 2a 20 6f 72 20 7b 2e 2e 2e 7d 20 6f 72 20 3b 20  * or {...} or ; 
2c80: 74 6f 20 62 65 20 73 65 65 6e 20 61 6e 79 77 68  to be seen anywh
2c90: 65 72 65 2e 20 20 4d 6f 73 74 20 63 61 6c 6c 62  ere.  Most callb
2ca0: 61 63 6b 20 73 63 72 69 70 74 73 20 63 6f 6e 73  ack scripts cons
2cb0: 69 73 74 0a 2a 2a 20 6f 66 20 6a 75 73 74 20 61  ist.** of just a
2cc0: 20 73 69 6e 67 6c 65 20 70 72 6f 63 65 64 75 72   single procedur
2cd0: 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 79 20  e name and they 
2ce0: 6d 65 65 74 20 74 68 69 73 20 72 65 71 75 69 72  meet this requir
2cf0: 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ement..*/.static
2d00: 20 69 6e 74 20 73 61 66 65 54 6f 55 73 65 45 76   int safeToUseEv
2d10: 61 6c 4f 62 6a 76 28 54 63 6c 5f 49 6e 74 65 72  alObjv(Tcl_Inter
2d20: 70 20 2a 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f  p *interp, Tcl_O
2d30: 62 6a 20 2a 70 43 6d 64 29 7b 0a 20 20 2f 2a 20  bj *pCmd){.  /* 
2d40: 57 65 20 63 6f 75 6c 64 20 74 72 79 20 74 6f 20  We could try to 
2d50: 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77 69 74  do something wit
2d60: 68 20 54 63 6c 5f 50 61 72 73 65 28 29 2e 20 20  h Tcl_Parse().  
2d70: 42 75 74 20 77 65 20 77 69 6c 6c 20 69 6e 73 74  But we will inst
2d80: 65 61 64 0a 20 20 2a 2a 20 6a 75 73 74 20 64 6f  ead.  ** just do
2d90: 20 61 20 73 65 61 72 63 68 20 66 6f 72 20 66 6f   a search for fo
2da0: 72 62 69 64 64 65 6e 20 63 68 61 72 61 63 74 65  rbidden characte
2db0: 72 73 2e 20 20 49 66 20 61 6e 79 20 6f 66 20 74  rs.  If any of t
2dc0: 68 65 20 66 6f 72 62 69 64 64 65 6e 0a 20 20 2a  he forbidden.  *
2dd0: 2a 20 63 68 61 72 61 63 74 65 72 73 20 61 70 70  * characters app
2de0: 65 61 72 20 69 6e 20 70 43 6d 64 2c 20 77 65 20  ear in pCmd, we 
2df0: 77 69 6c 6c 20 72 65 70 6f 72 74 20 74 68 65 20  will report the 
2e00: 73 74 72 69 6e 67 20 61 73 20 75 6e 73 61 66 65  string as unsafe
2e10: 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ..  */.  const c
2e20: 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 3b  har *z;.  int n;
2e30: 0a 20 20 7a 20 3d 20 54 63 6c 5f 47 65 74 53 74  .  z = Tcl_GetSt
2e40: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 43 6d 64  ringFromObj(pCmd
2e50: 2c 20 26 6e 29 3b 0a 20 20 77 68 69 6c 65 28 20  , &n);.  while( 
2e60: 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 69  n-- > 0 ){.    i
2e70: 6e 74 20 63 20 3d 20 2a 28 7a 2b 2b 29 3b 0a 20  nt c = *(z++);. 
2e80: 20 20 20 69 66 28 20 63 3d 3d 27 24 27 20 7c 7c     if( c=='$' ||
2e90: 20 63 3d 3d 27 5b 27 20 7c 7c 20 63 3d 3d 27 3b   c=='[' || c==';
2ea0: 27 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ' ) return 0;.  
2eb0: 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
2ec0: 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 6e 20 53  ./*.** Find an S
2ed0: 71 6c 46 75 6e 63 20 73 74 72 75 63 74 75 72 65  qlFunc structure
2ee0: 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
2ef0: 6e 61 6d 65 2e 20 20 4f 72 20 63 72 65 61 74 65  name.  Or create
2f00: 20 61 20 6e 65 77 0a 2a 2a 20 6f 6e 65 20 69 66   a new.** one if
2f10: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6f 6e 65   an existing one
2f20: 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
2f30: 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
2f40: 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73 74  ter to the.** st
2f50: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
2f60: 69 63 20 53 71 6c 46 75 6e 63 20 2a 66 69 6e 64  ic SqlFunc *find
2f70: 53 71 6c 46 75 6e 63 28 53 71 6c 69 74 65 44 62  SqlFunc(SqliteDb
2f80: 20 2a 70 44 62 2c 20 63 6f 6e 73 74 20 63 68 61   *pDb, const cha
2f90: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 53 71 6c  r *zName){.  Sql
2fa0: 46 75 6e 63 20 2a 70 2c 20 2a 70 4e 65 77 3b 0a  Func *p, *pNew;.
2fb0: 20 20 69 6e 74 20 69 3b 0a 20 20 70 4e 65 77 20    int i;.  pNew 
2fc0: 3d 20 28 53 71 6c 46 75 6e 63 2a 29 54 63 6c 5f  = (SqlFunc*)Tcl_
2fd0: 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  Alloc( sizeof(*p
2fe0: 4e 65 77 29 20 2b 20 73 74 72 6c 65 6e 28 7a 4e  New) + strlen(zN
2ff0: 61 6d 65 29 20 2b 20 31 20 29 3b 0a 20 20 70 4e  ame) + 1 );.  pN
3000: 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61  ew->zName = (cha
3010: 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 66  r*)&pNew[1];.  f
3020: 6f 72 28 69 3d 30 3b 20 7a 4e 61 6d 65 5b 69 5d  or(i=0; zName[i]
3030: 3b 20 69 2b 2b 29 7b 20 70 4e 65 77 2d 3e 7a 4e  ; i++){ pNew->zN
3040: 61 6d 65 5b 69 5d 20 3d 20 74 6f 6c 6f 77 65 72  ame[i] = tolower
3050: 28 7a 4e 61 6d 65 5b 69 5d 29 3b 20 7d 0a 20 20  (zName[i]); }.  
3060: 70 4e 65 77 2d 3e 7a 4e 61 6d 65 5b 69 5d 20 3d  pNew->zName[i] =
3070: 20 30 3b 0a 20 20 66 6f 72 28 70 3d 70 44 62 2d   0;.  for(p=pDb-
3080: 3e 70 46 75 6e 63 3b 20 70 3b 20 70 3d 70 2d 3e  >pFunc; p; p=p->
3090: 70 4e 65 78 74 29 7b 20 0a 20 20 20 20 69 66 28  pNext){ .    if(
30a0: 20 73 74 72 63 6d 70 28 70 2d 3e 7a 4e 61 6d 65   strcmp(p->zName
30b0: 2c 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 29 3d 3d  , pNew->zName)==
30c0: 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 46  0 ){.      Tcl_F
30d0: 72 65 65 28 28 63 68 61 72 2a 29 70 4e 65 77 29  ree((char*)pNew)
30e0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  ;.      return p
30f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e  ;.    }.  }.  pN
3100: 65 77 2d 3e 69 6e 74 65 72 70 20 3d 20 70 44 62  ew->interp = pDb
3110: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 70 4e 65 77  ->interp;.  pNew
3120: 2d 3e 70 53 63 72 69 70 74 20 3d 20 30 3b 0a 20  ->pScript = 0;. 
3130: 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70   pNew->pNext = p
3140: 44 62 2d 3e 70 46 75 6e 63 3b 0a 20 20 70 44 62  Db->pFunc;.  pDb
3150: 2d 3e 70 46 75 6e 63 20 3d 20 70 4e 65 77 3b 0a  ->pFunc = pNew;.
3160: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
3170: 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 61 6c 69 7a 65  ../*.** Finalize
3180: 20 61 6e 64 20 66 72 65 65 20 61 20 6c 69 73 74   and free a list
3190: 20 6f 66 20 70 72 65 70 61 72 65 64 20 73 74 61   of prepared sta
31a0: 74 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69  tements.*/.stati
31b0: 63 20 76 6f 69 64 20 66 6c 75 73 68 53 74 6d 74  c void flushStmt
31c0: 43 61 63 68 65 28 20 53 71 6c 69 74 65 44 62 20  Cache( SqliteDb 
31d0: 2a 70 44 62 20 29 7b 0a 20 20 53 71 6c 50 72 65  *pDb ){.  SqlPre
31e0: 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65 53  paredStmt *pPreS
31f0: 74 6d 74 3b 0a 0a 20 20 77 68 69 6c 65 28 20 20  tmt;..  while(  
3200: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 29 7b  pDb->stmtList ){
3210: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
3220: 61 6c 69 7a 65 28 20 70 44 62 2d 3e 73 74 6d 74  alize( pDb->stmt
3230: 4c 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20  List->pStmt );. 
3240: 20 20 20 70 50 72 65 53 74 6d 74 20 3d 20 70 44     pPreStmt = pD
3250: 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 0a 20 20 20  b->stmtList;.   
3260: 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d   pDb->stmtList =
3270: 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 2d 3e   pDb->stmtList->
3280: 70 4e 65 78 74 3b 0a 20 20 20 20 54 63 6c 5f 46  pNext;.    Tcl_F
3290: 72 65 65 28 20 28 63 68 61 72 2a 29 70 50 72 65  ree( (char*)pPre
32a0: 53 74 6d 74 20 29 3b 0a 20 20 7d 0a 20 20 70 44  Stmt );.  }.  pD
32b0: 62 2d 3e 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  b->nStmt = 0;.  
32c0: 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20  pDb->stmtLast = 
32d0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 43 4c 20  0;.}../*.** TCL 
32e0: 63 61 6c 6c 73 20 74 68 69 73 20 70 72 6f 63 65  calls this proce
32f0: 64 75 72 65 20 77 68 65 6e 20 61 6e 20 73 71 6c  dure when an sql
3300: 69 74 65 33 20 64 61 74 61 62 61 73 65 20 63 6f  ite3 database co
3310: 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 64 65 6c 65  mmand is.** dele
3320: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ted..*/.static v
3330: 6f 69 64 20 44 62 44 65 6c 65 74 65 43 6d 64 28  oid DbDeleteCmd(
3340: 76 6f 69 64 20 2a 64 62 29 7b 0a 20 20 53 71 6c  void *db){.  Sql
3350: 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71  iteDb *pDb = (Sq
3360: 6c 69 74 65 44 62 2a 29 64 62 3b 0a 20 20 66 6c  liteDb*)db;.  fl
3370: 75 73 68 53 74 6d 74 43 61 63 68 65 28 70 44 62  ushStmtCache(pDb
3380: 29 3b 0a 20 20 63 6c 6f 73 65 49 6e 63 72 62 6c  );.  closeIncrbl
3390: 6f 62 43 68 61 6e 6e 65 6c 73 28 70 44 62 29 3b  obChannels(pDb);
33a0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  .  sqlite3_close
33b0: 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20 77 68 69  (pDb->db);.  whi
33c0: 6c 65 28 20 70 44 62 2d 3e 70 46 75 6e 63 20 29  le( pDb->pFunc )
33d0: 7b 0a 20 20 20 20 53 71 6c 46 75 6e 63 20 2a 70  {.    SqlFunc *p
33e0: 46 75 6e 63 20 3d 20 70 44 62 2d 3e 70 46 75 6e  Func = pDb->pFun
33f0: 63 3b 0a 20 20 20 20 70 44 62 2d 3e 70 46 75 6e  c;.    pDb->pFun
3400: 63 20 3d 20 70 46 75 6e 63 2d 3e 70 4e 65 78 74  c = pFunc->pNext
3410: 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  ;.    Tcl_DecrRe
3420: 66 43 6f 75 6e 74 28 70 46 75 6e 63 2d 3e 70 53  fCount(pFunc->pS
3430: 63 72 69 70 74 29 3b 0a 20 20 20 20 54 63 6c 5f  cript);.    Tcl_
3440: 46 72 65 65 28 28 63 68 61 72 2a 29 70 46 75 6e  Free((char*)pFun
3450: 63 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28  c);.  }.  while(
3460: 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20 29   pDb->pCollate )
3470: 7b 0a 20 20 20 20 53 71 6c 43 6f 6c 6c 61 74 65  {.    SqlCollate
3480: 20 2a 70 43 6f 6c 6c 61 74 65 20 3d 20 70 44 62   *pCollate = pDb
3490: 2d 3e 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20  ->pCollate;.    
34a0: 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20 3d 20  pDb->pCollate = 
34b0: 70 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78 74 3b  pCollate->pNext;
34c0: 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63  .    Tcl_Free((c
34d0: 68 61 72 2a 29 70 43 6f 6c 6c 61 74 65 29 3b 0a  har*)pCollate);.
34e0: 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a    }.  if( pDb->z
34f0: 42 75 73 79 20 29 7b 0a 20 20 20 20 54 63 6c 5f  Busy ){.    Tcl_
3500: 46 72 65 65 28 70 44 62 2d 3e 7a 42 75 73 79 29  Free(pDb->zBusy)
3510: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d  ;.  }.  if( pDb-
3520: 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20 20 20 54  >zTrace ){.    T
3530: 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 54 72  cl_Free(pDb->zTr
3540: 61 63 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ace);.  }.  if( 
3550: 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b  pDb->zProfile ){
3560: 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44  .    Tcl_Free(pD
3570: 62 2d 3e 7a 50 72 6f 66 69 6c 65 29 3b 0a 20 20  b->zProfile);.  
3580: 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75  }.  if( pDb->zAu
3590: 74 68 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72  th ){.    Tcl_Fr
35a0: 65 65 28 70 44 62 2d 3e 7a 41 75 74 68 29 3b 0a  ee(pDb->zAuth);.
35b0: 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a    }.  if( pDb->z
35c0: 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 54 63 6c 5f  Null ){.    Tcl_
35d0: 46 72 65 65 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29  Free(pDb->zNull)
35e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d  ;.  }.  if( pDb-
35f0: 3e 70 55 70 64 61 74 65 48 6f 6f 6b 20 29 7b 0a  >pUpdateHook ){.
3600: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
3610: 6f 75 6e 74 28 70 44 62 2d 3e 70 55 70 64 61 74  ount(pDb->pUpdat
3620: 65 48 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20 69 66  eHook);.  }.  if
3630: 28 20 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b  ( pDb->pRollback
3640: 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  Hook ){.    Tcl_
3650: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62  DecrRefCount(pDb
3660: 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 29  ->pRollbackHook)
3670: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d  ;.  }.  if( pDb-
3680: 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 20  >pCollateNeeded 
3690: 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52  ){.    Tcl_DecrR
36a0: 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f  efCount(pDb->pCo
36b0: 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20  llateNeeded);.  
36c0: 7d 0a 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68  }.  Tcl_Free((ch
36d0: 61 72 2a 29 70 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a  ar*)pDb);.}../*.
36e0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
36f0: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
3700: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
3710: 73 20 6c 6f 63 6b 65 64 20 77 68 69 6c 65 20 74  s locked while t
3720: 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 65 78 65 63  rying.** to exec
3730: 75 74 65 20 53 51 4c 2e 0a 2a 2f 0a 73 74 61 74  ute SQL..*/.stat
3740: 69 63 20 69 6e 74 20 44 62 42 75 73 79 48 61 6e  ic int DbBusyHan
3750: 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 2c 20 69  dler(void *cd, i
3760: 6e 74 20 6e 54 72 69 65 73 29 7b 0a 20 20 53 71  nt nTries){.  Sq
3770: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
3780: 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69  qliteDb*)cd;.  i
3790: 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 56  nt rc;.  char zV
37a0: 61 6c 5b 33 30 5d 3b 0a 0a 20 20 73 71 6c 69 74  al[30];..  sqlit
37b0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
37c0: 6f 66 28 7a 56 61 6c 29 2c 20 7a 56 61 6c 2c 20  of(zVal), zVal, 
37d0: 22 25 64 22 2c 20 6e 54 72 69 65 73 29 3b 0a 20  "%d", nTries);. 
37e0: 20 72 63 20 3d 20 54 63 6c 5f 56 61 72 45 76 61   rc = Tcl_VarEva
37f0: 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70  l(pDb->interp, p
3800: 44 62 2d 3e 7a 42 75 73 79 2c 20 22 20 22 2c 20  Db->zBusy, " ", 
3810: 7a 56 61 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b  zVal, (char*)0);
3820: 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f  .  if( rc!=TCL_O
3830: 4b 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65  K || atoi(Tcl_Ge
3840: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44  tStringResult(pD
3850: 62 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a 20  b->interp)) ){. 
3860: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
3870: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
3880: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
3890: 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c  MIT_PROGRESS_CAL
38a0: 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73  LBACK./*.** This
38b0: 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f   routine is invo
38c0: 6b 65 64 20 61 73 20 74 68 65 20 27 70 72 6f 67  ked as the 'prog
38d0: 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 27 20 66  ress callback' f
38e0: 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  or the database.
38f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44  .*/.static int D
3900: 62 50 72 6f 67 72 65 73 73 48 61 6e 64 6c 65 72  bProgressHandler
3910: 28 76 6f 69 64 20 2a 63 64 29 7b 0a 20 20 53 71  (void *cd){.  Sq
3920: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
3930: 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69  qliteDb*)cd;.  i
3940: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
3950: 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73  ( pDb->zProgress
3960: 20 29 3b 0a 20 20 72 63 20 3d 20 54 63 6c 5f 45   );.  rc = Tcl_E
3970: 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  val(pDb->interp,
3980: 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 29   pDb->zProgress)
3990: 3b 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f  ;.  if( rc!=TCL_
39a0: 4f 4b 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47  OK || atoi(Tcl_G
39b0: 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70  etStringResult(p
39c0: 44 62 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a  Db->interp)) ){.
39d0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
39e0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
39f0: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
3a00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
3a10: 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E./*.** This rou
3a20: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
3a30: 79 20 74 68 65 20 53 51 4c 69 74 65 20 74 72 61  y the SQLite tra
3a40: 63 65 20 68 61 6e 64 6c 65 72 20 77 68 65 6e 65  ce handler whene
3a50: 76 65 72 20 61 20 6e 65 77 0a 2a 2a 20 62 6c 6f  ver a new.** blo
3a60: 63 6b 20 6f 66 20 53 51 4c 20 69 73 20 65 78 65  ck of SQL is exe
3a70: 63 75 74 65 64 2e 20 20 54 68 65 20 54 43 4c 20  cuted.  The TCL 
3a80: 73 63 72 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a  script in pDb->z
3a90: 54 72 61 63 65 20 69 73 20 65 78 65 63 75 74 65  Trace is execute
3aa0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
3ab0: 64 20 44 62 54 72 61 63 65 48 61 6e 64 6c 65 72  d DbTraceHandler
3ac0: 28 76 6f 69 64 20 2a 63 64 2c 20 63 6f 6e 73 74  (void *cd, const
3ad0: 20 63 68 61 72 20 2a 7a 53 71 6c 29 7b 0a 20 20   char *zSql){.  
3ae0: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
3af0: 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20  (SqliteDb*)cd;. 
3b00: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72   Tcl_DString str
3b10: 3b 0a 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  ;..  Tcl_DString
3b20: 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 54 63  Init(&str);.  Tc
3b30: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28  l_DStringAppend(
3b40: 26 73 74 72 2c 20 70 44 62 2d 3e 7a 54 72 61 63  &str, pDb->zTrac
3b50: 65 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53  e, -1);.  Tcl_DS
3b60: 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65  tringAppendEleme
3b70: 6e 74 28 26 73 74 72 2c 20 7a 53 71 6c 29 3b 0a  nt(&str, zSql);.
3b80: 20 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e    Tcl_Eval(pDb->
3b90: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53 74 72  interp, Tcl_DStr
3ba0: 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29 29 3b  ingValue(&str));
3bb0: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72  .  Tcl_DStringFr
3bc0: 65 65 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f  ee(&str);.  Tcl_
3bd0: 52 65 73 65 74 52 65 73 75 6c 74 28 70 44 62 2d  ResetResult(pDb-
3be0: 3e 69 6e 74 65 72 70 29 3b 0a 7d 0a 23 65 6e 64  >interp);.}.#end
3bf0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
3c00: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a  TE_OMIT_TRACE./*
3c10: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
3c20: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
3c30: 65 20 53 51 4c 69 74 65 20 70 72 6f 66 69 6c 65  e SQLite profile
3c40: 20 68 61 6e 64 6c 65 72 20 61 66 74 65 72 20 61   handler after a
3c50: 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 53 51   statement.** SQ
3c60: 4c 20 68 61 73 20 65 78 65 63 75 74 65 64 2e 20  L has executed. 
3c70: 20 54 68 65 20 54 43 4c 20 73 63 72 69 70 74 20   The TCL script 
3c80: 69 6e 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65  in pDb->zProfile
3c90: 20 69 73 20 65 76 61 6c 75 61 74 65 64 2e 0a 2a   is evaluated..*
3ca0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44 62  /.static void Db
3cb0: 50 72 6f 66 69 6c 65 48 61 6e 64 6c 65 72 28 76  ProfileHandler(v
3cc0: 6f 69 64 20 2a 63 64 2c 20 63 6f 6e 73 74 20 63  oid *cd, const c
3cd0: 68 61 72 20 2a 7a 53 71 6c 2c 20 73 71 6c 69 74  har *zSql, sqlit
3ce0: 65 5f 75 69 6e 74 36 34 20 74 6d 29 7b 0a 20 20  e_uint64 tm){.  
3cf0: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
3d00: 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20  (SqliteDb*)cd;. 
3d10: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72   Tcl_DString str
3d20: 3b 0a 20 20 63 68 61 72 20 7a 54 6d 5b 31 30 30  ;.  char zTm[100
3d30: 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  ];..  sqlite3_sn
3d40: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 54  printf(sizeof(zT
3d50: 6d 29 2d 31 2c 20 7a 54 6d 2c 20 22 25 6c 6c 64  m)-1, zTm, "%lld
3d60: 22 2c 20 74 6d 29 3b 0a 20 20 54 63 6c 5f 44 53  ", tm);.  Tcl_DS
3d70: 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b  tringInit(&str);
3d80: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70  .  Tcl_DStringAp
3d90: 70 65 6e 64 28 26 73 74 72 2c 20 70 44 62 2d 3e  pend(&str, pDb->
3da0: 7a 50 72 6f 66 69 6c 65 2c 20 2d 31 29 3b 0a 20  zProfile, -1);. 
3db0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
3dc0: 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20  ndElement(&str, 
3dd0: 7a 53 71 6c 29 3b 0a 20 20 54 63 6c 5f 44 53 74  zSql);.  Tcl_DSt
3de0: 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e  ringAppendElemen
3df0: 74 28 26 73 74 72 2c 20 7a 54 6d 29 3b 0a 20 20  t(&str, zTm);.  
3e00: 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e  Tcl_Eval(pDb->in
3e10: 74 65 72 70 2c 20 54 63 6c 5f 44 53 74 72 69 6e  terp, Tcl_DStrin
3e20: 67 56 61 6c 75 65 28 26 73 74 72 29 29 3b 0a 20  gValue(&str));. 
3e30: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
3e40: 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f 52 65  (&str);.  Tcl_Re
3e50: 73 65 74 52 65 73 75 6c 74 28 70 44 62 2d 3e 69  setResult(pDb->i
3e60: 6e 74 65 72 70 29 3b 0a 7d 0a 23 65 6e 64 69 66  nterp);.}.#endif
3e70: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
3e80: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
3e90: 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hen a transactio
3ea0: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 20  n is committed. 
3eb0: 20 54 68 65 0a 2a 2a 20 54 43 4c 20 73 63 72 69   The.** TCL scri
3ec0: 70 74 20 69 6e 20 70 44 62 2d 3e 7a 43 6f 6d 6d  pt in pDb->zComm
3ed0: 69 74 20 69 73 20 65 78 65 63 75 74 65 64 2e 20  it is executed. 
3ee0: 20 49 66 20 69 74 20 72 65 74 75 72 6e 73 20 6e   If it returns n
3ef0: 6f 6e 2d 7a 65 72 6f 20 6f 72 0a 2a 2a 20 69 66  on-zero or.** if
3f00: 20 69 74 20 74 68 72 6f 77 73 20 61 6e 20 65 78   it throws an ex
3f10: 63 65 70 74 69 6f 6e 2c 20 74 68 65 20 74 72 61  ception, the tra
3f20: 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
3f30: 65 64 20 62 61 63 6b 20 69 6e 73 74 65 61 64 0a  ed back instead.
3f40: 2a 2a 20 6f 66 20 62 65 69 6e 67 20 63 6f 6d 6d  ** of being comm
3f50: 69 74 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  itted..*/.static
3f60: 20 69 6e 74 20 44 62 43 6f 6d 6d 69 74 48 61 6e   int DbCommitHan
3f70: 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 29 7b 0a  dler(void *cd){.
3f80: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
3f90: 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b  = (SqliteDb*)cd;
3fa0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63  .  int rc;..  rc
3fb0: 20 3d 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d   = Tcl_Eval(pDb-
3fc0: 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 43  >interp, pDb->zC
3fd0: 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63  ommit);.  if( rc
3fe0: 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69  !=TCL_OK || atoi
3ff0: 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65  (Tcl_GetStringRe
4000: 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70  sult(pDb->interp
4010: 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  )) ){.    return
4020: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
4030: 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f   0;.}..static vo
4040: 69 64 20 44 62 52 6f 6c 6c 62 61 63 6b 48 61 6e  id DbRollbackHan
4050: 64 6c 65 72 28 76 6f 69 64 20 2a 63 6c 69 65 6e  dler(void *clien
4060: 74 44 61 74 61 29 7b 0a 20 20 53 71 6c 69 74 65  tData){.  Sqlite
4070: 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74  Db *pDb = (Sqlit
4080: 65 44 62 2a 29 63 6c 69 65 6e 74 44 61 74 61 3b  eDb*)clientData;
4090: 0a 20 20 61 73 73 65 72 74 28 70 44 62 2d 3e 70  .  assert(pDb->p
40a0: 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 29 3b 0a 20  RollbackHook);. 
40b0: 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c   if( TCL_OK!=Tcl
40c0: 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e  _EvalObjEx(pDb->
40d0: 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 70 52 6f  interp, pDb->pRo
40e0: 6c 6c 62 61 63 6b 48 6f 6f 6b 2c 20 30 29 20 29  llbackHook, 0) )
40f0: 7b 0a 20 20 20 20 54 63 6c 5f 42 61 63 6b 67 72  {.    Tcl_Backgr
4100: 6f 75 6e 64 45 72 72 6f 72 28 70 44 62 2d 3e 69  oundError(pDb->i
4110: 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 73  nterp);.  }.}..s
4120: 74 61 74 69 63 20 76 6f 69 64 20 44 62 55 70 64  tatic void DbUpd
4130: 61 74 65 48 61 6e 64 6c 65 72 28 0a 20 20 76 6f  ateHandler(.  vo
4140: 69 64 20 2a 70 2c 20 0a 20 20 69 6e 74 20 6f 70  id *p, .  int op
4150: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
4160: 7a 44 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68  zDb, .  const ch
4170: 61 72 20 2a 7a 54 62 6c 2c 20 0a 20 20 73 71 6c  ar *zTbl, .  sql
4180: 69 74 65 5f 69 6e 74 36 34 20 72 6f 77 69 64 0a  ite_int64 rowid.
4190: 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  ){.  SqliteDb *p
41a0: 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 20 2a  Db = (SqliteDb *
41b0: 29 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  )p;.  Tcl_Obj *p
41c0: 43 6d 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Cmd;..  assert( 
41d0: 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b  pDb->pUpdateHook
41e0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
41f0: 3d 3d 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 20  ==SQLITE_INSERT 
4200: 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 55 50  || op==SQLITE_UP
4210: 44 41 54 45 20 7c 7c 20 6f 70 3d 3d 53 51 4c 49  DATE || op==SQLI
4220: 54 45 5f 44 45 4c 45 54 45 20 29 3b 0a 0a 20 20  TE_DELETE );..  
4230: 70 43 6d 64 20 3d 20 54 63 6c 5f 44 75 70 6c 69  pCmd = Tcl_Dupli
4240: 63 61 74 65 4f 62 6a 28 70 44 62 2d 3e 70 55 70  cateObj(pDb->pUp
4250: 64 61 74 65 48 6f 6f 6b 29 3b 0a 20 20 54 63 6c  dateHook);.  Tcl
4260: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43  _IncrRefCount(pC
4270: 6d 64 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  md);.  Tcl_ListO
4280: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
4290: 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77  0, pCmd, Tcl_New
42a0: 53 74 72 69 6e 67 4f 62 6a 28 0a 20 20 20 20 28  StringObj(.    (
42b0: 20 28 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 53   (op==SQLITE_INS
42c0: 45 52 54 29 3f 22 49 4e 53 45 52 54 22 3a 28 6f  ERT)?"INSERT":(o
42d0: 70 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45  p==SQLITE_UPDATE
42e0: 29 3f 22 55 50 44 41 54 45 22 3a 22 44 45 4c 45  )?"UPDATE":"DELE
42f0: 54 45 22 29 2c 20 2d 31 29 29 3b 0a 20 20 54 63  TE"), -1));.  Tc
4300: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
4310: 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20  lement(0, pCmd, 
4320: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
4330: 28 7a 44 62 2c 20 2d 31 29 29 3b 0a 20 20 54 63  (zDb, -1));.  Tc
4340: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
4350: 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20  lement(0, pCmd, 
4360: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
4370: 28 7a 54 62 6c 2c 20 2d 31 29 29 3b 0a 20 20 54  (zTbl, -1));.  T
4380: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
4390: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c  Element(0, pCmd,
43a0: 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f   Tcl_NewWideIntO
43b0: 62 6a 28 72 6f 77 69 64 29 29 3b 0a 20 20 54 63  bj(rowid));.  Tc
43c0: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d  l_EvalObjEx(pDb-
43d0: 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54  >interp, pCmd, T
43e0: 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b  CL_EVAL_DIRECT);
43f0: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
4400: 74 63 6c 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64  tclCollateNeeded
4410: 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 0a  (.  void *pCtx,.
4420: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
4430: 20 69 6e 74 20 65 6e 63 2c 0a 20 20 63 6f 6e 73   int enc,.  cons
4440: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b  t char *zName.){
4450: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
4460: 20 3d 20 28 53 71 6c 69 74 65 44 62 20 2a 29 70   = (SqliteDb *)p
4470: 43 74 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  Ctx;.  Tcl_Obj *
4480: 70 53 63 72 69 70 74 20 3d 20 54 63 6c 5f 44 75  pScript = Tcl_Du
4490: 70 6c 69 63 61 74 65 4f 62 6a 28 70 44 62 2d 3e  plicateObj(pDb->
44a0: 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b  pCollateNeeded);
44b0: 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  .  Tcl_IncrRefCo
44c0: 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 20 20  unt(pScript);.  
44d0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
44e0: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 53 63 72  dElement(0, pScr
44f0: 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  ipt, Tcl_NewStri
4500: 6e 67 4f 62 6a 28 7a 4e 61 6d 65 2c 20 2d 31 29  ngObj(zName, -1)
4510: 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  );.  Tcl_EvalObj
4520: 45 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  Ex(pDb->interp, 
4530: 70 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20 54  pScript, 0);.  T
4540: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
4550: 70 53 63 72 69 70 74 29 3b 0a 7d 0a 0a 2f 2a 0a  pScript);.}../*.
4560: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
4570: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 76 61  is called to eva
4580: 6c 75 61 74 65 20 61 6e 20 53 51 4c 20 63 6f 6c  luate an SQL col
4590: 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  lation function 
45a0: 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 75  implemented.** u
45b0: 73 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74 2e  sing TCL script.
45c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
45d0: 63 6c 53 71 6c 43 6f 6c 6c 61 74 65 28 0a 20 20  clSqlCollate(.  
45e0: 76 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20 69 6e  void *pCtx,.  in
45f0: 74 20 6e 41 2c 0a 20 20 63 6f 6e 73 74 20 76 6f  t nA,.  const vo
4600: 69 64 20 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e 42  id *zA,.  int nB
4610: 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ,.  const void *
4620: 7a 42 0a 29 7b 0a 20 20 53 71 6c 43 6f 6c 6c 61  zB.){.  SqlColla
4630: 74 65 20 2a 70 20 3d 20 28 53 71 6c 43 6f 6c 6c  te *p = (SqlColl
4640: 61 74 65 20 2a 29 70 43 74 78 3b 0a 20 20 54 63  ate *)pCtx;.  Tc
4650: 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 0a 20 20  l_Obj *pCmd;..  
4660: 70 43 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 53 74  pCmd = Tcl_NewSt
4670: 72 69 6e 67 4f 62 6a 28 70 2d 3e 7a 53 63 72 69  ringObj(p->zScri
4680: 70 74 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49  pt, -1);.  Tcl_I
4690: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64  ncrRefCount(pCmd
46a0: 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
46b0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d  AppendElement(p-
46c0: 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54  >interp, pCmd, T
46d0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
46e0: 7a 41 2c 20 6e 41 29 29 3b 0a 20 20 54 63 6c 5f  zA, nA));.  Tcl_
46f0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
4700: 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c 20  ment(p->interp, 
4710: 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72  pCmd, Tcl_NewStr
4720: 69 6e 67 4f 62 6a 28 7a 42 2c 20 6e 42 29 29 3b  ingObj(zB, nB));
4730: 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78  .  Tcl_EvalObjEx
4740: 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64  (p->interp, pCmd
4750: 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43  , TCL_EVAL_DIREC
4760: 54 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65  T);.  Tcl_DecrRe
4770: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
4780: 72 65 74 75 72 6e 20 28 61 74 6f 69 28 54 63 6c  return (atoi(Tcl
4790: 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74  _GetStringResult
47a0: 28 70 2d 3e 69 6e 74 65 72 70 29 29 29 3b 0a 7d  (p->interp)));.}
47b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
47c0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
47d0: 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20 53 51  o evaluate an SQ
47e0: 4c 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65  L function imple
47f0: 6d 65 6e 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20  mented.** using 
4800: 54 43 4c 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 73  TCL script..*/.s
4810: 74 61 74 69 63 20 76 6f 69 64 20 74 63 6c 53 71  tatic void tclSq
4820: 6c 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  lFunc(sqlite3_co
4830: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20  ntext *context, 
4840: 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
4850: 33 5f 76 61 6c 75 65 2a 2a 61 72 67 76 29 7b 0a  3_value**argv){.
4860: 20 20 53 71 6c 46 75 6e 63 20 2a 70 20 3d 20 73    SqlFunc *p = s
4870: 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
4880: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 54 63 6c  (context);.  Tcl
4890: 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 20 20 69 6e  _Obj *pCmd;.  in
48a0: 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  t i;.  int rc;..
48b0: 20 20 69 66 28 20 61 72 67 63 3d 3d 30 20 29 7b    if( argc==0 ){
48c0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
48d0: 20 61 72 65 20 6e 6f 20 61 72 67 75 6d 65 6e 74   are no argument
48e0: 73 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f  s to the functio
48f0: 6e 2c 20 63 61 6c 6c 20 54 63 6c 5f 45 76 61 6c  n, call Tcl_Eval
4900: 4f 62 6a 45 78 20 6f 6e 20 74 68 65 0a 20 20 20  ObjEx on the.   
4910: 20 2a 2a 20 73 63 72 69 70 74 20 6f 62 6a 65 63   ** script objec
4920: 74 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68 69  t directly.  Thi
4930: 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 54 43 4c  s allows the TCL
4940: 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20 67 65 6e   compiler to gen
4950: 65 72 61 74 65 0a 20 20 20 20 2a 2a 20 62 79 74  erate.    ** byt
4960: 65 63 6f 64 65 20 66 6f 72 20 74 68 65 20 63 6f  ecode for the co
4970: 6d 6d 61 6e 64 20 6f 6e 20 74 68 65 20 66 69 72  mmand on the fir
4980: 73 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 61 6e  st invocation an
4990: 64 20 74 68 75 73 20 6d 61 6b 65 0a 20 20 20 20  d thus make.    
49a0: 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20 69 6e  ** subsequent in
49b0: 76 6f 63 61 74 69 6f 6e 73 20 6d 75 63 68 20 66  vocations much f
49c0: 61 73 74 65 72 2e 20 2a 2f 0a 20 20 20 20 70 43  aster. */.    pC
49d0: 6d 64 20 3d 20 70 2d 3e 70 53 63 72 69 70 74 3b  md = p->pScript;
49e0: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
49f0: 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20  Count(pCmd);.   
4a00: 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62   rc = Tcl_EvalOb
4a10: 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70  jEx(p->interp, p
4a20: 43 6d 64 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c  Cmd, 0);.    Tcl
4a30: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43  _DecrRefCount(pC
4a40: 6d 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  md);.  }else{.  
4a50: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
4a60: 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74  e arguments to t
4a70: 68 65 20 66 75 6e 63 74 69 6f 6e 2c 20 6d 61 6b  he function, mak
4a80: 65 20 61 20 73 68 61 6c 6c 6f 77 20 63 6f 70 79  e a shallow copy
4a90: 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 73   of the.    ** s
4aa0: 63 72 69 70 74 20 6f 62 6a 65 63 74 2c 20 6c 61  cript object, la
4ab0: 70 70 65 6e 64 20 74 68 65 20 61 72 67 75 6d 65  ppend the argume
4ac0: 6e 74 73 2c 20 74 68 65 6e 20 65 76 61 6c 75 61  nts, then evalua
4ad0: 74 65 20 74 68 65 20 63 6f 70 79 2e 0a 20 20 20  te the copy..   
4ae0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 42 79 20 22 73   **.    ** By "s
4af0: 68 61 6c 6c 6f 77 22 20 63 6f 70 79 2c 20 77 65  hallow" copy, we
4b00: 20 6d 65 61 6e 20 61 20 6f 6e 6c 79 20 74 68 65   mean a only the
4b10: 20 6f 75 74 65 72 20 6c 69 73 74 20 54 63 6c 5f   outer list Tcl_
4b20: 4f 62 6a 20 69 73 20 64 75 70 6c 69 63 61 74 65  Obj is duplicate
4b30: 64 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6e 65  d..    ** The ne
4b40: 77 20 54 63 6c 5f 4f 62 6a 20 63 6f 6e 74 61 69  w Tcl_Obj contai
4b50: 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74  ns pointers to t
4b60: 68 65 20 6f 72 69 67 69 6e 61 6c 20 6c 69 73 74  he original list
4b70: 20 65 6c 65 6d 65 6e 74 73 2e 20 0a 20 20 20 20   elements. .    
4b80: 2a 2a 20 54 68 61 74 20 77 61 79 2c 20 77 68 65  ** That way, whe
4b90: 6e 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29  n Tcl_EvalObjv()
4ba0: 20 69 73 20 72 75 6e 20 61 6e 64 20 73 68 69 6d   is run and shim
4bb0: 6d 65 72 73 20 74 68 65 20 66 69 72 73 74 20 65  mers the first e
4bc0: 6c 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 6f 66  lement.    ** of
4bd0: 20 74 68 65 20 6c 69 73 74 20 74 6f 20 74 63 6c   the list to tcl
4be0: 43 6d 64 4e 61 6d 65 54 79 70 65 2c 20 74 68 61  CmdNameType, tha
4bf0: 74 20 61 6c 74 65 72 6e 61 74 65 20 72 65 70 72  t alternate repr
4c00: 65 73 65 6e 74 61 74 69 6f 6e 20 77 69 6c 6c 0a  esentation will.
4c10: 20 20 20 20 2a 2a 20 62 65 20 70 72 65 73 65 72      ** be preser
4c20: 76 65 64 20 61 6e 64 20 72 65 75 73 65 64 20 6f  ved and reused o
4c30: 6e 20 74 68 65 20 6e 65 78 74 20 69 6e 76 6f 63  n the next invoc
4c40: 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ation..    */.  
4c50: 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 41 72 67    Tcl_Obj **aArg
4c60: 3b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a  ;.    int nArg;.
4c70: 20 20 20 20 69 66 28 20 54 63 6c 5f 4c 69 73 74      if( Tcl_List
4c80: 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 70  ObjGetElements(p
4c90: 2d 3e 69 6e 74 65 72 70 2c 20 70 2d 3e 70 53 63  ->interp, p->pSc
4ca0: 72 69 70 74 2c 20 26 6e 41 72 67 2c 20 26 61 41  ript, &nArg, &aA
4cb0: 72 67 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  rg) ){.      sql
4cc0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
4cd0: 72 28 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f 47  r(context, Tcl_G
4ce0: 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70  etStringResult(p
4cf0: 2d 3e 69 6e 74 65 72 70 29 2c 20 2d 31 29 3b 20  ->interp), -1); 
4d00: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
4d10: 20 20 20 7d 20 20 20 20 20 0a 20 20 20 20 70 43     }     .    pC
4d20: 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74  md = Tcl_NewList
4d30: 4f 62 6a 28 6e 41 72 67 2c 20 61 41 72 67 29 3b  Obj(nArg, aArg);
4d40: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
4d50: 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20  Count(pCmd);.   
4d60: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63   for(i=0; i<argc
4d70: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
4d80: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 49 6e  lite3_value *pIn
4d90: 20 3d 20 61 72 67 76 5b 69 5d 3b 0a 20 20 20 20   = argv[i];.    
4da0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b    Tcl_Obj *pVal;
4db0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20  .            .  
4dc0: 20 20 20 20 2f 2a 20 53 65 74 20 70 56 61 6c 20      /* Set pVal 
4dd0: 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 69  to contain the i
4de0: 27 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  'th column of th
4df0: 69 73 20 72 6f 77 2e 20 2a 2f 0a 20 20 20 20 20  is row. */.     
4e00: 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33   switch( sqlite3
4e10: 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 49 6e 29  _value_type(pIn)
4e20: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65   ){.        case
4e30: 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a   SQLITE_BLOB: {.
4e40: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 62 79            int by
4e50: 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  tes = sqlite3_va
4e60: 6c 75 65 5f 62 79 74 65 73 28 70 49 6e 29 3b 0a  lue_bytes(pIn);.
4e70: 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d            pVal =
4e80: 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61   Tcl_NewByteArra
4e90: 79 4f 62 6a 28 73 71 6c 69 74 65 33 5f 76 61 6c  yObj(sqlite3_val
4ea0: 75 65 5f 62 6c 6f 62 28 70 49 6e 29 2c 20 62 79  ue_blob(pIn), by
4eb0: 74 65 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tes);.          
4ec0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
4ed0: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51  .        case SQ
4ee0: 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a  LITE_INTEGER: {.
4ef0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
4f00: 5f 69 6e 74 36 34 20 76 20 3d 20 73 71 6c 69 74  _int64 v = sqlit
4f10: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 70  e3_value_int64(p
4f20: 49 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  In);.          i
4f30: 66 28 20 76 3e 3d 2d 32 31 34 37 34 38 33 36 34  f( v>=-214748364
4f40: 37 20 26 26 20 76 3c 3d 32 31 34 37 34 38 33 36  7 && v<=21474836
4f50: 34 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  47 ){.          
4f60: 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77    pVal = Tcl_New
4f70: 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20 20  IntObj(v);.     
4f80: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4f90: 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54          pVal = T
4fa0: 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a  cl_NewWideIntObj
4fb0: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  (v);.          }
4fc0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
4fd0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
4fe0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
4ff0: 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 20  FLOAT: {.       
5000: 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 73 71     double r = sq
5010: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62  lite3_value_doub
5020: 6c 65 28 70 49 6e 29 3b 0a 20 20 20 20 20 20 20  le(pIn);.       
5030: 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65     pVal = Tcl_Ne
5040: 77 44 6f 75 62 6c 65 4f 62 6a 28 72 29 3b 0a 20  wDoubleObj(r);. 
5050: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
5060: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5070: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55    case SQLITE_NU
5080: 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  LL: {.          
5090: 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74  pVal = Tcl_NewSt
50a0: 72 69 6e 67 4f 62 6a 28 22 22 2c 20 30 29 3b 0a  ringObj("", 0);.
50b0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
50c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
50d0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
50e0: 20 20 20 20 20 20 20 20 69 6e 74 20 62 79 74 65          int byte
50f0: 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  s = sqlite3_valu
5100: 65 5f 62 79 74 65 73 28 70 49 6e 29 3b 0a 20 20  e_bytes(pIn);.  
5110: 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54          pVal = T
5120: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
5130: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
5140: 76 61 6c 75 65 5f 74 65 78 74 28 70 49 6e 29 2c  value_text(pIn),
5150: 20 62 79 74 65 73 29 3b 0a 20 20 20 20 20 20 20   bytes);.       
5160: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
5170: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
5180: 20 20 72 63 20 3d 20 54 63 6c 5f 4c 69 73 74 4f    rc = Tcl_ListO
5190: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
51a0: 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c  p->interp, pCmd,
51b0: 20 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 69 66   pVal);.      if
51c0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
51d0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
51e0: 28 70 43 6d 64 29 3b 0a 20 20 20 20 20 20 20 20  (pCmd);.        
51f0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
5200: 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 54 63  rror(context, Tc
5210: 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
5220: 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c 20 2d 31  t(p->interp), -1
5230: 29 3b 20 0a 20 20 20 20 20 20 20 20 72 65 74 75  ); .        retu
5240: 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
5250: 7d 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 75 73  }.    if( !p->us
5260: 65 45 76 61 6c 4f 62 6a 76 20 29 7b 0a 20 20 20  eEvalObjv ){.   
5270: 20 20 20 2f 2a 20 54 63 6c 5f 45 76 61 6c 4f 62     /* Tcl_EvalOb
5280: 6a 45 78 28 29 20 77 69 6c 6c 20 61 75 74 6f 6d  jEx() will autom
5290: 61 74 69 63 61 6c 6c 79 20 63 61 6c 6c 20 54 63  atically call Tc
52a0: 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 69 66 20  l_EvalObjv() if 
52b0: 70 43 6d 64 0a 20 20 20 20 20 20 2a 2a 20 69 73  pCmd.      ** is
52c0: 20 61 20 6c 69 73 74 20 77 69 74 68 6f 75 74 20   a list without 
52d0: 61 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65  a string represe
52e0: 6e 74 61 74 69 6f 6e 2e 20 20 54 6f 20 70 72 65  ntation.  To pre
52f0: 76 65 6e 74 20 74 68 69 73 20 66 72 6f 6d 0a 20  vent this from. 
5300: 20 20 20 20 20 2a 2a 20 68 61 70 70 65 6e 69 6e       ** happenin
5310: 67 2c 20 6d 61 6b 65 20 73 75 72 65 20 70 43 6d  g, make sure pCm
5320: 64 20 68 61 73 20 61 20 76 61 6c 69 64 20 73 74  d has a valid st
5330: 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74  ring representat
5340: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 54 63 6c  ion */.      Tcl
5350: 5f 47 65 74 53 74 72 69 6e 67 28 70 43 6d 64 29  _GetString(pCmd)
5360: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
5370: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70   Tcl_EvalObjEx(p
5380: 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20  ->interp, pCmd, 
5390: 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29  TCL_EVAL_DIRECT)
53a0: 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  ;.    Tcl_DecrRe
53b0: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
53c0: 7d 0a 0a 20 20 69 66 28 20 72 63 20 26 26 20 72  }..  if( rc && r
53d0: 63 21 3d 54 43 4c 5f 52 45 54 55 52 4e 20 29 7b  c!=TCL_RETURN ){
53e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
53f0: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
5400: 74 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  t, Tcl_GetString
5410: 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70  Result(p->interp
5420: 29 2c 20 2d 31 29 3b 20 0a 20 20 7d 65 6c 73 65  ), -1); .  }else
5430: 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  {.    Tcl_Obj *p
5440: 56 61 72 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a  Var = Tcl_GetObj
5450: 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70  Result(p->interp
5460: 29 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  );.    int n;.  
5470: 20 20 75 38 20 2a 64 61 74 61 3b 0a 20 20 20 20    u8 *data;.    
5480: 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 70 56  char *zType = pV
5490: 61 72 2d 3e 74 79 70 65 50 74 72 20 3f 20 70 56  ar->typePtr ? pV
54a0: 61 72 2d 3e 74 79 70 65 50 74 72 2d 3e 6e 61 6d  ar->typePtr->nam
54b0: 65 20 3a 20 22 22 3b 0a 20 20 20 20 63 68 61 72  e : "";.    char
54c0: 20 63 20 3d 20 7a 54 79 70 65 5b 30 5d 3b 0a 20   c = zType[0];. 
54d0: 20 20 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26     if( c=='b' &&
54e0: 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 62   strcmp(zType,"b
54f0: 79 74 65 61 72 72 61 79 22 29 3d 3d 30 20 26 26  ytearray")==0 &&
5500: 20 70 56 61 72 2d 3e 62 79 74 65 73 3d 3d 30 20   pVar->bytes==0 
5510: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79  ){.      /* Only
5520: 20 72 65 74 75 72 6e 20 61 20 42 4c 4f 42 20 74   return a BLOB t
5530: 79 70 65 20 69 66 20 74 68 65 20 54 63 6c 20 76  ype if the Tcl v
5540: 61 72 69 61 62 6c 65 20 69 73 20 61 20 62 79 74  ariable is a byt
5550: 65 61 72 72 61 79 20 61 6e 64 0a 20 20 20 20 20  earray and.     
5560: 20 2a 2a 20 68 61 73 20 6e 6f 20 73 74 72 69 6e   ** has no strin
5570: 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  g representation
5580: 2e 20 2a 2f 0a 20 20 20 20 20 20 64 61 74 61 20  . */.      data 
5590: 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  = Tcl_GetByteArr
55a0: 61 79 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20  ayFromObj(pVar, 
55b0: 26 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  &n);.      sqlit
55c0: 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 28 63  e3_result_blob(c
55d0: 6f 6e 74 65 78 74 2c 20 64 61 74 61 2c 20 6e 2c  ontext, data, n,
55e0: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
55f0: 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  T);.    }else if
5600: 28 20 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63  ( c=='b' && strc
5610: 6d 70 28 7a 54 79 70 65 2c 22 62 6f 6f 6c 65 61  mp(zType,"boolea
5620: 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  n")==0 ){.      
5630: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
5640: 6a 28 30 2c 20 70 56 61 72 2c 20 26 6e 29 3b 0a  j(0, pVar, &n);.
5650: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
5660: 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74  sult_int(context
5670: 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  , n);.    }else 
5680: 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20 73 74  if( c=='d' && st
5690: 72 63 6d 70 28 7a 54 79 70 65 2c 22 64 6f 75 62  rcmp(zType,"doub
56a0: 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  le")==0 ){.     
56b0: 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20 20   double r;.     
56c0: 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72   Tcl_GetDoubleFr
56d0: 6f 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c 20 26  omObj(0, pVar, &
56e0: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
56f0: 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28  3_result_double(
5700: 63 6f 6e 74 65 78 74 2c 20 72 29 3b 0a 20 20 20  context, r);.   
5710: 20 7d 65 6c 73 65 20 69 66 28 20 28 63 3d 3d 27   }else if( (c=='
5720: 77 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79  w' && strcmp(zTy
5730: 70 65 2c 22 77 69 64 65 49 6e 74 22 29 3d 3d 30  pe,"wideInt")==0
5740: 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 28  ) ||.          (
5750: 63 3d 3d 27 69 27 20 26 26 20 73 74 72 63 6d 70  c=='i' && strcmp
5760: 28 7a 54 79 70 65 2c 22 69 6e 74 22 29 3d 3d 30  (zType,"int")==0
5770: 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  ) ){.      Tcl_W
5780: 69 64 65 49 6e 74 20 76 3b 0a 20 20 20 20 20 20  ideInt v;.      
5790: 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72  Tcl_GetWideIntFr
57a0: 6f 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c 20 26  omObj(0, pVar, &
57b0: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
57c0: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63  3_result_int64(c
57d0: 6f 6e 74 65 78 74 2c 20 76 29 3b 0a 20 20 20 20  ontext, v);.    
57e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 61 74  }else{.      dat
57f0: 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  a = (unsigned ch
5800: 61 72 20 2a 29 54 63 6c 5f 47 65 74 53 74 72 69  ar *)Tcl_GetStri
5810: 6e 67 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20  ngFromObj(pVar, 
5820: 26 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  &n);.      sqlit
5830: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
5840: 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 20 2a 29  ontext, (char *)
5850: 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f  data, n, SQLITE_
5860: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
5870: 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  }.  }.}..#ifndef
5880: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
5890: 48 4f 52 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a  HORIZATION./*.**
58a0: 20 54 68 69 73 20 69 73 20 74 68 65 20 61 75 74   This is the aut
58b0: 68 65 6e 74 69 63 61 74 69 6f 6e 20 66 75 6e 63  hentication func
58c0: 74 69 6f 6e 2e 20 20 49 74 20 61 70 70 65 6e 64  tion.  It append
58d0: 73 20 74 68 65 20 61 75 74 68 65 6e 74 69 63 61  s the authentica
58e0: 74 69 6f 6e 0a 2a 2a 20 74 79 70 65 20 63 6f 64  tion.** type cod
58f0: 65 20 61 6e 64 20 74 68 65 20 74 77 6f 20 61 72  e and the two ar
5900: 67 75 6d 65 6e 74 73 20 74 6f 20 7a 43 6d 64 5b  guments to zCmd[
5910: 5d 20 74 68 65 6e 20 69 6e 76 6f 6b 65 73 20 74  ] then invokes t
5920: 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 6f 6e 20  he result.** on 
5930: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e  the interpreter.
5940: 20 20 54 68 65 20 72 65 70 6c 79 20 69 73 20 65    The reply is e
5950: 78 61 6d 69 6e 65 64 20 74 6f 20 64 65 74 65 72  xamined to deter
5960: 6d 69 6e 65 20 69 66 20 74 68 65 0a 2a 2a 20 61  mine if the.** a
5970: 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 66 61  uthentication fa
5980: 69 6c 73 20 6f 72 20 73 75 63 63 65 65 64 73 2e  ils or succeeds.
5990: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
59a0: 75 74 68 5f 63 61 6c 6c 62 61 63 6b 28 0a 20 20  uth_callback(.  
59b0: 76 6f 69 64 20 2a 70 41 72 67 2c 0a 20 20 69 6e  void *pArg,.  in
59c0: 74 20 63 6f 64 65 2c 0a 20 20 63 6f 6e 73 74 20  t code,.  const 
59d0: 63 68 61 72 20 2a 7a 41 72 67 31 2c 0a 20 20 63  char *zArg1,.  c
59e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 32  onst char *zArg2
59f0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
5a00: 7a 41 72 67 33 2c 0a 20 20 63 6f 6e 73 74 20 63  zArg3,.  const c
5a10: 68 61 72 20 2a 7a 41 72 67 34 0a 29 7b 0a 20 20  har *zArg4.){.  
5a20: 63 68 61 72 20 2a 7a 43 6f 64 65 3b 0a 20 20 54  char *zCode;.  T
5a30: 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a  cl_DString str;.
5a40: 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73    int rc;.  cons
5a50: 74 20 63 68 61 72 20 2a 7a 52 65 70 6c 79 3b 0a  t char *zReply;.
5a60: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
5a70: 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 70 41 72  = (SqliteDb*)pAr
5a80: 67 3b 0a 20 20 69 66 28 20 70 44 62 2d 3e 64 69  g;.  if( pDb->di
5a90: 73 61 62 6c 65 41 75 74 68 20 29 20 72 65 74 75  sableAuth ) retu
5aa0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
5ab0: 20 73 77 69 74 63 68 28 20 63 6f 64 65 20 29 7b   switch( code ){
5ac0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
5ad0: 5f 43 4f 50 59 20 20 20 20 20 20 20 20 20 20 20  _COPY           
5ae0: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
5af0: 54 45 5f 43 4f 50 59 22 3b 20 62 72 65 61 6b 3b  TE_COPY"; break;
5b00: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
5b10: 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 20 20 20  _CREATE_INDEX   
5b20: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
5b30: 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 22  TE_CREATE_INDEX"
5b40: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
5b50: 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  e SQLITE_CREATE_
5b60: 54 41 42 4c 45 20 20 20 20 20 20 3a 20 7a 43 6f  TABLE      : zCo
5b70: 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54  de="SQLITE_CREAT
5b80: 45 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b  E_TABLE"; break;
5b90: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
5ba0: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44  _CREATE_TEMP_IND
5bb0: 45 58 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49  EX : zCode="SQLI
5bc0: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49  TE_CREATE_TEMP_I
5bd0: 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20  NDEX"; break;.  
5be0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52    case SQLITE_CR
5bf0: 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 20  EATE_TEMP_TABLE 
5c00: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
5c10: 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c  CREATE_TEMP_TABL
5c20: 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  E"; break;.    c
5c30: 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54  ase SQLITE_CREAT
5c40: 45 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 3a 20  E_TEMP_TRIGGER: 
5c50: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52  zCode="SQLITE_CR
5c60: 45 41 54 45 5f 54 45 4d 50 5f 54 52 49 47 47 45  EATE_TEMP_TRIGGE
5c70: 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  R"; break;.    c
5c80: 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54  ase SQLITE_CREAT
5c90: 45 5f 54 45 4d 50 5f 56 49 45 57 20 20 3a 20 7a  E_TEMP_VIEW  : z
5ca0: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45  Code="SQLITE_CRE
5cb0: 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 22 3b 20  ATE_TEMP_VIEW"; 
5cc0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
5cd0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 52  SQLITE_CREATE_TR
5ce0: 49 47 47 45 52 20 20 20 20 3a 20 7a 43 6f 64 65  IGGER    : zCode
5cf0: 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  ="SQLITE_CREATE_
5d00: 54 52 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b  TRIGGER"; break;
5d10: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
5d20: 5f 43 52 45 41 54 45 5f 56 49 45 57 20 20 20 20  _CREATE_VIEW    
5d30: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
5d40: 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57 22 3b  TE_CREATE_VIEW";
5d50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
5d60: 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 20   SQLITE_DELETE  
5d70: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
5d80: 65 3d 22 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  e="SQLITE_DELETE
5d90: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
5da0: 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49  se SQLITE_DROP_I
5db0: 4e 44 45 58 20 20 20 20 20 20 20 20 3a 20 7a 43  NDEX        : zC
5dc0: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50  ode="SQLITE_DROP
5dd0: 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a  _INDEX"; break;.
5de0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
5df0: 44 52 4f 50 5f 54 41 42 4c 45 20 20 20 20 20 20  DROP_TABLE      
5e00: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
5e10: 45 5f 44 52 4f 50 5f 54 41 42 4c 45 22 3b 20 62  E_DROP_TABLE"; b
5e20: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
5e30: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
5e40: 49 4e 44 45 58 20 20 20 3a 20 7a 43 6f 64 65 3d  INDEX   : zCode=
5e50: 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d  "SQLITE_DROP_TEM
5e60: 50 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b  P_INDEX"; break;
5e70: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
5e80: 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45  _DROP_TEMP_TABLE
5e90: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
5ea0: 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42  TE_DROP_TEMP_TAB
5eb0: 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  LE"; break;.    
5ec0: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50  case SQLITE_DROP
5ed0: 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 20 3a 20  _TEMP_TRIGGER : 
5ee0: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52  zCode="SQLITE_DR
5ef0: 4f 50 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 22  OP_TEMP_TRIGGER"
5f00: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
5f10: 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  e SQLITE_DROP_TE
5f20: 4d 50 5f 56 49 45 57 20 20 20 20 3a 20 7a 43 6f  MP_VIEW    : zCo
5f30: 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f  de="SQLITE_DROP_
5f40: 54 45 4d 50 5f 56 49 45 57 22 3b 20 62 72 65 61  TEMP_VIEW"; brea
5f50: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
5f60: 54 45 5f 44 52 4f 50 5f 54 52 49 47 47 45 52 20  TE_DROP_TRIGGER 
5f70: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
5f80: 4c 49 54 45 5f 44 52 4f 50 5f 54 52 49 47 47 45  LITE_DROP_TRIGGE
5f90: 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  R"; break;.    c
5fa0: 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  ase SQLITE_DROP_
5fb0: 56 49 45 57 20 20 20 20 20 20 20 20 20 3a 20 7a  VIEW         : z
5fc0: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f  Code="SQLITE_DRO
5fd0: 50 5f 56 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a  P_VIEW"; break;.
5fe0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
5ff0: 49 4e 53 45 52 54 20 20 20 20 20 20 20 20 20 20  INSERT          
6000: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
6010: 45 5f 49 4e 53 45 52 54 22 3b 20 62 72 65 61 6b  E_INSERT"; break
6020: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
6030: 45 5f 50 52 41 47 4d 41 20 20 20 20 20 20 20 20  E_PRAGMA        
6040: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
6050: 49 54 45 5f 50 52 41 47 4d 41 22 3b 20 62 72 65  ITE_PRAGMA"; bre
6060: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
6070: 49 54 45 5f 52 45 41 44 20 20 20 20 20 20 20 20  ITE_READ        
6080: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
6090: 51 4c 49 54 45 5f 52 45 41 44 22 3b 20 62 72 65  QLITE_READ"; bre
60a0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
60b0: 49 54 45 5f 53 45 4c 45 43 54 20 20 20 20 20 20  ITE_SELECT      
60c0: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
60d0: 51 4c 49 54 45 5f 53 45 4c 45 43 54 22 3b 20 62  QLITE_SELECT"; b
60e0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
60f0: 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f  QLITE_TRANSACTIO
6100: 4e 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d  N       : zCode=
6110: 22 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54  "SQLITE_TRANSACT
6120: 49 4f 4e 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ION"; break;.   
6130: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55 50 44   case SQLITE_UPD
6140: 41 54 45 20 20 20 20 20 20 20 20 20 20 20 20 3a  ATE            :
6150: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 55   zCode="SQLITE_U
6160: 50 44 41 54 45 22 3b 20 62 72 65 61 6b 3b 0a 20  PDATE"; break;. 
6170: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
6180: 54 54 41 43 48 20 20 20 20 20 20 20 20 20 20 20  TTACH           
6190: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
61a0: 5f 41 54 54 41 43 48 22 3b 20 62 72 65 61 6b 3b  _ATTACH"; break;
61b0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
61c0: 5f 44 45 54 41 43 48 20 20 20 20 20 20 20 20 20  _DETACH         
61d0: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
61e0: 54 45 5f 44 45 54 41 43 48 22 3b 20 62 72 65 61  TE_DETACH"; brea
61f0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
6200: 54 45 5f 41 4c 54 45 52 5f 54 41 42 4c 45 20 20  TE_ALTER_TABLE  
6210: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
6220: 4c 49 54 45 5f 41 4c 54 45 52 5f 54 41 42 4c 45  LITE_ALTER_TABLE
6230: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
6240: 73 65 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45  se SQLITE_REINDE
6250: 58 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43  X           : zC
6260: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 52 45 49 4e  ode="SQLITE_REIN
6270: 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  DEX"; break;.   
6280: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 4e 41   case SQLITE_ANA
6290: 4c 59 5a 45 20 20 20 20 20 20 20 20 20 20 20 3a  LYZE           :
62a0: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 41   zCode="SQLITE_A
62b0: 4e 41 4c 59 5a 45 22 3b 20 62 72 65 61 6b 3b 0a  NALYZE"; break;.
62c0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
62d0: 43 52 45 41 54 45 5f 56 54 41 42 4c 45 20 20 20  CREATE_VTABLE   
62e0: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
62f0: 45 5f 43 52 45 41 54 45 5f 56 54 41 42 4c 45 22  E_CREATE_VTABLE"
6300: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
6310: 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54  e SQLITE_DROP_VT
6320: 41 42 4c 45 20 20 20 20 20 20 20 3a 20 7a 43 6f  ABLE       : zCo
6330: 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f  de="SQLITE_DROP_
6340: 56 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a  VTABLE"; break;.
6350: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
6360: 46 55 4e 43 54 49 4f 4e 20 20 20 20 20 20 20 20  FUNCTION        
6370: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
6380: 45 5f 46 55 4e 43 54 49 4f 4e 22 3b 20 62 72 65  E_FUNCTION"; bre
6390: 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 20  ak;.    default 
63a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63b0: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 3f        : zCode="?
63c0: 3f 3f 3f 22 3b 20 62 72 65 61 6b 3b 0a 20 20 7d  ???"; break;.  }
63d0: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e  .  Tcl_DStringIn
63e0: 69 74 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f  it(&str);.  Tcl_
63f0: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 73  DStringAppend(&s
6400: 74 72 2c 20 70 44 62 2d 3e 7a 41 75 74 68 2c 20  tr, pDb->zAuth, 
6410: 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  -1);.  Tcl_DStri
6420: 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  ngAppendElement(
6430: 26 73 74 72 2c 20 7a 43 6f 64 65 29 3b 0a 20 20  &str, zCode);.  
6440: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
6450: 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a  dElement(&str, z
6460: 41 72 67 31 20 3f 20 7a 41 72 67 31 20 3a 20 22  Arg1 ? zArg1 : "
6470: 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  ");.  Tcl_DStrin
6480: 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26  gAppendElement(&
6490: 73 74 72 2c 20 7a 41 72 67 32 20 3f 20 7a 41 72  str, zArg2 ? zAr
64a0: 67 32 20 3a 20 22 22 29 3b 0a 20 20 54 63 6c 5f  g2 : "");.  Tcl_
64b0: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65  DStringAppendEle
64c0: 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41 72 67 33  ment(&str, zArg3
64d0: 20 3f 20 7a 41 72 67 33 20 3a 20 22 22 29 3b 0a   ? zArg3 : "");.
64e0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
64f0: 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c  endElement(&str,
6500: 20 7a 41 72 67 34 20 3f 20 7a 41 72 67 34 20 3a   zArg4 ? zArg4 :
6510: 20 22 22 29 3b 0a 20 20 72 63 20 3d 20 54 63 6c   "");.  rc = Tcl
6520: 5f 47 6c 6f 62 61 6c 45 76 61 6c 28 70 44 62 2d  _GlobalEval(pDb-
6530: 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53 74  >interp, Tcl_DSt
6540: 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29 29  ringValue(&str))
6550: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46  ;.  Tcl_DStringF
6560: 72 65 65 28 26 73 74 72 29 3b 0a 20 20 7a 52 65  ree(&str);.  zRe
6570: 70 6c 79 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ply = Tcl_GetStr
6580: 69 6e 67 52 65 73 75 6c 74 28 70 44 62 2d 3e 69  ingResult(pDb->i
6590: 6e 74 65 72 70 29 3b 0a 20 20 69 66 28 20 73 74  nterp);.  if( st
65a0: 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22 53 51 4c  rcmp(zReply,"SQL
65b0: 49 54 45 5f 4f 4b 22 29 3d 3d 30 20 29 7b 0a 20  ITE_OK")==0 ){. 
65c0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
65d0: 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  K;.  }else if( s
65e0: 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22 53 51  trcmp(zReply,"SQ
65f0: 4c 49 54 45 5f 44 45 4e 59 22 29 3d 3d 30 20 29  LITE_DENY")==0 )
6600: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
6610: 45 5f 44 45 4e 59 3b 0a 20 20 7d 65 6c 73 65 20  E_DENY;.  }else 
6620: 69 66 28 20 73 74 72 63 6d 70 28 7a 52 65 70 6c  if( strcmp(zRepl
6630: 79 2c 22 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  y,"SQLITE_IGNORE
6640: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ")==0 ){.    rc 
6650: 3d 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 3b  = SQLITE_IGNORE;
6660: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
6670: 20 3d 20 39 39 39 3b 0a 20 20 7d 0a 20 20 72 65   = 999;.  }.  re
6680: 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
6690: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
66a0: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 20 2a  _AUTHORIZATION *
66b0: 2f 0a 0a 2f 2a 0a 2a 2a 20 7a 54 65 78 74 20 69  /../*.** zText i
66c0: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
66d0: 65 78 74 20 6f 62 74 61 69 6e 65 64 20 76 69 61  ext obtained via
66e0: 20 61 6e 20 73 71 6c 69 74 65 33 5f 72 65 73 75   an sqlite3_resu
66f0: 6c 74 5f 74 65 78 74 28 29 0a 2a 2a 20 6f 72 20  lt_text().** or 
6700: 73 69 6d 69 6c 61 72 20 69 6e 74 65 72 66 61 63  similar interfac
6710: 65 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  e. This routine 
6720: 72 65 74 75 72 6e 73 20 61 20 54 63 6c 20 73 74  returns a Tcl st
6730: 72 69 6e 67 20 6f 62 6a 65 63 74 2c 20 0a 2a 2a  ring object, .**
6740: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
6750: 20 73 65 74 20 74 6f 20 30 2c 20 63 6f 6e 74 61   set to 0, conta
6760: 69 6e 69 6e 67 20 74 68 65 20 74 65 78 74 2e 20  ining the text. 
6770: 49 66 20 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e  If a translation
6780: 0a 2a 2a 20 62 65 74 77 65 65 6e 20 69 73 6f 38  .** between iso8
6790: 38 35 39 20 61 6e 64 20 55 54 46 2d 38 20 69 73  859 and UTF-8 is
67a0: 20 72 65 71 75 69 72 65 64 2c 20 69 74 20 69 73   required, it is
67b0: 20 70 72 65 66 6f 72 6d 65 64 2e 0a 2a 2f 0a 73   preformed..*/.s
67c0: 74 61 74 69 63 20 54 63 6c 5f 4f 62 6a 20 2a 64  tatic Tcl_Obj *d
67d0: 62 54 65 78 74 54 6f 4f 62 6a 28 63 68 61 72 20  bTextToObj(char 
67e0: 63 6f 6e 73 74 20 2a 7a 54 65 78 74 29 7b 0a 20  const *zText){. 
67f0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b 0a   Tcl_Obj *pVal;.
6800: 23 69 66 64 65 66 20 55 54 46 5f 54 52 41 4e 53  #ifdef UTF_TRANS
6810: 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 0a 20 20  LATION_NEEDED.  
6820: 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 43 6f 6c  Tcl_DString dCol
6830: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49  ;.  Tcl_DStringI
6840: 6e 69 74 28 26 64 43 6f 6c 29 3b 0a 20 20 54 63  nit(&dCol);.  Tc
6850: 6c 5f 45 78 74 65 72 6e 61 6c 54 6f 55 74 66 44  l_ExternalToUtfD
6860: 53 74 72 69 6e 67 28 4e 55 4c 4c 2c 20 7a 54 65  String(NULL, zTe
6870: 78 74 2c 20 2d 31 2c 20 26 64 43 6f 6c 29 3b 0a  xt, -1, &dCol);.
6880: 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77    pVal = Tcl_New
6890: 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 44 53  StringObj(Tcl_DS
68a0: 74 72 69 6e 67 56 61 6c 75 65 28 26 64 43 6f 6c  tringValue(&dCol
68b0: 29 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53  ), -1);.  Tcl_DS
68c0: 74 72 69 6e 67 46 72 65 65 28 26 64 43 6f 6c 29  tringFree(&dCol)
68d0: 3b 0a 23 65 6c 73 65 0a 20 20 70 56 61 6c 20 3d  ;.#else.  pVal =
68e0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
68f0: 6a 28 7a 54 65 78 74 2c 20 2d 31 29 3b 0a 23 65  j(zText, -1);.#e
6900: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 70 56  ndif.  return pV
6910: 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  al;.}../*.** Thi
6920: 73 20 72 6f 75 74 69 6e 65 20 72 65 61 64 73 20  s routine reads 
6930: 61 20 6c 69 6e 65 20 6f 66 20 74 65 78 74 20 66  a line of text f
6940: 72 6f 6d 20 46 49 4c 45 20 69 6e 2c 20 73 74 6f  rom FILE in, sto
6950: 72 65 73 0a 2a 2a 20 74 68 65 20 74 65 78 74 20  res.** the text 
6960: 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  in memory obtain
6970: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29  ed from malloc()
6980: 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 70   and returns a p
6990: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
69a0: 20 74 65 78 74 2e 20 20 4e 55 4c 4c 20 69 73 20   text.  NULL is 
69b0: 72 65 74 75 72 6e 65 64 20 61 74 20 65 6e 64 20  returned at end 
69c0: 6f 66 20 66 69 6c 65 2c 20 6f 72 20 69 66 20 6d  of file, or if m
69d0: 61 6c 6c 6f 63 28 29 0a 2a 2a 20 66 61 69 6c 73  alloc().** fails
69e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65  ..**.** The inte
69f0: 72 66 61 63 65 20 69 73 20 6c 69 6b 65 20 22 72  rface is like "r
6a00: 65 61 64 6c 69 6e 65 22 20 62 75 74 20 6e 6f 20  eadline" but no 
6a10: 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 65 64 69  command-line edi
6a20: 74 69 6e 67 0a 2a 2a 20 69 73 20 64 6f 6e 65 2e  ting.** is done.
6a30: 0a 2a 2a 0a 2a 2a 20 63 6f 70 69 65 64 20 66 72  .**.** copied fr
6a40: 6f 6d 20 73 68 65 6c 6c 2e 63 20 66 72 6f 6d 20  om shell.c from 
6a50: 27 2e 69 6d 70 6f 72 74 27 20 63 6f 6d 6d 61 6e  '.import' comman
6a60: 64 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  d.*/.static char
6a70: 20 2a 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28   *local_getline(
6a80: 63 68 61 72 20 2a 7a 50 72 6f 6d 70 74 2c 20 46  char *zPrompt, F
6a90: 49 4c 45 20 2a 69 6e 29 7b 0a 20 20 63 68 61 72  ILE *in){.  char
6aa0: 20 2a 7a 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e   *zLine;.  int n
6ab0: 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  Line;.  int n;. 
6ac0: 20 69 6e 74 20 65 6f 6c 3b 0a 0a 20 20 6e 4c 69   int eol;..  nLi
6ad0: 6e 65 20 3d 20 31 30 30 3b 0a 20 20 7a 4c 69 6e  ne = 100;.  zLin
6ae0: 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 4c 69 6e  e = malloc( nLin
6af0: 65 20 29 3b 0a 20 20 69 66 28 20 7a 4c 69 6e 65  e );.  if( zLine
6b00: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
6b10: 20 20 6e 20 3d 20 30 3b 0a 20 20 65 6f 6c 20 3d    n = 0;.  eol =
6b20: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 21 65 6f   0;.  while( !eo
6b30: 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 2b 31  l ){.    if( n+1
6b40: 30 30 3e 6e 4c 69 6e 65 20 29 7b 0a 20 20 20 20  00>nLine ){.    
6b50: 20 20 6e 4c 69 6e 65 20 3d 20 6e 4c 69 6e 65 2a    nLine = nLine*
6b60: 32 20 2b 20 31 30 30 3b 0a 20 20 20 20 20 20 7a  2 + 100;.      z
6b70: 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28 7a  Line = realloc(z
6b80: 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29 3b 0a 20 20  Line, nLine);.  
6b90: 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d 30      if( zLine==0
6ba0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
6bb0: 20 7d 0a 20 20 20 20 69 66 28 20 66 67 65 74 73   }.    if( fgets
6bc0: 28 26 7a 4c 69 6e 65 5b 6e 5d 2c 20 6e 4c 69 6e  (&zLine[n], nLin
6bd0: 65 20 2d 20 6e 2c 20 69 6e 29 3d 3d 30 20 29 7b  e - n, in)==0 ){
6be0: 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20  .      if( n==0 
6bf0: 29 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 28  ){.        free(
6c00: 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20  zLine);.        
6c10: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
6c20: 7d 0a 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d  }.      zLine[n]
6c30: 20 3d 20 30 3b 0a 20 20 20 20 20 20 65 6f 6c 20   = 0;.      eol 
6c40: 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 1;.      break
6c50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c  ;.    }.    whil
6c60: 65 28 20 7a 4c 69 6e 65 5b 6e 5d 20 29 7b 20 6e  e( zLine[n] ){ n
6c70: 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e  ++; }.    if( n>
6c80: 30 20 26 26 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d  0 && zLine[n-1]=
6c90: 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20 6e  ='\n' ){.      n
6ca0: 2d 2d 3b 0a 20 20 20 20 20 20 7a 4c 69 6e 65 5b  --;.      zLine[
6cb0: 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 65 6f  n] = 0;.      eo
6cc0: 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  l = 1;.    }.  }
6cd0: 0a 20 20 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c  .  zLine = reall
6ce0: 6f 63 28 20 7a 4c 69 6e 65 2c 20 6e 2b 31 20 29  oc( zLine, n+1 )
6cf0: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4c 69 6e 65  ;.  return zLine
6d00: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 69 67 75  ;.}.../*.** Figu
6d10: 72 65 20 6f 75 74 20 74 68 65 20 63 6f 6c 75 6d  re out the colum
6d20: 6e 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 65 20  n names for the 
6d30: 64 61 74 61 20 72 65 74 75 72 6e 65 64 20 62 79  data returned by
6d40: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a   the statement.*
6d50: 2a 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  * passed as the 
6d60: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
6d70: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
6d80: 74 65 72 20 70 61 70 43 6f 6c 4e 61 6d 65 20 69  ter papColName i
6d90: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
6da0: 20 2a 70 61 70 43 6f 6c 4e 61 6d 65 20 69 73 20   *papColName is 
6db0: 73 65 74 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20  set to point.** 
6dc0: 61 74 20 61 6e 20 61 72 72 61 79 20 61 6c 6c 6f  at an array allo
6dd0: 63 61 74 65 64 20 75 73 69 6e 67 20 54 63 6c 5f  cated using Tcl_
6de0: 41 6c 6c 6f 63 28 29 2e 20 49 74 20 69 73 20 74  Alloc(). It is t
6df0: 68 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f  he callers respo
6e00: 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20 74 6f 20  nsibility.** to 
6e10: 66 72 65 65 20 74 68 69 73 20 61 72 72 61 79 20  free this array 
6e20: 75 73 69 6e 67 20 54 63 6c 5f 46 72 65 65 28 29  using Tcl_Free()
6e30: 2c 20 61 6e 64 20 74 6f 20 64 65 63 72 65 6d 65  , and to decreme
6e40: 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
6e50: 0a 2a 2a 20 63 6f 75 6e 74 20 6f 66 20 65 61 63  .** count of eac
6e60: 68 20 54 63 6c 5f 4f 62 6a 2a 20 6d 65 6d 62 65  h Tcl_Obj* membe
6e70: 72 20 6f 66 20 74 68 65 20 61 72 72 61 79 2e 0a  r of the array..
6e80: 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
6e90: 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66   value of this f
6ea0: 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 20 6e  unction is the n
6eb0: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
6ec0: 20 6f 66 20 64 61 74 61 0a 2a 2a 20 72 65 74 75   of data.** retu
6ed0: 72 6e 65 64 20 62 79 20 70 53 74 6d 74 20 28 61  rned by pStmt (a
6ee0: 6e 64 20 68 65 6e 63 65 20 74 68 65 20 73 69 7a  nd hence the siz
6ef0: 65 20 6f 66 20 74 68 65 20 2a 70 61 70 43 6f 6c  e of the *papCol
6f00: 4e 61 6d 65 20 61 72 72 61 79 29 2e 0a 2a 2a 0a  Name array)..**.
6f10: 2a 2a 20 49 66 20 70 41 72 72 61 79 20 69 73 20  ** If pArray is 
6f20: 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69  not NULL, then i
6f30: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e  t contains the n
6f40: 61 6d 65 20 6f 66 20 61 20 54 63 6c 20 61 72 72  ame of a Tcl arr
6f50: 61 79 0a 2a 2a 20 76 61 72 69 61 62 6c 65 2e 20  ay.** variable. 
6f60: 54 68 65 20 22 2a 22 20 6d 65 6d 62 65 72 20 6f  The "*" member o
6f70: 66 20 74 68 69 73 20 61 72 72 61 79 20 69 73 20  f this array is 
6f80: 73 65 74 20 74 6f 20 61 20 6c 69 73 74 20 63 6f  set to a list co
6f90: 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 74 68 65 20  ntaining.** the 
6fa0: 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c  names of the col
6fb0: 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79  umns returned by
6fc0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20   the statement, 
6fd0: 69 6e 20 6f 72 64 65 72 20 66 72 6f 6d 0a 2a 2a  in order from.**
6fe0: 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e 20   left to right. 
6ff0: 65 2e 67 2e 20 69 66 20 74 68 65 20 6e 61 6d 65  e.g. if the name
7000: 73 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65  s of the returne
7010: 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 61 2c  d columns are a,
7020: 20 62 20 61 6e 64 0a 2a 2a 20 63 2c 20 69 74 20   b and.** c, it 
7030: 64 6f 65 73 20 74 68 65 20 65 71 75 69 76 61 6c  does the equival
7040: 65 6e 74 20 6f 66 20 74 68 65 20 74 63 6c 20 63  ent of the tcl c
7050: 6f 6d 6d 61 6e 64 3a 0a 2a 2a 0a 2a 2a 20 20 20  ommand:.**.**   
7060: 20 20 73 65 74 20 24 7b 70 41 72 72 61 79 7d 28    set ${pArray}(
7070: 2a 29 20 7b 61 20 62 20 63 7d 0a 2a 2f 0a 73 74  *) {a b c}.*/.st
7080: 61 74 69 63 20 69 6e 74 0a 63 6f 6d 70 75 74 65  atic int.compute
7090: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 54  ColumnNames(.  T
70a0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
70b0: 70 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  p, .  sqlite3_st
70c0: 6d 74 20 2a 70 53 74 6d 74 2c 20 20 20 20 20 20  mt *pStmt,      
70d0: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 73          /* SQL s
70e0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 63  tatement */.  Tc
70f0: 6c 5f 4f 62 6a 20 2a 2a 2a 70 61 70 43 6f 6c 4e  l_Obj ***papColN
7100: 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ame,            
7110: 2f 2a 20 4f 55 54 3a 20 41 72 72 61 79 20 6f 66  /* OUT: Array of
7120: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   column names */
7130: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 72  .  Tcl_Obj *pArr
7140: 61 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ay              
7150: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
7160: 61 72 72 61 79 20 76 61 72 69 61 62 6c 65 20 28  array variable (
7170: 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a  may be null) */.
7180: 29 7b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 0a  ){.  int nCol;..
7190: 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c    /* Compute col
71a0: 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 6e  umn names */.  n
71b0: 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Col = sqlite3_co
71c0: 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74  lumn_count(pStmt
71d0: 29 3b 0a 20 20 69 66 28 20 70 61 70 43 6f 6c 4e  );.  if( papColN
71e0: 61 6d 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ame ){.    int i
71f0: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a  ;.    Tcl_Obj **
7200: 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 54 63 6c  apColName = (Tcl
7210: 5f 4f 62 6a 2a 2a 29 54 63 6c 5f 41 6c 6c 6f 63  _Obj**)Tcl_Alloc
7220: 28 20 73 69 7a 65 6f 66 28 54 63 6c 5f 4f 62 6a  ( sizeof(Tcl_Obj
7230: 2a 29 2a 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 66  *)*nCol );.    f
7240: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
7250: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 70 43 6f  i++){.      apCo
7260: 6c 4e 61 6d 65 5b 69 5d 20 3d 20 64 62 54 65 78  lName[i] = dbTex
7270: 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63  tToObj(sqlite3_c
7280: 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74  olumn_name(pStmt
7290: 2c 69 29 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f  ,i));.      Tcl_
72a0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 61 70 43  IncrRefCount(apC
72b0: 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20  olName[i]);.    
72c0: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 72 65 73  }..    /* If res
72d0: 75 6c 74 73 20 61 72 65 20 62 65 69 6e 67 20 73  ults are being s
72e0: 74 6f 72 65 64 20 69 6e 20 61 6e 20 61 72 72 61  tored in an arra
72f0: 79 20 76 61 72 69 61 62 6c 65 2c 20 74 68 65 6e  y variable, then
7300: 20 63 72 65 61 74 65 0a 20 20 20 20 2a 2a 20 74   create.    ** t
7310: 68 65 20 61 72 72 61 79 28 2a 29 20 65 6e 74 72  he array(*) entr
7320: 79 20 66 6f 72 20 74 68 61 74 20 61 72 72 61 79  y for that array
7330: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
7340: 70 41 72 72 61 79 20 29 7b 0a 20 20 20 20 20 20  pArray ){.      
7350: 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f 6c 4c 69 73  Tcl_Obj *pColLis
7360: 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29  t = Tcl_NewObj()
7370: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20  ;.      Tcl_Obj 
7380: 2a 70 53 74 61 72 20 3d 20 54 63 6c 5f 4e 65 77  *pStar = Tcl_New
7390: 53 74 72 69 6e 67 4f 62 6a 28 22 2a 22 2c 20 2d  StringObj("*", -
73a0: 31 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e  1);.      Tcl_In
73b0: 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6f 6c 4c  crRefCount(pColL
73c0: 69 73 74 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  ist);.      for(
73d0: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
73e0: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4c  ){.        Tcl_L
73f0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
7400: 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 43 6f 6c  ent(interp, pCol
7410: 4c 69 73 74 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b  List, apColName[
7420: 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
7430: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
7440: 75 6e 74 28 70 53 74 61 72 29 3b 0a 20 20 20 20  unt(pStar);.    
7450: 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32    Tcl_ObjSetVar2
7460: 28 69 6e 74 65 72 70 2c 20 70 41 72 72 61 79 2c  (interp, pArray,
7470: 20 70 53 74 61 72 2c 20 70 43 6f 6c 4c 69 73 74   pStar, pColList
7480: 2c 30 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 44  ,0);.      Tcl_D
7490: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6f 6c  ecrRefCount(pCol
74a0: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 54 63 6c  List);.      Tcl
74b0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 53  _DecrRefCount(pS
74c0: 74 61 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tar);.    }.    
74d0: 2a 70 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 61 70  *papColName = ap
74e0: 43 6f 6c 4e 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20  ColName;.  }..  
74f0: 72 65 74 75 72 6e 20 6e 43 6f 6c 3b 0a 7d 0a 0a  return nCol;.}..
7500: 2f 2a 0a 2a 2a 20 54 68 65 20 22 73 71 6c 69 74  /*.** The "sqlit
7510: 65 22 20 63 6f 6d 6d 61 6e 64 20 62 65 6c 6f 77  e" command below
7520: 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 20 54   creates a new T
7530: 63 6c 20 63 6f 6d 6d 61 6e 64 20 66 6f 72 20 65  cl command for e
7540: 61 63 68 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  ach.** connectio
7550: 6e 20 69 74 20 6f 70 65 6e 73 20 74 6f 20 61 6e  n it opens to an
7560: 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
7570: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
7580: 69 73 20 69 6e 76 6f 6b 65 64 0a 2a 2a 20 77 68  is invoked.** wh
7590: 65 6e 65 76 65 72 20 6f 6e 65 20 6f 66 20 74 68  enever one of th
75a0: 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2d 73  ose connection-s
75b0: 70 65 63 69 66 69 63 20 63 6f 6d 6d 61 6e 64 73  pecific commands
75c0: 20 69 73 20 65 78 65 63 75 74 65 64 0a 2a 2a 20   is executed.** 
75d0: 69 6e 20 54 63 6c 2e 20 20 46 6f 72 20 65 78 61  in Tcl.  For exa
75e0: 6d 70 6c 65 2c 20 69 66 20 79 6f 75 20 72 75 6e  mple, if you run
75f0: 20 54 63 6c 20 63 6f 64 65 20 6c 69 6b 65 20 74   Tcl code like t
7600: 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
7610: 20 73 71 6c 69 74 65 33 20 64 62 31 20 20 22 6d   sqlite3 db1  "m
7620: 79 5f 64 61 74 61 62 61 73 65 22 0a 2a 2a 20 20  y_database".**  
7630: 20 20 20 20 20 64 62 31 20 63 6c 6f 73 65 0a 2a       db1 close.*
7640: 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 63  *.** The first c
7650: 6f 6d 6d 61 6e 64 20 6f 70 65 6e 73 20 61 20 63  ommand opens a c
7660: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65  onnection to the
7670: 20 22 6d 79 5f 64 61 74 61 62 61 73 65 22 20 64   "my_database" d
7680: 61 74 61 62 61 73 65 0a 2a 2a 20 61 6e 64 20 63  atabase.** and c
7690: 61 6c 6c 73 20 74 68 61 74 20 63 6f 6e 6e 65 63  alls that connec
76a0: 74 69 6f 6e 20 22 64 62 31 22 2e 20 20 54 68 65  tion "db1".  The
76b0: 20 73 65 63 6f 6e 64 20 63 6f 6d 6d 61 6e 64 20   second command 
76c0: 63 61 75 73 65 73 20 74 68 69 73 0a 2a 2a 20 73  causes this.** s
76d0: 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 62 65 20  ubroutine to be 
76e0: 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74  invoked..*/.stat
76f0: 69 63 20 69 6e 74 20 44 62 4f 62 6a 43 6d 64 28  ic int DbObjCmd(
7700: 76 6f 69 64 20 2a 63 64 2c 20 54 63 6c 5f 49 6e  void *cd, Tcl_In
7710: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
7720: 74 20 6f 62 6a 63 2c 54 63 6c 5f 4f 62 6a 20 2a  t objc,Tcl_Obj *
7730: 63 6f 6e 73 74 2a 6f 62 6a 76 29 7b 0a 20 20 53  const*objv){.  S
7740: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
7750: 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20  SqliteDb*)cd;.  
7760: 69 6e 74 20 63 68 6f 69 63 65 3b 0a 20 20 69 6e  int choice;.  in
7770: 74 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20  t rc = TCL_OK;. 
7780: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
7790: 61 72 20 2a 44 42 5f 73 74 72 73 5b 5d 20 3d 20  ar *DB_strs[] = 
77a0: 7b 0a 20 20 20 20 22 61 75 74 68 6f 72 69 7a 65  {.    "authorize
77b0: 72 22 2c 20 20 20 20 20 20 20 20 20 22 62 75 73  r",         "bus
77c0: 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  y",             
77d0: 20 22 63 61 63 68 65 22 2c 0a 20 20 20 20 22 63   "cache",.    "c
77e0: 68 61 6e 67 65 73 22 2c 20 20 20 20 20 20 20 20  hanges",        
77f0: 20 20 20 20 22 63 6c 6f 73 65 22 2c 20 20 20 20      "close",    
7800: 20 20 20 20 20 20 20 20 20 22 63 6f 6c 6c 61 74           "collat
7810: 65 22 2c 0a 20 20 20 20 22 63 6f 6c 6c 61 74 69  e",.    "collati
7820: 6f 6e 5f 6e 65 65 64 65 64 22 2c 20 20 20 22 63  on_needed",   "c
7830: 6f 6d 6d 69 74 5f 68 6f 6f 6b 22 2c 20 20 20 20  ommit_hook",    
7840: 20 20 20 22 63 6f 6d 70 6c 65 74 65 22 2c 0a 20     "complete",. 
7850: 20 20 20 22 63 6f 70 79 22 2c 20 20 20 20 20 20     "copy",      
7860: 20 20 20 20 20 20 20 20 20 22 65 6e 61 62 6c 65           "enable
7870: 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 22  _load_extension"
7880: 2c 22 65 72 72 6f 72 63 6f 64 65 22 2c 0a 20 20  ,"errorcode",.  
7890: 20 20 22 65 76 61 6c 22 2c 20 20 20 20 20 20 20    "eval",       
78a0: 20 20 20 20 20 20 20 20 22 65 78 69 73 74 73 22          "exists"
78b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 22 66 75  ,            "fu
78c0: 6e 63 74 69 6f 6e 22 2c 0a 20 20 20 20 22 69 6e  nction",.    "in
78d0: 63 72 62 6c 6f 62 22 2c 20 20 20 20 20 20 20 20  crblob",        
78e0: 20 20 20 22 69 6e 74 65 72 72 75 70 74 22 2c 20     "interrupt", 
78f0: 20 20 20 20 20 20 20 20 22 6c 61 73 74 5f 69 6e          "last_in
7900: 73 65 72 74 5f 72 6f 77 69 64 22 2c 0a 20 20 20  sert_rowid",.   
7910: 20 22 6e 75 6c 6c 76 61 6c 75 65 22 2c 20 20 20   "nullvalue",   
7920: 20 20 20 20 20 20 20 22 6f 6e 65 63 6f 6c 75 6d         "onecolum
7930: 6e 22 2c 20 20 20 20 20 20 20 20 20 22 70 72 6f  n",         "pro
7940: 66 69 6c 65 22 2c 0a 20 20 20 20 22 70 72 6f 67  file",.    "prog
7950: 72 65 73 73 22 2c 20 20 20 20 20 20 20 20 20 20  ress",          
7960: 20 22 72 65 6b 65 79 22 2c 20 20 20 20 20 20 20   "rekey",       
7970: 20 20 20 20 20 20 22 72 6f 6c 6c 62 61 63 6b 5f        "rollback_
7980: 68 6f 6f 6b 22 2c 0a 20 20 20 20 22 74 69 6d 65  hook",.    "time
7990: 6f 75 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  out",           
79a0: 20 22 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 22   "total_changes"
79b0: 2c 20 20 20 20 20 22 74 72 61 63 65 22 2c 0a 20  ,     "trace",. 
79c0: 20 20 20 22 74 72 61 6e 73 61 63 74 69 6f 6e 22     "transaction"
79d0: 2c 20 20 20 20 20 20 20 20 22 75 70 64 61 74 65  ,        "update
79e0: 5f 68 6f 6f 6b 22 2c 20 20 20 20 20 20 20 22 76  _hook",       "v
79f0: 65 72 73 69 6f 6e 22 2c 0a 20 20 20 20 30 20 20  ersion",.    0  
7a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a10: 20 20 0a 20 20 7d 3b 0a 20 20 65 6e 75 6d 20 44    .  };.  enum D
7a20: 42 5f 65 6e 75 6d 20 7b 0a 20 20 20 20 44 42 5f  B_enum {.    DB_
7a30: 41 55 54 48 4f 52 49 5a 45 52 2c 20 20 20 20 20  AUTHORIZER,     
7a40: 20 20 20 44 42 5f 42 55 53 59 2c 20 20 20 20 20     DB_BUSY,     
7a50: 20 20 20 20 20 20 20 20 44 42 5f 43 41 43 48 45          DB_CACHE
7a60: 2c 0a 20 20 20 20 44 42 5f 43 48 41 4e 47 45 53  ,.    DB_CHANGES
7a70: 2c 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 43  ,           DB_C
7a80: 4c 4f 53 45 2c 20 20 20 20 20 20 20 20 20 20 20  LOSE,           
7a90: 20 44 42 5f 43 4f 4c 4c 41 54 45 2c 0a 20 20 20   DB_COLLATE,.   
7aa0: 20 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e 45   DB_COLLATION_NE
7ab0: 45 44 45 44 2c 20 20 44 42 5f 43 4f 4d 4d 49 54  EDED,  DB_COMMIT
7ac0: 5f 48 4f 4f 4b 2c 20 20 20 20 20 20 44 42 5f 43  _HOOK,      DB_C
7ad0: 4f 4d 50 4c 45 54 45 2c 0a 20 20 20 20 44 42 5f  OMPLETE,.    DB_
7ae0: 43 4f 50 59 2c 20 20 20 20 20 20 20 20 20 20 20  COPY,           
7af0: 20 20 20 44 42 5f 45 4e 41 42 4c 45 5f 4c 4f 41     DB_ENABLE_LOA
7b00: 44 5f 45 58 54 45 4e 53 49 4f 4e 2c 44 42 5f 45  D_EXTENSION,DB_E
7b10: 52 52 4f 52 43 4f 44 45 2c 0a 20 20 20 20 44 42  RRORCODE,.    DB
7b20: 5f 45 56 41 4c 2c 20 20 20 20 20 20 20 20 20 20  _EVAL,          
7b30: 20 20 20 20 44 42 5f 45 58 49 53 54 53 2c 20 20      DB_EXISTS,  
7b40: 20 20 20 20 20 20 20 20 20 44 42 5f 46 55 4e 43           DB_FUNC
7b50: 54 49 4f 4e 2c 0a 20 20 20 20 44 42 5f 49 4e 43  TION,.    DB_INC
7b60: 52 42 4c 4f 42 2c 20 20 20 20 20 20 20 20 20 20  RBLOB,          
7b70: 44 42 5f 49 4e 54 45 52 52 55 50 54 2c 20 20 20  DB_INTERRUPT,   
7b80: 20 20 20 20 20 44 42 5f 4c 41 53 54 5f 49 4e 53       DB_LAST_INS
7b90: 45 52 54 5f 52 4f 57 49 44 2c 0a 20 20 20 20 44  ERT_ROWID,.    D
7ba0: 42 5f 4e 55 4c 4c 56 41 4c 55 45 2c 20 20 20 20  B_NULLVALUE,    
7bb0: 20 20 20 20 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d       DB_ONECOLUM
7bc0: 4e 2c 20 20 20 20 20 20 20 20 44 42 5f 50 52 4f  N,        DB_PRO
7bd0: 46 49 4c 45 2c 0a 20 20 20 20 44 42 5f 50 52 4f  FILE,.    DB_PRO
7be0: 47 52 45 53 53 2c 20 20 20 20 20 20 20 20 20 20  GRESS,          
7bf0: 44 42 5f 52 45 4b 45 59 2c 20 20 20 20 20 20 20  DB_REKEY,       
7c00: 20 20 20 20 20 44 42 5f 52 4f 4c 4c 42 41 43 4b       DB_ROLLBACK
7c10: 5f 48 4f 4f 4b 2c 0a 20 20 20 20 44 42 5f 54 49  _HOOK,.    DB_TI
7c20: 4d 45 4f 55 54 2c 20 20 20 20 20 20 20 20 20 20  MEOUT,          
7c30: 20 44 42 5f 54 4f 54 41 4c 5f 43 48 41 4e 47 45   DB_TOTAL_CHANGE
7c40: 53 2c 20 20 20 20 44 42 5f 54 52 41 43 45 2c 0a  S,    DB_TRACE,.
7c50: 20 20 20 20 44 42 5f 54 52 41 4e 53 41 43 54 49      DB_TRANSACTI
7c60: 4f 4e 2c 20 20 20 20 20 20 20 44 42 5f 55 50 44  ON,       DB_UPD
7c70: 41 54 45 5f 48 4f 4f 4b 2c 20 20 20 20 20 20 44  ATE_HOOK,      D
7c80: 42 5f 56 45 52 53 49 4f 4e 0a 20 20 7d 3b 0a 20  B_VERSION.  };. 
7c90: 20 2f 2a 20 64 6f 6e 27 74 20 6c 65 61 76 65 20   /* don't leave 
7ca0: 74 72 61 69 6c 69 6e 67 20 63 6f 6d 6d 61 73 20  trailing commas 
7cb0: 6f 6e 20 44 42 5f 65 6e 75 6d 2c 20 69 74 20 63  on DB_enum, it c
7cc0: 6f 6e 66 75 73 65 73 20 74 68 65 20 41 49 58 20  onfuses the AIX 
7cd0: 78 6c 63 20 63 6f 6d 70 69 6c 65 72 20 2a 2f 0a  xlc compiler */.
7ce0: 0a 20 20 69 66 28 20 6f 62 6a 63 3c 32 20 29 7b  .  if( objc<2 ){
7cf0: 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
7d00: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
7d10: 20 6f 62 6a 76 2c 20 22 53 55 42 43 4f 4d 4d 41   objv, "SUBCOMMA
7d20: 4e 44 20 2e 2e 2e 22 29 3b 0a 20 20 20 20 72 65  ND ...");.    re
7d30: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
7d40: 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65    }.  if( Tcl_Ge
7d50: 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e  tIndexFromObj(in
7d60: 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 44  terp, objv[1], D
7d70: 42 5f 73 74 72 73 2c 20 22 6f 70 74 69 6f 6e 22  B_strs, "option"
7d80: 2c 20 30 2c 20 26 63 68 6f 69 63 65 29 20 29 7b  , 0, &choice) ){
7d90: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
7da0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 73 77  ERROR;.  }..  sw
7db0: 69 74 63 68 28 20 28 65 6e 75 6d 20 44 42 5f 65  itch( (enum DB_e
7dc0: 6e 75 6d 29 63 68 6f 69 63 65 20 29 7b 0a 0a 20  num)choice ){.. 
7dd0: 20 2f 2a 20 20 20 20 24 64 62 20 61 75 74 68 6f   /*    $db autho
7de0: 72 69 7a 65 72 20 3f 43 41 4c 4c 42 41 43 4b 3f  rizer ?CALLBACK?
7df0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b  .  **.  ** Invok
7e00: 65 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c  e the given call
7e10: 62 61 63 6b 20 74 6f 20 61 75 74 68 6f 72 69 7a  back to authoriz
7e20: 65 20 65 61 63 68 20 53 51 4c 20 6f 70 65 72 61  e each SQL opera
7e30: 74 69 6f 6e 20 61 73 20 69 74 20 69 73 0a 20 20  tion as it is.  
7e40: 2a 2a 20 63 6f 6d 70 69 6c 65 64 2e 20 20 35 20  ** compiled.  5 
7e50: 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 61 70  arguments are ap
7e60: 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 63 61  pended to the ca
7e70: 6c 6c 62 61 63 6b 20 62 65 66 6f 72 65 20 69 74  llback before it
7e80: 20 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6b 65 64   is.  ** invoked
7e90: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 31  :.  **.  **   (1
7ea0: 29 20 54 68 65 20 61 75 74 68 6f 72 69 7a 61 74  ) The authorizat
7eb0: 69 6f 6e 20 74 79 70 65 20 28 65 78 3a 20 53 51  ion type (ex: SQ
7ec0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c  LITE_CREATE_TABL
7ed0: 45 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  E, SQLITE_INSERT
7ee0: 2c 20 2e 2e 2e 29 0a 20 20 2a 2a 20 20 20 28 32  , ...).  **   (2
7ef0: 29 20 46 69 72 73 74 20 64 65 73 63 72 69 70 74  ) First descript
7f00: 69 76 65 20 6e 61 6d 65 20 28 64 65 70 65 6e 64  ive name (depend
7f10: 73 20 6f 6e 20 61 75 74 68 6f 72 69 7a 61 74 69  s on authorizati
7f20: 6f 6e 20 74 79 70 65 29 0a 20 20 2a 2a 20 20 20  on type).  **   
7f30: 28 33 29 20 53 65 63 6f 6e 64 20 64 65 73 63 72  (3) Second descr
7f40: 69 70 74 69 76 65 20 6e 61 6d 65 0a 20 20 2a 2a  iptive name.  **
7f50: 20 20 20 28 34 29 20 4e 61 6d 65 20 6f 66 20 74     (4) Name of t
7f60: 68 65 20 64 61 74 61 62 61 73 65 20 28 65 78 3a  he database (ex:
7f70: 20 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 29   "main", "temp")
7f80: 0a 20 20 2a 2a 20 20 20 28 35 29 20 4e 61 6d 65  .  **   (5) Name
7f90: 20 6f 66 20 74 72 69 67 67 65 72 20 74 68 61 74   of trigger that
7fa0: 20 69 73 20 64 6f 69 6e 67 20 74 68 65 20 61 63   is doing the ac
7fb0: 63 65 73 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  cess.  **.  ** T
7fc0: 68 65 20 63 61 6c 6c 62 61 63 6b 20 73 68 6f 75  he callback shou
7fd0: 6c 64 20 72 65 74 75 72 6e 20 6f 6e 20 6f 66 20  ld return on of 
7fe0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
7ff0: 72 69 6e 67 73 3a 20 53 51 4c 49 54 45 5f 4f 4b  rings: SQLITE_OK
8000: 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 49 47  ,.  ** SQLITE_IG
8010: 4e 4f 52 45 2c 20 6f 72 20 53 51 4c 49 54 45 5f  NORE, or SQLITE_
8020: 44 45 4e 59 2e 20 20 41 6e 79 20 6f 74 68 65 72  DENY.  Any other
8030: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
8040: 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2a 0a   an error..  **.
8050: 20 20 2a 2a 20 49 66 20 74 68 69 73 20 6d 65 74    ** If this met
8060: 68 6f 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 77  hod is invoked w
8070: 69 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73  ith no arguments
8080: 2c 20 74 68 65 20 63 75 72 72 65 6e 74 20 61 75  , the current au
8090: 74 68 6f 72 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a  thorization.  **
80a0: 20 63 61 6c 6c 62 61 63 6b 20 73 74 72 69 6e 67   callback string
80b0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20   is returned..  
80c0: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 41 55 54  */.  case DB_AUT
80d0: 48 4f 52 49 5a 45 52 3a 20 7b 0a 23 69 66 64 65  HORIZER: {.#ifde
80e0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
80f0: 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20  THORIZATION.    
8100: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
8110: 28 69 6e 74 65 72 70 2c 20 22 61 75 74 68 6f 72  (interp, "author
8120: 69 7a 61 74 69 6f 6e 20 6e 6f 74 20 61 76 61 69  ization not avai
8130: 6c 61 62 6c 65 20 69 6e 20 74 68 69 73 20 62 75  lable in this bu
8140: 69 6c 64 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  ild", 0);.    re
8150: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8160: 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 6f 62  #else.    if( ob
8170: 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63  jc>3 ){.      Tc
8180: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
8190: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
81a0: 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20  "?CALLBACK?");. 
81b0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
81c0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65  ERROR;.    }else
81d0: 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a   if( objc==2 ){.
81e0: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
81f0: 41 75 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Auth ){.        
8200: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
8210: 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 41  (interp, pDb->zA
8220: 75 74 68 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  uth, 0);.      }
8230: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8240: 20 20 63 68 61 72 20 2a 7a 41 75 74 68 3b 0a 20    char *zAuth;. 
8250: 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20       int len;.  
8260: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75      if( pDb->zAu
8270: 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  th ){.        Tc
8280: 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 41 75 74  l_Free(pDb->zAut
8290: 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  h);.      }.    
82a0: 20 20 7a 41 75 74 68 20 3d 20 54 63 6c 5f 47 65    zAuth = Tcl_Ge
82b0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
82c0: 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20  bjv[2], &len);. 
82d0: 20 20 20 20 20 69 66 28 20 7a 41 75 74 68 20 26       if( zAuth &
82e0: 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20  & len>0 ){.     
82f0: 20 20 20 70 44 62 2d 3e 7a 41 75 74 68 20 3d 20     pDb->zAuth = 
8300: 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b  Tcl_Alloc( len +
8310: 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65   1 );.        me
8320: 6d 63 70 79 28 70 44 62 2d 3e 7a 41 75 74 68 2c  mcpy(pDb->zAuth,
8330: 20 7a 41 75 74 68 2c 20 6c 65 6e 2b 31 29 3b 0a   zAuth, len+1);.
8340: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8350: 20 20 20 20 20 70 44 62 2d 3e 7a 41 75 74 68 20       pDb->zAuth 
8360: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
8370: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74     if( pDb->zAut
8380: 68 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  h ){.        pDb
8390: 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  ->interp = inter
83a0: 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  p;.        sqlit
83b0: 65 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65  e3_set_authorize
83c0: 72 28 70 44 62 2d 3e 64 62 2c 20 61 75 74 68 5f  r(pDb->db, auth_
83d0: 63 61 6c 6c 62 61 63 6b 2c 20 70 44 62 29 3b 0a  callback, pDb);.
83e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
83f0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74       sqlite3_set
8400: 5f 61 75 74 68 6f 72 69 7a 65 72 28 70 44 62 2d  _authorizer(pDb-
8410: 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  >db, 0, 0);.    
8420: 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
8430: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
8440: 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 62 75 73  .  /*    $db bus
8450: 79 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a  y ?CALLBACK?.  *
8460: 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  *.  ** Invoke th
8470: 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b  e given callback
8480: 20 69 66 20 61 6e 20 53 51 4c 20 73 74 61 74 65   if an SQL state
8490: 6d 65 6e 74 20 61 74 74 65 6d 70 74 73 20 74 6f  ment attempts to
84a0: 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 6c 6f 63   open.  ** a loc
84b0: 6b 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  ked database fil
84c0: 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  e..  */.  case D
84d0: 42 5f 42 55 53 59 3a 20 7b 0a 20 20 20 20 69 66  B_BUSY: {.    if
84e0: 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20  ( objc>3 ){.    
84f0: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
8500: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
8510: 6a 76 2c 20 22 43 41 4c 4c 42 41 43 4b 22 29 3b  jv, "CALLBACK");
8520: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
8530: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c  L_ERROR;.    }el
8540: 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29  se if( objc==2 )
8550: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  {.      if( pDb-
8560: 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 20 20  >zBusy ){.      
8570: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
8580: 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e  lt(interp, pDb->
8590: 7a 42 75 73 79 2c 20 30 29 3b 0a 20 20 20 20 20  zBusy, 0);.     
85a0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
85b0: 20 20 20 20 63 68 61 72 20 2a 7a 42 75 73 79 3b      char *zBusy;
85c0: 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  .      int len;.
85d0: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
85e0: 42 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Busy ){.        
85f0: 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 42  Tcl_Free(pDb->zB
8600: 75 73 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  usy);.      }.  
8610: 20 20 20 20 7a 42 75 73 79 20 3d 20 54 63 6c 5f      zBusy = Tcl_
8620: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
8630: 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b  (objv[2], &len);
8640: 0a 20 20 20 20 20 20 69 66 28 20 7a 42 75 73 79  .      if( zBusy
8650: 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20   && len>0 ){.   
8660: 20 20 20 20 20 70 44 62 2d 3e 7a 42 75 73 79 20       pDb->zBusy 
8670: 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e  = Tcl_Alloc( len
8680: 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20   + 1 );.        
8690: 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 42 75 73  memcpy(pDb->zBus
86a0: 79 2c 20 7a 42 75 73 79 2c 20 6c 65 6e 2b 31 29  y, zBusy, len+1)
86b0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
86c0: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 42 75 73         pDb->zBus
86d0: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  y = 0;.      }. 
86e0: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 42       if( pDb->zB
86f0: 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70  usy ){.        p
8700: 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74  Db->interp = int
8710: 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  erp;.        sql
8720: 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65  ite3_busy_handle
8730: 72 28 70 44 62 2d 3e 64 62 2c 20 44 62 42 75 73  r(pDb->db, DbBus
8740: 79 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a  yHandler, pDb);.
8750: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8760: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73       sqlite3_bus
8770: 79 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64  y_handler(pDb->d
8780: 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  b, 0, 0);.      
8790: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  }.    }.    brea
87a0: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
87b0: 20 24 64 62 20 63 61 63 68 65 20 66 6c 75 73 68   $db cache flush
87c0: 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63 61  .  **     $db ca
87d0: 63 68 65 20 73 69 7a 65 20 6e 0a 20 20 2a 2a 0a  che size n.  **.
87e0: 20 20 2a 2a 20 46 6c 75 73 68 20 74 68 65 20 70    ** Flush the p
87f0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
8800: 74 20 63 61 63 68 65 2c 20 6f 72 20 73 65 74 20  t cache, or set 
8810: 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
8820: 65 72 20 6f 66 0a 20 20 2a 2a 20 63 61 63 68 65  er of.  ** cache
8830: 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20  d statements..  
8840: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 41 43  */.  case DB_CAC
8850: 48 45 3a 20 7b 0a 20 20 20 20 63 68 61 72 20 2a  HE: {.    char *
8860: 73 75 62 43 6d 64 3b 0a 20 20 20 20 69 6e 74 20  subCmd;.    int 
8870: 6e 3b 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  n;..    if( objc
8880: 3c 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  <=2 ){.      Tcl
8890: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
88a0: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
88b0: 63 61 63 68 65 20 6f 70 74 69 6f 6e 20 3f 61 72  cache option ?ar
88c0: 67 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  g?");.      retu
88d0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
88e0: 20 20 7d 0a 20 20 20 20 73 75 62 43 6d 64 20 3d    }.    subCmd =
88f0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
8900: 6f 6d 4f 62 6a 28 20 6f 62 6a 76 5b 32 5d 2c 20  omObj( objv[2], 
8910: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 2a 73 75  0 );.    if( *su
8920: 62 43 6d 64 3d 3d 27 66 27 20 26 26 20 73 74 72  bCmd=='f' && str
8930: 63 6d 70 28 73 75 62 43 6d 64 2c 22 66 6c 75 73  cmp(subCmd,"flus
8940: 68 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  h")==0 ){.      
8950: 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
8960: 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67         Tcl_Wrong
8970: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
8980: 32 2c 20 6f 62 6a 76 2c 20 22 66 6c 75 73 68 22  2, objv, "flush"
8990: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
89a0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
89b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
89c0: 20 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65    flushStmtCache
89d0: 28 20 70 44 62 20 29 3b 0a 20 20 20 20 20 20 7d  ( pDb );.      }
89e0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 2a  .    }else if( *
89f0: 73 75 62 43 6d 64 3d 3d 27 73 27 20 26 26 20 73  subCmd=='s' && s
8a00: 74 72 63 6d 70 28 73 75 62 43 6d 64 2c 22 73 69  trcmp(subCmd,"si
8a10: 7a 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ze")==0 ){.     
8a20: 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a   if( objc!=4 ){.
8a30: 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e          Tcl_Wron
8a40: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
8a50: 20 32 2c 20 6f 62 6a 76 2c 20 22 73 69 7a 65 20   2, objv, "size 
8a60: 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  n");.        ret
8a70: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
8a80: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8a90: 20 20 20 20 69 66 28 20 54 43 4c 5f 45 52 52 4f      if( TCL_ERRO
8aa0: 52 3d 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  R==Tcl_GetIntFro
8ab0: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
8ac0: 76 5b 33 5d 2c 20 26 6e 29 20 29 7b 0a 20 20 20  v[3], &n) ){.   
8ad0: 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
8ae0: 64 52 65 73 75 6c 74 28 20 69 6e 74 65 72 70 2c  dResult( interp,
8af0: 20 22 63 61 6e 6e 6f 74 20 63 6f 6e 76 65 72 74   "cannot convert
8b00: 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 20 20   \"", .         
8b10: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
8b20: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
8b30: 33 5d 2c 30 29 2c 20 22 5c 22 20 74 6f 20 69 6e  3],0), "\" to in
8b40: 74 65 67 65 72 22 2c 20 30 29 3b 0a 20 20 20 20  teger", 0);.    
8b50: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
8b60: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
8b70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
8b80: 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20   if( n<0 ){.    
8b90: 20 20 20 20 20 20 20 20 66 6c 75 73 68 53 74 6d          flushStm
8ba0: 74 43 61 63 68 65 28 20 70 44 62 20 29 3b 0a 20  tCache( pDb );. 
8bb0: 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 30             n = 0
8bc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
8bd0: 65 20 69 66 28 20 6e 3e 4d 41 58 5f 50 52 45 50  e if( n>MAX_PREP
8be0: 41 52 45 44 5f 53 54 4d 54 53 20 29 7b 0a 20 20  ARED_STMTS ){.  
8bf0: 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 4d 41            n = MA
8c00: 58 5f 50 52 45 50 41 52 45 44 5f 53 54 4d 54 53  X_PREPARED_STMTS
8c10: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
8c20: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 6d 61 78          pDb->max
8c30: 53 74 6d 74 20 3d 20 6e 3b 0a 20 20 20 20 20 20  Stmt = n;.      
8c40: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
8c50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c  }else{.      Tcl
8c60: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 20 69  _AppendResult( i
8c70: 6e 74 65 72 70 2c 20 22 62 61 64 20 6f 70 74 69  nterp, "bad opti
8c80: 6f 6e 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  on \"", .       
8c90: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
8ca0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
8cb0: 30 29 2c 20 22 5c 22 3a 20 6d 75 73 74 20 62 65  0), "\": must be
8cc0: 20 66 6c 75 73 68 20 6f 72 20 73 69 7a 65 22 2c   flush or size",
8cd0: 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   0);.      retur
8ce0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
8cf0: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
8d00: 7d 0a 0a 20 20 2f 2a 20 20 20 20 20 24 64 62 20  }..  /*     $db 
8d10: 63 68 61 6e 67 65 73 0a 20 20 2a 2a 0a 20 20 2a  changes.  **.  *
8d20: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
8d30: 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
8d40: 20 77 65 72 65 20 6d 6f 64 69 66 69 65 64 2c 20   were modified, 
8d50: 69 6e 73 65 72 74 65 64 2c 20 6f 72 20 64 65 6c  inserted, or del
8d60: 65 74 65 64 20 62 79 0a 20 20 2a 2a 20 74 68 65  eted by.  ** the
8d70: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 49 4e 53   most recent INS
8d80: 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44  ERT, UPDATE or D
8d90: 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c  ELETE statement,
8da0: 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67 20 0a   not including .
8db0: 20 20 2a 2a 20 61 6e 79 20 63 68 61 6e 67 65 73    ** any changes
8dc0: 20 6d 61 64 65 20 62 79 20 74 72 69 67 67 65 72   made by trigger
8dd0: 20 70 72 6f 67 72 61 6d 73 2e 0a 20 20 2a 2f 0a   programs..  */.
8de0: 20 20 63 61 73 65 20 44 42 5f 43 48 41 4e 47 45    case DB_CHANGE
8df0: 53 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  S: {.    Tcl_Obj
8e00: 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 69   *pResult;.    i
8e10: 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
8e20: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
8e30: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
8e40: 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 20  objv, "");.     
8e50: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
8e60: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 52 65  R;.    }.    pRe
8e70: 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62  sult = Tcl_GetOb
8e80: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  jResult(interp);
8e90: 0a 20 20 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f  .    Tcl_SetIntO
8ea0: 62 6a 28 70 52 65 73 75 6c 74 2c 20 73 71 6c 69  bj(pResult, sqli
8eb0: 74 65 33 5f 63 68 61 6e 67 65 73 28 70 44 62 2d  te3_changes(pDb-
8ec0: 3e 64 62 29 29 3b 0a 20 20 20 20 62 72 65 61 6b  >db));.    break
8ed0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24  ;.  }..  /*    $
8ee0: 64 62 20 63 6c 6f 73 65 0a 20 20 2a 2a 0a 20 20  db close.  **.  
8ef0: 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20  ** Shutdown the 
8f00: 64 61 74 61 62 61 73 65 0a 20 20 2a 2f 0a 20 20  database.  */.  
8f10: 63 61 73 65 20 44 42 5f 43 4c 4f 53 45 3a 20 7b  case DB_CLOSE: {
8f20: 0a 20 20 20 20 54 63 6c 5f 44 65 6c 65 74 65 43  .    Tcl_DeleteC
8f30: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 54  ommand(interp, T
8f40: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
8f50: 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 29  Obj(objv[0], 0))
8f60: 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
8f70: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  /*.  **     
8f80: 24 64 62 20 63 6f 6c 6c 61 74 65 20 4e 41 4d 45  $db collate NAME
8f90: 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a   SCRIPT.  **.  *
8fa0: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53  * Create a new S
8fb0: 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e  QL collation fun
8fc0: 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d  ction called NAM
8fd0: 45 2e 20 20 57 68 65 6e 65 76 65 72 0a 20 20 2a  E.  Whenever.  *
8fe0: 2a 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20  * that function 
8ff0: 69 73 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b  is called, invok
9000: 65 20 53 43 52 49 50 54 20 74 6f 20 65 76 61 6c  e SCRIPT to eval
9010: 75 61 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f  uate the functio
9020: 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  n..  */.  case D
9030: 42 5f 43 4f 4c 4c 41 54 45 3a 20 7b 0a 20 20 20  B_COLLATE: {.   
9040: 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43 6f   SqlCollate *pCo
9050: 6c 6c 61 74 65 3b 0a 20 20 20 20 63 68 61 72 20  llate;.    char 
9060: 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 68 61 72  *zName;.    char
9070: 20 2a 7a 53 63 72 69 70 74 3b 0a 20 20 20 20 69   *zScript;.    i
9080: 6e 74 20 6e 53 63 72 69 70 74 3b 0a 20 20 20 20  nt nScript;.    
9090: 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
90a0: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
90b0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
90c0: 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20 53 43 52   objv, "NAME SCR
90d0: 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74  IPT");.      ret
90e0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
90f0: 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d     }.    zName =
9100: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
9110: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30  omObj(objv[2], 0
9120: 29 3b 0a 20 20 20 20 7a 53 63 72 69 70 74 20 3d  );.    zScript =
9130: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
9140: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26  omObj(objv[3], &
9150: 6e 53 63 72 69 70 74 29 3b 0a 20 20 20 20 70 43  nScript);.    pC
9160: 6f 6c 6c 61 74 65 20 3d 20 28 53 71 6c 43 6f 6c  ollate = (SqlCol
9170: 6c 61 74 65 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28  late*)Tcl_Alloc(
9180: 20 73 69 7a 65 6f 66 28 2a 70 43 6f 6c 6c 61 74   sizeof(*pCollat
9190: 65 29 20 2b 20 6e 53 63 72 69 70 74 20 2b 20 31  e) + nScript + 1
91a0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c   );.    if( pCol
91b0: 6c 61 74 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  late==0 ) return
91c0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
91d0: 70 43 6f 6c 6c 61 74 65 2d 3e 69 6e 74 65 72 70  pCollate->interp
91e0: 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 70   = interp;.    p
91f0: 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78 74 20 3d  Collate->pNext =
9200: 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 3b 0a   pDb->pCollate;.
9210: 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 7a 53      pCollate->zS
9220: 63 72 69 70 74 20 3d 20 28 63 68 61 72 2a 29 26  cript = (char*)&
9230: 70 43 6f 6c 6c 61 74 65 5b 31 5d 3b 0a 20 20 20  pCollate[1];.   
9240: 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20 3d   pDb->pCollate =
9250: 20 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 6d   pCollate;.    m
9260: 65 6d 63 70 79 28 70 43 6f 6c 6c 61 74 65 2d 3e  emcpy(pCollate->
9270: 7a 53 63 72 69 70 74 2c 20 7a 53 63 72 69 70 74  zScript, zScript
9280: 2c 20 6e 53 63 72 69 70 74 2b 31 29 3b 0a 20 20  , nScript+1);.  
9290: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 72    if( sqlite3_cr
92a0: 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 70  eate_collation(p
92b0: 44 62 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 53  Db->db, zName, S
92c0: 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20 20 20  QLITE_UTF8, .   
92d0: 20 20 20 20 20 70 43 6f 6c 6c 61 74 65 2c 20 74       pCollate, t
92e0: 63 6c 53 71 6c 43 6f 6c 6c 61 74 65 29 20 29 7b  clSqlCollate) ){
92f0: 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65  .      Tcl_SetRe
9300: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
9310: 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72  ar *)sqlite3_err
9320: 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 54 43  msg(pDb->db), TC
9330: 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20  L_VOLATILE);.   
9340: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
9350: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  ROR;.    }.    b
9360: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
9370: 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63 6f 6c    **     $db col
9380: 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 20 53 43  lation_needed SC
9390: 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43  RIPT.  **.  ** C
93a0: 72 65 61 74 65 20 61 20 6e 65 77 20 53 51 4c 20  reate a new SQL 
93b0: 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69  collation functi
93c0: 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20  on called NAME. 
93d0: 20 57 68 65 6e 65 76 65 72 0a 20 20 2a 2a 20 74   Whenever.  ** t
93e0: 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  hat function is 
93f0: 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53  called, invoke S
9400: 43 52 49 50 54 20 74 6f 20 65 76 61 6c 75 61 74  CRIPT to evaluat
9410: 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a  e the function..
9420: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43    */.  case DB_C
9430: 4f 4c 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 3a  OLLATION_NEEDED:
9440: 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21   {.    if( objc!
9450: 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =3 ){.      Tcl_
9460: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
9470: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53  erp, 2, objv, "S
9480: 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72  CRIPT");.      r
9490: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
94a0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
94b0: 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64  Db->pCollateNeed
94c0: 65 64 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  ed ){.      Tcl_
94d0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62  DecrRefCount(pDb
94e0: 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64  ->pCollateNeeded
94f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 62  );.    }.    pDb
9500: 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64  ->pCollateNeeded
9510: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
9520: 4f 62 6a 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  Obj(objv[2]);.  
9530: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
9540: 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65  nt(pDb->pCollate
9550: 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 73 71 6c  Needed);.    sql
9560: 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e  ite3_collation_n
9570: 65 65 64 65 64 28 70 44 62 2d 3e 64 62 2c 20 70  eeded(pDb->db, p
9580: 44 62 2c 20 74 63 6c 43 6f 6c 6c 61 74 65 4e 65  Db, tclCollateNe
9590: 65 64 65 64 29 3b 0a 20 20 20 20 62 72 65 61 6b  eded);.    break
95a0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24  ;.  }..  /*    $
95b0: 64 62 20 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 20 3f  db commit_hook ?
95c0: 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20  CALLBACK?.  **. 
95d0: 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67   ** Invoke the g
95e0: 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 6a 75  iven callback ju
95f0: 73 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74  st before commit
9600: 74 69 6e 67 20 65 76 65 72 79 20 53 51 4c 20 74  ting every SQL t
9610: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a  ransaction..  **
9620: 20 49 66 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   If the callback
9630: 20 74 68 72 6f 77 73 20 61 6e 20 65 78 63 65 70   throws an excep
9640: 74 69 6f 6e 20 6f 72 20 72 65 74 75 72 6e 73 20  tion or returns 
9650: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74  non-zero, then t
9660: 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  he.  ** transact
9670: 69 6f 6e 20 69 73 20 61 62 6f 72 74 65 64 2e 20  ion is aborted. 
9680: 20 49 66 20 43 41 4c 4c 42 41 43 4b 20 69 73 20   If CALLBACK is 
9690: 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c  an empty string,
96a0: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 0a 20 20   the callback.  
96b0: 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e 0a  ** is disabled..
96c0: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43    */.  case DB_C
96d0: 4f 4d 4d 49 54 5f 48 4f 4f 4b 3a 20 7b 0a 20 20  OMMIT_HOOK: {.  
96e0: 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a    if( objc>3 ){.
96f0: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
9700: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
9710: 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41  , objv, "?CALLBA
9720: 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74  CK?");.      ret
9730: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9740: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a     }else if( obj
9750: 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66  c==2 ){.      if
9760: 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29  ( pDb->zCommit )
9770: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  {.        Tcl_Ap
9780: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
9790: 70 2c 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 2c  p, pDb->zCommit,
97a0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
97b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
97c0: 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 0a 20 20 20  ar *zCommit;.   
97d0: 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
97e0: 20 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d    if( pDb->zComm
97f0: 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  it ){.        Tc
9800: 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 43 6f 6d  l_Free(pDb->zCom
9810: 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mit);.      }.  
9820: 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 54 63      zCommit = Tc
9830: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
9840: 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e  bj(objv[2], &len
9850: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6f  );.      if( zCo
9860: 6d 6d 69 74 20 26 26 20 6c 65 6e 3e 30 20 29 7b  mmit && len>0 ){
9870: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 43  .        pDb->zC
9880: 6f 6d 6d 69 74 20 3d 20 54 63 6c 5f 41 6c 6c 6f  ommit = Tcl_Allo
9890: 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20  c( len + 1 );.  
98a0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62        memcpy(pDb
98b0: 2d 3e 7a 43 6f 6d 6d 69 74 2c 20 7a 43 6f 6d 6d  ->zCommit, zComm
98c0: 69 74 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20  it, len+1);.    
98d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
98e0: 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20   pDb->zCommit = 
98f0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
9900: 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69   if( pDb->zCommi
9910: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  t ){.        pDb
9920: 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  ->interp = inter
9930: 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  p;.        sqlit
9940: 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 70  e3_commit_hook(p
9950: 44 62 2d 3e 64 62 2c 20 44 62 43 6f 6d 6d 69 74  Db->db, DbCommit
9960: 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20  Handler, pDb);. 
9970: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9980: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d      sqlite3_comm
9990: 69 74 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c  it_hook(pDb->db,
99a0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
99b0: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
99c0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
99d0: 62 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c 0a 20  b complete SQL. 
99e0: 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
99f0: 54 52 55 45 20 69 66 20 53 51 4c 20 69 73 20 61  TRUE if SQL is a
9a00: 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c 20 73 74   complete SQL st
9a10: 61 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e  atement.  Return
9a20: 20 46 41 4c 53 45 20 69 66 0a 20 20 2a 2a 20 61   FALSE if.  ** a
9a30: 64 64 69 74 69 6f 6e 61 6c 20 6c 69 6e 65 73 20  dditional lines 
9a40: 6f 66 20 69 6e 70 75 74 20 61 72 65 20 6e 65 65  of input are nee
9a50: 64 65 64 2e 20 20 54 68 69 73 20 69 73 20 73 69  ded.  This is si
9a60: 6d 69 6c 61 72 20 74 6f 20 74 68 65 0a 20 20 2a  milar to the.  *
9a70: 2a 20 62 75 69 6c 74 2d 69 6e 20 22 69 6e 66 6f  * built-in "info
9a80: 20 63 6f 6d 70 6c 65 74 65 22 20 63 6f 6d 6d 61   complete" comma
9a90: 6e 64 20 6f 66 20 54 63 6c 2e 0a 20 20 2a 2f 0a  nd of Tcl..  */.
9aa0: 20 20 63 61 73 65 20 44 42 5f 43 4f 4d 50 4c 45    case DB_COMPLE
9ab0: 54 45 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53 51  TE: {.#ifndef SQ
9ac0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45  LITE_OMIT_COMPLE
9ad0: 54 45 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  TE.    Tcl_Obj *
9ae0: 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74  pResult;.    int
9af0: 20 69 73 43 6f 6d 70 6c 65 74 65 3b 0a 20 20 20   isComplete;.   
9b00: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
9b10: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
9b20: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
9b30: 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 22 29 3b 0a  , objv, "SQL");.
9b40: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
9b50: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
9b60: 20 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 73    isComplete = s
9b70: 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 28  qlite3_complete(
9b80: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
9b90: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30  omObj(objv[2], 0
9ba0: 29 20 29 3b 0a 20 20 20 20 70 52 65 73 75 6c 74  ) );.    pResult
9bb0: 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73   = Tcl_GetObjRes
9bc0: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  ult(interp);.   
9bd0: 20 54 63 6c 5f 53 65 74 42 6f 6f 6c 65 61 6e 4f   Tcl_SetBooleanO
9be0: 62 6a 28 70 52 65 73 75 6c 74 2c 20 69 73 43 6f  bj(pResult, isCo
9bf0: 6d 70 6c 65 74 65 29 3b 0a 23 65 6e 64 69 66 0a  mplete);.#endif.
9c00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
9c10: 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6f 70 79    /*    $db copy
9c20: 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69   conflict-algori
9c30: 74 68 6d 20 74 61 62 6c 65 20 66 69 6c 65 6e 61  thm table filena
9c40: 6d 65 20 3f 53 45 50 41 52 41 54 4f 52 3f 20 3f  me ?SEPARATOR? ?
9c50: 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f 0a 20  NULLINDICATOR?. 
9c60: 20 2a 2a 0a 20 20 2a 2a 20 43 6f 70 79 20 64 61   **.  ** Copy da
9c70: 74 61 20 69 6e 74 6f 20 74 61 62 6c 65 20 66 72  ta into table fr
9c80: 6f 6d 20 66 69 6c 65 6e 61 6d 65 2c 20 6f 70 74  om filename, opt
9c90: 69 6f 6e 61 6c 6c 79 20 75 73 69 6e 67 20 53 45  ionally using SE
9ca0: 50 41 52 41 54 4f 52 0a 20 20 2a 2a 20 61 73 20  PARATOR.  ** as 
9cb0: 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72  column separator
9cc0: 73 2e 20 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20  s.  If a column 
9cd0: 63 6f 6e 74 61 69 6e 73 20 61 20 6e 75 6c 6c 20  contains a null 
9ce0: 73 74 72 69 6e 67 2c 20 6f 72 20 74 68 65 0a 20  string, or the. 
9cf0: 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 4e 55 4c   ** value of NUL
9d00: 4c 49 4e 44 49 43 41 54 4f 52 2c 20 61 20 4e 55  LINDICATOR, a NU
9d10: 4c 4c 20 69 73 20 69 6e 73 65 72 74 65 64 20 66  LL is inserted f
9d20: 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 20  or the column.. 
9d30: 20 2a 2a 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67   ** conflict-alg
9d40: 6f 72 69 74 68 6d 20 69 73 20 6f 6e 65 20 6f 66  orithm is one of
9d50: 20 74 68 65 20 73 71 6c 69 74 65 20 63 6f 6e 66   the sqlite conf
9d60: 6c 69 63 74 20 61 6c 67 6f 72 69 74 68 6d 73 3a  lict algorithms:
9d70: 0a 20 20 2a 2a 20 20 20 20 72 6f 6c 6c 62 61 63  .  **    rollbac
9d80: 6b 2c 20 61 62 6f 72 74 2c 20 66 61 69 6c 2c 20  k, abort, fail, 
9d90: 69 67 6e 6f 72 65 2c 20 72 65 70 6c 61 63 65 0a  ignore, replace.
9da0: 20 20 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c    ** On success,
9db0: 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   return the numb
9dc0: 65 72 20 6f 66 20 6c 69 6e 65 73 20 70 72 6f 63  er of lines proc
9dd0: 65 73 73 65 64 2c 20 6e 6f 74 20 6e 65 63 65 73  essed, not neces
9de0: 73 61 72 69 6c 79 20 73 61 6d 65 0a 20 20 2a 2a  sarily same.  **
9df0: 20 61 73 20 27 64 62 20 63 68 61 6e 67 65 73 27   as 'db changes'
9e00: 20 64 75 65 20 74 6f 20 63 6f 6e 66 6c 69 63 74   due to conflict
9e10: 2d 61 6c 67 6f 72 69 74 68 6d 20 73 65 6c 65 63  -algorithm selec
9e20: 74 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ted..  **.  ** T
9e30: 68 69 73 20 63 6f 64 65 20 69 73 20 62 61 73 69  his code is basi
9e40: 63 61 6c 6c 79 20 61 6e 20 69 6d 70 6c 65 6d 65  cally an impleme
9e50: 6e 74 61 74 69 6f 6e 2f 65 6e 68 61 6e 63 65 6d  ntation/enhancem
9e60: 65 6e 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  ent of.  ** the 
9e70: 73 71 6c 69 74 65 33 20 73 68 65 6c 6c 2e 63 20  sqlite3 shell.c 
9e80: 22 2e 69 6d 70 6f 72 74 22 20 63 6f 6d 6d 61 6e  ".import" comman
9e90: 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  d..  **.  ** Thi
9ea0: 73 20 63 6f 6d 6d 61 6e 64 20 75 73 61 67 65 20  s command usage 
9eb0: 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
9ec0: 20 74 68 65 20 73 71 6c 69 74 65 32 2e 78 20 43   the sqlite2.x C
9ed0: 4f 50 59 20 73 74 61 74 65 6d 65 6e 74 2c 0a 20  OPY statement,. 
9ee0: 20 2a 2a 20 77 68 69 63 68 20 69 6d 70 6f 72 74   ** which import
9ef0: 73 20 66 69 6c 65 20 64 61 74 61 20 69 6e 74 6f  s file data into
9f00: 20 61 20 74 61 62 6c 65 20 75 73 69 6e 67 20 74   a table using t
9f10: 68 65 20 50 6f 73 74 67 72 65 53 51 4c 20 43 4f  he PostgreSQL CO
9f20: 50 59 20 66 69 6c 65 20 66 6f 72 6d 61 74 3a 0a  PY file format:.
9f30: 20 20 2a 2a 20 20 20 24 64 62 20 63 6f 70 79 20    **   $db copy 
9f40: 24 63 6f 6e 66 6c 69 74 5f 61 6c 67 6f 20 24 74  $conflit_algo $t
9f50: 61 62 6c 65 5f 6e 61 6d 65 20 24 66 69 6c 65 6e  able_name $filen
9f60: 61 6d 65 20 5c 74 20 5c 5c 4e 0a 20 20 2a 2f 0a  ame \t \\N.  */.
9f70: 20 20 63 61 73 65 20 44 42 5f 43 4f 50 59 3a 20    case DB_COPY: 
9f80: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62  {.    char *zTab
9f90: 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
9fa0: 20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61 74 61    /* Insert data
9fb0: 20 69 6e 74 6f 20 74 68 69 73 20 74 61 62 6c 65   into this table
9fc0: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 46   */.    char *zF
9fd0: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
9fe0: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
9ff0: 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 65 78  from which to ex
a000: 74 72 61 63 74 20 64 61 74 61 20 2a 2f 0a 20 20  tract data */.  
a010: 20 20 63 68 61 72 20 2a 7a 43 6f 6e 66 6c 69 63    char *zConflic
a020: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
a030: 20 54 68 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c   The conflict al
a040: 67 6f 72 69 74 68 6d 20 74 6f 20 75 73 65 20 2a  gorithm to use *
a050: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  /.    sqlite3_st
a060: 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20  mt *pStmt;      
a070: 20 20 2f 2a 20 41 20 73 74 61 74 65 6d 65 6e 74    /* A statement
a080: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c   */.    int nCol
a090: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a0a0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
a0b0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
a0c0: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74  table */.    int
a0d0: 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20   nByte;         
a0e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
a0f0: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61  er of bytes in a
a100: 6e 20 53 51 4c 20 73 74 72 69 6e 67 20 2a 2f 0a  n SQL string */.
a110: 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20      int i, j;   
a120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a130: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
a140: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 70   */.    int nSep
a150: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a160: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
a170: 20 62 79 74 65 73 20 69 6e 20 7a 53 65 70 5b 5d   bytes in zSep[]
a180: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4e 75 6c   */.    int nNul
a190: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
a1a0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
a1b0: 20 62 79 74 65 73 20 69 6e 20 7a 4e 75 6c 6c 5b   bytes in zNull[
a1c0: 5d 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  ] */.    char *z
a1d0: 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sql;            
a1e0: 20 20 20 20 20 2f 2a 20 41 6e 20 53 51 4c 20 73       /* An SQL s
a1f0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
a200: 63 68 61 72 20 2a 7a 4c 69 6e 65 3b 20 20 20 20  char *zLine;    
a210: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
a220: 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f 66 20   single line of 
a230: 69 6e 70 75 74 20 66 72 6f 6d 20 74 68 65 20 66  input from the f
a240: 69 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  ile */.    char 
a250: 2a 2a 61 7a 43 6f 6c 3b 20 20 20 20 20 20 20 20  **azCol;        
a260: 20 20 20 20 20 20 20 2f 2a 20 7a 4c 69 6e 65 5b         /* zLine[
a270: 5d 20 62 72 6f 6b 65 6e 20 75 70 20 69 6e 74 6f  ] broken up into
a280: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20   columns */.    
a290: 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 20 20  char *zCommit;  
a2a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
a2b0: 6f 77 20 74 6f 20 63 6f 6d 6d 69 74 20 63 68 61  ow to commit cha
a2c0: 6e 67 65 73 20 2a 2f 0a 20 20 20 20 46 49 4c 45  nges */.    FILE
a2d0: 20 2a 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20   *in;           
a2e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
a2f0: 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 20  nput file */.   
a300: 20 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20 30 3b   int lineno = 0;
a310: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a320: 4c 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 69  Line number of i
a330: 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 20  nput file */.   
a340: 20 63 68 61 72 20 7a 4c 69 6e 65 4e 75 6d 5b 38   char zLineNum[8
a350: 30 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0];          /* 
a360: 4c 69 6e 65 20 6e 75 6d 62 65 72 20 70 72 69 6e  Line number prin
a370: 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20  t buffer */.    
a380: 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74  Tcl_Obj *pResult
a390: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69  ;           /* i
a3a0: 6e 74 65 72 70 20 72 65 73 75 6c 74 20 2a 2f 0a  nterp result */.
a3b0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 65 70 3b  .    char *zSep;
a3c0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c  .    char *zNull
a3d0: 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3c 35  ;.    if( objc<5
a3e0: 20 7c 7c 20 6f 62 6a 63 3e 37 20 29 7b 0a 20 20   || objc>7 ){.  
a3f0: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
a400: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
a410: 6f 62 6a 76 2c 20 0a 20 20 20 20 20 20 20 20 20  objv, .         
a420: 22 43 4f 4e 46 4c 49 43 54 2d 41 4c 47 4f 52 49  "CONFLICT-ALGORI
a430: 54 48 4d 20 54 41 42 4c 45 20 46 49 4c 45 4e 41  THM TABLE FILENA
a440: 4d 45 20 3f 53 45 50 41 52 41 54 4f 52 3f 20 3f  ME ?SEPARATOR? ?
a450: 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f 22 29  NULLINDICATOR?")
a460: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
a470: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
a480: 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 3d 36 20      if( objc>=6 
a490: 29 7b 0a 20 20 20 20 20 20 7a 53 65 70 20 3d 20  ){.      zSep = 
a4a0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
a4b0: 6d 4f 62 6a 28 6f 62 6a 76 5b 35 5d 2c 20 30 29  mObj(objv[5], 0)
a4c0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
a4d0: 20 20 20 7a 53 65 70 20 3d 20 22 5c 74 22 3b 0a     zSep = "\t";.
a4e0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62      }.    if( ob
a4f0: 6a 63 3e 3d 37 20 29 7b 0a 20 20 20 20 20 20 7a  jc>=7 ){.      z
a500: 4e 75 6c 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74  Null = Tcl_GetSt
a510: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
a520: 5b 36 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  [6], 0);.    }el
a530: 73 65 7b 0a 20 20 20 20 20 20 7a 4e 75 6c 6c 20  se{.      zNull 
a540: 3d 20 22 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = "";.    }.    
a550: 7a 43 6f 6e 66 6c 69 63 74 20 3d 20 54 63 6c 5f  zConflict = Tcl_
a560: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
a570: 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20  (objv[2], 0);.  
a580: 20 20 7a 54 61 62 6c 65 20 3d 20 54 63 6c 5f 47    zTable = Tcl_G
a590: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
a5a0: 6f 62 6a 76 5b 33 5d 2c 20 30 29 3b 0a 20 20 20  objv[3], 0);.   
a5b0: 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74   zFile = Tcl_Get
a5c0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
a5d0: 6a 76 5b 34 5d 2c 20 30 29 3b 0a 20 20 20 20 6e  jv[4], 0);.    n
a5e0: 53 65 70 20 3d 20 73 74 72 6c 65 6e 28 7a 53 65  Sep = strlen(zSe
a5f0: 70 29 3b 0a 20 20 20 20 6e 4e 75 6c 6c 20 3d 20  p);.    nNull = 
a600: 73 74 72 6c 65 6e 28 7a 4e 75 6c 6c 29 3b 0a 20  strlen(zNull);. 
a610: 20 20 20 69 66 28 20 6e 53 65 70 3d 3d 30 20 29     if( nSep==0 )
a620: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
a630: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
a640: 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c  "Error: non-null
a650: 20 73 65 70 61 72 61 74 6f 72 20 72 65 71 75 69   separator requi
a660: 72 65 64 20 66 6f 72 20 63 6f 70 79 22 2c 30 29  red for copy",0)
a670: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
a680: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
a690: 20 20 20 20 69 66 28 73 71 6c 69 74 65 33 53 74      if(sqlite3St
a6a0: 72 49 43 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c  rICmp(zConflict,
a6b0: 20 22 72 6f 6c 6c 62 61 63 6b 22 29 20 21 3d 20   "rollback") != 
a6c0: 30 20 26 26 0a 20 20 20 20 20 20 20 73 71 6c 69  0 &&.       sqli
a6d0: 74 65 33 53 74 72 49 43 6d 70 28 7a 43 6f 6e 66  te3StrICmp(zConf
a6e0: 6c 69 63 74 2c 20 22 61 62 6f 72 74 22 20 20 20  lict, "abort"   
a6f0: 29 20 21 3d 20 30 20 26 26 0a 20 20 20 20 20 20  ) != 0 &&.      
a700: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
a710: 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 66 61 69 6c  zConflict, "fail
a720: 22 20 20 20 20 29 20 21 3d 20 30 20 26 26 0a 20  "    ) != 0 &&. 
a730: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72        sqlite3Str
a740: 49 43 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20  ICmp(zConflict, 
a750: 22 69 67 6e 6f 72 65 22 20 20 29 20 21 3d 20 30  "ignore"  ) != 0
a760: 20 26 26 0a 20 20 20 20 20 20 20 73 71 6c 69 74   &&.       sqlit
a770: 65 33 53 74 72 49 43 6d 70 28 7a 43 6f 6e 66 6c  e3StrICmp(zConfl
a780: 69 63 74 2c 20 22 72 65 70 6c 61 63 65 22 20 29  ict, "replace" )
a790: 20 21 3d 20 30 20 29 20 7b 0a 20 20 20 20 20 20   != 0 ) {.      
a7a0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
a7b0: 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a  (interp, "Error:
a7c0: 20 5c 22 22 2c 20 7a 43 6f 6e 66 6c 69 63 74 2c   \"", zConflict,
a7d0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 5c   .            "\
a7e0: 22 2c 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f  ", conflict-algo
a7f0: 72 69 74 68 6d 20 6d 75 73 74 20 62 65 20 6f 6e  rithm must be on
a800: 65 20 6f 66 3a 20 72 6f 6c 6c 62 61 63 6b 2c 20  e of: rollback, 
a810: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 61  ".            "a
a820: 62 6f 72 74 2c 20 66 61 69 6c 2c 20 69 67 6e 6f  bort, fail, igno
a830: 72 65 2c 20 6f 72 20 72 65 70 6c 61 63 65 22 2c  re, or replace",
a840: 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   0);.      retur
a850: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
a860: 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71   }.    zSql = sq
a870: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53  lite3_mprintf("S
a880: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 27 25 71  ELECT * FROM '%q
a890: 27 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20  '", zTable);.   
a8a0: 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a   if( zSql==0 ){.
a8b0: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
a8c0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
a8d0: 45 72 72 6f 72 3a 20 6e 6f 20 73 75 63 68 20 74  Error: no such t
a8e0: 61 62 6c 65 3a 20 22 2c 20 7a 54 61 62 6c 65 2c  able: ", zTable,
a8f0: 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   0);.      retur
a900: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
a910: 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73   }.    nByte = s
a920: 74 72 6c 65 6e 28 7a 53 71 6c 29 3b 0a 20 20 20  trlen(zSql);.   
a930: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
a940: 65 70 61 72 65 28 70 44 62 2d 3e 64 62 2c 20 7a  epare(pDb->db, z
a950: 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
a960: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
a970: 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
a980: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
a990: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
a9a0: 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72  t(interp, "Error
a9b0: 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  : ", sqlite3_err
a9c0: 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30 29  msg(pDb->db), 0)
a9d0: 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 30  ;.      nCol = 0
a9e0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
a9f0: 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65     nCol = sqlite
aa00: 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70  3_column_count(p
aa10: 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Stmt);.    }.   
aa20: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
aa30: 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66  e(pStmt);.    if
aa40: 28 20 6e 43 6f 6c 3d 3d 30 20 29 20 7b 0a 20 20  ( nCol==0 ) {.  
aa50: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
aa60: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
aa70: 7a 53 71 6c 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e  zSql = malloc( n
aa80: 42 79 74 65 20 2b 20 35 30 20 2b 20 6e 43 6f 6c  Byte + 50 + nCol
aa90: 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 53  *2 );.    if( zS
aaa0: 71 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20 20  ql==0 ) {.      
aab0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
aac0: 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a  (interp, "Error:
aad0: 20 63 61 6e 27 74 20 6d 61 6c 6c 6f 63 28 29 22   can't malloc()"
aae0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , 0);.      retu
aaf0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
ab00: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
ab10: 73 6e 70 72 69 6e 74 66 28 6e 42 79 74 65 2b 35  snprintf(nByte+5
ab20: 30 2c 20 7a 53 71 6c 2c 20 22 49 4e 53 45 52 54  0, zSql, "INSERT
ab30: 20 4f 52 20 25 71 20 49 4e 54 4f 20 27 25 71 27   OR %q INTO '%q'
ab40: 20 56 41 4c 55 45 53 28 3f 22 2c 0a 20 20 20 20   VALUES(?",.    
ab50: 20 20 20 20 20 7a 43 6f 6e 66 6c 69 63 74 2c 20       zConflict, 
ab60: 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 6a 20 3d  zTable);.    j =
ab70: 20 73 74 72 6c 65 6e 28 7a 53 71 6c 29 3b 0a 20   strlen(zSql);. 
ab80: 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 43     for(i=1; i<nC
ab90: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
aba0: 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 2c 27 3b  zSql[j++] = ',';
abb0: 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d  .      zSql[j++]
abc0: 20 3d 20 27 3f 27 3b 0a 20 20 20 20 7d 0a 20 20   = '?';.    }.  
abd0: 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 29    zSql[j++] = ')
abe0: 27 3b 0a 20 20 20 20 7a 53 71 6c 5b 6a 5d 20 3d  ';.    zSql[j] =
abf0: 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   0;.    rc = sql
ac00: 69 74 65 33 5f 70 72 65 70 61 72 65 28 70 44 62  ite3_prepare(pDb
ac10: 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  ->db, zSql, -1, 
ac20: 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  &pStmt, 0);.    
ac30: 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20  free(zSql);.    
ac40: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
ac50: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
ac60: 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a  (interp, "Error:
ac70: 20 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d   ", sqlite3_errm
ac80: 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b  sg(pDb->db), 0);
ac90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
aca0: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
acb0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
acc0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
acd0: 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 46 69    in = fopen(zFi
ace0: 6c 65 2c 20 22 72 62 22 29 3b 0a 20 20 20 20 69  le, "rb");.    i
acf0: 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  f( in==0 ){.    
ad00: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
ad10: 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f  lt(interp, "Erro
ad20: 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66  r: cannot open f
ad30: 69 6c 65 3a 20 22 2c 20 7a 46 69 6c 65 2c 20 4e  ile: ", zFile, N
ad40: 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ULL);.      sqli
ad50: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
ad60: 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  mt);.      retur
ad70: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
ad80: 20 7d 0a 20 20 20 20 61 7a 43 6f 6c 20 3d 20 6d   }.    azCol = m
ad90: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 61 7a  alloc( sizeof(az
ada0: 43 6f 6c 5b 30 5d 29 2a 28 6e 43 6f 6c 2b 31 29  Col[0])*(nCol+1)
adb0: 20 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 43 6f   );.    if( azCo
adc0: 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20 20 54  l==0 ) {.      T
add0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
ade0: 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20  interp, "Error: 
adf0: 63 61 6e 27 74 20 6d 61 6c 6c 6f 63 28 29 22 2c  can't malloc()",
ae00: 20 30 29 3b 0a 20 20 20 20 20 20 66 63 6c 6f 73   0);.      fclos
ae10: 65 28 69 6e 29 3b 0a 20 20 20 20 20 20 72 65 74  e(in);.      ret
ae20: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
ae30: 20 20 20 7d 0a 20 20 20 20 28 76 6f 69 64 29 73     }.    (void)s
ae40: 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d  qlite3_exec(pDb-
ae50: 3e 64 62 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c  >db, "BEGIN", 0,
ae60: 20 30 2c 20 30 29 3b 0a 20 20 20 20 7a 43 6f 6d   0, 0);.    zCom
ae70: 6d 69 74 20 3d 20 22 43 4f 4d 4d 49 54 22 3b 0a  mit = "COMMIT";.
ae80: 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4c 69 6e      while( (zLin
ae90: 65 20 3d 20 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e  e = local_getlin
aea0: 65 28 30 2c 20 69 6e 29 29 21 3d 30 20 29 7b 0a  e(0, in))!=0 ){.
aeb0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20        char *z;. 
aec0: 20 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 20 20       i = 0;.    
aed0: 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20    lineno++;.    
aee0: 20 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20 7a 4c 69    azCol[0] = zLi
aef0: 6e 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ne;.      for(i=
af00: 30 2c 20 7a 3d 7a 4c 69 6e 65 3b 20 2a 7a 3b 20  0, z=zLine; *z; 
af10: 7a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  z++){.        if
af20: 28 20 2a 7a 3d 3d 7a 53 65 70 5b 30 5d 20 26 26  ( *z==zSep[0] &&
af30: 20 73 74 72 6e 63 6d 70 28 7a 2c 20 7a 53 65 70   strncmp(z, zSep
af40: 2c 20 6e 53 65 70 29 3d 3d 30 20 29 7b 0a 20 20  , nSep)==0 ){.  
af50: 20 20 20 20 20 20 20 20 2a 7a 20 3d 20 30 3b 0a          *z = 0;.
af60: 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20            i++;. 
af70: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e           if( i<n
af80: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Col ){.         
af90: 20 20 20 61 7a 43 6f 6c 5b 69 5d 20 3d 20 26 7a     azCol[i] = &z
afa0: 5b 6e 53 65 70 5d 3b 0a 20 20 20 20 20 20 20 20  [nSep];.        
afb0: 20 20 20 20 7a 20 2b 3d 20 6e 53 65 70 2d 31 3b      z += nSep-1;
afc0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
afd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
afe0: 20 20 20 20 20 69 66 28 20 69 2b 31 21 3d 6e 43       if( i+1!=nC
aff0: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  ol ){.        ch
b000: 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20 20 20  ar *zErr;.      
b010: 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 73 74 72    int nErr = str
b020: 6c 65 6e 28 7a 46 69 6c 65 29 20 2b 20 32 30 30  len(zFile) + 200
b030: 3b 0a 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d  ;.        zErr =
b040: 20 6d 61 6c 6c 6f 63 28 6e 45 72 72 29 3b 0a 20   malloc(nErr);. 
b050: 20 20 20 20 20 20 20 69 66 28 20 7a 45 72 72 20         if( zErr 
b060: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
b070: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 45  ite3_snprintf(nE
b080: 72 72 2c 20 7a 45 72 72 2c 0a 20 20 20 20 20 20  rr, zErr,.      
b090: 20 20 20 20 20 20 20 22 45 72 72 6f 72 3a 20 25         "Error: %
b0a0: 73 20 6c 69 6e 65 20 25 64 3a 20 65 78 70 65 63  s line %d: expec
b0b0: 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e 73 20 6f  ted %d columns o
b0c0: 66 20 64 61 74 61 20 62 75 74 20 66 6f 75 6e 64  f data but found
b0d0: 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %d",.          
b0e0: 20 20 20 7a 46 69 6c 65 2c 20 6c 69 6e 65 6e 6f     zFile, lineno
b0f0: 2c 20 6e 43 6f 6c 2c 20 69 2b 31 29 3b 0a 20 20  , nCol, i+1);.  
b100: 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
b110: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
b120: 20 7a 45 72 72 2c 20 30 29 3b 0a 20 20 20 20 20   zErr, 0);.     
b130: 20 20 20 20 20 66 72 65 65 28 7a 45 72 72 29 3b       free(zErr);
b140: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
b150: 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 52 4f     zCommit = "RO
b160: 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20 20 20  LLBACK";.       
b170: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
b180: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
b190: 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
b1a0: 20 20 20 20 20 2f 2a 20 63 68 65 63 6b 20 66 6f       /* check fo
b1b0: 72 20 6e 75 6c 6c 20 64 61 74 61 2c 20 69 66 20  r null data, if 
b1c0: 73 6f 2c 20 62 69 6e 64 20 61 73 20 6e 75 6c 6c  so, bind as null
b1d0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 20 28   */.        if (
b1e0: 28 6e 4e 75 6c 6c 3e 30 20 26 26 20 73 74 72 63  (nNull>0 && strc
b1f0: 6d 70 28 61 7a 43 6f 6c 5b 69 5d 2c 20 7a 4e 75  mp(azCol[i], zNu
b200: 6c 6c 29 3d 3d 30 29 20 7c 7c 20 73 74 72 6c 65  ll)==0) || strle
b210: 6e 28 61 7a 43 6f 6c 5b 69 5d 29 3d 3d 30 29 20  n(azCol[i])==0) 
b220: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
b230: 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53  te3_bind_null(pS
b240: 74 6d 74 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20  tmt, i+1);.     
b250: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b260: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
b270: 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 2b 31  _text(pStmt, i+1
b280: 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 20 2d 31 2c 20  , azCol[i], -1, 
b290: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
b2a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b2b0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
b2c0: 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20  step(pStmt);.   
b2d0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
b2e0: 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20  reset(pStmt);.  
b2f0: 20 20 20 20 66 72 65 65 28 7a 4c 69 6e 65 29 3b      free(zLine);
b300: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
b310: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
b320: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
b330: 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72  sult(interp,"Err
b340: 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f 65  or: ", sqlite3_e
b350: 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20  rrmsg(pDb->db), 
b360: 30 29 3b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6d  0);.        zCom
b370: 6d 69 74 20 3d 20 22 52 4f 4c 4c 42 41 43 4b 22  mit = "ROLLBACK"
b380: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
b390: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
b3a0: 20 20 20 66 72 65 65 28 61 7a 43 6f 6c 29 3b 0a     free(azCol);.
b3b0: 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a      fclose(in);.
b3c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
b3d0: 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
b3e0: 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f 65   (void)sqlite3_e
b3f0: 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a 43 6f  xec(pDb->db, zCo
b400: 6d 6d 69 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  mmit, 0, 0, 0);.
b410: 0a 20 20 20 20 69 66 28 20 7a 43 6f 6d 6d 69 74  .    if( zCommit
b420: 5b 30 5d 20 3d 3d 20 27 43 27 20 29 7b 0a 20 20  [0] == 'C' ){.  
b430: 20 20 20 20 2f 2a 20 73 75 63 63 65 73 73 2c 20      /* success, 
b440: 73 65 74 20 72 65 73 75 6c 74 20 61 73 20 6e 75  set result as nu
b450: 6d 62 65 72 20 6f 66 20 6c 69 6e 65 73 20 70 72  mber of lines pr
b460: 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20 20  ocessed */.     
b470: 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47   pResult = Tcl_G
b480: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
b490: 72 70 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53  rp);.      Tcl_S
b4a0: 65 74 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74  etIntObj(pResult
b4b0: 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20  , lineno);.     
b4c0: 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20   rc = TCL_OK;.  
b4d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
b4e0: 2a 20 66 61 69 6c 75 72 65 2c 20 61 70 70 65 6e  * failure, appen
b4f0: 64 20 6c 69 6e 65 6e 6f 20 77 68 65 72 65 20 66  d lineno where f
b500: 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 73  ailed */.      s
b510: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
b520: 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 4e 75 6d 29  sizeof(zLineNum)
b530: 2c 20 7a 4c 69 6e 65 4e 75 6d 2c 22 25 64 22 2c  , zLineNum,"%d",
b540: 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20 54  lineno);.      T
b550: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
b560: 69 6e 74 65 72 70 2c 22 2c 20 66 61 69 6c 65 64  interp,", failed
b570: 20 77 68 69 6c 65 20 70 72 6f 63 65 73 73 69 6e   while processin
b580: 67 20 6c 69 6e 65 3a 20 22 2c 7a 4c 69 6e 65 4e  g line: ",zLineN
b590: 75 6d 2c 30 29 3b 0a 20 20 20 20 20 20 72 63 20  um,0);.      rc 
b5a0: 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  = TCL_ERROR;.   
b5b0: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
b5c0: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
b5d0: 24 64 62 20 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f  $db enable_load_
b5e0: 65 78 74 65 6e 73 69 6f 6e 20 42 4f 4f 4c 45 41  extension BOOLEA
b5f0: 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 75 72 6e  N.  **.  ** Turn
b600: 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 20 6c   the extension l
b610: 6f 61 64 69 6e 67 20 66 65 61 74 75 72 65 20 6f  oading feature o
b620: 6e 20 6f 72 20 6f 66 66 2e 20 20 49 74 20 69 66  n or off.  It if
b630: 20 6f 66 66 20 62 79 0a 20 20 2a 2a 20 64 65 66   off by.  ** def
b640: 61 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  ault..  */.  cas
b650: 65 20 44 42 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44  e DB_ENABLE_LOAD
b660: 5f 45 58 54 45 4e 53 49 4f 4e 3a 20 7b 0a 23 69  _EXTENSION: {.#i
b670: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
b680: 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
b690: 0a 20 20 20 20 69 6e 74 20 6f 6e 6f 66 66 3b 0a  .    int onoff;.
b6a0: 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20      if( objc!=3 
b6b0: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
b6c0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
b6d0: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 42 4f 4f 4c  , 2, objv, "BOOL
b6e0: 45 41 4e 22 29 3b 0a 20 20 20 20 20 20 72 65 74  EAN");.      ret
b6f0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
b700: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 54 63 6c     }.    if( Tcl
b710: 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
b720: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
b730: 32 5d 2c 20 26 6f 6e 6f 66 66 29 20 29 7b 0a 20  2], &onoff) ){. 
b740: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
b750: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
b760: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
b770: 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 70  load_extension(p
b780: 44 62 2d 3e 64 62 2c 20 6f 6e 6f 66 66 29 3b 0a  Db->db, onoff);.
b790: 20 20 20 20 62 72 65 61 6b 3b 0a 23 65 6c 73 65      break;.#else
b7a0: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
b7b0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 65  esult(interp, "e
b7c0: 78 74 65 6e 73 69 6f 6e 20 6c 6f 61 64 69 6e 67  xtension loading
b7d0: 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66 20 61   is turned off a
b7e0: 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 22 2c  t compile-time",
b7f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b800: 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20 72 65        0);.    re
b810: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
b820: 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a  #endif.  }..  /*
b830: 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 65 72 72  .  **    $db err
b840: 6f 72 63 6f 64 65 0a 20 20 2a 2a 0a 20 20 2a 2a  orcode.  **.  **
b850: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 65   Return the nume
b860: 72 69 63 20 65 72 72 6f 72 20 63 6f 64 65 20 74  ric error code t
b870: 68 61 74 20 77 61 73 20 72 65 74 75 72 6e 65 64  hat was returned
b880: 20 62 79 20 74 68 65 20 6d 6f 73 74 20 72 65 63   by the most rec
b890: 65 6e 74 0a 20 20 2a 2a 20 63 61 6c 6c 20 74 6f  ent.  ** call to
b8a0: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 2e   sqlite3_exec().
b8b0: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
b8c0: 45 52 52 4f 52 43 4f 44 45 3a 20 7b 0a 20 20 20  ERRORCODE: {.   
b8d0: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
b8e0: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
b8f0: 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f  wIntObj(sqlite3_
b900: 65 72 72 63 6f 64 65 28 70 44 62 2d 3e 64 62 29  errcode(pDb->db)
b910: 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  ));.    break;. 
b920: 20 7d 0a 20 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a   }.   .  /*.  **
b930: 20 20 20 20 24 64 62 20 65 76 61 6c 20 24 73 71      $db eval $sq
b940: 6c 20 3f 61 72 72 61 79 3f 20 3f 7b 20 20 2e 2e  l ?array? ?{  ..
b950: 2e 63 6f 64 65 2e 2e 2e 20 7d 3f 0a 20 20 2a 2a  .code... }?.  **
b960: 20 20 20 20 24 64 62 20 6f 6e 65 63 6f 6c 75 6d      $db onecolum
b970: 6e 20 24 73 71 6c 0a 20 20 2a 2a 0a 20 20 2a 2a  n $sql.  **.  **
b980: 20 54 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   The SQL stateme
b990: 6e 74 20 69 6e 20 24 73 71 6c 20 69 73 20 65 76  nt in $sql is ev
b9a0: 61 6c 75 61 74 65 64 2e 20 20 46 6f 72 20 65 61  aluated.  For ea
b9b0: 63 68 20 72 6f 77 2c 20 74 68 65 20 76 61 6c 75  ch row, the valu
b9c0: 65 73 20 61 72 65 0a 20 20 2a 2a 20 70 6c 61 63  es are.  ** plac
b9d0: 65 64 20 69 6e 20 65 6c 65 6d 65 6e 74 73 20 6f  ed in elements o
b9e0: 66 20 74 68 65 20 61 72 72 61 79 20 6e 61 6d 65  f the array name
b9f0: 64 20 22 61 72 72 61 79 22 20 61 6e 64 20 2e 2e  d "array" and ..
ba00: 2e 63 6f 64 65 2e 2e 2e 20 69 73 20 65 78 65 63  .code... is exec
ba10: 75 74 65 64 2e 0a 20 20 2a 2a 20 49 66 20 22 61  uted..  ** If "a
ba20: 72 72 61 79 22 20 61 6e 64 20 22 63 6f 64 65 22  rray" and "code"
ba30: 20 61 72 65 20 6f 6d 69 74 74 65 64 2c 20 74 68   are omitted, th
ba40: 65 6e 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 20 69  en no callback i
ba50: 73 20 65 76 65 72 79 20 69 6e 76 6f 6b 65 64 2e  s every invoked.
ba60: 0a 20 20 2a 2a 20 49 66 20 22 61 72 72 61 79 22  .  ** If "array"
ba70: 20 69 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72   is an empty str
ba80: 69 6e 67 2c 20 74 68 65 6e 20 74 68 65 20 76 61  ing, then the va
ba90: 6c 75 65 73 20 61 72 65 20 70 6c 61 63 65 64 20  lues are placed 
baa0: 69 6e 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a  in variables.  *
bab0: 2a 20 74 68 61 74 20 68 61 76 65 20 74 68 65 20  * that have the 
bac0: 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65  same name as the
bad0: 20 66 69 65 6c 64 73 20 65 78 74 72 61 63 74 65   fields extracte
bae0: 64 20 62 79 20 74 68 65 20 71 75 65 72 79 2e 0a  d by the query..
baf0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6f 6e    **.  ** The on
bb00: 65 63 6f 6c 75 6d 6e 20 6d 65 74 68 6f 64 20 69  ecolumn method i
bb10: 73 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74  s the equivalent
bb20: 20 6f 66 3a 0a 20 20 2a 2a 20 20 20 20 20 6c 69   of:.  **     li
bb30: 6e 64 65 78 20 5b 24 64 62 20 65 76 61 6c 20 24  ndex [$db eval $
bb40: 73 71 6c 5d 20 30 0a 20 20 2a 2f 0a 20 20 63 61  sql] 0.  */.  ca
bb50: 73 65 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 3a  se DB_ONECOLUMN:
bb60: 0a 20 20 63 61 73 65 20 44 42 5f 45 56 41 4c 3a  .  case DB_EVAL:
bb70: 0a 20 20 63 61 73 65 20 44 42 5f 45 58 49 53 54  .  case DB_EXIST
bb80: 53 3a 20 7b 0a 20 20 20 20 63 68 61 72 20 63 6f  S: {.    char co
bb90: 6e 73 74 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20  nst *zSql;      
bba0: 2f 2a 20 4e 65 78 74 20 53 51 4c 20 73 74 61 74  /* Next SQL stat
bbb0: 65 6d 65 6e 74 20 74 6f 20 65 78 65 63 75 74 65  ement to execute
bbc0: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e   */.    char con
bbd0: 73 74 20 2a 7a 4c 65 66 74 3b 20 20 20 20 20 2f  st *zLeft;     /
bbe0: 2a 20 57 68 61 74 20 69 73 20 6c 65 66 74 20 61  * What is left a
bbf0: 66 74 65 72 20 66 69 72 73 74 20 73 74 6d 74 20  fter first stmt 
bc00: 69 6e 20 7a 53 71 6c 20 2a 2f 0a 20 20 20 20 73  in zSql */.    s
bc10: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
bc20: 6d 74 3b 20 20 20 2f 2a 20 43 6f 6d 70 69 6c 65  mt;   /* Compile
bc30: 64 20 53 51 4c 20 73 74 61 74 6d 65 6e 74 20 2a  d SQL statment *
bc40: 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  /.    Tcl_Obj *p
bc50: 41 72 72 61 79 3b 20 20 20 20 20 20 20 2f 2a 20  Array;       /* 
bc60: 4e 61 6d 65 20 6f 66 20 61 72 72 61 79 20 69 6e  Name of array in
bc70: 74 6f 20 77 68 69 63 68 20 72 65 73 75 6c 74 73  to which results
bc80: 20 61 72 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a   are written */.
bc90: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63      Tcl_Obj *pSc
bca0: 72 69 70 74 3b 20 20 20 20 20 20 2f 2a 20 53 63  ript;      /* Sc
bcb0: 72 69 70 74 20 74 6f 20 72 75 6e 20 66 6f 72 20  ript to run for 
bcc0: 65 61 63 68 20 72 65 73 75 6c 74 20 73 65 74 20  each result set 
bcd0: 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  */.    Tcl_Obj *
bce0: 2a 61 70 50 61 72 6d 3b 20 20 20 20 20 20 2f 2a  *apParm;      /*
bcf0: 20 50 61 72 61 6d 65 74 65 72 73 20 74 68 61 74   Parameters that
bd00: 20 6e 65 65 64 20 61 20 54 63 6c 5f 44 65 63 72   need a Tcl_Decr
bd10: 52 65 66 43 6f 75 6e 74 28 29 20 2a 2f 0a 20 20  RefCount() */.  
bd20: 20 20 69 6e 74 20 6e 50 61 72 6d 3b 20 20 20 20    int nParm;    
bd30: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
bd40: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 75 73  er of entries us
bd50: 65 64 20 69 6e 20 61 70 50 61 72 6d 5b 5d 20 2a  ed in apParm[] *
bd60: 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 61  /.    Tcl_Obj *a
bd70: 50 61 72 6d 5b 31 30 5d 3b 20 20 20 20 2f 2a 20  Parm[10];    /* 
bd80: 53 74 61 74 69 63 20 73 70 61 63 65 20 66 6f 72  Static space for
bd90: 20 61 70 50 61 72 6d 5b 5d 20 69 6e 20 74 68 65   apParm[] in the
bda0: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a   common case */.
bdb0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65      Tcl_Obj *pRe
bdc0: 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61  t;         /* Va
bdd0: 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75 72 6e  lue to be return
bde0: 65 64 20 2a 2f 0a 20 20 20 20 53 71 6c 50 72 65  ed */.    SqlPre
bdf0: 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65 53  paredStmt *pPreS
be00: 74 6d 74 3b 20 20 2f 2a 20 50 6f 69 6e 74 65 72  tmt;  /* Pointer
be10: 20 74 6f 20 61 20 70 72 65 70 61 72 65 64 20 73   to a prepared s
be20: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
be30: 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 69 66  int rc2;..    if
be40: 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f 45 56 41  ( choice==DB_EVA
be50: 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f  L ){.      if( o
be60: 62 6a 63 3c 33 20 7c 7c 20 6f 62 6a 63 3e 35 20  bjc<3 || objc>5 
be70: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57  ){.        Tcl_W
be80: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
be90: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51  rp, 2, objv, "SQ
bea0: 4c 20 3f 41 52 52 41 59 2d 4e 41 4d 45 3f 20 3f  L ?ARRAY-NAME? ?
beb0: 53 43 52 49 50 54 3f 22 29 3b 0a 20 20 20 20 20  SCRIPT?");.     
bec0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
bed0: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
bee0: 20 20 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65     pRet = Tcl_Ne
bef0: 77 4f 62 6a 28 29 3b 0a 20 20 20 20 20 20 54 63  wObj();.      Tc
bf00: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
bf10: 52 65 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Ret);.    }else{
bf20: 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21  .      if( objc!
bf30: 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  =3 ){.        Tc
bf40: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
bf50: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
bf60: 22 53 51 4c 22 29 3b 0a 20 20 20 20 20 20 20 20  "SQL");.        
bf70: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
bf80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
bf90: 69 66 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f 45  if( choice==DB_E
bfa0: 58 49 53 54 53 20 29 7b 0a 20 20 20 20 20 20 20  XISTS ){.       
bfb0: 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 42   pRet = Tcl_NewB
bfc0: 6f 6f 6c 65 61 6e 4f 62 6a 28 30 29 3b 0a 20 20  ooleanObj(0);.  
bfd0: 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65        Tcl_IncrRe
bfe0: 66 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20  fCount(pRet);.  
bff0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c000: 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20     pRet = 0;.   
c010: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
c020: 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20  f( objc==3 ){.  
c030: 20 20 20 20 70 41 72 72 61 79 20 3d 20 70 53 63      pArray = pSc
c040: 72 69 70 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65  ript = 0;.    }e
c050: 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20  lse if( objc==4 
c060: 29 7b 0a 20 20 20 20 20 20 70 41 72 72 61 79 20  ){.      pArray 
c070: 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 63 72 69  = 0;.      pScri
c080: 70 74 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20  pt = objv[3];.  
c090: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
c0a0: 41 72 72 61 79 20 3d 20 6f 62 6a 76 5b 33 5d 3b  Array = objv[3];
c0b0: 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47  .      if( Tcl_G
c0c0: 65 74 53 74 72 69 6e 67 28 70 41 72 72 61 79 29  etString(pArray)
c0d0: 5b 30 5d 3d 3d 30 20 29 20 70 41 72 72 61 79 20  [0]==0 ) pArray 
c0e0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 63 72 69  = 0;.      pScri
c0f0: 70 74 20 3d 20 6f 62 6a 76 5b 34 5d 3b 0a 20 20  pt = objv[4];.  
c100: 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 49 6e 63    }..    Tcl_Inc
c110: 72 52 65 66 43 6f 75 6e 74 28 6f 62 6a 76 5b 32  rRefCount(objv[2
c120: 5d 29 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 54  ]);.    zSql = T
c130: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
c140: 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b  Obj(objv[2], 0);
c150: 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  .    while( rc==
c160: 54 43 4c 5f 4f 4b 20 26 26 20 7a 53 71 6c 5b 30  TCL_OK && zSql[0
c170: 5d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ] ){.      int i
c180: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c190: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
c1a0: 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 69  unter */.      i
c1b0: 6e 74 20 6e 56 61 72 3b 20 20 20 20 20 20 20 20  nt nVar;        
c1c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
c1d0: 62 65 72 20 6f 66 20 62 69 6e 64 20 70 61 72 61  ber of bind para
c1e0: 6d 65 74 65 72 73 20 69 6e 20 74 68 65 20 70 53  meters in the pS
c1f0: 74 6d 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  tmt */.      int
c200: 20 6e 43 6f 6c 20 3d 20 2d 31 3b 20 20 20 20 20   nCol = -1;     
c210: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
c220: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
c230: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
c240: 2f 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20  /.      Tcl_Obj 
c250: 2a 2a 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 30 3b  **apColName = 0;
c260: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63     /* Array of c
c270: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20  olumn names */. 
c280: 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 20 20 20       int len;   
c290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2a0: 2f 2a 20 53 74 72 69 6e 67 20 6c 65 6e 67 74 68  /* String length
c2b0: 20 6f 66 20 7a 53 71 6c 20 2a 2f 0a 20 20 0a 20   of zSql */.  . 
c2c0: 20 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 66       /* Try to f
c2d0: 69 6e 64 20 61 20 53 51 4c 20 73 74 61 74 65 6d  ind a SQL statem
c2e0: 65 6e 74 20 74 68 61 74 20 68 61 73 20 61 6c 72  ent that has alr
c2f0: 65 61 64 79 20 62 65 65 6e 20 63 6f 6d 70 69 6c  eady been compil
c300: 65 64 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  ed and.      ** 
c310: 77 68 69 63 68 20 6d 61 74 63 68 65 73 20 74 68  which matches th
c320: 65 20 6e 65 78 74 20 73 65 71 75 65 6e 63 65 20  e next sequence 
c330: 6f 66 20 53 51 4c 2e 0a 20 20 20 20 20 20 2a 2f  of SQL..      */
c340: 0a 20 20 20 20 20 20 70 53 74 6d 74 20 3d 20 30  .      pStmt = 0
c350: 3b 0a 20 20 20 20 20 20 6c 65 6e 20 3d 20 73 74  ;.      len = st
c360: 72 6c 65 6e 28 7a 53 71 6c 29 3b 0a 20 20 20 20  rlen(zSql);.    
c370: 20 20 66 6f 72 28 70 50 72 65 53 74 6d 74 20 3d    for(pPreStmt =
c380: 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 20   pDb->stmtList; 
c390: 70 50 72 65 53 74 6d 74 3b 20 70 50 72 65 53 74  pPreStmt; pPreSt
c3a0: 6d 74 3d 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65  mt=pPreStmt->pNe
c3b0: 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  xt){.        int
c3c0: 20 6e 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 6e   n = pPreStmt->n
c3d0: 53 71 6c 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Sql;.        if(
c3e0: 20 6c 65 6e 3e 3d 6e 20 0a 20 20 20 20 20 20 20   len>=n .       
c3f0: 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70       && memcmp(p
c400: 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c 20 7a  PreStmt->zSql, z
c410: 53 71 6c 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 20  Sql, n)==0.     
c420: 20 20 20 20 20 20 20 26 26 20 28 7a 53 71 6c 5b         && (zSql[
c430: 6e 5d 3d 3d 30 20 7c 7c 20 7a 53 71 6c 5b 6e 2d  n]==0 || zSql[n-
c440: 31 5d 3d 3d 27 3b 27 29 0a 20 20 20 20 20 20 20  1]==';').       
c450: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 53   ){.          pS
c460: 74 6d 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e  tmt = pPreStmt->
c470: 70 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 20  pStmt;.         
c480: 20 7a 4c 65 66 74 20 3d 20 26 7a 53 71 6c 5b 70   zLeft = &zSql[p
c490: 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 5d 3b 0a  PreStmt->nSql];.
c4a0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68  .          /* Wh
c4b0: 65 6e 20 61 20 70 72 65 70 61 72 65 64 20 73 74  en a prepared st
c4c0: 61 74 65 6d 65 6e 74 20 69 73 20 66 6f 75 6e 64  atement is found
c4d0: 2c 20 75 6e 6c 69 6e 6b 20 69 74 20 66 72 6f 6d  , unlink it from
c4e0: 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
c4f0: 2a 20 63 61 63 68 65 20 6c 69 73 74 2e 20 20 49  * cache list.  I
c500: 74 20 77 69 6c 6c 20 6c 61 74 65 72 20 62 65 20  t will later be 
c510: 61 64 64 65 64 20 62 61 63 6b 20 74 6f 20 74 68  added back to th
c520: 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20  e beginning.    
c530: 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
c540: 63 61 63 68 65 20 6c 69 73 74 20 69 6e 20 6f 72  cache list in or
c550: 64 65 72 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  der to implement
c560: 20 4c 52 55 20 72 65 70 6c 61 63 65 6d 65 6e 74   LRU replacement
c570: 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
c580: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72           if( pPr
c590: 65 53 74 6d 74 2d 3e 70 50 72 65 76 20 29 7b 0a  eStmt->pPrev ){.
c5a0: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 72 65              pPre
c5b0: 53 74 6d 74 2d 3e 70 50 72 65 76 2d 3e 70 4e 65  Stmt->pPrev->pNe
c5c0: 78 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70  xt = pPreStmt->p
c5d0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
c5e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
c5f0: 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74     pDb->stmtList
c600: 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65   = pPreStmt->pNe
c610: 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  xt;.          }.
c620: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50            if( pP
c630: 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 20 29 7b  reStmt->pNext ){
c640: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50 72  .            pPr
c650: 65 53 74 6d 74 2d 3e 70 4e 65 78 74 2d 3e 70 50  eStmt->pNext->pP
c660: 72 65 76 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e  rev = pPreStmt->
c670: 70 50 72 65 76 3b 0a 20 20 20 20 20 20 20 20 20  pPrev;.         
c680: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
c690: 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73      pDb->stmtLas
c6a0: 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 50  t = pPreStmt->pP
c6b0: 72 65 76 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  rev;.          }
c6c0: 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e  .          pDb->
c6d0: 6e 53 74 6d 74 2d 2d 3b 0a 20 20 20 20 20 20 20  nStmt--;.       
c6e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
c6f0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20    }.      }.  . 
c700: 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 70 72       /* If no pr
c710: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
c720: 20 77 61 73 20 66 6f 75 6e 64 2e 20 20 43 6f 6d   was found.  Com
c730: 70 69 6c 65 20 74 68 65 20 53 51 4c 20 74 65 78  pile the SQL tex
c740: 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  t.      */.     
c750: 20 69 66 28 20 70 53 74 6d 74 3d 3d 30 20 29 7b   if( pStmt==0 ){
c760: 0a 20 20 20 20 20 20 20 20 69 66 28 20 53 51 4c  .        if( SQL
c770: 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f  ITE_OK!=sqlite3_
c780: 70 72 65 70 61 72 65 5f 76 32 28 70 44 62 2d 3e  prepare_v2(pDb->
c790: 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
c7a0: 53 74 6d 74 2c 20 26 7a 4c 65 66 74 29 20 29 7b  Stmt, &zLeft) ){
c7b0: 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 53  .          Tcl_S
c7c0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
c7d0: 72 70 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a 28  rp, dbTextToObj(
c7e0: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
c7f0: 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20 20  Db->db)));.     
c800: 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52       rc = TCL_ER
c810: 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ROR;.          b
c820: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
c830: 20 20 20 20 20 20 20 20 69 66 28 20 70 53 74 6d          if( pStm
c840: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
c850: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
c860: 3d 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65  =sqlite3_errcode
c870: 28 70 44 62 2d 3e 64 62 29 20 29 7b 0a 20 20 20  (pDb->db) ){.   
c880: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f           /* A co
c890: 6d 70 69 6c 65 2d 74 69 6d 65 20 65 72 72 6f 72  mpile-time error
c8a0: 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
c8b0: 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f  t.            */
c8c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c  .            Tcl
c8d0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
c8e0: 74 65 72 70 2c 20 64 62 54 65 78 74 54 6f 4f 62  terp, dbTextToOb
c8f0: 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  j(sqlite3_errmsg
c900: 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20  (pDb->db)));.   
c910: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 43           rc = TC
c920: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  L_ERROR;.       
c930: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c940: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
c950: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
c960: 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 61 20  statement was a 
c970: 6e 6f 2d 6f 70 2e 20 20 43 6f 6e 74 69 6e 75 65  no-op.  Continue
c980: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 74 61   to the next sta
c990: 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 20 20 20  tement.         
c9a0: 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c     ** in the SQL
c9b0: 20 73 74 72 69 6e 67 2e 0a 20 20 20 20 20 20 20   string..       
c9c0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
c9d0: 20 20 20 20 7a 53 71 6c 20 3d 20 7a 4c 65 66 74      zSql = zLeft
c9e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  ;.            co
c9f0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
ca00: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
ca10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
ca20: 72 65 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20  reStmt==0 );.   
ca30: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 42     }..      /* B
ca40: 69 6e 64 20 76 61 6c 75 65 73 20 74 6f 20 70 61  ind values to pa
ca50: 72 61 6d 65 74 65 72 73 20 74 68 61 74 20 62 65  rameters that be
ca60: 67 69 6e 20 77 69 74 68 20 24 20 6f 72 20 3a 0a  gin with $ or :.
ca70: 20 20 20 20 20 20 2a 2f 20 20 0a 20 20 20 20 20        */  .     
ca80: 20 6e 56 61 72 20 3d 20 73 71 6c 69 74 65 33 5f   nVar = sqlite3_
ca90: 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63  bind_parameter_c
caa0: 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20  ount(pStmt);.   
cab0: 20 20 20 6e 50 61 72 6d 20 3d 20 30 3b 0a 20 20     nParm = 0;.  
cac0: 20 20 20 20 69 66 28 20 6e 56 61 72 3e 73 69 7a      if( nVar>siz
cad0: 65 6f 66 28 61 50 61 72 6d 29 2f 73 69 7a 65 6f  eof(aParm)/sizeo
cae0: 66 28 61 50 61 72 6d 5b 30 5d 29 20 29 7b 0a 20  f(aParm[0]) ){. 
caf0: 20 20 20 20 20 20 20 61 70 50 61 72 6d 20 3d 20         apParm = 
cb00: 28 54 63 6c 5f 4f 62 6a 2a 2a 29 54 63 6c 5f 41  (Tcl_Obj**)Tcl_A
cb10: 6c 6c 6f 63 28 6e 56 61 72 2a 73 69 7a 65 6f 66  lloc(nVar*sizeof
cb20: 28 61 70 50 61 72 6d 5b 30 5d 29 29 3b 0a 20 20  (apParm[0]));.  
cb30: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
cb40: 20 20 20 61 70 50 61 72 6d 20 3d 20 61 50 61 72     apParm = aPar
cb50: 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  m;.      }.     
cb60: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 56 61   for(i=1; i<=nVa
cb70: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
cb80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61   const char *zVa
cb90: 72 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  r = sqlite3_bind
cba0: 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28  _parameter_name(
cbb0: 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20  pStmt, i);.     
cbc0: 20 20 20 69 66 28 20 7a 56 61 72 21 3d 30 20 26     if( zVar!=0 &
cbd0: 26 20 28 7a 56 61 72 5b 30 5d 3d 3d 27 24 27 20  & (zVar[0]=='$' 
cbe0: 7c 7c 20 7a 56 61 72 5b 30 5d 3d 3d 27 3a 27 20  || zVar[0]==':' 
cbf0: 7c 7c 20 7a 56 61 72 5b 30 5d 3d 3d 27 40 27 29  || zVar[0]=='@')
cc00: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63   ){.          Tc
cc10: 6c 5f 4f 62 6a 20 2a 70 56 61 72 20 3d 20 54 63  l_Obj *pVar = Tc
cc20: 6c 5f 47 65 74 56 61 72 32 45 78 28 69 6e 74 65  l_GetVar2Ex(inte
cc30: 72 70 2c 20 26 7a 56 61 72 5b 31 5d 2c 20 30 2c  rp, &zVar[1], 0,
cc40: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   0);.          i
cc50: 66 28 20 70 56 61 72 20 29 7b 0a 20 20 20 20 20  f( pVar ){.     
cc60: 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20         int n;.  
cc70: 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 64 61            u8 *da
cc80: 74 61 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ta;.            
cc90: 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 70 56  char *zType = pV
cca0: 61 72 2d 3e 74 79 70 65 50 74 72 20 3f 20 70 56  ar->typePtr ? pV
ccb0: 61 72 2d 3e 74 79 70 65 50 74 72 2d 3e 6e 61 6d  ar->typePtr->nam
ccc0: 65 20 3a 20 22 22 3b 0a 20 20 20 20 20 20 20 20  e : "";.        
ccd0: 20 20 20 20 63 68 61 72 20 63 20 3d 20 7a 54 79      char c = zTy
cce0: 70 65 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 20  pe[0];.         
ccf0: 20 20 20 69 66 28 20 7a 56 61 72 5b 30 5d 3d 3d     if( zVar[0]==
cd00: 27 40 27 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  '@' ||.         
cd10: 20 20 20 20 20 20 28 63 3d 3d 27 62 27 20 26 26        (c=='b' &&
cd20: 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 62   strcmp(zType,"b
cd30: 79 74 65 61 72 72 61 79 22 29 3d 3d 30 20 26 26  ytearray")==0 &&
cd40: 20 70 56 61 72 2d 3e 62 79 74 65 73 3d 3d 30 29   pVar->bytes==0)
cd50: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
cd60: 20 20 2f 2a 20 4c 6f 61 64 20 61 20 42 4c 4f 42    /* Load a BLOB
cd70: 20 74 79 70 65 20 69 66 20 74 68 65 20 54 63 6c   type if the Tcl
cd80: 20 76 61 72 69 61 62 6c 65 20 69 73 20 61 20 62   variable is a b
cd90: 79 74 65 61 72 72 61 79 20 61 6e 64 0a 20 20 20  ytearray and.   
cda0: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74             ** it
cdb0: 20 68 61 73 20 6e 6f 20 73 74 72 69 6e 67 20 72   has no string r
cdc0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 72  epresentation or
cdd0: 20 74 68 65 20 68 6f 73 74 0a 20 20 20 20 20 20   the host.      
cde0: 20 20 20 20 20 20 20 20 2a 2a 20 70 61 72 61 6d          ** param
cdf0: 65 74 65 72 20 6e 61 6d 65 20 62 65 67 69 6e 73  eter name begins
ce00: 20 77 69 74 68 20 22 40 22 2e 20 2a 2f 0a 20 20   with "@". */.  
ce10: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
ce20: 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72   = Tcl_GetByteAr
ce30: 72 61 79 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c  rayFromObj(pVar,
ce40: 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20   &n);.          
ce50: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
ce60: 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69 2c 20  _blob(pStmt, i, 
ce70: 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f  data, n, SQLITE_
ce80: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20  STATIC);.       
ce90: 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52         Tcl_IncrR
cea0: 65 66 43 6f 75 6e 74 28 70 56 61 72 29 3b 0a 20  efCount(pVar);. 
ceb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70 50               apP
cec0: 61 72 6d 5b 6e 50 61 72 6d 2b 2b 5d 20 3d 20 70  arm[nParm++] = p
ced0: 56 61 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Var;.           
cee0: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 62   }else if( c=='b
cef0: 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70  ' && strcmp(zTyp
cf00: 65 2c 22 62 6f 6f 6c 65 61 6e 22 29 3d 3d 30 20  e,"boolean")==0 
cf10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
cf20: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
cf30: 62 6a 28 69 6e 74 65 72 70 2c 20 70 56 61 72 2c  bj(interp, pVar,
cf40: 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20   &n);.          
cf50: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
cf60: 5f 69 6e 74 28 70 53 74 6d 74 2c 20 69 2c 20 6e  _int(pStmt, i, n
cf70: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
cf80: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 64 27 20  else if( c=='d' 
cf90: 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c  && strcmp(zType,
cfa0: 22 64 6f 75 62 6c 65 22 29 3d 3d 30 20 29 7b 0a  "double")==0 ){.
cfb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 6f                do
cfc0: 75 62 6c 65 20 72 3b 0a 20 20 20 20 20 20 20 20  uble r;.        
cfd0: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 44 6f 75        Tcl_GetDou
cfe0: 62 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  bleFromObj(inter
cff0: 70 2c 20 70 56 61 72 2c 20 26 72 29 3b 0a 20 20  p, pVar, &r);.  
d000: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
d010: 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28  te3_bind_double(
d020: 70 53 74 6d 74 2c 20 69 2c 20 72 29 3b 0a 20 20  pStmt, i, r);.  
d030: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
d040: 69 66 28 20 28 63 3d 3d 27 77 27 20 26 26 20 73  if( (c=='w' && s
d050: 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 77 69 64  trcmp(zType,"wid
d060: 65 49 6e 74 22 29 3d 3d 30 29 20 7c 7c 0a 20 20  eInt")==0) ||.  
d070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d080: 28 63 3d 3d 27 69 27 20 26 26 20 73 74 72 63 6d  (c=='i' && strcm
d090: 70 28 7a 54 79 70 65 2c 22 69 6e 74 22 29 3d 3d  p(zType,"int")==
d0a0: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0) ){.          
d0b0: 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20      Tcl_WideInt 
d0c0: 76 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  v;.             
d0d0: 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46   Tcl_GetWideIntF
d0e0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70  romObj(interp, p
d0f0: 56 61 72 2c 20 26 76 29 3b 0a 20 20 20 20 20 20  Var, &v);.      
d100: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
d110: 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74  bind_int64(pStmt
d120: 2c 20 69 2c 20 76 29 3b 0a 20 20 20 20 20 20 20  , i, v);.       
d130: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
d140: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 20 3d            data =
d150: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
d160: 2a 29 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  *)Tcl_GetStringF
d170: 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29  romObj(pVar, &n)
d180: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
d190: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
d1a0: 74 28 70 53 74 6d 74 2c 20 69 2c 20 28 63 68 61  t(pStmt, i, (cha
d1b0: 72 20 2a 29 64 61 74 61 2c 20 6e 2c 20 53 51 4c  r *)data, n, SQL
d1c0: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
d1d0: 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49             Tcl_I
d1e0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 56 61 72  ncrRefCount(pVar
d1f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
d200: 20 61 70 50 61 72 6d 5b 6e 50 61 72 6d 2b 2b 5d   apParm[nParm++]
d210: 20 3d 20 70 56 61 72 3b 0a 20 20 20 20 20 20 20   = pVar;.       
d220: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
d230: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
d240: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
d250: 5f 6e 75 6c 6c 28 20 70 53 74 6d 74 2c 20 69 20  _null( pStmt, i 
d260: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
d270: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
d280: 0a 0a 20 20 20 20 20 20 2f 2a 20 45 78 65 63 75  ..      /* Execu
d290: 74 65 20 74 68 65 20 53 51 4c 0a 20 20 20 20 20  te the SQL.     
d2a0: 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28   */.      while(
d2b0: 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 26 26 20 70   rc==TCL_OK && p
d2c0: 53 74 6d 74 20 26 26 20 53 51 4c 49 54 45 5f 52  Stmt && SQLITE_R
d2d0: 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
d2e0: 28 70 53 74 6d 74 29 20 29 7b 0a 0a 09 2f 2a 20  (pStmt) ){.../* 
d2f0: 43 6f 6d 70 75 74 65 20 63 6f 6c 75 6d 6e 20 6e  Compute column n
d300: 61 6d 65 73 2e 20 54 68 69 73 20 6d 75 73 74 20  ames. This must 
d310: 62 65 20 64 6f 6e 65 20 61 66 74 65 72 20 74 68  be done after th
d320: 65 20 66 69 72 73 74 20 73 75 63 63 65 73 73 66  e first successf
d330: 75 6c 0a 09 2a 2a 20 63 61 6c 6c 20 74 6f 20 73  ul..** call to s
d340: 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2c 20 69  qlite3_step(), i
d350: 6e 20 63 61 73 65 20 74 68 65 20 71 75 65 72 79  n case the query
d360: 20 69 73 20 72 65 63 6f 6d 70 69 6c 65 64 20 61   is recompiled a
d370: 6e 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  nd the.        *
d380: 2a 20 6e 75 6d 62 65 72 20 6f 72 20 6e 61 6d 65  * number or name
d390: 73 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65  s of the returne
d3a0: 64 20 63 6f 6c 75 6d 6e 73 20 63 68 61 6e 67 65  d columns change
d3b0: 73 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  s. .        */. 
d3c0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 21 70         assert(!p
d3d0: 41 72 72 61 79 7c 7c 70 53 63 72 69 70 74 29 3b  Array||pScript);
d3e0: 0a 20 20 20 20 20 20 20 20 69 66 20 28 6e 43 6f  .        if (nCo
d3f0: 6c 20 3c 20 30 29 20 7b 0a 20 20 20 20 20 20 20  l < 0) {.       
d400: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 2a 61 70     Tcl_Obj ***ap
d410: 20 3d 20 28 70 53 63 72 69 70 74 3f 26 61 70 43   = (pScript?&apC
d420: 6f 6c 4e 61 6d 65 3a 30 29 3b 0a 20 20 20 20 20  olName:0);.     
d430: 20 20 20 20 20 6e 43 6f 6c 20 3d 20 63 6f 6d 70       nCol = comp
d440: 75 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 69  uteColumnNames(i
d450: 6e 74 65 72 70 2c 20 70 53 74 6d 74 2c 20 61 70  nterp, pStmt, ap
d460: 2c 20 70 41 72 72 61 79 29 3b 0a 20 20 20 20 20  , pArray);.     
d470: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 66 6f     }..        fo
d480: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
d490: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  ++){.          T
d4a0: 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b 0a 20 20  cl_Obj *pVal;.  
d4b0: 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
d4c0: 20 20 20 2f 2a 20 53 65 74 20 70 56 61 6c 20 74     /* Set pVal t
d4d0: 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 69 27  o contain the i'
d4e0: 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 69  th column of thi
d4f0: 73 20 72 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20  s row. */.      
d500: 20 20 20 20 73 77 69 74 63 68 28 20 73 71 6c 69      switch( sqli
d510: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28  te3_column_type(
d520: 70 53 74 6d 74 2c 20 69 29 20 29 7b 0a 20 20 20  pStmt, i) ){.   
d530: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51           case SQ
d540: 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20  LITE_BLOB: {.   
d550: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 62             int b
d560: 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 63  ytes = sqlite3_c
d570: 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d  olumn_bytes(pStm
d580: 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20  t, i);.         
d590: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
d5a0: 2a 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33  *zBlob = sqlite3
d5b0: 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74  _column_blob(pSt
d5c0: 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  mt, i);.        
d5d0: 20 20 20 20 20 20 69 66 28 20 21 7a 42 6c 6f 62        if( !zBlob
d5e0: 20 29 20 62 79 74 65 73 20 3d 20 30 3b 0a 20 20   ) bytes = 0;.  
d5f0: 20 20 20 20 20 20 20 20 20 20 20 20 70 56 61 6c              pVal
d600: 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72   = Tcl_NewByteAr
d610: 72 61 79 4f 62 6a 28 28 75 38 2a 29 7a 42 6c 6f  rayObj((u8*)zBlo
d620: 62 2c 20 62 79 74 65 73 29 3b 0a 20 20 20 20 20  b, bytes);.     
d630: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
d640: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
d650: 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53            case S
d660: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b  QLITE_INTEGER: {
d670: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
d680: 71 6c 69 74 65 5f 69 6e 74 36 34 20 76 20 3d 20  qlite_int64 v = 
d690: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
d6a0: 6e 74 36 34 28 70 53 74 6d 74 2c 20 69 29 3b 0a  nt64(pStmt, i);.
d6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
d6c0: 28 20 76 3e 3d 2d 32 31 34 37 34 38 33 36 34 37  ( v>=-2147483647
d6d0: 20 26 26 20 76 3c 3d 32 31 34 37 34 38 33 36 34   && v<=214748364
d6e0: 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  7 ){.           
d6f0: 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f       pVal = Tcl_
d700: 4e 65 77 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20  NewIntObj(v);.  
d710: 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
d720: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
d730: 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65     pVal = Tcl_Ne
d740: 77 57 69 64 65 49 6e 74 4f 62 6a 28 76 29 3b 0a  wWideIntObj(v);.
d750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
d760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
d770: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
d780: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63   }.            c
d790: 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54  ase SQLITE_FLOAT
d7a0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  : {.            
d7b0: 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 73 71 6c    double r = sql
d7c0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62  ite3_column_doub
d7d0: 6c 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20  le(pStmt, i);.  
d7e0: 20 20 20 20 20 20 20 20 20 20 20 20 70 56 61 6c              pVal
d7f0: 20 3d 20 54 63 6c 5f 4e 65 77 44 6f 75 62 6c 65   = Tcl_NewDouble
d800: 4f 62 6a 28 72 29 3b 0a 20 20 20 20 20 20 20 20  Obj(r);.        
d810: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
d820: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
d830: 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
d840: 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  TE_NULL: {.     
d850: 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20           pVal = 
d860: 64 62 54 65 78 74 54 6f 4f 62 6a 28 70 44 62 2d  dbTextToObj(pDb-
d870: 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20  >zNull);.       
d880: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
d890: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
d8a0: 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a          default:
d8b0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
d8c0: 20 70 56 61 6c 20 3d 20 64 62 54 65 78 74 54 6f   pVal = dbTextTo
d8d0: 4f 62 6a 28 28 63 68 61 72 20 2a 29 73 71 6c 69  Obj((char *)sqli
d8e0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
d8f0: 70 53 74 6d 74 2c 20 69 29 29 3b 0a 20 20 20 20  pStmt, i));.    
d900: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
d910: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
d920: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20           }.  .  
d930: 20 20 20 20 20 20 20 20 69 66 28 20 70 53 63 72          if( pScr
d940: 69 70 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ipt ){.         
d950: 20 20 20 69 66 28 20 70 41 72 72 61 79 3d 3d 30     if( pArray==0
d960: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
d970: 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32    Tcl_ObjSetVar2
d980: 28 69 6e 74 65 72 70 2c 20 61 70 43 6f 6c 4e 61  (interp, apColNa
d990: 6d 65 5b 69 5d 2c 20 30 2c 20 70 56 61 6c 2c 20  me[i], 0, pVal, 
d9a0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
d9b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
d9c0: 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56       Tcl_ObjSetV
d9d0: 61 72 32 28 69 6e 74 65 72 70 2c 20 70 41 72 72  ar2(interp, pArr
d9e0: 61 79 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d  ay, apColName[i]
d9f0: 2c 20 70 56 61 6c 2c 20 30 29 3b 0a 20 20 20 20  , pVal, 0);.    
da00: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
da10: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 68      }else if( ch
da20: 6f 69 63 65 3d 3d 44 42 5f 4f 4e 45 43 4f 4c 55  oice==DB_ONECOLU
da30: 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  MN ){.          
da40: 20 20 61 73 73 65 72 74 28 20 70 52 65 74 3d 3d    assert( pRet==
da50: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  0 );.           
da60: 20 69 66 28 20 70 52 65 74 3d 3d 30 20 29 7b 0a   if( pRet==0 ){.
da70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 52                pR
da80: 65 74 20 3d 20 70 56 61 6c 3b 0a 20 20 20 20 20  et = pVal;.     
da90: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63           Tcl_Inc
daa0: 72 52 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b  rRefCount(pRet);
dab0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
dac0: 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
dad0: 54 43 4c 5f 42 52 45 41 4b 3b 0a 20 20 20 20 20  TCL_BREAK;.     
dae0: 20 20 20 20 20 20 20 69 20 3d 20 6e 43 6f 6c 3b         i = nCol;
daf0: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
db00: 20 69 66 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f   if( choice==DB_
db10: 45 58 49 53 54 53 20 29 7b 0a 20 20 20 20 20 20  EXISTS ){.      
db20: 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65        Tcl_DecrRe
db30: 66 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20  fCount(pRet);.  
db40: 20 20 20 20 20 20 20 20 20 20 70 52 65 74 20 3d            pRet =
db50: 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f   Tcl_NewBooleanO
db60: 62 6a 28 31 29 3b 0a 20 20 20 20 20 20 20 20 20  bj(1);.         
db70: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
db80: 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20 20  unt(pRet);.     
db90: 20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f         rc = TCL_
dba0: 42 52 45 41 4b 3b 0a 20 20 20 20 20 20 20 20 20  BREAK;.         
dbb0: 20 20 20 69 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20     i = nCol;.   
dbc0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
dbd0: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4c 69            Tcl_Li
dbe0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
dbf0: 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c  nt(interp, pRet,
dc00: 20 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20   pVal);.        
dc10: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
dc20: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53 63  .        if( pSc
dc30: 72 69 70 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ript ){.        
dc40: 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f    rc = Tcl_EvalO
dc50: 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 70 53 63  bjEx(interp, pSc
dc60: 72 69 70 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  ript, 0);.      
dc70: 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f      if( rc==TCL_
dc80: 43 4f 4e 54 49 4e 55 45 20 29 7b 0a 20 20 20 20  CONTINUE ){.    
dc90: 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c          rc = TCL
dca0: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  _OK;.          }
dcb0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
dcc0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
dcd0: 3d 54 43 4c 5f 42 52 45 41 4b 20 29 7b 0a 20 20  =TCL_BREAK ){.  
dce0: 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f        rc = TCL_O
dcf0: 4b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  K;.      }..    
dd00: 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20 63 6f    /* Free the co
dd10: 6c 75 6d 6e 20 6e 61 6d 65 20 6f 62 6a 65 63 74  lumn name object
dd20: 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  s */.      if( p
dd30: 53 63 72 69 70 74 20 29 7b 0a 20 20 20 20 20 20  Script ){.      
dd40: 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72    /* If the quer
dd50: 79 20 72 65 74 75 72 6e 65 64 20 6e 6f 20 72 6f  y returned no ro
dd60: 77 73 2c 20 62 75 74 20 61 6e 20 61 72 72 61 79  ws, but an array
dd70: 20 76 61 72 69 61 62 6c 65 20 77 61 73 20 0a 20   variable was . 
dd80: 20 20 20 20 20 20 20 2a 2a 20 73 70 65 63 69 66         ** specif
dd90: 69 65 64 2c 20 63 61 6c 6c 20 63 6f 6d 70 75 74  ied, call comput
dda0: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 20 6e  eColumnNames() n
ddb0: 6f 77 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74  ow to populate t
ddc0: 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  he .        ** a
ddd0: 72 72 61 79 6e 61 6d 65 28 2a 29 20 76 61 72 69  rrayname(*) vari
dde0: 61 62 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  able..        */
ddf0: 0a 20 20 20 20 20 20 20 20 69 66 20 28 70 41 72  .        if (pAr
de00: 72 61 79 20 26 26 20 6e 43 6f 6c 20 3c 20 30 29  ray && nCol < 0)
de10: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c   {.          Tcl
de20: 5f 4f 62 6a 20 2a 2a 2a 61 70 20 3d 20 28 70 53  _Obj ***ap = (pS
de30: 63 72 69 70 74 3f 26 61 70 43 6f 6c 4e 61 6d 65  cript?&apColName
de40: 3a 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  :0);.          n
de50: 43 6f 6c 20 3d 20 63 6f 6d 70 75 74 65 43 6f 6c  Col = computeCol
de60: 75 6d 6e 4e 61 6d 65 73 28 69 6e 74 65 72 70 2c  umnNames(interp,
de70: 20 70 53 74 6d 74 2c 20 61 70 2c 20 70 41 72 72   pStmt, ap, pArr
de80: 61 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ay);.        }. 
de90: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
dea0: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
deb0: 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72          Tcl_Decr
dec0: 52 65 66 43 6f 75 6e 74 28 61 70 43 6f 6c 4e 61  RefCount(apColNa
ded0: 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  me[i]);.        
dee0: 7d 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72  }.        Tcl_Fr
def0: 65 65 28 28 63 68 61 72 2a 29 61 70 43 6f 6c 4e  ee((char*)apColN
df00: 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  ame);.      }.. 
df10: 20 20 20 20 20 2f 2a 20 46 72 65 65 20 74 68 65       /* Free the
df20: 20 62 6f 75 6e 64 20 73 74 72 69 6e 67 20 61 6e   bound string an
df30: 64 20 62 6c 6f 62 20 70 61 72 61 6d 65 74 65 72  d blob parameter
df40: 73 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69  s */.      for(i
df50: 3d 30 3b 20 69 3c 6e 50 61 72 6d 3b 20 69 2b 2b  =0; i<nParm; i++
df60: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 44  ){.        Tcl_D
df70: 65 63 72 52 65 66 43 6f 75 6e 74 28 61 70 50 61  ecrRefCount(apPa
df80: 72 6d 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  rm[i]);.      }.
df90: 20 20 20 20 20 20 69 66 28 20 61 70 50 61 72 6d        if( apParm
dfa0: 21 3d 61 50 61 72 6d 20 29 7b 0a 20 20 20 20 20  !=aParm ){.     
dfb0: 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61     Tcl_Free((cha
dfc0: 72 2a 29 61 70 50 61 72 6d 29 3b 0a 20 20 20 20  r*)apParm);.    
dfd0: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 52 65    }..      /* Re
dfe0: 73 65 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e  set the statemen
dff0: 74 2e 20 20 49 66 20 74 68 65 20 72 65 73 75 6c  t.  If the resul
e000: 74 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45  t code is SQLITE
e010: 5f 53 43 48 45 4d 41 2c 20 74 68 65 6e 0a 20 20  _SCHEMA, then.  
e020: 20 20 20 20 2a 2a 20 66 6c 75 73 68 20 74 68 65      ** flush the
e030: 20 73 74 61 74 65 6d 65 6e 74 20 63 61 63 68 65   statement cache
e040: 20 61 6e 64 20 74 72 79 20 74 68 65 20 73 74 61   and try the sta
e050: 74 65 6d 65 6e 74 20 61 67 61 69 6e 2e 0a 20 20  tement again..  
e060: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 32      */.      rc2
e070: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
e080: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 69  (pStmt);.      i
e090: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
e0a0: 32 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  2 ){.        /* 
e0b0: 49 66 20 61 20 72 75 6e 2d 74 69 6d 65 20 65 72  If a run-time er
e0c0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 70 6f  ror occurs, repo
e0d0: 72 74 20 74 68 65 20 65 72 72 6f 72 20 61 6e 64  rt the error and
e0e0: 20 73 74 6f 70 20 72 65 61 64 69 6e 67 0a 20 20   stop reading.  
e0f0: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c        ** the SQL
e100: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
e110: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
e120: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 64 62 54  sult(interp, dbT
e130: 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33  extToObj(sqlite3
e140: 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29  _errmsg(pDb->db)
e150: 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ));.        sqli
e160: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
e170: 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  mt);.        rc 
e180: 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  = TCL_ERROR;.   
e190: 20 20 20 20 20 69 66 28 20 70 50 72 65 53 74 6d       if( pPreStm
e1a0: 74 20 29 20 54 63 6c 5f 46 72 65 65 28 28 63 68  t ) Tcl_Free((ch
e1b0: 61 72 2a 29 70 50 72 65 53 74 6d 74 29 3b 0a 20  ar*)pPreStmt);. 
e1c0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
e1d0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 44      }else if( pD
e1e0: 62 2d 3e 6d 61 78 53 74 6d 74 3c 3d 30 20 29 7b  b->maxStmt<=0 ){
e1f0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
e200: 68 65 20 63 61 63 68 65 20 69 73 20 74 75 72 6e  he cache is turn
e210: 65 64 20 6f 66 66 2c 20 64 65 61 6c 6c 6f 63 61  ed off, dealloca
e220: 74 65 64 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ted the statemen
e230: 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  t */.        if(
e240: 20 70 50 72 65 53 74 6d 74 20 29 20 54 63 6c 5f   pPreStmt ) Tcl_
e250: 46 72 65 65 28 28 63 68 61 72 2a 29 70 50 72 65  Free((char*)pPre
e260: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 73  Stmt);.        s
e270: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
e280: 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 7d 65  pStmt);.      }e
e290: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
e2a0: 45 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65  Everything worke
e2b0: 64 20 61 6e 64 20 74 68 65 20 63 61 63 68 65 20  d and the cache 
e2c0: 69 73 20 6f 70 65 72 61 74 69 6f 6e 61 6c 2e 0a  is operational..
e2d0: 20 20 20 20 20 20 20 20 2a 2a 20 43 72 65 61 74          ** Creat
e2e0: 65 20 61 20 6e 65 77 20 53 71 6c 50 72 65 70 61  e a new SqlPrepa
e2f0: 72 65 64 53 74 6d 74 20 73 74 72 75 63 74 75 72  redStmt structur
e300: 65 20 69 66 20 77 65 20 6e 65 65 64 20 6f 6e 65  e if we need one
e310: 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 49 66  ..        ** (If
e320: 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65   we already have
e330: 20 6f 6e 65 20 77 65 20 63 61 6e 20 6a 75 73 74   one we can just
e340: 20 72 65 75 73 65 20 69 74 2e 29 0a 20 20 20 20   reuse it.).    
e350: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
e360: 66 28 20 70 50 72 65 53 74 6d 74 3d 3d 30 20 29  f( pPreStmt==0 )
e370: 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 65 6e 20  {.          len 
e380: 3d 20 7a 4c 65 66 74 20 2d 20 7a 53 71 6c 3b 0a  = zLeft - zSql;.
e390: 20 20 20 20 20 20 20 20 20 20 70 50 72 65 53 74            pPreSt
e3a0: 6d 74 20 3d 20 28 53 71 6c 50 72 65 70 61 72 65  mt = (SqlPrepare
e3b0: 64 53 74 6d 74 2a 29 54 63 6c 5f 41 6c 6c 6f 63  dStmt*)Tcl_Alloc
e3c0: 28 20 73 69 7a 65 6f 66 28 2a 70 50 72 65 53 74  ( sizeof(*pPreSt
e3d0: 6d 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  mt) );.         
e3e0: 20 69 66 28 20 70 50 72 65 53 74 6d 74 3d 3d 30   if( pPreStmt==0
e3f0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
e400: 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ROR;.          p
e410: 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 20 3d  PreStmt->pStmt =
e420: 20 70 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20   pStmt;.        
e430: 20 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c    pPreStmt->nSql
e440: 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 20 20   = len;.        
e450: 20 20 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c    pPreStmt->zSql
e460: 20 3d 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70   = sqlite3_sql(p
e470: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Stmt);.         
e480: 20 61 73 73 65 72 74 28 20 73 74 72 6c 65 6e 28   assert( strlen(
e490: 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 29 3d  pPreStmt->zSql)=
e4a0: 3d 6c 65 6e 20 29 3b 0a 20 20 20 20 20 20 20 20  =len );.        
e4b0: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 6d 65 6d    assert( 0==mem
e4c0: 63 6d 70 28 70 50 72 65 53 74 6d 74 2d 3e 7a 53  cmp(pPreStmt->zS
e4d0: 71 6c 2c 20 7a 53 71 6c 2c 20 6c 65 6e 29 20 29  ql, zSql, len) )
e4e0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
e4f0: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20       /* Add the 
e500: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
e510: 6e 74 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  nt to the beginn
e520: 69 6e 67 20 6f 66 20 74 68 65 20 63 61 63 68 65  ing of the cache
e530: 20 6c 69 73 74 0a 20 20 20 20 20 20 20 20 2a 2f   list.        */
e540: 0a 20 20 20 20 20 20 20 20 70 50 72 65 53 74 6d  .        pPreStm
e550: 74 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e  t->pNext = pDb->
e560: 73 74 6d 74 4c 69 73 74 3b 0a 20 20 20 20 20 20  stmtList;.      
e570: 20 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65    pPreStmt->pPre
e580: 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  v = 0;.        i
e590: 66 28 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74  f( pDb->stmtList
e5a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 70 44 62   ){.         pDb
e5b0: 2d 3e 73 74 6d 74 4c 69 73 74 2d 3e 70 50 72 65  ->stmtList->pPre
e5c0: 76 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20 20  v = pPreStmt;.  
e5d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e5e0: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20  pDb->stmtList = 
e5f0: 70 50 72 65 53 74 6d 74 3b 0a 20 20 20 20 20 20  pPreStmt;.      
e600: 20 20 69 66 28 20 70 44 62 2d 3e 73 74 6d 74 4c    if( pDb->stmtL
e610: 61 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ast==0 ){.      
e620: 20 20 20 20 61 73 73 65 72 74 28 20 70 44 62 2d      assert( pDb-
e630: 3e 6e 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20  >nStmt==0 );.   
e640: 20 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74         pDb->stmt
e650: 4c 61 73 74 20 3d 20 70 50 72 65 53 74 6d 74 3b  Last = pPreStmt;
e660: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
e670: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
e680: 28 20 70 44 62 2d 3e 6e 53 74 6d 74 3e 30 20 29  ( pDb->nStmt>0 )
e690: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e6a0: 20 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74 2b 2b      pDb->nStmt++
e6b0: 3b 0a 20 20 20 0a 20 20 20 20 20 20 20 20 2f 2a  ;.   .        /*
e6c0: 20 49 66 20 77 65 20 68 61 76 65 20 74 6f 6f 20   If we have too 
e6d0: 6d 61 6e 79 20 73 74 61 74 65 6d 65 6e 74 20 69  many statement i
e6e0: 6e 20 63 61 63 68 65 2c 20 72 65 6d 6f 76 65 20  n cache, remove 
e6f0: 74 68 65 20 73 75 72 70 6c 75 73 20 66 72 6f 6d  the surplus from
e700: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
e710: 65 6e 64 20 6f 66 20 74 68 65 20 63 61 63 68 65  end of the cache
e720: 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 20 20 2a   list..        *
e730: 2f 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  /.        while(
e740: 20 70 44 62 2d 3e 6e 53 74 6d 74 3e 70 44 62 2d   pDb->nStmt>pDb-
e750: 3e 6d 61 78 53 74 6d 74 20 29 7b 0a 20 20 20 20  >maxStmt ){.    
e760: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
e770: 6e 61 6c 69 7a 65 28 70 44 62 2d 3e 73 74 6d 74  nalize(pDb->stmt
e780: 4c 61 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20  Last->pStmt);.  
e790: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d          pDb->stm
e7a0: 74 4c 61 73 74 20 3d 20 70 44 62 2d 3e 73 74 6d  tLast = pDb->stm
e7b0: 74 4c 61 73 74 2d 3e 70 50 72 65 76 3b 0a 20 20  tLast->pPrev;.  
e7c0: 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65          Tcl_Free
e7d0: 28 28 63 68 61 72 2a 29 70 44 62 2d 3e 73 74 6d  ((char*)pDb->stm
e7e0: 74 4c 61 73 74 2d 3e 70 4e 65 78 74 29 3b 0a 20  tLast->pNext);. 
e7f0: 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73 74           pDb->st
e800: 6d 74 4c 61 73 74 2d 3e 70 4e 65 78 74 20 3d 20  mtLast->pNext = 
e810: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 62  0;.          pDb
e820: 2d 3e 6e 53 74 6d 74 2d 2d 3b 0a 20 20 20 20 20  ->nStmt--;.     
e830: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
e840: 20 20 20 20 2f 2a 20 50 72 6f 63 65 65 64 20 74      /* Proceed t
e850: 6f 20 74 68 65 20 6e 65 78 74 20 73 74 61 74 65  o the next state
e860: 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 7a 53  ment */.      zS
e870: 71 6c 20 3d 20 7a 4c 65 66 74 3b 0a 20 20 20 20  ql = zLeft;.    
e880: 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  }.    Tcl_DecrRe
e890: 66 43 6f 75 6e 74 28 6f 62 6a 76 5b 32 5d 29 3b  fCount(objv[2]);
e8a0: 0a 0a 20 20 20 20 69 66 28 20 70 52 65 74 20 29  ..    if( pRet )
e8b0: 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  {.      if( rc==
e8c0: 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  TCL_OK ){.      
e8d0: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
e8e0: 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29  lt(interp, pRet)
e8f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e900: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
e910: 28 70 52 65 74 29 3b 0a 20 20 20 20 7d 65 6c 73  (pRet);.    }els
e920: 65 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b  e if( rc==TCL_OK
e930: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 52 65   ){.      Tcl_Re
e940: 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  setResult(interp
e950: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  );.    }.    bre
e960: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
e970: 2a 2a 20 20 20 20 20 24 64 62 20 66 75 6e 63 74  **     $db funct
e980: 69 6f 6e 20 4e 41 4d 45 20 53 43 52 49 50 54 0a  ion NAME SCRIPT.
e990: 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65 61 74 65    **.  ** Create
e9a0: 20 61 20 6e 65 77 20 53 51 4c 20 66 75 6e 63 74   a new SQL funct
e9b0: 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e  ion called NAME.
e9c0: 20 20 57 68 65 6e 65 76 65 72 20 74 68 61 74 20    Whenever that 
e9d0: 66 75 6e 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a  function is.  **
e9e0: 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65 20   called, invoke 
e9f0: 53 43 52 49 50 54 20 74 6f 20 65 76 61 6c 75 61  SCRIPT to evalua
ea00: 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e  te the function.
ea10: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
ea20: 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20  FUNCTION: {.    
ea30: 53 71 6c 46 75 6e 63 20 2a 70 46 75 6e 63 3b 0a  SqlFunc *pFunc;.
ea40: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63      Tcl_Obj *pSc
ea50: 72 69 70 74 3b 0a 20 20 20 20 63 68 61 72 20 2a  ript;.    char *
ea60: 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 6f  zName;.    if( o
ea70: 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20  bjc!=4 ){.      
ea80: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
ea90: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
eaa0: 2c 20 22 4e 41 4d 45 20 53 43 52 49 50 54 22 29  , "NAME SCRIPT")
eab0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
eac0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
ead0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f      zName = Tcl_
eae0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
eaf0: 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20  (objv[2], 0);.  
eb00: 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62 6a 76    pScript = objv
eb10: 5b 33 5d 3b 0a 20 20 20 20 70 46 75 6e 63 20 3d  [3];.    pFunc =
eb20: 20 66 69 6e 64 53 71 6c 46 75 6e 63 28 70 44 62   findSqlFunc(pDb
eb30: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  , zName);.    if
eb40: 28 20 70 46 75 6e 63 3d 3d 30 20 29 20 72 65 74  ( pFunc==0 ) ret
eb50: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
eb60: 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 70 53     if( pFunc->pS
eb70: 63 72 69 70 74 20 29 7b 0a 20 20 20 20 20 20 54  cript ){.      T
eb80: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
eb90: 70 46 75 6e 63 2d 3e 70 53 63 72 69 70 74 29 3b  pFunc->pScript);
eba0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 75 6e 63  .    }.    pFunc
ebb0: 2d 3e 70 53 63 72 69 70 74 20 3d 20 70 53 63 72  ->pScript = pScr
ebc0: 69 70 74 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63  ipt;.    Tcl_Inc
ebd0: 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70  rRefCount(pScrip
ebe0: 74 29 3b 0a 20 20 20 20 70 46 75 6e 63 2d 3e 75  t);.    pFunc->u
ebf0: 73 65 45 76 61 6c 4f 62 6a 76 20 3d 20 73 61 66  seEvalObjv = saf
ec00: 65 54 6f 55 73 65 45 76 61 6c 4f 62 6a 76 28 69  eToUseEvalObjv(i
ec10: 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 29 3b  nterp, pScript);
ec20: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
ec30: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
ec40: 6e 28 70 44 62 2d 3e 64 62 2c 20 7a 4e 61 6d 65  n(pDb->db, zName
ec50: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
ec60: 38 2c 0a 20 20 20 20 20 20 20 20 70 46 75 6e 63  8,.        pFunc
ec70: 2c 20 74 63 6c 53 71 6c 46 75 6e 63 2c 20 30 2c  , tclSqlFunc, 0,
ec80: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
ec90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
eca0: 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52      rc = TCL_ERR
ecb0: 4f 52 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65  OR;.      Tcl_Se
ecc0: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
ecd0: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
ece0: 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c  errmsg(pDb->db),
ecf0: 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a   TCL_VOLATILE);.
ed00: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
ed10: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
ed20: 20 20 20 20 24 64 62 20 69 6e 63 72 62 6c 6f 62      $db incrblob
ed30: 20 3f 2d 72 65 61 64 6f 6e 6c 79 3f 20 3f 44 42   ?-readonly? ?DB
ed40: 3f 20 54 41 42 4c 45 20 43 4f 4c 55 4d 4e 20 52  ? TABLE COLUMN R
ed50: 4f 57 49 44 0a 20 20 2a 2f 0a 20 20 63 61 73 65  OWID.  */.  case
ed60: 20 44 42 5f 49 4e 43 52 42 4c 4f 42 3a 20 7b 0a   DB_INCRBLOB: {.
ed70: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
ed80: 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20  IT_INCRBLOB.    
ed90: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
eda0: 28 69 6e 74 65 72 70 2c 20 22 69 6e 63 72 62 6c  (interp, "incrbl
edb0: 6f 62 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  ob not available
edc0: 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64 22 2c   in this build",
edd0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
ede0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65  TCL_ERROR;.#else
edf0: 0a 20 20 20 20 69 6e 74 20 69 73 52 65 61 64 6f  .    int isReado
ee00: 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e  nly = 0;.    con
ee10: 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 22  st char *zDb = "
ee20: 6d 61 69 6e 22 3b 0a 20 20 20 20 63 6f 6e 73 74  main";.    const
ee30: 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 3b 0a 20   char *zTable;. 
ee40: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
ee50: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71 6c 69  Column;.    sqli
ee60: 74 65 5f 69 6e 74 36 34 20 69 52 6f 77 3b 0a 0a  te_int64 iRow;..
ee70: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72      /* Check for
ee80: 20 74 68 65 20 2d 72 65 61 64 6f 6e 6c 79 20 6f   the -readonly o
ee90: 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 28  ption */.    if(
eea0: 20 6f 62 6a 63 3e 33 20 26 26 20 73 74 72 63 6d   objc>3 && strcm
eeb0: 70 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  p(Tcl_GetString(
eec0: 6f 62 6a 76 5b 32 5d 29 2c 20 22 2d 72 65 61 64  objv[2]), "-read
eed0: 6f 6e 6c 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20  only")==0 ){.   
eee0: 20 20 20 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20     isReadonly = 
eef0: 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  1;.    }..    if
ef00: 28 20 6f 62 6a 63 21 3d 28 35 2b 69 73 52 65 61  ( objc!=(5+isRea
ef10: 64 6f 6e 6c 79 29 20 26 26 20 6f 62 6a 63 21 3d  donly) && objc!=
ef20: 28 36 2b 69 73 52 65 61 64 6f 6e 6c 79 29 20 29  (6+isReadonly) )
ef30: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
ef40: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
ef50: 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 2d 72 65 61   2, objv, "?-rea
ef60: 64 6f 6e 6c 79 3f 20 3f 44 42 3f 20 54 41 42 4c  donly? ?DB? TABL
ef70: 45 20 43 4f 4c 55 4d 4e 20 52 4f 57 49 44 22 29  E COLUMN ROWID")
ef80: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
ef90: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
efa0: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 28  .    if( objc==(
efb0: 36 2b 69 73 52 65 61 64 6f 6e 6c 79 29 20 29 7b  6+isReadonly) ){
efc0: 0a 20 20 20 20 20 20 7a 44 62 20 3d 20 54 63 6c  .      zDb = Tcl
efd0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
efe0: 32 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  2]);.    }.    z
eff0: 54 61 62 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53  Table = Tcl_GetS
f000: 74 72 69 6e 67 28 6f 62 6a 76 5b 6f 62 6a 63 2d  tring(objv[objc-
f010: 33 5d 29 3b 0a 20 20 20 20 7a 43 6f 6c 75 6d 6e  3]);.    zColumn
f020: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
f030: 28 6f 62 6a 76 5b 6f 62 6a 63 2d 32 5d 29 3b 0a  (objv[objc-2]);.
f040: 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 47 65 74      rc = Tcl_Get
f050: 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  WideIntFromObj(i
f060: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 6f 62 6a 63  nterp, objv[objc
f070: 2d 31 5d 2c 20 26 69 52 6f 77 29 3b 0a 0a 20 20  -1], &iRow);..  
f080: 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b    if( rc==TCL_OK
f090: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 63   ){.      rc = c
f0a0: 72 65 61 74 65 49 6e 63 72 62 6c 6f 62 43 68 61  reateIncrblobCha
f0b0: 6e 6e 65 6c 28 0a 20 20 20 20 20 20 20 20 20 20  nnel(.          
f0c0: 69 6e 74 65 72 70 2c 20 70 44 62 2c 20 7a 44 62  interp, pDb, zDb
f0d0: 2c 20 7a 54 61 62 6c 65 2c 20 7a 43 6f 6c 75 6d  , zTable, zColum
f0e0: 6e 2c 20 69 52 6f 77 2c 20 69 73 52 65 61 64 6f  n, iRow, isReado
f0f0: 6e 6c 79 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  nly.      );.   
f100: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72   }.#endif.    br
f110: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
f120: 20 2a 2a 20 20 20 20 20 24 64 62 20 69 6e 74 65   **     $db inte
f130: 72 72 75 70 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rrupt.  **.  ** 
f140: 49 6e 74 65 72 72 75 70 74 20 74 68 65 20 65 78  Interrupt the ex
f150: 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 65 20 69  ecution of the i
f160: 6e 6e 65 72 2d 6d 6f 73 74 20 53 51 4c 20 69 6e  nner-most SQL in
f170: 74 65 72 70 72 65 74 65 72 2e 20 20 54 68 69 73  terpreter.  This
f180: 0a 20 20 2a 2a 20 63 61 75 73 65 73 20 74 68 65  .  ** causes the
f190: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74   SQL statement t
f1a0: 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  o return an erro
f1b0: 72 20 6f 66 20 53 51 4c 49 54 45 5f 49 4e 54 45  r of SQLITE_INTE
f1c0: 52 52 55 50 54 2e 0a 20 20 2a 2f 0a 20 20 63 61  RRUPT..  */.  ca
f1d0: 73 65 20 44 42 5f 49 4e 54 45 52 52 55 50 54 3a  se DB_INTERRUPT:
f1e0: 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69   {.    sqlite3_i
f1f0: 6e 74 65 72 72 75 70 74 28 70 44 62 2d 3e 64 62  nterrupt(pDb->db
f200: 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
f210: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
f220: 20 24 64 62 20 6e 75 6c 6c 76 61 6c 75 65 20 3f   $db nullvalue ?
f230: 53 54 52 49 4e 47 3f 0a 20 20 2a 2a 0a 20 20 2a  STRING?.  **.  *
f240: 2a 20 43 68 61 6e 67 65 20 74 65 78 74 20 75 73  * Change text us
f250: 65 64 20 77 68 65 6e 20 61 20 4e 55 4c 4c 20 63  ed when a NULL c
f260: 6f 6d 65 73 20 62 61 63 6b 20 66 72 6f 6d 20 74  omes back from t
f270: 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20  he database. If 
f280: 3f 53 54 52 49 4e 47 3f 0a 20 20 2a 2a 20 69 73  ?STRING?.  ** is
f290: 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 74 68   not present, th
f2a0: 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  en the current s
f2b0: 74 72 69 6e 67 20 75 73 65 64 20 66 6f 72 20 4e  tring used for N
f2c0: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ULL is returned.
f2d0: 0a 20 20 2a 2a 20 49 66 20 53 54 52 49 4e 47 20  .  ** If STRING 
f2e0: 69 73 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e  is present, then
f2f0: 20 53 54 52 49 4e 47 20 69 73 20 72 65 74 75 72   STRING is retur
f300: 6e 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2f 0a 20  ned..  **.  */. 
f310: 20 63 61 73 65 20 44 42 5f 4e 55 4c 4c 56 41 4c   case DB_NULLVAL
f320: 55 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62  UE: {.    if( ob
f330: 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33  jc!=2 && objc!=3
f340: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
f350: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
f360: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 55 4c  p, 2, objv, "NUL
f370: 4c 56 41 4c 55 45 22 29 3b 0a 20 20 20 20 20 20  LVALUE");.      
f380: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
f390: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
f3a0: 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20  objc==3 ){.     
f3b0: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20   int len;.      
f3c0: 63 68 61 72 20 2a 7a 4e 75 6c 6c 20 3d 20 54 63  char *zNull = Tc
f3d0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
f3e0: 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e  bj(objv[2], &len
f3f0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  );.      if( pDb
f400: 2d 3e 7a 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  ->zNull ){.     
f410: 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d     Tcl_Free(pDb-
f420: 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d  >zNull);.      }
f430: 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 75 6c 6c  .      if( zNull
f440: 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20   && len>0 ){.   
f450: 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20       pDb->zNull 
f460: 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e  = Tcl_Alloc( len
f470: 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20   + 1 );.        
f480: 73 74 72 6e 63 70 79 28 70 44 62 2d 3e 7a 4e 75  strncpy(pDb->zNu
f490: 6c 6c 2c 20 7a 4e 75 6c 6c 2c 20 6c 65 6e 29 3b  ll, zNull, len);
f4a0: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e  .        pDb->zN
f4b0: 75 6c 6c 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b  ull[len] = '\0';
f4c0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
f4d0: 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c        pDb->zNull
f4e0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
f4f0: 20 20 7d 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f    }.    Tcl_SetO
f500: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
f510: 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 70 44 62   dbTextToObj(pDb
f520: 2d 3e 7a 4e 75 6c 6c 29 29 3b 0a 20 20 20 20 62  ->zNull));.    b
f530: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
f540: 20 20 2a 2a 20 20 20 20 20 24 64 62 20 6c 61 73    **     $db las
f550: 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 20 0a  t_insert_rowid .
f560: 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e    **.  ** Return
f570: 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63   an integer whic
f580: 68 20 69 73 20 74 68 65 20 52 4f 57 49 44 20 66  h is the ROWID f
f590: 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  or the most rece
f5a0: 6e 74 20 69 6e 73 65 72 74 2e 0a 20 20 2a 2f 0a  nt insert..  */.
f5b0: 20 20 63 61 73 65 20 44 42 5f 4c 41 53 54 5f 49    case DB_LAST_I
f5c0: 4e 53 45 52 54 5f 52 4f 57 49 44 3a 20 7b 0a 20  NSERT_ROWID: {. 
f5d0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73     Tcl_Obj *pRes
f5e0: 75 6c 74 3b 0a 20 20 20 20 54 63 6c 5f 57 69 64  ult;.    Tcl_Wid
f5f0: 65 49 6e 74 20 72 6f 77 69 64 3b 0a 20 20 20 20  eInt rowid;.    
f600: 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
f610: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
f620: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
f630: 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20   objv, "");.    
f640: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
f650: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 6f  OR;.    }.    ro
f660: 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 6c 61  wid = sqlite3_la
f670: 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28  st_insert_rowid(
f680: 70 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20 70 52  pDb->db);.    pR
f690: 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f  esult = Tcl_GetO
f6a0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  bjResult(interp)
f6b0: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 57 69 64  ;.    Tcl_SetWid
f6c0: 65 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c  eIntObj(pResult,
f6d0: 20 72 6f 77 69 64 29 3b 0a 20 20 20 20 62 72 65   rowid);.    bre
f6e0: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
f6f0: 2a 2a 20 54 68 65 20 44 42 5f 4f 4e 45 43 4f 4c  ** The DB_ONECOL
f700: 55 4d 4e 20 6d 65 74 68 6f 64 20 69 73 20 69 6d  UMN method is im
f710: 70 6c 65 6d 65 6e 74 65 64 20 74 6f 67 65 74 68  plemented togeth
f720: 65 72 20 77 69 74 68 20 44 42 5f 45 56 41 4c 2e  er with DB_EVAL.
f730: 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 20 20 20 24  .  */..  /*    $
f740: 64 62 20 70 72 6f 67 72 65 73 73 20 3f 4e 20 43  db progress ?N C
f750: 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 20 0a 20  ALLBACK?.  ** . 
f760: 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67   ** Invoke the g
f770: 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 65 76  iven callback ev
f780: 65 72 79 20 4e 20 76 69 72 74 75 61 6c 20 6d 61  ery N virtual ma
f790: 63 68 69 6e 65 20 6f 70 63 6f 64 65 73 20 77 68  chine opcodes wh
f7a0: 69 6c 65 20 65 78 65 63 75 74 69 6e 67 0a 20 20  ile executing.  
f7b0: 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f  ** queries..  */
f7c0: 0a 20 20 63 61 73 65 20 44 42 5f 50 52 4f 47 52  .  case DB_PROGR
f7d0: 45 53 53 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f  ESS: {.    if( o
f7e0: 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  bjc==2 ){.      
f7f0: 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65  if( pDb->zProgre
f800: 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  ss ){.        Tc
f810: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
f820: 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f  nterp, pDb->zPro
f830: 67 72 65 73 73 2c 20 30 29 3b 0a 20 20 20 20 20  gress, 0);.     
f840: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
f850: 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20   objc==4 ){.    
f860: 20 20 63 68 61 72 20 2a 7a 50 72 6f 67 72 65 73    char *zProgres
f870: 73 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  s;.      int len
f880: 3b 0a 20 20 20 20 20 20 69 6e 74 20 4e 3b 0a 20  ;.      int N;. 
f890: 20 20 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21       if( TCL_OK!
f8a0: 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f  =Tcl_GetIntFromO
f8b0: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
f8c0: 32 5d 2c 20 26 4e 29 20 29 7b 0a 20 20 20 20 20  2], &N) ){.     
f8d0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
f8e0: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 3b 0a 20 20  ROR;.      };.  
f8f0: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72      if( pDb->zPr
f900: 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20  ogress ){.      
f910: 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e    Tcl_Free(pDb->
f920: 7a 50 72 6f 67 72 65 73 73 29 3b 0a 20 20 20 20  zProgress);.    
f930: 20 20 7d 0a 20 20 20 20 20 20 7a 50 72 6f 67 72    }.      zProgr
f940: 65 73 73 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ess = Tcl_GetStr
f950: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
f960: 33 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20  3], &len);.     
f970: 20 69 66 28 20 7a 50 72 6f 67 72 65 73 73 20 26   if( zProgress &
f980: 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20  & len>0 ){.     
f990: 20 20 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73     pDb->zProgres
f9a0: 73 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c  s = Tcl_Alloc( l
f9b0: 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20  en + 1 );.      
f9c0: 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 50    memcpy(pDb->zP
f9d0: 72 6f 67 72 65 73 73 2c 20 7a 50 72 6f 67 72 65  rogress, zProgre
f9e0: 73 73 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20  ss, len+1);.    
f9f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
fa00: 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20   pDb->zProgress 
fa10: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  = 0;.      }.#if
fa20: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
fa30: 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41  _PROGRESS_CALLBA
fa40: 43 4b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  CK.      if( pDb
fa50: 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a 20  ->zProgress ){. 
fa60: 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65         pDb->inte
fa70: 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp = interp;.   
fa80: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f       sqlite3_pro
fa90: 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 70 44  gress_handler(pD
faa0: 62 2d 3e 64 62 2c 20 4e 2c 20 44 62 50 72 6f 67  b->db, N, DbProg
fab0: 72 65 73 73 48 61 6e 64 6c 65 72 2c 20 70 44 62  ressHandler, pDb
fac0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
fad0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
fae0: 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72  progress_handler
faf0: 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 2c 20  (pDb->db, 0, 0, 
fb00: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  0);.      }.#end
fb10: 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  if.    }else{.  
fb20: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
fb30: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
fb40: 6f 62 6a 76 2c 20 22 4e 20 43 41 4c 4c 42 41 43  objv, "N CALLBAC
fb50: 4b 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  K");.      retur
fb60: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
fb70: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
fb80: 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 70  }..  /*    $db p
fb90: 72 6f 66 69 6c 65 20 3f 43 41 4c 4c 42 41 43 4b  rofile ?CALLBACK
fba0: 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65  ?.  **.  ** Make
fbb0: 20 61 72 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f   arrangements to
fbc0: 20 69 6e 76 6f 6b 65 20 74 68 65 20 43 41 4c 4c   invoke the CALL
fbd0: 42 41 43 4b 20 72 6f 75 74 69 6e 65 20 61 66 74  BACK routine aft
fbe0: 65 72 20 65 61 63 68 20 53 51 4c 20 73 74 61 74  er each SQL stat
fbf0: 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 61 74 20  ement.  ** that 
fc00: 68 61 73 20 72 75 6e 2e 20 20 54 68 65 20 74 65  has run.  The te
fc10: 78 74 20 6f 66 20 74 68 65 20 53 51 4c 20 61 6e  xt of the SQL an
fc20: 64 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  d the amount of 
fc30: 65 6c 61 70 73 65 20 74 69 6d 65 20 61 72 65 0a  elapse time are.
fc40: 20 20 2a 2a 20 61 70 70 65 6e 64 65 64 20 74 6f    ** appended to
fc50: 20 43 41 4c 4c 42 41 43 4b 20 62 65 66 6f 72 65   CALLBACK before
fc60: 20 74 68 65 20 73 63 72 69 70 74 20 69 73 20 72   the script is r
fc70: 75 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  un..  */.  case 
fc80: 44 42 5f 50 52 4f 46 49 4c 45 3a 20 7b 0a 20 20  DB_PROFILE: {.  
fc90: 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a    if( objc>3 ){.
fca0: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
fcb0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
fcc0: 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41  , objv, "?CALLBA
fcd0: 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74  CK?");.      ret
fce0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
fcf0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a     }else if( obj
fd00: 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66  c==2 ){.      if
fd10: 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20  ( pDb->zProfile 
fd20: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41  ){.        Tcl_A
fd30: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
fd40: 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c  rp, pDb->zProfil
fd50: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  e, 0);.      }. 
fd60: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fd70: 63 68 61 72 20 2a 7a 50 72 6f 66 69 6c 65 3b 0a  char *zProfile;.
fd80: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20        int len;. 
fd90: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50       if( pDb->zP
fda0: 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  rofile ){.      
fdb0: 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e    Tcl_Free(pDb->
fdc0: 7a 50 72 6f 66 69 6c 65 29 3b 0a 20 20 20 20 20  zProfile);.     
fdd0: 20 7d 0a 20 20 20 20 20 20 7a 50 72 6f 66 69 6c   }.      zProfil
fde0: 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
fdf0: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
fe00: 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69  , &len);.      i
fe10: 66 28 20 7a 50 72 6f 66 69 6c 65 20 26 26 20 6c  f( zProfile && l
fe20: 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  en>0 ){.        
fe30: 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 3d 20  pDb->zProfile = 
fe40: 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b  Tcl_Alloc( len +
fe50: 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65   1 );.        me
fe60: 6d 63 70 79 28 70 44 62 2d 3e 7a 50 72 6f 66 69  mcpy(pDb->zProfi
fe70: 6c 65 2c 20 7a 50 72 6f 66 69 6c 65 2c 20 6c 65  le, zProfile, le
fe80: 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  n+1);.      }els
fe90: 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  e{.        pDb->
fea0: 7a 50 72 6f 66 69 6c 65 20 3d 20 30 3b 0a 20 20  zProfile = 0;.  
feb0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
fec0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a  LITE_OMIT_TRACE.
fed0: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
fee0: 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 20  Profile ){.     
fef0: 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d     pDb->interp =
ff00: 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20   interp;.       
ff10: 20 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65   sqlite3_profile
ff20: 28 70 44 62 2d 3e 64 62 2c 20 44 62 50 72 6f 66  (pDb->db, DbProf
ff30: 69 6c 65 48 61 6e 64 6c 65 72 2c 20 70 44 62 29  ileHandler, pDb)
ff40: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
ff50: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70         sqlite3_p
ff60: 72 6f 66 69 6c 65 28 70 44 62 2d 3e 64 62 2c 20  rofile(pDb->db, 
ff70: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23  0, 0);.      }.#
ff80: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
ff90: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
ffa0: 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 72 65  .  **     $db re
ffb0: 6b 65 79 20 4b 45 59 0a 20 20 2a 2a 0a 20 20 2a  key KEY.  **.  *
ffc0: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 65 6e 63  * Change the enc
ffd0: 72 79 70 74 69 6f 6e 20 6b 65 79 20 6f 6e 20 74  ryption key on t
ffe0: 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65  he currently ope
fff0: 6e 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  n database..  */
10000 0a 20 20 63 61 73 65 20 44 42 5f 52 45 4b 45 59  .  case DB_REKEY
10010 3a 20 7b 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79  : {.    int nKey
10020 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79  ;.    void *pKey
10030 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
10040 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
10050 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
10060 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4b 45  rp, 2, objv, "KE
10070 59 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Y");.      retur
10080 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
10090 20 7d 0a 20 20 20 20 70 4b 65 79 20 3d 20 54 63   }.    pKey = Tc
100a0 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72  l_GetByteArrayFr
100b0 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26  omObj(objv[2], &
100c0 6e 4b 65 79 29 3b 0a 23 69 66 64 65 66 20 53 51  nKey);.#ifdef SQ
100d0 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
100e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
100f0 72 65 6b 65 79 28 70 44 62 2d 3e 64 62 2c 20 70  rekey(pDb->db, p
10100 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20  Key, nKey);.    
10110 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
10120 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
10130 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33  (interp, sqlite3
10140 45 72 72 53 74 72 28 72 63 29 2c 20 30 29 3b 0a  ErrStr(rc), 0);.
10150 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45        rc = TCL_E
10160 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  RROR;.    }.#end
10170 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  if.    break;.  
10180 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
10190 20 24 64 62 20 74 69 6d 65 6f 75 74 20 4d 49 4c   $db timeout MIL
101a0 4c 45 53 45 43 4f 4e 44 53 0a 20 20 2a 2a 0a 20  LESECONDS.  **. 
101b0 20 2a 2a 20 44 65 6c 61 79 20 66 6f 72 20 74 68   ** Delay for th
101c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c  e number of mill
101d0 69 73 65 63 6f 6e 64 73 20 73 70 65 63 69 66 69  iseconds specifi
101e0 65 64 20 77 68 65 6e 20 61 20 66 69 6c 65 20 69  ed when a file i
101f0 73 20 6c 6f 63 6b 65 64 2e 0a 20 20 2a 2f 0a 20  s locked..  */. 
10200 20 63 61 73 65 20 44 42 5f 54 49 4d 45 4f 55 54   case DB_TIMEOUT
10210 3a 20 7b 0a 20 20 20 20 69 6e 74 20 6d 73 3b 0a  : {.    int ms;.
10220 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20      if( objc!=3 
10230 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
10240 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
10250 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4d 49 4c 4c  , 2, objv, "MILL
10260 49 53 45 43 4f 4e 44 53 22 29 3b 0a 20 20 20 20  ISECONDS");.    
10270 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
10280 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
10290 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
102a0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
102b0 5b 32 5d 2c 20 26 6d 73 29 20 29 20 72 65 74 75  [2], &ms) ) retu
102c0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
102d0 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74    sqlite3_busy_t
102e0 69 6d 65 6f 75 74 28 70 44 62 2d 3e 64 62 2c 20  imeout(pDb->db, 
102f0 6d 73 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  ms);.    break;.
10300 20 20 7d 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a    }.  .  /*.  **
10310 20 20 20 20 20 24 64 62 20 74 6f 74 61 6c 5f 63       $db total_c
10320 68 61 6e 67 65 73 0a 20 20 2a 2a 0a 20 20 2a 2a  hanges.  **.  **
10330 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
10340 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  er of rows that 
10350 77 65 72 65 20 6d 6f 64 69 66 69 65 64 2c 20 69  were modified, i
10360 6e 73 65 72 74 65 64 2c 20 6f 72 20 64 65 6c 65  nserted, or dele
10370 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20  ted .  ** since 
10380 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
10390 64 6c 65 20 77 61 73 20 63 72 65 61 74 65 64 2e  dle was created.
103a0 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
103b0 54 4f 54 41 4c 5f 43 48 41 4e 47 45 53 3a 20 7b  TOTAL_CHANGES: {
103c0 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52  .    Tcl_Obj *pR
103d0 65 73 75 6c 74 3b 0a 20 20 20 20 69 66 28 20 6f  esult;.    if( o
103e0 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 20 20  bjc!=2 ){.      
103f0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
10400 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
10410 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 72 65 74  , "");.      ret
10420 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
10430 20 20 20 7d 0a 20 20 20 20 70 52 65 73 75 6c 74     }.    pResult
10440 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73   = Tcl_GetObjRes
10450 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  ult(interp);.   
10460 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70   Tcl_SetIntObj(p
10470 52 65 73 75 6c 74 2c 20 73 71 6c 69 74 65 33 5f  Result, sqlite3_
10480 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 70 44  total_changes(pD
10490 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20 62 72 65  b->db));.    bre
104a0 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
104b0 20 24 64 62 20 74 72 61 63 65 20 3f 43 41 4c 4c   $db trace ?CALL
104c0 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20  BACK?.  **.  ** 
104d0 4d 61 6b 65 20 61 72 72 61 6e 67 65 6d 65 6e 74  Make arrangement
104e0 73 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20  s to invoke the 
104f0 43 41 4c 4c 42 41 43 4b 20 72 6f 75 74 69 6e 65  CALLBACK routine
10500 20 66 6f 72 20 65 61 63 68 20 53 51 4c 20 73 74   for each SQL st
10510 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 61  atement.  ** tha
10520 74 20 69 73 20 65 78 65 63 75 74 65 64 2e 20 20  t is executed.  
10530 54 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  The text of the 
10540 53 51 4c 20 69 73 20 61 70 70 65 6e 64 65 64 20  SQL is appended 
10550 74 6f 20 43 41 4c 4c 42 41 43 4b 20 62 65 66 6f  to CALLBACK befo
10560 72 65 0a 20 20 2a 2a 20 69 74 20 69 73 20 65 78  re.  ** it is ex
10570 65 63 75 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63  ecuted..  */.  c
10580 61 73 65 20 44 42 5f 54 52 41 43 45 3a 20 7b 0a  ase DB_TRACE: {.
10590 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29      if( objc>3 )
105a0 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
105b0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
105c0 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c   2, objv, "?CALL
105d0 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72  BACK?");.      r
105e0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
105f0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
10600 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  bjc==2 ){.      
10610 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20  if( pDb->zTrace 
10620 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41  ){.        Tcl_A
10630 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
10640 72 70 2c 20 70 44 62 2d 3e 7a 54 72 61 63 65 2c  rp, pDb->zTrace,
10650 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
10660 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
10670 61 72 20 2a 7a 54 72 61 63 65 3b 0a 20 20 20 20  ar *zTrace;.    
10680 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20    int len;.     
10690 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65   if( pDb->zTrace
106a0 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
106b0 46 72 65 65 28 70 44 62 2d 3e 7a 54 72 61 63 65  Free(pDb->zTrace
106c0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
106d0 20 7a 54 72 61 63 65 20 3d 20 54 63 6c 5f 47 65   zTrace = Tcl_Ge
106e0 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
106f0 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20  bjv[2], &len);. 
10700 20 20 20 20 20 69 66 28 20 7a 54 72 61 63 65 20       if( zTrace 
10710 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20  && len>0 ){.    
10720 20 20 20 20 70 44 62 2d 3e 7a 54 72 61 63 65 20      pDb->zTrace 
10730 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e  = Tcl_Alloc( len
10740 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20   + 1 );.        
10750 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 54 72 61  memcpy(pDb->zTra
10760 63 65 2c 20 7a 54 72 61 63 65 2c 20 6c 65 6e 2b  ce, zTrace, len+
10770 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
10780 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 54  .        pDb->zT
10790 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  race = 0;.      
107a0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
107b0 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 20 20  _OMIT_TRACE.    
107c0 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63    if( pDb->zTrac
107d0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  e ){.        pDb
107e0 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  ->interp = inter
107f0 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  p;.        sqlit
10800 65 33 5f 74 72 61 63 65 28 70 44 62 2d 3e 64 62  e3_trace(pDb->db
10810 2c 20 44 62 54 72 61 63 65 48 61 6e 64 6c 65 72  , DbTraceHandler
10820 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65  , pDb);.      }e
10830 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
10840 69 74 65 33 5f 74 72 61 63 65 28 70 44 62 2d 3e  ite3_trace(pDb->
10850 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  db, 0, 0);.     
10860 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
10870 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
10880 20 20 2f 2a 20 20 20 20 24 64 62 20 74 72 61 6e    /*    $db tran
10890 73 61 63 74 69 6f 6e 20 5b 2d 64 65 66 65 72 72  saction [-deferr
108a0 65 64 7c 2d 69 6d 6d 65 64 69 61 74 65 7c 2d 65  ed|-immediate|-e
108b0 78 63 6c 75 73 69 76 65 5d 20 53 43 52 49 50 54  xclusive] SCRIPT
108c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 74 61 72 74  .  **.  ** Start
108d0 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
108e0 6f 6e 20 28 69 66 20 77 65 20 61 72 65 20 6e 6f  on (if we are no
108f0 74 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  t already in the
10900 20 6d 69 64 73 74 20 6f 66 20 61 0a 20 20 2a 2a   midst of a.  **
10910 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 20 61 6e   transaction) an
10920 64 20 65 78 65 63 75 74 65 20 74 68 65 20 54 43  d execute the TC
10930 4c 20 73 63 72 69 70 74 20 53 43 52 49 50 54 2e  L script SCRIPT.
10940 20 20 41 66 74 65 72 20 53 43 52 49 50 54 0a 20    After SCRIPT. 
10950 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 73 2c 20 65   ** completes, e
10960 69 74 68 65 72 20 63 6f 6d 6d 69 74 20 74 68 65  ither commit the
10970 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20   transaction or 
10980 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 69 66 20  roll it back if 
10990 53 43 52 49 50 54 0a 20 20 2a 2a 20 74 68 72 6f  SCRIPT.  ** thro
109a0 77 73 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 2e  ws an exception.
109b0 20 20 4f 72 20 69 66 20 6e 6f 20 6e 65 77 20 74    Or if no new t
109c0 72 61 6e 73 61 74 69 6f 6e 20 77 61 73 20 73 74  ransation was st
109d0 61 72 74 65 64 2c 20 64 6f 20 6e 6f 74 68 69 6e  arted, do nothin
109e0 67 2e 0a 20 20 2a 2a 20 70 61 73 73 20 74 68 65  g..  ** pass the
109f0 20 65 78 63 65 70 74 69 6f 6e 20 6f 6e 20 75 70   exception on up
10a00 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a   the stack..  **
10a10 0a 20 20 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61  .  ** This comma
10a20 6e 64 20 77 61 73 20 69 6e 73 70 69 72 65 64 20  nd was inspired 
10a30 62 79 20 44 61 76 65 20 54 68 6f 6d 61 73 27 73  by Dave Thomas's
10a40 20 74 61 6c 6b 20 6f 6e 20 52 75 62 79 20 61 74   talk on Ruby at
10a50 20 74 68 65 0a 20 20 2a 2a 20 32 30 30 35 20 4f   the.  ** 2005 O
10a60 27 52 65 69 6c 6c 79 20 4f 70 65 6e 20 53 6f 75  'Reilly Open Sou
10a70 72 63 65 20 43 6f 6e 76 65 6e 74 69 6f 6e 20 28  rce Convention (
10a80 4f 53 43 4f 4e 29 2e 0a 20 20 2a 2f 0a 20 20 63  OSCON)..  */.  c
10a90 61 73 65 20 44 42 5f 54 52 41 4e 53 41 43 54 49  ase DB_TRANSACTI
10aa0 4f 4e 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 6e  ON: {.    int in
10ab0 54 72 61 6e 73 3b 0a 20 20 20 20 54 63 6c 5f 4f  Trans;.    Tcl_O
10ac0 62 6a 20 2a 70 53 63 72 69 70 74 3b 0a 20 20 20  bj *pScript;.   
10ad0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 65   const char *zBe
10ae0 67 69 6e 20 3d 20 22 42 45 47 49 4e 22 3b 0a 20  gin = "BEGIN";. 
10af0 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26     if( objc!=3 &
10b00 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  & objc!=4 ){.   
10b10 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
10b20 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
10b30 62 6a 76 2c 20 22 5b 54 59 50 45 5d 20 53 43 52  bjv, "[TYPE] SCR
10b40 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74  IPT");.      ret
10b50 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
10b60 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a     }.    if( obj
10b70 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 70 53  c==3 ){.      pS
10b80 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 32 5d 3b  cript = objv[2];
10b90 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
10ba0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
10bb0 20 63 68 61 72 20 2a 54 54 59 50 45 5f 73 74 72   char *TTYPE_str
10bc0 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  s[] = {.        
10bd0 22 64 65 66 65 72 72 65 64 22 2c 20 20 20 22 65  "deferred",   "e
10be0 78 63 6c 75 73 69 76 65 22 2c 20 20 22 69 6d 6d  xclusive",  "imm
10bf0 65 64 69 61 74 65 22 2c 20 30 0a 20 20 20 20 20  ediate", 0.     
10c00 20 7d 3b 0a 20 20 20 20 20 20 65 6e 75 6d 20 54   };.      enum T
10c10 54 59 50 45 5f 65 6e 75 6d 20 7b 0a 20 20 20 20  TYPE_enum {.    
10c20 20 20 20 20 54 54 59 50 45 5f 44 45 46 45 52 52      TTYPE_DEFERR
10c30 45 44 2c 20 54 54 59 50 45 5f 45 58 43 4c 55 53  ED, TTYPE_EXCLUS
10c40 49 56 45 2c 20 54 54 59 50 45 5f 49 4d 4d 45 44  IVE, TTYPE_IMMED
10c50 49 41 54 45 0a 20 20 20 20 20 20 7d 3b 0a 20 20  IATE.      };.  
10c60 20 20 20 20 69 6e 74 20 74 74 79 70 65 3b 0a 20      int ttype;. 
10c70 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74       if( Tcl_Get
10c80 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74  IndexFromObj(int
10c90 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 54 54  erp, objv[2], TT
10ca0 59 50 45 5f 73 74 72 73 2c 20 22 74 72 61 6e 73  YPE_strs, "trans
10cb0 61 63 74 69 6f 6e 20 74 79 70 65 22 2c 0a 20 20  action type",.  
10cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cd0 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 26              0, &
10ce0 74 74 79 70 65 29 20 29 7b 0a 20 20 20 20 20 20  ttype) ){.      
10cf0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
10d00 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
10d10 20 20 73 77 69 74 63 68 28 20 28 65 6e 75 6d 20    switch( (enum 
10d20 54 54 59 50 45 5f 65 6e 75 6d 29 74 74 79 70 65  TTYPE_enum)ttype
10d30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65   ){.        case
10d40 20 54 54 59 50 45 5f 44 45 46 45 52 52 45 44 3a   TTYPE_DEFERRED:
10d50 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 3b      /* no-op */;
10d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d70 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
10d80 63 61 73 65 20 54 54 59 50 45 5f 45 58 43 4c 55  case TTYPE_EXCLU
10d90 53 49 56 45 3a 20 20 20 7a 42 65 67 69 6e 20 3d  SIVE:   zBegin =
10da0 20 22 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56   "BEGIN EXCLUSIV
10db0 45 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  E";  break;.    
10dc0 20 20 20 20 63 61 73 65 20 54 54 59 50 45 5f 49      case TTYPE_I
10dd0 4d 4d 45 44 49 41 54 45 3a 20 20 20 7a 42 65 67  MMEDIATE:   zBeg
10de0 69 6e 20 3d 20 22 42 45 47 49 4e 20 49 4d 4d 45  in = "BEGIN IMME
10df0 44 49 41 54 45 22 3b 20 20 62 72 65 61 6b 3b 0a  DIATE";  break;.
10e00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53        }.      pS
10e10 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 33 5d 3b  cript = objv[3];
10e20 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e 54 72 61  .    }.    inTra
10e30 6e 73 20 3d 20 21 73 71 6c 69 74 65 33 5f 67 65  ns = !sqlite3_ge
10e40 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 70 44 62  t_autocommit(pDb
10e50 2d 3e 64 62 29 3b 0a 20 20 20 20 69 66 28 20 21  ->db);.    if( !
10e60 69 6e 54 72 61 6e 73 20 29 7b 0a 20 20 20 20 20  inTrans ){.     
10e70 20 70 44 62 2d 3e 64 69 73 61 62 6c 65 41 75 74   pDb->disableAut
10e80 68 2b 2b 3b 0a 20 20 20 20 20 20 28 76 6f 69 64  h++;.      (void
10e90 29 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44  )sqlite3_exec(pD
10ea0 62 2d 3e 64 62 2c 20 7a 42 65 67 69 6e 2c 20 30  b->db, zBegin, 0
10eb0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  , 0, 0);.      p
10ec0 44 62 2d 3e 64 69 73 61 62 6c 65 41 75 74 68 2d  Db->disableAuth-
10ed0 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  -;.    }.    rc 
10ee0 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28  = Tcl_EvalObjEx(
10ef0 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c  interp, pScript,
10f00 20 30 29 3b 0a 20 20 20 20 69 66 28 20 21 69 6e   0);.    if( !in
10f10 54 72 61 6e 73 20 29 7b 0a 20 20 20 20 20 20 63  Trans ){.      c
10f20 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e 64 3b  onst char *zEnd;
10f30 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 54  .      if( rc==T
10f40 43 4c 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20  CL_ERROR ){.    
10f50 20 20 20 20 7a 45 6e 64 20 3d 20 22 52 4f 4c 4c      zEnd = "ROLL
10f60 42 41 43 4b 22 3b 0a 20 20 20 20 20 20 7d 20 65  BACK";.      } e
10f70 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 7a 45  lse {.        zE
10f80 6e 64 20 3d 20 22 43 4f 4d 4d 49 54 22 3b 0a 20  nd = "COMMIT";. 
10f90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 44 62       }.      pDb
10fa0 2d 3e 64 69 73 61 62 6c 65 41 75 74 68 2b 2b 3b  ->disableAuth++;
10fb0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
10fc0 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c  e3_exec(pDb->db,
10fd0 20 7a 45 6e 64 2c 20 30 2c 20 30 2c 20 30 29 20   zEnd, 0, 0, 0) 
10fe0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
10ff0 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c  e3_exec(pDb->db,
11000 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20   "ROLLBACK", 0, 
11010 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, 0);.      }. 
11020 20 20 20 20 20 70 44 62 2d 3e 64 69 73 61 62 6c       pDb->disabl
11030 65 41 75 74 68 2d 2d 3b 0a 20 20 20 20 7d 0a 20  eAuth--;.    }. 
11040 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
11050 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20   /*.  **    $db 
11060 75 70 64 61 74 65 5f 68 6f 6f 6b 20 3f 73 63 72  update_hook ?scr
11070 69 70 74 3f 0a 20 20 2a 2a 20 20 20 20 24 64 62  ipt?.  **    $db
11080 20 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 20 3f   rollback_hook ?
11090 73 63 72 69 70 74 3f 0a 20 20 2a 2f 0a 20 20 63  script?.  */.  c
110a0 61 73 65 20 44 42 5f 55 50 44 41 54 45 5f 48 4f  ase DB_UPDATE_HO
110b0 4f 4b 3a 20 0a 20 20 63 61 73 65 20 44 42 5f 52  OK: .  case DB_R
110c0 4f 4c 4c 42 41 43 4b 5f 48 4f 4f 4b 3a 20 7b 0a  OLLBACK_HOOK: {.
110d0 0a 20 20 20 20 2f 2a 20 73 65 74 20 70 70 48 6f  .    /* set ppHo
110e0 6f 6b 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 70  ok to point at p
110f0 55 70 64 61 74 65 48 6f 6f 6b 20 6f 72 20 70 52  UpdateHook or pR
11100 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 2c 20 64 65 70  ollbackHook, dep
11110 65 6e 64 69 6e 67 20 6f 6e 20 0a 20 20 20 20 2a  ending on .    *
11120 2a 20 77 68 65 74 68 65 72 20 5b 24 64 62 20 75  * whether [$db u
11130 70 64 61 74 65 5f 68 6f 6f 6b 5d 20 6f 72 20 5b  pdate_hook] or [
11140 24 64 62 20 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f  $db rollback_hoo
11150 6b 5d 20 77 61 73 20 69 6e 76 6f 6b 65 64 2e 0a  k] was invoked..
11160 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f      */.    Tcl_O
11170 62 6a 20 2a 2a 70 70 48 6f 6f 6b 3b 20 0a 20 20  bj **ppHook; .  
11180 20 20 69 66 28 20 63 68 6f 69 63 65 3d 3d 44 42    if( choice==DB
11190 5f 55 50 44 41 54 45 5f 48 4f 4f 4b 20 29 7b 0a  _UPDATE_HOOK ){.
111a0 20 20 20 20 20 20 70 70 48 6f 6f 6b 20 3d 20 26        ppHook = &
111b0 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b  pDb->pUpdateHook
111c0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
111d0 20 20 20 70 70 48 6f 6f 6b 20 3d 20 26 70 44 62     ppHook = &pDb
111e0 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3b  ->pRollbackHook;
111f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
11200 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21  objc!=2 && objc!
11210 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 54 63 6c  =3 ){.       Tcl
11220 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
11230 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
11240 3f 53 43 52 49 50 54 3f 22 29 3b 0a 20 20 20 20  ?SCRIPT?");.    
11250 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
11260 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
11270 66 28 20 2a 70 70 48 6f 6f 6b 20 29 7b 0a 20 20  f( *ppHook ){.  
11280 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
11290 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 2a 70 70  sult(interp, *pp
112a0 48 6f 6f 6b 29 3b 0a 20 20 20 20 20 20 69 66 28  Hook);.      if(
112b0 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20   objc==3 ){.    
112c0 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
112d0 6f 75 6e 74 28 2a 70 70 48 6f 6f 6b 29 3b 0a 20  ount(*ppHook);. 
112e0 20 20 20 20 20 20 20 2a 70 70 48 6f 6f 6b 20 3d         *ppHook =
112f0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
11300 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d  }.    if( objc==
11310 33 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  3 ){.      asser
11320 74 28 20 21 28 2a 70 70 48 6f 6f 6b 29 20 29 3b  t( !(*ppHook) );
11330 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47  .      if( Tcl_G
11340 65 74 43 68 61 72 4c 65 6e 67 74 68 28 6f 62 6a  etCharLength(obj
11350 76 5b 32 5d 29 3e 30 20 29 7b 0a 20 20 20 20 20  v[2])>0 ){.     
11360 20 20 20 2a 70 70 48 6f 6f 6b 20 3d 20 6f 62 6a     *ppHook = obj
11370 76 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20 54 63  v[2];.        Tc
11380 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 2a  l_IncrRefCount(*
11390 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20 20 20 7d  ppHook);.      }
113a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69  .    }..    sqli
113b0 74 65 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28  te3_update_hook(
113c0 70 44 62 2d 3e 64 62 2c 20 28 70 44 62 2d 3e 70  pDb->db, (pDb->p
113d0 55 70 64 61 74 65 48 6f 6f 6b 3f 44 62 55 70 64  UpdateHook?DbUpd
113e0 61 74 65 48 61 6e 64 6c 65 72 3a 30 29 2c 20 70  ateHandler:0), p
113f0 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
11400 5f 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28 70  _rollback_hook(p
11410 44 62 2d 3e 64 62 2c 28 70 44 62 2d 3e 70 52 6f  Db->db,(pDb->pRo
11420 6c 6c 62 61 63 6b 48 6f 6f 6b 3f 44 62 52 6f 6c  llbackHook?DbRol
11430 6c 62 61 63 6b 48 61 6e 64 6c 65 72 3a 30 29 2c  lbackHandler:0),
11440 70 44 62 29 3b 0a 0a 20 20 20 20 62 72 65 61 6b  pDb);..    break
11450 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24  ;.  }..  /*    $
11460 64 62 20 76 65 72 73 69 6f 6e 0a 20 20 2a 2a 0a  db version.  **.
11470 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20    ** Return the 
11480 76 65 72 73 69 6f 6e 20 73 74 72 69 6e 67 20 66  version string f
11490 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65  or this database
114a0 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
114b0 5f 56 45 52 53 49 4f 4e 3a 20 7b 0a 20 20 20 20  _VERSION: {.    
114c0 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
114d0 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71  terp, (char *)sq
114e0 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e  lite3_libversion
114f0 28 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  (), TCL_STATIC);
11500 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
11510 0a 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 6f 66 20  ..  } /* End of 
11520 74 68 65 20 53 57 49 54 43 48 20 73 74 61 74 65  the SWITCH state
11530 6d 65 6e 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e  ment */.  return
11540 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20   rc;.}../*.**   
11550 73 71 6c 69 74 65 33 20 44 42 4e 41 4d 45 20 46  sqlite3 DBNAME F
11560 49 4c 45 4e 41 4d 45 20 3f 2d 76 66 73 20 56 46  ILENAME ?-vfs VF
11570 53 4e 41 4d 45 3f 20 3f 2d 6b 65 79 20 4b 45 59  SNAME? ?-key KEY
11580 3f 20 3f 2d 72 65 61 64 6f 6e 6c 79 20 42 4f 4f  ? ?-readonly BOO
11590 4c 45 41 4e 3f 0a 2a 2a 20 20 20 20 20 20 20 20  LEAN?.**        
115a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115b0 20 20 20 3f 2d 63 72 65 61 74 65 20 42 4f 4f 4c     ?-create BOOL
115c0 45 41 4e 3f 20 3f 2d 6e 6f 6d 75 74 65 78 20 42  EAN? ?-nomutex B
115d0 4f 4f 4c 45 41 4e 3f 0a 2a 2a 0a 2a 2a 20 54 68  OOLEAN?.**.** Th
115e0 69 73 20 69 73 20 74 68 65 20 6d 61 69 6e 20 54  is is the main T
115f0 63 6c 20 63 6f 6d 6d 61 6e 64 2e 20 20 57 68 65  cl command.  Whe
11600 6e 20 74 68 65 20 22 73 71 6c 69 74 65 22 20 54  n the "sqlite" T
11610 63 6c 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a  cl command is.**
11620 20 69 6e 76 6f 6b 65 64 2c 20 74 68 69 73 20 72   invoked, this r
11630 6f 75 74 69 6e 65 20 72 75 6e 73 20 74 6f 20 70  outine runs to p
11640 72 6f 63 65 73 73 20 74 68 61 74 20 63 6f 6d 6d  rocess that comm
11650 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  and..**.** The f
11660 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2c 20 44  irst argument, D
11670 42 4e 41 4d 45 2c 20 69 73 20 61 6e 20 61 72 62  BNAME, is an arb
11680 69 74 72 61 72 79 20 6e 61 6d 65 20 66 6f 72 20  itrary name for 
11690 61 20 6e 65 77 0a 2a 2a 20 64 61 74 61 62 61 73  a new.** databas
116a0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 54  e connection.  T
116b0 68 69 73 20 63 6f 6d 6d 61 6e 64 20 63 72 65 61  his command crea
116c0 74 65 73 20 61 20 6e 65 77 20 63 6f 6d 6d 61 6e  tes a new comman
116d0 64 20 6e 61 6d 65 64 0a 2a 2a 20 44 42 4e 41 4d  d named.** DBNAM
116e0 45 20 74 68 61 74 20 69 73 20 75 73 65 64 20 74  E that is used t
116f0 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 61 74 20 63  o control that c
11700 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 54 68 65 20  onnection.  The 
11710 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e  database.** conn
11720 65 63 74 69 6f 6e 20 69 73 20 64 65 6c 65 74 65  ection is delete
11730 64 20 77 68 65 6e 20 74 68 65 20 44 42 4e 41 4d  d when the DBNAM
11740 45 20 63 6f 6d 6d 61 6e 64 20 69 73 20 64 65 6c  E command is del
11750 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  eted..**.** The 
11760 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
11770 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
11780 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
11790 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ..**.*/.static i
117a0 6e 74 20 44 62 4d 61 69 6e 28 76 6f 69 64 20 2a  nt DbMain(void *
117b0 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  cd, Tcl_Interp *
117c0 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63  interp, int objc
117d0 2c 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a  ,Tcl_Obj *const*
117e0 6f 62 6a 76 29 7b 0a 20 20 53 71 6c 69 74 65 44  objv){.  SqliteD
117f0 62 20 2a 70 3b 0a 20 20 76 6f 69 64 20 2a 70 4b  b *p;.  void *pK
11800 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4b  ey = 0;.  int nK
11810 65 79 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20  ey = 0;.  const 
11820 63 68 61 72 20 2a 7a 41 72 67 3b 0a 20 20 63 68  char *zArg;.  ch
11830 61 72 20 2a 7a 45 72 72 4d 73 67 3b 0a 20 20 69  ar *zErrMsg;.  i
11840 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68  nt i;.  const ch
11850 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 63 6f 6e  ar *zFile;.  con
11860 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 3d 20  st char *zVfs = 
11870 30 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  0;.  int flags =
11880 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
11890 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
118a0 4f 50 45 4e 5f 43 52 45 41 54 45 3b 0a 20 20 54  OPEN_CREATE;.  T
118b0 63 6c 5f 44 53 74 72 69 6e 67 20 74 72 61 6e 73  cl_DString trans
118c0 6c 61 74 65 64 46 69 6c 65 6e 61 6d 65 3b 0a 20  latedFilename;. 
118d0 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a   if( objc==2 ){.
118e0 20 20 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47      zArg = Tcl_G
118f0 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
11900 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 20  objv[1], 0);.   
11910 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67   if( strcmp(zArg
11920 2c 22 2d 76 65 72 73 69 6f 6e 22 29 3d 3d 30 20  ,"-version")==0 
11930 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
11940 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
11950 2c 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e  ,sqlite3_version
11960 2c 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ,0);.      retur
11970 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  n TCL_OK;.    }.
11980 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
11990 41 72 67 2c 22 2d 68 61 73 2d 63 6f 64 65 63 22  Arg,"-has-codec"
119a0 29 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53  )==0 ){.#ifdef S
119b0 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
119c0 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
119d0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 31  Result(interp,"1
119e0 22 2c 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  ",0);.#else.    
119f0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
11a00 6c 74 28 69 6e 74 65 72 70 2c 22 30 22 2c 30 29  lt(interp,"0",0)
11a10 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72  ;.#endif.      r
11a20 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20  eturn TCL_OK;.  
11a30 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d    }.  }.  for(i=
11a40 33 3b 20 69 2b 31 3c 6f 62 6a 63 3b 20 69 2b 3d  3; i+1<objc; i+=
11a50 32 29 7b 0a 20 20 20 20 7a 41 72 67 20 3d 20 54  2){.    zArg = T
11a60 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
11a70 76 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 73  v[i]);.    if( s
11a80 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 6b 65 79  trcmp(zArg,"-key
11a90 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ")==0 ){.      p
11aa0 4b 65 79 20 3d 20 54 63 6c 5f 47 65 74 42 79 74  Key = Tcl_GetByt
11ab0 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62  eArrayFromObj(ob
11ac0 6a 76 5b 69 2b 31 5d 2c 20 26 6e 4b 65 79 29 3b  jv[i+1], &nKey);
11ad0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
11ae0 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d 76 66  trcmp(zArg, "-vf
11af0 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  s")==0 ){.      
11b00 69 2b 2b 3b 0a 20 20 20 20 20 20 7a 56 66 73 20  i++;.      zVfs 
11b10 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
11b20 6f 62 6a 76 5b 69 5d 29 3b 0a 20 20 20 20 7d 65  objv[i]);.    }e
11b30 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
11b40 41 72 67 2c 20 22 2d 72 65 61 64 6f 6e 6c 79 22  Arg, "-readonly"
11b50 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
11b60 74 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20 54  t b;.      if( T
11b70 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
11b80 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
11b90 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20 72 65  v[i+1], &b) ) re
11ba0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
11bb0 20 20 20 20 20 20 69 66 28 20 62 20 29 7b 0a 20        if( b ){. 
11bc0 20 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20         flags &= 
11bd0 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  ~(SQLITE_OPEN_RE
11be0 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
11bf0 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 20  PEN_CREATE);.   
11c00 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51       flags |= SQ
11c10 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
11c20 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  LY;.      }else{
11c30 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 26  .        flags &
11c40 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  = ~SQLITE_OPEN_R
11c50 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20  EADONLY;.       
11c60 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45   flags |= SQLITE
11c70 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 3b  _OPEN_READWRITE;
11c80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
11c90 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41  se if( strcmp(zA
11ca0 72 67 2c 20 22 2d 63 72 65 61 74 65 22 29 3d 3d  rg, "-create")==
11cb0 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62  0 ){.      int b
11cc0 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f  ;.      if( Tcl_
11cd0 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62  GetBooleanFromOb
11ce0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69  j(interp, objv[i
11cf0 2b 31 5d 2c 20 26 62 29 20 29 20 72 65 74 75 72  +1], &b) ) retur
11d00 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
11d10 20 20 20 69 66 28 20 62 20 26 26 20 28 66 6c 61     if( b && (fla
11d20 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
11d30 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d 30 20 29 7b  _READONLY)==0 ){
11d40 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c  .        flags |
11d50 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  = SQLITE_OPEN_CR
11d60 45 41 54 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  EATE;.      }els
11d70 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  e{.        flags
11d80 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e   &= ~SQLITE_OPEN
11d90 5f 43 52 45 41 54 45 3b 0a 20 20 20 20 20 20 7d  _CREATE;.      }
11da0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
11db0 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d 6e 6f  trcmp(zArg, "-no
11dc0 6d 75 74 65 78 22 29 3d 3d 30 20 29 7b 0a 20 20  mutex")==0 ){.  
11dd0 20 20 20 20 69 6e 74 20 62 3b 0a 20 20 20 20 20      int b;.     
11de0 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c   if( Tcl_GetBool
11df0 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
11e00 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 62  p, objv[i+1], &b
11e10 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
11e20 52 52 4f 52 3b 0a 20 20 20 20 20 20 69 66 28 20  RROR;.      if( 
11e30 62 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61  b ){.        fla
11e40 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
11e50 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 20 20 20 20 20  N_NOMUTEX;.     
11e60 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c     flags &= ~SQL
11e70 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54  ITE_OPEN_FULLMUT
11e80 45 58 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EX;.      }else{
11e90 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 26  .        flags &
11ea0 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e  = ~SQLITE_OPEN_N
11eb0 4f 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 7d 0a  OMUTEX;.      }.
11ec0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
11ed0 63 6d 70 28 7a 41 72 67 2c 20 22 2d 66 75 6c 6c  cmp(zArg, "-full
11ee0 6d 75 74 65 78 22 29 3d 3d 30 20 29 7b 0a 20 20  mutex")==0 ){.  
11ef0 20 20 20 20 69 6e 74 20 62 3b 0a 20 20 20 20 20      int b;.     
11f00 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c   if( Tcl_GetBool
11f10 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
11f20 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 62  p, objv[i+1], &b
11f30 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
11f40 52 52 4f 52 3b 0a 20 20 20 20 20 20 69 66 28 20  RROR;.      if( 
11f50 62 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61  b ){.        fla
11f60 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
11f70 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a 20 20 20  N_FULLMUTEX;.   
11f80 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53       flags &= ~S
11f90 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54  QLITE_OPEN_NOMUT
11fa0 45 58 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EX;.      }else{
11fb0 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 26  .        flags &
11fc0 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46  = ~SQLITE_OPEN_F
11fd0 55 4c 4c 4d 55 54 45 58 3b 0a 20 20 20 20 20 20  ULLMUTEX;.      
11fe0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
11ff0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
12000 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 6b  ult(interp, "unk
12010 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 22 2c 20  nown option: ", 
12020 7a 41 72 67 2c 20 28 63 68 61 72 2a 29 30 29 3b  zArg, (char*)0);
12030 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
12040 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
12050 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3c 33 20   }.  if( objc<3 
12060 7c 7c 20 28 6f 62 6a 63 26 31 29 21 3d 31 20 29  || (objc&1)!=1 )
12070 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
12080 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
12090 2c 20 6f 62 6a 76 2c 20 0a 20 20 20 20 20 20 22  , objv, .      "
120a0 48 41 4e 44 4c 45 20 46 49 4c 45 4e 41 4d 45 20  HANDLE FILENAME 
120b0 3f 2d 76 66 73 20 56 46 53 4e 41 4d 45 3f 20 3f  ?-vfs VFSNAME? ?
120c0 2d 72 65 61 64 6f 6e 6c 79 20 42 4f 4f 4c 45 41  -readonly BOOLEA
120d0 4e 3f 20 3f 2d 63 72 65 61 74 65 20 42 4f 4f 4c  N? ?-create BOOL
120e0 45 41 4e 3f 22 0a 20 20 20 20 20 20 22 20 3f 2d  EAN?".      " ?-
120f0 6e 6f 6d 75 74 65 78 20 42 4f 4f 4c 45 41 4e 3f  nomutex BOOLEAN?
12100 20 3f 2d 66 75 6c 6c 6d 75 74 65 78 20 42 4f 4f   ?-fullmutex BOO
12110 4c 45 41 4e 3f 22 0a 23 69 66 64 65 66 20 53 51  LEAN?".#ifdef SQ
12120 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
12130 20 20 20 20 20 22 20 3f 2d 6b 65 79 20 43 4f 44       " ?-key COD
12140 45 43 4b 45 59 3f 22 0a 23 65 6e 64 69 66 0a 20  ECKEY?".#endif. 
12150 20 20 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e     );.    return
12160 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
12170 20 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20    zErrMsg = 0;. 
12180 20 70 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29   p = (SqliteDb*)
12190 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f  Tcl_Alloc( sizeo
121a0 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70  f(*p) );.  if( p
121b0 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53  ==0 ){.    Tcl_S
121c0 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
121d0 20 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 22   "malloc failed"
121e0 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
121f0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
12200 52 4f 52 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  ROR;.  }.  memse
12210 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  t(p, 0, sizeof(*
12220 70 29 29 3b 0a 20 20 7a 46 69 6c 65 20 3d 20 54  p));.  zFile = T
12230 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
12240 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b  Obj(objv[2], 0);
12250 0a 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 54  .  zFile = Tcl_T
12260 72 61 6e 73 6c 61 74 65 46 69 6c 65 4e 61 6d 65  ranslateFileName
12270 28 69 6e 74 65 72 70 2c 20 7a 46 69 6c 65 2c 20  (interp, zFile, 
12280 26 74 72 61 6e 73 6c 61 74 65 64 46 69 6c 65 6e  &translatedFilen
12290 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ame);.  sqlite3_
122a0 6f 70 65 6e 5f 76 32 28 7a 46 69 6c 65 2c 20 26  open_v2(zFile, &
122b0 70 2d 3e 64 62 2c 20 66 6c 61 67 73 2c 20 7a 56  p->db, flags, zV
122c0 66 73 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  fs);.  Tcl_DStri
122d0 6e 67 46 72 65 65 28 26 74 72 61 6e 73 6c 61 74  ngFree(&translat
122e0 65 64 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69  edFilename);.  i
122f0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
12300 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70 2d  lite3_errcode(p-
12310 3e 64 62 29 20 29 7b 0a 20 20 20 20 7a 45 72 72  >db) ){.    zErr
12320 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Msg = sqlite3_mp
12330 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69  rintf("%s", sqli
12340 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62  te3_errmsg(p->db
12350 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ));.    sqlite3_
12360 63 6c 6f 73 65 28 70 2d 3e 64 62 29 3b 0a 20 20  close(p->db);.  
12370 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 7d    p->db = 0;.  }
12380 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
12390 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 70  AS_CODEC.  if( p
123a0 2d 3e 64 62 20 29 7b 0a 20 20 20 20 73 71 6c 69  ->db ){.    sqli
123b0 74 65 33 5f 6b 65 79 28 70 2d 3e 64 62 2c 20 70  te3_key(p->db, p
123c0 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 7d 0a  Key, nKey);.  }.
123d0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e  #endif.  if( p->
123e0 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c  db==0 ){.    Tcl
123f0 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
12400 70 2c 20 7a 45 72 72 4d 73 67 2c 20 54 43 4c 5f  p, zErrMsg, TCL_
12410 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 54  VOLATILE);.    T
12420 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70  cl_Free((char*)p
12430 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
12440 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ree(zErrMsg);.  
12450 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
12460 4f 52 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 78  OR;.  }.  p->max
12470 53 74 6d 74 20 3d 20 4e 55 4d 5f 50 52 45 50 41  Stmt = NUM_PREPA
12480 52 45 44 5f 53 54 4d 54 53 3b 0a 20 20 70 2d 3e  RED_STMTS;.  p->
12490 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b  interp = interp;
124a0 0a 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65  .  zArg = Tcl_Ge
124b0 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
124c0 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 54 63  bjv[1], 0);.  Tc
124d0 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
124e0 6e 64 28 69 6e 74 65 72 70 2c 20 7a 41 72 67 2c  nd(interp, zArg,
124f0 20 44 62 4f 62 6a 43 6d 64 2c 20 28 63 68 61 72   DbObjCmd, (char
12500 2a 29 70 2c 20 44 62 44 65 6c 65 74 65 43 6d 64  *)p, DbDeleteCmd
12510 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
12520 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f  OK;.}../*.** Pro
12530 76 69 64 65 20 61 20 64 75 6d 6d 79 20 54 63 6c  vide a dummy Tcl
12540 5f 49 6e 69 74 53 74 75 62 73 20 69 66 20 77 65  _InitStubs if we
12550 20 61 72 65 20 75 73 69 6e 67 20 74 68 69 73 20   are using this 
12560 61 73 20 61 20 73 74 61 74 69 63 0a 2a 2a 20 6c  as a static.** l
12570 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64  ibrary..*/.#ifnd
12580 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53  ef USE_TCL_STUBS
12590 0a 23 20 75 6e 64 65 66 20 20 54 63 6c 5f 49 6e  .# undef  Tcl_In
125a0 69 74 53 74 75 62 73 0a 23 20 64 65 66 69 6e 65  itStubs.# define
125b0 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 61   Tcl_InitStubs(a
125c0 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ,b,c).#endif../*
125d0 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65  .** Make sure we
125e0 20 68 61 76 65 20 61 20 50 41 43 4b 41 47 45 5f   have a PACKAGE_
125f0 56 45 52 53 49 4f 4e 20 6d 61 63 72 6f 20 64 65  VERSION macro de
12600 66 69 6e 65 64 2e 20 20 54 68 69 73 20 77 69 6c  fined.  This wil
12610 6c 20 62 65 0a 2a 2a 20 64 65 66 69 6e 65 64 20  l be.** defined 
12620 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 62 79  automatically by
12630 20 74 68 65 20 54 45 41 20 6d 61 6b 65 66 69 6c   the TEA makefil
12640 65 2e 20 20 42 75 74 20 6f 74 68 65 72 20 6d 61  e.  But other ma
12650 6b 65 66 69 6c 65 73 0a 2a 2a 20 64 6f 20 6e 6f  kefiles.** do no
12660 74 20 64 65 66 69 6e 65 20 69 74 2e 0a 2a 2f 0a  t define it..*/.
12670 23 69 66 6e 64 65 66 20 50 41 43 4b 41 47 45 5f  #ifndef PACKAGE_
12680 56 45 52 53 49 4f 4e 0a 23 20 64 65 66 69 6e 65  VERSION.# define
12690 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e   PACKAGE_VERSION
126a0 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 0a   SQLITE_VERSION.
126b0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
126c0 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f  itialize this mo
126d0 64 75 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  dule..**.** This
126e0 20 54 63 6c 20 6d 6f 64 75 6c 65 20 63 6f 6e 74   Tcl module cont
126f0 61 69 6e 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67  ains only a sing
12700 6c 65 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d 61  le new Tcl comma
12710 6e 64 20 6e 61 6d 65 64 20 22 73 71 6c 69 74 65  nd named "sqlite
12720 22 2e 0a 2a 2a 20 28 48 65 6e 63 65 20 74 68 65  "..** (Hence the
12730 72 65 20 69 73 20 6e 6f 20 6e 61 6d 65 73 70 61  re is no namespa
12740 63 65 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f  ce.  There is no
12750 20 70 6f 69 6e 74 20 69 6e 20 75 73 69 6e 67 20   point in using 
12760 61 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69  a namespace.** i
12770 66 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 20  f the extension 
12780 6f 6e 6c 79 20 73 75 70 70 6c 69 65 73 20 6f 6e  only supplies on
12790 65 20 6e 65 77 20 6e 61 6d 65 21 29 20 20 54 68  e new name!)  Th
127a0 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d 61  e "sqlite" comma
127b0 6e 64 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f  nd is.** used to
127c0 20 6f 70 65 6e 20 61 20 6e 65 77 20 53 51 4c 69   open a new SQLi
127d0 74 65 20 64 61 74 61 62 61 73 65 2e 20 20 53 65  te database.  Se
127e0 65 20 74 68 65 20 44 62 4d 61 69 6e 28 29 20 72  e the DbMain() r
127f0 6f 75 74 69 6e 65 20 61 62 6f 76 65 0a 2a 2a 20  outine above.** 
12800 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
12810 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 45  nformation..*/.E
12820 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65  XTERN int Sqlite
12830 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  3_Init(Tcl_Inter
12840 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 54 63  p *interp){.  Tc
12850 6c 5f 49 6e 69 74 53 74 75 62 73 28 69 6e 74 65  l_InitStubs(inte
12860 72 70 2c 20 22 38 2e 34 22 2c 20 30 29 3b 0a 20  rp, "8.4", 0);. 
12870 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
12880 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 73  mmand(interp, "s
12890 71 6c 69 74 65 33 22 2c 20 28 54 63 6c 5f 4f 62  qlite3", (Tcl_Ob
128a0 6a 43 6d 64 50 72 6f 63 2a 29 44 62 4d 61 69 6e  jCmdProc*)DbMain
128b0 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 50  , 0, 0);.  Tcl_P
128c0 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70  kgProvide(interp
128d0 2c 20 22 73 71 6c 69 74 65 33 22 2c 20 50 41 43  , "sqlite3", PAC
128e0 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29 3b 0a 20  KAGE_VERSION);. 
128f0 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
12900 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 73  mmand(interp, "s
12910 71 6c 69 74 65 22 2c 20 28 54 63 6c 5f 4f 62 6a  qlite", (Tcl_Obj
12920 43 6d 64 50 72 6f 63 2a 29 44 62 4d 61 69 6e 2c  CmdProc*)DbMain,
12930 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 50 6b   0, 0);.  Tcl_Pk
12940 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70 2c  gProvide(interp,
12950 20 22 73 71 6c 69 74 65 22 2c 20 50 41 43 4b 41   "sqlite", PACKA
12960 47 45 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20 72  GE_VERSION);.  r
12970 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
12980 45 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73 71  EXTERN int Tclsq
12990 6c 69 74 65 33 5f 49 6e 69 74 28 54 63 6c 5f 49  lite3_Init(Tcl_I
129a0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20  nterp *interp){ 
129b0 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33 5f 49  return Sqlite3_I
129c0 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a 45  nit(interp); }.E
129d0 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65  XTERN int Sqlite
129e0 33 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49  3_SafeInit(Tcl_I
129f0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20  nterp *interp){ 
12a00 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d  return TCL_OK; }
12a10 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73  .EXTERN int Tcls
12a20 71 6c 69 74 65 33 5f 53 61 66 65 49 6e 69 74 28  qlite3_SafeInit(
12a30 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
12a40 72 70 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f  rp){ return TCL_
12a50 4f 4b 3b 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK; }..#ifndef S
12a60 51 4c 49 54 45 5f 33 5f 53 55 46 46 49 58 5f 4f  QLITE_3_SUFFIX_O
12a70 4e 4c 59 0a 45 58 54 45 52 4e 20 69 6e 74 20 53  NLY.EXTERN int S
12a80 71 6c 69 74 65 5f 49 6e 69 74 28 54 63 6c 5f 49  qlite_Init(Tcl_I
12a90 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20  nterp *interp){ 
12aa0 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33 5f 49  return Sqlite3_I
12ab0 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a 45  nit(interp); }.E
12ac0 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73 71 6c  XTERN int Tclsql
12ad0 69 74 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  ite_Init(Tcl_Int
12ae0 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65  erp *interp){ re
12af0 74 75 72 6e 20 53 71 6c 69 74 65 33 5f 49 6e 69  turn Sqlite3_Ini
12b00 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a 45 58 54  t(interp); }.EXT
12b10 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65 5f 53  ERN int Sqlite_S
12b20 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  afeInit(Tcl_Inte
12b30 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74  rp *interp){ ret
12b40 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58  urn TCL_OK; }.EX
12b50 54 45 52 4e 20 69 6e 74 20 54 63 6c 73 71 6c 69  TERN int Tclsqli
12b60 74 65 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f  te_SafeInit(Tcl_
12b70 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
12b80 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
12b90 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
12ba0 20 54 43 4c 53 48 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a   TCLSH./********
12bb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12bf0 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  *****.** The cod
12c00 65 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69  e that follows i
12c10 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20  s used to build 
12c20 73 74 61 6e 64 61 6c 6f 6e 65 20 54 43 4c 20 69  standalone TCL i
12c30 6e 74 65 72 70 72 65 74 65 72 73 0a 2a 2a 20 74  nterpreters.** t
12c40 68 61 74 20 61 72 65 20 73 74 61 74 69 63 61 6c  hat are statical
12c50 6c 79 20 6c 69 6e 6b 65 64 20 77 69 74 68 20 53  ly linked with S
12c60 51 4c 69 74 65 2e 20 20 0a 2a 2f 0a 0a 2f 2a 0a  QLite.  .*/../*.
12c70 2a 2a 20 49 66 20 74 68 65 20 6d 61 63 72 6f 20  ** If the macro 
12c80 54 43 4c 53 48 20 69 73 20 6f 6e 65 2c 20 74 68  TCLSH is one, th
12c90 65 6e 20 70 75 74 20 69 6e 20 63 6f 64 65 20 74  en put in code t
12ca0 68 69 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 22  his for the.** "
12cb0 6d 61 69 6e 22 20 72 6f 75 74 69 6e 65 20 74 68  main" routine th
12cc0 61 74 20 77 69 6c 6c 20 69 6e 69 74 69 61 6c 69  at will initiali
12cd0 7a 65 20 54 63 6c 20 61 6e 64 20 74 61 6b 65 20  ze Tcl and take 
12ce0 69 6e 70 75 74 20 66 72 6f 6d 0a 2a 2a 20 73 74  input from.** st
12cf0 61 6e 64 61 72 64 20 69 6e 70 75 74 2c 20 6f 72  andard input, or
12d00 20 69 66 20 61 20 66 69 6c 65 20 69 73 20 6e 61   if a file is na
12d10 6d 65 64 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61  med on the comma
12d20 6e 64 20 6c 69 6e 65 0a 2a 2a 20 74 68 65 20 54  nd line.** the T
12d30 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 72  CL interpreter r
12d40 65 61 64 73 20 61 6e 64 20 65 76 61 6c 75 61 74  eads and evaluat
12d50 65 73 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2f  es that file..*/
12d60 0a 23 69 66 20 54 43 4c 53 48 3d 3d 31 0a 73 74  .#if TCLSH==1.st
12d70 61 74 69 63 20 63 68 61 72 20 7a 4d 61 69 6e 6c  atic char zMainl
12d80 6f 6f 70 5b 5d 20 3d 0a 20 20 22 73 65 74 20 6c  oop[] =.  "set l
12d90 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20 22 77 68 69  ine {}\n".  "whi
12da0 6c 65 20 7b 21 5b 65 6f 66 20 73 74 64 69 6e 5d  le {![eof stdin]
12db0 7d 20 7b 5c 6e 22 0a 20 20 20 20 22 69 66 20 7b  } {\n".    "if {
12dc0 24 6c 69 6e 65 21 3d 5c 22 5c 22 7d 20 7b 5c 6e  $line!=\"\"} {\n
12dd0 22 0a 20 20 20 20 20 20 22 70 75 74 73 20 2d 6e  ".      "puts -n
12de0 6f 6e 65 77 6c 69 6e 65 20 5c 22 3e 20 5c 22 5c  onewline \"> \"\
12df0 6e 22 0a 20 20 20 20 22 7d 20 65 6c 73 65 20 7b  n".    "} else {
12e00 5c 6e 22 0a 20 20 20 20 20 20 22 70 75 74 73 20  \n".      "puts 
12e10 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22 25 20 5c  -nonewline \"% \
12e20 22 5c 6e 22 0a 20 20 20 20 22 7d 5c 6e 22 0a 20  "\n".    "}\n". 
12e30 20 20 20 22 66 6c 75 73 68 20 73 74 64 6f 75 74     "flush stdout
12e40 5c 6e 22 0a 20 20 20 20 22 61 70 70 65 6e 64 20  \n".    "append 
12e50 6c 69 6e 65 20 5b 67 65 74 73 20 73 74 64 69 6e  line [gets stdin
12e60 5d 5c 6e 22 0a 20 20 20 20 22 69 66 20 7b 5b 69  ]\n".    "if {[i
12e70 6e 66 6f 20 63 6f 6d 70 6c 65 74 65 20 24 6c 69  nfo complete $li
12e80 6e 65 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20  ne]} {\n".      
12e90 22 69 66 20 7b 5b 63 61 74 63 68 20 7b 75 70 6c  "if {[catch {upl
12ea0 65 76 65 6c 20 23 30 20 24 6c 69 6e 65 7d 20 72  evel #0 $line} r
12eb0 65 73 75 6c 74 5d 7d 20 7b 5c 6e 22 0a 20 20 20  esult]} {\n".   
12ec0 20 20 20 20 20 22 70 75 74 73 20 73 74 64 65 72       "puts stder
12ed0 72 20 5c 22 45 72 72 6f 72 3a 20 24 72 65 73 75  r \"Error: $resu
12ee0 6c 74 5c 22 5c 6e 22 0a 20 20 20 20 20 20 22 7d  lt\"\n".      "}
12ef0 20 65 6c 73 65 69 66 20 7b 24 72 65 73 75 6c 74   elseif {$result
12f00 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20  !=\"\"} {\n".   
12f10 20 20 20 20 20 22 70 75 74 73 20 24 72 65 73 75       "puts $resu
12f20 6c 74 5c 6e 22 0a 20 20 20 20 20 20 22 7d 5c 6e  lt\n".      "}\n
12f30 22 0a 20 20 20 20 20 20 22 73 65 74 20 6c 69 6e  ".      "set lin
12f40 65 20 7b 7d 5c 6e 22 0a 20 20 20 20 22 7d 20 65  e {}\n".    "} e
12f50 6c 73 65 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22  lse {\n".      "
12f60 61 70 70 65 6e 64 20 6c 69 6e 65 20 5c 5c 6e 5c  append line \\n\
12f70 6e 22 0a 20 20 20 20 22 7d 5c 6e 22 0a 20 20 22  n".    "}\n".  "
12f80 7d 5c 6e 22 0a 3b 0a 23 65 6e 64 69 66 0a 0a 2f  }\n".;.#endif../
12f90 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 63 72  *.** If the macr
12fa0 6f 20 54 43 4c 53 48 20 69 73 20 74 77 6f 2c 20  o TCLSH is two, 
12fb0 74 68 65 6e 20 67 65 74 20 74 68 65 20 6d 61 69  then get the mai
12fc0 6e 20 6c 6f 6f 70 20 63 6f 64 65 20 6f 75 74 20  n loop code out 
12fd0 6f 66 0a 2a 2a 20 74 68 65 20 73 65 70 61 72 61  of.** the separa
12fe0 74 65 20 66 69 6c 65 20 22 73 70 61 63 65 61 6e  te file "spacean
12ff0 61 6c 5f 74 63 6c 2e 68 22 2e 0a 2a 2f 0a 23 69  al_tcl.h"..*/.#i
13000 66 20 54 43 4c 53 48 3d 3d 32 0a 73 74 61 74 69  f TCLSH==2.stati
13010 63 20 63 68 61 72 20 7a 4d 61 69 6e 6c 6f 6f 70  c char zMainloop
13020 5b 5d 20 3d 20 0a 23 69 6e 63 6c 75 64 65 20 22  [] = .#include "
13030 73 70 61 63 65 61 6e 61 6c 5f 74 63 6c 2e 68 22  spaceanal_tcl.h"
13040 0a 3b 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  .;.#endif..#defi
13050 6e 65 20 54 43 4c 53 48 5f 4d 41 49 4e 20 6d 61  ne TCLSH_MAIN ma
13060 69 6e 20 20 20 2f 2a 20 4e 65 65 64 65 64 20 74  in   /* Needed t
13070 6f 20 66 61 6b 65 20 6f 75 74 20 6d 6b 74 63 6c  o fake out mktcl
13080 61 70 70 20 2a 2f 0a 69 6e 74 20 54 43 4c 53 48  app */.int TCLSH
13090 5f 4d 41 49 4e 28 69 6e 74 20 61 72 67 63 2c 20  _MAIN(int argc, 
130a0 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20  char **argv){.  
130b0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
130c0 72 70 3b 0a 20 20 54 63 6c 5f 46 69 6e 64 45 78  rp;.  Tcl_FindEx
130d0 65 63 75 74 61 62 6c 65 28 61 72 67 76 5b 30 5d  ecutable(argv[0]
130e0 29 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20 54 63  );.  interp = Tc
130f0 6c 5f 43 72 65 61 74 65 49 6e 74 65 72 70 28 29  l_CreateInterp()
13100 3b 0a 20 20 53 71 6c 69 74 65 33 5f 49 6e 69 74  ;.  Sqlite3_Init
13110 28 69 6e 74 65 72 70 29 3b 0a 23 69 66 64 65 66  (interp);.#ifdef
13120 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 7b   SQLITE_TEST.  {
13130 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
13140 4d 64 35 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  Md5_Init(Tcl_Int
13150 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
13160 6e 20 69 6e 74 20 53 71 6c 69 74 65 63 6f 6e 66  n int Sqliteconf
13170 69 67 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  ig_Init(Tcl_Inte
13180 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
13190 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 31   int Sqlitetest1
131a0 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
131b0 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
131c0 6e 74 20 53 71 6c 69 74 65 74 65 73 74 32 5f 49  nt Sqlitetest2_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 33 5f 49 6e 69   Sqlitetest3_Ini
13200 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
13210 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
13220 71 6c 69 74 65 74 65 73 74 34 5f 49 6e 69 74 28  qlitetest4_Init(
13230 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
13240 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
13250 69 74 65 74 65 73 74 35 5f 49 6e 69 74 28 54 63  itetest5_Init(Tc
13260 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
13270 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
13280 65 74 65 73 74 36 5f 49 6e 69 74 28 54 63 6c 5f  etest6_Init(Tcl_
13290 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
132a0 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
132b0 65 73 74 37 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  est7_Init(Tcl_In
132c0 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
132d0 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
132e0 74 38 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  t8_Init(Tcl_Inte
132f0 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
13300 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 39   int Sqlitetest9
13310 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
13320 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
13330 6e 74 20 53 71 6c 69 74 65 74 65 73 74 61 73 79  nt Sqlitetestasy
13340 6e 63 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  nc_Init(Tcl_Inte
13350 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
13360 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f   int Sqlitetest_
13370 61 75 74 6f 65 78 74 5f 49 6e 69 74 28 54 63 6c  autoext_Init(Tcl
13380 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
13390 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
133a0 74 65 73 74 5f 66 75 6e 63 5f 49 6e 69 74 28 54  test_func_Init(T
133b0 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
133c0 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
133d0 74 65 74 65 73 74 5f 68 65 78 69 6f 5f 49 6e 69  tetest_hexio_Ini
133e0 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
133f0 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
13400 71 6c 69 74 65 74 65 73 74 5f 6d 61 6c 6c 6f 63  qlitetest_malloc
13410 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
13420 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
13430 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f 6d 75  nt Sqlitetest_mu
13440 74 65 78 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  tex_Init(Tcl_Int
13450 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
13460 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
13470 73 63 68 65 6d 61 5f 49 6e 69 74 28 54 63 6c 5f  schema_Init(Tcl_
13480 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
13490 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
134a0 65 73 74 73 73 65 5f 49 6e 69 74 28 54 63 6c 5f  estsse_Init(Tcl_
134b0 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
134c0 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
134d0 65 73 74 74 63 6c 76 61 72 5f 49 6e 69 74 28 54  esttclvar_Init(T
134e0 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
134f0 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
13500 74 65 74 65 73 74 54 68 72 65 61 64 5f 49 6e 69  tetestThread_Ini
13510 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
13520 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
13530 71 6c 69 74 65 74 65 73 74 4f 6e 65 66 69 6c 65  qlitetestOnefile
13540 5f 49 6e 69 74 28 29 3b 0a 20 20 20 20 65 78 74  _Init();.    ext
13550 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
13560 73 74 4f 73 69 6e 73 74 5f 49 6e 69 74 28 54 63  stOsinst_Init(Tc
13570 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 0a 20 20 20  l_Interp*);..   
13580 20 4d 64 35 5f 49 6e 69 74 28 69 6e 74 65 72 70   Md5_Init(interp
13590 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 63 6f 6e  );.    Sqlitecon
135a0 66 69 67 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  fig_Init(interp)
135b0 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
135c0 31 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  1_Init(interp);.
135d0 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 32 5f      Sqlitetest2_
135e0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
135f0 20 20 53 71 6c 69 74 65 74 65 73 74 33 5f 49 6e    Sqlitetest3_In
13600 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
13610 53 71 6c 69 74 65 74 65 73 74 34 5f 49 6e 69 74  Sqlitetest4_Init
13620 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
13630 6c 69 74 65 74 65 73 74 35 5f 49 6e 69 74 28 69  litetest5_Init(i
13640 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
13650 74 65 74 65 73 74 36 5f 49 6e 69 74 28 69 6e 74  tetest6_Init(int
13660 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
13670 74 65 73 74 37 5f 49 6e 69 74 28 69 6e 74 65 72  test7_Init(inter
13680 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
13690 73 74 38 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  st8_Init(interp)
136a0 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
136b0 39 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  9_Init(interp);.
136c0 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 61 73      Sqlitetestas
136d0 79 6e 63 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  ync_Init(interp)
136e0 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
136f0 5f 61 75 74 6f 65 78 74 5f 49 6e 69 74 28 69 6e  _autoext_Init(in
13700 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
13710 65 74 65 73 74 5f 66 75 6e 63 5f 49 6e 69 74 28  etest_func_Init(
13720 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
13730 69 74 65 74 65 73 74 5f 68 65 78 69 6f 5f 49 6e  itetest_hexio_In
13740 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
13750 53 71 6c 69 74 65 74 65 73 74 5f 6d 61 6c 6c 6f  Sqlitetest_mallo
13760 63 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  c_Init(interp);.
13770 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f 6d      Sqlitetest_m
13780 75 74 65 78 5f 49 6e 69 74 28 69 6e 74 65 72 70  utex_Init(interp
13790 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
137a0 74 73 63 68 65 6d 61 5f 49 6e 69 74 28 69 6e 74  tschema_Init(int
137b0 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
137c0 74 65 73 74 74 63 6c 76 61 72 5f 49 6e 69 74 28  testtclvar_Init(
137d0 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
137e0 69 74 65 74 65 73 74 54 68 72 65 61 64 5f 49 6e  itetestThread_In
137f0 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
13800 53 71 6c 69 74 65 74 65 73 74 4f 6e 65 66 69 6c  SqlitetestOnefil
13810 65 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  e_Init(interp);.
13820 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 4f 73      SqlitetestOs
13830 69 6e 73 74 5f 49 6e 69 74 28 69 6e 74 65 72 70  inst_Init(interp
13840 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  );..#ifdef SQLIT
13850 45 5f 53 53 45 0a 20 20 20 20 53 71 6c 69 74 65  E_SSE.    Sqlite
13860 74 65 73 74 73 73 65 5f 49 6e 69 74 28 69 6e 74  testsse_Init(int
13870 65 72 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  erp);.#endif.  }
13880 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 61 72  .#endif.  if( ar
13890 67 63 3e 3d 32 20 7c 7c 20 54 43 4c 53 48 3d 3d  gc>=2 || TCLSH==
138a0 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  2 ){.    int i;.
138b0 20 20 20 20 63 68 61 72 20 7a 41 72 67 63 5b 33      char zArgc[3
138c0 32 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  2];.    sqlite3_
138d0 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
138e0 7a 41 72 67 63 29 2c 20 7a 41 72 67 63 2c 20 22  zArgc), zArgc, "
138f0 25 64 22 2c 20 61 72 67 63 2d 28 33 2d 54 43 4c  %d", argc-(3-TCL
13900 53 48 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  SH));.    Tcl_Se
13910 74 56 61 72 28 69 6e 74 65 72 70 2c 22 61 72 67  tVar(interp,"arg
13920 63 22 2c 20 7a 41 72 67 63 2c 20 54 43 4c 5f 47  c", zArgc, TCL_G
13930 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20  LOBAL_ONLY);.   
13940 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65   Tcl_SetVar(inte
13950 72 70 2c 22 61 72 67 76 30 22 2c 61 72 67 76 5b  rp,"argv0",argv[
13960 31 5d 2c 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e  1],TCL_GLOBAL_ON
13970 4c 59 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  LY);.    Tcl_Set
13980 56 61 72 28 69 6e 74 65 72 70 2c 22 61 72 67 76  Var(interp,"argv
13990 22 2c 20 22 22 2c 20 54 43 4c 5f 47 4c 4f 42 41  ", "", TCL_GLOBA
139a0 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 66 6f 72  L_ONLY);.    for
139b0 28 69 3d 33 2d 54 43 4c 53 48 3b 20 69 3c 61 72  (i=3-TCLSH; i<ar
139c0 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  gc; i++){.      
139d0 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72  Tcl_SetVar(inter
139e0 70 2c 20 22 61 72 67 76 22 2c 20 61 72 67 76 5b  p, "argv", argv[
139f0 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 54 43  i],.          TC
13a00 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 20 7c 20  L_GLOBAL_ONLY | 
13a10 54 43 4c 5f 4c 49 53 54 5f 45 4c 45 4d 45 4e 54  TCL_LIST_ELEMENT
13a20 20 7c 20 54 43 4c 5f 41 50 50 45 4e 44 5f 56 41   | TCL_APPEND_VA
13a30 4c 55 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  LUE);.    }.    
13a40 69 66 28 20 54 43 4c 53 48 3d 3d 31 20 26 26 20  if( TCLSH==1 && 
13a50 54 63 6c 5f 45 76 61 6c 46 69 6c 65 28 69 6e 74  Tcl_EvalFile(int
13a60 65 72 70 2c 20 61 72 67 76 5b 31 5d 29 21 3d 54  erp, argv[1])!=T
13a70 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 63  CL_OK ){.      c
13a80 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 66 6f  onst char *zInfo
13a90 20 3d 20 54 63 6c 5f 47 65 74 56 61 72 28 69 6e   = Tcl_GetVar(in
13aa0 74 65 72 70 2c 20 22 65 72 72 6f 72 49 6e 66 6f  terp, "errorInfo
13ab0 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e  ", TCL_GLOBAL_ON
13ac0 4c 59 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  LY);.      if( z
13ad0 49 6e 66 6f 3d 3d 30 20 29 20 7a 49 6e 66 6f 20  Info==0 ) zInfo 
13ae0 3d 20 69 6e 74 65 72 70 2d 3e 72 65 73 75 6c 74  = interp->result
13af0 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  ;.      fprintf(
13b00 73 74 64 65 72 72 2c 22 25 73 3a 20 25 73 5c 6e  stderr,"%s: %s\n
13b10 22 2c 20 2a 61 72 67 76 2c 20 7a 49 6e 66 6f 29  ", *argv, zInfo)
13b20 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
13b30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
13b40 28 20 61 72 67 63 3c 3d 31 20 7c 7c 20 54 43 4c  ( argc<=1 || TCL
13b50 53 48 3d 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  SH==2 ){.    Tcl
13b60 5f 47 6c 6f 62 61 6c 45 76 61 6c 28 69 6e 74 65  _GlobalEval(inte
13b70 72 70 2c 20 7a 4d 61 69 6e 6c 6f 6f 70 29 3b 0a  rp, zMainloop);.
13b80 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
13b90 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 54 43 4c 53  }.#endif /* TCLS
13ba0 48 20 2a 2f 0a                                   H */.