/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact a6a346f42322ae1df980228306da6c3cea4dd680:


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 34 20 32 30 30 38  e.c,v 1.224 2008
0220: 2f 30 39 2f 30 39 20 31 32 3a 33 31 3a 33 34 20  /09/09 12:31:34 
0230: 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e  drh Exp $.*/.#in
0240: 63 6c 75 64 65 20 22 74 63 6c 2e 68 22 0a 23 69  clude "tcl.h".#i
0250: 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e 68 3e  nclude <errno.h>
0260: 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 61 64 64  ../*.** Some add
0270: 69 74 69 6f 6e 61 6c 20 69 6e 63 6c 75 64 65 20  itional include 
0280: 66 69 6c 65 73 20 61 72 65 20 6e 65 65 64 65 64  files are needed
0290: 20 69 66 20 74 68 69 73 20 66 69 6c 65 20 69 73   if this file is
02a0: 20 6e 6f 74 0a 2a 2a 20 61 70 70 65 6e 64 65 64   not.** appended
02b0: 20 74 6f 20 74 68 65 20 61 6d 61 6c 67 61 6d 61   to the amalgama
02c0: 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tion..*/.#ifndef
02d0: 20 53 51 4c 49 54 45 5f 41 4d 41 4c 47 41 4d 41   SQLITE_AMALGAMA
02e0: 54 49 4f 4e 0a 23 20 69 6e 63 6c 75 64 65 20 22  TION.# include "
02f0: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 20 69  sqliteInt.h".# i
0300: 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e 68  nclude <stdlib.h
0310: 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 74 72  >.# include <str
0320: 69 6e 67 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65  ing.h>.# include
0330: 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23 20 69 6e   <assert.h>.# in
0340: 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a  clude <ctype.h>.
0350: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 57 69  #endif../*. * Wi
0360: 6e 64 6f 77 73 20 6e 65 65 64 73 20 74 6f 20 6b  ndows needs to k
0370: 6e 6f 77 20 77 68 69 63 68 20 73 79 6d 62 6f 6c  now which symbol
0380: 73 20 74 6f 20 65 78 70 6f 72 74 2e 20 20 55 6e  s to export.  Un
0390: 69 78 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 2a 20  ix does not.. * 
03a0: 42 55 49 4c 44 5f 73 71 6c 69 74 65 20 73 68 6f  BUILD_sqlite sho
03b0: 75 6c 64 20 62 65 20 75 6e 64 65 66 69 6e 65 64  uld be undefined
03c0: 20 66 6f 72 20 55 6e 69 78 2e 0a 20 2a 2f 0a 23   for Unix.. */.#
03d0: 69 66 64 65 66 20 42 55 49 4c 44 5f 73 71 6c 69  ifdef BUILD_sqli
03e0: 74 65 0a 23 75 6e 64 65 66 20 54 43 4c 5f 53 54  te.#undef TCL_ST
03f0: 4f 52 41 47 45 5f 43 4c 41 53 53 0a 23 64 65 66  ORAGE_CLASS.#def
0400: 69 6e 65 20 54 43 4c 5f 53 54 4f 52 41 47 45 5f  ine TCL_STORAGE_
0410: 43 4c 41 53 53 20 44 4c 4c 45 58 50 4f 52 54 0a  CLASS DLLEXPORT.
0420: 23 65 6e 64 69 66 20 2f 2a 20 42 55 49 4c 44 5f  #endif /* BUILD_
0430: 73 71 6c 69 74 65 20 2a 2f 0a 0a 23 64 65 66 69  sqlite */..#defi
0440: 6e 65 20 4e 55 4d 5f 50 52 45 50 41 52 45 44 5f  ne NUM_PREPARED_
0450: 53 54 4d 54 53 20 31 30 0a 23 64 65 66 69 6e 65  STMTS 10.#define
0460: 20 4d 41 58 5f 50 52 45 50 41 52 45 44 5f 53 54   MAX_PREPARED_ST
0470: 4d 54 53 20 31 30 30 0a 0a 2f 2a 0a 2a 2a 20 49  MTS 100../*.** I
0480: 66 20 54 43 4c 20 75 73 65 73 20 55 54 46 2d 38  f TCL uses UTF-8
0490: 20 61 6e 64 20 53 51 4c 69 74 65 20 69 73 20 63   and SQLite is c
04a0: 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73 65  onfigured to use
04b0: 20 69 73 6f 38 38 35 39 2c 20 74 68 65 6e 20 77   iso8859, then w
04c0: 65 0a 2a 2a 20 68 61 76 65 20 74 6f 20 64 6f 20  e.** have to do 
04d0: 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 77 68  a translation wh
04e0: 65 6e 20 67 6f 69 6e 67 20 62 65 74 77 65 65 6e  en going between
04f0: 20 74 68 65 20 74 77 6f 2e 20 20 53 65 74 20 74   the two.  Set t
0500: 68 65 20 0a 2a 2a 20 55 54 46 5f 54 52 41 4e 53  he .** UTF_TRANS
0510: 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 20 6d 61  LATION_NEEDED ma
0520: 63 72 6f 20 74 6f 20 69 6e 64 69 63 61 74 65 20  cro to indicate 
0530: 74 68 61 74 20 77 65 20 6e 65 65 64 20 74 6f 20  that we need to 
0540: 64 6f 0a 2a 2a 20 74 68 69 73 20 74 72 61 6e 73  do.** this trans
0550: 6c 61 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 23 69 66  lation.  .*/.#if
0560: 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 55 54 46   defined(TCL_UTF
0570: 5f 4d 41 58 29 20 26 26 20 21 64 65 66 69 6e 65  _MAX) && !define
0580: 64 28 53 51 4c 49 54 45 5f 55 54 46 38 29 0a 23  d(SQLITE_UTF8).#
0590: 20 64 65 66 69 6e 65 20 55 54 46 5f 54 52 41 4e   define UTF_TRAN
05a0: 53 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 20 31  SLATION_NEEDED 1
05b0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4e  .#endif../*.** N
05c0: 65 77 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73  ew SQL functions
05d0: 20 63 61 6e 20 62 65 20 63 72 65 61 74 65 64 20   can be created 
05e0: 61 73 20 54 43 4c 20 73 63 72 69 70 74 73 2e 20  as TCL scripts. 
05f0: 20 45 61 63 68 20 73 75 63 68 20 66 75 6e 63 74   Each such funct
0600: 69 6f 6e 0a 2a 2a 20 69 73 20 64 65 73 63 72 69  ion.** is descri
0610: 62 65 64 20 62 79 20 61 6e 20 69 6e 73 74 61 6e  bed by an instan
0620: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
0630: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ing structure..*
0640: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0650: 20 53 71 6c 46 75 6e 63 20 53 71 6c 46 75 6e 63   SqlFunc SqlFunc
0660: 3b 0a 73 74 72 75 63 74 20 53 71 6c 46 75 6e 63  ;.struct SqlFunc
0670: 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20   {.  Tcl_Interp 
0680: 2a 69 6e 74 65 72 70 3b 20 20 20 2f 2a 20 54 68  *interp;   /* Th
0690: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 20  e TCL interpret 
06a0: 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20 66  to execute the f
06b0: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
06c0: 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 20 20  _Obj *pScript;  
06d0: 20 20 20 2f 2a 20 54 68 65 20 54 63 6c 5f 4f 62     /* The Tcl_Ob
06e0: 6a 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  j representation
06f0: 20 6f 66 20 74 68 65 20 73 63 72 69 70 74 20 2a   of the script *
0700: 2f 0a 20 20 69 6e 74 20 75 73 65 45 76 61 6c 4f  /.  int useEvalO
0710: 62 6a 76 3b 20 20 20 20 20 20 2f 2a 20 54 72 75  bjv;      /* Tru
0720: 65 20 69 66 20 69 74 20 69 73 20 73 61 66 65 20  e if it is safe 
0730: 74 6f 20 75 73 65 20 54 63 6c 5f 45 76 61 6c 4f  to use Tcl_EvalO
0740: 62 6a 76 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  bjv */.  char *z
0750: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 2f  Name;          /
0760: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 69 73 20 66  * Name of this f
0770: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 53 71 6c  unction */.  Sql
0780: 46 75 6e 63 20 2a 70 4e 65 78 74 3b 20 20 20 20  Func *pNext;    
0790: 20 20 20 2f 2a 20 4e 65 78 74 20 66 75 6e 63 74     /* Next funct
07a0: 69 6f 6e 20 6f 6e 20 74 68 65 20 6c 69 73 74 20  ion on the list 
07b0: 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 7d  of them all */.}
07c0: 3b 0a 0a 2f 2a 0a 2a 2a 20 4e 65 77 20 63 6f 6c  ;../*.** New col
07d0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73  lation sequences
07e0: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 62 65   function can be
07f0: 20 63 72 65 61 74 65 64 20 61 73 20 54 43 4c 20   created as TCL 
0800: 73 63 72 69 70 74 73 2e 20 20 45 61 63 68 20 73  scripts.  Each s
0810: 75 63 68 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  uch.** function 
0820: 69 73 20 64 65 73 63 72 69 62 65 64 20 62 79 20  is described by 
0830: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
0840: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
0850: 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65 64  ucture..*/.typed
0860: 65 66 20 73 74 72 75 63 74 20 53 71 6c 43 6f 6c  ef struct SqlCol
0870: 6c 61 74 65 20 53 71 6c 43 6f 6c 6c 61 74 65 3b  late SqlCollate;
0880: 0a 73 74 72 75 63 74 20 53 71 6c 43 6f 6c 6c 61  .struct SqlColla
0890: 74 65 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72  te {.  Tcl_Inter
08a0: 70 20 2a 69 6e 74 65 72 70 3b 20 20 20 2f 2a 20  p *interp;   /* 
08b0: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
08c0: 74 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  t to execute the
08d0: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 63   function */.  c
08e0: 68 61 72 20 2a 7a 53 63 72 69 70 74 3b 20 20 20  har *zScript;   
08f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 63 72 69       /* The scri
0900: 70 74 20 74 6f 20 62 65 20 72 75 6e 20 2a 2f 0a  pt to be run */.
0910: 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 4e    SqlCollate *pN
0920: 65 78 74 3b 20 20 20 20 2f 2a 20 4e 65 78 74 20  ext;    /* Next 
0930: 66 75 6e 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  function on the 
0940: 6c 69 73 74 20 6f 66 20 74 68 65 6d 20 61 6c 6c  list of them all
0950: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72   */.};../*.** Pr
0960: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
0970: 73 20 61 72 65 20 63 61 63 68 65 64 20 66 6f 72  s are cached for
0980: 20 66 61 73 74 65 72 20 65 78 65 63 75 74 69 6f   faster executio
0990: 6e 2e 20 20 45 61 63 68 20 70 72 65 70 61 72 65  n.  Each prepare
09a0: 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 69  d.** statement i
09b0: 73 20 64 65 73 63 72 69 62 65 64 20 62 79 20 61  s described by a
09c0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
09d0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
09e0: 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65 64 65  cture..*/.typede
09f0: 66 20 73 74 72 75 63 74 20 53 71 6c 50 72 65 70  f struct SqlPrep
0a00: 61 72 65 64 53 74 6d 74 20 53 71 6c 50 72 65 70  aredStmt SqlPrep
0a10: 61 72 65 64 53 74 6d 74 3b 0a 73 74 72 75 63 74  aredStmt;.struct
0a20: 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74   SqlPreparedStmt
0a30: 20 7b 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64   {.  SqlPrepared
0a40: 53 74 6d 74 20 2a 70 4e 65 78 74 3b 20 20 2f 2a  Stmt *pNext;  /*
0a50: 20 4e 65 78 74 20 69 6e 20 6c 69 6e 6b 65 64 20   Next in linked 
0a60: 6c 69 73 74 20 2a 2f 0a 20 20 53 71 6c 50 72 65  list */.  SqlPre
0a70: 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65 76  paredStmt *pPrev
0a80: 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 6f  ;  /* Previous o
0a90: 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20  n the list */.  
0aa0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
0ab0: 74 6d 74 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  tmt;     /* The 
0ac0: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
0ad0: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 71 6c  nt */.  int nSql
0ae0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0af0: 20 2f 2a 20 63 68 61 72 73 20 69 6e 20 7a 53 71   /* chars in zSq
0b00: 6c 5b 5d 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  l[] */.  const c
0b10: 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20  har *zSql;      
0b20: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65    /* Text of the
0b30: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a   SQL statement *
0b40: 2f 0a 7d 3b 0a 0a 74 79 70 65 64 65 66 20 73 74  /.};..typedef st
0b50: 72 75 63 74 20 49 6e 63 72 62 6c 6f 62 43 68 61  ruct IncrblobCha
0b60: 6e 6e 65 6c 20 49 6e 63 72 62 6c 6f 62 43 68 61  nnel IncrblobCha
0b70: 6e 6e 65 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  nnel;../*.** The
0b80: 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e  re is one instan
0b90: 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  ce of this struc
0ba0: 74 75 72 65 20 66 6f 72 20 65 61 63 68 20 53 51  ture for each SQ
0bb0: 4c 69 74 65 20 64 61 74 61 62 61 73 65 0a 2a 2a  Lite database.**
0bc0: 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 6f   that has been o
0bd0: 70 65 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c  pened by the SQL
0be0: 69 74 65 20 54 43 4c 20 69 6e 74 65 72 66 61 63  ite TCL interfac
0bf0: 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  e..*/.typedef st
0c00: 72 75 63 74 20 53 71 6c 69 74 65 44 62 20 53 71  ruct SqliteDb Sq
0c10: 6c 69 74 65 44 62 3b 0a 73 74 72 75 63 74 20 53  liteDb;.struct S
0c20: 71 6c 69 74 65 44 62 20 7b 0a 20 20 73 71 6c 69  qliteDb {.  sqli
0c30: 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
0c40: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 72         /* The "r
0c50: 65 61 6c 22 20 64 61 74 61 62 61 73 65 20 73 74  eal" database st
0c60: 72 75 63 74 75 72 65 2e 20 4d 55 53 54 20 42 45  ructure. MUST BE
0c70: 20 46 49 52 53 54 20 2a 2f 0a 20 20 54 63 6c 5f   FIRST */.  Tcl_
0c80: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 20  Interp *interp; 
0c90: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
0ca0: 74 65 72 70 72 65 74 65 72 20 75 73 65 64 20 66  terpreter used f
0cb0: 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65  or this database
0cc0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 42 75 73   */.  char *zBus
0cd0: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
0ce0: 20 2f 2a 20 54 68 65 20 62 75 73 79 20 63 61 6c   /* The busy cal
0cf0: 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f  lback routine */
0d00: 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74  .  char *zCommit
0d10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
0d20: 20 54 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b   The commit hook
0d30: 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e   callback routin
0d40: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 72  e */.  char *zTr
0d50: 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
0d60: 20 20 2f 2a 20 54 68 65 20 74 72 61 63 65 20 63    /* The trace c
0d70: 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20  allback routine 
0d80: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 72 6f 66  */.  char *zProf
0d90: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
0da0: 2f 2a 20 54 68 65 20 70 72 6f 66 69 6c 65 20 63  /* The profile c
0db0: 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20  allback routine 
0dc0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 72 6f 67  */.  char *zProg
0dd0: 72 65 73 73 3b 20 20 20 20 20 20 20 20 20 20 20  ress;           
0de0: 2f 2a 20 54 68 65 20 70 72 6f 67 72 65 73 73 20  /* The progress 
0df0: 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65  callback routine
0e00: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 75 74   */.  char *zAut
0e10: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
0e20: 20 2f 2a 20 54 68 65 20 61 75 74 68 6f 72 69 7a   /* The authoriz
0e30: 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 20 72  ation callback r
0e40: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
0e50: 64 69 73 61 62 6c 65 41 75 74 68 3b 20 20 20 20  disableAuth;    
0e60: 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c         /* Disabl
0e70: 65 20 74 68 65 20 61 75 74 68 6f 72 69 7a 65 72  e the authorizer
0e80: 20 69 66 20 69 74 20 65 78 69 73 74 73 20 2a 2f   if it exists */
0e90: 0a 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c 3b 20  .  char *zNull; 
0ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0eb0: 20 54 65 78 74 20 74 6f 20 73 75 62 73 74 69 74   Text to substit
0ec0: 75 74 65 20 66 6f 72 20 61 6e 20 53 51 4c 20 4e  ute for an SQL N
0ed0: 55 4c 4c 20 76 61 6c 75 65 20 2a 2f 0a 20 20 53  ULL value */.  S
0ee0: 71 6c 46 75 6e 63 20 2a 70 46 75 6e 63 3b 20 20  qlFunc *pFunc;  
0ef0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
0f00: 74 20 6f 66 20 53 51 4c 20 66 75 6e 63 74 69 6f  t of SQL functio
0f10: 6e 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ns */.  Tcl_Obj 
0f20: 2a 70 55 70 64 61 74 65 48 6f 6f 6b 3b 20 20 20  *pUpdateHook;   
0f30: 20 20 20 2f 2a 20 55 70 64 61 74 65 20 68 6f 6f     /* Update hoo
0f40: 6b 20 73 63 72 69 70 74 20 28 69 66 20 61 6e 79  k script (if any
0f50: 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  ) */.  Tcl_Obj *
0f60: 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3b 20 20  pRollbackHook;  
0f70: 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 68 6f    /* Rollback ho
0f80: 6f 6b 20 73 63 72 69 70 74 20 28 69 66 20 61 6e  ok script (if an
0f90: 79 29 20 2a 2f 0a 20 20 53 71 6c 43 6f 6c 6c 61  y) */.  SqlColla
0fa0: 74 65 20 2a 70 43 6f 6c 6c 61 74 65 3b 20 20 20  te *pCollate;   
0fb0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 53 51     /* List of SQ
0fc0: 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63  L collation func
0fd0: 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 72  tions */.  int r
0fe0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
0ff0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1000: 63 6f 64 65 20 6f 66 20 6d 6f 73 74 20 72 65 63  code of most rec
1010: 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63  ent sqlite3_exec
1020: 28 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  () */.  Tcl_Obj 
1030: 2a 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 3b  *pCollateNeeded;
1040: 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20     /* Collation 
1050: 6e 65 65 64 65 64 20 73 63 72 69 70 74 20 2a 2f  needed script */
1060: 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74  .  SqlPreparedSt
1070: 6d 74 20 2a 73 74 6d 74 4c 69 73 74 3b 20 2f 2a  mt *stmtList; /*
1080: 20 4c 69 73 74 20 6f 66 20 70 72 65 70 61 72 65   List of prepare
1090: 64 20 73 74 61 74 65 6d 65 6e 74 73 2a 2f 0a 20  d statements*/. 
10a0: 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74   SqlPreparedStmt
10b0: 20 2a 73 74 6d 74 4c 61 73 74 3b 20 2f 2a 20 4c   *stmtLast; /* L
10c0: 61 73 74 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  ast statement in
10d0: 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69   the list */.  i
10e0: 6e 74 20 6d 61 78 53 74 6d 74 3b 20 20 20 20 20  nt maxStmt;     
10f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1100: 20 6e 65 78 74 20 6d 61 78 69 6d 75 6d 20 6e 75   next maximum nu
1110: 6d 62 65 72 20 6f 66 20 73 74 6d 74 4c 69 73 74  mber of stmtList
1120: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 74 6d 74 3b   */.  int nStmt;
1130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1140: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 74   /* Number of st
1150: 61 74 65 6d 65 6e 74 73 20 69 6e 20 73 74 6d 74  atements in stmt
1160: 4c 69 73 74 20 2a 2f 0a 20 20 49 6e 63 72 62 6c  List */.  Incrbl
1170: 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 49 6e 63 72  obChannel *pIncr
1180: 62 6c 6f 62 3b 2f 2a 20 4c 69 6e 6b 65 64 20 6c  blob;/* Linked l
1190: 69 73 74 20 6f 66 20 6f 70 65 6e 20 69 6e 63 72  ist of open incr
11a0: 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 73 20 2a 2f  blob channels */
11b0: 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 49 6e 63 72  .};..struct Incr
11c0: 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 7b 0a 20 20  blobChannel {.  
11d0: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42  sqlite3_blob *pB
11e0: 6c 6f 62 3b 20 20 20 20 20 20 2f 2a 20 73 71 6c  lob;      /* sql
11f0: 69 74 65 33 20 62 6c 6f 62 20 68 61 6e 64 6c 65  ite3 blob handle
1200: 20 2a 2f 0a 20 20 53 71 6c 69 74 65 44 62 20 2a   */.  SqliteDb *
1210: 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  pDb;            
1220: 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20 64 61  /* Associated da
1230: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1240: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65 65 6b  n */.  int iSeek
1250: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1260: 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 65 65 6b   /* Current seek
1270: 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 54 63 6c   offset */.  Tcl
1280: 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 6e 65 6c  _Channel channel
1290: 3b 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 6e 65  ;      /* Channe
12a0: 6c 20 69 64 65 6e 74 69 66 69 65 72 20 2a 2f 0a  l identifier */.
12b0: 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65    IncrblobChanne
12c0: 6c 20 2a 70 4e 65 78 74 3b 20 20 20 2f 2a 20 4c  l *pNext;   /* L
12d0: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 61 6c  inked list of al
12e0: 6c 20 6f 70 65 6e 20 69 6e 63 72 62 6c 6f 62 20  l open incrblob 
12f0: 63 68 61 6e 6e 65 6c 73 20 2a 2f 0a 20 20 49 6e  channels */.  In
1300: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70  crblobChannel *p
1310: 50 72 65 76 3b 20 20 20 2f 2a 20 4c 69 6e 6b 65  Prev;   /* Linke
1320: 64 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 6f 70  d list of all op
1330: 65 6e 20 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e  en incrblob chan
1340: 6e 65 6c 73 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 6e  nels */.};..#ifn
1350: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1360: 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 43  INCRBLOB./*.** C
1370: 6c 6f 73 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f  lose all incrblo
1380: 62 20 63 68 61 6e 6e 65 6c 73 20 6f 70 65 6e 65  b channels opene
1390: 64 20 75 73 69 6e 67 20 64 61 74 61 62 61 73 65  d using database
13a0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 44 62 2e   connection pDb.
13b0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c  .** This is call
13c0: 65 64 20 77 68 65 6e 20 73 68 75 74 74 69 6e 67  ed when shutting
13d0: 20 64 6f 77 6e 20 74 68 65 20 64 61 74 61 62 61   down the databa
13e0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
13f0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c  /.static void cl
1400: 6f 73 65 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  oseIncrblobChann
1410: 65 6c 73 28 53 71 6c 69 74 65 44 62 20 2a 70 44  els(SqliteDb *pD
1420: 62 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68  b){.  IncrblobCh
1430: 61 6e 6e 65 6c 20 2a 70 3b 0a 20 20 49 6e 63 72  annel *p;.  Incr
1440: 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 4e 65  blobChannel *pNe
1450: 78 74 3b 0a 0a 20 20 66 6f 72 28 70 3d 70 44 62  xt;..  for(p=pDb
1460: 2d 3e 70 49 6e 63 72 62 6c 6f 62 3b 20 70 3b 20  ->pIncrblob; p; 
1470: 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e  p=pNext){.    pN
1480: 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
1490: 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 43 61  .    /* Note: Ca
14a0: 6c 6c 69 6e 67 20 75 6e 72 65 67 69 73 74 65 72  lling unregister
14b0: 20 68 65 72 65 20 63 61 6c 6c 20 54 63 6c 5f 43   here call Tcl_C
14c0: 6c 6f 73 65 20 6f 6e 20 74 68 65 20 69 6e 63 72  lose on the incr
14d0: 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2c 20 0a 20  blob channel, . 
14e0: 20 20 20 2a 2a 20 77 68 69 63 68 20 64 65 6c 65     ** which dele
14f0: 74 65 73 20 74 68 65 20 49 6e 63 72 62 6c 6f 62  tes the Incrblob
1500: 43 68 61 6e 6e 65 6c 20 73 74 72 75 63 74 75 72  Channel structur
1510: 65 20 61 74 20 2a 70 2e 20 53 6f 20 64 6f 20 6e  e at *p. So do n
1520: 6f 74 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 54  ot.    ** call T
1530: 63 6c 5f 46 72 65 65 28 29 20 68 65 72 65 2e 0a  cl_Free() here..
1540: 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 55      */.    Tcl_U
1550: 6e 72 65 67 69 73 74 65 72 43 68 61 6e 6e 65 6c  nregisterChannel
1560: 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 2d  (pDb->interp, p-
1570: 3e 63 68 61 6e 6e 65 6c 29 3b 0a 20 20 7d 0a 7d  >channel);.  }.}
1580: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e  ../*.** Close an
1590: 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f   incremental blo
15a0: 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74  b channel..*/.st
15b0: 61 74 69 63 20 69 6e 74 20 69 6e 63 72 62 6c 6f  atic int incrblo
15c0: 62 43 6c 6f 73 65 28 43 6c 69 65 6e 74 44 61 74  bClose(ClientDat
15d0: 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20  a instanceData, 
15e0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
15f0: 72 70 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43  rp){.  IncrblobC
1600: 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28 49 6e 63  hannel *p = (Inc
1610: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 69  rblobChannel *)i
1620: 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 69  nstanceData;.  i
1630: 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  nt rc = sqlite3_
1640: 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 2d 3e 70 42  blob_close(p->pB
1650: 6c 6f 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 20  lob);.  sqlite3 
1660: 2a 64 62 20 3d 20 70 2d 3e 70 44 62 2d 3e 64 62  *db = p->pDb->db
1670: 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74  ;..  /* Remove t
1680: 68 65 20 63 68 61 6e 6e 65 6c 20 66 72 6f 6d 20  he channel from 
1690: 74 68 65 20 53 71 6c 69 74 65 44 62 2e 70 49 6e  the SqliteDb.pIn
16a0: 63 72 62 6c 6f 62 20 6c 69 73 74 2e 20 2a 2f 0a  crblob list. */.
16b0: 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
16c0: 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e  {.    p->pNext->
16d0: 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76  pPrev = p->pPrev
16e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
16f0: 50 72 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70  Prev ){.    p->p
1700: 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d  Prev->pNext = p-
1710: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  >pNext;.  }.  if
1720: 28 20 70 2d 3e 70 44 62 2d 3e 70 49 6e 63 72 62  ( p->pDb->pIncrb
1730: 6c 6f 62 3d 3d 70 20 29 7b 0a 20 20 20 20 70 2d  lob==p ){.    p-
1740: 3e 70 44 62 2d 3e 70 49 6e 63 72 62 6c 6f 62 20  >pDb->pIncrblob 
1750: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  = p->pNext;.  }.
1760: 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20 49  .  /* Free the I
1770: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 73  ncrblobChannel s
1780: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 54 63  tructure */.  Tc
1790: 6c 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 70  l_Free((char *)p
17a0: 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  );..  if( rc!=SQ
17b0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
17c0: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
17d0: 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c  erp, (char *)sql
17e0: 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c  ite3_errmsg(db),
17f0: 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a   TCL_VOLATILE);.
1800: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1810: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
1820: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1830: 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66 72  .** Read data fr
1840: 6f 6d 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  om an incrementa
1850: 6c 20 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a  l blob channel..
1860: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
1870: 63 72 62 6c 6f 62 49 6e 70 75 74 28 0a 20 20 43  crblobInput(.  C
1880: 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e  lientData instan
1890: 63 65 44 61 74 61 2c 20 0a 20 20 63 68 61 72 20  ceData, .  char 
18a0: 2a 62 75 66 2c 20 0a 20 20 69 6e 74 20 62 75 66  *buf, .  int buf
18b0: 53 69 7a 65 2c 0a 20 20 69 6e 74 20 2a 65 72 72  Size,.  int *err
18c0: 6f 72 43 6f 64 65 50 74 72 0a 29 7b 0a 20 20 49  orCodePtr.){.  I
18d0: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a  ncrblobChannel *
18e0: 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68 61  p = (IncrblobCha
18f0: 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e 63 65 44  nnel *)instanceD
1900: 61 74 61 3b 0a 20 20 69 6e 74 20 6e 52 65 61 64  ata;.  int nRead
1910: 20 3d 20 62 75 66 53 69 7a 65 3b 20 20 20 20 20   = bufSize;     
1920: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1930: 20 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a   bytes to read *
1940: 2f 0a 20 20 69 6e 74 20 6e 42 6c 6f 62 3b 20 20  /.  int nBlob;  
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1960: 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f   /* Total size o
1970: 66 20 74 68 65 20 62 6c 6f 62 20 2a 2f 0a 20 20  f the blob */.  
1980: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19a0: 73 71 6c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  sqlite error cod
19b0: 65 20 2a 2f 0a 0a 20 20 6e 42 6c 6f 62 20 3d 20  e */..  nBlob = 
19c0: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74  sqlite3_blob_byt
19d0: 65 73 28 70 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20  es(p->pBlob);.  
19e0: 69 66 28 20 28 70 2d 3e 69 53 65 65 6b 2b 6e 52  if( (p->iSeek+nR
19f0: 65 61 64 29 3e 6e 42 6c 6f 62 20 29 7b 0a 20 20  ead)>nBlob ){.  
1a00: 20 20 6e 52 65 61 64 20 3d 20 6e 42 6c 6f 62 2d    nRead = nBlob-
1a10: 70 2d 3e 69 53 65 65 6b 3b 0a 20 20 7d 0a 20 20  p->iSeek;.  }.  
1a20: 69 66 28 20 6e 52 65 61 64 3c 3d 30 20 29 7b 0a  if( nRead<=0 ){.
1a30: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1a40: 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  }..  rc = sqlite
1a50: 33 5f 62 6c 6f 62 5f 72 65 61 64 28 70 2d 3e 70  3_blob_read(p->p
1a60: 42 6c 6f 62 2c 20 28 76 6f 69 64 20 2a 29 62 75  Blob, (void *)bu
1a70: 66 2c 20 6e 52 65 61 64 2c 20 70 2d 3e 69 53 65  f, nRead, p->iSe
1a80: 65 6b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ek);.  if( rc!=S
1a90: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1aa0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20  *errorCodePtr = 
1ab0: 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d  rc;.    return -
1ac0: 31 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69 53 65  1;.  }..  p->iSe
1ad0: 65 6b 20 2b 3d 20 6e 52 65 61 64 3b 0a 20 20 72  ek += nRead;.  r
1ae0: 65 74 75 72 6e 20 6e 52 65 61 64 3b 0a 7d 0a 0a  eturn nRead;.}..
1af0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61  /*.** Write data
1b00: 20 74 6f 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74   to an increment
1b10: 61 6c 20 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e  al blob channel.
1b20: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
1b30: 6e 63 72 62 6c 6f 62 4f 75 74 70 75 74 28 0a 20  ncrblobOutput(. 
1b40: 20 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74   ClientData inst
1b50: 61 6e 63 65 44 61 74 61 2c 20 0a 20 20 43 4f 4e  anceData, .  CON
1b60: 53 54 20 63 68 61 72 20 2a 62 75 66 2c 20 0a 20  ST char *buf, . 
1b70: 20 69 6e 74 20 74 6f 57 72 69 74 65 2c 0a 20 20   int toWrite,.  
1b80: 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 74  int *errorCodePt
1b90: 72 0a 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43  r.){.  IncrblobC
1ba0: 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28 49 6e 63  hannel *p = (Inc
1bb0: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 69  rblobChannel *)i
1bc0: 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 69  nstanceData;.  i
1bd0: 6e 74 20 6e 57 72 69 74 65 20 3d 20 74 6f 57 72  nt nWrite = toWr
1be0: 69 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e  ite;        /* N
1bf0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
1c00: 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 69 6e 74  o write */.  int
1c10: 20 6e 42 6c 6f 62 3b 20 20 20 20 20 20 20 20 20   nBlob;         
1c20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
1c30: 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62  al size of the b
1c40: 6c 6f 62 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  lob */.  int rc;
1c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c60: 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 20        /* sqlite 
1c70: 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 0a 20  error code */.. 
1c80: 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33   nBlob = sqlite3
1c90: 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70  _blob_bytes(p->p
1ca0: 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20 28 70 2d  Blob);.  if( (p-
1cb0: 3e 69 53 65 65 6b 2b 6e 57 72 69 74 65 29 3e 6e  >iSeek+nWrite)>n
1cc0: 42 6c 6f 62 20 29 7b 0a 20 20 20 20 2a 65 72 72  Blob ){.    *err
1cd0: 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 49 4e 56  orCodePtr = EINV
1ce0: 41 4c 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d  AL;.    return -
1cf0: 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 57 72  1;.  }.  if( nWr
1d00: 69 74 65 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65  ite<=0 ){.    re
1d10: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 72  turn 0;.  }..  r
1d20: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
1d30: 5f 77 72 69 74 65 28 70 2d 3e 70 42 6c 6f 62 2c  _write(p->pBlob,
1d40: 20 28 76 6f 69 64 20 2a 29 62 75 66 2c 20 6e 57   (void *)buf, nW
1d50: 72 69 74 65 2c 20 70 2d 3e 69 53 65 65 6b 29 3b  rite, p->iSeek);
1d60: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1d70: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 65 72 72  E_OK ){.    *err
1d80: 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 49 4f 3b  orCodePtr = EIO;
1d90: 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .    return -1;.
1da0: 20 20 7d 0a 0a 20 20 70 2d 3e 69 53 65 65 6b 20    }..  p->iSeek 
1db0: 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20 72 65 74  += nWrite;.  ret
1dc0: 75 72 6e 20 6e 57 72 69 74 65 3b 0a 7d 0a 0a 2f  urn nWrite;.}../
1dd0: 2a 0a 2a 2a 20 53 65 65 6b 20 61 6e 20 69 6e 63  *.** Seek an inc
1de0: 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 68  remental blob ch
1df0: 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  annel..*/.static
1e00: 20 69 6e 74 20 69 6e 63 72 62 6c 6f 62 53 65 65   int incrblobSee
1e10: 6b 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  k(.  ClientData 
1e20: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 0a 20  instanceData, . 
1e30: 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c 0a 20 20   long offset,.  
1e40: 69 6e 74 20 73 65 65 6b 4d 6f 64 65 2c 0a 20 20  int seekMode,.  
1e50: 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 74  int *errorCodePt
1e60: 72 0a 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43  r.){.  IncrblobC
1e70: 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28 49 6e 63  hannel *p = (Inc
1e80: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 69  rblobChannel *)i
1e90: 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 0a 20 20  nstanceData;..  
1ea0: 73 77 69 74 63 68 28 20 73 65 65 6b 4d 6f 64 65  switch( seekMode
1eb0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 45 45   ){.    case SEE
1ec0: 4b 5f 53 45 54 3a 0a 20 20 20 20 20 20 70 2d 3e  K_SET:.      p->
1ed0: 69 53 65 65 6b 20 3d 20 6f 66 66 73 65 74 3b 0a  iSeek = offset;.
1ee0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1ef0: 20 63 61 73 65 20 53 45 45 4b 5f 43 55 52 3a 0a   case SEEK_CUR:.
1f00: 20 20 20 20 20 20 70 2d 3e 69 53 65 65 6b 20 2b        p->iSeek +
1f10: 3d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  = offset;.      
1f20: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1f30: 53 45 45 4b 5f 45 4e 44 3a 0a 20 20 20 20 20 20  SEEK_END:.      
1f40: 70 2d 3e 69 53 65 65 6b 20 3d 20 73 71 6c 69 74  p->iSeek = sqlit
1f50: 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d  e3_blob_bytes(p-
1f60: 3e 70 42 6c 6f 62 29 20 2b 20 6f 66 66 73 65 74  >pBlob) + offset
1f70: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
1f80: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73      default: ass
1f90: 65 72 74 28 21 22 42 61 64 20 73 65 65 6b 4d 6f  ert(!"Bad seekMo
1fa0: 64 65 22 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  de");.  }..  ret
1fb0: 75 72 6e 20 70 2d 3e 69 53 65 65 6b 3b 0a 7d 0a  urn p->iSeek;.}.
1fc0: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  ..static void in
1fd0: 63 72 62 6c 6f 62 57 61 74 63 68 28 43 6c 69 65  crblobWatch(Clie
1fe0: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44  ntData instanceD
1ff0: 61 74 61 2c 20 69 6e 74 20 6d 6f 64 65 29 7b 20  ata, int mode){ 
2000: 0a 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 20 0a  .  /* NO-OP */ .
2010: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63  }.static int inc
2020: 72 62 6c 6f 62 48 61 6e 64 6c 65 28 43 6c 69 65  rblobHandle(Clie
2030: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44  ntData instanceD
2040: 61 74 61 2c 20 69 6e 74 20 64 69 72 2c 20 43 6c  ata, int dir, Cl
2050: 69 65 6e 74 44 61 74 61 20 2a 68 50 74 72 29 7b  ientData *hPtr){
2060: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  .  return TCL_ER
2070: 52 4f 52 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 54  ROR;.}..static T
2080: 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20 49  cl_ChannelType I
2090: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 54 79  ncrblobChannelTy
20a0: 70 65 20 3d 20 7b 0a 20 20 22 69 6e 63 72 62 6c  pe = {.  "incrbl
20b0: 6f 62 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ob",            
20c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74              /* t
20d0: 79 70 65 4e 61 6d 65 20 20 20 20 20 20 20 20 20  ypeName         
20e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f0: 20 20 20 20 2a 2f 0a 20 20 54 43 4c 5f 43 48 41      */.  TCL_CHA
2100: 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 32 2c 20  NNEL_VERSION_2, 
2110: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 76              /* v
2120: 65 72 73 69 6f 6e 20 20 20 20 20 20 20 20 20 20  ersion          
2130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2140: 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f      */.  incrblo
2150: 62 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  bClose,         
2160: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63              /* c
2170: 6c 6f 73 65 50 72 6f 63 20 20 20 20 20 20 20 20  loseProc        
2180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2190: 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f      */.  incrblo
21a0: 62 49 6e 70 75 74 2c 20 20 20 20 20 20 20 20 20  bInput,         
21b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
21c0: 6e 70 75 74 50 72 6f 63 20 20 20 20 20 20 20 20  nputProc        
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e0: 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f      */.  incrblo
21f0: 62 4f 75 74 70 75 74 2c 20 20 20 20 20 20 20 20  bOutput,        
2200: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f              /* o
2210: 75 74 70 75 74 50 72 6f 63 20 20 20 20 20 20 20  utputProc       
2220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2230: 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f      */.  incrblo
2240: 62 53 65 65 6b 2c 20 20 20 20 20 20 20 20 20 20  bSeek,          
2250: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
2260: 65 65 6b 50 72 6f 63 20 20 20 20 20 20 20 20 20  eekProc         
2270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2280: 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20      */.  0,     
2290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
22b0: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 20 20 20  etOptionProc    
22c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d0: 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20      */.  0,     
22e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 67              /* g
2300: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 20 20 20  etOptionProc    
2310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2320: 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f      */.  incrblo
2330: 62 57 61 74 63 68 2c 20 20 20 20 20 20 20 20 20  bWatch,         
2340: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 77              /* w
2350: 61 74 63 68 50 72 6f 63 20 28 74 68 69 73 20 69  atchProc (this i
2360: 73 20 61 20 6e 6f 2d 6f 70 29 20 20 20 20 20 20  s a no-op)      
2370: 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f      */.  incrblo
2380: 62 48 61 6e 64 6c 65 2c 20 20 20 20 20 20 20 20  bHandle,        
2390: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 67              /* g
23a0: 65 74 48 61 6e 64 6c 65 50 72 6f 63 20 28 61 6c  etHandleProc (al
23b0: 77 61 79 73 20 72 65 74 75 72 6e 73 20 65 72 72  ways returns err
23c0: 6f 72 29 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  or) */.  0,     
23d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63              /* c
23f0: 6c 6f 73 65 32 50 72 6f 63 20 20 20 20 20 20 20  lose2Proc       
2400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2410: 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20      */.  0,     
2420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2430: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 62              /* b
2440: 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 20 20 20 20  lockModeProc    
2450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2460: 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20      */.  0,     
2470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2480: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
2490: 6c 75 73 68 50 72 6f 63 20 20 20 20 20 20 20 20  lushProc        
24a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b0: 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20      */.  0,     
24c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 68              /* h
24e0: 61 6e 64 6c 65 72 50 72 6f 63 20 20 20 20 20 20  andlerProc      
24f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2500: 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20      */.  0,     
2510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2520: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 77              /* w
2530: 69 64 65 53 65 65 6b 50 72 6f 63 20 20 20 20 20  ideSeekProc     
2540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2550: 20 20 20 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a      */.};../*.**
2560: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e   Create a new in
2570: 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a  crblob channel..
2580: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 72  */.static int cr
2590: 65 61 74 65 49 6e 63 72 62 6c 6f 62 43 68 61 6e  eateIncrblobChan
25a0: 6e 65 6c 28 0a 20 20 54 63 6c 5f 49 6e 74 65 72  nel(.  Tcl_Inter
25b0: 70 20 2a 69 6e 74 65 72 70 2c 20 0a 20 20 53 71  p *interp, .  Sq
25c0: 6c 69 74 65 44 62 20 2a 70 44 62 2c 20 0a 20 20  liteDb *pDb, .  
25d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c  const char *zDb,
25e0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
25f0: 54 61 62 6c 65 2c 20 0a 20 20 63 6f 6e 73 74 20  Table, .  const 
2600: 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 2c 20 0a  char *zColumn, .
2610: 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69    sqlite_int64 i
2620: 52 6f 77 2c 0a 20 20 69 6e 74 20 69 73 52 65 61  Row,.  int isRea
2630: 64 6f 6e 6c 79 0a 29 7b 0a 20 20 49 6e 63 72 62  donly.){.  Incrb
2640: 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 3b 0a 20  lobChannel *p;. 
2650: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
2660: 44 62 2d 3e 64 62 3b 0a 20 20 73 71 6c 69 74 65  Db->db;.  sqlite
2670: 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 3b 0a 20  3_blob *pBlob;. 
2680: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 66   int rc;.  int f
2690: 6c 61 67 73 20 3d 20 54 43 4c 5f 52 45 41 44 41  lags = TCL_READA
26a0: 42 4c 45 7c 28 69 73 52 65 61 64 6f 6e 6c 79 20  BLE|(isReadonly 
26b0: 3f 20 30 20 3a 20 54 43 4c 5f 57 52 49 54 41 42  ? 0 : TCL_WRITAB
26c0: 4c 45 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  LE);..  /* This 
26d0: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
26e0: 20 74 6f 20 6e 61 6d 65 20 74 68 65 20 63 68 61   to name the cha
26f0: 6e 6e 65 6c 73 3a 20 22 69 6e 63 72 62 6c 6f 62  nnels: "incrblob
2700: 5f 5b 69 6e 63 72 20 63 6f 75 6e 74 5d 22 20 2a  _[incr count]" *
2710: 2f 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 63  /.  static int c
2720: 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 63 68 61 72  ount = 0;.  char
2730: 20 7a 43 68 61 6e 6e 65 6c 5b 36 34 5d 3b 0a 0a   zChannel[64];..
2740: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
2750: 6c 6f 62 5f 6f 70 65 6e 28 64 62 2c 20 7a 44 62  lob_open(db, zDb
2760: 2c 20 7a 54 61 62 6c 65 2c 20 7a 43 6f 6c 75 6d  , zTable, zColum
2770: 6e 2c 20 69 52 6f 77 2c 20 21 69 73 52 65 61 64  n, iRow, !isRead
2780: 6f 6e 6c 79 2c 20 26 70 42 6c 6f 62 29 3b 0a 20  only, &pBlob);. 
2790: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
27a0: 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65  OK ){.    Tcl_Se
27b0: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
27c0: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
27d0: 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c  errmsg(pDb->db),
27e0: 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a   TCL_VOLATILE);.
27f0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2800: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d  RROR;.  }..  p =
2810: 20 28 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65   (IncrblobChanne
2820: 6c 20 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 73 69  l *)Tcl_Alloc(si
2830: 7a 65 6f 66 28 49 6e 63 72 62 6c 6f 62 43 68 61  zeof(IncrblobCha
2840: 6e 6e 65 6c 29 29 3b 0a 20 20 70 2d 3e 69 53 65  nnel));.  p->iSe
2850: 65 6b 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 42 6c  ek = 0;.  p->pBl
2860: 6f 62 20 3d 20 70 42 6c 6f 62 3b 0a 0a 20 20 73  ob = pBlob;..  s
2870: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2880: 73 69 7a 65 6f 66 28 7a 43 68 61 6e 6e 65 6c 29  sizeof(zChannel)
2890: 2c 20 7a 43 68 61 6e 6e 65 6c 2c 20 22 69 6e 63  , zChannel, "inc
28a0: 72 62 6c 6f 62 5f 25 64 22 2c 20 2b 2b 63 6f 75  rblob_%d", ++cou
28b0: 6e 74 29 3b 0a 20 20 70 2d 3e 63 68 61 6e 6e 65  nt);.  p->channe
28c0: 6c 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 43 68  l = Tcl_CreateCh
28d0: 61 6e 6e 65 6c 28 26 49 6e 63 72 62 6c 6f 62 43  annel(&IncrblobC
28e0: 68 61 6e 6e 65 6c 54 79 70 65 2c 20 7a 43 68 61  hannelType, zCha
28f0: 6e 6e 65 6c 2c 20 70 2c 20 66 6c 61 67 73 29 3b  nnel, p, flags);
2900: 0a 20 20 54 63 6c 5f 52 65 67 69 73 74 65 72 43  .  Tcl_RegisterC
2910: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 70  hannel(interp, p
2920: 2d 3e 63 68 61 6e 6e 65 6c 29 3b 0a 0a 20 20 2f  ->channel);..  /
2930: 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20 63  * Link the new c
2940: 68 61 6e 6e 65 6c 20 69 6e 74 6f 20 74 68 65 20  hannel into the 
2950: 53 71 6c 69 74 65 44 62 2e 70 49 6e 63 72 62 6c  SqliteDb.pIncrbl
2960: 6f 62 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 70 2d  ob list. */.  p-
2970: 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 70 49  >pNext = pDb->pI
2980: 6e 63 72 62 6c 6f 62 3b 0a 20 20 70 2d 3e 70 50  ncrblob;.  p->pP
2990: 72 65 76 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  rev = 0;.  if( p
29a0: 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70  ->pNext ){.    p
29b0: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
29c0: 20 70 3b 0a 20 20 7d 0a 20 20 70 44 62 2d 3e 70   p;.  }.  pDb->p
29d0: 49 6e 63 72 62 6c 6f 62 20 3d 20 70 3b 0a 20 20  Incrblob = p;.  
29e0: 70 2d 3e 70 44 62 20 3d 20 70 44 62 3b 0a 0a 20  p->pDb = pDb;.. 
29f0: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
2a00: 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 54  nterp, (char *)T
2a10: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
2a20: 65 28 70 2d 3e 63 68 61 6e 6e 65 6c 29 2c 20 54  e(p->channel), T
2a30: 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20  CL_VOLATILE);.  
2a40: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
2a50: 0a 23 65 6c 73 65 20 20 2f 2a 20 65 6c 73 65 20  .#else  /* else 
2a60: 63 6c 61 75 73 65 20 66 6f 72 20 22 23 69 66 6e  clause for "#ifn
2a70: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2a80: 49 4e 43 52 42 4c 4f 42 22 20 2a 2f 0a 20 20 23  INCRBLOB" */.  #
2a90: 64 65 66 69 6e 65 20 63 6c 6f 73 65 49 6e 63 72  define closeIncr
2aa0: 62 6c 6f 62 43 68 61 6e 6e 65 6c 73 28 70 44 62  blobChannels(pDb
2ab0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
2ac0: 4c 6f 6f 6b 20 61 74 20 74 68 65 20 73 63 72 69  Look at the scri
2ad0: 70 74 20 70 72 65 66 69 78 20 69 6e 20 70 43 6d  pt prefix in pCm
2ae0: 64 2e 20 20 57 65 20 77 69 6c 6c 20 62 65 20 65  d.  We will be e
2af0: 78 65 63 75 74 69 6e 67 20 74 68 69 73 20 73 63  xecuting this sc
2b00: 72 69 70 74 0a 2a 2a 20 61 66 74 65 72 20 66 69  ript.** after fi
2b10: 72 73 74 20 61 70 70 65 6e 64 69 6e 67 20 6f 6e  rst appending on
2b20: 65 20 6f 72 20 6d 6f 72 65 20 61 72 67 75 6d 65  e or more argume
2b30: 6e 74 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69  nts.  This routi
2b40: 6e 65 20 61 6e 61 6c 79 7a 65 73 0a 2a 2a 20 74  ne analyzes.** t
2b50: 68 65 20 73 63 72 69 70 74 20 74 6f 20 73 65 65  he script to see
2b60: 20 69 66 20 69 74 20 69 73 20 73 61 66 65 20 74   if it is safe t
2b70: 6f 20 75 73 65 20 54 63 6c 5f 45 76 61 6c 4f 62  o use Tcl_EvalOb
2b80: 6a 76 28 29 20 6f 6e 20 74 68 65 20 73 63 72 69  jv() on the scri
2b90: 70 74 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61  pt.** rather tha
2ba0: 6e 20 74 68 65 20 6d 6f 72 65 20 67 65 6e 65 72  n the more gener
2bb0: 61 6c 20 54 63 6c 5f 45 76 61 6c 45 78 28 29 2e  al Tcl_EvalEx().
2bc0: 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29    Tcl_EvalObjv()
2bd0: 20 69 73 20 6d 75 63 68 0a 2a 2a 20 66 61 73 74   is much.** fast
2be0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 63 72 69 70 74  er..**.** Script
2bf0: 73 20 74 68 61 74 20 61 72 65 20 73 61 66 65 20  s that are safe 
2c00: 74 6f 20 75 73 65 20 77 69 74 68 20 54 63 6c 5f  to use with Tcl_
2c10: 45 76 61 6c 4f 62 6a 76 28 29 20 63 6f 6e 73 69  EvalObjv() consi
2c20: 73 74 73 20 6f 66 20 61 0a 2a 2a 20 63 6f 6d 6d  sts of a.** comm
2c30: 61 6e 64 20 6e 61 6d 65 20 66 6f 6c 6c 6f 77 65  and name followe
2c40: 64 20 62 79 20 7a 65 72 6f 20 6f 72 20 6d 6f 72  d by zero or mor
2c50: 65 20 61 72 67 75 6d 65 6e 74 73 20 77 69 74 68  e arguments with
2c60: 20 6e 6f 20 5b 2e 2e 2e 5d 20 6f 72 20 24 0a 2a   no [...] or $.*
2c70: 2a 20 6f 72 20 7b 2e 2e 2e 7d 20 6f 72 20 3b 20  * or {...} or ; 
2c80: 74 6f 20 62 65 20 73 65 65 6e 20 61 6e 79 77 68  to be seen anywh
2c90: 65 72 65 2e 20 20 4d 6f 73 74 20 63 61 6c 6c 62  ere.  Most callb
2ca0: 61 63 6b 20 73 63 72 69 70 74 73 20 63 6f 6e 73  ack scripts cons
2cb0: 69 73 74 0a 2a 2a 20 6f 66 20 6a 75 73 74 20 61  ist.** of just a
2cc0: 20 73 69 6e 67 6c 65 20 70 72 6f 63 65 64 75 72   single procedur
2cd0: 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 79 20  e name and they 
2ce0: 6d 65 65 74 20 74 68 69 73 20 72 65 71 75 69 72  meet this requir
2cf0: 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ement..*/.static
2d00: 20 69 6e 74 20 73 61 66 65 54 6f 55 73 65 45 76   int safeToUseEv
2d10: 61 6c 4f 62 6a 76 28 54 63 6c 5f 49 6e 74 65 72  alObjv(Tcl_Inter
2d20: 70 20 2a 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f  p *interp, Tcl_O
2d30: 62 6a 20 2a 70 43 6d 64 29 7b 0a 20 20 2f 2a 20  bj *pCmd){.  /* 
2d40: 57 65 20 63 6f 75 6c 64 20 74 72 79 20 74 6f 20  We could try to 
2d50: 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77 69 74  do something wit
2d60: 68 20 54 63 6c 5f 50 61 72 73 65 28 29 2e 20 20  h Tcl_Parse().  
2d70: 42 75 74 20 77 65 20 77 69 6c 6c 20 69 6e 73 74  But we will inst
2d80: 65 61 64 0a 20 20 2a 2a 20 6a 75 73 74 20 64 6f  ead.  ** just do
2d90: 20 61 20 73 65 61 72 63 68 20 66 6f 72 20 66 6f   a search for fo
2da0: 72 62 69 64 64 65 6e 20 63 68 61 72 61 63 74 65  rbidden characte
2db0: 72 73 2e 20 20 49 66 20 61 6e 79 20 6f 66 20 74  rs.  If any of t
2dc0: 68 65 20 66 6f 72 62 69 64 64 65 6e 0a 20 20 2a  he forbidden.  *
2dd0: 2a 20 63 68 61 72 61 63 74 65 72 73 20 61 70 70  * characters app
2de0: 65 61 72 20 69 6e 20 70 43 6d 64 2c 20 77 65 20  ear in pCmd, we 
2df0: 77 69 6c 6c 20 72 65 70 6f 72 74 20 74 68 65 20  will report the 
2e00: 73 74 72 69 6e 67 20 61 73 20 75 6e 73 61 66 65  string as unsafe
2e10: 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ..  */.  const c
2e20: 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 3b  har *z;.  int n;
2e30: 0a 20 20 7a 20 3d 20 54 63 6c 5f 47 65 74 53 74  .  z = Tcl_GetSt
2e40: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 43 6d 64  ringFromObj(pCmd
2e50: 2c 20 26 6e 29 3b 0a 20 20 77 68 69 6c 65 28 20  , &n);.  while( 
2e60: 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 69  n-- > 0 ){.    i
2e70: 6e 74 20 63 20 3d 20 2a 28 7a 2b 2b 29 3b 0a 20  nt c = *(z++);. 
2e80: 20 20 20 69 66 28 20 63 3d 3d 27 24 27 20 7c 7c     if( c=='$' ||
2e90: 20 63 3d 3d 27 5b 27 20 7c 7c 20 63 3d 3d 27 3b   c=='[' || c==';
2ea0: 27 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ' ) return 0;.  
2eb0: 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
2ec0: 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 6e 20 53  ./*.** Find an S
2ed0: 71 6c 46 75 6e 63 20 73 74 72 75 63 74 75 72 65  qlFunc structure
2ee0: 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
2ef0: 6e 61 6d 65 2e 20 20 4f 72 20 63 72 65 61 74 65  name.  Or create
2f00: 20 61 20 6e 65 77 0a 2a 2a 20 6f 6e 65 20 69 66   a new.** one if
2f10: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6f 6e 65   an existing one
2f20: 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
2f30: 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
2f40: 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73 74  ter to the.** st
2f50: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
2f60: 69 63 20 53 71 6c 46 75 6e 63 20 2a 66 69 6e 64  ic SqlFunc *find
2f70: 53 71 6c 46 75 6e 63 28 53 71 6c 69 74 65 44 62  SqlFunc(SqliteDb
2f80: 20 2a 70 44 62 2c 20 63 6f 6e 73 74 20 63 68 61   *pDb, const cha
2f90: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 53 71 6c  r *zName){.  Sql
2fa0: 46 75 6e 63 20 2a 70 2c 20 2a 70 4e 65 77 3b 0a  Func *p, *pNew;.
2fb0: 20 20 69 6e 74 20 69 3b 0a 20 20 70 4e 65 77 20    int i;.  pNew 
2fc0: 3d 20 28 53 71 6c 46 75 6e 63 2a 29 54 63 6c 5f  = (SqlFunc*)Tcl_
2fd0: 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  Alloc( sizeof(*p
2fe0: 4e 65 77 29 20 2b 20 73 74 72 6c 65 6e 28 7a 4e  New) + strlen(zN
2ff0: 61 6d 65 29 20 2b 20 31 20 29 3b 0a 20 20 70 4e  ame) + 1 );.  pN
3000: 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61  ew->zName = (cha
3010: 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 66  r*)&pNew[1];.  f
3020: 6f 72 28 69 3d 30 3b 20 7a 4e 61 6d 65 5b 69 5d  or(i=0; zName[i]
3030: 3b 20 69 2b 2b 29 7b 20 70 4e 65 77 2d 3e 7a 4e  ; i++){ pNew->zN
3040: 61 6d 65 5b 69 5d 20 3d 20 74 6f 6c 6f 77 65 72  ame[i] = tolower
3050: 28 7a 4e 61 6d 65 5b 69 5d 29 3b 20 7d 0a 20 20  (zName[i]); }.  
3060: 70 4e 65 77 2d 3e 7a 4e 61 6d 65 5b 69 5d 20 3d  pNew->zName[i] =
3070: 20 30 3b 0a 20 20 66 6f 72 28 70 3d 70 44 62 2d   0;.  for(p=pDb-
3080: 3e 70 46 75 6e 63 3b 20 70 3b 20 70 3d 70 2d 3e  >pFunc; p; p=p->
3090: 70 4e 65 78 74 29 7b 20 0a 20 20 20 20 69 66 28  pNext){ .    if(
30a0: 20 73 74 72 63 6d 70 28 70 2d 3e 7a 4e 61 6d 65   strcmp(p->zName
30b0: 2c 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 29 3d 3d  , pNew->zName)==
30c0: 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 46  0 ){.      Tcl_F
30d0: 72 65 65 28 28 63 68 61 72 2a 29 70 4e 65 77 29  ree((char*)pNew)
30e0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  ;.      return p
30f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e  ;.    }.  }.  pN
3100: 65 77 2d 3e 69 6e 74 65 72 70 20 3d 20 70 44 62  ew->interp = pDb
3110: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 70 4e 65 77  ->interp;.  pNew
3120: 2d 3e 70 53 63 72 69 70 74 20 3d 20 30 3b 0a 20  ->pScript = 0;. 
3130: 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70   pNew->pNext = p
3140: 44 62 2d 3e 70 46 75 6e 63 3b 0a 20 20 70 44 62  Db->pFunc;.  pDb
3150: 2d 3e 70 46 75 6e 63 20 3d 20 70 4e 65 77 3b 0a  ->pFunc = pNew;.
3160: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
3170: 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 61 6c 69 7a 65  ../*.** Finalize
3180: 20 61 6e 64 20 66 72 65 65 20 61 20 6c 69 73 74   and free a list
3190: 20 6f 66 20 70 72 65 70 61 72 65 64 20 73 74 61   of prepared sta
31a0: 74 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69  tements.*/.stati
31b0: 63 20 76 6f 69 64 20 66 6c 75 73 68 53 74 6d 74  c void flushStmt
31c0: 43 61 63 68 65 28 20 53 71 6c 69 74 65 44 62 20  Cache( SqliteDb 
31d0: 2a 70 44 62 20 29 7b 0a 20 20 53 71 6c 50 72 65  *pDb ){.  SqlPre
31e0: 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65 53  paredStmt *pPreS
31f0: 74 6d 74 3b 0a 0a 20 20 77 68 69 6c 65 28 20 20  tmt;..  while(  
3200: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 29 7b  pDb->stmtList ){
3210: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
3220: 61 6c 69 7a 65 28 20 70 44 62 2d 3e 73 74 6d 74  alize( pDb->stmt
3230: 4c 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20  List->pStmt );. 
3240: 20 20 20 70 50 72 65 53 74 6d 74 20 3d 20 70 44     pPreStmt = pD
3250: 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 0a 20 20 20  b->stmtList;.   
3260: 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d   pDb->stmtList =
3270: 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 2d 3e   pDb->stmtList->
3280: 70 4e 65 78 74 3b 0a 20 20 20 20 54 63 6c 5f 46  pNext;.    Tcl_F
3290: 72 65 65 28 20 28 63 68 61 72 2a 29 70 50 72 65  ree( (char*)pPre
32a0: 53 74 6d 74 20 29 3b 0a 20 20 7d 0a 20 20 70 44  Stmt );.  }.  pD
32b0: 62 2d 3e 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  b->nStmt = 0;.  
32c0: 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20  pDb->stmtLast = 
32d0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 43 4c 20  0;.}../*.** TCL 
32e0: 63 61 6c 6c 73 20 74 68 69 73 20 70 72 6f 63 65  calls this proce
32f0: 64 75 72 65 20 77 68 65 6e 20 61 6e 20 73 71 6c  dure when an sql
3300: 69 74 65 33 20 64 61 74 61 62 61 73 65 20 63 6f  ite3 database co
3310: 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 64 65 6c 65  mmand is.** dele
3320: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ted..*/.static v
3330: 6f 69 64 20 44 62 44 65 6c 65 74 65 43 6d 64 28  oid DbDeleteCmd(
3340: 76 6f 69 64 20 2a 64 62 29 7b 0a 20 20 53 71 6c  void *db){.  Sql
3350: 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71  iteDb *pDb = (Sq
3360: 6c 69 74 65 44 62 2a 29 64 62 3b 0a 20 20 66 6c  liteDb*)db;.  fl
3370: 75 73 68 53 74 6d 74 43 61 63 68 65 28 70 44 62  ushStmtCache(pDb
3380: 29 3b 0a 20 20 63 6c 6f 73 65 49 6e 63 72 62 6c  );.  closeIncrbl
3390: 6f 62 43 68 61 6e 6e 65 6c 73 28 70 44 62 29 3b  obChannels(pDb);
33a0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  .  sqlite3_close
33b0: 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20 77 68 69  (pDb->db);.  whi
33c0: 6c 65 28 20 70 44 62 2d 3e 70 46 75 6e 63 20 29  le( pDb->pFunc )
33d0: 7b 0a 20 20 20 20 53 71 6c 46 75 6e 63 20 2a 70  {.    SqlFunc *p
33e0: 46 75 6e 63 20 3d 20 70 44 62 2d 3e 70 46 75 6e  Func = pDb->pFun
33f0: 63 3b 0a 20 20 20 20 70 44 62 2d 3e 70 46 75 6e  c;.    pDb->pFun
3400: 63 20 3d 20 70 46 75 6e 63 2d 3e 70 4e 65 78 74  c = pFunc->pNext
3410: 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  ;.    Tcl_DecrRe
3420: 66 43 6f 75 6e 74 28 70 46 75 6e 63 2d 3e 70 53  fCount(pFunc->pS
3430: 63 72 69 70 74 29 3b 0a 20 20 20 20 54 63 6c 5f  cript);.    Tcl_
3440: 46 72 65 65 28 28 63 68 61 72 2a 29 70 46 75 6e  Free((char*)pFun
3450: 63 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28  c);.  }.  while(
3460: 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20 29   pDb->pCollate )
3470: 7b 0a 20 20 20 20 53 71 6c 43 6f 6c 6c 61 74 65  {.    SqlCollate
3480: 20 2a 70 43 6f 6c 6c 61 74 65 20 3d 20 70 44 62   *pCollate = pDb
3490: 2d 3e 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20  ->pCollate;.    
34a0: 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20 3d 20  pDb->pCollate = 
34b0: 70 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78 74 3b  pCollate->pNext;
34c0: 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63  .    Tcl_Free((c
34d0: 68 61 72 2a 29 70 43 6f 6c 6c 61 74 65 29 3b 0a  har*)pCollate);.
34e0: 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a    }.  if( pDb->z
34f0: 42 75 73 79 20 29 7b 0a 20 20 20 20 54 63 6c 5f  Busy ){.    Tcl_
3500: 46 72 65 65 28 70 44 62 2d 3e 7a 42 75 73 79 29  Free(pDb->zBusy)
3510: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d  ;.  }.  if( pDb-
3520: 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20 20 20 54  >zTrace ){.    T
3530: 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 54 72  cl_Free(pDb->zTr
3540: 61 63 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ace);.  }.  if( 
3550: 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b  pDb->zProfile ){
3560: 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44  .    Tcl_Free(pD
3570: 62 2d 3e 7a 50 72 6f 66 69 6c 65 29 3b 0a 20 20  b->zProfile);.  
3580: 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75  }.  if( pDb->zAu
3590: 74 68 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72  th ){.    Tcl_Fr
35a0: 65 65 28 70 44 62 2d 3e 7a 41 75 74 68 29 3b 0a  ee(pDb->zAuth);.
35b0: 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a    }.  if( pDb->z
35c0: 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 54 63 6c 5f  Null ){.    Tcl_
35d0: 46 72 65 65 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29  Free(pDb->zNull)
35e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d  ;.  }.  if( pDb-
35f0: 3e 70 55 70 64 61 74 65 48 6f 6f 6b 20 29 7b 0a  >pUpdateHook ){.
3600: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
3610: 6f 75 6e 74 28 70 44 62 2d 3e 70 55 70 64 61 74  ount(pDb->pUpdat
3620: 65 48 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20 69 66  eHook);.  }.  if
3630: 28 20 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b  ( pDb->pRollback
3640: 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  Hook ){.    Tcl_
3650: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62  DecrRefCount(pDb
3660: 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 29  ->pRollbackHook)
3670: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d  ;.  }.  if( pDb-
3680: 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 20  >pCollateNeeded 
3690: 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52  ){.    Tcl_DecrR
36a0: 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f  efCount(pDb->pCo
36b0: 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20  llateNeeded);.  
36c0: 7d 0a 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68  }.  Tcl_Free((ch
36d0: 61 72 2a 29 70 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a  ar*)pDb);.}../*.
36e0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
36f0: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
3700: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
3710: 73 20 6c 6f 63 6b 65 64 20 77 68 69 6c 65 20 74  s locked while t
3720: 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 65 78 65 63  rying.** to exec
3730: 75 74 65 20 53 51 4c 2e 0a 2a 2f 0a 73 74 61 74  ute SQL..*/.stat
3740: 69 63 20 69 6e 74 20 44 62 42 75 73 79 48 61 6e  ic int DbBusyHan
3750: 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 2c 20 69  dler(void *cd, i
3760: 6e 74 20 6e 54 72 69 65 73 29 7b 0a 20 20 53 71  nt nTries){.  Sq
3770: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
3780: 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69  qliteDb*)cd;.  i
3790: 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 56  nt rc;.  char zV
37a0: 61 6c 5b 33 30 5d 3b 0a 0a 20 20 73 71 6c 69 74  al[30];..  sqlit
37b0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
37c0: 6f 66 28 7a 56 61 6c 29 2c 20 7a 56 61 6c 2c 20  of(zVal), zVal, 
37d0: 22 25 64 22 2c 20 6e 54 72 69 65 73 29 3b 0a 20  "%d", nTries);. 
37e0: 20 72 63 20 3d 20 54 63 6c 5f 56 61 72 45 76 61   rc = Tcl_VarEva
37f0: 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70  l(pDb->interp, p
3800: 44 62 2d 3e 7a 42 75 73 79 2c 20 22 20 22 2c 20  Db->zBusy, " ", 
3810: 7a 56 61 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b  zVal, (char*)0);
3820: 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f  .  if( rc!=TCL_O
3830: 4b 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65  K || atoi(Tcl_Ge
3840: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44  tStringResult(pD
3850: 62 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a 20  b->interp)) ){. 
3860: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
3870: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
3880: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
3890: 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c  MIT_PROGRESS_CAL
38a0: 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73  LBACK./*.** This
38b0: 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f   routine is invo
38c0: 6b 65 64 20 61 73 20 74 68 65 20 27 70 72 6f 67  ked as the 'prog
38d0: 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 27 20 66  ress callback' f
38e0: 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  or the database.
38f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44  .*/.static int D
3900: 62 50 72 6f 67 72 65 73 73 48 61 6e 64 6c 65 72  bProgressHandler
3910: 28 76 6f 69 64 20 2a 63 64 29 7b 0a 20 20 53 71  (void *cd){.  Sq
3920: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
3930: 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69  qliteDb*)cd;.  i
3940: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
3950: 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73  ( pDb->zProgress
3960: 20 29 3b 0a 20 20 72 63 20 3d 20 54 63 6c 5f 45   );.  rc = Tcl_E
3970: 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  val(pDb->interp,
3980: 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 29   pDb->zProgress)
3990: 3b 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f  ;.  if( rc!=TCL_
39a0: 4f 4b 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47  OK || atoi(Tcl_G
39b0: 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70  etStringResult(p
39c0: 44 62 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a  Db->interp)) ){.
39d0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
39e0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
39f0: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
3a00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
3a10: 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E./*.** This rou
3a20: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
3a30: 79 20 74 68 65 20 53 51 4c 69 74 65 20 74 72 61  y the SQLite tra
3a40: 63 65 20 68 61 6e 64 6c 65 72 20 77 68 65 6e 65  ce handler whene
3a50: 76 65 72 20 61 20 6e 65 77 0a 2a 2a 20 62 6c 6f  ver a new.** blo
3a60: 63 6b 20 6f 66 20 53 51 4c 20 69 73 20 65 78 65  ck of SQL is exe
3a70: 63 75 74 65 64 2e 20 20 54 68 65 20 54 43 4c 20  cuted.  The TCL 
3a80: 73 63 72 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a  script in pDb->z
3a90: 54 72 61 63 65 20 69 73 20 65 78 65 63 75 74 65  Trace is execute
3aa0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
3ab0: 64 20 44 62 54 72 61 63 65 48 61 6e 64 6c 65 72  d DbTraceHandler
3ac0: 28 76 6f 69 64 20 2a 63 64 2c 20 63 6f 6e 73 74  (void *cd, const
3ad0: 20 63 68 61 72 20 2a 7a 53 71 6c 29 7b 0a 20 20   char *zSql){.  
3ae0: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
3af0: 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20  (SqliteDb*)cd;. 
3b00: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72   Tcl_DString str
3b10: 3b 0a 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  ;..  Tcl_DString
3b20: 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 54 63  Init(&str);.  Tc
3b30: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28  l_DStringAppend(
3b40: 26 73 74 72 2c 20 70 44 62 2d 3e 7a 54 72 61 63  &str, pDb->zTrac
3b50: 65 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53  e, -1);.  Tcl_DS
3b60: 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65  tringAppendEleme
3b70: 6e 74 28 26 73 74 72 2c 20 7a 53 71 6c 29 3b 0a  nt(&str, zSql);.
3b80: 20 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e    Tcl_Eval(pDb->
3b90: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53 74 72  interp, Tcl_DStr
3ba0: 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29 29 3b  ingValue(&str));
3bb0: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72  .  Tcl_DStringFr
3bc0: 65 65 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f  ee(&str);.  Tcl_
3bd0: 52 65 73 65 74 52 65 73 75 6c 74 28 70 44 62 2d  ResetResult(pDb-
3be0: 3e 69 6e 74 65 72 70 29 3b 0a 7d 0a 23 65 6e 64  >interp);.}.#end
3bf0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
3c00: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a  TE_OMIT_TRACE./*
3c10: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
3c20: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
3c30: 65 20 53 51 4c 69 74 65 20 70 72 6f 66 69 6c 65  e SQLite profile
3c40: 20 68 61 6e 64 6c 65 72 20 61 66 74 65 72 20 61   handler after a
3c50: 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 53 51   statement.** SQ
3c60: 4c 20 68 61 73 20 65 78 65 63 75 74 65 64 2e 20  L has executed. 
3c70: 20 54 68 65 20 54 43 4c 20 73 63 72 69 70 74 20   The TCL script 
3c80: 69 6e 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65  in pDb->zProfile
3c90: 20 69 73 20 65 76 61 6c 75 61 74 65 64 2e 0a 2a   is evaluated..*
3ca0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44 62  /.static void Db
3cb0: 50 72 6f 66 69 6c 65 48 61 6e 64 6c 65 72 28 76  ProfileHandler(v
3cc0: 6f 69 64 20 2a 63 64 2c 20 63 6f 6e 73 74 20 63  oid *cd, const c
3cd0: 68 61 72 20 2a 7a 53 71 6c 2c 20 73 71 6c 69 74  har *zSql, sqlit
3ce0: 65 5f 75 69 6e 74 36 34 20 74 6d 29 7b 0a 20 20  e_uint64 tm){.  
3cf0: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
3d00: 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20  (SqliteDb*)cd;. 
3d10: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72   Tcl_DString str
3d20: 3b 0a 20 20 63 68 61 72 20 7a 54 6d 5b 31 30 30  ;.  char zTm[100
3d30: 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  ];..  sqlite3_sn
3d40: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 54  printf(sizeof(zT
3d50: 6d 29 2d 31 2c 20 7a 54 6d 2c 20 22 25 6c 6c 64  m)-1, zTm, "%lld
3d60: 22 2c 20 74 6d 29 3b 0a 20 20 54 63 6c 5f 44 53  ", tm);.  Tcl_DS
3d70: 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b  tringInit(&str);
3d80: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70  .  Tcl_DStringAp
3d90: 70 65 6e 64 28 26 73 74 72 2c 20 70 44 62 2d 3e  pend(&str, pDb->
3da0: 7a 50 72 6f 66 69 6c 65 2c 20 2d 31 29 3b 0a 20  zProfile, -1);. 
3db0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
3dc0: 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20  ndElement(&str, 
3dd0: 7a 53 71 6c 29 3b 0a 20 20 54 63 6c 5f 44 53 74  zSql);.  Tcl_DSt
3de0: 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e  ringAppendElemen
3df0: 74 28 26 73 74 72 2c 20 7a 54 6d 29 3b 0a 20 20  t(&str, zTm);.  
3e00: 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e  Tcl_Eval(pDb->in
3e10: 74 65 72 70 2c 20 54 63 6c 5f 44 53 74 72 69 6e  terp, Tcl_DStrin
3e20: 67 56 61 6c 75 65 28 26 73 74 72 29 29 3b 0a 20  gValue(&str));. 
3e30: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
3e40: 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f 52 65  (&str);.  Tcl_Re
3e50: 73 65 74 52 65 73 75 6c 74 28 70 44 62 2d 3e 69  setResult(pDb->i
3e60: 6e 74 65 72 70 29 3b 0a 7d 0a 23 65 6e 64 69 66  nterp);.}.#endif
3e70: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
3e80: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
3e90: 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hen a transactio
3ea0: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 20  n is committed. 
3eb0: 20 54 68 65 0a 2a 2a 20 54 43 4c 20 73 63 72 69   The.** TCL scri
3ec0: 70 74 20 69 6e 20 70 44 62 2d 3e 7a 43 6f 6d 6d  pt in pDb->zComm
3ed0: 69 74 20 69 73 20 65 78 65 63 75 74 65 64 2e 20  it is executed. 
3ee0: 20 49 66 20 69 74 20 72 65 74 75 72 6e 73 20 6e   If it returns n
3ef0: 6f 6e 2d 7a 65 72 6f 20 6f 72 0a 2a 2a 20 69 66  on-zero or.** if
3f00: 20 69 74 20 74 68 72 6f 77 73 20 61 6e 20 65 78   it throws an ex
3f10: 63 65 70 74 69 6f 6e 2c 20 74 68 65 20 74 72 61  ception, the tra
3f20: 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
3f30: 65 64 20 62 61 63 6b 20 69 6e 73 74 65 61 64 0a  ed back instead.
3f40: 2a 2a 20 6f 66 20 62 65 69 6e 67 20 63 6f 6d 6d  ** of being comm
3f50: 69 74 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  itted..*/.static
3f60: 20 69 6e 74 20 44 62 43 6f 6d 6d 69 74 48 61 6e   int DbCommitHan
3f70: 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 29 7b 0a  dler(void *cd){.
3f80: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
3f90: 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b  = (SqliteDb*)cd;
3fa0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63  .  int rc;..  rc
3fb0: 20 3d 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d   = Tcl_Eval(pDb-
3fc0: 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 43  >interp, pDb->zC
3fd0: 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63  ommit);.  if( rc
3fe0: 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69  !=TCL_OK || atoi
3ff0: 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65  (Tcl_GetStringRe
4000: 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70  sult(pDb->interp
4010: 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  )) ){.    return
4020: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
4030: 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f   0;.}..static vo
4040: 69 64 20 44 62 52 6f 6c 6c 62 61 63 6b 48 61 6e  id DbRollbackHan
4050: 64 6c 65 72 28 76 6f 69 64 20 2a 63 6c 69 65 6e  dler(void *clien
4060: 74 44 61 74 61 29 7b 0a 20 20 53 71 6c 69 74 65  tData){.  Sqlite
4070: 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74  Db *pDb = (Sqlit
4080: 65 44 62 2a 29 63 6c 69 65 6e 74 44 61 74 61 3b  eDb*)clientData;
4090: 0a 20 20 61 73 73 65 72 74 28 70 44 62 2d 3e 70  .  assert(pDb->p
40a0: 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 29 3b 0a 20  RollbackHook);. 
40b0: 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c   if( TCL_OK!=Tcl
40c0: 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e  _EvalObjEx(pDb->
40d0: 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 70 52 6f  interp, pDb->pRo
40e0: 6c 6c 62 61 63 6b 48 6f 6f 6b 2c 20 30 29 20 29  llbackHook, 0) )
40f0: 7b 0a 20 20 20 20 54 63 6c 5f 42 61 63 6b 67 72  {.    Tcl_Backgr
4100: 6f 75 6e 64 45 72 72 6f 72 28 70 44 62 2d 3e 69  oundError(pDb->i
4110: 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 73  nterp);.  }.}..s
4120: 74 61 74 69 63 20 76 6f 69 64 20 44 62 55 70 64  tatic void DbUpd
4130: 61 74 65 48 61 6e 64 6c 65 72 28 0a 20 20 76 6f  ateHandler(.  vo
4140: 69 64 20 2a 70 2c 20 0a 20 20 69 6e 74 20 6f 70  id *p, .  int op
4150: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
4160: 7a 44 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68  zDb, .  const ch
4170: 61 72 20 2a 7a 54 62 6c 2c 20 0a 20 20 73 71 6c  ar *zTbl, .  sql
4180: 69 74 65 5f 69 6e 74 36 34 20 72 6f 77 69 64 0a  ite_int64 rowid.
4190: 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  ){.  SqliteDb *p
41a0: 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 20 2a  Db = (SqliteDb *
41b0: 29 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  )p;.  Tcl_Obj *p
41c0: 43 6d 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Cmd;..  assert( 
41d0: 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b  pDb->pUpdateHook
41e0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
41f0: 3d 3d 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 20  ==SQLITE_INSERT 
4200: 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 55 50  || op==SQLITE_UP
4210: 44 41 54 45 20 7c 7c 20 6f 70 3d 3d 53 51 4c 49  DATE || op==SQLI
4220: 54 45 5f 44 45 4c 45 54 45 20 29 3b 0a 0a 20 20  TE_DELETE );..  
4230: 70 43 6d 64 20 3d 20 54 63 6c 5f 44 75 70 6c 69  pCmd = Tcl_Dupli
4240: 63 61 74 65 4f 62 6a 28 70 44 62 2d 3e 70 55 70  cateObj(pDb->pUp
4250: 64 61 74 65 48 6f 6f 6b 29 3b 0a 20 20 54 63 6c  dateHook);.  Tcl
4260: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43  _IncrRefCount(pC
4270: 6d 64 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  md);.  Tcl_ListO
4280: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
4290: 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77  0, pCmd, Tcl_New
42a0: 53 74 72 69 6e 67 4f 62 6a 28 0a 20 20 20 20 28  StringObj(.    (
42b0: 20 28 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 53   (op==SQLITE_INS
42c0: 45 52 54 29 3f 22 49 4e 53 45 52 54 22 3a 28 6f  ERT)?"INSERT":(o
42d0: 70 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45  p==SQLITE_UPDATE
42e0: 29 3f 22 55 50 44 41 54 45 22 3a 22 44 45 4c 45  )?"UPDATE":"DELE
42f0: 54 45 22 29 2c 20 2d 31 29 29 3b 0a 20 20 54 63  TE"), -1));.  Tc
4300: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
4310: 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20  lement(0, pCmd, 
4320: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
4330: 28 7a 44 62 2c 20 2d 31 29 29 3b 0a 20 20 54 63  (zDb, -1));.  Tc
4340: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
4350: 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20  lement(0, pCmd, 
4360: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
4370: 28 7a 54 62 6c 2c 20 2d 31 29 29 3b 0a 20 20 54  (zTbl, -1));.  T
4380: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
4390: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c  Element(0, pCmd,
43a0: 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f   Tcl_NewWideIntO
43b0: 62 6a 28 72 6f 77 69 64 29 29 3b 0a 20 20 54 63  bj(rowid));.  Tc
43c0: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d  l_EvalObjEx(pDb-
43d0: 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54  >interp, pCmd, T
43e0: 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b  CL_EVAL_DIRECT);
43f0: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
4400: 74 63 6c 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64  tclCollateNeeded
4410: 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 0a  (.  void *pCtx,.
4420: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
4430: 20 69 6e 74 20 65 6e 63 2c 0a 20 20 63 6f 6e 73   int enc,.  cons
4440: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b  t char *zName.){
4450: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
4460: 20 3d 20 28 53 71 6c 69 74 65 44 62 20 2a 29 70   = (SqliteDb *)p
4470: 43 74 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  Ctx;.  Tcl_Obj *
4480: 70 53 63 72 69 70 74 20 3d 20 54 63 6c 5f 44 75  pScript = Tcl_Du
4490: 70 6c 69 63 61 74 65 4f 62 6a 28 70 44 62 2d 3e  plicateObj(pDb->
44a0: 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b  pCollateNeeded);
44b0: 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  .  Tcl_IncrRefCo
44c0: 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 20 20  unt(pScript);.  
44d0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
44e0: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 53 63 72  dElement(0, pScr
44f0: 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  ipt, Tcl_NewStri
4500: 6e 67 4f 62 6a 28 7a 4e 61 6d 65 2c 20 2d 31 29  ngObj(zName, -1)
4510: 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  );.  Tcl_EvalObj
4520: 45 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  Ex(pDb->interp, 
4530: 70 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20 54  pScript, 0);.  T
4540: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
4550: 70 53 63 72 69 70 74 29 3b 0a 7d 0a 0a 2f 2a 0a  pScript);.}../*.
4560: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
4570: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 76 61  is called to eva
4580: 6c 75 61 74 65 20 61 6e 20 53 51 4c 20 63 6f 6c  luate an SQL col
4590: 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  lation function 
45a0: 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 75  implemented.** u
45b0: 73 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74 2e  sing TCL script.
45c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
45d0: 63 6c 53 71 6c 43 6f 6c 6c 61 74 65 28 0a 20 20  clSqlCollate(.  
45e0: 76 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20 69 6e  void *pCtx,.  in
45f0: 74 20 6e 41 2c 0a 20 20 63 6f 6e 73 74 20 76 6f  t nA,.  const vo
4600: 69 64 20 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e 42  id *zA,.  int nB
4610: 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ,.  const void *
4620: 7a 42 0a 29 7b 0a 20 20 53 71 6c 43 6f 6c 6c 61  zB.){.  SqlColla
4630: 74 65 20 2a 70 20 3d 20 28 53 71 6c 43 6f 6c 6c  te *p = (SqlColl
4640: 61 74 65 20 2a 29 70 43 74 78 3b 0a 20 20 54 63  ate *)pCtx;.  Tc
4650: 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 0a 20 20  l_Obj *pCmd;..  
4660: 70 43 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 53 74  pCmd = Tcl_NewSt
4670: 72 69 6e 67 4f 62 6a 28 70 2d 3e 7a 53 63 72 69  ringObj(p->zScri
4680: 70 74 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49  pt, -1);.  Tcl_I
4690: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64  ncrRefCount(pCmd
46a0: 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
46b0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d  AppendElement(p-
46c0: 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54  >interp, pCmd, T
46d0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
46e0: 7a 41 2c 20 6e 41 29 29 3b 0a 20 20 54 63 6c 5f  zA, nA));.  Tcl_
46f0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
4700: 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c 20  ment(p->interp, 
4710: 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72  pCmd, Tcl_NewStr
4720: 69 6e 67 4f 62 6a 28 7a 42 2c 20 6e 42 29 29 3b  ingObj(zB, nB));
4730: 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78  .  Tcl_EvalObjEx
4740: 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64  (p->interp, pCmd
4750: 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43  , TCL_EVAL_DIREC
4760: 54 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65  T);.  Tcl_DecrRe
4770: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
4780: 72 65 74 75 72 6e 20 28 61 74 6f 69 28 54 63 6c  return (atoi(Tcl
4790: 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74  _GetStringResult
47a0: 28 70 2d 3e 69 6e 74 65 72 70 29 29 29 3b 0a 7d  (p->interp)));.}
47b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
47c0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
47d0: 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20 53 51  o evaluate an SQ
47e0: 4c 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65  L function imple
47f0: 6d 65 6e 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20  mented.** using 
4800: 54 43 4c 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 73  TCL script..*/.s
4810: 74 61 74 69 63 20 76 6f 69 64 20 74 63 6c 53 71  tatic void tclSq
4820: 6c 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  lFunc(sqlite3_co
4830: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20  ntext *context, 
4840: 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
4850: 33 5f 76 61 6c 75 65 2a 2a 61 72 67 76 29 7b 0a  3_value**argv){.
4860: 20 20 53 71 6c 46 75 6e 63 20 2a 70 20 3d 20 73    SqlFunc *p = s
4870: 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
4880: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 54 63 6c  (context);.  Tcl
4890: 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 20 20 69 6e  _Obj *pCmd;.  in
48a0: 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  t i;.  int rc;..
48b0: 20 20 69 66 28 20 61 72 67 63 3d 3d 30 20 29 7b    if( argc==0 ){
48c0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
48d0: 20 61 72 65 20 6e 6f 20 61 72 67 75 6d 65 6e 74   are no argument
48e0: 73 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f  s to the functio
48f0: 6e 2c 20 63 61 6c 6c 20 54 63 6c 5f 45 76 61 6c  n, call Tcl_Eval
4900: 4f 62 6a 45 78 20 6f 6e 20 74 68 65 0a 20 20 20  ObjEx on the.   
4910: 20 2a 2a 20 73 63 72 69 70 74 20 6f 62 6a 65 63   ** script objec
4920: 74 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68 69  t directly.  Thi
4930: 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 54 43 4c  s allows the TCL
4940: 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20 67 65 6e   compiler to gen
4950: 65 72 61 74 65 0a 20 20 20 20 2a 2a 20 62 79 74  erate.    ** byt
4960: 65 63 6f 64 65 20 66 6f 72 20 74 68 65 20 63 6f  ecode for the co
4970: 6d 6d 61 6e 64 20 6f 6e 20 74 68 65 20 66 69 72  mmand on the fir
4980: 73 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 61 6e  st invocation an
4990: 64 20 74 68 75 73 20 6d 61 6b 65 0a 20 20 20 20  d thus make.    
49a0: 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20 69 6e  ** subsequent in
49b0: 76 6f 63 61 74 69 6f 6e 73 20 6d 75 63 68 20 66  vocations much f
49c0: 61 73 74 65 72 2e 20 2a 2f 0a 20 20 20 20 70 43  aster. */.    pC
49d0: 6d 64 20 3d 20 70 2d 3e 70 53 63 72 69 70 74 3b  md = p->pScript;
49e0: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
49f0: 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20  Count(pCmd);.   
4a00: 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62   rc = Tcl_EvalOb
4a10: 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70  jEx(p->interp, p
4a20: 43 6d 64 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c  Cmd, 0);.    Tcl
4a30: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43  _DecrRefCount(pC
4a40: 6d 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  md);.  }else{.  
4a50: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
4a60: 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74  e arguments to t
4a70: 68 65 20 66 75 6e 63 74 69 6f 6e 2c 20 6d 61 6b  he function, mak
4a80: 65 20 61 20 73 68 61 6c 6c 6f 77 20 63 6f 70 79  e a shallow copy
4a90: 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 73   of the.    ** s
4aa0: 63 72 69 70 74 20 6f 62 6a 65 63 74 2c 20 6c 61  cript object, la
4ab0: 70 70 65 6e 64 20 74 68 65 20 61 72 67 75 6d 65  ppend the argume
4ac0: 6e 74 73 2c 20 74 68 65 6e 20 65 76 61 6c 75 61  nts, then evalua
4ad0: 74 65 20 74 68 65 20 63 6f 70 79 2e 0a 20 20 20  te the copy..   
4ae0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 42 79 20 22 73   **.    ** By "s
4af0: 68 61 6c 6c 6f 77 22 20 63 6f 70 79 2c 20 77 65  hallow" copy, we
4b00: 20 6d 65 61 6e 20 61 20 6f 6e 6c 79 20 74 68 65   mean a only the
4b10: 20 6f 75 74 65 72 20 6c 69 73 74 20 54 63 6c 5f   outer list Tcl_
4b20: 4f 62 6a 20 69 73 20 64 75 70 6c 69 63 61 74 65  Obj is duplicate
4b30: 64 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6e 65  d..    ** The ne
4b40: 77 20 54 63 6c 5f 4f 62 6a 20 63 6f 6e 74 61 69  w Tcl_Obj contai
4b50: 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74  ns pointers to t
4b60: 68 65 20 6f 72 69 67 69 6e 61 6c 20 6c 69 73 74  he original list
4b70: 20 65 6c 65 6d 65 6e 74 73 2e 20 0a 20 20 20 20   elements. .    
4b80: 2a 2a 20 54 68 61 74 20 77 61 79 2c 20 77 68 65  ** That way, whe
4b90: 6e 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29  n Tcl_EvalObjv()
4ba0: 20 69 73 20 72 75 6e 20 61 6e 64 20 73 68 69 6d   is run and shim
4bb0: 6d 65 72 73 20 74 68 65 20 66 69 72 73 74 20 65  mers the first e
4bc0: 6c 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 6f 66  lement.    ** of
4bd0: 20 74 68 65 20 6c 69 73 74 20 74 6f 20 74 63 6c   the list to tcl
4be0: 43 6d 64 4e 61 6d 65 54 79 70 65 2c 20 74 68 61  CmdNameType, tha
4bf0: 74 20 61 6c 74 65 72 6e 61 74 65 20 72 65 70 72  t alternate repr
4c00: 65 73 65 6e 74 61 74 69 6f 6e 20 77 69 6c 6c 0a  esentation will.
4c10: 20 20 20 20 2a 2a 20 62 65 20 70 72 65 73 65 72      ** be preser
4c20: 76 65 64 20 61 6e 64 20 72 65 75 73 65 64 20 6f  ved and reused o
4c30: 6e 20 74 68 65 20 6e 65 78 74 20 69 6e 76 6f 63  n the next invoc
4c40: 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ation..    */.  
4c50: 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 41 72 67    Tcl_Obj **aArg
4c60: 3b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a  ;.    int nArg;.
4c70: 20 20 20 20 69 66 28 20 54 63 6c 5f 4c 69 73 74      if( Tcl_List
4c80: 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 70  ObjGetElements(p
4c90: 2d 3e 69 6e 74 65 72 70 2c 20 70 2d 3e 70 53 63  ->interp, p->pSc
4ca0: 72 69 70 74 2c 20 26 6e 41 72 67 2c 20 26 61 41  ript, &nArg, &aA
4cb0: 72 67 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  rg) ){.      sql
4cc0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
4cd0: 72 28 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f 47  r(context, Tcl_G
4ce0: 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70  etStringResult(p
4cf0: 2d 3e 69 6e 74 65 72 70 29 2c 20 2d 31 29 3b 20  ->interp), -1); 
4d00: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
4d10: 20 20 20 7d 20 20 20 20 20 0a 20 20 20 20 70 43     }     .    pC
4d20: 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74  md = Tcl_NewList
4d30: 4f 62 6a 28 6e 41 72 67 2c 20 61 41 72 67 29 3b  Obj(nArg, aArg);
4d40: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
4d50: 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20  Count(pCmd);.   
4d60: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63   for(i=0; i<argc
4d70: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
4d80: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 49 6e  lite3_value *pIn
4d90: 20 3d 20 61 72 67 76 5b 69 5d 3b 0a 20 20 20 20   = argv[i];.    
4da0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b    Tcl_Obj *pVal;
4db0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20  .            .  
4dc0: 20 20 20 20 2f 2a 20 53 65 74 20 70 56 61 6c 20      /* Set pVal 
4dd0: 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 69  to contain the i
4de0: 27 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  'th column of th
4df0: 69 73 20 72 6f 77 2e 20 2a 2f 0a 20 20 20 20 20  is row. */.     
4e00: 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33   switch( sqlite3
4e10: 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 49 6e 29  _value_type(pIn)
4e20: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65   ){.        case
4e30: 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a   SQLITE_BLOB: {.
4e40: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 62 79            int by
4e50: 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  tes = sqlite3_va
4e60: 6c 75 65 5f 62 79 74 65 73 28 70 49 6e 29 3b 0a  lue_bytes(pIn);.
4e70: 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d            pVal =
4e80: 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61   Tcl_NewByteArra
4e90: 79 4f 62 6a 28 73 71 6c 69 74 65 33 5f 76 61 6c  yObj(sqlite3_val
4ea0: 75 65 5f 62 6c 6f 62 28 70 49 6e 29 2c 20 62 79  ue_blob(pIn), by
4eb0: 74 65 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tes);.          
4ec0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
4ed0: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51  .        case SQ
4ee0: 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a  LITE_INTEGER: {.
4ef0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
4f00: 5f 69 6e 74 36 34 20 76 20 3d 20 73 71 6c 69 74  _int64 v = sqlit
4f10: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 70  e3_value_int64(p
4f20: 49 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  In);.          i
4f30: 66 28 20 76 3e 3d 2d 32 31 34 37 34 38 33 36 34  f( v>=-214748364
4f40: 37 20 26 26 20 76 3c 3d 32 31 34 37 34 38 33 36  7 && v<=21474836
4f50: 34 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  47 ){.          
4f60: 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77    pVal = Tcl_New
4f70: 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20 20  IntObj(v);.     
4f80: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4f90: 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54          pVal = T
4fa0: 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a  cl_NewWideIntObj
4fb0: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  (v);.          }
4fc0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
4fd0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
4fe0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
4ff0: 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 20  FLOAT: {.       
5000: 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 73 71     double r = sq
5010: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62  lite3_value_doub
5020: 6c 65 28 70 49 6e 29 3b 0a 20 20 20 20 20 20 20  le(pIn);.       
5030: 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65     pVal = Tcl_Ne
5040: 77 44 6f 75 62 6c 65 4f 62 6a 28 72 29 3b 0a 20  wDoubleObj(r);. 
5050: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
5060: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5070: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55    case SQLITE_NU
5080: 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  LL: {.          
5090: 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74  pVal = Tcl_NewSt
50a0: 72 69 6e 67 4f 62 6a 28 22 22 2c 20 30 29 3b 0a  ringObj("", 0);.
50b0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
50c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
50d0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
50e0: 20 20 20 20 20 20 20 20 69 6e 74 20 62 79 74 65          int byte
50f0: 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  s = sqlite3_valu
5100: 65 5f 62 79 74 65 73 28 70 49 6e 29 3b 0a 20 20  e_bytes(pIn);.  
5110: 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54          pVal = T
5120: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
5130: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
5140: 76 61 6c 75 65 5f 74 65 78 74 28 70 49 6e 29 2c  value_text(pIn),
5150: 20 62 79 74 65 73 29 3b 0a 20 20 20 20 20 20 20   bytes);.       
5160: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
5170: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
5180: 20 20 72 63 20 3d 20 54 63 6c 5f 4c 69 73 74 4f    rc = Tcl_ListO
5190: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
51a0: 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c  p->interp, pCmd,
51b0: 20 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 69 66   pVal);.      if
51c0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
51d0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
51e0: 28 70 43 6d 64 29 3b 0a 20 20 20 20 20 20 20 20  (pCmd);.        
51f0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
5200: 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 54 63  rror(context, Tc
5210: 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
5220: 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c 20 2d 31  t(p->interp), -1
5230: 29 3b 20 0a 20 20 20 20 20 20 20 20 72 65 74 75  ); .        retu
5240: 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
5250: 7d 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 75 73  }.    if( !p->us
5260: 65 45 76 61 6c 4f 62 6a 76 20 29 7b 0a 20 20 20  eEvalObjv ){.   
5270: 20 20 20 2f 2a 20 54 63 6c 5f 45 76 61 6c 4f 62     /* Tcl_EvalOb
5280: 6a 45 78 28 29 20 77 69 6c 6c 20 61 75 74 6f 6d  jEx() will autom
5290: 61 74 69 63 61 6c 6c 79 20 63 61 6c 6c 20 54 63  atically call Tc
52a0: 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 69 66 20  l_EvalObjv() if 
52b0: 70 43 6d 64 0a 20 20 20 20 20 20 2a 2a 20 69 73  pCmd.      ** is
52c0: 20 61 20 6c 69 73 74 20 77 69 74 68 6f 75 74 20   a list without 
52d0: 61 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65  a string represe
52e0: 6e 74 61 74 69 6f 6e 2e 20 20 54 6f 20 70 72 65  ntation.  To pre
52f0: 76 65 6e 74 20 74 68 69 73 20 66 72 6f 6d 0a 20  vent this from. 
5300: 20 20 20 20 20 2a 2a 20 68 61 70 70 65 6e 69 6e       ** happenin
5310: 67 2c 20 6d 61 6b 65 20 73 75 72 65 20 70 43 6d  g, make sure pCm
5320: 64 20 68 61 73 20 61 20 76 61 6c 69 64 20 73 74  d has a valid st
5330: 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74  ring representat
5340: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 54 63 6c  ion */.      Tcl
5350: 5f 47 65 74 53 74 72 69 6e 67 28 70 43 6d 64 29  _GetString(pCmd)
5360: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
5370: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70   Tcl_EvalObjEx(p
5380: 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20  ->interp, pCmd, 
5390: 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29  TCL_EVAL_DIRECT)
53a0: 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  ;.    Tcl_DecrRe
53b0: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
53c0: 7d 0a 0a 20 20 69 66 28 20 72 63 20 26 26 20 72  }..  if( rc && r
53d0: 63 21 3d 54 43 4c 5f 52 45 54 55 52 4e 20 29 7b  c!=TCL_RETURN ){
53e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
53f0: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
5400: 74 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  t, Tcl_GetString
5410: 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70  Result(p->interp
5420: 29 2c 20 2d 31 29 3b 20 0a 20 20 7d 65 6c 73 65  ), -1); .  }else
5430: 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  {.    Tcl_Obj *p
5440: 56 61 72 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a  Var = Tcl_GetObj
5450: 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70  Result(p->interp
5460: 29 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  );.    int n;.  
5470: 20 20 75 38 20 2a 64 61 74 61 3b 0a 20 20 20 20    u8 *data;.    
5480: 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 70 56  char *zType = pV
5490: 61 72 2d 3e 74 79 70 65 50 74 72 20 3f 20 70 56  ar->typePtr ? pV
54a0: 61 72 2d 3e 74 79 70 65 50 74 72 2d 3e 6e 61 6d  ar->typePtr->nam
54b0: 65 20 3a 20 22 22 3b 0a 20 20 20 20 63 68 61 72  e : "";.    char
54c0: 20 63 20 3d 20 7a 54 79 70 65 5b 30 5d 3b 0a 20   c = zType[0];. 
54d0: 20 20 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26     if( c=='b' &&
54e0: 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 62   strcmp(zType,"b
54f0: 79 74 65 61 72 72 61 79 22 29 3d 3d 30 20 26 26  ytearray")==0 &&
5500: 20 70 56 61 72 2d 3e 62 79 74 65 73 3d 3d 30 20   pVar->bytes==0 
5510: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79  ){.      /* Only
5520: 20 72 65 74 75 72 6e 20 61 20 42 4c 4f 42 20 74   return a BLOB t
5530: 79 70 65 20 69 66 20 74 68 65 20 54 63 6c 20 76  ype if the Tcl v
5540: 61 72 69 61 62 6c 65 20 69 73 20 61 20 62 79 74  ariable is a byt
5550: 65 61 72 72 61 79 20 61 6e 64 0a 20 20 20 20 20  earray and.     
5560: 20 2a 2a 20 68 61 73 20 6e 6f 20 73 74 72 69 6e   ** has no strin
5570: 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  g representation
5580: 2e 20 2a 2f 0a 20 20 20 20 20 20 64 61 74 61 20  . */.      data 
5590: 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  = Tcl_GetByteArr
55a0: 61 79 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20  ayFromObj(pVar, 
55b0: 26 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  &n);.      sqlit
55c0: 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 28 63  e3_result_blob(c
55d0: 6f 6e 74 65 78 74 2c 20 64 61 74 61 2c 20 6e 2c  ontext, data, n,
55e0: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
55f0: 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  T);.    }else if
5600: 28 20 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63  ( c=='b' && strc
5610: 6d 70 28 7a 54 79 70 65 2c 22 62 6f 6f 6c 65 61  mp(zType,"boolea
5620: 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  n")==0 ){.      
5630: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
5640: 6a 28 30 2c 20 70 56 61 72 2c 20 26 6e 29 3b 0a  j(0, pVar, &n);.
5650: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
5660: 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74  sult_int(context
5670: 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  , n);.    }else 
5680: 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20 73 74  if( c=='d' && st
5690: 72 63 6d 70 28 7a 54 79 70 65 2c 22 64 6f 75 62  rcmp(zType,"doub
56a0: 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  le")==0 ){.     
56b0: 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20 20   double r;.     
56c0: 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72   Tcl_GetDoubleFr
56d0: 6f 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c 20 26  omObj(0, pVar, &
56e0: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
56f0: 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28  3_result_double(
5700: 63 6f 6e 74 65 78 74 2c 20 72 29 3b 0a 20 20 20  context, r);.   
5710: 20 7d 65 6c 73 65 20 69 66 28 20 28 63 3d 3d 27   }else if( (c=='
5720: 77 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79  w' && strcmp(zTy
5730: 70 65 2c 22 77 69 64 65 49 6e 74 22 29 3d 3d 30  pe,"wideInt")==0
5740: 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 28  ) ||.          (
5750: 63 3d 3d 27 69 27 20 26 26 20 73 74 72 63 6d 70  c=='i' && strcmp
5760: 28 7a 54 79 70 65 2c 22 69 6e 74 22 29 3d 3d 30  (zType,"int")==0
5770: 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  ) ){.      Tcl_W
5780: 69 64 65 49 6e 74 20 76 3b 0a 20 20 20 20 20 20  ideInt v;.      
5790: 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72  Tcl_GetWideIntFr
57a0: 6f 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c 20 26  omObj(0, pVar, &
57b0: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
57c0: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63  3_result_int64(c
57d0: 6f 6e 74 65 78 74 2c 20 76 29 3b 0a 20 20 20 20  ontext, v);.    
57e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 61 74  }else{.      dat
57f0: 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  a = (unsigned ch
5800: 61 72 20 2a 29 54 63 6c 5f 47 65 74 53 74 72 69  ar *)Tcl_GetStri
5810: 6e 67 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20  ngFromObj(pVar, 
5820: 26 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  &n);.      sqlit
5830: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
5840: 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 20 2a 29  ontext, (char *)
5850: 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f  data, n, SQLITE_
5860: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
5870: 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  }.  }.}..#ifndef
5880: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
5890: 48 4f 52 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a  HORIZATION./*.**
58a0: 20 54 68 69 73 20 69 73 20 74 68 65 20 61 75 74   This is the aut
58b0: 68 65 6e 74 69 63 61 74 69 6f 6e 20 66 75 6e 63  hentication func
58c0: 74 69 6f 6e 2e 20 20 49 74 20 61 70 70 65 6e 64  tion.  It append
58d0: 73 20 74 68 65 20 61 75 74 68 65 6e 74 69 63 61  s the authentica
58e0: 74 69 6f 6e 0a 2a 2a 20 74 79 70 65 20 63 6f 64  tion.** type cod
58f0: 65 20 61 6e 64 20 74 68 65 20 74 77 6f 20 61 72  e and the two ar
5900: 67 75 6d 65 6e 74 73 20 74 6f 20 7a 43 6d 64 5b  guments to zCmd[
5910: 5d 20 74 68 65 6e 20 69 6e 76 6f 6b 65 73 20 74  ] then invokes t
5920: 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 6f 6e 20  he result.** on 
5930: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e  the interpreter.
5940: 20 20 54 68 65 20 72 65 70 6c 79 20 69 73 20 65    The reply is e
5950: 78 61 6d 69 6e 65 64 20 74 6f 20 64 65 74 65 72  xamined to deter
5960: 6d 69 6e 65 20 69 66 20 74 68 65 0a 2a 2a 20 61  mine if the.** a
5970: 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 66 61  uthentication fa
5980: 69 6c 73 20 6f 72 20 73 75 63 63 65 65 64 73 2e  ils or succeeds.
5990: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
59a0: 75 74 68 5f 63 61 6c 6c 62 61 63 6b 28 0a 20 20  uth_callback(.  
59b0: 76 6f 69 64 20 2a 70 41 72 67 2c 0a 20 20 69 6e  void *pArg,.  in
59c0: 74 20 63 6f 64 65 2c 0a 20 20 63 6f 6e 73 74 20  t code,.  const 
59d0: 63 68 61 72 20 2a 7a 41 72 67 31 2c 0a 20 20 63  char *zArg1,.  c
59e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 32  onst char *zArg2
59f0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
5a00: 7a 41 72 67 33 2c 0a 20 20 63 6f 6e 73 74 20 63  zArg3,.  const c
5a10: 68 61 72 20 2a 7a 41 72 67 34 0a 29 7b 0a 20 20  har *zArg4.){.  
5a20: 63 68 61 72 20 2a 7a 43 6f 64 65 3b 0a 20 20 54  char *zCode;.  T
5a30: 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a  cl_DString str;.
5a40: 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73    int rc;.  cons
5a50: 74 20 63 68 61 72 20 2a 7a 52 65 70 6c 79 3b 0a  t char *zReply;.
5a60: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
5a70: 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 70 41 72  = (SqliteDb*)pAr
5a80: 67 3b 0a 20 20 69 66 28 20 70 44 62 2d 3e 64 69  g;.  if( pDb->di
5a90: 73 61 62 6c 65 41 75 74 68 20 29 20 72 65 74 75  sableAuth ) retu
5aa0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
5ab0: 20 73 77 69 74 63 68 28 20 63 6f 64 65 20 29 7b   switch( code ){
5ac0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
5ad0: 5f 43 4f 50 59 20 20 20 20 20 20 20 20 20 20 20  _COPY           
5ae0: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
5af0: 54 45 5f 43 4f 50 59 22 3b 20 62 72 65 61 6b 3b  TE_COPY"; break;
5b00: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
5b10: 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 20 20 20  _CREATE_INDEX   
5b20: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
5b30: 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 22  TE_CREATE_INDEX"
5b40: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
5b50: 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  e SQLITE_CREATE_
5b60: 54 41 42 4c 45 20 20 20 20 20 20 3a 20 7a 43 6f  TABLE      : zCo
5b70: 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54  de="SQLITE_CREAT
5b80: 45 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b  E_TABLE"; break;
5b90: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
5ba0: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44  _CREATE_TEMP_IND
5bb0: 45 58 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49  EX : zCode="SQLI
5bc0: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49  TE_CREATE_TEMP_I
5bd0: 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20  NDEX"; break;.  
5be0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52    case SQLITE_CR
5bf0: 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 20  EATE_TEMP_TABLE 
5c00: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
5c10: 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c  CREATE_TEMP_TABL
5c20: 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  E"; break;.    c
5c30: 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54  ase SQLITE_CREAT
5c40: 45 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 3a 20  E_TEMP_TRIGGER: 
5c50: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52  zCode="SQLITE_CR
5c60: 45 41 54 45 5f 54 45 4d 50 5f 54 52 49 47 47 45  EATE_TEMP_TRIGGE
5c70: 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  R"; break;.    c
5c80: 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54  ase SQLITE_CREAT
5c90: 45 5f 54 45 4d 50 5f 56 49 45 57 20 20 3a 20 7a  E_TEMP_VIEW  : z
5ca0: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45  Code="SQLITE_CRE
5cb0: 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 22 3b 20  ATE_TEMP_VIEW"; 
5cc0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
5cd0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 52  SQLITE_CREATE_TR
5ce0: 49 47 47 45 52 20 20 20 20 3a 20 7a 43 6f 64 65  IGGER    : zCode
5cf0: 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  ="SQLITE_CREATE_
5d00: 54 52 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b  TRIGGER"; break;
5d10: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
5d20: 5f 43 52 45 41 54 45 5f 56 49 45 57 20 20 20 20  _CREATE_VIEW    
5d30: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
5d40: 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57 22 3b  TE_CREATE_VIEW";
5d50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
5d60: 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 20   SQLITE_DELETE  
5d70: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
5d80: 65 3d 22 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  e="SQLITE_DELETE
5d90: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
5da0: 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49  se SQLITE_DROP_I
5db0: 4e 44 45 58 20 20 20 20 20 20 20 20 3a 20 7a 43  NDEX        : zC
5dc0: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50  ode="SQLITE_DROP
5dd0: 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a  _INDEX"; break;.
5de0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
5df0: 44 52 4f 50 5f 54 41 42 4c 45 20 20 20 20 20 20  DROP_TABLE      
5e00: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
5e10: 45 5f 44 52 4f 50 5f 54 41 42 4c 45 22 3b 20 62  E_DROP_TABLE"; b
5e20: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
5e30: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
5e40: 49 4e 44 45 58 20 20 20 3a 20 7a 43 6f 64 65 3d  INDEX   : zCode=
5e50: 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d  "SQLITE_DROP_TEM
5e60: 50 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b  P_INDEX"; break;
5e70: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
5e80: 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45  _DROP_TEMP_TABLE
5e90: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
5ea0: 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42  TE_DROP_TEMP_TAB
5eb0: 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  LE"; break;.    
5ec0: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50  case SQLITE_DROP
5ed0: 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 20 3a 20  _TEMP_TRIGGER : 
5ee0: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52  zCode="SQLITE_DR
5ef0: 4f 50 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 22  OP_TEMP_TRIGGER"
5f00: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
5f10: 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  e SQLITE_DROP_TE
5f20: 4d 50 5f 56 49 45 57 20 20 20 20 3a 20 7a 43 6f  MP_VIEW    : zCo
5f30: 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f  de="SQLITE_DROP_
5f40: 54 45 4d 50 5f 56 49 45 57 22 3b 20 62 72 65 61  TEMP_VIEW"; brea
5f50: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
5f60: 54 45 5f 44 52 4f 50 5f 54 52 49 47 47 45 52 20  TE_DROP_TRIGGER 
5f70: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
5f80: 4c 49 54 45 5f 44 52 4f 50 5f 54 52 49 47 47 45  LITE_DROP_TRIGGE
5f90: 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  R"; break;.    c
5fa0: 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  ase SQLITE_DROP_
5fb0: 56 49 45 57 20 20 20 20 20 20 20 20 20 3a 20 7a  VIEW         : z
5fc0: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f  Code="SQLITE_DRO
5fd0: 50 5f 56 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a  P_VIEW"; break;.
5fe0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
5ff0: 49 4e 53 45 52 54 20 20 20 20 20 20 20 20 20 20  INSERT          
6000: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
6010: 45 5f 49 4e 53 45 52 54 22 3b 20 62 72 65 61 6b  E_INSERT"; break
6020: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
6030: 45 5f 50 52 41 47 4d 41 20 20 20 20 20 20 20 20  E_PRAGMA        
6040: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
6050: 49 54 45 5f 50 52 41 47 4d 41 22 3b 20 62 72 65  ITE_PRAGMA"; bre
6060: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
6070: 49 54 45 5f 52 45 41 44 20 20 20 20 20 20 20 20  ITE_READ        
6080: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
6090: 51 4c 49 54 45 5f 52 45 41 44 22 3b 20 62 72 65  QLITE_READ"; bre
60a0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
60b0: 49 54 45 5f 53 45 4c 45 43 54 20 20 20 20 20 20  ITE_SELECT      
60c0: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
60d0: 51 4c 49 54 45 5f 53 45 4c 45 43 54 22 3b 20 62  QLITE_SELECT"; b
60e0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
60f0: 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f  QLITE_TRANSACTIO
6100: 4e 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d  N       : zCode=
6110: 22 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54  "SQLITE_TRANSACT
6120: 49 4f 4e 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ION"; break;.   
6130: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55 50 44   case SQLITE_UPD
6140: 41 54 45 20 20 20 20 20 20 20 20 20 20 20 20 3a  ATE            :
6150: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 55   zCode="SQLITE_U
6160: 50 44 41 54 45 22 3b 20 62 72 65 61 6b 3b 0a 20  PDATE"; break;. 
6170: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
6180: 54 54 41 43 48 20 20 20 20 20 20 20 20 20 20 20  TTACH           
6190: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
61a0: 5f 41 54 54 41 43 48 22 3b 20 62 72 65 61 6b 3b  _ATTACH"; break;
61b0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
61c0: 5f 44 45 54 41 43 48 20 20 20 20 20 20 20 20 20  _DETACH         
61d0: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
61e0: 54 45 5f 44 45 54 41 43 48 22 3b 20 62 72 65 61  TE_DETACH"; brea
61f0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
6200: 54 45 5f 41 4c 54 45 52 5f 54 41 42 4c 45 20 20  TE_ALTER_TABLE  
6210: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
6220: 4c 49 54 45 5f 41 4c 54 45 52 5f 54 41 42 4c 45  LITE_ALTER_TABLE
6230: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
6240: 73 65 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45  se SQLITE_REINDE
6250: 58 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43  X           : zC
6260: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 52 45 49 4e  ode="SQLITE_REIN
6270: 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  DEX"; break;.   
6280: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 4e 41   case SQLITE_ANA
6290: 4c 59 5a 45 20 20 20 20 20 20 20 20 20 20 20 3a  LYZE           :
62a0: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 41   zCode="SQLITE_A
62b0: 4e 41 4c 59 5a 45 22 3b 20 62 72 65 61 6b 3b 0a  NALYZE"; break;.
62c0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
62d0: 43 52 45 41 54 45 5f 56 54 41 42 4c 45 20 20 20  CREATE_VTABLE   
62e0: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
62f0: 45 5f 43 52 45 41 54 45 5f 56 54 41 42 4c 45 22  E_CREATE_VTABLE"
6300: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
6310: 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54  e SQLITE_DROP_VT
6320: 41 42 4c 45 20 20 20 20 20 20 20 3a 20 7a 43 6f  ABLE       : zCo
6330: 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f  de="SQLITE_DROP_
6340: 56 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a  VTABLE"; break;.
6350: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
6360: 46 55 4e 43 54 49 4f 4e 20 20 20 20 20 20 20 20  FUNCTION        
6370: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
6380: 45 5f 46 55 4e 43 54 49 4f 4e 22 3b 20 62 72 65  E_FUNCTION"; bre
6390: 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 20  ak;.    default 
63a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63b0: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 3f        : zCode="?
63c0: 3f 3f 3f 22 3b 20 62 72 65 61 6b 3b 0a 20 20 7d  ???"; break;.  }
63d0: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e  .  Tcl_DStringIn
63e0: 69 74 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f  it(&str);.  Tcl_
63f0: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 73  DStringAppend(&s
6400: 74 72 2c 20 70 44 62 2d 3e 7a 41 75 74 68 2c 20  tr, pDb->zAuth, 
6410: 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  -1);.  Tcl_DStri
6420: 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  ngAppendElement(
6430: 26 73 74 72 2c 20 7a 43 6f 64 65 29 3b 0a 20 20  &str, zCode);.  
6440: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
6450: 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a  dElement(&str, z
6460: 41 72 67 31 20 3f 20 7a 41 72 67 31 20 3a 20 22  Arg1 ? zArg1 : "
6470: 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  ");.  Tcl_DStrin
6480: 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26  gAppendElement(&
6490: 73 74 72 2c 20 7a 41 72 67 32 20 3f 20 7a 41 72  str, zArg2 ? zAr
64a0: 67 32 20 3a 20 22 22 29 3b 0a 20 20 54 63 6c 5f  g2 : "");.  Tcl_
64b0: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65  DStringAppendEle
64c0: 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41 72 67 33  ment(&str, zArg3
64d0: 20 3f 20 7a 41 72 67 33 20 3a 20 22 22 29 3b 0a   ? zArg3 : "");.
64e0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
64f0: 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c  endElement(&str,
6500: 20 7a 41 72 67 34 20 3f 20 7a 41 72 67 34 20 3a   zArg4 ? zArg4 :
6510: 20 22 22 29 3b 0a 20 20 72 63 20 3d 20 54 63 6c   "");.  rc = Tcl
6520: 5f 47 6c 6f 62 61 6c 45 76 61 6c 28 70 44 62 2d  _GlobalEval(pDb-
6530: 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53 74  >interp, Tcl_DSt
6540: 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29 29  ringValue(&str))
6550: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46  ;.  Tcl_DStringF
6560: 72 65 65 28 26 73 74 72 29 3b 0a 20 20 7a 52 65  ree(&str);.  zRe
6570: 70 6c 79 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ply = Tcl_GetStr
6580: 69 6e 67 52 65 73 75 6c 74 28 70 44 62 2d 3e 69  ingResult(pDb->i
6590: 6e 74 65 72 70 29 3b 0a 20 20 69 66 28 20 73 74  nterp);.  if( st
65a0: 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22 53 51 4c  rcmp(zReply,"SQL
65b0: 49 54 45 5f 4f 4b 22 29 3d 3d 30 20 29 7b 0a 20  ITE_OK")==0 ){. 
65c0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
65d0: 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  K;.  }else if( s
65e0: 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22 53 51  trcmp(zReply,"SQ
65f0: 4c 49 54 45 5f 44 45 4e 59 22 29 3d 3d 30 20 29  LITE_DENY")==0 )
6600: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
6610: 45 5f 44 45 4e 59 3b 0a 20 20 7d 65 6c 73 65 20  E_DENY;.  }else 
6620: 69 66 28 20 73 74 72 63 6d 70 28 7a 52 65 70 6c  if( strcmp(zRepl
6630: 79 2c 22 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  y,"SQLITE_IGNORE
6640: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ")==0 ){.    rc 
6650: 3d 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 3b  = SQLITE_IGNORE;
6660: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
6670: 20 3d 20 39 39 39 3b 0a 20 20 7d 0a 20 20 72 65   = 999;.  }.  re
6680: 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
6690: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
66a0: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 20 2a  _AUTHORIZATION *
66b0: 2f 0a 0a 2f 2a 0a 2a 2a 20 7a 54 65 78 74 20 69  /../*.** zText i
66c0: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
66d0: 65 78 74 20 6f 62 74 61 69 6e 65 64 20 76 69 61  ext obtained via
66e0: 20 61 6e 20 73 71 6c 69 74 65 33 5f 72 65 73 75   an sqlite3_resu
66f0: 6c 74 5f 74 65 78 74 28 29 0a 2a 2a 20 6f 72 20  lt_text().** or 
6700: 73 69 6d 69 6c 61 72 20 69 6e 74 65 72 66 61 63  similar interfac
6710: 65 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  e. This routine 
6720: 72 65 74 75 72 6e 73 20 61 20 54 63 6c 20 73 74  returns a Tcl st
6730: 72 69 6e 67 20 6f 62 6a 65 63 74 2c 20 0a 2a 2a  ring object, .**
6740: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
6750: 20 73 65 74 20 74 6f 20 30 2c 20 63 6f 6e 74 61   set to 0, conta
6760: 69 6e 69 6e 67 20 74 68 65 20 74 65 78 74 2e 20  ining the text. 
6770: 49 66 20 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e  If a translation
6780: 0a 2a 2a 20 62 65 74 77 65 65 6e 20 69 73 6f 38  .** between iso8
6790: 38 35 39 20 61 6e 64 20 55 54 46 2d 38 20 69 73  859 and UTF-8 is
67a0: 20 72 65 71 75 69 72 65 64 2c 20 69 74 20 69 73   required, it is
67b0: 20 70 72 65 66 6f 72 6d 65 64 2e 0a 2a 2f 0a 73   preformed..*/.s
67c0: 74 61 74 69 63 20 54 63 6c 5f 4f 62 6a 20 2a 64  tatic Tcl_Obj *d
67d0: 62 54 65 78 74 54 6f 4f 62 6a 28 63 68 61 72 20  bTextToObj(char 
67e0: 63 6f 6e 73 74 20 2a 7a 54 65 78 74 29 7b 0a 20  const *zText){. 
67f0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b 0a   Tcl_Obj *pVal;.
6800: 23 69 66 64 65 66 20 55 54 46 5f 54 52 41 4e 53  #ifdef UTF_TRANS
6810: 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 0a 20 20  LATION_NEEDED.  
6820: 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 43 6f 6c  Tcl_DString dCol
6830: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49  ;.  Tcl_DStringI
6840: 6e 69 74 28 26 64 43 6f 6c 29 3b 0a 20 20 54 63  nit(&dCol);.  Tc
6850: 6c 5f 45 78 74 65 72 6e 61 6c 54 6f 55 74 66 44  l_ExternalToUtfD
6860: 53 74 72 69 6e 67 28 4e 55 4c 4c 2c 20 7a 54 65  String(NULL, zTe
6870: 78 74 2c 20 2d 31 2c 20 26 64 43 6f 6c 29 3b 0a  xt, -1, &dCol);.
6880: 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77    pVal = Tcl_New
6890: 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 44 53  StringObj(Tcl_DS
68a0: 74 72 69 6e 67 56 61 6c 75 65 28 26 64 43 6f 6c  tringValue(&dCol
68b0: 29 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53  ), -1);.  Tcl_DS
68c0: 74 72 69 6e 67 46 72 65 65 28 26 64 43 6f 6c 29  tringFree(&dCol)
68d0: 3b 0a 23 65 6c 73 65 0a 20 20 70 56 61 6c 20 3d  ;.#else.  pVal =
68e0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
68f0: 6a 28 7a 54 65 78 74 2c 20 2d 31 29 3b 0a 23 65  j(zText, -1);.#e
6900: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 70 56  ndif.  return pV
6910: 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  al;.}../*.** Thi
6920: 73 20 72 6f 75 74 69 6e 65 20 72 65 61 64 73 20  s routine reads 
6930: 61 20 6c 69 6e 65 20 6f 66 20 74 65 78 74 20 66  a line of text f
6940: 72 6f 6d 20 46 49 4c 45 20 69 6e 2c 20 73 74 6f  rom FILE in, sto
6950: 72 65 73 0a 2a 2a 20 74 68 65 20 74 65 78 74 20  res.** the text 
6960: 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  in memory obtain
6970: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29  ed from malloc()
6980: 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 70   and returns a p
6990: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
69a0: 20 74 65 78 74 2e 20 20 4e 55 4c 4c 20 69 73 20   text.  NULL is 
69b0: 72 65 74 75 72 6e 65 64 20 61 74 20 65 6e 64 20  returned at end 
69c0: 6f 66 20 66 69 6c 65 2c 20 6f 72 20 69 66 20 6d  of file, or if m
69d0: 61 6c 6c 6f 63 28 29 0a 2a 2a 20 66 61 69 6c 73  alloc().** fails
69e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65  ..**.** The inte
69f0: 72 66 61 63 65 20 69 73 20 6c 69 6b 65 20 22 72  rface is like "r
6a00: 65 61 64 6c 69 6e 65 22 20 62 75 74 20 6e 6f 20  eadline" but no 
6a10: 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 65 64 69  command-line edi
6a20: 74 69 6e 67 0a 2a 2a 20 69 73 20 64 6f 6e 65 2e  ting.** is done.
6a30: 0a 2a 2a 0a 2a 2a 20 63 6f 70 69 65 64 20 66 72  .**.** copied fr
6a40: 6f 6d 20 73 68 65 6c 6c 2e 63 20 66 72 6f 6d 20  om shell.c from 
6a50: 27 2e 69 6d 70 6f 72 74 27 20 63 6f 6d 6d 61 6e  '.import' comman
6a60: 64 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  d.*/.static char
6a70: 20 2a 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28   *local_getline(
6a80: 63 68 61 72 20 2a 7a 50 72 6f 6d 70 74 2c 20 46  char *zPrompt, F
6a90: 49 4c 45 20 2a 69 6e 29 7b 0a 20 20 63 68 61 72  ILE *in){.  char
6aa0: 20 2a 7a 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e   *zLine;.  int n
6ab0: 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  Line;.  int n;. 
6ac0: 20 69 6e 74 20 65 6f 6c 3b 0a 0a 20 20 6e 4c 69   int eol;..  nLi
6ad0: 6e 65 20 3d 20 31 30 30 3b 0a 20 20 7a 4c 69 6e  ne = 100;.  zLin
6ae0: 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 4c 69 6e  e = malloc( nLin
6af0: 65 20 29 3b 0a 20 20 69 66 28 20 7a 4c 69 6e 65  e );.  if( zLine
6b00: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
6b10: 20 20 6e 20 3d 20 30 3b 0a 20 20 65 6f 6c 20 3d    n = 0;.  eol =
6b20: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 21 65 6f   0;.  while( !eo
6b30: 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 2b 31  l ){.    if( n+1
6b40: 30 30 3e 6e 4c 69 6e 65 20 29 7b 0a 20 20 20 20  00>nLine ){.    
6b50: 20 20 6e 4c 69 6e 65 20 3d 20 6e 4c 69 6e 65 2a    nLine = nLine*
6b60: 32 20 2b 20 31 30 30 3b 0a 20 20 20 20 20 20 7a  2 + 100;.      z
6b70: 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28 7a  Line = realloc(z
6b80: 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29 3b 0a 20 20  Line, nLine);.  
6b90: 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d 30      if( zLine==0
6ba0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
6bb0: 20 7d 0a 20 20 20 20 69 66 28 20 66 67 65 74 73   }.    if( fgets
6bc0: 28 26 7a 4c 69 6e 65 5b 6e 5d 2c 20 6e 4c 69 6e  (&zLine[n], nLin
6bd0: 65 20 2d 20 6e 2c 20 69 6e 29 3d 3d 30 20 29 7b  e - n, in)==0 ){
6be0: 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20  .      if( n==0 
6bf0: 29 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 28  ){.        free(
6c00: 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20  zLine);.        
6c10: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
6c20: 7d 0a 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d  }.      zLine[n]
6c30: 20 3d 20 30 3b 0a 20 20 20 20 20 20 65 6f 6c 20   = 0;.      eol 
6c40: 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 1;.      break
6c50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c  ;.    }.    whil
6c60: 65 28 20 7a 4c 69 6e 65 5b 6e 5d 20 29 7b 20 6e  e( zLine[n] ){ n
6c70: 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e  ++; }.    if( n>
6c80: 30 20 26 26 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d  0 && zLine[n-1]=
6c90: 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20 6e  ='\n' ){.      n
6ca0: 2d 2d 3b 0a 20 20 20 20 20 20 7a 4c 69 6e 65 5b  --;.      zLine[
6cb0: 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 65 6f  n] = 0;.      eo
6cc0: 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  l = 1;.    }.  }
6cd0: 0a 20 20 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c  .  zLine = reall
6ce0: 6f 63 28 20 7a 4c 69 6e 65 2c 20 6e 2b 31 20 29  oc( zLine, n+1 )
6cf0: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4c 69 6e 65  ;.  return zLine
6d00: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 69 67 75  ;.}.../*.** Figu
6d10: 72 65 20 6f 75 74 20 74 68 65 20 63 6f 6c 75 6d  re out the colum
6d20: 6e 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 65 20  n names for the 
6d30: 64 61 74 61 20 72 65 74 75 72 6e 65 64 20 62 79  data returned by
6d40: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a   the statement.*
6d50: 2a 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  * passed as the 
6d60: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
6d70: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
6d80: 74 65 72 20 70 61 70 43 6f 6c 4e 61 6d 65 20 69  ter papColName i
6d90: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
6da0: 20 2a 70 61 70 43 6f 6c 4e 61 6d 65 20 69 73 20   *papColName is 
6db0: 73 65 74 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20  set to point.** 
6dc0: 61 74 20 61 6e 20 61 72 72 61 79 20 61 6c 6c 6f  at an array allo
6dd0: 63 61 74 65 64 20 75 73 69 6e 67 20 54 63 6c 5f  cated using Tcl_
6de0: 41 6c 6c 6f 63 28 29 2e 20 49 74 20 69 73 20 74  Alloc(). It is t
6df0: 68 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f  he callers respo
6e00: 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20 74 6f 20  nsibility.** to 
6e10: 66 72 65 65 20 74 68 69 73 20 61 72 72 61 79 20  free this array 
6e20: 75 73 69 6e 67 20 54 63 6c 5f 46 72 65 65 28 29  using Tcl_Free()
6e30: 2c 20 61 6e 64 20 74 6f 20 64 65 63 72 65 6d 65  , and to decreme
6e40: 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
6e50: 0a 2a 2a 20 63 6f 75 6e 74 20 6f 66 20 65 61 63  .** count of eac
6e60: 68 20 54 63 6c 5f 4f 62 6a 2a 20 6d 65 6d 62 65  h Tcl_Obj* membe
6e70: 72 20 6f 66 20 74 68 65 20 61 72 72 61 79 2e 0a  r of the array..
6e80: 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
6e90: 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66   value of this f
6ea0: 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 20 6e  unction is the n
6eb0: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
6ec0: 20 6f 66 20 64 61 74 61 0a 2a 2a 20 72 65 74 75   of data.** retu
6ed0: 72 6e 65 64 20 62 79 20 70 53 74 6d 74 20 28 61  rned by pStmt (a
6ee0: 6e 64 20 68 65 6e 63 65 20 74 68 65 20 73 69 7a  nd hence the siz
6ef0: 65 20 6f 66 20 74 68 65 20 2a 70 61 70 43 6f 6c  e of the *papCol
6f00: 4e 61 6d 65 20 61 72 72 61 79 29 2e 0a 2a 2a 0a  Name array)..**.
6f10: 2a 2a 20 49 66 20 70 41 72 72 61 79 20 69 73 20  ** If pArray is 
6f20: 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69  not NULL, then i
6f30: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e  t contains the n
6f40: 61 6d 65 20 6f 66 20 61 20 54 63 6c 20 61 72 72  ame of a Tcl arr
6f50: 61 79 0a 2a 2a 20 76 61 72 69 61 62 6c 65 2e 20  ay.** variable. 
6f60: 54 68 65 20 22 2a 22 20 6d 65 6d 62 65 72 20 6f  The "*" member o
6f70: 66 20 74 68 69 73 20 61 72 72 61 79 20 69 73 20  f this array is 
6f80: 73 65 74 20 74 6f 20 61 20 6c 69 73 74 20 63 6f  set to a list co
6f90: 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 74 68 65 20  ntaining.** the 
6fa0: 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c  names of the col
6fb0: 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79  umns returned by
6fc0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20   the statement, 
6fd0: 69 6e 20 6f 72 64 65 72 20 66 72 6f 6d 0a 2a 2a  in order from.**
6fe0: 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e 20   left to right. 
6ff0: 65 2e 67 2e 20 69 66 20 74 68 65 20 6e 61 6d 65  e.g. if the name
7000: 73 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65  s of the returne
7010: 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 61 2c  d columns are a,
7020: 20 62 20 61 6e 64 0a 2a 2a 20 63 2c 20 69 74 20   b and.** c, it 
7030: 64 6f 65 73 20 74 68 65 20 65 71 75 69 76 61 6c  does the equival
7040: 65 6e 74 20 6f 66 20 74 68 65 20 74 63 6c 20 63  ent of the tcl c
7050: 6f 6d 6d 61 6e 64 3a 0a 2a 2a 0a 2a 2a 20 20 20  ommand:.**.**   
7060: 20 20 73 65 74 20 24 7b 70 41 72 72 61 79 7d 28    set ${pArray}(
7070: 2a 29 20 7b 61 20 62 20 63 7d 0a 2a 2f 0a 73 74  *) {a b c}.*/.st
7080: 61 74 69 63 20 69 6e 74 0a 63 6f 6d 70 75 74 65  atic int.compute
7090: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 54  ColumnNames(.  T
70a0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
70b0: 70 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  p, .  sqlite3_st
70c0: 6d 74 20 2a 70 53 74 6d 74 2c 20 20 20 20 20 20  mt *pStmt,      
70d0: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 73          /* SQL s
70e0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 63  tatement */.  Tc
70f0: 6c 5f 4f 62 6a 20 2a 2a 2a 70 61 70 43 6f 6c 4e  l_Obj ***papColN
7100: 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ame,            
7110: 2f 2a 20 4f 55 54 3a 20 41 72 72 61 79 20 6f 66  /* OUT: Array of
7120: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   column names */
7130: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 72  .  Tcl_Obj *pArr
7140: 61 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ay              
7150: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
7160: 61 72 72 61 79 20 76 61 72 69 61 62 6c 65 20 28  array variable (
7170: 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a  may be null) */.
7180: 29 7b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 0a  ){.  int nCol;..
7190: 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c    /* Compute col
71a0: 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 6e  umn names */.  n
71b0: 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Col = sqlite3_co
71c0: 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74  lumn_count(pStmt
71d0: 29 3b 0a 20 20 69 66 28 20 70 61 70 43 6f 6c 4e  );.  if( papColN
71e0: 61 6d 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ame ){.    int i
71f0: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a  ;.    Tcl_Obj **
7200: 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 54 63 6c  apColName = (Tcl
7210: 5f 4f 62 6a 2a 2a 29 54 63 6c 5f 41 6c 6c 6f 63  _Obj**)Tcl_Alloc
7220: 28 20 73 69 7a 65 6f 66 28 54 63 6c 5f 4f 62 6a  ( sizeof(Tcl_Obj
7230: 2a 29 2a 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 66  *)*nCol );.    f
7240: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
7250: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 70 43 6f  i++){.      apCo
7260: 6c 4e 61 6d 65 5b 69 5d 20 3d 20 64 62 54 65 78  lName[i] = dbTex
7270: 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63  tToObj(sqlite3_c
7280: 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74  olumn_name(pStmt
7290: 2c 69 29 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f  ,i));.      Tcl_
72a0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 61 70 43  IncrRefCount(apC
72b0: 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20  olName[i]);.    
72c0: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 72 65 73  }..    /* If res
72d0: 75 6c 74 73 20 61 72 65 20 62 65 69 6e 67 20 73  ults are being s
72e0: 74 6f 72 65 64 20 69 6e 20 61 6e 20 61 72 72 61  tored in an arra
72f0: 79 20 76 61 72 69 61 62 6c 65 2c 20 74 68 65 6e  y variable, then
7300: 20 63 72 65 61 74 65 0a 20 20 20 20 2a 2a 20 74   create.    ** t
7310: 68 65 20 61 72 72 61 79 28 2a 29 20 65 6e 74 72  he array(*) entr
7320: 79 20 66 6f 72 20 74 68 61 74 20 61 72 72 61 79  y for that array
7330: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
7340: 70 41 72 72 61 79 20 29 7b 0a 20 20 20 20 20 20  pArray ){.      
7350: 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f 6c 4c 69 73  Tcl_Obj *pColLis
7360: 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29  t = Tcl_NewObj()
7370: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20  ;.      Tcl_Obj 
7380: 2a 70 53 74 61 72 20 3d 20 54 63 6c 5f 4e 65 77  *pStar = Tcl_New
7390: 53 74 72 69 6e 67 4f 62 6a 28 22 2a 22 2c 20 2d  StringObj("*", -
73a0: 31 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e  1);.      Tcl_In
73b0: 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6f 6c 4c  crRefCount(pColL
73c0: 69 73 74 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  ist);.      for(
73d0: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
73e0: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4c  ){.        Tcl_L
73f0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
7400: 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 43 6f 6c  ent(interp, pCol
7410: 4c 69 73 74 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b  List, apColName[
7420: 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
7430: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
7440: 75 6e 74 28 70 53 74 61 72 29 3b 0a 20 20 20 20  unt(pStar);.    
7450: 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32    Tcl_ObjSetVar2
7460: 28 69 6e 74 65 72 70 2c 20 70 41 72 72 61 79 2c  (interp, pArray,
7470: 20 70 53 74 61 72 2c 20 70 43 6f 6c 4c 69 73 74   pStar, pColList
7480: 2c 30 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 44  ,0);.      Tcl_D
7490: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6f 6c  ecrRefCount(pCol
74a0: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 54 63 6c  List);.      Tcl
74b0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 53  _DecrRefCount(pS
74c0: 74 61 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tar);.    }.    
74d0: 2a 70 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 61 70  *papColName = ap
74e0: 43 6f 6c 4e 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20  ColName;.  }..  
74f0: 72 65 74 75 72 6e 20 6e 43 6f 6c 3b 0a 7d 0a 0a  return nCol;.}..
7500: 2f 2a 0a 2a 2a 20 54 68 65 20 22 73 71 6c 69 74  /*.** The "sqlit
7510: 65 22 20 63 6f 6d 6d 61 6e 64 20 62 65 6c 6f 77  e" command below
7520: 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 20 54   creates a new T
7530: 63 6c 20 63 6f 6d 6d 61 6e 64 20 66 6f 72 20 65  cl command for e
7540: 61 63 68 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  ach.** connectio
7550: 6e 20 69 74 20 6f 70 65 6e 73 20 74 6f 20 61 6e  n it opens to an
7560: 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
7570: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
7580: 69 73 20 69 6e 76 6f 6b 65 64 0a 2a 2a 20 77 68  is invoked.** wh
7590: 65 6e 65 76 65 72 20 6f 6e 65 20 6f 66 20 74 68  enever one of th
75a0: 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2d 73  ose connection-s
75b0: 70 65 63 69 66 69 63 20 63 6f 6d 6d 61 6e 64 73  pecific commands
75c0: 20 69 73 20 65 78 65 63 75 74 65 64 0a 2a 2a 20   is executed.** 
75d0: 69 6e 20 54 63 6c 2e 20 20 46 6f 72 20 65 78 61  in Tcl.  For exa
75e0: 6d 70 6c 65 2c 20 69 66 20 79 6f 75 20 72 75 6e  mple, if you run
75f0: 20 54 63 6c 20 63 6f 64 65 20 6c 69 6b 65 20 74   Tcl code like t
7600: 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
7610: 20 73 71 6c 69 74 65 33 20 64 62 31 20 20 22 6d   sqlite3 db1  "m
7620: 79 5f 64 61 74 61 62 61 73 65 22 0a 2a 2a 20 20  y_database".**  
7630: 20 20 20 20 20 64 62 31 20 63 6c 6f 73 65 0a 2a       db1 close.*
7640: 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 63  *.** The first c
7650: 6f 6d 6d 61 6e 64 20 6f 70 65 6e 73 20 61 20 63  ommand opens a c
7660: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65  onnection to the
7670: 20 22 6d 79 5f 64 61 74 61 62 61 73 65 22 20 64   "my_database" d
7680: 61 74 61 62 61 73 65 0a 2a 2a 20 61 6e 64 20 63  atabase.** and c
7690: 61 6c 6c 73 20 74 68 61 74 20 63 6f 6e 6e 65 63  alls that connec
76a0: 74 69 6f 6e 20 22 64 62 31 22 2e 20 20 54 68 65  tion "db1".  The
76b0: 20 73 65 63 6f 6e 64 20 63 6f 6d 6d 61 6e 64 20   second command 
76c0: 63 61 75 73 65 73 20 74 68 69 73 0a 2a 2a 20 73  causes this.** s
76d0: 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 62 65 20  ubroutine to be 
76e0: 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74  invoked..*/.stat
76f0: 69 63 20 69 6e 74 20 44 62 4f 62 6a 43 6d 64 28  ic int DbObjCmd(
7700: 76 6f 69 64 20 2a 63 64 2c 20 54 63 6c 5f 49 6e  void *cd, Tcl_In
7710: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
7720: 74 20 6f 62 6a 63 2c 54 63 6c 5f 4f 62 6a 20 2a  t objc,Tcl_Obj *
7730: 63 6f 6e 73 74 2a 6f 62 6a 76 29 7b 0a 20 20 53  const*objv){.  S
7740: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
7750: 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20  SqliteDb*)cd;.  
7760: 69 6e 74 20 63 68 6f 69 63 65 3b 0a 20 20 69 6e  int choice;.  in
7770: 74 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20  t rc = TCL_OK;. 
7780: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
7790: 61 72 20 2a 44 42 5f 73 74 72 73 5b 5d 20 3d 20  ar *DB_strs[] = 
77a0: 7b 0a 20 20 20 20 22 61 75 74 68 6f 72 69 7a 65  {.    "authorize
77b0: 72 22 2c 20 20 20 20 20 20 20 20 20 22 62 75 73  r",         "bus
77c0: 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  y",             
77d0: 20 22 63 61 63 68 65 22 2c 0a 20 20 20 20 22 63   "cache",.    "c
77e0: 68 61 6e 67 65 73 22 2c 20 20 20 20 20 20 20 20  hanges",        
77f0: 20 20 20 20 22 63 6c 6f 73 65 22 2c 20 20 20 20      "close",    
7800: 20 20 20 20 20 20 20 20 20 22 63 6f 6c 6c 61 74           "collat
7810: 65 22 2c 0a 20 20 20 20 22 63 6f 6c 6c 61 74 69  e",.    "collati
7820: 6f 6e 5f 6e 65 65 64 65 64 22 2c 20 20 20 22 63  on_needed",   "c
7830: 6f 6d 6d 69 74 5f 68 6f 6f 6b 22 2c 20 20 20 20  ommit_hook",    
7840: 20 20 20 22 63 6f 6d 70 6c 65 74 65 22 2c 0a 20     "complete",. 
7850: 20 20 20 22 63 6f 70 79 22 2c 20 20 20 20 20 20     "copy",      
7860: 20 20 20 20 20 20 20 20 20 22 65 6e 61 62 6c 65           "enable
7870: 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 22  _load_extension"
7880: 2c 22 65 72 72 6f 72 63 6f 64 65 22 2c 0a 20 20  ,"errorcode",.  
7890: 20 20 22 65 76 61 6c 22 2c 20 20 20 20 20 20 20    "eval",       
78a0: 20 20 20 20 20 20 20 20 22 65 78 69 73 74 73 22          "exists"
78b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 22 66 75  ,            "fu
78c0: 6e 63 74 69 6f 6e 22 2c 0a 20 20 20 20 22 69 6e  nction",.    "in
78d0: 63 72 62 6c 6f 62 22 2c 20 20 20 20 20 20 20 20  crblob",        
78e0: 20 20 20 22 69 6e 74 65 72 72 75 70 74 22 2c 20     "interrupt", 
78f0: 20 20 20 20 20 20 20 20 22 6c 61 73 74 5f 69 6e          "last_in
7900: 73 65 72 74 5f 72 6f 77 69 64 22 2c 0a 20 20 20  sert_rowid",.   
7910: 20 22 6e 75 6c 6c 76 61 6c 75 65 22 2c 20 20 20   "nullvalue",   
7920: 20 20 20 20 20 20 20 22 6f 6e 65 63 6f 6c 75 6d         "onecolum
7930: 6e 22 2c 20 20 20 20 20 20 20 20 20 22 70 72 6f  n",         "pro
7940: 66 69 6c 65 22 2c 0a 20 20 20 20 22 70 72 6f 67  file",.    "prog
7950: 72 65 73 73 22 2c 20 20 20 20 20 20 20 20 20 20  ress",          
7960: 20 22 72 65 6b 65 79 22 2c 20 20 20 20 20 20 20   "rekey",       
7970: 20 20 20 20 20 20 22 72 6f 6c 6c 62 61 63 6b 5f        "rollback_
7980: 68 6f 6f 6b 22 2c 0a 20 20 20 20 22 74 69 6d 65  hook",.    "time
7990: 6f 75 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  out",           
79a0: 20 22 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 22   "total_changes"
79b0: 2c 20 20 20 20 20 22 74 72 61 63 65 22 2c 0a 20  ,     "trace",. 
79c0: 20 20 20 22 74 72 61 6e 73 61 63 74 69 6f 6e 22     "transaction"
79d0: 2c 20 20 20 20 20 20 20 20 22 75 70 64 61 74 65  ,        "update
79e0: 5f 68 6f 6f 6b 22 2c 20 20 20 20 20 20 20 22 76  _hook",       "v
79f0: 65 72 73 69 6f 6e 22 2c 0a 20 20 20 20 30 20 20  ersion",.    0  
7a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a10: 20 20 0a 20 20 7d 3b 0a 20 20 65 6e 75 6d 20 44    .  };.  enum D
7a20: 42 5f 65 6e 75 6d 20 7b 0a 20 20 20 20 44 42 5f  B_enum {.    DB_
7a30: 41 55 54 48 4f 52 49 5a 45 52 2c 20 20 20 20 20  AUTHORIZER,     
7a40: 20 20 20 44 42 5f 42 55 53 59 2c 20 20 20 20 20     DB_BUSY,     
7a50: 20 20 20 20 20 20 20 20 44 42 5f 43 41 43 48 45          DB_CACHE
7a60: 2c 0a 20 20 20 20 44 42 5f 43 48 41 4e 47 45 53  ,.    DB_CHANGES
7a70: 2c 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 43  ,           DB_C
7a80: 4c 4f 53 45 2c 20 20 20 20 20 20 20 20 20 20 20  LOSE,           
7a90: 20 44 42 5f 43 4f 4c 4c 41 54 45 2c 0a 20 20 20   DB_COLLATE,.   
7aa0: 20 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e 45   DB_COLLATION_NE
7ab0: 45 44 45 44 2c 20 20 44 42 5f 43 4f 4d 4d 49 54  EDED,  DB_COMMIT
7ac0: 5f 48 4f 4f 4b 2c 20 20 20 20 20 20 44 42 5f 43  _HOOK,      DB_C
7ad0: 4f 4d 50 4c 45 54 45 2c 0a 20 20 20 20 44 42 5f  OMPLETE,.    DB_
7ae0: 43 4f 50 59 2c 20 20 20 20 20 20 20 20 20 20 20  COPY,           
7af0: 20 20 20 44 42 5f 45 4e 41 42 4c 45 5f 4c 4f 41     DB_ENABLE_LOA
7b00: 44 5f 45 58 54 45 4e 53 49 4f 4e 2c 44 42 5f 45  D_EXTENSION,DB_E
7b10: 52 52 4f 52 43 4f 44 45 2c 0a 20 20 20 20 44 42  RRORCODE,.    DB
7b20: 5f 45 56 41 4c 2c 20 20 20 20 20 20 20 20 20 20  _EVAL,          
7b30: 20 20 20 20 44 42 5f 45 58 49 53 54 53 2c 20 20      DB_EXISTS,  
7b40: 20 20 20 20 20 20 20 20 20 44 42 5f 46 55 4e 43           DB_FUNC
7b50: 54 49 4f 4e 2c 0a 20 20 20 20 44 42 5f 49 4e 43  TION,.    DB_INC
7b60: 52 42 4c 4f 42 2c 20 20 20 20 20 20 20 20 20 20  RBLOB,          
7b70: 44 42 5f 49 4e 54 45 52 52 55 50 54 2c 20 20 20  DB_INTERRUPT,   
7b80: 20 20 20 20 20 44 42 5f 4c 41 53 54 5f 49 4e 53       DB_LAST_INS
7b90: 45 52 54 5f 52 4f 57 49 44 2c 0a 20 20 20 20 44  ERT_ROWID,.    D
7ba0: 42 5f 4e 55 4c 4c 56 41 4c 55 45 2c 20 20 20 20  B_NULLVALUE,    
7bb0: 20 20 20 20 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d       DB_ONECOLUM
7bc0: 4e 2c 20 20 20 20 20 20 20 20 44 42 5f 50 52 4f  N,        DB_PRO
7bd0: 46 49 4c 45 2c 0a 20 20 20 20 44 42 5f 50 52 4f  FILE,.    DB_PRO
7be0: 47 52 45 53 53 2c 20 20 20 20 20 20 20 20 20 20  GRESS,          
7bf0: 44 42 5f 52 45 4b 45 59 2c 20 20 20 20 20 20 20  DB_REKEY,       
7c00: 20 20 20 20 20 44 42 5f 52 4f 4c 4c 42 41 43 4b       DB_ROLLBACK
7c10: 5f 48 4f 4f 4b 2c 0a 20 20 20 20 44 42 5f 54 49  _HOOK,.    DB_TI
7c20: 4d 45 4f 55 54 2c 20 20 20 20 20 20 20 20 20 20  MEOUT,          
7c30: 20 44 42 5f 54 4f 54 41 4c 5f 43 48 41 4e 47 45   DB_TOTAL_CHANGE
7c40: 53 2c 20 20 20 20 44 42 5f 54 52 41 43 45 2c 0a  S,    DB_TRACE,.
7c50: 20 20 20 20 44 42 5f 54 52 41 4e 53 41 43 54 49      DB_TRANSACTI
7c60: 4f 4e 2c 20 20 20 20 20 20 20 44 42 5f 55 50 44  ON,       DB_UPD
7c70: 41 54 45 5f 48 4f 4f 4b 2c 20 20 20 20 20 20 44  ATE_HOOK,      D
7c80: 42 5f 56 45 52 53 49 4f 4e 0a 20 20 7d 3b 0a 20  B_VERSION.  };. 
7c90: 20 2f 2a 20 64 6f 6e 27 74 20 6c 65 61 76 65 20   /* don't leave 
7ca0: 74 72 61 69 6c 69 6e 67 20 63 6f 6d 6d 61 73 20  trailing commas 
7cb0: 6f 6e 20 44 42 5f 65 6e 75 6d 2c 20 69 74 20 63  on DB_enum, it c
7cc0: 6f 6e 66 75 73 65 73 20 74 68 65 20 41 49 58 20  onfuses the AIX 
7cd0: 78 6c 63 20 63 6f 6d 70 69 6c 65 72 20 2a 2f 0a  xlc compiler */.
7ce0: 0a 20 20 69 66 28 20 6f 62 6a 63 3c 32 20 29 7b  .  if( objc<2 ){
7cf0: 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
7d00: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
7d10: 20 6f 62 6a 76 2c 20 22 53 55 42 43 4f 4d 4d 41   objv, "SUBCOMMA
7d20: 4e 44 20 2e 2e 2e 22 29 3b 0a 20 20 20 20 72 65  ND ...");.    re
7d30: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
7d40: 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65    }.  if( Tcl_Ge
7d50: 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e  tIndexFromObj(in
7d60: 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 44  terp, objv[1], D
7d70: 42 5f 73 74 72 73 2c 20 22 6f 70 74 69 6f 6e 22  B_strs, "option"
7d80: 2c 20 30 2c 20 26 63 68 6f 69 63 65 29 20 29 7b  , 0, &choice) ){
7d90: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
7da0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 73 77  ERROR;.  }..  sw
7db0: 69 74 63 68 28 20 28 65 6e 75 6d 20 44 42 5f 65  itch( (enum DB_e
7dc0: 6e 75 6d 29 63 68 6f 69 63 65 20 29 7b 0a 0a 20  num)choice ){.. 
7dd0: 20 2f 2a 20 20 20 20 24 64 62 20 61 75 74 68 6f   /*    $db autho
7de0: 72 69 7a 65 72 20 3f 43 41 4c 4c 42 41 43 4b 3f  rizer ?CALLBACK?
7df0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b  .  **.  ** Invok
7e00: 65 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c  e the given call
7e10: 62 61 63 6b 20 74 6f 20 61 75 74 68 6f 72 69 7a  back to authoriz
7e20: 65 20 65 61 63 68 20 53 51 4c 20 6f 70 65 72 61  e each SQL opera
7e30: 74 69 6f 6e 20 61 73 20 69 74 20 69 73 0a 20 20  tion as it is.  
7e40: 2a 2a 20 63 6f 6d 70 69 6c 65 64 2e 20 20 35 20  ** compiled.  5 
7e50: 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 61 70  arguments are ap
7e60: 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 63 61  pended to the ca
7e70: 6c 6c 62 61 63 6b 20 62 65 66 6f 72 65 20 69 74  llback before it
7e80: 20 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6b 65 64   is.  ** invoked
7e90: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 31  :.  **.  **   (1
7ea0: 29 20 54 68 65 20 61 75 74 68 6f 72 69 7a 61 74  ) The authorizat
7eb0: 69 6f 6e 20 74 79 70 65 20 28 65 78 3a 20 53 51  ion type (ex: SQ
7ec0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c  LITE_CREATE_TABL
7ed0: 45 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  E, SQLITE_INSERT
7ee0: 2c 20 2e 2e 2e 29 0a 20 20 2a 2a 20 20 20 28 32  , ...).  **   (2
7ef0: 29 20 46 69 72 73 74 20 64 65 73 63 72 69 70 74  ) First descript
7f00: 69 76 65 20 6e 61 6d 65 20 28 64 65 70 65 6e 64  ive name (depend
7f10: 73 20 6f 6e 20 61 75 74 68 6f 72 69 7a 61 74 69  s on authorizati
7f20: 6f 6e 20 74 79 70 65 29 0a 20 20 2a 2a 20 20 20  on type).  **   
7f30: 28 33 29 20 53 65 63 6f 6e 64 20 64 65 73 63 72  (3) Second descr
7f40: 69 70 74 69 76 65 20 6e 61 6d 65 0a 20 20 2a 2a  iptive name.  **
7f50: 20 20 20 28 34 29 20 4e 61 6d 65 20 6f 66 20 74     (4) Name of t
7f60: 68 65 20 64 61 74 61 62 61 73 65 20 28 65 78 3a  he database (ex:
7f70: 20 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 29   "main", "temp")
7f80: 0a 20 20 2a 2a 20 20 20 28 35 29 20 4e 61 6d 65  .  **   (5) Name
7f90: 20 6f 66 20 74 72 69 67 67 65 72 20 74 68 61 74   of trigger that
7fa0: 20 69 73 20 64 6f 69 6e 67 20 74 68 65 20 61 63   is doing the ac
7fb0: 63 65 73 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  cess.  **.  ** T
7fc0: 68 65 20 63 61 6c 6c 62 61 63 6b 20 73 68 6f 75  he callback shou
7fd0: 6c 64 20 72 65 74 75 72 6e 20 6f 6e 20 6f 66 20  ld return on of 
7fe0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
7ff0: 72 69 6e 67 73 3a 20 53 51 4c 49 54 45 5f 4f 4b  rings: SQLITE_OK
8000: 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 49 47  ,.  ** SQLITE_IG
8010: 4e 4f 52 45 2c 20 6f 72 20 53 51 4c 49 54 45 5f  NORE, or SQLITE_
8020: 44 45 4e 59 2e 20 20 41 6e 79 20 6f 74 68 65 72  DENY.  Any other
8030: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
8040: 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2a 0a   an error..  **.
8050: 20 20 2a 2a 20 49 66 20 74 68 69 73 20 6d 65 74    ** If this met
8060: 68 6f 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 77  hod is invoked w
8070: 69 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73  ith no arguments
8080: 2c 20 74 68 65 20 63 75 72 72 65 6e 74 20 61 75  , the current au
8090: 74 68 6f 72 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a  thorization.  **
80a0: 20 63 61 6c 6c 62 61 63 6b 20 73 74 72 69 6e 67   callback string
80b0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20   is returned..  
80c0: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 41 55 54  */.  case DB_AUT
80d0: 48 4f 52 49 5a 45 52 3a 20 7b 0a 23 69 66 64 65  HORIZER: {.#ifde
80e0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
80f0: 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20  THORIZATION.    
8100: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
8110: 28 69 6e 74 65 72 70 2c 20 22 61 75 74 68 6f 72  (interp, "author
8120: 69 7a 61 74 69 6f 6e 20 6e 6f 74 20 61 76 61 69  ization not avai
8130: 6c 61 62 6c 65 20 69 6e 20 74 68 69 73 20 62 75  lable in this bu
8140: 69 6c 64 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  ild", 0);.    re
8150: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8160: 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 6f 62  #else.    if( ob
8170: 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63  jc>3 ){.      Tc
8180: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
8190: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
81a0: 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20  "?CALLBACK?");. 
81b0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
81c0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65  ERROR;.    }else
81d0: 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a   if( objc==2 ){.
81e0: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
81f0: 41 75 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Auth ){.        
8200: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
8210: 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 41  (interp, pDb->zA
8220: 75 74 68 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  uth, 0);.      }
8230: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8240: 20 20 63 68 61 72 20 2a 7a 41 75 74 68 3b 0a 20    char *zAuth;. 
8250: 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20       int len;.  
8260: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75      if( pDb->zAu
8270: 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  th ){.        Tc
8280: 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 41 75 74  l_Free(pDb->zAut
8290: 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  h);.      }.    
82a0: 20 20 7a 41 75 74 68 20 3d 20 54 63 6c 5f 47 65    zAuth = Tcl_Ge
82b0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
82c0: 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20  bjv[2], &len);. 
82d0: 20 20 20 20 20 69 66 28 20 7a 41 75 74 68 20 26       if( zAuth &
82e0: 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20  & len>0 ){.     
82f0: 20 20 20 70 44 62 2d 3e 7a 41 75 74 68 20 3d 20     pDb->zAuth = 
8300: 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b  Tcl_Alloc( len +
8310: 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65   1 );.        me
8320: 6d 63 70 79 28 70 44 62 2d 3e 7a 41 75 74 68 2c  mcpy(pDb->zAuth,
8330: 20 7a 41 75 74 68 2c 20 6c 65 6e 2b 31 29 3b 0a   zAuth, len+1);.
8340: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8350: 20 20 20 20 20 70 44 62 2d 3e 7a 41 75 74 68 20       pDb->zAuth 
8360: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
8370: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74     if( pDb->zAut
8380: 68 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  h ){.        pDb
8390: 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  ->interp = inter
83a0: 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  p;.        sqlit
83b0: 65 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65  e3_set_authorize
83c0: 72 28 70 44 62 2d 3e 64 62 2c 20 61 75 74 68 5f  r(pDb->db, auth_
83d0: 63 61 6c 6c 62 61 63 6b 2c 20 70 44 62 29 3b 0a  callback, pDb);.
83e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
83f0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74       sqlite3_set
8400: 5f 61 75 74 68 6f 72 69 7a 65 72 28 70 44 62 2d  _authorizer(pDb-
8410: 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  >db, 0, 0);.    
8420: 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
8430: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
8440: 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 62 75 73  .  /*    $db bus
8450: 79 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a  y ?CALLBACK?.  *
8460: 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  *.  ** Invoke th
8470: 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b  e given callback
8480: 20 69 66 20 61 6e 20 53 51 4c 20 73 74 61 74 65   if an SQL state
8490: 6d 65 6e 74 20 61 74 74 65 6d 70 74 73 20 74 6f  ment attempts to
84a0: 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 6c 6f 63   open.  ** a loc
84b0: 6b 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  ked database fil
84c0: 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  e..  */.  case D
84d0: 42 5f 42 55 53 59 3a 20 7b 0a 20 20 20 20 69 66  B_BUSY: {.    if
84e0: 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20  ( objc>3 ){.    
84f0: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
8500: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
8510: 6a 76 2c 20 22 43 41 4c 4c 42 41 43 4b 22 29 3b  jv, "CALLBACK");
8520: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
8530: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c  L_ERROR;.    }el
8540: 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29  se if( objc==2 )
8550: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  {.      if( pDb-
8560: 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 20 20  >zBusy ){.      
8570: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
8580: 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e  lt(interp, pDb->
8590: 7a 42 75 73 79 2c 20 30 29 3b 0a 20 20 20 20 20  zBusy, 0);.     
85a0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
85b0: 20 20 20 20 63 68 61 72 20 2a 7a 42 75 73 79 3b      char *zBusy;
85c0: 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  .      int len;.
85d0: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
85e0: 42 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Busy ){.        
85f0: 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 42  Tcl_Free(pDb->zB
8600: 75 73 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  usy);.      }.  
8610: 20 20 20 20 7a 42 75 73 79 20 3d 20 54 63 6c 5f      zBusy = Tcl_
8620: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
8630: 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b  (objv[2], &len);
8640: 0a 20 20 20 20 20 20 69 66 28 20 7a 42 75 73 79  .      if( zBusy
8650: 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20   && len>0 ){.   
8660: 20 20 20 20 20 70 44 62 2d 3e 7a 42 75 73 79 20       pDb->zBusy 
8670: 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e  = Tcl_Alloc( len
8680: 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20   + 1 );.        
8690: 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 42 75 73  memcpy(pDb->zBus
86a0: 79 2c 20 7a 42 75 73 79 2c 20 6c 65 6e 2b 31 29  y, zBusy, len+1)
86b0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
86c0: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 42 75 73         pDb->zBus
86d0: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  y = 0;.      }. 
86e0: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 42       if( pDb->zB
86f0: 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70  usy ){.        p
8700: 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74  Db->interp = int
8710: 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  erp;.        sql
8720: 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65  ite3_busy_handle
8730: 72 28 70 44 62 2d 3e 64 62 2c 20 44 62 42 75 73  r(pDb->db, DbBus
8740: 79 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a  yHandler, pDb);.
8750: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8760: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73       sqlite3_bus
8770: 79 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64  y_handler(pDb->d
8780: 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  b, 0, 0);.      
8790: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  }.    }.    brea
87a0: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
87b0: 20 24 64 62 20 63 61 63 68 65 20 66 6c 75 73 68   $db cache flush
87c0: 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63 61  .  **     $db ca
87d0: 63 68 65 20 73 69 7a 65 20 6e 0a 20 20 2a 2a 0a  che size n.  **.
87e0: 20 20 2a 2a 20 46 6c 75 73 68 20 74 68 65 20 70    ** Flush the p
87f0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
8800: 74 20 63 61 63 68 65 2c 20 6f 72 20 73 65 74 20  t cache, or set 
8810: 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
8820: 65 72 20 6f 66 0a 20 20 2a 2a 20 63 61 63 68 65  er of.  ** cache
8830: 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20  d statements..  
8840: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 41 43  */.  case DB_CAC
8850: 48 45 3a 20 7b 0a 20 20 20 20 63 68 61 72 20 2a  HE: {.    char *
8860: 73 75 62 43 6d 64 3b 0a 20 20 20 20 69 6e 74 20  subCmd;.    int 
8870: 6e 3b 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  n;..    if( objc
8880: 3c 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  <=2 ){.      Tcl
8890: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
88a0: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
88b0: 63 61 63 68 65 20 6f 70 74 69 6f 6e 20 3f 61 72  cache option ?ar
88c0: 67 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  g?");.      retu
88d0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
88e0: 20 20 7d 0a 20 20 20 20 73 75 62 43 6d 64 20 3d    }.    subCmd =
88f0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
8900: 6f 6d 4f 62 6a 28 20 6f 62 6a 76 5b 32 5d 2c 20  omObj( objv[2], 
8910: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 2a 73 75  0 );.    if( *su
8920: 62 43 6d 64 3d 3d 27 66 27 20 26 26 20 73 74 72  bCmd=='f' && str
8930: 63 6d 70 28 73 75 62 43 6d 64 2c 22 66 6c 75 73  cmp(subCmd,"flus
8940: 68 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  h")==0 ){.      
8950: 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
8960: 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67         Tcl_Wrong
8970: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
8980: 32 2c 20 6f 62 6a 76 2c 20 22 66 6c 75 73 68 22  2, objv, "flush"
8990: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
89a0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
89b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
89c0: 20 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65    flushStmtCache
89d0: 28 20 70 44 62 20 29 3b 0a 20 20 20 20 20 20 7d  ( pDb );.      }
89e0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 2a  .    }else if( *
89f0: 73 75 62 43 6d 64 3d 3d 27 73 27 20 26 26 20 73  subCmd=='s' && s
8a00: 74 72 63 6d 70 28 73 75 62 43 6d 64 2c 22 73 69  trcmp(subCmd,"si
8a10: 7a 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ze")==0 ){.     
8a20: 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a   if( objc!=4 ){.
8a30: 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e          Tcl_Wron
8a40: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
8a50: 20 32 2c 20 6f 62 6a 76 2c 20 22 73 69 7a 65 20   2, objv, "size 
8a60: 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  n");.        ret
8a70: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
8a80: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8a90: 20 20 20 20 69 66 28 20 54 43 4c 5f 45 52 52 4f      if( TCL_ERRO
8aa0: 52 3d 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  R==Tcl_GetIntFro
8ab0: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
8ac0: 76 5b 33 5d 2c 20 26 6e 29 20 29 7b 0a 20 20 20  v[3], &n) ){.   
8ad0: 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
8ae0: 64 52 65 73 75 6c 74 28 20 69 6e 74 65 72 70 2c  dResult( interp,
8af0: 20 22 63 61 6e 6e 6f 74 20 63 6f 6e 76 65 72 74   "cannot convert
8b00: 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 20 20   \"", .         
8b10: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
8b20: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
8b30: 33 5d 2c 30 29 2c 20 22 5c 22 20 74 6f 20 69 6e  3],0), "\" to in
8b40: 74 65 67 65 72 22 2c 20 30 29 3b 0a 20 20 20 20  teger", 0);.    
8b50: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
8b60: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
8b70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
8b80: 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20   if( n<0 ){.    
8b90: 20 20 20 20 20 20 20 20 66 6c 75 73 68 53 74 6d          flushStm
8ba0: 74 43 61 63 68 65 28 20 70 44 62 20 29 3b 0a 20  tCache( pDb );. 
8bb0: 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 30             n = 0
8bc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
8bd0: 65 20 69 66 28 20 6e 3e 4d 41 58 5f 50 52 45 50  e if( n>MAX_PREP
8be0: 41 52 45 44 5f 53 54 4d 54 53 20 29 7b 0a 20 20  ARED_STMTS ){.  
8bf0: 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 4d 41            n = MA
8c00: 58 5f 50 52 45 50 41 52 45 44 5f 53 54 4d 54 53  X_PREPARED_STMTS
8c10: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
8c20: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 6d 61 78          pDb->max
8c30: 53 74 6d 74 20 3d 20 6e 3b 0a 20 20 20 20 20 20  Stmt = n;.      
8c40: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
8c50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c  }else{.      Tcl
8c60: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 20 69  _AppendResult( i
8c70: 6e 74 65 72 70 2c 20 22 62 61 64 20 6f 70 74 69  nterp, "bad opti
8c80: 6f 6e 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  on \"", .       
8c90: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
8ca0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
8cb0: 30 29 2c 20 22 5c 22 3a 20 6d 75 73 74 20 62 65  0), "\": must be
8cc0: 20 66 6c 75 73 68 20 6f 72 20 73 69 7a 65 22 2c   flush or size",
8cd0: 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   0);.      retur
8ce0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
8cf0: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
8d00: 7d 0a 0a 20 20 2f 2a 20 20 20 20 20 24 64 62 20  }..  /*     $db 
8d10: 63 68 61 6e 67 65 73 0a 20 20 2a 2a 0a 20 20 2a  changes.  **.  *
8d20: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
8d30: 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
8d40: 20 77 65 72 65 20 6d 6f 64 69 66 69 65 64 2c 20   were modified, 
8d50: 69 6e 73 65 72 74 65 64 2c 20 6f 72 20 64 65 6c  inserted, or del
8d60: 65 74 65 64 20 62 79 0a 20 20 2a 2a 20 74 68 65  eted by.  ** the
8d70: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 49 4e 53   most recent INS
8d80: 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44  ERT, UPDATE or D
8d90: 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c  ELETE statement,
8da0: 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67 20 0a   not including .
8db0: 20 20 2a 2a 20 61 6e 79 20 63 68 61 6e 67 65 73    ** any changes
8dc0: 20 6d 61 64 65 20 62 79 20 74 72 69 67 67 65 72   made by trigger
8dd0: 20 70 72 6f 67 72 61 6d 73 2e 0a 20 20 2a 2f 0a   programs..  */.
8de0: 20 20 63 61 73 65 20 44 42 5f 43 48 41 4e 47 45    case DB_CHANGE
8df0: 53 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  S: {.    Tcl_Obj
8e00: 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 69   *pResult;.    i
8e10: 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
8e20: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
8e30: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
8e40: 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 20  objv, "");.     
8e50: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
8e60: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 52 65  R;.    }.    pRe
8e70: 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62  sult = Tcl_GetOb
8e80: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  jResult(interp);
8e90: 0a 20 20 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f  .    Tcl_SetIntO
8ea0: 62 6a 28 70 52 65 73 75 6c 74 2c 20 73 71 6c 69  bj(pResult, sqli
8eb0: 74 65 33 5f 63 68 61 6e 67 65 73 28 70 44 62 2d  te3_changes(pDb-
8ec0: 3e 64 62 29 29 3b 0a 20 20 20 20 62 72 65 61 6b  >db));.    break
8ed0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24  ;.  }..  /*    $
8ee0: 64 62 20 63 6c 6f 73 65 0a 20 20 2a 2a 0a 20 20  db close.  **.  
8ef0: 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20  ** Shutdown the 
8f00: 64 61 74 61 62 61 73 65 0a 20 20 2a 2f 0a 20 20  database.  */.  
8f10: 63 61 73 65 20 44 42 5f 43 4c 4f 53 45 3a 20 7b  case DB_CLOSE: {
8f20: 0a 20 20 20 20 54 63 6c 5f 44 65 6c 65 74 65 43  .    Tcl_DeleteC
8f30: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 54  ommand(interp, T
8f40: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
8f50: 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 29  Obj(objv[0], 0))
8f60: 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
8f70: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  /*.  **     
8f80: 24 64 62 20 63 6f 6c 6c 61 74 65 20 4e 41 4d 45  $db collate NAME
8f90: 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a   SCRIPT.  **.  *
8fa0: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53  * Create a new S
8fb0: 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e  QL collation fun
8fc0: 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d  ction called NAM
8fd0: 45 2e 20 20 57 68 65 6e 65 76 65 72 0a 20 20 2a  E.  Whenever.  *
8fe0: 2a 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20  * that function 
8ff0: 69 73 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b  is called, invok
9000: 65 20 53 43 52 49 50 54 20 74 6f 20 65 76 61 6c  e SCRIPT to eval
9010: 75 61 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f  uate the functio
9020: 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  n..  */.  case D
9030: 42 5f 43 4f 4c 4c 41 54 45 3a 20 7b 0a 20 20 20  B_COLLATE: {.   
9040: 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43 6f   SqlCollate *pCo
9050: 6c 6c 61 74 65 3b 0a 20 20 20 20 63 68 61 72 20  llate;.    char 
9060: 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 68 61 72  *zName;.    char
9070: 20 2a 7a 53 63 72 69 70 74 3b 0a 20 20 20 20 69   *zScript;.    i
9080: 6e 74 20 6e 53 63 72 69 70 74 3b 0a 20 20 20 20  nt nScript;.    
9090: 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
90a0: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
90b0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
90c0: 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20 53 43 52   objv, "NAME SCR
90d0: 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74  IPT");.      ret
90e0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
90f0: 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d     }.    zName =
9100: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
9110: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30  omObj(objv[2], 0
9120: 29 3b 0a 20 20 20 20 7a 53 63 72 69 70 74 20 3d  );.    zScript =
9130: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
9140: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26  omObj(objv[3], &
9150: 6e 53 63 72 69 70 74 29 3b 0a 20 20 20 20 70 43  nScript);.    pC
9160: 6f 6c 6c 61 74 65 20 3d 20 28 53 71 6c 43 6f 6c  ollate = (SqlCol
9170: 6c 61 74 65 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28  late*)Tcl_Alloc(
9180: 20 73 69 7a 65 6f 66 28 2a 70 43 6f 6c 6c 61 74   sizeof(*pCollat
9190: 65 29 20 2b 20 6e 53 63 72 69 70 74 20 2b 20 31  e) + nScript + 1
91a0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c   );.    if( pCol
91b0: 6c 61 74 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  late==0 ) return
91c0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
91d0: 70 43 6f 6c 6c 61 74 65 2d 3e 69 6e 74 65 72 70  pCollate->interp
91e0: 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 70   = interp;.    p
91f0: 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78 74 20 3d  Collate->pNext =
9200: 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 3b 0a   pDb->pCollate;.
9210: 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 7a 53      pCollate->zS
9220: 63 72 69 70 74 20 3d 20 28 63 68 61 72 2a 29 26  cript = (char*)&
9230: 70 43 6f 6c 6c 61 74 65 5b 31 5d 3b 0a 20 20 20  pCollate[1];.   
9240: 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20 3d   pDb->pCollate =
9250: 20 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 6d   pCollate;.    m
9260: 65 6d 63 70 79 28 70 43 6f 6c 6c 61 74 65 2d 3e  emcpy(pCollate->
9270: 7a 53 63 72 69 70 74 2c 20 7a 53 63 72 69 70 74  zScript, zScript
9280: 2c 20 6e 53 63 72 69 70 74 2b 31 29 3b 0a 20 20  , nScript+1);.  
9290: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 72    if( sqlite3_cr
92a0: 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 70  eate_collation(p
92b0: 44 62 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 53  Db->db, zName, S
92c0: 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20 20 20  QLITE_UTF8, .   
92d0: 20 20 20 20 20 70 43 6f 6c 6c 61 74 65 2c 20 74       pCollate, t
92e0: 63 6c 53 71 6c 43 6f 6c 6c 61 74 65 29 20 29 7b  clSqlCollate) ){
92f0: 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65  .      Tcl_SetRe
9300: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
9310: 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72  ar *)sqlite3_err
9320: 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 54 43  msg(pDb->db), TC
9330: 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20  L_VOLATILE);.   
9340: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
9350: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  ROR;.    }.    b
9360: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
9370: 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63 6f 6c    **     $db col
9380: 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 20 53 43  lation_needed SC
9390: 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43  RIPT.  **.  ** C
93a0: 72 65 61 74 65 20 61 20 6e 65 77 20 53 51 4c 20  reate a new SQL 
93b0: 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69  collation functi
93c0: 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20  on called NAME. 
93d0: 20 57 68 65 6e 65 76 65 72 0a 20 20 2a 2a 20 74   Whenever.  ** t
93e0: 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  hat function is 
93f0: 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53  called, invoke S
9400: 43 52 49 50 54 20 74 6f 20 65 76 61 6c 75 61 74  CRIPT to evaluat
9410: 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a  e the function..
9420: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43    */.  case DB_C
9430: 4f 4c 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 3a  OLLATION_NEEDED:
9440: 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21   {.    if( objc!
9450: 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =3 ){.      Tcl_
9460: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
9470: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53  erp, 2, objv, "S
9480: 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72  CRIPT");.      r
9490: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
94a0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
94b0: 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64  Db->pCollateNeed
94c0: 65 64 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  ed ){.      Tcl_
94d0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62  DecrRefCount(pDb
94e0: 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64  ->pCollateNeeded
94f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 62  );.    }.    pDb
9500: 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64  ->pCollateNeeded
9510: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
9520: 4f 62 6a 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  Obj(objv[2]);.  
9530: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
9540: 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65  nt(pDb->pCollate
9550: 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 73 71 6c  Needed);.    sql
9560: 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e  ite3_collation_n
9570: 65 65 64 65 64 28 70 44 62 2d 3e 64 62 2c 20 70  eeded(pDb->db, p
9580: 44 62 2c 20 74 63 6c 43 6f 6c 6c 61 74 65 4e 65  Db, tclCollateNe
9590: 65 64 65 64 29 3b 0a 20 20 20 20 62 72 65 61 6b  eded);.    break
95a0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24  ;.  }..  /*    $
95b0: 64 62 20 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 20 3f  db commit_hook ?
95c0: 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20  CALLBACK?.  **. 
95d0: 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67   ** Invoke the g
95e0: 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 6a 75  iven callback ju
95f0: 73 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74  st before commit
9600: 74 69 6e 67 20 65 76 65 72 79 20 53 51 4c 20 74  ting every SQL t
9610: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a  ransaction..  **
9620: 20 49 66 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   If the callback
9630: 20 74 68 72 6f 77 73 20 61 6e 20 65 78 63 65 70   throws an excep
9640: 74 69 6f 6e 20 6f 72 20 72 65 74 75 72 6e 73 20  tion or returns 
9650: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74  non-zero, then t
9660: 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  he.  ** transact
9670: 69 6f 6e 20 69 73 20 61 62 6f 72 74 65 64 2e 20  ion is aborted. 
9680: 20 49 66 20 43 41 4c 4c 42 41 43 4b 20 69 73 20   If CALLBACK is 
9690: 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c  an empty string,
96a0: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 0a 20 20   the callback.  
96b0: 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e 0a  ** is disabled..
96c0: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43    */.  case DB_C
96d0: 4f 4d 4d 49 54 5f 48 4f 4f 4b 3a 20 7b 0a 20 20  OMMIT_HOOK: {.  
96e0: 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a    if( objc>3 ){.
96f0: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
9700: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
9710: 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41  , objv, "?CALLBA
9720: 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74  CK?");.      ret
9730: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9740: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a     }else if( obj
9750: 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66  c==2 ){.      if
9760: 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29  ( pDb->zCommit )
9770: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  {.        Tcl_Ap
9780: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
9790: 70 2c 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 2c  p, pDb->zCommit,
97a0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
97b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
97c0: 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 0a 20 20 20  ar *zCommit;.   
97d0: 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
97e0: 20 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d    if( pDb->zComm
97f0: 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  it ){.        Tc
9800: 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 43 6f 6d  l_Free(pDb->zCom
9810: 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mit);.      }.  
9820: 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 54 63      zCommit = Tc
9830: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
9840: 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e  bj(objv[2], &len
9850: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6f  );.      if( zCo
9860: 6d 6d 69 74 20 26 26 20 6c 65 6e 3e 30 20 29 7b  mmit && len>0 ){
9870: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 43  .        pDb->zC
9880: 6f 6d 6d 69 74 20 3d 20 54 63 6c 5f 41 6c 6c 6f  ommit = Tcl_Allo
9890: 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20  c( len + 1 );.  
98a0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62        memcpy(pDb
98b0: 2d 3e 7a 43 6f 6d 6d 69 74 2c 20 7a 43 6f 6d 6d  ->zCommit, zComm
98c0: 69 74 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20  it, len+1);.    
98d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
98e0: 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20   pDb->zCommit = 
98f0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
9900: 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69   if( pDb->zCommi
9910: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  t ){.        pDb
9920: 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  ->interp = inter
9930: 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  p;.        sqlit
9940: 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 70  e3_commit_hook(p
9950: 44 62 2d 3e 64 62 2c 20 44 62 43 6f 6d 6d 69 74  Db->db, DbCommit
9960: 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20  Handler, pDb);. 
9970: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9980: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d      sqlite3_comm
9990: 69 74 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c  it_hook(pDb->db,
99a0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
99b0: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
99c0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
99d0: 62 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c 0a 20  b complete SQL. 
99e0: 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
99f0: 54 52 55 45 20 69 66 20 53 51 4c 20 69 73 20 61  TRUE if SQL is a
9a00: 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c 20 73 74   complete SQL st
9a10: 61 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e  atement.  Return
9a20: 20 46 41 4c 53 45 20 69 66 0a 20 20 2a 2a 20 61   FALSE if.  ** a
9a30: 64 64 69 74 69 6f 6e 61 6c 20 6c 69 6e 65 73 20  dditional lines 
9a40: 6f 66 20 69 6e 70 75 74 20 61 72 65 20 6e 65 65  of input are nee
9a50: 64 65 64 2e 20 20 54 68 69 73 20 69 73 20 73 69  ded.  This is si
9a60: 6d 69 6c 61 72 20 74 6f 20 74 68 65 0a 20 20 2a  milar to the.  *
9a70: 2a 20 62 75 69 6c 74 2d 69 6e 20 22 69 6e 66 6f  * built-in "info
9a80: 20 63 6f 6d 70 6c 65 74 65 22 20 63 6f 6d 6d 61   complete" comma
9a90: 6e 64 20 6f 66 20 54 63 6c 2e 0a 20 20 2a 2f 0a  nd of Tcl..  */.
9aa0: 20 20 63 61 73 65 20 44 42 5f 43 4f 4d 50 4c 45    case DB_COMPLE
9ab0: 54 45 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53 51  TE: {.#ifndef SQ
9ac0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45  LITE_OMIT_COMPLE
9ad0: 54 45 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  TE.    Tcl_Obj *
9ae0: 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74  pResult;.    int
9af0: 20 69 73 43 6f 6d 70 6c 65 74 65 3b 0a 20 20 20   isComplete;.   
9b00: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
9b10: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
9b20: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
9b30: 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 22 29 3b 0a  , objv, "SQL");.
9b40: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
9b50: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
9b60: 20 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 73    isComplete = s
9b70: 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 28  qlite3_complete(
9b80: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
9b90: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30  omObj(objv[2], 0
9ba0: 29 20 29 3b 0a 20 20 20 20 70 52 65 73 75 6c 74  ) );.    pResult
9bb0: 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73   = Tcl_GetObjRes
9bc0: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  ult(interp);.   
9bd0: 20 54 63 6c 5f 53 65 74 42 6f 6f 6c 65 61 6e 4f   Tcl_SetBooleanO
9be0: 62 6a 28 70 52 65 73 75 6c 74 2c 20 69 73 43 6f  bj(pResult, isCo
9bf0: 6d 70 6c 65 74 65 29 3b 0a 23 65 6e 64 69 66 0a  mplete);.#endif.
9c00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
9c10: 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6f 70 79    /*    $db copy
9c20: 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69   conflict-algori
9c30: 74 68 6d 20 74 61 62 6c 65 20 66 69 6c 65 6e 61  thm table filena
9c40: 6d 65 20 3f 53 45 50 41 52 41 54 4f 52 3f 20 3f  me ?SEPARATOR? ?
9c50: 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f 0a 20  NULLINDICATOR?. 
9c60: 20 2a 2a 0a 20 20 2a 2a 20 43 6f 70 79 20 64 61   **.  ** Copy da
9c70: 74 61 20 69 6e 74 6f 20 74 61 62 6c 65 20 66 72  ta into table fr
9c80: 6f 6d 20 66 69 6c 65 6e 61 6d 65 2c 20 6f 70 74  om filename, opt
9c90: 69 6f 6e 61 6c 6c 79 20 75 73 69 6e 67 20 53 45  ionally using SE
9ca0: 50 41 52 41 54 4f 52 0a 20 20 2a 2a 20 61 73 20  PARATOR.  ** as 
9cb0: 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72  column separator
9cc0: 73 2e 20 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20  s.  If a column 
9cd0: 63 6f 6e 74 61 69 6e 73 20 61 20 6e 75 6c 6c 20  contains a null 
9ce0: 73 74 72 69 6e 67 2c 20 6f 72 20 74 68 65 0a 20  string, or the. 
9cf0: 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 4e 55 4c   ** value of NUL
9d00: 4c 49 4e 44 49 43 41 54 4f 52 2c 20 61 20 4e 55  LINDICATOR, a NU
9d10: 4c 4c 20 69 73 20 69 6e 73 65 72 74 65 64 20 66  LL is inserted f
9d20: 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 20  or the column.. 
9d30: 20 2a 2a 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67   ** conflict-alg
9d40: 6f 72 69 74 68 6d 20 69 73 20 6f 6e 65 20 6f 66  orithm is one of
9d50: 20 74 68 65 20 73 71 6c 69 74 65 20 63 6f 6e 66   the sqlite conf
9d60: 6c 69 63 74 20 61 6c 67 6f 72 69 74 68 6d 73 3a  lict algorithms:
9d70: 0a 20 20 2a 2a 20 20 20 20 72 6f 6c 6c 62 61 63  .  **    rollbac
9d80: 6b 2c 20 61 62 6f 72 74 2c 20 66 61 69 6c 2c 20  k, abort, fail, 
9d90: 69 67 6e 6f 72 65 2c 20 72 65 70 6c 61 63 65 0a  ignore, replace.
9da0: 20 20 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c    ** On success,
9db0: 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   return the numb
9dc0: 65 72 20 6f 66 20 6c 69 6e 65 73 20 70 72 6f 63  er of lines proc
9dd0: 65 73 73 65 64 2c 20 6e 6f 74 20 6e 65 63 65 73  essed, not neces
9de0: 73 61 72 69 6c 79 20 73 61 6d 65 0a 20 20 2a 2a  sarily same.  **
9df0: 20 61 73 20 27 64 62 20 63 68 61 6e 67 65 73 27   as 'db changes'
9e00: 20 64 75 65 20 74 6f 20 63 6f 6e 66 6c 69 63 74   due to conflict
9e10: 2d 61 6c 67 6f 72 69 74 68 6d 20 73 65 6c 65 63  -algorithm selec
9e20: 74 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ted..  **.  ** T
9e30: 68 69 73 20 63 6f 64 65 20 69 73 20 62 61 73 69  his code is basi
9e40: 63 61 6c 6c 79 20 61 6e 20 69 6d 70 6c 65 6d 65  cally an impleme
9e50: 6e 74 61 74 69 6f 6e 2f 65 6e 68 61 6e 63 65 6d  ntation/enhancem
9e60: 65 6e 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  ent of.  ** the 
9e70: 73 71 6c 69 74 65 33 20 73 68 65 6c 6c 2e 63 20  sqlite3 shell.c 
9e80: 22 2e 69 6d 70 6f 72 74 22 20 63 6f 6d 6d 61 6e  ".import" comman
9e90: 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  d..  **.  ** Thi
9ea0: 73 20 63 6f 6d 6d 61 6e 64 20 75 73 61 67 65 20  s command usage 
9eb0: 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
9ec0: 20 74 68 65 20 73 71 6c 69 74 65 32 2e 78 20 43   the sqlite2.x C
9ed0: 4f 50 59 20 73 74 61 74 65 6d 65 6e 74 2c 0a 20  OPY statement,. 
9ee0: 20 2a 2a 20 77 68 69 63 68 20 69 6d 70 6f 72 74   ** which import
9ef0: 73 20 66 69 6c 65 20 64 61 74 61 20 69 6e 74 6f  s file data into
9f00: 20 61 20 74 61 62 6c 65 20 75 73 69 6e 67 20 74   a table using t
9f10: 68 65 20 50 6f 73 74 67 72 65 53 51 4c 20 43 4f  he PostgreSQL CO
9f20: 50 59 20 66 69 6c 65 20 66 6f 72 6d 61 74 3a 0a  PY file format:.
9f30: 20 20 2a 2a 20 20 20 24 64 62 20 63 6f 70 79 20    **   $db copy 
9f40: 24 63 6f 6e 66 6c 69 74 5f 61 6c 67 6f 20 24 74  $conflit_algo $t
9f50: 61 62 6c 65 5f 6e 61 6d 65 20 24 66 69 6c 65 6e  able_name $filen
9f60: 61 6d 65 20 5c 74 20 5c 5c 4e 0a 20 20 2a 2f 0a  ame \t \\N.  */.
9f70: 20 20 63 61 73 65 20 44 42 5f 43 4f 50 59 3a 20    case DB_COPY: 
9f80: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62  {.    char *zTab
9f90: 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
9fa0: 20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61 74 61    /* Insert data
9fb0: 20 69 6e 74 6f 20 74 68 69 73 20 74 61 62 6c 65   into this table
9fc0: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 46   */.    char *zF
9fd0: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
9fe0: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
9ff0: 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 65 78  from which to ex
a000: 74 72 61 63 74 20 64 61 74 61 20 2a 2f 0a 20 20  tract data */.  
a010: 20 20 63 68 61 72 20 2a 7a 43 6f 6e 66 6c 69 63    char *zConflic
a020: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
a030: 20 54 68 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c   The conflict al
a040: 67 6f 72 69 74 68 6d 20 74 6f 20 75 73 65 20 2a  gorithm to use *
a050: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  /.    sqlite3_st
a060: 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20  mt *pStmt;      
a070: 20 20 2f 2a 20 41 20 73 74 61 74 65 6d 65 6e 74    /* A statement
a080: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c   */.    int nCol
a090: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a0a0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
a0b0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
a0c0: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74  table */.    int
a0d0: 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20   nByte;         
a0e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
a0f0: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61  er of bytes in a
a100: 6e 20 53 51 4c 20 73 74 72 69 6e 67 20 2a 2f 0a  n SQL string */.
a110: 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20      int i, j;   
a120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a130: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
a140: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 70   */.    int nSep
a150: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a160: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
a170: 20 62 79 74 65 73 20 69 6e 20 7a 53 65 70 5b 5d   bytes in zSep[]
a180: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4e 75 6c   */.    int nNul
a190: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
a1a0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
a1b0: 20 62 79 74 65 73 20 69 6e 20 7a 4e 75 6c 6c 5b   bytes in zNull[
a1c0: 5d 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  ] */.    char *z
a1d0: 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sql;            
a1e0: 20 20 20 20 20 2f 2a 20 41 6e 20 53 51 4c 20 73       /* An SQL s
a1f0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
a200: 63 68 61 72 20 2a 7a 4c 69 6e 65 3b 20 20 20 20  char *zLine;    
a210: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
a220: 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f 66 20   single line of 
a230: 69 6e 70 75 74 20 66 72 6f 6d 20 74 68 65 20 66  input from the f
a240: 69 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  ile */.    char 
a250: 2a 2a 61 7a 43 6f 6c 3b 20 20 20 20 20 20 20 20  **azCol;        
a260: 20 20 20 20 20 20 20 2f 2a 20 7a 4c 69 6e 65 5b         /* zLine[
a270: 5d 20 62 72 6f 6b 65 6e 20 75 70 20 69 6e 74 6f  ] broken up into
a280: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20   columns */.    
a290: 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 20 20  char *zCommit;  
a2a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
a2b0: 6f 77 20 74 6f 20 63 6f 6d 6d 69 74 20 63 68 61  ow to commit cha
a2c0: 6e 67 65 73 20 2a 2f 0a 20 20 20 20 46 49 4c 45  nges */.    FILE
a2d0: 20 2a 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20   *in;           
a2e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
a2f0: 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 20  nput file */.   
a300: 20 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20 30 3b   int lineno = 0;
a310: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a320: 4c 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 69  Line number of i
a330: 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 20  nput file */.   
a340: 20 63 68 61 72 20 7a 4c 69 6e 65 4e 75 6d 5b 38   char zLineNum[8
a350: 30 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0];          /* 
a360: 4c 69 6e 65 20 6e 75 6d 62 65 72 20 70 72 69 6e  Line number prin
a370: 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20  t buffer */.    
a380: 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74  Tcl_Obj *pResult
a390: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69  ;           /* i
a3a0: 6e 74 65 72 70 20 72 65 73 75 6c 74 20 2a 2f 0a  nterp result */.
a3b0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 65 70 3b  .    char *zSep;
a3c0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c  .    char *zNull
a3d0: 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3c 35  ;.    if( objc<5
a3e0: 20 7c 7c 20 6f 62 6a 63 3e 37 20 29 7b 0a 20 20   || objc>7 ){.  
a3f0: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
a400: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
a410: 6f 62 6a 76 2c 20 0a 20 20 20 20 20 20 20 20 20  objv, .         
a420: 22 43 4f 4e 46 4c 49 43 54 2d 41 4c 47 4f 52 49  "CONFLICT-ALGORI
a430: 54 48 4d 20 54 41 42 4c 45 20 46 49 4c 45 4e 41  THM TABLE FILENA
a440: 4d 45 20 3f 53 45 50 41 52 41 54 4f 52 3f 20 3f  ME ?SEPARATOR? ?
a450: 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f 22 29  NULLINDICATOR?")
a460: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
a470: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
a480: 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 3d 36 20      if( objc>=6 
a490: 29 7b 0a 20 20 20 20 20 20 7a 53 65 70 20 3d 20  ){.      zSep = 
a4a0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
a4b0: 6d 4f 62 6a 28 6f 62 6a 76 5b 35 5d 2c 20 30 29  mObj(objv[5], 0)
a4c0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
a4d0: 20 20 20 7a 53 65 70 20 3d 20 22 5c 74 22 3b 0a     zSep = "\t";.
a4e0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62      }.    if( ob
a4f0: 6a 63 3e 3d 37 20 29 7b 0a 20 20 20 20 20 20 7a  jc>=7 ){.      z
a500: 4e 75 6c 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74  Null = Tcl_GetSt
a510: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
a520: 5b 36 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  [6], 0);.    }el
a530: 73 65 7b 0a 20 20 20 20 20 20 7a 4e 75 6c 6c 20  se{.      zNull 
a540: 3d 20 22 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = "";.    }.    
a550: 7a 43 6f 6e 66 6c 69 63 74 20 3d 20 54 63 6c 5f  zConflict = Tcl_
a560: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
a570: 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20  (objv[2], 0);.  
a580: 20 20 7a 54 61 62 6c 65 20 3d 20 54 63 6c 5f 47    zTable = Tcl_G
a590: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
a5a0: 6f 62 6a 76 5b 33 5d 2c 20 30 29 3b 0a 20 20 20  objv[3], 0);.   
a5b0: 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74   zFile = Tcl_Get
a5c0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
a5d0: 6a 76 5b 34 5d 2c 20 30 29 3b 0a 20 20 20 20 6e  jv[4], 0);.    n
a5e0: 53 65 70 20 3d 20 73 74 72 6c 65 6e 28 7a 53 65  Sep = strlen(zSe
a5f0: 70 29 3b 0a 20 20 20 20 6e 4e 75 6c 6c 20 3d 20  p);.    nNull = 
a600: 73 74 72 6c 65 6e 28 7a 4e 75 6c 6c 29 3b 0a 20  strlen(zNull);. 
a610: 20 20 20 69 66 28 20 6e 53 65 70 3d 3d 30 20 29     if( nSep==0 )
a620: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
a630: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
a640: 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c  "Error: non-null
a650: 20 73 65 70 61 72 61 74 6f 72 20 72 65 71 75 69   separator requi
a660: 72 65 64 20 66 6f 72 20 63 6f 70 79 22 2c 30 29  red for copy",0)
a670: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
a680: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
a690: 20 20 20 20 69 66 28 73 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 5b 2d 61 72 67 63 6f  ion NAME [-argco
e990: 75 6e 74 20 4e 5d 20 53 43 52 49 50 54 0a 20 20  unt N] SCRIPT.  
e9a0: 2a 2a 0a 20 20 2a 2a 20 43 72 65 61 74 65 20 61  **.  ** Create a
e9b0: 20 6e 65 77 20 53 51 4c 20 66 75 6e 63 74 69 6f   new SQL functio
e9c0: 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20  n called NAME.  
e9d0: 57 68 65 6e 65 76 65 72 20 74 68 61 74 20 66 75  Whenever that fu
e9e0: 6e 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63  nction is.  ** c
e9f0: 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53 43  alled, invoke SC
ea00: 52 49 50 54 20 74 6f 20 65 76 61 6c 75 61 74 65  RIPT to evaluate
ea10: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20   the function.. 
ea20: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 46 55   */.  case DB_FU
ea30: 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 53 71  NCTION: {.    Sq
ea40: 6c 46 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20  lFunc *pFunc;.  
ea50: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69    Tcl_Obj *pScri
ea60: 70 74 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e  pt;.    char *zN
ea70: 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 6e 41 72  ame;.    int nAr
ea80: 67 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20  g = -1;.    if( 
ea90: 6f 62 6a 63 3d 3d 36 20 29 7b 0a 20 20 20 20 20  objc==6 ){.     
eaa0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
eab0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
eac0: 62 6a 76 5b 33 5d 29 3b 0a 20 20 20 20 20 20 69  bjv[3]);.      i
ead0: 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 29  nt n = strlen(z)
eae0: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 32 20  ;.      if( n>2 
eaf0: 26 26 20 73 74 72 6e 63 6d 70 28 7a 2c 20 22 2d  && strncmp(z, "-
eb00: 61 72 67 63 6f 75 6e 74 22 2c 6e 29 3d 3d 30 20  argcount",n)==0 
eb10: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 54  ){.        if( T
eb20: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
eb30: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d  (interp, objv[4]
eb40: 2c 20 26 6e 41 72 67 29 20 29 20 72 65 74 75 72  , &nArg) ) retur
eb50: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
eb60: 20 20 20 20 20 69 66 28 20 6e 41 72 67 3c 30 20       if( nArg<0 
eb70: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  ){.          Tcl
eb80: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
eb90: 74 65 72 70 2c 20 22 6e 75 6d 62 65 72 20 6f 66  terp, "number of
eba0: 20 61 72 67 75 6d 65 6e 74 73 20 6d 75 73 74 20   arguments must 
ebb0: 62 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 22  be non-negative"
ebc0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ebd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
ebe0: 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 20 20  ar*)0);.        
ebf0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
ec00: 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OR;.        }.  
ec10: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 63 72      }.      pScr
ec20: 69 70 74 20 3d 20 6f 62 6a 76 5b 35 5d 3b 0a 20  ipt = objv[5];. 
ec30: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a     }else if( obj
ec40: 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=4 ){.      Tc
ec50: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
ec60: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
ec70: 22 4e 41 4d 45 20 5b 2d 61 72 67 63 6f 75 6e 74  "NAME [-argcount
ec80: 20 4e 5d 20 53 43 52 49 50 54 22 29 3b 0a 20 20   N] SCRIPT");.  
ec90: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
eca0: 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  RROR;.    }else{
ecb0: 0a 20 20 20 20 20 20 70 53 63 72 69 70 74 20 3d  .      pScript =
ecc0: 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20 7d 0a   objv[3];.    }.
ecd0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f      zName = Tcl_
ece0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
ecf0: 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20  (objv[2], 0);.  
ed00: 20 20 70 46 75 6e 63 20 3d 20 66 69 6e 64 53 71    pFunc = findSq
ed10: 6c 46 75 6e 63 28 70 44 62 2c 20 7a 4e 61 6d 65  lFunc(pDb, zName
ed20: 29 3b 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63  );.    if( pFunc
ed30: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ==0 ) return TCL
ed40: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 69 66 28 20  _ERROR;.    if( 
ed50: 70 46 75 6e 63 2d 3e 70 53 63 72 69 70 74 20 29  pFunc->pScript )
ed60: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72  {.      Tcl_Decr
ed70: 52 65 66 43 6f 75 6e 74 28 70 46 75 6e 63 2d 3e  RefCount(pFunc->
ed80: 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20 7d 0a  pScript);.    }.
ed90: 20 20 20 20 70 46 75 6e 63 2d 3e 70 53 63 72 69      pFunc->pScri
eda0: 70 74 20 3d 20 70 53 63 72 69 70 74 3b 0a 20 20  pt = pScript;.  
edb0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
edc0: 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 20 20 20  nt(pScript);.   
edd0: 20 70 46 75 6e 63 2d 3e 75 73 65 45 76 61 6c 4f   pFunc->useEvalO
ede0: 62 6a 76 20 3d 20 73 61 66 65 54 6f 55 73 65 45  bjv = safeToUseE
edf0: 76 61 6c 4f 62 6a 76 28 69 6e 74 65 72 70 2c 20  valObjv(interp, 
ee00: 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20 72 63  pScript);.    rc
ee10: 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
ee20: 65 5f 66 75 6e 63 74 69 6f 6e 28 70 44 62 2d 3e  e_function(pDb->
ee30: 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c  db, zName, nArg,
ee40: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20   SQLITE_UTF8,.  
ee50: 20 20 20 20 20 20 70 46 75 6e 63 2c 20 74 63 6c        pFunc, tcl
ee60: 53 71 6c 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a  SqlFunc, 0, 0);.
ee70: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
ee80: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
ee90: 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  c = TCL_ERROR;. 
eea0: 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75       Tcl_SetResu
eeb0: 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
eec0: 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72 6d 73   *)sqlite3_errms
eed0: 67 28 70 44 62 2d 3e 64 62 29 2c 20 54 43 4c 5f  g(pDb->db), TCL_
eee0: 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 7d  VOLATILE);.    }
eef0: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
ef00: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24  .  /*.  **     $
ef10: 64 62 20 69 6e 63 72 62 6c 6f 62 20 3f 2d 72 65  db incrblob ?-re
ef20: 61 64 6f 6e 6c 79 3f 20 3f 44 42 3f 20 54 41 42  adonly? ?DB? TAB
ef30: 4c 45 20 43 4f 4c 55 4d 4e 20 52 4f 57 49 44 0a  LE COLUMN ROWID.
ef40: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 49    */.  case DB_I
ef50: 4e 43 52 42 4c 4f 42 3a 20 7b 0a 23 69 66 64 65  NCRBLOB: {.#ifde
ef60: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
ef70: 43 52 42 4c 4f 42 0a 20 20 20 20 54 63 6c 5f 41  CRBLOB.    Tcl_A
ef80: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
ef90: 72 70 2c 20 22 69 6e 63 72 62 6c 6f 62 20 6e 6f  rp, "incrblob no
efa0: 74 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74  t available in t
efb0: 68 69 73 20 62 75 69 6c 64 22 2c 20 30 29 3b 0a  his build", 0);.
efc0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
efd0: 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 20 20  RROR;.#else.    
efe0: 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20 3d  int isReadonly =
eff0: 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
f000: 61 72 20 2a 7a 44 62 20 3d 20 22 6d 61 69 6e 22  ar *zDb = "main"
f010: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
f020: 20 2a 7a 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f   *zTable;.    co
f030: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d  nst char *zColum
f040: 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 5f 69 6e  n;.    sqlite_in
f050: 74 36 34 20 69 52 6f 77 3b 0a 0a 20 20 20 20 2f  t64 iRow;..    /
f060: 2a 20 43 68 65 63 6b 20 66 6f 72 20 74 68 65 20  * Check for the 
f070: 2d 72 65 61 64 6f 6e 6c 79 20 6f 70 74 69 6f 6e  -readonly option
f080: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 62 6a 63   */.    if( objc
f090: 3e 33 20 26 26 20 73 74 72 63 6d 70 28 54 63 6c  >3 && strcmp(Tcl
f0a0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
f0b0: 32 5d 29 2c 20 22 2d 72 65 61 64 6f 6e 6c 79 22  2]), "-readonly"
f0c0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 73  )==0 ){.      is
f0d0: 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20  Readonly = 1;.  
f0e0: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a    }..    if( obj
f0f0: 63 21 3d 28 35 2b 69 73 52 65 61 64 6f 6e 6c 79  c!=(5+isReadonly
f100: 29 20 26 26 20 6f 62 6a 63 21 3d 28 36 2b 69 73  ) && objc!=(6+is
f110: 52 65 61 64 6f 6e 6c 79 29 20 29 7b 0a 20 20 20  Readonly) ){.   
f120: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
f130: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
f140: 62 6a 76 2c 20 22 3f 2d 72 65 61 64 6f 6e 6c 79  bjv, "?-readonly
f150: 3f 20 3f 44 42 3f 20 54 41 42 4c 45 20 43 4f 4c  ? ?DB? TABLE COL
f160: 55 4d 4e 20 52 4f 57 49 44 22 29 3b 0a 20 20 20  UMN ROWID");.   
f170: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
f180: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
f190: 69 66 28 20 6f 62 6a 63 3d 3d 28 36 2b 69 73 52  if( objc==(6+isR
f1a0: 65 61 64 6f 6e 6c 79 29 20 29 7b 0a 20 20 20 20  eadonly) ){.    
f1b0: 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53    zDb = Tcl_GetS
f1c0: 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
f1d0: 20 20 20 20 7d 0a 20 20 20 20 7a 54 61 62 6c 65      }.    zTable
f1e0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
f1f0: 28 6f 62 6a 76 5b 6f 62 6a 63 2d 33 5d 29 3b 0a  (objv[objc-3]);.
f200: 20 20 20 20 7a 43 6f 6c 75 6d 6e 20 3d 20 54 63      zColumn = Tc
f210: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
f220: 5b 6f 62 6a 63 2d 32 5d 29 3b 0a 20 20 20 20 72  [objc-2]);.    r
f230: 63 20 3d 20 54 63 6c 5f 47 65 74 57 69 64 65 49  c = Tcl_GetWideI
f240: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
f250: 2c 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 2c 20  , objv[objc-1], 
f260: 26 69 52 6f 77 29 3b 0a 0a 20 20 20 20 69 66 28  &iRow);..    if(
f270: 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20   rc==TCL_OK ){. 
f280: 20 20 20 20 20 72 63 20 3d 20 63 72 65 61 74 65       rc = create
f290: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 28  IncrblobChannel(
f2a0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 65 72  .          inter
f2b0: 70 2c 20 70 44 62 2c 20 7a 44 62 2c 20 7a 54 61  p, pDb, zDb, zTa
f2c0: 62 6c 65 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 69 52  ble, zColumn, iR
f2d0: 6f 77 2c 20 69 73 52 65 61 64 6f 6e 6c 79 0a 20  ow, isReadonly. 
f2e0: 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 23 65       );.    }.#e
f2f0: 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a  ndif.    break;.
f300: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
f310: 20 20 20 24 64 62 20 69 6e 74 65 72 72 75 70 74     $db interrupt
f320: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 74 65 72  .  **.  ** Inter
f330: 72 75 70 74 20 74 68 65 20 65 78 65 63 75 74 69  rupt the executi
f340: 6f 6e 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 2d  on of the inner-
f350: 6d 6f 73 74 20 53 51 4c 20 69 6e 74 65 72 70 72  most SQL interpr
f360: 65 74 65 72 2e 20 20 54 68 69 73 0a 20 20 2a 2a  eter.  This.  **
f370: 20 63 61 75 73 65 73 20 74 68 65 20 53 51 4c 20   causes the SQL 
f380: 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 72 65 74  statement to ret
f390: 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 6f 66 20  urn an error of 
f3a0: 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
f3b0: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
f3c0: 5f 49 4e 54 45 52 52 55 50 54 3a 20 7b 0a 20 20  _INTERRUPT: {.  
f3d0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72    sqlite3_interr
f3e0: 75 70 74 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20  upt(pDb->db);.  
f3f0: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
f400: 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20  /*.  **     $db 
f410: 6e 75 6c 6c 76 61 6c 75 65 20 3f 53 54 52 49 4e  nullvalue ?STRIN
f420: 47 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 68 61  G?.  **.  ** Cha
f430: 6e 67 65 20 74 65 78 74 20 75 73 65 64 20 77 68  nge text used wh
f440: 65 6e 20 61 20 4e 55 4c 4c 20 63 6f 6d 65 73 20  en a NULL comes 
f450: 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 64 61  back from the da
f460: 74 61 62 61 73 65 2e 20 49 66 20 3f 53 54 52 49  tabase. If ?STRI
f470: 4e 47 3f 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20  NG?.  ** is not 
f480: 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 74 68  present, then th
f490: 65 20 63 75 72 72 65 6e 74 20 73 74 72 69 6e 67  e current string
f4a0: 20 75 73 65 64 20 66 6f 72 20 4e 55 4c 4c 20 69   used for NULL i
f4b0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2a  s returned..  **
f4c0: 20 49 66 20 53 54 52 49 4e 47 20 69 73 20 70 72   If STRING is pr
f4d0: 65 73 65 6e 74 2c 20 74 68 65 6e 20 53 54 52 49  esent, then STRI
f4e0: 4e 47 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  NG is returned..
f4f0: 20 20 2a 2a 0a 20 20 2a 2f 0a 20 20 63 61 73 65    **.  */.  case
f500: 20 44 42 5f 4e 55 4c 4c 56 41 4c 55 45 3a 20 7b   DB_NULLVALUE: {
f510: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  .    if( objc!=2
f520: 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20   && objc!=3 ){. 
f530: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
f540: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
f550: 20 6f 62 6a 76 2c 20 22 4e 55 4c 4c 56 41 4c 55   objv, "NULLVALU
f560: 45 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  E");.      retur
f570: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
f580: 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d   }.    if( objc=
f590: 3d 33 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =3 ){.      int 
f5a0: 6c 65 6e 3b 0a 20 20 20 20 20 20 63 68 61 72 20  len;.      char 
f5b0: 2a 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 47 65 74  *zNull = Tcl_Get
f5c0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
f5d0: 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20  jv[2], &len);.  
f5e0: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 4e 75      if( pDb->zNu
f5f0: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  ll ){.        Tc
f600: 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 4e 75 6c  l_Free(pDb->zNul
f610: 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
f620: 20 20 69 66 28 20 7a 4e 75 6c 6c 20 26 26 20 6c    if( zNull && l
f630: 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  en>0 ){.        
f640: 70 44 62 2d 3e 7a 4e 75 6c 6c 20 3d 20 54 63 6c  pDb->zNull = Tcl
f650: 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20  _Alloc( len + 1 
f660: 29 3b 0a 20 20 20 20 20 20 20 20 73 74 72 6e 63  );.        strnc
f670: 70 79 28 70 44 62 2d 3e 7a 4e 75 6c 6c 2c 20 7a  py(pDb->zNull, z
f680: 4e 75 6c 6c 2c 20 6c 65 6e 29 3b 0a 20 20 20 20  Null, len);.    
f690: 20 20 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c 5b 6c      pDb->zNull[l
f6a0: 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  en] = '\0';.    
f6b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f6c0: 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 3d 20 30 3b   pDb->zNull = 0;
f6d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
f6e0: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
f6f0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 64 62 54 65  ult(interp, dbTe
f700: 78 74 54 6f 4f 62 6a 28 70 44 62 2d 3e 7a 4e 75  xtToObj(pDb->zNu
f710: 6c 6c 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  ll));.    break;
f720: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
f730: 20 20 20 20 24 64 62 20 6c 61 73 74 5f 69 6e 73      $db last_ins
f740: 65 72 74 5f 72 6f 77 69 64 20 0a 20 20 2a 2a 0a  ert_rowid .  **.
f750: 20 20 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 69    ** Return an i
f760: 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
f770: 74 68 65 20 52 4f 57 49 44 20 66 6f 72 20 74 68  the ROWID for th
f780: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 69 6e  e most recent in
f790: 73 65 72 74 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  sert..  */.  cas
f7a0: 65 20 44 42 5f 4c 41 53 54 5f 49 4e 53 45 52 54  e DB_LAST_INSERT
f7b0: 5f 52 4f 57 49 44 3a 20 7b 0a 20 20 20 20 54 63  _ROWID: {.    Tc
f7c0: 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a  l_Obj *pResult;.
f7d0: 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20      Tcl_WideInt 
f7e0: 72 6f 77 69 64 3b 0a 20 20 20 20 69 66 28 20 6f  rowid;.    if( o
f7f0: 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 20 20  bjc!=2 ){.      
f800: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
f810: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
f820: 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 72 65 74  , "");.      ret
f830: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
f840: 20 20 20 7d 0a 20 20 20 20 72 6f 77 69 64 20 3d     }.    rowid =
f850: 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e   sqlite3_last_in
f860: 73 65 72 74 5f 72 6f 77 69 64 28 70 44 62 2d 3e  sert_rowid(pDb->
f870: 64 62 29 3b 0a 20 20 20 20 70 52 65 73 75 6c 74  db);.    pResult
f880: 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73   = Tcl_GetObjRes
f890: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  ult(interp);.   
f8a0: 20 54 63 6c 5f 53 65 74 57 69 64 65 49 6e 74 4f   Tcl_SetWideIntO
f8b0: 62 6a 28 70 52 65 73 75 6c 74 2c 20 72 6f 77 69  bj(pResult, rowi
f8c0: 64 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  d);.    break;. 
f8d0: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68   }..  /*.  ** Th
f8e0: 65 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 20 6d  e DB_ONECOLUMN m
f8f0: 65 74 68 6f 64 20 69 73 20 69 6d 70 6c 65 6d 65  ethod is impleme
f900: 6e 74 65 64 20 74 6f 67 65 74 68 65 72 20 77 69  nted together wi
f910: 74 68 20 44 42 5f 45 56 41 4c 2e 0a 20 20 2a 2f  th DB_EVAL..  */
f920: 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 70 72  ..  /*    $db pr
f930: 6f 67 72 65 73 73 20 3f 4e 20 43 41 4c 4c 42 41  ogress ?N CALLBA
f940: 43 4b 3f 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 49  CK?.  ** .  ** I
f950: 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20  nvoke the given 
f960: 63 61 6c 6c 62 61 63 6b 20 65 76 65 72 79 20 4e  callback every N
f970: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
f980: 20 6f 70 63 6f 64 65 73 20 77 68 69 6c 65 20 65   opcodes while e
f990: 78 65 63 75 74 69 6e 67 0a 20 20 2a 2a 20 71 75  xecuting.  ** qu
f9a0: 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 63 61  eries..  */.  ca
f9b0: 73 65 20 44 42 5f 50 52 4f 47 52 45 53 53 3a 20  se DB_PROGRESS: 
f9c0: 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d  {.    if( objc==
f9d0: 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  2 ){.      if( p
f9e0: 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29 7b  Db->zProgress ){
f9f0: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70  .        Tcl_App
fa00: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
fa10: 2c 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73  , pDb->zProgress
fa20: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
fa30: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63    }else if( objc
fa40: 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ==4 ){.      cha
fa50: 72 20 2a 7a 50 72 6f 67 72 65 73 73 3b 0a 20 20  r *zProgress;.  
fa60: 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
fa70: 20 20 20 69 6e 74 20 4e 3b 0a 20 20 20 20 20 20     int N;.      
fa80: 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f  if( TCL_OK!=Tcl_
fa90: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
faa0: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
fab0: 4e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  N) ){.        re
fac0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
fad0: 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 69        };.      i
fae0: 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73  f( pDb->zProgres
faf0: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  s ){.        Tcl
fb00: 5f 46 72 65 65 28 70 44 62 2d 3e 7a 50 72 6f 67  _Free(pDb->zProg
fb10: 72 65 73 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ress);.      }. 
fb20: 20 20 20 20 20 7a 50 72 6f 67 72 65 73 73 20 3d       zProgress =
fb30: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
fb40: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26  omObj(objv[3], &
fb50: 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  len);.      if( 
fb60: 7a 50 72 6f 67 72 65 73 73 20 26 26 20 6c 65 6e  zProgress && len
fb70: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  >0 ){.        pD
fb80: 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 3d 20 54  b->zProgress = T
fb90: 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20  cl_Alloc( len + 
fba0: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  1 );.        mem
fbb0: 63 70 79 28 70 44 62 2d 3e 7a 50 72 6f 67 72 65  cpy(pDb->zProgre
fbc0: 73 73 2c 20 7a 50 72 6f 67 72 65 73 73 2c 20 6c  ss, zProgress, l
fbd0: 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  en+1);.      }el
fbe0: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  se{.        pDb-
fbf0: 3e 7a 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a  >zProgress = 0;.
fc00: 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
fc10: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47  SQLITE_OMIT_PROG
fc20: 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 20 20  RESS_CALLBACK.  
fc30: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72      if( pDb->zPr
fc40: 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20  ogress ){.      
fc50: 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20    pDb->interp = 
fc60: 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20  interp;.        
fc70: 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65 73 73  sqlite3_progress
fc80: 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62  _handler(pDb->db
fc90: 2c 20 4e 2c 20 44 62 50 72 6f 67 72 65 73 73 48  , N, DbProgressH
fca0: 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20  andler, pDb);.  
fcb0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
fcc0: 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 67 72     sqlite3_progr
fcd0: 65 73 73 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d  ess_handler(pDb-
fce0: 3e 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  >db, 0, 0, 0);. 
fcf0: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
fd00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54    }else{.      T
fd10: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
fd20: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
fd30: 20 22 4e 20 43 41 4c 4c 42 41 43 4b 22 29 3b 0a   "N CALLBACK");.
fd40: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
fd50: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
fd60: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
fd70: 2f 2a 20 20 20 20 24 64 62 20 70 72 6f 66 69 6c  /*    $db profil
fd80: 65 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a  e ?CALLBACK?.  *
fd90: 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 61 72 72 61  *.  ** Make arra
fda0: 6e 67 65 6d 65 6e 74 73 20 74 6f 20 69 6e 76 6f  ngements to invo
fdb0: 6b 65 20 74 68 65 20 43 41 4c 4c 42 41 43 4b 20  ke the CALLBACK 
fdc0: 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20 65 61  routine after ea
fdd0: 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ch SQL statement
fde0: 0a 20 20 2a 2a 20 74 68 61 74 20 68 61 73 20 72  .  ** that has r
fdf0: 75 6e 2e 20 20 54 68 65 20 74 65 78 74 20 6f 66  un.  The text of
fe00: 20 74 68 65 20 53 51 4c 20 61 6e 64 20 74 68 65   the SQL and the
fe10: 20 61 6d 6f 75 6e 74 20 6f 66 20 65 6c 61 70 73   amount of elaps
fe20: 65 20 74 69 6d 65 20 61 72 65 0a 20 20 2a 2a 20  e time are.  ** 
fe30: 61 70 70 65 6e 64 65 64 20 74 6f 20 43 41 4c 4c  appended to CALL
fe40: 42 41 43 4b 20 62 65 66 6f 72 65 20 74 68 65 20  BACK before the 
fe50: 73 63 72 69 70 74 20 69 73 20 72 75 6e 2e 0a 20  script is run.. 
fe60: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 50 52   */.  case DB_PR
fe70: 4f 46 49 4c 45 3a 20 7b 0a 20 20 20 20 69 66 28  OFILE: {.    if(
fe80: 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20   objc>3 ){.     
fe90: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
fea0: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
feb0: 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29  v, "?CALLBACK?")
fec0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
fed0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65  CL_ERROR;.    }e
fee0: 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20  lse if( objc==2 
fef0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  ){.      if( pDb
ff00: 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20  ->zProfile ){.  
ff10: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
ff20: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
ff30: 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20 30 29  Db->zProfile, 0)
ff40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
ff50: 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20  lse{.      char 
ff60: 2a 7a 50 72 6f 66 69 6c 65 3b 0a 20 20 20 20 20  *zProfile;.     
ff70: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20   int len;.      
ff80: 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c  if( pDb->zProfil
ff90: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  e ){.        Tcl
ffa0: 5f 46 72 65 65 28 70 44 62 2d 3e 7a 50 72 6f 66  _Free(pDb->zProf
ffb0: 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ile);.      }.  
ffc0: 20 20 20 20 7a 50 72 6f 66 69 6c 65 20 3d 20 54      zProfile = T
ffd0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
ffe0: 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65  Obj(objv[2], &le
fff0: 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50  n);.      if( zP
10000 72 6f 66 69 6c 65 20 26 26 20 6c 65 6e 3e 30 20  rofile && len>0 
10010 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
10020 7a 50 72 6f 66 69 6c 65 20 3d 20 54 63 6c 5f 41  zProfile = Tcl_A
10030 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b  lloc( len + 1 );
10040 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
10050 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20 7a  pDb->zProfile, z
10060 50 72 6f 66 69 6c 65 2c 20 6c 65 6e 2b 31 29 3b  Profile, len+1);
10070 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
10080 20 20 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f 66        pDb->zProf
10090 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ile = 0;.      }
100a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
100b0 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 20 20 20  OMIT_TRACE.     
100c0 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69   if( pDb->zProfi
100d0 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  le ){.        pD
100e0 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65  b->interp = inte
100f0 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  rp;.        sqli
10100 74 65 33 5f 70 72 6f 66 69 6c 65 28 70 44 62 2d  te3_profile(pDb-
10110 3e 64 62 2c 20 44 62 50 72 6f 66 69 6c 65 48 61  >db, DbProfileHa
10120 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20  ndler, pDb);.   
10130 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10140 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c    sqlite3_profil
10150 65 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29  e(pDb->db, 0, 0)
10160 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
10170 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
10180 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
10190 20 20 20 20 20 24 64 62 20 72 65 6b 65 79 20 4b       $db rekey K
101a0 45 59 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 68 61  EY.  **.  ** Cha
101b0 6e 67 65 20 74 68 65 20 65 6e 63 72 79 70 74 69  nge the encrypti
101c0 6f 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 63 75  on key on the cu
101d0 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 64 61 74  rrently open dat
101e0 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61  abase..  */.  ca
101f0 73 65 20 44 42 5f 52 45 4b 45 59 3a 20 7b 0a 20  se DB_REKEY: {. 
10200 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20     int nKey;.   
10210 20 76 6f 69 64 20 2a 70 4b 65 79 3b 0a 20 20 20   void *pKey;.   
10220 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
10230 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
10240 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
10250 2c 20 6f 62 6a 76 2c 20 22 4b 45 59 22 29 3b 0a  , objv, "KEY");.
10260 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
10270 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
10280 20 20 70 4b 65 79 20 3d 20 54 63 6c 5f 47 65 74    pKey = Tcl_Get
10290 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a  ByteArrayFromObj
102a0 28 6f 62 6a 76 5b 32 5d 2c 20 26 6e 4b 65 79 29  (objv[2], &nKey)
102b0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
102c0 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 72 63  HAS_CODEC.    rc
102d0 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 6b 65 79   = sqlite3_rekey
102e0 28 70 44 62 2d 3e 64 62 2c 20 70 4b 65 79 2c 20  (pDb->db, pKey, 
102f0 6e 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20 72  nKey);.    if( r
10300 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  c ){.      Tcl_A
10310 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
10320 72 70 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74  rp, sqlite3ErrSt
10330 72 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 20  r(rc), 0);.     
10340 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b   rc = TCL_ERROR;
10350 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
10360 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
10370 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20  /*.  **     $db 
10380 74 69 6d 65 6f 75 74 20 4d 49 4c 4c 45 53 45 43  timeout MILLESEC
10390 4f 4e 44 53 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44  ONDS.  **.  ** D
103a0 65 6c 61 79 20 66 6f 72 20 74 68 65 20 6e 75 6d  elay for the num
103b0 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f  ber of milliseco
103c0 6e 64 73 20 73 70 65 63 69 66 69 65 64 20 77 68  nds specified wh
103d0 65 6e 20 61 20 66 69 6c 65 20 69 73 20 6c 6f 63  en a file is loc
103e0 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ked..  */.  case
103f0 20 44 42 5f 54 49 4d 45 4f 55 54 3a 20 7b 0a 20   DB_TIMEOUT: {. 
10400 20 20 20 69 6e 74 20 6d 73 3b 0a 20 20 20 20 69     int ms;.    i
10410 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
10420 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
10430 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
10440 6f 62 6a 76 2c 20 22 4d 49 4c 4c 49 53 45 43 4f  objv, "MILLISECO
10450 4e 44 53 22 29 3b 0a 20 20 20 20 20 20 72 65 74  NDS");.      ret
10460 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
10470 20 20 20 7d 0a 20 20 20 20 69 66 28 20 54 63 6c     }.    if( Tcl
10480 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
10490 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
104a0 26 6d 73 29 20 29 20 72 65 74 75 72 6e 20 54 43  &ms) ) return TC
104b0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c  L_ERROR;.    sql
104c0 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75  ite3_busy_timeou
104d0 74 28 70 44 62 2d 3e 64 62 2c 20 6d 73 29 3b 0a  t(pDb->db, ms);.
104e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
104f0 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20   .  /*.  **     
10500 24 64 62 20 74 6f 74 61 6c 5f 63 68 61 6e 67 65  $db total_change
10510 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75  s.  **.  ** Retu
10520 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
10530 20 72 6f 77 73 20 74 68 61 74 20 77 65 72 65 20   rows that were 
10540 6d 6f 64 69 66 69 65 64 2c 20 69 6e 73 65 72 74  modified, insert
10550 65 64 2c 20 6f 72 20 64 65 6c 65 74 65 64 20 0a  ed, or deleted .
10560 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 20 64    ** since the d
10570 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 77  atabase handle w
10580 61 73 20 63 72 65 61 74 65 64 2e 0a 20 20 2a 2f  as created..  */
10590 0a 20 20 63 61 73 65 20 44 42 5f 54 4f 54 41 4c  .  case DB_TOTAL
105a0 5f 43 48 41 4e 47 45 53 3a 20 7b 0a 20 20 20 20  _CHANGES: {.    
105b0 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74  Tcl_Obj *pResult
105c0 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
105d0 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  2 ){.      Tcl_W
105e0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
105f0 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22 29  rp, 2, objv, "")
10600 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
10610 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
10620 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63      pResult = Tc
10630 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_GetObjResult(i
10640 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f  nterp);.    Tcl_
10650 53 65 74 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c  SetIntObj(pResul
10660 74 2c 20 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c  t, sqlite3_total
10670 5f 63 68 61 6e 67 65 73 28 70 44 62 2d 3e 64 62  _changes(pDb->db
10680 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  ));.    break;. 
10690 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20   }..  /*    $db 
106a0 74 72 61 63 65 20 3f 43 41 4c 4c 42 41 43 4b 3f  trace ?CALLBACK?
106b0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20  .  **.  ** Make 
106c0 61 72 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20  arrangements to 
106d0 69 6e 76 6f 6b 65 20 74 68 65 20 43 41 4c 4c 42  invoke the CALLB
106e0 41 43 4b 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  ACK routine for 
106f0 65 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65  each SQL stateme
10700 6e 74 0a 20 20 2a 2a 20 74 68 61 74 20 69 73 20  nt.  ** that is 
10710 65 78 65 63 75 74 65 64 2e 20 20 54 68 65 20 74  executed.  The t
10720 65 78 74 20 6f 66 20 74 68 65 20 53 51 4c 20 69  ext of the SQL i
10730 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 43 41  s appended to CA
10740 4c 4c 42 41 43 4b 20 62 65 66 6f 72 65 0a 20 20  LLBACK before.  
10750 2a 2a 20 69 74 20 69 73 20 65 78 65 63 75 74 65  ** it is execute
10760 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  d..  */.  case D
10770 42 5f 54 52 41 43 45 3a 20 7b 0a 20 20 20 20 69  B_TRACE: {.    i
10780 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20  f( objc>3 ){.   
10790 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
107a0 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
107b0 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f  bjv, "?CALLBACK?
107c0 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
107d0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
107e0 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d  }else if( objc==
107f0 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  2 ){.      if( p
10800 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20  Db->zTrace ){.  
10810 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
10820 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
10830 44 62 2d 3e 7a 54 72 61 63 65 2c 20 30 29 3b 0a  Db->zTrace, 0);.
10840 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
10850 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  e{.      char *z
10860 54 72 61 63 65 3b 0a 20 20 20 20 20 20 69 6e 74  Trace;.      int
10870 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20   len;.      if( 
10880 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20  pDb->zTrace ){. 
10890 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28         Tcl_Free(
108a0 70 44 62 2d 3e 7a 54 72 61 63 65 29 3b 0a 20 20  pDb->zTrace);.  
108b0 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 72 61      }.      zTra
108c0 63 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  ce = Tcl_GetStri
108d0 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
108e0 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20  ], &len);.      
108f0 69 66 28 20 7a 54 72 61 63 65 20 26 26 20 6c 65  if( zTrace && le
10900 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  n>0 ){.        p
10910 44 62 2d 3e 7a 54 72 61 63 65 20 3d 20 54 63 6c  Db->zTrace = Tcl
10920 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20  _Alloc( len + 1 
10930 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  );.        memcp
10940 79 28 70 44 62 2d 3e 7a 54 72 61 63 65 2c 20 7a  y(pDb->zTrace, z
10950 54 72 61 63 65 2c 20 6c 65 6e 2b 31 29 3b 0a 20  Trace, len+1);. 
10960 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
10970 20 20 20 20 70 44 62 2d 3e 7a 54 72 61 63 65 20      pDb->zTrace 
10980 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  = 0;.      }.#if
10990 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
109a0 5f 54 52 41 43 45 0a 20 20 20 20 20 20 69 66 28  _TRACE.      if(
109b0 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a   pDb->zTrace ){.
109c0 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74          pDb->int
109d0 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20  erp = interp;.  
109e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 72        sqlite3_tr
109f0 61 63 65 28 70 44 62 2d 3e 64 62 2c 20 44 62 54  ace(pDb->db, DbT
10a00 72 61 63 65 48 61 6e 64 6c 65 72 2c 20 70 44 62  raceHandler, pDb
10a10 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
10a20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
10a30 74 72 61 63 65 28 70 44 62 2d 3e 64 62 2c 20 30  trace(pDb->db, 0
10a40 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  , 0);.      }.#e
10a50 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 62  ndif.    }.    b
10a60 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
10a70 20 20 20 24 64 62 20 74 72 61 6e 73 61 63 74 69     $db transacti
10a80 6f 6e 20 5b 2d 64 65 66 65 72 72 65 64 7c 2d 69  on [-deferred|-i
10a90 6d 6d 65 64 69 61 74 65 7c 2d 65 78 63 6c 75 73  mmediate|-exclus
10aa0 69 76 65 5d 20 53 43 52 49 50 54 0a 20 20 2a 2a  ive] SCRIPT.  **
10ab0 0a 20 20 2a 2a 20 53 74 61 72 74 20 61 20 6e 65  .  ** Start a ne
10ac0 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69  w transaction (i
10ad0 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72  f we are not alr
10ae0 65 61 64 79 20 69 6e 20 74 68 65 20 6d 69 64 73  eady in the mids
10af0 74 20 6f 66 20 61 0a 20 20 2a 2a 20 74 72 61 6e  t of a.  ** tran
10b00 73 61 63 74 69 6f 6e 29 20 61 6e 64 20 65 78 65  saction) and exe
10b10 63 75 74 65 20 74 68 65 20 54 43 4c 20 73 63 72  cute the TCL scr
10b20 69 70 74 20 53 43 52 49 50 54 2e 20 20 41 66 74  ipt SCRIPT.  Aft
10b30 65 72 20 53 43 52 49 50 54 0a 20 20 2a 2a 20 63  er SCRIPT.  ** c
10b40 6f 6d 70 6c 65 74 65 73 2c 20 65 69 74 68 65 72  ompletes, either
10b50 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   commit the tran
10b60 73 61 63 74 69 6f 6e 20 6f 72 20 72 6f 6c 6c 20  saction or roll 
10b70 69 74 20 62 61 63 6b 20 69 66 20 53 43 52 49 50  it back if SCRIP
10b80 54 0a 20 20 2a 2a 20 74 68 72 6f 77 73 20 61 6e  T.  ** throws an
10b90 20 65 78 63 65 70 74 69 6f 6e 2e 20 20 4f 72 20   exception.  Or 
10ba0 69 66 20 6e 6f 20 6e 65 77 20 74 72 61 6e 73 61  if no new transa
10bb0 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64  tion was started
10bc0 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 20 20  , do nothing..  
10bd0 2a 2a 20 70 61 73 73 20 74 68 65 20 65 78 63 65  ** pass the exce
10be0 70 74 69 6f 6e 20 6f 6e 20 75 70 20 74 68 65 20  ption on up the 
10bf0 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  stack..  **.  **
10c00 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 77 61   This command wa
10c10 73 20 69 6e 73 70 69 72 65 64 20 62 79 20 44 61  s inspired by Da
10c20 76 65 20 54 68 6f 6d 61 73 27 73 20 74 61 6c 6b  ve Thomas's talk
10c30 20 6f 6e 20 52 75 62 79 20 61 74 20 74 68 65 0a   on Ruby at the.
10c40 20 20 2a 2a 20 32 30 30 35 20 4f 27 52 65 69 6c    ** 2005 O'Reil
10c50 6c 79 20 4f 70 65 6e 20 53 6f 75 72 63 65 20 43  ly Open Source C
10c60 6f 6e 76 65 6e 74 69 6f 6e 20 28 4f 53 43 4f 4e  onvention (OSCON
10c70 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  )..  */.  case D
10c80 42 5f 54 52 41 4e 53 41 43 54 49 4f 4e 3a 20 7b  B_TRANSACTION: {
10c90 0a 20 20 20 20 69 6e 74 20 69 6e 54 72 61 6e 73  .    int inTrans
10ca0 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  ;.    Tcl_Obj *p
10cb0 53 63 72 69 70 74 3b 0a 20 20 20 20 63 6f 6e 73  Script;.    cons
10cc0 74 20 63 68 61 72 20 2a 7a 42 65 67 69 6e 20 3d  t char *zBegin =
10cd0 20 22 42 45 47 49 4e 22 3b 0a 20 20 20 20 69 66   "BEGIN";.    if
10ce0 28 20 6f 62 6a 63 21 3d 33 20 26 26 20 6f 62 6a  ( objc!=3 && obj
10cf0 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=4 ){.      Tc
10d00 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
10d10 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
10d20 22 5b 54 59 50 45 5d 20 53 43 52 49 50 54 22 29  "[TYPE] SCRIPT")
10d30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
10d40 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
10d50 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20      if( objc==3 
10d60 29 7b 0a 20 20 20 20 20 20 70 53 63 72 69 70 74  ){.      pScript
10d70 20 3d 20 6f 62 6a 76 5b 32 5d 3b 0a 20 20 20 20   = objv[2];.    
10d80 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 73  } else {.      s
10d90 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
10da0 20 2a 54 54 59 50 45 5f 73 74 72 73 5b 5d 20 3d   *TTYPE_strs[] =
10db0 20 7b 0a 20 20 20 20 20 20 20 20 22 64 65 66 65   {.        "defe
10dc0 72 72 65 64 22 2c 20 20 20 22 65 78 63 6c 75 73  rred",   "exclus
10dd0 69 76 65 22 2c 20 20 22 69 6d 6d 65 64 69 61 74  ive",  "immediat
10de0 65 22 2c 20 30 0a 20 20 20 20 20 20 7d 3b 0a 20  e", 0.      };. 
10df0 20 20 20 20 20 65 6e 75 6d 20 54 54 59 50 45 5f       enum TTYPE_
10e00 65 6e 75 6d 20 7b 0a 20 20 20 20 20 20 20 20 54  enum {.        T
10e10 54 59 50 45 5f 44 45 46 45 52 52 45 44 2c 20 54  TYPE_DEFERRED, T
10e20 54 59 50 45 5f 45 58 43 4c 55 53 49 56 45 2c 20  TYPE_EXCLUSIVE, 
10e30 54 54 59 50 45 5f 49 4d 4d 45 44 49 41 54 45 0a  TTYPE_IMMEDIATE.
10e40 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 69        };.      i
10e50 6e 74 20 74 74 79 70 65 3b 0a 20 20 20 20 20 20  nt ttype;.      
10e60 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 64 65 78  if( Tcl_GetIndex
10e70 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
10e80 6f 62 6a 76 5b 32 5d 2c 20 54 54 59 50 45 5f 73  objv[2], TTYPE_s
10e90 74 72 73 2c 20 22 74 72 61 6e 73 61 63 74 69 6f  trs, "transactio
10ea0 6e 20 74 79 70 65 22 2c 0a 20 20 20 20 20 20 20  n type",.       
10eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ec0 20 20 20 20 20 20 20 30 2c 20 26 74 74 79 70 65         0, &ttype
10ed0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
10ee0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
10ef0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 77 69       }.      swi
10f00 74 63 68 28 20 28 65 6e 75 6d 20 54 54 59 50 45  tch( (enum TTYPE
10f10 5f 65 6e 75 6d 29 74 74 79 70 65 20 29 7b 0a 20  _enum)ttype ){. 
10f20 20 20 20 20 20 20 20 63 61 73 65 20 54 54 59 50         case TTYP
10f30 45 5f 44 45 46 45 52 52 45 44 3a 20 20 20 20 2f  E_DEFERRED:    /
10f40 2a 20 6e 6f 2d 6f 70 20 2a 2f 3b 20 20 20 20 20  * no-op */;     
10f50 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
10f60 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
10f70 54 54 59 50 45 5f 45 58 43 4c 55 53 49 56 45 3a  TTYPE_EXCLUSIVE:
10f80 20 20 20 7a 42 65 67 69 6e 20 3d 20 22 42 45 47     zBegin = "BEG
10f90 49 4e 20 45 58 43 4c 55 53 49 56 45 22 3b 20 20  IN EXCLUSIVE";  
10fa0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
10fb0 61 73 65 20 54 54 59 50 45 5f 49 4d 4d 45 44 49  ase TTYPE_IMMEDI
10fc0 41 54 45 3a 20 20 20 7a 42 65 67 69 6e 20 3d 20  ATE:   zBegin = 
10fd0 22 42 45 47 49 4e 20 49 4d 4d 45 44 49 41 54 45  "BEGIN IMMEDIATE
10fe0 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ";  break;.     
10ff0 20 7d 0a 20 20 20 20 20 20 70 53 63 72 69 70 74   }.      pScript
11000 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20   = objv[3];.    
11010 7d 0a 20 20 20 20 69 6e 54 72 61 6e 73 20 3d 20  }.    inTrans = 
11020 21 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74  !sqlite3_get_aut
11030 6f 63 6f 6d 6d 69 74 28 70 44 62 2d 3e 64 62 29  ocommit(pDb->db)
11040 3b 0a 20 20 20 20 69 66 28 20 21 69 6e 54 72 61  ;.    if( !inTra
11050 6e 73 20 29 7b 0a 20 20 20 20 20 20 70 44 62 2d  ns ){.      pDb-
11060 3e 64 69 73 61 62 6c 65 41 75 74 68 2b 2b 3b 0a  >disableAuth++;.
11070 20 20 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69        (void)sqli
11080 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62  te3_exec(pDb->db
11090 2c 20 7a 42 65 67 69 6e 2c 20 30 2c 20 30 2c 20  , zBegin, 0, 0, 
110a0 30 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 64  0);.      pDb->d
110b0 69 73 61 62 6c 65 41 75 74 68 2d 2d 3b 0a 20 20  isableAuth--;.  
110c0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 54 63 6c    }.    rc = Tcl
110d0 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72  _EvalObjEx(inter
110e0 70 2c 20 70 53 63 72 69 70 74 2c 20 30 29 3b 0a  p, pScript, 0);.
110f0 20 20 20 20 69 66 28 20 21 69 6e 54 72 61 6e 73      if( !inTrans
11100 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
11110 63 68 61 72 20 2a 7a 45 6e 64 3b 0a 20 20 20 20  char *zEnd;.    
11120 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 45 52    if( rc==TCL_ER
11130 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ROR ){.        z
11140 45 6e 64 20 3d 20 22 52 4f 4c 4c 42 41 43 4b 22  End = "ROLLBACK"
11150 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ;.      } else {
11160 0a 20 20 20 20 20 20 20 20 7a 45 6e 64 20 3d 20  .        zEnd = 
11170 22 43 4f 4d 4d 49 54 22 3b 0a 20 20 20 20 20 20  "COMMIT";.      
11180 7d 0a 20 20 20 20 20 20 70 44 62 2d 3e 64 69 73  }.      pDb->dis
11190 61 62 6c 65 41 75 74 68 2b 2b 3b 0a 20 20 20 20  ableAuth++;.    
111a0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 65 78    if( sqlite3_ex
111b0 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a 45 6e 64  ec(pDb->db, zEnd
111c0 2c 20 30 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20  , 0, 0, 0) ){.  
111d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78        sqlite3_ex
111e0 65 63 28 70 44 62 2d 3e 64 62 2c 20 22 52 4f 4c  ec(pDb->db, "ROL
111f0 4c 42 41 43 4b 22 2c 20 30 2c 20 30 2c 20 30 29  LBACK", 0, 0, 0)
11200 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11210 70 44 62 2d 3e 64 69 73 61 62 6c 65 41 75 74 68  pDb->disableAuth
11220 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  --;.    }.    br
11230 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
11240 20 2a 2a 20 20 20 20 24 64 62 20 75 70 64 61 74   **    $db updat
11250 65 5f 68 6f 6f 6b 20 3f 73 63 72 69 70 74 3f 0a  e_hook ?script?.
11260 20 20 2a 2a 20 20 20 20 24 64 62 20 72 6f 6c 6c    **    $db roll
11270 62 61 63 6b 5f 68 6f 6f 6b 20 3f 73 63 72 69 70  back_hook ?scrip
11280 74 3f 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  t?.  */.  case D
11290 42 5f 55 50 44 41 54 45 5f 48 4f 4f 4b 3a 20 0a  B_UPDATE_HOOK: .
112a0 20 20 63 61 73 65 20 44 42 5f 52 4f 4c 4c 42 41    case DB_ROLLBA
112b0 43 4b 5f 48 4f 4f 4b 3a 20 7b 0a 0a 20 20 20 20  CK_HOOK: {..    
112c0 2f 2a 20 73 65 74 20 70 70 48 6f 6f 6b 20 74 6f  /* set ppHook to
112d0 20 70 6f 69 6e 74 20 61 74 20 70 55 70 64 61 74   point at pUpdat
112e0 65 48 6f 6f 6b 20 6f 72 20 70 52 6f 6c 6c 62 61  eHook or pRollba
112f0 63 6b 48 6f 6f 6b 2c 20 64 65 70 65 6e 64 69 6e  ckHook, dependin
11300 67 20 6f 6e 20 0a 20 20 20 20 2a 2a 20 77 68 65  g on .    ** whe
11310 74 68 65 72 20 5b 24 64 62 20 75 70 64 61 74 65  ther [$db update
11320 5f 68 6f 6f 6b 5d 20 6f 72 20 5b 24 64 62 20 72  _hook] or [$db r
11330 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 5d 20 77 61  ollback_hook] wa
11340 73 20 69 6e 76 6f 6b 65 64 2e 0a 20 20 20 20 2a  s invoked..    *
11350 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a  /.    Tcl_Obj **
11360 70 70 48 6f 6f 6b 3b 20 0a 20 20 20 20 69 66 28  ppHook; .    if(
11370 20 63 68 6f 69 63 65 3d 3d 44 42 5f 55 50 44 41   choice==DB_UPDA
11380 54 45 5f 48 4f 4f 4b 20 29 7b 0a 20 20 20 20 20  TE_HOOK ){.     
11390 20 70 70 48 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e   ppHook = &pDb->
113a0 70 55 70 64 61 74 65 48 6f 6f 6b 3b 0a 20 20 20  pUpdateHook;.   
113b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70   }else{.      pp
113c0 48 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e 70 52 6f  Hook = &pDb->pRo
113d0 6c 6c 62 61 63 6b 48 6f 6f 6b 3b 0a 20 20 20 20  llbackHook;.    
113e0 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  }..    if( objc!
113f0 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b  =2 && objc!=3 ){
11400 0a 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  .       Tcl_Wron
11410 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
11420 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 53 43 52 49   2, objv, "?SCRI
11430 50 54 3f 22 29 3b 0a 20 20 20 20 20 20 20 72 65  PT?");.       re
11440 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
11450 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 2a 70      }.    if( *p
11460 70 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 20 20 54  pHook ){.      T
11470 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
11480 69 6e 74 65 72 70 2c 20 2a 70 70 48 6f 6f 6b 29  interp, *ppHook)
11490 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63  ;.      if( objc
114a0 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 54  ==3 ){.        T
114b0 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
114c0 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20 20 20  *ppHook);.      
114d0 20 20 2a 70 70 48 6f 6f 6b 20 3d 20 30 3b 0a 20    *ppHook = 0;. 
114e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
114f0 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a   if( objc==3 ){.
11500 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28        assert( !(
11510 2a 70 70 48 6f 6f 6b 29 20 29 3b 0a 20 20 20 20  *ppHook) );.    
11520 20 20 69 66 28 20 54 63 6c 5f 47 65 74 43 68 61    if( Tcl_GetCha
11530 72 4c 65 6e 67 74 68 28 6f 62 6a 76 5b 32 5d 29  rLength(objv[2])
11540 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  >0 ){.        *p
11550 70 48 6f 6f 6b 20 3d 20 6f 62 6a 76 5b 32 5d 3b  pHook = objv[2];
11560 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63  .        Tcl_Inc
11570 72 52 65 66 43 6f 75 6e 74 28 2a 70 70 48 6f 6f  rRefCount(*ppHoo
11580 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  k);.      }.    
11590 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 75  }..    sqlite3_u
115a0 70 64 61 74 65 5f 68 6f 6f 6b 28 70 44 62 2d 3e  pdate_hook(pDb->
115b0 64 62 2c 20 28 70 44 62 2d 3e 70 55 70 64 61 74  db, (pDb->pUpdat
115c0 65 48 6f 6f 6b 3f 44 62 55 70 64 61 74 65 48 61  eHook?DbUpdateHa
115d0 6e 64 6c 65 72 3a 30 29 2c 20 70 44 62 29 3b 0a  ndler:0), pDb);.
115e0 20 20 20 20 73 71 6c 69 74 65 33 5f 72 6f 6c 6c      sqlite3_roll
115f0 62 61 63 6b 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64  back_hook(pDb->d
11600 62 2c 28 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63  b,(pDb->pRollbac
11610 6b 48 6f 6f 6b 3f 44 62 52 6f 6c 6c 62 61 63 6b  kHook?DbRollback
11620 48 61 6e 64 6c 65 72 3a 30 29 2c 70 44 62 29 3b  Handler:0),pDb);
11630 0a 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ..    break;.  }
11640 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 76 65  ..  /*    $db ve
11650 72 73 69 6f 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rsion.  **.  ** 
11660 52 65 74 75 72 6e 20 74 68 65 20 76 65 72 73 69  Return the versi
11670 6f 6e 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68  on string for th
11680 69 73 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  is database..  *
11690 2f 0a 20 20 63 61 73 65 20 44 42 5f 56 45 52 53  /.  case DB_VERS
116a0 49 4f 4e 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 53  ION: {.    Tcl_S
116b0 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
116c0 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
116d0 5f 6c 69 62 76 65 72 73 69 6f 6e 28 29 2c 20 54  _libversion(), T
116e0 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  CL_STATIC);.    
116f0 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 7d  break;.  }...  }
11700 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 53   /* End of the S
11710 57 49 54 43 48 20 73 74 61 74 65 6d 65 6e 74 20  WITCH statement 
11720 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  */.  return rc;.
11730 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 73 71 6c 69 74  }../*.**   sqlit
11740 65 33 20 44 42 4e 41 4d 45 20 46 49 4c 45 4e 41  e3 DBNAME FILENA
11750 4d 45 20 3f 2d 76 66 73 20 56 46 53 4e 41 4d 45  ME ?-vfs VFSNAME
11760 3f 20 3f 2d 6b 65 79 20 4b 45 59 3f 20 3f 2d 72  ? ?-key KEY? ?-r
11770 65 61 64 6f 6e 6c 79 20 42 4f 4f 4c 45 41 4e 3f  eadonly BOOLEAN?
11780 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
11790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3f 2d                ?-
117a0 63 72 65 61 74 65 20 42 4f 4f 4c 45 41 4e 3f 20  create BOOLEAN? 
117b0 3f 2d 6e 6f 6d 75 74 65 78 20 42 4f 4f 4c 45 41  ?-nomutex BOOLEA
117c0 4e 3f 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  N?.**.** This is
117d0 20 74 68 65 20 6d 61 69 6e 20 54 63 6c 20 63 6f   the main Tcl co
117e0 6d 6d 61 6e 64 2e 20 20 57 68 65 6e 20 74 68 65  mmand.  When the
117f0 20 22 73 71 6c 69 74 65 22 20 54 63 6c 20 63 6f   "sqlite" Tcl co
11800 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 69 6e 76 6f  mmand is.** invo
11810 6b 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ked, this routin
11820 65 20 72 75 6e 73 20 74 6f 20 70 72 6f 63 65 73  e runs to proces
11830 73 20 74 68 61 74 20 63 6f 6d 6d 61 6e 64 2e 0a  s that command..
11840 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
11850 61 72 67 75 6d 65 6e 74 2c 20 44 42 4e 41 4d 45  argument, DBNAME
11860 2c 20 69 73 20 61 6e 20 61 72 62 69 74 72 61 72  , is an arbitrar
11870 79 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77  y name for a new
11880 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e  .** database con
11890 6e 65 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 63  nection.  This c
118a0 6f 6d 6d 61 6e 64 20 63 72 65 61 74 65 73 20 61  ommand creates a
118b0 20 6e 65 77 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d   new command nam
118c0 65 64 0a 2a 2a 20 44 42 4e 41 4d 45 20 74 68 61  ed.** DBNAME tha
118d0 74 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6e  t is used to con
118e0 74 72 6f 6c 20 74 68 61 74 20 63 6f 6e 6e 65 63  trol that connec
118f0 74 69 6f 6e 2e 20 20 54 68 65 20 64 61 74 61 62  tion.  The datab
11900 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  ase.** connectio
11910 6e 20 69 73 20 64 65 6c 65 74 65 64 20 77 68 65  n is deleted whe
11920 6e 20 74 68 65 20 44 42 4e 41 4d 45 20 63 6f 6d  n the DBNAME com
11930 6d 61 6e 64 20 69 73 20 64 65 6c 65 74 65 64 2e  mand is deleted.
11940 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e  .**.** The secon
11950 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  d argument is th
11960 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  e name of the da
11970 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
11980 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62  */.static int Db
11990 4d 61 69 6e 28 76 6f 69 64 20 2a 63 64 2c 20 54  Main(void *cd, T
119a0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
119b0 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 54 63 6c 5f  p, int objc,Tcl_
119c0 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 29  Obj *const*objv)
119d0 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 3b  {.  SqliteDb *p;
119e0 0a 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20  .  void *pKey = 
119f0 30 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20  0;.  int nKey = 
11a00 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  0;.  const char 
11a10 2a 7a 41 72 67 3b 0a 20 20 63 68 61 72 20 2a 7a  *zArg;.  char *z
11a20 45 72 72 4d 73 67 3b 0a 20 20 69 6e 74 20 69 3b  ErrMsg;.  int i;
11a30 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
11a40 46 69 6c 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68  File;.  const ch
11a50 61 72 20 2a 7a 56 66 73 20 3d 20 30 3b 0a 20 20  ar *zVfs = 0;.  
11a60 69 6e 74 20 66 6c 61 67 73 20 3d 20 53 51 4c 49  int flags = SQLI
11a70 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
11a80 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
11a90 43 52 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f  CREATE | SQLITE_
11aa0 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 20 20  OPEN_NOMUTEX;.  
11ab0 54 63 6c 5f 44 53 74 72 69 6e 67 20 74 72 61 6e  Tcl_DString tran
11ac0 73 6c 61 74 65 64 46 69 6c 65 6e 61 6d 65 3b 0a  slatedFilename;.
11ad0 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b    if( objc==2 ){
11ae0 0a 20 20 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f  .    zArg = Tcl_
11af0 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
11b00 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20  (objv[1], 0);.  
11b10 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72    if( strcmp(zAr
11b20 67 2c 22 2d 76 65 72 73 69 6f 6e 22 29 3d 3d 30  g,"-version")==0
11b30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
11b40 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
11b50 70 2c 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f  p,sqlite3_versio
11b60 6e 2c 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  n,0);.      retu
11b70 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d  rn TCL_OK;.    }
11b80 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
11b90 7a 41 72 67 2c 22 2d 68 61 73 2d 63 6f 64 65 63  zArg,"-has-codec
11ba0 22 29 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66 20  ")==0 ){.#ifdef 
11bb0 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
11bc0 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
11bd0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22  dResult(interp,"
11be0 31 22 2c 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20  1",0);.#else.   
11bf0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
11c00 75 6c 74 28 69 6e 74 65 72 70 2c 22 30 22 2c 30  ult(interp,"0",0
11c10 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
11c20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20  return TCL_OK;. 
11c30 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69     }.  }.  for(i
11c40 3d 33 3b 20 69 2b 31 3c 6f 62 6a 63 3b 20 69 2b  =3; i+1<objc; i+
11c50 3d 32 29 7b 0a 20 20 20 20 7a 41 72 67 20 3d 20  =2){.    zArg = 
11c60 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
11c70 6a 76 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20  jv[i]);.    if( 
11c80 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 6b 65  strcmp(zArg,"-ke
11c90 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  y")==0 ){.      
11ca0 70 4b 65 79 20 3d 20 54 63 6c 5f 47 65 74 42 79  pKey = Tcl_GetBy
11cb0 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f  teArrayFromObj(o
11cc0 62 6a 76 5b 69 2b 31 5d 2c 20 26 6e 4b 65 79 29  bjv[i+1], &nKey)
11cd0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
11ce0 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d 76  strcmp(zArg, "-v
11cf0 66 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  fs")==0 ){.     
11d00 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7a 56 66 73   i++;.      zVfs
11d10 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
11d20 28 6f 62 6a 76 5b 69 5d 29 3b 0a 20 20 20 20 7d  (objv[i]);.    }
11d30 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
11d40 7a 41 72 67 2c 20 22 2d 72 65 61 64 6f 6e 6c 79  zArg, "-readonly
11d50 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
11d60 6e 74 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20  nt b;.      if( 
11d70 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
11d80 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
11d90 6a 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20 72  jv[i+1], &b) ) r
11da0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
11db0 0a 20 20 20 20 20 20 69 66 28 20 62 20 29 7b 0a  .      if( b ){.
11dc0 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d          flags &=
11dd0 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   ~(SQLITE_OPEN_R
11de0 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
11df0 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20  OPEN_CREATE);.  
11e00 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53        flags |= S
11e10 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
11e20 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  NLY;.      }else
11e30 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  {.        flags 
11e40 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  &= ~SQLITE_OPEN_
11e50 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20  READONLY;.      
11e60 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54    flags |= SQLIT
11e70 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
11e80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
11e90 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
11ea0 41 72 67 2c 20 22 2d 63 72 65 61 74 65 22 29 3d  Arg, "-create")=
11eb0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
11ec0 62 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c  b;.      if( Tcl
11ed0 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
11ee0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
11ef0 69 2b 31 5d 2c 20 26 62 29 20 29 20 72 65 74 75  i+1], &b) ) retu
11f00 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
11f10 20 20 20 20 69 66 28 20 62 20 26 26 20 28 66 6c      if( b && (fl
11f20 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
11f30 4e 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d 30 20 29  N_READONLY)==0 )
11f40 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  {.        flags 
11f50 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  |= SQLITE_OPEN_C
11f60 52 45 41 54 45 3b 0a 20 20 20 20 20 20 7d 65 6c  REATE;.      }el
11f70 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67  se{.        flag
11f80 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45  s &= ~SQLITE_OPE
11f90 4e 5f 43 52 45 41 54 45 3b 0a 20 20 20 20 20 20  N_CREATE;.      
11fa0 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
11fb0 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d 6e  strcmp(zArg, "-n
11fc0 6f 6d 75 74 65 78 22 29 3d 3d 30 20 29 7b 0a 20  omutex")==0 ){. 
11fd0 20 20 20 20 20 69 6e 74 20 62 3b 0a 20 20 20 20       int b;.    
11fe0 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f    if( Tcl_GetBoo
11ff0 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
12000 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26  rp, objv[i+1], &
12010 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
12020 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 69 66 28  ERROR;.      if(
12030 20 62 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c   b ){.        fl
12040 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50  ags |= SQLITE_OP
12050 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 20 20 20 20  EN_NOMUTEX;.    
12060 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51      flags &= ~SQ
12070 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55  LITE_OPEN_FULLMU
12080 54 45 58 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  TEX;.      }else
12090 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  {.        flags 
120a0 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  &= ~SQLITE_OPEN_
120b0 4e 4f 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 7d  NOMUTEX;.      }
120c0 0a 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  .   }else if( st
120d0 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d 66 75 6c  rcmp(zArg, "-ful
120e0 6c 6d 75 74 65 78 22 29 3d 3d 30 20 29 7b 0a 20  lmutex")==0 ){. 
120f0 20 20 20 20 20 69 6e 74 20 62 3b 0a 20 20 20 20       int b;.    
12100 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f    if( Tcl_GetBoo
12110 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
12120 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26  rp, objv[i+1], &
12130 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
12140 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 69 66 28  ERROR;.      if(
12150 20 62 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c   b ){.        fl
12160 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50  ags |= SQLITE_OP
12170 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a 20 20  EN_FULLMUTEX;.  
12180 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e        flags &= ~
12190 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55  SQLITE_OPEN_NOMU
121a0 54 45 58 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  TEX;.      }else
121b0 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  {.        flags 
121c0 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  &= ~SQLITE_OPEN_
121d0 46 55 4c 4c 4d 55 54 45 58 3b 0a 20 20 20 20 20  FULLMUTEX;.     
121e0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
121f0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
12200 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e  sult(interp, "un
12210 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 22 2c  known option: ",
12220 20 7a 41 72 67 2c 20 28 63 68 61 72 2a 29 30 29   zArg, (char*)0)
12230 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
12240 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
12250 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3c 33    }.  if( objc<3
12260 20 7c 7c 20 28 6f 62 6a 63 26 31 29 21 3d 31 20   || (objc&1)!=1 
12270 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
12280 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
12290 31 2c 20 6f 62 6a 76 2c 20 0a 20 20 20 20 20 20  1, objv, .      
122a0 22 48 41 4e 44 4c 45 20 46 49 4c 45 4e 41 4d 45  "HANDLE FILENAME
122b0 20 3f 2d 76 66 73 20 56 46 53 4e 41 4d 45 3f 20   ?-vfs VFSNAME? 
122c0 3f 2d 72 65 61 64 6f 6e 6c 79 20 42 4f 4f 4c 45  ?-readonly BOOLE
122d0 41 4e 3f 20 3f 2d 63 72 65 61 74 65 20 42 4f 4f  AN? ?-create BOO
122e0 4c 45 41 4e 3f 22 0a 20 20 20 20 20 20 22 20 3f  LEAN?".      " ?
122f0 2d 6e 6f 6d 75 74 65 78 20 42 4f 4f 4c 45 41 4e  -nomutex BOOLEAN
12300 3f 20 3f 2d 66 75 6c 6c 6d 75 74 65 78 20 42 4f  ? ?-fullmutex BO
12310 4f 4c 45 41 4e 3f 22 0a 23 69 66 64 65 66 20 53  OLEAN?".#ifdef S
12320 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
12330 20 20 20 20 20 20 22 20 3f 2d 6b 65 79 20 43 4f        " ?-key CO
12340 44 45 43 4b 45 59 3f 22 0a 23 65 6e 64 69 66 0a  DECKEY?".#endif.
12350 20 20 20 20 29 3b 0a 20 20 20 20 72 65 74 75 72      );.    retur
12360 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
12370 0a 20 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  .  zErrMsg = 0;.
12380 20 20 70 20 3d 20 28 53 71 6c 69 74 65 44 62 2a    p = (SqliteDb*
12390 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65  )Tcl_Alloc( size
123a0 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20  of(*p) );.  if( 
123b0 70 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f  p==0 ){.    Tcl_
123c0 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
123d0 2c 20 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64  , "malloc failed
123e0 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  ", TCL_STATIC);.
123f0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
12400 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73  RROR;.  }.  mems
12410 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(p, 0, sizeof(
12420 2a 70 29 29 3b 0a 20 20 7a 46 69 6c 65 20 3d 20  *p));.  zFile = 
12430 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
12440 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29  mObj(objv[2], 0)
12450 3b 0a 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f  ;.  zFile = Tcl_
12460 54 72 61 6e 73 6c 61 74 65 46 69 6c 65 4e 61 6d  TranslateFileNam
12470 65 28 69 6e 74 65 72 70 2c 20 7a 46 69 6c 65 2c  e(interp, zFile,
12480 20 26 74 72 61 6e 73 6c 61 74 65 64 46 69 6c 65   &translatedFile
12490 6e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  name);.  sqlite3
124a0 5f 6f 70 65 6e 5f 76 32 28 7a 46 69 6c 65 2c 20  _open_v2(zFile, 
124b0 26 70 2d 3e 64 62 2c 20 66 6c 61 67 73 2c 20 7a  &p->db, flags, z
124c0 56 66 73 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  Vfs);.  Tcl_DStr
124d0 69 6e 67 46 72 65 65 28 26 74 72 61 6e 73 6c 61  ingFree(&transla
124e0 74 65 64 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  tedFilename);.  
124f0 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
12500 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70  qlite3_errcode(p
12510 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20 7a 45 72  ->db) ){.    zEr
12520 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rMsg = sqlite3_m
12530 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c  printf("%s", sql
12540 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64  ite3_errmsg(p->d
12550 62 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  b));.    sqlite3
12560 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 29 3b 0a 20  _close(p->db);. 
12570 20 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20     p->db = 0;.  
12580 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
12590 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20  HAS_CODEC.  if( 
125a0 70 2d 3e 64 62 20 29 7b 0a 20 20 20 20 73 71 6c  p->db ){.    sql
125b0 69 74 65 33 5f 6b 65 79 28 70 2d 3e 64 62 2c 20  ite3_key(p->db, 
125c0 70 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 7d  pKey, nKey);.  }
125d0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d  .#endif.  if( p-
125e0 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63  >db==0 ){.    Tc
125f0 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
12600 72 70 2c 20 7a 45 72 72 4d 73 67 2c 20 54 43 4c  rp, zErrMsg, TCL
12610 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20  _VOLATILE);.    
12620 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29  Tcl_Free((char*)
12630 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  p);.    sqlite3_
12640 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20  free(zErrMsg);. 
12650 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
12660 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61  ROR;.  }.  p->ma
12670 78 53 74 6d 74 20 3d 20 4e 55 4d 5f 50 52 45 50  xStmt = NUM_PREP
12680 41 52 45 44 5f 53 54 4d 54 53 3b 0a 20 20 70 2d  ARED_STMTS;.  p-
12690 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
126a0 3b 0a 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47  ;.  zArg = Tcl_G
126b0 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
126c0 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 54  objv[1], 0);.  T
126d0 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
126e0 61 6e 64 28 69 6e 74 65 72 70 2c 20 7a 41 72 67  and(interp, zArg
126f0 2c 20 44 62 4f 62 6a 43 6d 64 2c 20 28 63 68 61  , DbObjCmd, (cha
12700 72 2a 29 70 2c 20 44 62 44 65 6c 65 74 65 43 6d  r*)p, DbDeleteCm
12710 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  d);.  return TCL
12720 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  _OK;.}../*.** Pr
12730 6f 76 69 64 65 20 61 20 64 75 6d 6d 79 20 54 63  ovide a dummy Tc
12740 6c 5f 49 6e 69 74 53 74 75 62 73 20 69 66 20 77  l_InitStubs if w
12750 65 20 61 72 65 20 75 73 69 6e 67 20 74 68 69 73  e are using this
12760 20 61 73 20 61 20 73 74 61 74 69 63 0a 2a 2a 20   as a static.** 
12770 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 6e  library..*/.#ifn
12780 64 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42  def USE_TCL_STUB
12790 53 0a 23 20 75 6e 64 65 66 20 20 54 63 6c 5f 49  S.# undef  Tcl_I
127a0 6e 69 74 53 74 75 62 73 0a 23 20 64 65 66 69 6e  nitStubs.# defin
127b0 65 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28  e Tcl_InitStubs(
127c0 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f  a,b,c).#endif../
127d0 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 77  *.** Make sure w
127e0 65 20 68 61 76 65 20 61 20 50 41 43 4b 41 47 45  e have a PACKAGE
127f0 5f 56 45 52 53 49 4f 4e 20 6d 61 63 72 6f 20 64  _VERSION macro d
12800 65 66 69 6e 65 64 2e 20 20 54 68 69 73 20 77 69  efined.  This wi
12810 6c 6c 20 62 65 0a 2a 2a 20 64 65 66 69 6e 65 64  ll be.** defined
12820 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 62   automatically b
12830 79 20 74 68 65 20 54 45 41 20 6d 61 6b 65 66 69  y the TEA makefi
12840 6c 65 2e 20 20 42 75 74 20 6f 74 68 65 72 20 6d  le.  But other m
12850 61 6b 65 66 69 6c 65 73 0a 2a 2a 20 64 6f 20 6e  akefiles.** do n
12860 6f 74 20 64 65 66 69 6e 65 20 69 74 2e 0a 2a 2f  ot define it..*/
12870 0a 23 69 66 6e 64 65 66 20 50 41 43 4b 41 47 45  .#ifndef PACKAGE
12880 5f 56 45 52 53 49 4f 4e 0a 23 20 64 65 66 69 6e  _VERSION.# defin
12890 65 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f  e PACKAGE_VERSIO
128a0 4e 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e  N SQLITE_VERSION
128b0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
128c0 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d  nitialize this m
128d0 6f 64 75 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  odule..**.** Thi
128e0 73 20 54 63 6c 20 6d 6f 64 75 6c 65 20 63 6f 6e  s Tcl module con
128f0 74 61 69 6e 73 20 6f 6e 6c 79 20 61 20 73 69 6e  tains only a sin
12900 67 6c 65 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d  gle new Tcl comm
12910 61 6e 64 20 6e 61 6d 65 64 20 22 73 71 6c 69 74  and named "sqlit
12920 65 22 2e 0a 2a 2a 20 28 48 65 6e 63 65 20 74 68  e"..** (Hence th
12930 65 72 65 20 69 73 20 6e 6f 20 6e 61 6d 65 73 70  ere is no namesp
12940 61 63 65 2e 20 20 54 68 65 72 65 20 69 73 20 6e  ace.  There is n
12950 6f 20 70 6f 69 6e 74 20 69 6e 20 75 73 69 6e 67  o point in using
12960 20 61 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20   a namespace.** 
12970 69 66 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e  if the extension
12980 20 6f 6e 6c 79 20 73 75 70 70 6c 69 65 73 20 6f   only supplies o
12990 6e 65 20 6e 65 77 20 6e 61 6d 65 21 29 20 20 54  ne new name!)  T
129a0 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d  he "sqlite" comm
129b0 61 6e 64 20 69 73 0a 2a 2a 20 75 73 65 64 20 74  and is.** used t
129c0 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 53 51 4c  o open a new SQL
129d0 69 74 65 20 64 61 74 61 62 61 73 65 2e 20 20 53  ite database.  S
129e0 65 65 20 74 68 65 20 44 62 4d 61 69 6e 28 29 20  ee the DbMain() 
129f0 72 6f 75 74 69 6e 65 20 61 62 6f 76 65 0a 2a 2a  routine above.**
12a00 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
12a10 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a  information..*/.
12a20 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74  EXTERN int Sqlit
12a30 65 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  e3_Init(Tcl_Inte
12a40 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 54  rp *interp){.  T
12a50 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 69 6e 74  cl_InitStubs(int
12a60 65 72 70 2c 20 22 38 2e 34 22 2c 20 30 29 3b 0a  erp, "8.4", 0);.
12a70 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
12a80 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
12a90 73 71 6c 69 74 65 33 22 2c 20 28 54 63 6c 5f 4f  sqlite3", (Tcl_O
12aa0 62 6a 43 6d 64 50 72 6f 63 2a 29 44 62 4d 61 69  bjCmdProc*)DbMai
12ab0 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f  n, 0, 0);.  Tcl_
12ac0 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72  PkgProvide(inter
12ad0 70 2c 20 22 73 71 6c 69 74 65 33 22 2c 20 50 41  p, "sqlite3", PA
12ae0 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29 3b 0a  CKAGE_VERSION);.
12af0 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
12b00 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
12b10 73 71 6c 69 74 65 22 2c 20 28 54 63 6c 5f 4f 62  sqlite", (Tcl_Ob
12b20 6a 43 6d 64 50 72 6f 63 2a 29 44 62 4d 61 69 6e  jCmdProc*)DbMain
12b30 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 50  , 0, 0);.  Tcl_P
12b40 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70  kgProvide(interp
12b50 2c 20 22 73 71 6c 69 74 65 22 2c 20 50 41 43 4b  , "sqlite", PACK
12b60 41 47 45 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20  AGE_VERSION);.  
12b70 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
12b80 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73  .EXTERN int Tcls
12b90 71 6c 69 74 65 33 5f 49 6e 69 74 28 54 63 6c 5f  qlite3_Init(Tcl_
12ba0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
12bb0 20 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33 5f   return Sqlite3_
12bc0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a  Init(interp); }.
12bd0 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74  EXTERN int Sqlit
12be0 65 33 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f  e3_SafeInit(Tcl_
12bf0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
12c00 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
12c10 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63 6c  }.EXTERN int Tcl
12c20 73 71 6c 69 74 65 33 5f 53 61 66 65 49 6e 69 74  sqlite3_SafeInit
12c30 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
12c40 65 72 70 29 7b 20 72 65 74 75 72 6e 20 54 43 4c  erp){ return TCL
12c50 5f 4f 4b 3b 20 7d 0a 0a 23 69 66 6e 64 65 66 20  _OK; }..#ifndef 
12c60 53 51 4c 49 54 45 5f 33 5f 53 55 46 46 49 58 5f  SQLITE_3_SUFFIX_
12c70 4f 4e 4c 59 0a 45 58 54 45 52 4e 20 69 6e 74 20  ONLY.EXTERN int 
12c80 53 71 6c 69 74 65 5f 49 6e 69 74 28 54 63 6c 5f  Sqlite_Init(Tcl_
12c90 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
12ca0 20 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33 5f   return Sqlite3_
12cb0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a  Init(interp); }.
12cc0 45 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73 71  EXTERN int Tclsq
12cd0 6c 69 74 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  lite_Init(Tcl_In
12ce0 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72  terp *interp){ r
12cf0 65 74 75 72 6e 20 53 71 6c 69 74 65 33 5f 49 6e  eturn Sqlite3_In
12d00 69 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a 45 58  it(interp); }.EX
12d10 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65 5f  TERN int Sqlite_
12d20 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74  SafeInit(Tcl_Int
12d30 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65  erp *interp){ re
12d40 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45  turn TCL_OK; }.E
12d50 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73 71 6c  XTERN int Tclsql
12d60 69 74 65 5f 53 61 66 65 49 6e 69 74 28 54 63 6c  ite_SafeInit(Tcl
12d70 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
12d80 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b  { return TCL_OK;
12d90 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65   }.#endif..#ifde
12da0 66 20 54 43 4c 53 48 0a 2f 2a 2a 2a 2a 2a 2a 2a  f TCLSH./*******
12db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12df0 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ******.** The co
12e00 64 65 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20  de that follows 
12e10 69 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64  is used to build
12e20 20 73 74 61 6e 64 61 6c 6f 6e 65 20 54 43 4c 20   standalone TCL 
12e30 69 6e 74 65 72 70 72 65 74 65 72 73 0a 2a 2a 20  interpreters.** 
12e40 74 68 61 74 20 61 72 65 20 73 74 61 74 69 63 61  that are statica
12e50 6c 6c 79 20 6c 69 6e 6b 65 64 20 77 69 74 68 20  lly linked with 
12e60 53 51 4c 69 74 65 2e 20 20 0a 2a 2f 0a 0a 2f 2a  SQLite.  .*/../*
12e70 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 63 72 6f  .** If the macro
12e80 20 54 43 4c 53 48 20 69 73 20 6f 6e 65 2c 20 74   TCLSH is one, t
12e90 68 65 6e 20 70 75 74 20 69 6e 20 63 6f 64 65 20  hen put in code 
12ea0 74 68 69 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20  this for the.** 
12eb0 22 6d 61 69 6e 22 20 72 6f 75 74 69 6e 65 20 74  "main" routine t
12ec0 68 61 74 20 77 69 6c 6c 20 69 6e 69 74 69 61 6c  hat will initial
12ed0 69 7a 65 20 54 63 6c 20 61 6e 64 20 74 61 6b 65  ize Tcl and take
12ee0 20 69 6e 70 75 74 20 66 72 6f 6d 0a 2a 2a 20 73   input from.** s
12ef0 74 61 6e 64 61 72 64 20 69 6e 70 75 74 2c 20 6f  tandard input, o
12f00 72 20 69 66 20 61 20 66 69 6c 65 20 69 73 20 6e  r if a file is n
12f10 61 6d 65 64 20 6f 6e 20 74 68 65 20 63 6f 6d 6d  amed on the comm
12f20 61 6e 64 20 6c 69 6e 65 0a 2a 2a 20 74 68 65 20  and line.** the 
12f30 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
12f40 72 65 61 64 73 20 61 6e 64 20 65 76 61 6c 75 61  reads and evalua
12f50 74 65 73 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a  tes that file..*
12f60 2f 0a 23 69 66 20 54 43 4c 53 48 3d 3d 31 0a 73  /.#if TCLSH==1.s
12f70 74 61 74 69 63 20 63 68 61 72 20 7a 4d 61 69 6e  tatic char zMain
12f80 6c 6f 6f 70 5b 5d 20 3d 0a 20 20 22 73 65 74 20  loop[] =.  "set 
12f90 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20 22 77 68  line {}\n".  "wh
12fa0 69 6c 65 20 7b 21 5b 65 6f 66 20 73 74 64 69 6e  ile {![eof stdin
12fb0 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 22 69 66 20  ]} {\n".    "if 
12fc0 7b 24 6c 69 6e 65 21 3d 5c 22 5c 22 7d 20 7b 5c  {$line!=\"\"} {\
12fd0 6e 22 0a 20 20 20 20 20 20 22 70 75 74 73 20 2d  n".      "puts -
12fe0 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22 3e 20 5c 22  nonewline \"> \"
12ff0 5c 6e 22 0a 20 20 20 20 22 7d 20 65 6c 73 65 20  \n".    "} else 
13000 7b 5c 6e 22 0a 20 20 20 20 20 20 22 70 75 74 73  {\n".      "puts
13010 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22 25 20   -nonewline \"% 
13020 5c 22 5c 6e 22 0a 20 20 20 20 22 7d 5c 6e 22 0a  \"\n".    "}\n".
13030 20 20 20 20 22 66 6c 75 73 68 20 73 74 64 6f 75      "flush stdou
13040 74 5c 6e 22 0a 20 20 20 20 22 61 70 70 65 6e 64  t\n".    "append
13050 20 6c 69 6e 65 20 5b 67 65 74 73 20 73 74 64 69   line [gets stdi
13060 6e 5d 5c 6e 22 0a 20 20 20 20 22 69 66 20 7b 5b  n]\n".    "if {[
13070 69 6e 66 6f 20 63 6f 6d 70 6c 65 74 65 20 24 6c  info complete $l
13080 69 6e 65 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 20  ine]} {\n".     
13090 20 22 69 66 20 7b 5b 63 61 74 63 68 20 7b 75 70   "if {[catch {up
130a0 6c 65 76 65 6c 20 23 30 20 24 6c 69 6e 65 7d 20  level #0 $line} 
130b0 72 65 73 75 6c 74 5d 7d 20 7b 5c 6e 22 0a 20 20  result]} {\n".  
130c0 20 20 20 20 20 20 22 70 75 74 73 20 73 74 64 65        "puts stde
130d0 72 72 20 5c 22 45 72 72 6f 72 3a 20 24 72 65 73  rr \"Error: $res
130e0 75 6c 74 5c 22 5c 6e 22 0a 20 20 20 20 20 20 22  ult\"\n".      "
130f0 7d 20 65 6c 73 65 69 66 20 7b 24 72 65 73 75 6c  } elseif {$resul
13100 74 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20  t!=\"\"} {\n".  
13110 20 20 20 20 20 20 22 70 75 74 73 20 24 72 65 73        "puts $res
13120 75 6c 74 5c 6e 22 0a 20 20 20 20 20 20 22 7d 5c  ult\n".      "}\
13130 6e 22 0a 20 20 20 20 20 20 22 73 65 74 20 6c 69  n".      "set li
13140 6e 65 20 7b 7d 5c 6e 22 0a 20 20 20 20 22 7d 20  ne {}\n".    "} 
13150 65 6c 73 65 20 7b 5c 6e 22 0a 20 20 20 20 20 20  else {\n".      
13160 22 61 70 70 65 6e 64 20 6c 69 6e 65 20 5c 5c 6e  "append line \\n
13170 5c 6e 22 0a 20 20 20 20 22 7d 5c 6e 22 0a 20 20  \n".    "}\n".  
13180 22 7d 5c 6e 22 0a 3b 0a 23 65 6e 64 69 66 0a 0a  "}\n".;.#endif..
13190 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 63  /*.** If the mac
131a0 72 6f 20 54 43 4c 53 48 20 69 73 20 74 77 6f 2c  ro TCLSH is two,
131b0 20 74 68 65 6e 20 67 65 74 20 74 68 65 20 6d 61   then get the ma
131c0 69 6e 20 6c 6f 6f 70 20 63 6f 64 65 20 6f 75 74  in loop code out
131d0 20 6f 66 0a 2a 2a 20 74 68 65 20 73 65 70 61 72   of.** the separ
131e0 61 74 65 20 66 69 6c 65 20 22 73 70 61 63 65 61  ate file "spacea
131f0 6e 61 6c 5f 74 63 6c 2e 68 22 2e 0a 2a 2f 0a 23  nal_tcl.h"..*/.#
13200 69 66 20 54 43 4c 53 48 3d 3d 32 0a 73 74 61 74  if TCLSH==2.stat
13210 69 63 20 63 68 61 72 20 7a 4d 61 69 6e 6c 6f 6f  ic char zMainloo
13220 70 5b 5d 20 3d 20 0a 23 69 6e 63 6c 75 64 65 20  p[] = .#include 
13230 22 73 70 61 63 65 61 6e 61 6c 5f 74 63 6c 2e 68  "spaceanal_tcl.h
13240 22 0a 3b 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66  ".;.#endif..#def
13250 69 6e 65 20 54 43 4c 53 48 5f 4d 41 49 4e 20 6d  ine TCLSH_MAIN m
13260 61 69 6e 20 20 20 2f 2a 20 4e 65 65 64 65 64 20  ain   /* Needed 
13270 74 6f 20 66 61 6b 65 20 6f 75 74 20 6d 6b 74 63  to fake out mktc
13280 6c 61 70 70 20 2a 2f 0a 69 6e 74 20 54 43 4c 53  lapp */.int TCLS
13290 48 5f 4d 41 49 4e 28 69 6e 74 20 61 72 67 63 2c  H_MAIN(int argc,
132a0 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20   char **argv){. 
132b0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
132c0 65 72 70 3b 0a 20 20 54 63 6c 5f 46 69 6e 64 45  erp;.  Tcl_FindE
132d0 78 65 63 75 74 61 62 6c 65 28 61 72 67 76 5b 30  xecutable(argv[0
132e0 5d 29 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20 54  ]);.  interp = T
132f0 63 6c 5f 43 72 65 61 74 65 49 6e 74 65 72 70 28  cl_CreateInterp(
13300 29 3b 0a 20 20 53 71 6c 69 74 65 33 5f 49 6e 69  );.  Sqlite3_Ini
13310 74 28 69 6e 74 65 72 70 29 3b 0a 23 69 66 64 65  t(interp);.#ifde
13320 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
13330 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  {.    extern int
13340 20 4d 64 35 5f 49 6e 69 74 28 54 63 6c 5f 49 6e   Md5_Init(Tcl_In
13350 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
13360 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 63 6f 6e  rn int Sqlitecon
13370 66 69 67 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  fig_Init(Tcl_Int
13380 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
13390 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
133a0 31 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  1_Init(Tcl_Inter
133b0 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
133c0 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 32 5f  int Sqlitetest2_
133d0 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
133e0 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
133f0 74 20 53 71 6c 69 74 65 74 65 73 74 33 5f 49 6e  t Sqlitetest3_In
13400 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
13410 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
13420 53 71 6c 69 74 65 74 65 73 74 34 5f 49 6e 69 74  Sqlitetest4_Init
13430 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
13440 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
13450 6c 69 74 65 74 65 73 74 35 5f 49 6e 69 74 28 54  litetest5_Init(T
13460 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
13470 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
13480 74 65 74 65 73 74 36 5f 49 6e 69 74 28 54 63 6c  tetest6_Init(Tcl
13490 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
134a0 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
134b0 74 65 73 74 37 5f 49 6e 69 74 28 54 63 6c 5f 49  test7_Init(Tcl_I
134c0 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
134d0 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
134e0 73 74 38 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  st8_Init(Tcl_Int
134f0 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
13500 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
13510 39 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  9_Init(Tcl_Inter
13520 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
13530 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 61 73  int Sqlitetestas
13540 79 6e 63 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  ync_Init(Tcl_Int
13550 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
13560 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
13570 5f 61 75 74 6f 65 78 74 5f 49 6e 69 74 28 54 63  _autoext_Init(Tc
13580 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
13590 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
135a0 65 74 65 73 74 5f 66 75 6e 63 5f 49 6e 69 74 28  etest_func_Init(
135b0 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
135c0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
135d0 69 74 65 74 65 73 74 5f 68 65 78 69 6f 5f 49 6e  itetest_hexio_In
135e0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
135f0 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
13600 53 71 6c 69 74 65 74 65 73 74 5f 6d 61 6c 6c 6f  Sqlitetest_mallo
13610 63 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  c_Init(Tcl_Inter
13620 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
13630 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f 6d  int Sqlitetest_m
13640 75 74 65 78 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  utex_Init(Tcl_In
13650 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
13660 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
13670 74 73 63 68 65 6d 61 5f 49 6e 69 74 28 54 63 6c  tschema_Init(Tcl
13680 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
13690 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
136a0 74 65 73 74 73 73 65 5f 49 6e 69 74 28 54 63 6c  testsse_Init(Tcl
136b0 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
136c0 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
136d0 74 65 73 74 74 63 6c 76 61 72 5f 49 6e 69 74 28  testtclvar_Init(
136e0 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
136f0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
13700 69 74 65 74 65 73 74 54 68 72 65 61 64 5f 49 6e  itetestThread_In
13710 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
13720 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
13730 53 71 6c 69 74 65 74 65 73 74 4f 6e 65 66 69 6c  SqlitetestOnefil
13740 65 5f 49 6e 69 74 28 29 3b 0a 20 20 20 20 65 78  e_Init();.    ex
13750 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
13760 65 73 74 4f 73 69 6e 73 74 5f 49 6e 69 74 28 54  estOsinst_Init(T
13770 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 0a 20 20  cl_Interp*);..  
13780 20 20 4d 64 35 5f 49 6e 69 74 28 69 6e 74 65 72    Md5_Init(inter
13790 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 63 6f  p);.    Sqliteco
137a0 6e 66 69 67 5f 49 6e 69 74 28 69 6e 74 65 72 70  nfig_Init(interp
137b0 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
137c0 74 31 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  t1_Init(interp);
137d0 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 32  .    Sqlitetest2
137e0 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
137f0 20 20 20 53 71 6c 69 74 65 74 65 73 74 33 5f 49     Sqlitetest3_I
13800 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
13810 20 53 71 6c 69 74 65 74 65 73 74 34 5f 49 6e 69   Sqlitetest4_Ini
13820 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
13830 71 6c 69 74 65 74 65 73 74 35 5f 49 6e 69 74 28  qlitetest5_Init(
13840 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
13850 69 74 65 74 65 73 74 36 5f 49 6e 69 74 28 69 6e  itetest6_Init(in
13860 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
13870 65 74 65 73 74 37 5f 49 6e 69 74 28 69 6e 74 65  etest7_Init(inte
13880 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
13890 65 73 74 38 5f 49 6e 69 74 28 69 6e 74 65 72 70  est8_Init(interp
138a0 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
138b0 74 39 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  t9_Init(interp);
138c0 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 61  .    Sqlitetesta
138d0 73 79 6e 63 5f 49 6e 69 74 28 69 6e 74 65 72 70  sync_Init(interp
138e0 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
138f0 74 5f 61 75 74 6f 65 78 74 5f 49 6e 69 74 28 69  t_autoext_Init(i
13900 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
13910 74 65 74 65 73 74 5f 66 75 6e 63 5f 49 6e 69 74  tetest_func_Init
13920 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
13930 6c 69 74 65 74 65 73 74 5f 68 65 78 69 6f 5f 49  litetest_hexio_I
13940 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
13950 20 53 71 6c 69 74 65 74 65 73 74 5f 6d 61 6c 6c   Sqlitetest_mall
13960 6f 63 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  oc_Init(interp);
13970 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f  .    Sqlitetest_
13980 6d 75 74 65 78 5f 49 6e 69 74 28 69 6e 74 65 72  mutex_Init(inter
13990 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
139a0 73 74 73 63 68 65 6d 61 5f 49 6e 69 74 28 69 6e  stschema_Init(in
139b0 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
139c0 65 74 65 73 74 74 63 6c 76 61 72 5f 49 6e 69 74  etesttclvar_Init
139d0 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
139e0 6c 69 74 65 74 65 73 74 54 68 72 65 61 64 5f 49  litetestThread_I
139f0 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
13a00 20 53 71 6c 69 74 65 74 65 73 74 4f 6e 65 66 69   SqlitetestOnefi
13a10 6c 65 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  le_Init(interp);
13a20 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 4f  .    SqlitetestO
13a30 73 69 6e 73 74 5f 49 6e 69 74 28 69 6e 74 65 72  sinst_Init(inter
13a40 70 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  p);..#ifdef SQLI
13a50 54 45 5f 53 53 45 0a 20 20 20 20 53 71 6c 69 74  TE_SSE.    Sqlit
13a60 65 74 65 73 74 73 73 65 5f 49 6e 69 74 28 69 6e  etestsse_Init(in
13a70 74 65 72 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20  terp);.#endif.  
13a80 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 61  }.#endif.  if( a
13a90 72 67 63 3e 3d 32 20 7c 7c 20 54 43 4c 53 48 3d  rgc>=2 || TCLSH=
13aa0 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  =2 ){.    int i;
13ab0 0a 20 20 20 20 63 68 61 72 20 7a 41 72 67 63 5b  .    char zArgc[
13ac0 33 32 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  32];.    sqlite3
13ad0 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
13ae0 28 7a 41 72 67 63 29 2c 20 7a 41 72 67 63 2c 20  (zArgc), zArgc, 
13af0 22 25 64 22 2c 20 61 72 67 63 2d 28 33 2d 54 43  "%d", argc-(3-TC
13b00 4c 53 48 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53  LSH));.    Tcl_S
13b10 65 74 56 61 72 28 69 6e 74 65 72 70 2c 22 61 72  etVar(interp,"ar
13b20 67 63 22 2c 20 7a 41 72 67 63 2c 20 54 43 4c 5f  gc", zArgc, TCL_
13b30 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20  GLOBAL_ONLY);.  
13b40 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74    Tcl_SetVar(int
13b50 65 72 70 2c 22 61 72 67 76 30 22 2c 61 72 67 76  erp,"argv0",argv
13b60 5b 31 5d 2c 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f  [1],TCL_GLOBAL_O
13b70 4e 4c 59 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  NLY);.    Tcl_Se
13b80 74 56 61 72 28 69 6e 74 65 72 70 2c 22 61 72 67  tVar(interp,"arg
13b90 76 22 2c 20 22 22 2c 20 54 43 4c 5f 47 4c 4f 42  v", "", TCL_GLOB
13ba0 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 66 6f  AL_ONLY);.    fo
13bb0 72 28 69 3d 33 2d 54 43 4c 53 48 3b 20 69 3c 61  r(i=3-TCLSH; i<a
13bc0 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rgc; i++){.     
13bd0 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65   Tcl_SetVar(inte
13be0 72 70 2c 20 22 61 72 67 76 22 2c 20 61 72 67 76  rp, "argv", argv
13bf0 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 54  [i],.          T
13c00 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 20 7c  CL_GLOBAL_ONLY |
13c10 20 54 43 4c 5f 4c 49 53 54 5f 45 4c 45 4d 45 4e   TCL_LIST_ELEMEN
13c20 54 20 7c 20 54 43 4c 5f 41 50 50 45 4e 44 5f 56  T | TCL_APPEND_V
13c30 41 4c 55 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ALUE);.    }.   
13c40 20 69 66 28 20 54 43 4c 53 48 3d 3d 31 20 26 26   if( TCLSH==1 &&
13c50 20 54 63 6c 5f 45 76 61 6c 46 69 6c 65 28 69 6e   Tcl_EvalFile(in
13c60 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 29 21 3d  terp, argv[1])!=
13c70 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  TCL_OK ){.      
13c80 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 66  const char *zInf
13c90 6f 20 3d 20 54 63 6c 5f 47 65 74 56 61 72 28 69  o = Tcl_GetVar(i
13ca0 6e 74 65 72 70 2c 20 22 65 72 72 6f 72 49 6e 66  nterp, "errorInf
13cb0 6f 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f  o", TCL_GLOBAL_O
13cc0 4e 4c 59 29 3b 0a 20 20 20 20 20 20 69 66 28 20  NLY);.      if( 
13cd0 7a 49 6e 66 6f 3d 3d 30 20 29 20 7a 49 6e 66 6f  zInfo==0 ) zInfo
13ce0 20 3d 20 69 6e 74 65 72 70 2d 3e 72 65 73 75 6c   = interp->resul
13cf0 74 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  t;.      fprintf
13d00 28 73 74 64 65 72 72 2c 22 25 73 3a 20 25 73 5c  (stderr,"%s: %s\
13d10 6e 22 2c 20 2a 61 72 67 76 2c 20 7a 49 6e 66 6f  n", *argv, zInfo
13d20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
13d30 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  1;.    }.  }.  i
13d40 66 28 20 61 72 67 63 3c 3d 31 20 7c 7c 20 54 43  f( argc<=1 || TC
13d50 4c 53 48 3d 3d 32 20 29 7b 0a 20 20 20 20 54 63  LSH==2 ){.    Tc
13d60 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 28 69 6e 74  l_GlobalEval(int
13d70 65 72 70 2c 20 7a 4d 61 69 6e 6c 6f 6f 70 29 3b  erp, zMainloop);
13d80 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
13d90 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 54 43 4c  .}.#endif /* TCL
13da0 53 48 20 2a 2f 0a                                SH */.