/ Hex Artifact Content
Login

Artifact 37d34e4131845584940d04729a18fc8441a7d35d:


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 34 30 20 32 30 30 39  e.c,v 1.240 2009
0220: 2f 30 33 2f 32 37 20 31 32 3a 33 32 3a 35 35 20  /03/27 12:32:55 
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 54 63 6c 5f 4f 62 6a 20  y) */.  Tcl_Obj 
0fa0: 2a 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 3b 20  *pUnlockNotify; 
0fb0: 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20 6e 6f 74     /* Unlock not
0fc0: 69 66 79 20 73 63 72 69 70 74 20 28 69 66 20 61  ify script (if a
0fd0: 6e 79 29 20 2a 2f 0a 20 20 53 71 6c 43 6f 6c 6c  ny) */.  SqlColl
0fe0: 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65 3b 20 20  ate *pCollate;  
0ff0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 53      /* List of S
1000: 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e  QL collation fun
1010: 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ctions */.  int 
1020: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1030: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1040: 20 63 6f 64 65 20 6f 66 20 6d 6f 73 74 20 72 65   code of most re
1050: 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65  cent sqlite3_exe
1060: 63 28 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  c() */.  Tcl_Obj
1070: 20 2a 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64   *pCollateNeeded
1080: 3b 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e  ;   /* Collation
1090: 20 6e 65 65 64 65 64 20 73 63 72 69 70 74 20 2a   needed script *
10a0: 2f 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64 53  /.  SqlPreparedS
10b0: 74 6d 74 20 2a 73 74 6d 74 4c 69 73 74 3b 20 2f  tmt *stmtList; /
10c0: 2a 20 4c 69 73 74 20 6f 66 20 70 72 65 70 61 72  * List of prepar
10d0: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2a 2f 0a  ed statements*/.
10e0: 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d    SqlPreparedStm
10f0: 74 20 2a 73 74 6d 74 4c 61 73 74 3b 20 2f 2a 20  t *stmtLast; /* 
1100: 4c 61 73 74 20 73 74 61 74 65 6d 65 6e 74 20 69  Last statement i
1110: 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20  n the list */.  
1120: 69 6e 74 20 6d 61 78 53 74 6d 74 3b 20 20 20 20  int maxStmt;    
1130: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1140: 65 20 6e 65 78 74 20 6d 61 78 69 6d 75 6d 20 6e  e next maximum n
1150: 75 6d 62 65 72 20 6f 66 20 73 74 6d 74 4c 69 73  umber of stmtLis
1160: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 74 6d 74  t */.  int nStmt
1170: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1180: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73    /* Number of s
1190: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 73 74 6d  tatements in stm
11a0: 74 4c 69 73 74 20 2a 2f 0a 20 20 49 6e 63 72 62  tList */.  Incrb
11b0: 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 49 6e 63  lobChannel *pInc
11c0: 72 62 6c 6f 62 3b 2f 2a 20 4c 69 6e 6b 65 64 20  rblob;/* Linked 
11d0: 6c 69 73 74 20 6f 66 20 6f 70 65 6e 20 69 6e 63  list of open inc
11e0: 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 73 20 2a  rblob channels *
11f0: 2f 0a 20 20 69 6e 74 20 6e 53 74 65 70 2c 20 6e  /.  int nStep, n
1200: 53 6f 72 74 3b 20 20 20 20 20 20 20 20 20 20 2f  Sort;          /
1210: 2a 20 53 74 61 74 69 73 74 69 63 73 20 66 6f 72  * Statistics for
1220: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 6f 70 65   most recent ope
1230: 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ration */.  int 
1240: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3b 20 20 20  nTransaction;   
1250: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1260: 20 6f 66 20 6e 65 73 74 65 64 20 5b 74 72 61 6e   of nested [tran
1270: 73 61 63 74 69 6f 6e 5d 20 6d 65 74 68 6f 64 73  saction] methods
1280: 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 49   */.};..struct I
1290: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 7b  ncrblobChannel {
12a0: 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20  .  sqlite3_blob 
12b0: 2a 70 42 6c 6f 62 3b 20 20 20 20 20 20 2f 2a 20  *pBlob;      /* 
12c0: 73 71 6c 69 74 65 33 20 62 6c 6f 62 20 68 61 6e  sqlite3 blob han
12d0: 64 6c 65 20 2a 2f 0a 20 20 53 71 6c 69 74 65 44  dle */.  SqliteD
12e0: 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20  b *pDb;         
12f0: 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64     /* Associated
1300: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
1310: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 53  tion */.  int iS
1320: 65 65 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  eek;            
1330: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73      /* Current s
1340: 65 65 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20  eek offset */.  
1350: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e  Tcl_Channel chan
1360: 6e 65 6c 3b 20 20 20 20 20 20 2f 2a 20 43 68 61  nel;      /* Cha
1370: 6e 6e 65 6c 20 69 64 65 6e 74 69 66 69 65 72 20  nnel identifier 
1380: 2a 2f 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61  */.  IncrblobCha
1390: 6e 6e 65 6c 20 2a 70 4e 65 78 74 3b 20 20 20 2f  nnel *pNext;   /
13a0: 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  * Linked list of
13b0: 20 61 6c 6c 20 6f 70 65 6e 20 69 6e 63 72 62 6c   all open incrbl
13c0: 6f 62 20 63 68 61 6e 6e 65 6c 73 20 2a 2f 0a 20  ob channels */. 
13d0: 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c   IncrblobChannel
13e0: 20 2a 70 50 72 65 76 3b 20 20 20 2f 2a 20 4c 69   *pPrev;   /* Li
13f0: 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 61 6c 6c  nked list of all
1400: 20 6f 70 65 6e 20 69 6e 63 72 62 6c 6f 62 20 63   open incrblob c
1410: 68 61 6e 6e 65 6c 73 20 2a 2f 0a 7d 3b 0a 0a 2f  hannels */.};../
1420: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73  *.** Compute a s
1430: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 74 68 61  tring length tha
1440: 74 20 69 73 20 6c 69 6d 69 74 65 64 20 74 6f 20  t is limited to 
1450: 77 68 61 74 20 63 61 6e 20 62 65 20 73 74 6f 72  what can be stor
1460: 65 64 20 69 6e 0a 2a 2a 20 6c 6f 77 65 72 20 33  ed in.** lower 3
1470: 30 20 62 69 74 73 20 6f 66 20 61 20 33 32 2d 62  0 bits of a 32-b
1480: 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  it signed intege
1490: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
14a0: 20 73 74 72 6c 65 6e 33 30 28 63 6f 6e 73 74 20   strlen30(const 
14b0: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63 6f 6e 73  char *z){.  cons
14c0: 74 20 63 68 61 72 20 2a 7a 32 20 3d 20 7a 3b 0a  t char *z2 = z;.
14d0: 20 20 77 68 69 6c 65 28 20 2a 7a 32 20 29 7b 20    while( *z2 ){ 
14e0: 7a 32 2b 2b 3b 20 7d 0a 20 20 72 65 74 75 72 6e  z2++; }.  return
14f0: 20 30 78 33 66 66 66 66 66 66 66 20 26 20 28 69   0x3fffffff & (i
1500: 6e 74 29 28 7a 32 20 2d 20 7a 29 3b 0a 7d 0a 0a  nt)(z2 - z);.}..
1510: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1520: 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a  OMIT_INCRBLOB./*
1530: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 69 6e  .** Close all in
1540: 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 73 20  crblob channels 
1550: 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 64 61 74  opened using dat
1560: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1570: 20 70 44 62 2e 0a 2a 2a 20 54 68 69 73 20 69 73   pDb..** This is
1580: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 73 68 75   called when shu
1590: 74 74 69 6e 67 20 64 6f 77 6e 20 74 68 65 20 64  tting down the d
15a0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
15b0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
15c0: 69 64 20 63 6c 6f 73 65 49 6e 63 72 62 6c 6f 62  id closeIncrblob
15d0: 43 68 61 6e 6e 65 6c 73 28 53 71 6c 69 74 65 44  Channels(SqliteD
15e0: 62 20 2a 70 44 62 29 7b 0a 20 20 49 6e 63 72 62  b *pDb){.  Incrb
15f0: 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 3b 0a 20  lobChannel *p;. 
1600: 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c   IncrblobChannel
1610: 20 2a 70 4e 65 78 74 3b 0a 0a 20 20 66 6f 72 28   *pNext;..  for(
1620: 70 3d 70 44 62 2d 3e 70 49 6e 63 72 62 6c 6f 62  p=pDb->pIncrblob
1630: 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20  ; p; p=pNext){. 
1640: 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e     pNext = p->pN
1650: 65 78 74 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 74  ext;..    /* Not
1660: 65 3a 20 43 61 6c 6c 69 6e 67 20 75 6e 72 65 67  e: Calling unreg
1670: 69 73 74 65 72 20 68 65 72 65 20 63 61 6c 6c 20  ister here call 
1680: 54 63 6c 5f 43 6c 6f 73 65 20 6f 6e 20 74 68 65  Tcl_Close on the
1690: 20 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65   incrblob channe
16a0: 6c 2c 20 0a 20 20 20 20 2a 2a 20 77 68 69 63 68  l, .    ** which
16b0: 20 64 65 6c 65 74 65 73 20 74 68 65 20 49 6e 63   deletes the Inc
16c0: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 73 74 72  rblobChannel str
16d0: 75 63 74 75 72 65 20 61 74 20 2a 70 2e 20 53 6f  ucture at *p. So
16e0: 20 64 6f 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 63   do not.    ** c
16f0: 61 6c 6c 20 54 63 6c 5f 46 72 65 65 28 29 20 68  all Tcl_Free() h
1700: 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ere..    */.    
1710: 54 63 6c 5f 55 6e 72 65 67 69 73 74 65 72 43 68  Tcl_UnregisterCh
1720: 61 6e 6e 65 6c 28 70 44 62 2d 3e 69 6e 74 65 72  annel(pDb->inter
1730: 70 2c 20 70 2d 3e 63 68 61 6e 6e 65 6c 29 3b 0a  p, p->channel);.
1740: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f    }.}../*.** Clo
1750: 73 65 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  se an incrementa
1760: 6c 20 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a  l blob channel..
1770: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
1780: 63 72 62 6c 6f 62 43 6c 6f 73 65 28 43 6c 69 65  crblobClose(Clie
1790: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44  ntData instanceD
17a0: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ata, Tcl_Interp 
17b0: 2a 69 6e 74 65 72 70 29 7b 0a 20 20 49 6e 63 72  *interp){.  Incr
17c0: 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 20 3d  blobChannel *p =
17d0: 20 28 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65   (IncrblobChanne
17e0: 6c 20 2a 29 69 6e 73 74 61 6e 63 65 44 61 74 61  l *)instanceData
17f0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  ;.  int rc = sql
1800: 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28  ite3_blob_close(
1810: 70 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20 73 71 6c  p->pBlob);.  sql
1820: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 70 44  ite3 *db = p->pD
1830: 62 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 52 65 6d  b->db;..  /* Rem
1840: 6f 76 65 20 74 68 65 20 63 68 61 6e 6e 65 6c 20  ove the channel 
1850: 66 72 6f 6d 20 74 68 65 20 53 71 6c 69 74 65 44  from the SqliteD
1860: 62 2e 70 49 6e 63 72 62 6c 6f 62 20 6c 69 73 74  b.pIncrblob list
1870: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4e  . */.  if( p->pN
1880: 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e  ext ){.    p->pN
1890: 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e  ext->pPrev = p->
18a0: 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 69 66 28  pPrev;.  }.  if(
18b0: 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20   p->pPrev ){.   
18c0: 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74   p->pPrev->pNext
18d0: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
18e0: 0a 20 20 69 66 28 20 70 2d 3e 70 44 62 2d 3e 70  .  if( p->pDb->p
18f0: 49 6e 63 72 62 6c 6f 62 3d 3d 70 20 29 7b 0a 20  Incrblob==p ){. 
1900: 20 20 20 70 2d 3e 70 44 62 2d 3e 70 49 6e 63 72     p->pDb->pIncr
1910: 62 6c 6f 62 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  blob = p->pNext;
1920: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20  .  }..  /* Free 
1930: 74 68 65 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e  the IncrblobChan
1940: 6e 65 6c 20 73 74 72 75 63 74 75 72 65 20 2a 2f  nel structure */
1950: 0a 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61  .  Tcl_Free((cha
1960: 72 20 2a 29 70 29 3b 0a 0a 20 20 69 66 28 20 72  r *)p);..  if( r
1970: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1980: 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
1990: 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
19a0: 2a 29 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  *)sqlite3_errmsg
19b0: 28 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49  (db), TCL_VOLATI
19c0: 4c 45 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  LE);.    return 
19d0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
19e0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
19f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61  }../*.** Read da
1a00: 74 61 20 66 72 6f 6d 20 61 6e 20 69 6e 63 72 65  ta from an incre
1a10: 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 68 61 6e  mental blob chan
1a20: 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  nel..*/.static i
1a30: 6e 74 20 69 6e 63 72 62 6c 6f 62 49 6e 70 75 74  nt incrblobInput
1a40: 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 69  (.  ClientData i
1a50: 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 0a 20 20  nstanceData, .  
1a60: 63 68 61 72 20 2a 62 75 66 2c 20 0a 20 20 69 6e  char *buf, .  in
1a70: 74 20 62 75 66 53 69 7a 65 2c 0a 20 20 69 6e 74  t bufSize,.  int
1a80: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 0a 29   *errorCodePtr.)
1a90: 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e  {.  IncrblobChan
1aa0: 6e 65 6c 20 2a 70 20 3d 20 28 49 6e 63 72 62 6c  nel *p = (Incrbl
1ab0: 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 69 6e 73 74  obChannel *)inst
1ac0: 61 6e 63 65 44 61 74 61 3b 0a 20 20 69 6e 74 20  anceData;.  int 
1ad0: 6e 52 65 61 64 20 3d 20 62 75 66 53 69 7a 65 3b  nRead = bufSize;
1ae0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1af0: 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72  er of bytes to r
1b00: 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 6c  ead */.  int nBl
1b10: 6f 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ob;             
1b20: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73        /* Total s
1b30: 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 62 20  ize of the blob 
1b40: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
1b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b60: 20 20 2f 2a 20 73 71 6c 69 74 65 20 65 72 72 6f    /* sqlite erro
1b70: 72 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 6e 42 6c  r code */..  nBl
1b80: 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f  ob = sqlite3_blo
1b90: 62 5f 62 79 74 65 73 28 70 2d 3e 70 42 6c 6f 62  b_bytes(p->pBlob
1ba0: 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 69 53 65  );.  if( (p->iSe
1bb0: 65 6b 2b 6e 52 65 61 64 29 3e 6e 42 6c 6f 62 20  ek+nRead)>nBlob 
1bc0: 29 7b 0a 20 20 20 20 6e 52 65 61 64 20 3d 20 6e  ){.    nRead = n
1bd0: 42 6c 6f 62 2d 70 2d 3e 69 53 65 65 6b 3b 0a 20  Blob-p->iSeek;. 
1be0: 20 7d 0a 20 20 69 66 28 20 6e 52 65 61 64 3c 3d   }.  if( nRead<=
1bf0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1c00: 30 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73  0;.  }..  rc = s
1c10: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64  qlite3_blob_read
1c20: 28 70 2d 3e 70 42 6c 6f 62 2c 20 28 76 6f 69 64  (p->pBlob, (void
1c30: 20 2a 29 62 75 66 2c 20 6e 52 65 61 64 2c 20 70   *)buf, nRead, p
1c40: 2d 3e 69 53 65 65 6b 29 3b 0a 20 20 69 66 28 20  ->iSeek);.  if( 
1c50: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1c60: 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50  .    *errorCodeP
1c70: 74 72 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74  tr = rc;.    ret
1c80: 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 70  urn -1;.  }..  p
1c90: 2d 3e 69 53 65 65 6b 20 2b 3d 20 6e 52 65 61 64  ->iSeek += nRead
1ca0: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 52 65 61 64  ;.  return nRead
1cb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
1cc0: 20 64 61 74 61 20 74 6f 20 61 6e 20 69 6e 63 72   data to an incr
1cd0: 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 68 61  emental blob cha
1ce0: 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nnel..*/.static 
1cf0: 69 6e 74 20 69 6e 63 72 62 6c 6f 62 4f 75 74 70  int incrblobOutp
1d00: 75 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  ut(.  ClientData
1d10: 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 0a   instanceData, .
1d20: 20 20 43 4f 4e 53 54 20 63 68 61 72 20 2a 62 75    CONST char *bu
1d30: 66 2c 20 0a 20 20 69 6e 74 20 74 6f 57 72 69 74  f, .  int toWrit
1d40: 65 2c 0a 20 20 69 6e 74 20 2a 65 72 72 6f 72 43  e,.  int *errorC
1d50: 6f 64 65 50 74 72 0a 29 7b 0a 20 20 49 6e 63 72  odePtr.){.  Incr
1d60: 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 20 3d  blobChannel *p =
1d70: 20 28 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65   (IncrblobChanne
1d80: 6c 20 2a 29 69 6e 73 74 61 6e 63 65 44 61 74 61  l *)instanceData
1d90: 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d  ;.  int nWrite =
1da0: 20 74 6f 57 72 69 74 65 3b 20 20 20 20 20 20 20   toWrite;       
1db0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
1dc0: 74 65 73 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a  tes to write */.
1dd0: 20 20 69 6e 74 20 6e 42 6c 6f 62 3b 20 20 20 20    int nBlob;    
1de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1df0: 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20  * Total size of 
1e00: 74 68 65 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 6e  the blob */.  in
1e10: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1e20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
1e30: 6c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  lite error code 
1e40: 2a 2f 0a 0a 20 20 6e 42 6c 6f 62 20 3d 20 73 71  */..  nBlob = sq
1e50: 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73  lite3_blob_bytes
1e60: 28 70 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20 69 66  (p->pBlob);.  if
1e70: 28 20 28 70 2d 3e 69 53 65 65 6b 2b 6e 57 72 69  ( (p->iSeek+nWri
1e80: 74 65 29 3e 6e 42 6c 6f 62 20 29 7b 0a 20 20 20  te)>nBlob ){.   
1e90: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d   *errorCodePtr =
1ea0: 20 45 49 4e 56 41 4c 3b 0a 20 20 20 20 72 65 74   EINVAL;.    ret
1eb0: 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66  urn -1;.  }.  if
1ec0: 28 20 6e 57 72 69 74 65 3c 3d 30 20 29 7b 0a 20  ( nWrite<=0 ){. 
1ed0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1ee0: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
1ef0: 5f 62 6c 6f 62 5f 77 72 69 74 65 28 70 2d 3e 70  _blob_write(p->p
1f00: 42 6c 6f 62 2c 20 28 76 6f 69 64 20 2a 29 62 75  Blob, (void *)bu
1f10: 66 2c 20 6e 57 72 69 74 65 2c 20 70 2d 3e 69 53  f, nWrite, p->iS
1f20: 65 65 6b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  eek);.  if( rc!=
1f30: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f40: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d   *errorCodePtr =
1f50: 20 45 49 4f 3b 0a 20 20 20 20 72 65 74 75 72 6e   EIO;.    return
1f60: 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69   -1;.  }..  p->i
1f70: 53 65 65 6b 20 2b 3d 20 6e 57 72 69 74 65 3b 0a  Seek += nWrite;.
1f80: 20 20 72 65 74 75 72 6e 20 6e 57 72 69 74 65 3b    return nWrite;
1f90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 61  .}../*.** Seek a
1fa0: 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c  n incremental bl
1fb0: 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73  ob channel..*/.s
1fc0: 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 62 6c  tatic int incrbl
1fd0: 6f 62 53 65 65 6b 28 0a 20 20 43 6c 69 65 6e 74  obSeek(.  Client
1fe0: 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74  Data instanceDat
1ff0: 61 2c 20 0a 20 20 6c 6f 6e 67 20 6f 66 66 73 65  a, .  long offse
2000: 74 2c 0a 20 20 69 6e 74 20 73 65 65 6b 4d 6f 64  t,.  int seekMod
2010: 65 2c 0a 20 20 69 6e 74 20 2a 65 72 72 6f 72 43  e,.  int *errorC
2020: 6f 64 65 50 74 72 0a 29 7b 0a 20 20 49 6e 63 72  odePtr.){.  Incr
2030: 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 20 3d  blobChannel *p =
2040: 20 28 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65   (IncrblobChanne
2050: 6c 20 2a 29 69 6e 73 74 61 6e 63 65 44 61 74 61  l *)instanceData
2060: 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 73 65 65  ;..  switch( see
2070: 6b 4d 6f 64 65 20 29 7b 0a 20 20 20 20 63 61 73  kMode ){.    cas
2080: 65 20 53 45 45 4b 5f 53 45 54 3a 0a 20 20 20 20  e SEEK_SET:.    
2090: 20 20 70 2d 3e 69 53 65 65 6b 20 3d 20 6f 66 66    p->iSeek = off
20a0: 73 65 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  set;.      break
20b0: 3b 0a 20 20 20 20 63 61 73 65 20 53 45 45 4b 5f  ;.    case SEEK_
20c0: 43 55 52 3a 0a 20 20 20 20 20 20 70 2d 3e 69 53  CUR:.      p->iS
20d0: 65 65 6b 20 2b 3d 20 6f 66 66 73 65 74 3b 0a 20  eek += offset;. 
20e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
20f0: 63 61 73 65 20 53 45 45 4b 5f 45 4e 44 3a 0a 20  case SEEK_END:. 
2100: 20 20 20 20 20 70 2d 3e 69 53 65 65 6b 20 3d 20       p->iSeek = 
2110: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74  sqlite3_blob_byt
2120: 65 73 28 70 2d 3e 70 42 6c 6f 62 29 20 2b 20 6f  es(p->pBlob) + o
2130: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 62 72 65  ffset;.      bre
2140: 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74  ak;..    default
2150: 3a 20 61 73 73 65 72 74 28 21 22 42 61 64 20 73  : assert(!"Bad s
2160: 65 65 6b 4d 6f 64 65 22 29 3b 0a 20 20 7d 0a 0a  eekMode");.  }..
2170: 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 53 65 65    return p->iSee
2180: 6b 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 76 6f  k;.}...static vo
2190: 69 64 20 69 6e 63 72 62 6c 6f 62 57 61 74 63 68  id incrblobWatch
21a0: 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74  (ClientData inst
21b0: 61 6e 63 65 44 61 74 61 2c 20 69 6e 74 20 6d 6f  anceData, int mo
21c0: 64 65 29 7b 20 0a 20 20 2f 2a 20 4e 4f 2d 4f 50  de){ .  /* NO-OP
21d0: 20 2a 2f 20 0a 7d 0a 73 74 61 74 69 63 20 69 6e   */ .}.static in
21e0: 74 20 69 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65  t incrblobHandle
21f0: 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74  (ClientData inst
2200: 61 6e 63 65 44 61 74 61 2c 20 69 6e 74 20 64 69  anceData, int di
2210: 72 2c 20 43 6c 69 65 6e 74 44 61 74 61 20 2a 68  r, ClientData *h
2220: 50 74 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 54  Ptr){.  return T
2230: 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 73 74 61  CL_ERROR;.}..sta
2240: 74 69 63 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 54  tic Tcl_ChannelT
2250: 79 70 65 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e  ype IncrblobChan
2260: 6e 65 6c 54 79 70 65 20 3d 20 7b 0a 20 20 22 69  nelType = {.  "i
2270: 6e 63 72 62 6c 6f 62 22 2c 20 20 20 20 20 20 20  ncrblob",       
2280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2290: 20 2f 2a 20 74 79 70 65 4e 61 6d 65 20 20 20 20   /* typeName    
22a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b0: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 54 43           */.  TC
22c0: 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53 49 4f  L_CHANNEL_VERSIO
22d0: 4e 5f 32 2c 20 20 20 20 20 20 20 20 20 20 20 20  N_2,            
22e0: 20 2f 2a 20 76 65 72 73 69 6f 6e 20 20 20 20 20   /* version     
22f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2300: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 69 6e           */.  in
2310: 63 72 62 6c 6f 62 43 6c 6f 73 65 2c 20 20 20 20  crblobClose,    
2320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2330: 20 2f 2a 20 63 6c 6f 73 65 50 72 6f 63 20 20 20   /* closeProc   
2340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2350: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 69 6e           */.  in
2360: 63 72 62 6c 6f 62 49 6e 70 75 74 2c 20 20 20 20  crblobInput,    
2370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2380: 20 2f 2a 20 69 6e 70 75 74 50 72 6f 63 20 20 20   /* inputProc   
2390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a0: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 69 6e           */.  in
23b0: 63 72 62 6c 6f 62 4f 75 74 70 75 74 2c 20 20 20  crblobOutput,   
23c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d0: 20 2f 2a 20 6f 75 74 70 75 74 50 72 6f 63 20 20   /* outputProc  
23e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f0: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 69 6e           */.  in
2400: 63 72 62 6c 6f 62 53 65 65 6b 2c 20 20 20 20 20  crblobSeek,     
2410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2420: 20 2f 2a 20 73 65 65 6b 50 72 6f 63 20 20 20 20   /* seekProc    
2430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2440: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 30 2c           */.  0,
2450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2470: 20 2f 2a 20 73 65 74 4f 70 74 69 6f 6e 50 72 6f   /* setOptionPro
2480: 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
2490: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 30 2c           */.  0,
24a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c0: 20 2f 2a 20 67 65 74 4f 70 74 69 6f 6e 50 72 6f   /* getOptionPro
24d0: 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
24e0: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 69 6e           */.  in
24f0: 63 72 62 6c 6f 62 57 61 74 63 68 2c 20 20 20 20  crblobWatch,    
2500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2510: 20 2f 2a 20 77 61 74 63 68 50 72 6f 63 20 28 74   /* watchProc (t
2520: 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 29 20  his is a no-op) 
2530: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 69 6e           */.  in
2540: 63 72 62 6c 6f 62 48 61 6e 64 6c 65 2c 20 20 20  crblobHandle,   
2550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2560: 20 2f 2a 20 67 65 74 48 61 6e 64 6c 65 50 72 6f   /* getHandlePro
2570: 63 20 28 61 6c 77 61 79 73 20 72 65 74 75 72 6e  c (always return
2580: 73 20 65 72 72 6f 72 29 20 2a 2f 0a 20 20 30 2c  s error) */.  0,
2590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b0: 20 2f 2a 20 63 6c 6f 73 65 32 50 72 6f 63 20 20   /* close2Proc  
25c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d0: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 30 2c           */.  0,
25e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2600: 20 2f 2a 20 62 6c 6f 63 6b 4d 6f 64 65 50 72 6f   /* blockModePro
2610: 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
2620: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 30 2c           */.  0,
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2650: 20 2f 2a 20 66 6c 75 73 68 50 72 6f 63 20 20 20   /* flushProc   
2660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2670: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 30 2c           */.  0,
2680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a0: 20 2f 2a 20 68 61 6e 64 6c 65 72 50 72 6f 63 20   /* handlerProc 
26b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c0: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 30 2c           */.  0,
26d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f0: 20 2f 2a 20 77 69 64 65 53 65 65 6b 50 72 6f 63   /* wideSeekProc
2700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2710: 20 20 20 20 20 20 20 20 20 2a 2f 0a 7d 3b 0a 0a           */.};..
2720: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
2730: 65 77 20 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e  ew incrblob chan
2740: 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  nel..*/.static i
2750: 6e 74 20 63 72 65 61 74 65 49 6e 63 72 62 6c 6f  nt createIncrblo
2760: 62 43 68 61 6e 6e 65 6c 28 0a 20 20 54 63 6c 5f  bChannel(.  Tcl_
2770: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
2780: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
2790: 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
27a0: 2a 7a 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68  *zDb,.  const ch
27b0: 61 72 20 2a 7a 54 61 62 6c 65 2c 20 0a 20 20 63  ar *zTable, .  c
27c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75  onst char *zColu
27d0: 6d 6e 2c 20 0a 20 20 73 71 6c 69 74 65 5f 69 6e  mn, .  sqlite_in
27e0: 74 36 34 20 69 52 6f 77 2c 0a 20 20 69 6e 74 20  t64 iRow,.  int 
27f0: 69 73 52 65 61 64 6f 6e 6c 79 0a 29 7b 0a 20 20  isReadonly.){.  
2800: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20  IncrblobChannel 
2810: 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  *p;.  sqlite3 *d
2820: 62 20 3d 20 70 44 62 2d 3e 64 62 3b 0a 20 20 73  b = pDb->db;.  s
2830: 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c  qlite3_blob *pBl
2840: 6f 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ob;.  int rc;.  
2850: 69 6e 74 20 66 6c 61 67 73 20 3d 20 54 43 4c 5f  int flags = TCL_
2860: 52 45 41 44 41 42 4c 45 7c 28 69 73 52 65 61 64  READABLE|(isRead
2870: 6f 6e 6c 79 20 3f 20 30 20 3a 20 54 43 4c 5f 57  only ? 0 : TCL_W
2880: 52 49 54 41 42 4c 45 29 3b 0a 0a 20 20 2f 2a 20  RITABLE);..  /* 
2890: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73  This variable is
28a0: 20 75 73 65 64 20 74 6f 20 6e 61 6d 65 20 74 68   used to name th
28b0: 65 20 63 68 61 6e 6e 65 6c 73 3a 20 22 69 6e 63  e channels: "inc
28c0: 72 62 6c 6f 62 5f 5b 69 6e 63 72 20 63 6f 75 6e  rblob_[incr coun
28d0: 74 5d 22 20 2a 2f 0a 20 20 73 74 61 74 69 63 20  t]" */.  static 
28e0: 69 6e 74 20 63 6f 75 6e 74 20 3d 20 30 3b 0a 20  int count = 0;. 
28f0: 20 63 68 61 72 20 7a 43 68 61 6e 6e 65 6c 5b 36   char zChannel[6
2900: 34 5d 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  4];..  rc = sqli
2910: 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 64 62  te3_blob_open(db
2920: 2c 20 7a 44 62 2c 20 7a 54 61 62 6c 65 2c 20 7a  , zDb, zTable, z
2930: 43 6f 6c 75 6d 6e 2c 20 69 52 6f 77 2c 20 21 69  Column, iRow, !i
2940: 73 52 65 61 64 6f 6e 6c 79 2c 20 26 70 42 6c 6f  sReadonly, &pBlo
2950: 62 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  b);.  if( rc!=SQ
2960: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
2970: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
2980: 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c  erp, (char *)sql
2990: 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d  ite3_errmsg(pDb-
29a0: 3e 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49  >db), TCL_VOLATI
29b0: 4c 45 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  LE);.    return 
29c0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
29d0: 20 20 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43    p = (IncrblobC
29e0: 68 61 6e 6e 65 6c 20 2a 29 54 63 6c 5f 41 6c 6c  hannel *)Tcl_All
29f0: 6f 63 28 73 69 7a 65 6f 66 28 49 6e 63 72 62 6c  oc(sizeof(Incrbl
2a00: 6f 62 43 68 61 6e 6e 65 6c 29 29 3b 0a 20 20 70  obChannel));.  p
2a10: 2d 3e 69 53 65 65 6b 20 3d 20 30 3b 0a 20 20 70  ->iSeek = 0;.  p
2a20: 2d 3e 70 42 6c 6f 62 20 3d 20 70 42 6c 6f 62 3b  ->pBlob = pBlob;
2a30: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ..  sqlite3_snpr
2a40: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 43 68 61  intf(sizeof(zCha
2a50: 6e 6e 65 6c 29 2c 20 7a 43 68 61 6e 6e 65 6c 2c  nnel), zChannel,
2a60: 20 22 69 6e 63 72 62 6c 6f 62 5f 25 64 22 2c 20   "incrblob_%d", 
2a70: 2b 2b 63 6f 75 6e 74 29 3b 0a 20 20 70 2d 3e 63  ++count);.  p->c
2a80: 68 61 6e 6e 65 6c 20 3d 20 54 63 6c 5f 43 72 65  hannel = Tcl_Cre
2a90: 61 74 65 43 68 61 6e 6e 65 6c 28 26 49 6e 63 72  ateChannel(&Incr
2aa0: 62 6c 6f 62 43 68 61 6e 6e 65 6c 54 79 70 65 2c  blobChannelType,
2ab0: 20 7a 43 68 61 6e 6e 65 6c 2c 20 70 2c 20 66 6c   zChannel, p, fl
2ac0: 61 67 73 29 3b 0a 20 20 54 63 6c 5f 52 65 67 69  ags);.  Tcl_Regi
2ad0: 73 74 65 72 43 68 61 6e 6e 65 6c 28 69 6e 74 65  sterChannel(inte
2ae0: 72 70 2c 20 70 2d 3e 63 68 61 6e 6e 65 6c 29 3b  rp, p->channel);
2af0: 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20  ..  /* Link the 
2b00: 6e 65 77 20 63 68 61 6e 6e 65 6c 20 69 6e 74 6f  new channel into
2b10: 20 74 68 65 20 53 71 6c 69 74 65 44 62 2e 70 49   the SqliteDb.pI
2b20: 6e 63 72 62 6c 6f 62 20 6c 69 73 74 2e 20 2a 2f  ncrblob list. */
2b30: 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 44  .  p->pNext = pD
2b40: 62 2d 3e 70 49 6e 63 72 62 6c 6f 62 3b 0a 20 20  b->pIncrblob;.  
2b50: 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20  p->pPrev = 0;.  
2b60: 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a  if( p->pNext ){.
2b70: 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50      p->pNext->pP
2b80: 72 65 76 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 70  rev = p;.  }.  p
2b90: 44 62 2d 3e 70 49 6e 63 72 62 6c 6f 62 20 3d 20  Db->pIncrblob = 
2ba0: 70 3b 0a 20 20 70 2d 3e 70 44 62 20 3d 20 70 44  p;.  p->pDb = pD
2bb0: 62 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 52 65 73  b;..  Tcl_SetRes
2bc0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
2bd0: 72 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e  r *)Tcl_GetChann
2be0: 65 6c 4e 61 6d 65 28 70 2d 3e 63 68 61 6e 6e 65  elName(p->channe
2bf0: 6c 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45  l), TCL_VOLATILE
2c00: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
2c10: 4f 4b 3b 0a 7d 0a 23 65 6c 73 65 20 20 2f 2a 20  OK;.}.#else  /* 
2c20: 65 6c 73 65 20 63 6c 61 75 73 65 20 66 6f 72 20  else clause for 
2c30: 22 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  "#ifndef SQLITE_
2c40: 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 22 20 2a  OMIT_INCRBLOB" *
2c50: 2f 0a 20 20 23 64 65 66 69 6e 65 20 63 6c 6f 73  /.  #define clos
2c60: 65 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c  eIncrblobChannel
2c70: 73 28 70 44 62 29 0a 23 65 6e 64 69 66 0a 0a 2f  s(pDb).#endif../
2c80: 2a 0a 2a 2a 20 4c 6f 6f 6b 20 61 74 20 74 68 65  *.** Look at the
2c90: 20 73 63 72 69 70 74 20 70 72 65 66 69 78 20 69   script prefix i
2ca0: 6e 20 70 43 6d 64 2e 20 20 57 65 20 77 69 6c 6c  n pCmd.  We will
2cb0: 20 62 65 20 65 78 65 63 75 74 69 6e 67 20 74 68   be executing th
2cc0: 69 73 20 73 63 72 69 70 74 0a 2a 2a 20 61 66 74  is script.** aft
2cd0: 65 72 20 66 69 72 73 74 20 61 70 70 65 6e 64 69  er first appendi
2ce0: 6e 67 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 61  ng one or more a
2cf0: 72 67 75 6d 65 6e 74 73 2e 20 20 54 68 69 73 20  rguments.  This 
2d00: 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73  routine analyzes
2d10: 0a 2a 2a 20 74 68 65 20 73 63 72 69 70 74 20 74  .** the script t
2d20: 6f 20 73 65 65 20 69 66 20 69 74 20 69 73 20 73  o see if it is s
2d30: 61 66 65 20 74 6f 20 75 73 65 20 54 63 6c 5f 45  afe to use Tcl_E
2d40: 76 61 6c 4f 62 6a 76 28 29 20 6f 6e 20 74 68 65  valObjv() on the
2d50: 20 73 63 72 69 70 74 0a 2a 2a 20 72 61 74 68 65   script.** rathe
2d60: 72 20 74 68 61 6e 20 74 68 65 20 6d 6f 72 65 20  r than the more 
2d70: 67 65 6e 65 72 61 6c 20 54 63 6c 5f 45 76 61 6c  general Tcl_Eval
2d80: 45 78 28 29 2e 20 20 54 63 6c 5f 45 76 61 6c 4f  Ex().  Tcl_EvalO
2d90: 62 6a 76 28 29 20 69 73 20 6d 75 63 68 0a 2a 2a  bjv() is much.**
2da0: 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 53   faster..**.** S
2db0: 63 72 69 70 74 73 20 74 68 61 74 20 61 72 65 20  cripts that are 
2dc0: 73 61 66 65 20 74 6f 20 75 73 65 20 77 69 74 68  safe to use with
2dd0: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20   Tcl_EvalObjv() 
2de0: 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a  consists of a.**
2df0: 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 66 6f   command name fo
2e00: 6c 6c 6f 77 65 64 20 62 79 20 7a 65 72 6f 20 6f  llowed by zero o
2e10: 72 20 6d 6f 72 65 20 61 72 67 75 6d 65 6e 74 73  r more arguments
2e20: 20 77 69 74 68 20 6e 6f 20 5b 2e 2e 2e 5d 20 6f   with no [...] o
2e30: 72 20 24 0a 2a 2a 20 6f 72 20 7b 2e 2e 2e 7d 20  r $.** or {...} 
2e40: 6f 72 20 3b 20 74 6f 20 62 65 20 73 65 65 6e 20  or ; to be seen 
2e50: 61 6e 79 77 68 65 72 65 2e 20 20 4d 6f 73 74 20  anywhere.  Most 
2e60: 63 61 6c 6c 62 61 63 6b 20 73 63 72 69 70 74 73  callback scripts
2e70: 20 63 6f 6e 73 69 73 74 0a 2a 2a 20 6f 66 20 6a   consist.** of j
2e80: 75 73 74 20 61 20 73 69 6e 67 6c 65 20 70 72 6f  ust a single pro
2e90: 63 65 64 75 72 65 20 6e 61 6d 65 20 61 6e 64 20  cedure name and 
2ea0: 74 68 65 79 20 6d 65 65 74 20 74 68 69 73 20 72  they meet this r
2eb0: 65 71 75 69 72 65 6d 65 6e 74 2e 0a 2a 2f 0a 73  equirement..*/.s
2ec0: 74 61 74 69 63 20 69 6e 74 20 73 61 66 65 54 6f  tatic int safeTo
2ed0: 55 73 65 45 76 61 6c 4f 62 6a 76 28 54 63 6c 5f  UseEvalObjv(Tcl_
2ee0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
2ef0: 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 29 7b 0a  Tcl_Obj *pCmd){.
2f00: 20 20 2f 2a 20 57 65 20 63 6f 75 6c 64 20 74 72    /* We could tr
2f10: 79 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e  y to do somethin
2f20: 67 20 77 69 74 68 20 54 63 6c 5f 50 61 72 73 65  g with Tcl_Parse
2f30: 28 29 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c  ().  But we will
2f40: 20 69 6e 73 74 65 61 64 0a 20 20 2a 2a 20 6a 75   instead.  ** ju
2f50: 73 74 20 64 6f 20 61 20 73 65 61 72 63 68 20 66  st do a search f
2f60: 6f 72 20 66 6f 72 62 69 64 64 65 6e 20 63 68 61  or forbidden cha
2f70: 72 61 63 74 65 72 73 2e 20 20 49 66 20 61 6e 79  racters.  If any
2f80: 20 6f 66 20 74 68 65 20 66 6f 72 62 69 64 64 65   of the forbidde
2f90: 6e 0a 20 20 2a 2a 20 63 68 61 72 61 63 74 65 72  n.  ** character
2fa0: 73 20 61 70 70 65 61 72 20 69 6e 20 70 43 6d 64  s appear in pCmd
2fb0: 2c 20 77 65 20 77 69 6c 6c 20 72 65 70 6f 72 74  , we will report
2fc0: 20 74 68 65 20 73 74 72 69 6e 67 20 61 73 20 75   the string as u
2fd0: 6e 73 61 66 65 2e 0a 20 20 2a 2f 0a 20 20 63 6f  nsafe..  */.  co
2fe0: 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  nst char *z;.  i
2ff0: 6e 74 20 6e 3b 0a 20 20 7a 20 3d 20 54 63 6c 5f  nt n;.  z = Tcl_
3000: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
3010: 28 70 43 6d 64 2c 20 26 6e 29 3b 0a 20 20 77 68  (pCmd, &n);.  wh
3020: 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a  ile( n-- > 0 ){.
3030: 20 20 20 20 69 6e 74 20 63 20 3d 20 2a 28 7a 2b      int c = *(z+
3040: 2b 29 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27  +);.    if( c=='
3050: 24 27 20 7c 7c 20 63 3d 3d 27 5b 27 20 7c 7c 20  $' || c=='[' || 
3060: 63 3d 3d 27 3b 27 20 29 20 72 65 74 75 72 6e 20  c==';' ) return 
3070: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
3080: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  1;.}../*.** Find
3090: 20 61 6e 20 53 71 6c 46 75 6e 63 20 73 74 72 75   an SqlFunc stru
30a0: 63 74 75 72 65 20 77 69 74 68 20 74 68 65 20 67  cture with the g
30b0: 69 76 65 6e 20 6e 61 6d 65 2e 20 20 4f 72 20 63  iven name.  Or c
30c0: 72 65 61 74 65 20 61 20 6e 65 77 0a 2a 2a 20 6f  reate a new.** o
30d0: 6e 65 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e  ne if an existin
30e0: 67 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 62 65 20  g one cannot be 
30f0: 66 6f 75 6e 64 2e 20 20 52 65 74 75 72 6e 20 61  found.  Return a
3100: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a   pointer to the.
3110: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  ** structure..*/
3120: 0a 73 74 61 74 69 63 20 53 71 6c 46 75 6e 63 20  .static SqlFunc 
3130: 2a 66 69 6e 64 53 71 6c 46 75 6e 63 28 53 71 6c  *findSqlFunc(Sql
3140: 69 74 65 44 62 20 2a 70 44 62 2c 20 63 6f 6e 73  iteDb *pDb, cons
3150: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
3160: 20 20 53 71 6c 46 75 6e 63 20 2a 70 2c 20 2a 70    SqlFunc *p, *p
3170: 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  New;.  int i;.  
3180: 70 4e 65 77 20 3d 20 28 53 71 6c 46 75 6e 63 2a  pNew = (SqlFunc*
3190: 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65  )Tcl_Alloc( size
31a0: 6f 66 28 2a 70 4e 65 77 29 20 2b 20 73 74 72 6c  of(*pNew) + strl
31b0: 65 6e 33 30 28 7a 4e 61 6d 65 29 20 2b 20 31 20  en30(zName) + 1 
31c0: 29 3b 0a 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65  );.  pNew->zName
31d0: 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b   = (char*)&pNew[
31e0: 31 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a  1];.  for(i=0; z
31f0: 4e 61 6d 65 5b 69 5d 3b 20 69 2b 2b 29 7b 20 70  Name[i]; i++){ p
3200: 4e 65 77 2d 3e 7a 4e 61 6d 65 5b 69 5d 20 3d 20  New->zName[i] = 
3210: 74 6f 6c 6f 77 65 72 28 7a 4e 61 6d 65 5b 69 5d  tolower(zName[i]
3220: 29 3b 20 7d 0a 20 20 70 4e 65 77 2d 3e 7a 4e 61  ); }.  pNew->zNa
3230: 6d 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 66 6f 72  me[i] = 0;.  for
3240: 28 70 3d 70 44 62 2d 3e 70 46 75 6e 63 3b 20 70  (p=pDb->pFunc; p
3250: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 20 0a  ; p=p->pNext){ .
3260: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 70      if( strcmp(p
3270: 2d 3e 7a 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a  ->zName, pNew->z
3280: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
3290: 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72    Tcl_Free((char
32a0: 2a 29 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 72  *)pNew);.      r
32b0: 65 74 75 72 6e 20 70 3b 0a 20 20 20 20 7d 0a 20  eturn p;.    }. 
32c0: 20 7d 0a 20 20 70 4e 65 77 2d 3e 69 6e 74 65 72   }.  pNew->inter
32d0: 70 20 3d 20 70 44 62 2d 3e 69 6e 74 65 72 70 3b  p = pDb->interp;
32e0: 0a 20 20 70 4e 65 77 2d 3e 70 53 63 72 69 70 74  .  pNew->pScript
32f0: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e   = 0;.  pNew->pN
3300: 65 78 74 20 3d 20 70 44 62 2d 3e 70 46 75 6e 63  ext = pDb->pFunc
3310: 3b 0a 20 20 70 44 62 2d 3e 70 46 75 6e 63 20 3d  ;.  pDb->pFunc =
3320: 20 70 4e 65 77 3b 0a 20 20 72 65 74 75 72 6e 20   pNew;.  return 
3330: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  pNew;.}../*.** F
3340: 69 6e 61 6c 69 7a 65 20 61 6e 64 20 66 72 65 65  inalize and free
3350: 20 61 20 6c 69 73 74 20 6f 66 20 70 72 65 70 61   a list of prepa
3360: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a  red statements.*
3370: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 6c  /.static void fl
3380: 75 73 68 53 74 6d 74 43 61 63 68 65 28 20 53 71  ushStmtCache( Sq
3390: 6c 69 74 65 44 62 20 2a 70 44 62 20 29 7b 0a 20  liteDb *pDb ){. 
33a0: 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74   SqlPreparedStmt
33b0: 20 2a 70 50 72 65 53 74 6d 74 3b 0a 0a 20 20 77   *pPreStmt;..  w
33c0: 68 69 6c 65 28 20 20 70 44 62 2d 3e 73 74 6d 74  hile(  pDb->stmt
33d0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  List ){.    sqli
33e0: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 20 70 44  te3_finalize( pD
33f0: 62 2d 3e 73 74 6d 74 4c 69 73 74 2d 3e 70 53 74  b->stmtList->pSt
3400: 6d 74 20 29 3b 0a 20 20 20 20 70 50 72 65 53 74  mt );.    pPreSt
3410: 6d 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69  mt = pDb->stmtLi
3420: 73 74 3b 0a 20 20 20 20 70 44 62 2d 3e 73 74 6d  st;.    pDb->stm
3430: 74 4c 69 73 74 20 3d 20 70 44 62 2d 3e 73 74 6d  tList = pDb->stm
3440: 74 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  tList->pNext;.  
3450: 20 20 54 63 6c 5f 46 72 65 65 28 20 28 63 68 61    Tcl_Free( (cha
3460: 72 2a 29 70 50 72 65 53 74 6d 74 20 29 3b 0a 20  r*)pPreStmt );. 
3470: 20 7d 0a 20 20 70 44 62 2d 3e 6e 53 74 6d 74 20   }.  pDb->nStmt 
3480: 3d 20 30 3b 0a 20 20 70 44 62 2d 3e 73 74 6d 74  = 0;.  pDb->stmt
3490: 4c 61 73 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  Last = 0;.}../*.
34a0: 2a 2a 20 54 43 4c 20 63 61 6c 6c 73 20 74 68 69  ** TCL calls thi
34b0: 73 20 70 72 6f 63 65 64 75 72 65 20 77 68 65 6e  s procedure when
34c0: 20 61 6e 20 73 71 6c 69 74 65 33 20 64 61 74 61   an sqlite3 data
34d0: 62 61 73 65 20 63 6f 6d 6d 61 6e 64 20 69 73 0a  base command is.
34e0: 2a 2a 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73  ** deleted..*/.s
34f0: 74 61 74 69 63 20 76 6f 69 64 20 44 62 44 65 6c  tatic void DbDel
3500: 65 74 65 43 6d 64 28 76 6f 69 64 20 2a 64 62 29  eteCmd(void *db)
3510: 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  {.  SqliteDb *pD
3520: 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 64  b = (SqliteDb*)d
3530: 62 3b 0a 20 20 66 6c 75 73 68 53 74 6d 74 43 61  b;.  flushStmtCa
3540: 63 68 65 28 70 44 62 29 3b 0a 20 20 63 6c 6f 73  che(pDb);.  clos
3550: 65 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c  eIncrblobChannel
3560: 73 28 70 44 62 29 3b 0a 20 20 73 71 6c 69 74 65  s(pDb);.  sqlite
3570: 33 5f 63 6c 6f 73 65 28 70 44 62 2d 3e 64 62 29  3_close(pDb->db)
3580: 3b 0a 20 20 77 68 69 6c 65 28 20 70 44 62 2d 3e  ;.  while( pDb->
3590: 70 46 75 6e 63 20 29 7b 0a 20 20 20 20 53 71 6c  pFunc ){.    Sql
35a0: 46 75 6e 63 20 2a 70 46 75 6e 63 20 3d 20 70 44  Func *pFunc = pD
35b0: 62 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 70 44  b->pFunc;.    pD
35c0: 62 2d 3e 70 46 75 6e 63 20 3d 20 70 46 75 6e 63  b->pFunc = pFunc
35d0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 54 63 6c  ->pNext;.    Tcl
35e0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 46  _DecrRefCount(pF
35f0: 75 6e 63 2d 3e 70 53 63 72 69 70 74 29 3b 0a 20  unc->pScript);. 
3600: 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61     Tcl_Free((cha
3610: 72 2a 29 70 46 75 6e 63 29 3b 0a 20 20 7d 0a 20  r*)pFunc);.  }. 
3620: 20 77 68 69 6c 65 28 20 70 44 62 2d 3e 70 43 6f   while( pDb->pCo
3630: 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 53 71 6c  llate ){.    Sql
3640: 43 6f 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c 61 74  Collate *pCollat
3650: 65 20 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74  e = pDb->pCollat
3660: 65 3b 0a 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c  e;.    pDb->pCol
3670: 6c 61 74 65 20 3d 20 70 43 6f 6c 6c 61 74 65 2d  late = pCollate-
3680: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 54 63 6c 5f  >pNext;.    Tcl_
3690: 46 72 65 65 28 28 63 68 61 72 2a 29 70 43 6f 6c  Free((char*)pCol
36a0: 6c 61 74 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  late);.  }.  if(
36b0: 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20   pDb->zBusy ){. 
36c0: 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d     Tcl_Free(pDb-
36d0: 3e 7a 42 75 73 79 29 3b 0a 20 20 7d 0a 20 20 69  >zBusy);.  }.  i
36e0: 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29  f( pDb->zTrace )
36f0: 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70  {.    Tcl_Free(p
3700: 44 62 2d 3e 7a 54 72 61 63 65 29 3b 0a 20 20 7d  Db->zTrace);.  }
3710: 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f  .  if( pDb->zPro
3720: 66 69 6c 65 20 29 7b 0a 20 20 20 20 54 63 6c 5f  file ){.    Tcl_
3730: 46 72 65 65 28 70 44 62 2d 3e 7a 50 72 6f 66 69  Free(pDb->zProfi
3740: 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  le);.  }.  if( p
3750: 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20  Db->zAuth ){.   
3760: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
3770: 41 75 74 68 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Auth);.  }.  if(
3780: 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 29 7b 0a 20   pDb->zNull ){. 
3790: 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d     Tcl_Free(pDb-
37a0: 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69  >zNull);.  }.  i
37b0: 66 28 20 70 44 62 2d 3e 70 55 70 64 61 74 65 48  f( pDb->pUpdateH
37c0: 6f 6f 6b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44  ook ){.    Tcl_D
37d0: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d  ecrRefCount(pDb-
37e0: 3e 70 55 70 64 61 74 65 48 6f 6f 6b 29 3b 0a 20  >pUpdateHook);. 
37f0: 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 52   }.  if( pDb->pR
3800: 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 20 29 7b 0a 20  ollbackHook ){. 
3810: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
3820: 75 6e 74 28 70 44 62 2d 3e 70 52 6f 6c 6c 62 61  unt(pDb->pRollba
3830: 63 6b 48 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20 69  ckHook);.  }.  i
3840: 66 28 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65  f( pDb->pCollate
3850: 4e 65 65 64 65 64 20 29 7b 0a 20 20 20 20 54 63  Needed ){.    Tc
3860: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
3870: 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64  Db->pCollateNeed
3880: 65 64 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 46  ed);.  }.  Tcl_F
3890: 72 65 65 28 28 63 68 61 72 2a 29 70 44 62 29 3b  ree((char*)pDb);
38a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
38b0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
38c0: 20 77 68 65 6e 20 61 20 64 61 74 61 62 61 73 65   when a database
38d0: 20 66 69 6c 65 20 69 73 20 6c 6f 63 6b 65 64 20   file is locked 
38e0: 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20  while trying.** 
38f0: 74 6f 20 65 78 65 63 75 74 65 20 53 51 4c 2e 0a  to execute SQL..
3900: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62  */.static int Db
3910: 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64  BusyHandler(void
3920: 20 2a 63 64 2c 20 69 6e 74 20 6e 54 72 69 65 73   *cd, int nTries
3930: 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  ){.  SqliteDb *p
3940: 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29  Db = (SqliteDb*)
3950: 63 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  cd;.  int rc;.  
3960: 63 68 61 72 20 7a 56 61 6c 5b 33 30 5d 3b 0a 0a  char zVal[30];..
3970: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
3980: 74 66 28 73 69 7a 65 6f 66 28 7a 56 61 6c 29 2c  tf(sizeof(zVal),
3990: 20 7a 56 61 6c 2c 20 22 25 64 22 2c 20 6e 54 72   zVal, "%d", nTr
39a0: 69 65 73 29 3b 0a 20 20 72 63 20 3d 20 54 63 6c  ies);.  rc = Tcl
39b0: 5f 56 61 72 45 76 61 6c 28 70 44 62 2d 3e 69 6e  _VarEval(pDb->in
39c0: 74 65 72 70 2c 20 70 44 62 2d 3e 7a 42 75 73 79  terp, pDb->zBusy
39d0: 2c 20 22 20 22 2c 20 7a 56 61 6c 2c 20 28 63 68  , " ", zVal, (ch
39e0: 61 72 2a 29 30 29 3b 0a 20 20 69 66 28 20 72 63  ar*)0);.  if( rc
39f0: 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69  !=TCL_OK || atoi
3a00: 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65  (Tcl_GetStringRe
3a10: 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70  sult(pDb->interp
3a20: 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  )) ){.    return
3a30: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
3a40: 20 31 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53   1;.}..#ifndef S
3a50: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52  QLITE_OMIT_PROGR
3a60: 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f 2a 0a  ESS_CALLBACK./*.
3a70: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3a80: 69 73 20 69 6e 76 6f 6b 65 64 20 61 73 20 74 68  is invoked as th
3a90: 65 20 27 70 72 6f 67 72 65 73 73 20 63 61 6c 6c  e 'progress call
3aa0: 62 61 63 6b 27 20 66 6f 72 20 74 68 65 20 64 61  back' for the da
3ab0: 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  tabase..*/.stati
3ac0: 63 20 69 6e 74 20 44 62 50 72 6f 67 72 65 73 73  c int DbProgress
3ad0: 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64  Handler(void *cd
3ae0: 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  ){.  SqliteDb *p
3af0: 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29  Db = (SqliteDb*)
3b00: 63 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  cd;.  int rc;.. 
3b10: 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 7a 50   assert( pDb->zP
3b20: 72 6f 67 72 65 73 73 20 29 3b 0a 20 20 72 63 20  rogress );.  rc 
3b30: 3d 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e  = Tcl_Eval(pDb->
3b40: 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 50 72  interp, pDb->zPr
3b50: 6f 67 72 65 73 73 29 3b 0a 20 20 69 66 28 20 72  ogress);.  if( r
3b60: 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f  c!=TCL_OK || ato
3b70: 69 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52  i(Tcl_GetStringR
3b80: 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72  esult(pDb->inter
3b90: 70 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  p)) ){.    retur
3ba0: 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
3bb0: 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  n 0;.}.#endif..#
3bc0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3bd0: 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 54  IT_TRACE./*.** T
3be0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
3bf0: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 53 51 4c  alled by the SQL
3c00: 69 74 65 20 74 72 61 63 65 20 68 61 6e 64 6c 65  ite trace handle
3c10: 72 20 77 68 65 6e 65 76 65 72 20 61 20 6e 65 77  r whenever a new
3c20: 0a 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 53 51 4c  .** block of SQL
3c30: 20 69 73 20 65 78 65 63 75 74 65 64 2e 20 20 54   is executed.  T
3c40: 68 65 20 54 43 4c 20 73 63 72 69 70 74 20 69 6e  he TCL script in
3c50: 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 69 73 20   pDb->zTrace is 
3c60: 65 78 65 63 75 74 65 64 2e 0a 2a 2f 0a 73 74 61  executed..*/.sta
3c70: 74 69 63 20 76 6f 69 64 20 44 62 54 72 61 63 65  tic void DbTrace
3c80: 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64  Handler(void *cd
3c90: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53  , const char *zS
3ca0: 71 6c 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20  ql){.  SqliteDb 
3cb0: 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62  *pDb = (SqliteDb
3cc0: 2a 29 63 64 3b 0a 20 20 54 63 6c 5f 44 53 74 72  *)cd;.  Tcl_DStr
3cd0: 69 6e 67 20 73 74 72 3b 0a 0a 20 20 54 63 6c 5f  ing str;..  Tcl_
3ce0: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72  DStringInit(&str
3cf0: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
3d00: 41 70 70 65 6e 64 28 26 73 74 72 2c 20 70 44 62  Append(&str, pDb
3d10: 2d 3e 7a 54 72 61 63 65 2c 20 2d 31 29 3b 0a 20  ->zTrace, -1);. 
3d20: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
3d30: 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20  ndElement(&str, 
3d40: 7a 53 71 6c 29 3b 0a 20 20 54 63 6c 5f 45 76 61  zSql);.  Tcl_Eva
3d50: 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 54  l(pDb->interp, T
3d60: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28  cl_DStringValue(
3d70: 26 73 74 72 29 29 3b 0a 20 20 54 63 6c 5f 44 53  &str));.  Tcl_DS
3d80: 74 72 69 6e 67 46 72 65 65 28 26 73 74 72 29 3b  tringFree(&str);
3d90: 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75  .  Tcl_ResetResu
3da0: 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b  lt(pDb->interp);
3db0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
3dc0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
3dd0: 52 41 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  RACE./*.** This 
3de0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
3df0: 64 20 62 79 20 74 68 65 20 53 51 4c 69 74 65 20  d by the SQLite 
3e00: 70 72 6f 66 69 6c 65 20 68 61 6e 64 6c 65 72 20  profile handler 
3e10: 61 66 74 65 72 20 61 20 73 74 61 74 65 6d 65 6e  after a statemen
3e20: 74 0a 2a 2a 20 53 51 4c 20 68 61 73 20 65 78 65  t.** SQL has exe
3e30: 63 75 74 65 64 2e 20 20 54 68 65 20 54 43 4c 20  cuted.  The TCL 
3e40: 73 63 72 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a  script in pDb->z
3e50: 50 72 6f 66 69 6c 65 20 69 73 20 65 76 61 6c 75  Profile is evalu
3e60: 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ated..*/.static 
3e70: 76 6f 69 64 20 44 62 50 72 6f 66 69 6c 65 48 61  void DbProfileHa
3e80: 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 2c 20  ndler(void *cd, 
3e90: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
3ea0: 2c 20 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 20  , sqlite_uint64 
3eb0: 74 6d 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20  tm){.  SqliteDb 
3ec0: 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62  *pDb = (SqliteDb
3ed0: 2a 29 63 64 3b 0a 20 20 54 63 6c 5f 44 53 74 72  *)cd;.  Tcl_DStr
3ee0: 69 6e 67 20 73 74 72 3b 0a 20 20 63 68 61 72 20  ing str;.  char 
3ef0: 7a 54 6d 5b 31 30 30 5d 3b 0a 0a 20 20 73 71 6c  zTm[100];..  sql
3f00: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
3f10: 7a 65 6f 66 28 7a 54 6d 29 2d 31 2c 20 7a 54 6d  zeof(zTm)-1, zTm
3f20: 2c 20 22 25 6c 6c 64 22 2c 20 74 6d 29 3b 0a 20  , "%lld", tm);. 
3f30: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
3f40: 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f 44 53  (&str);.  Tcl_DS
3f50: 74 72 69 6e 67 41 70 70 65 6e 64 28 26 73 74 72  tringAppend(&str
3f60: 2c 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c  , pDb->zProfile,
3f70: 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72   -1);.  Tcl_DStr
3f80: 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ingAppendElement
3f90: 28 26 73 74 72 2c 20 7a 53 71 6c 29 3b 0a 20 20  (&str, zSql);.  
3fa0: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
3fb0: 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a  dElement(&str, z
3fc0: 54 6d 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 28  Tm);.  Tcl_Eval(
3fd0: 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c  pDb->interp, Tcl
3fe0: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73  _DStringValue(&s
3ff0: 74 72 29 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  tr));.  Tcl_DStr
4000: 69 6e 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20  ingFree(&str);. 
4010: 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74   Tcl_ResetResult
4020: 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 7d  (pDb->interp);.}
4030: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
4040: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
4050: 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 74 72 61  alled when a tra
4060: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
4070: 69 74 74 65 64 2e 20 20 54 68 65 0a 2a 2a 20 54  itted.  The.** T
4080: 43 4c 20 73 63 72 69 70 74 20 69 6e 20 70 44 62  CL script in pDb
4090: 2d 3e 7a 43 6f 6d 6d 69 74 20 69 73 20 65 78 65  ->zCommit is exe
40a0: 63 75 74 65 64 2e 20 20 49 66 20 69 74 20 72 65  cuted.  If it re
40b0: 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f  turns non-zero o
40c0: 72 0a 2a 2a 20 69 66 20 69 74 20 74 68 72 6f 77  r.** if it throw
40d0: 73 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 2c 20  s an exception, 
40e0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
40f0: 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69  is rolled back i
4100: 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20 62 65 69  nstead.** of bei
4110: 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f  ng committed..*/
4120: 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 43 6f  .static int DbCo
4130: 6d 6d 69 74 48 61 6e 64 6c 65 72 28 76 6f 69 64  mmitHandler(void
4140: 20 2a 63 64 29 7b 0a 20 20 53 71 6c 69 74 65 44   *cd){.  SqliteD
4150: 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65  b *pDb = (Sqlite
4160: 44 62 2a 29 63 64 3b 0a 20 20 69 6e 74 20 72 63  Db*)cd;.  int rc
4170: 3b 0a 0a 20 20 72 63 20 3d 20 54 63 6c 5f 45 76  ;..  rc = Tcl_Ev
4180: 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  al(pDb->interp, 
4190: 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 29 3b 0a 20  pDb->zCommit);. 
41a0: 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20   if( rc!=TCL_OK 
41b0: 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65 74 53  || atoi(Tcl_GetS
41c0: 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62 2d  tringResult(pDb-
41d0: 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a 20 20 20  >interp)) ){.   
41e0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
41f0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74   return 0;.}..st
4200: 61 74 69 63 20 76 6f 69 64 20 44 62 52 6f 6c 6c  atic void DbRoll
4210: 62 61 63 6b 48 61 6e 64 6c 65 72 28 76 6f 69 64  backHandler(void
4220: 20 2a 63 6c 69 65 6e 74 44 61 74 61 29 7b 0a 20   *clientData){. 
4230: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
4240: 20 28 53 71 6c 69 74 65 44 62 2a 29 63 6c 69 65   (SqliteDb*)clie
4250: 6e 74 44 61 74 61 3b 0a 20 20 61 73 73 65 72 74  ntData;.  assert
4260: 28 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48  (pDb->pRollbackH
4270: 6f 6f 6b 29 3b 0a 20 20 69 66 28 20 54 43 4c 5f  ook);.  if( TCL_
4280: 4f 4b 21 3d 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  OK!=Tcl_EvalObjE
4290: 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70  x(pDb->interp, p
42a0: 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f  Db->pRollbackHoo
42b0: 6b 2c 20 30 29 20 29 7b 0a 20 20 20 20 54 63 6c  k, 0) ){.    Tcl
42c0: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72  _BackgroundError
42d0: 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 20  (pDb->interp);. 
42e0: 20 7d 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c   }.}..#ifdef SQL
42f0: 49 54 45 5f 54 45 53 54 0a 73 74 61 74 69 63 20  ITE_TEST.static 
4300: 76 6f 69 64 20 73 65 74 54 65 73 74 55 6e 6c 6f  void setTestUnlo
4310: 63 6b 4e 6f 74 69 66 79 56 61 72 73 28 54 63 6c  ckNotifyVars(Tcl
4320: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
4330: 20 69 6e 74 20 69 41 72 67 2c 20 69 6e 74 20 6e   int iArg, int n
4340: 41 72 67 29 7b 0a 20 20 63 68 61 72 20 7a 42 75  Arg){.  char zBu
4350: 66 5b 36 34 5d 3b 0a 20 20 73 70 72 69 6e 74 66  f[64];.  sprintf
4360: 28 7a 42 75 66 2c 20 22 25 64 22 2c 20 69 41 72  (zBuf, "%d", iAr
4370: 67 29 3b 0a 20 20 54 63 6c 5f 53 65 74 56 61 72  g);.  Tcl_SetVar
4380: 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
4390: 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 5f 61  _unlock_notify_a
43a0: 72 67 22 2c 20 7a 42 75 66 2c 20 54 43 4c 5f 47  rg", zBuf, TCL_G
43b0: 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 73  LOBAL_ONLY);.  s
43c0: 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64  printf(zBuf, "%d
43d0: 22 2c 20 6e 41 72 67 29 3b 0a 20 20 54 63 6c 5f  ", nArg);.  Tcl_
43e0: 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 20 22  SetVar(interp, "
43f0: 73 71 6c 69 74 65 5f 75 6e 6c 6f 63 6b 5f 6e 6f  sqlite_unlock_no
4400: 74 69 66 79 5f 61 72 67 63 6f 75 6e 74 22 2c 20  tify_argcount", 
4410: 7a 42 75 66 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c  zBuf, TCL_GLOBAL
4420: 5f 4f 4e 4c 59 29 3b 0a 7d 0a 23 65 6c 73 65 0a  _ONLY);.}.#else.
4430: 20 20 23 64 65 66 69 6e 65 20 73 65 74 54 65 73    #define setTes
4440: 74 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 56 61 72  tUnlockNotifyVar
4450: 73 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a  s(x,y,z).#endif.
4460: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
4470: 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54  NABLE_UNLOCK_NOT
4480: 49 46 59 0a 73 74 61 74 69 63 20 76 6f 69 64 20  IFY.static void 
4490: 44 62 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 28 76  DbUnlockNotify(v
44a0: 6f 69 64 20 2a 2a 61 70 41 72 67 2c 20 69 6e 74  oid **apArg, int
44b0: 20 6e 41 72 67 29 7b 0a 20 20 69 6e 74 20 69 3b   nArg){.  int i;
44c0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41  .  for(i=0; i<nA
44d0: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f  rg; i++){.    co
44e0: 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  nst int flags = 
44f0: 28 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c  (TCL_EVAL_GLOBAL
4500: 7c 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54  |TCL_EVAL_DIRECT
4510: 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 44 62 20  );.    SqliteDb 
4520: 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62  *pDb = (SqliteDb
4530: 20 2a 29 61 70 41 72 67 5b 69 5d 3b 0a 20 20 20   *)apArg[i];.   
4540: 20 73 65 74 54 65 73 74 55 6e 6c 6f 63 6b 4e 6f   setTestUnlockNo
4550: 74 69 66 79 56 61 72 73 28 70 44 62 2d 3e 69 6e  tifyVars(pDb->in
4560: 74 65 72 70 2c 20 69 2c 20 6e 41 72 67 29 3b 0a  terp, i, nArg);.
4570: 20 20 20 20 61 73 73 65 72 74 28 20 70 44 62 2d      assert( pDb-
4580: 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 29 3b  >pUnlockNotify);
4590: 0a 20 20 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  .    Tcl_EvalObj
45a0: 45 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  Ex(pDb->interp, 
45b0: 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69  pDb->pUnlockNoti
45c0: 66 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  fy, flags);.    
45d0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
45e0: 28 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74  (pDb->pUnlockNot
45f0: 69 66 79 29 3b 0a 20 20 20 20 70 44 62 2d 3e 70  ify);.    pDb->p
4600: 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 20 3d 20 30  UnlockNotify = 0
4610: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
4620: 73 74 61 74 69 63 20 76 6f 69 64 20 44 62 55 70  static void DbUp
4630: 64 61 74 65 48 61 6e 64 6c 65 72 28 0a 20 20 76  dateHandler(.  v
4640: 6f 69 64 20 2a 70 2c 20 0a 20 20 69 6e 74 20 6f  oid *p, .  int o
4650: 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  p,.  const char 
4660: 2a 7a 44 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63  *zDb, .  const c
4670: 68 61 72 20 2a 7a 54 62 6c 2c 20 0a 20 20 73 71  har *zTbl, .  sq
4680: 6c 69 74 65 5f 69 6e 74 36 34 20 72 6f 77 69 64  lite_int64 rowid
4690: 0a 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  .){.  SqliteDb *
46a0: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 20  pDb = (SqliteDb 
46b0: 2a 29 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  *)p;.  Tcl_Obj *
46c0: 70 43 6d 64 3b 0a 0a 20 20 61 73 73 65 72 74 28  pCmd;..  assert(
46d0: 20 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f   pDb->pUpdateHoo
46e0: 6b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  k );.  assert( o
46f0: 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  p==SQLITE_INSERT
4700: 20 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 55   || op==SQLITE_U
4710: 50 44 41 54 45 20 7c 7c 20 6f 70 3d 3d 53 51 4c  PDATE || op==SQL
4720: 49 54 45 5f 44 45 4c 45 54 45 20 29 3b 0a 0a 20  ITE_DELETE );.. 
4730: 20 70 43 6d 64 20 3d 20 54 63 6c 5f 44 75 70 6c   pCmd = Tcl_Dupl
4740: 69 63 61 74 65 4f 62 6a 28 70 44 62 2d 3e 70 55  icateObj(pDb->pU
4750: 70 64 61 74 65 48 6f 6f 6b 29 3b 0a 20 20 54 63  pdateHook);.  Tc
4760: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
4770: 43 6d 64 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  Cmd);.  Tcl_List
4780: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
4790: 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65  (0, pCmd, Tcl_Ne
47a0: 77 53 74 72 69 6e 67 4f 62 6a 28 0a 20 20 20 20  wStringObj(.    
47b0: 28 20 28 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e  ( (op==SQLITE_IN
47c0: 53 45 52 54 29 3f 22 49 4e 53 45 52 54 22 3a 28  SERT)?"INSERT":(
47d0: 6f 70 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41 54  op==SQLITE_UPDAT
47e0: 45 29 3f 22 55 50 44 41 54 45 22 3a 22 44 45 4c  E)?"UPDATE":"DEL
47f0: 45 54 45 22 29 2c 20 2d 31 29 29 3b 0a 20 20 54  ETE"), -1));.  T
4800: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
4810: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c  Element(0, pCmd,
4820: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
4830: 6a 28 7a 44 62 2c 20 2d 31 29 29 3b 0a 20 20 54  j(zDb, -1));.  T
4840: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
4850: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c  Element(0, pCmd,
4860: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
4870: 6a 28 7a 54 62 6c 2c 20 2d 31 29 29 3b 0a 20 20  j(zTbl, -1));.  
4880: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
4890: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64  dElement(0, pCmd
48a0: 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74  , Tcl_NewWideInt
48b0: 4f 62 6a 28 72 6f 77 69 64 29 29 3b 0a 20 20 54  Obj(rowid));.  T
48c0: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62  cl_EvalObjEx(pDb
48d0: 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20  ->interp, pCmd, 
48e0: 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29  TCL_EVAL_DIRECT)
48f0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
4900: 20 74 63 6c 43 6f 6c 6c 61 74 65 4e 65 65 64 65   tclCollateNeede
4910: 64 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c  d(.  void *pCtx,
4920: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
4930: 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 63 6f 6e    int enc,.  con
4940: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29  st char *zName.)
4950: 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  {.  SqliteDb *pD
4960: 62 20 3d 20 28 53 71 6c 69 74 65 44 62 20 2a 29  b = (SqliteDb *)
4970: 70 43 74 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  pCtx;.  Tcl_Obj 
4980: 2a 70 53 63 72 69 70 74 20 3d 20 54 63 6c 5f 44  *pScript = Tcl_D
4990: 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 44 62 2d  uplicateObj(pDb-
49a0: 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29  >pCollateNeeded)
49b0: 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43  ;.  Tcl_IncrRefC
49c0: 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 20  ount(pScript);. 
49d0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
49e0: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 53 63  ndElement(0, pSc
49f0: 72 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72  ript, Tcl_NewStr
4a00: 69 6e 67 4f 62 6a 28 7a 4e 61 6d 65 2c 20 2d 31  ingObj(zName, -1
4a10: 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62  ));.  Tcl_EvalOb
4a20: 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  jEx(pDb->interp,
4a30: 20 70 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20   pScript, 0);.  
4a40: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
4a50: 28 70 53 63 72 69 70 74 29 3b 0a 7d 0a 0a 2f 2a  (pScript);.}../*
4a60: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
4a70: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 76   is called to ev
4a80: 61 6c 75 61 74 65 20 61 6e 20 53 51 4c 20 63 6f  aluate an SQL co
4a90: 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  llation function
4aa0: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20   implemented.** 
4ab0: 75 73 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74  using TCL script
4ac0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4ad0: 74 63 6c 53 71 6c 43 6f 6c 6c 61 74 65 28 0a 20  tclSqlCollate(. 
4ae0: 20 76 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20 69   void *pCtx,.  i
4af0: 6e 74 20 6e 41 2c 0a 20 20 63 6f 6e 73 74 20 76  nt nA,.  const v
4b00: 6f 69 64 20 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e  oid *zA,.  int n
4b10: 42 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  B,.  const void 
4b20: 2a 7a 42 0a 29 7b 0a 20 20 53 71 6c 43 6f 6c 6c  *zB.){.  SqlColl
4b30: 61 74 65 20 2a 70 20 3d 20 28 53 71 6c 43 6f 6c  ate *p = (SqlCol
4b40: 6c 61 74 65 20 2a 29 70 43 74 78 3b 0a 20 20 54  late *)pCtx;.  T
4b50: 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 0a 20  cl_Obj *pCmd;.. 
4b60: 20 70 43 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 53   pCmd = Tcl_NewS
4b70: 74 72 69 6e 67 4f 62 6a 28 70 2d 3e 7a 53 63 72  tringObj(p->zScr
4b80: 69 70 74 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f  ipt, -1);.  Tcl_
4b90: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d  IncrRefCount(pCm
4ba0: 64 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  d);.  Tcl_ListOb
4bb0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70  jAppendElement(p
4bc0: 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20  ->interp, pCmd, 
4bd0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
4be0: 28 7a 41 2c 20 6e 41 29 29 3b 0a 20 20 54 63 6c  (zA, nA));.  Tcl
4bf0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
4c00: 65 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c  ement(p->interp,
4c10: 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74   pCmd, Tcl_NewSt
4c20: 72 69 6e 67 4f 62 6a 28 7a 42 2c 20 6e 42 29 29  ringObj(zB, nB))
4c30: 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  ;.  Tcl_EvalObjE
4c40: 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d  x(p->interp, pCm
4c50: 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45  d, TCL_EVAL_DIRE
4c60: 43 54 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52  CT);.  Tcl_DecrR
4c70: 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20  efCount(pCmd);. 
4c80: 20 72 65 74 75 72 6e 20 28 61 74 6f 69 28 54 63   return (atoi(Tc
4c90: 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
4ca0: 74 28 70 2d 3e 69 6e 74 65 72 70 29 29 29 3b 0a  t(p->interp)));.
4cb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
4cc0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
4cd0: 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20 53  to evaluate an S
4ce0: 51 4c 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c  QL function impl
4cf0: 65 6d 65 6e 74 65 64 0a 2a 2a 20 75 73 69 6e 67  emented.** using
4d00: 20 54 43 4c 20 73 63 72 69 70 74 2e 0a 2a 2f 0a   TCL script..*/.
4d10: 73 74 61 74 69 63 20 76 6f 69 64 20 74 63 6c 53  static void tclS
4d20: 71 6c 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63  qlFunc(sqlite3_c
4d30: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
4d40: 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
4d50: 65 33 5f 76 61 6c 75 65 2a 2a 61 72 67 76 29 7b  e3_value**argv){
4d60: 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70 20 3d 20  .  SqlFunc *p = 
4d70: 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
4d80: 61 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 54 63  a(context);.  Tc
4d90: 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 20 20 69  l_Obj *pCmd;.  i
4da0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  nt i;.  int rc;.
4db0: 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 30 20 29  .  if( argc==0 )
4dc0: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
4dd0: 65 20 61 72 65 20 6e 6f 20 61 72 67 75 6d 65 6e  e are no argumen
4de0: 74 73 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69  ts to the functi
4df0: 6f 6e 2c 20 63 61 6c 6c 20 54 63 6c 5f 45 76 61  on, call Tcl_Eva
4e00: 6c 4f 62 6a 45 78 20 6f 6e 20 74 68 65 0a 20 20  lObjEx on the.  
4e10: 20 20 2a 2a 20 73 63 72 69 70 74 20 6f 62 6a 65    ** script obje
4e20: 63 74 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68  ct directly.  Th
4e30: 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 54 43  is allows the TC
4e40: 4c 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20 67 65  L compiler to ge
4e50: 6e 65 72 61 74 65 0a 20 20 20 20 2a 2a 20 62 79  nerate.    ** by
4e60: 74 65 63 6f 64 65 20 66 6f 72 20 74 68 65 20 63  tecode for the c
4e70: 6f 6d 6d 61 6e 64 20 6f 6e 20 74 68 65 20 66 69  ommand on the fi
4e80: 72 73 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 61  rst invocation a
4e90: 6e 64 20 74 68 75 73 20 6d 61 6b 65 0a 20 20 20  nd thus make.   
4ea0: 20 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20 69   ** subsequent i
4eb0: 6e 76 6f 63 61 74 69 6f 6e 73 20 6d 75 63 68 20  nvocations much 
4ec0: 66 61 73 74 65 72 2e 20 2a 2f 0a 20 20 20 20 70  faster. */.    p
4ed0: 43 6d 64 20 3d 20 70 2d 3e 70 53 63 72 69 70 74  Cmd = p->pScript
4ee0: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ;.    Tcl_IncrRe
4ef0: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
4f00: 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f    rc = Tcl_EvalO
4f10: 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20  bjEx(p->interp, 
4f20: 70 43 6d 64 2c 20 30 29 3b 0a 20 20 20 20 54 63  pCmd, 0);.    Tc
4f30: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
4f40: 43 6d 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Cmd);.  }else{. 
4f50: 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
4f60: 72 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  re arguments to 
4f70: 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c 20 6d 61  the function, ma
4f80: 6b 65 20 61 20 73 68 61 6c 6c 6f 77 20 63 6f 70  ke a shallow cop
4f90: 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  y of the.    ** 
4fa0: 73 63 72 69 70 74 20 6f 62 6a 65 63 74 2c 20 6c  script object, l
4fb0: 61 70 70 65 6e 64 20 74 68 65 20 61 72 67 75 6d  append the argum
4fc0: 65 6e 74 73 2c 20 74 68 65 6e 20 65 76 61 6c 75  ents, then evalu
4fd0: 61 74 65 20 74 68 65 20 63 6f 70 79 2e 0a 20 20  ate the copy..  
4fe0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 42 79 20 22    **.    ** By "
4ff0: 73 68 61 6c 6c 6f 77 22 20 63 6f 70 79 2c 20 77  shallow" copy, w
5000: 65 20 6d 65 61 6e 20 61 20 6f 6e 6c 79 20 74 68  e mean a only th
5010: 65 20 6f 75 74 65 72 20 6c 69 73 74 20 54 63 6c  e outer list Tcl
5020: 5f 4f 62 6a 20 69 73 20 64 75 70 6c 69 63 61 74  _Obj is duplicat
5030: 65 64 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6e  ed..    ** The n
5040: 65 77 20 54 63 6c 5f 4f 62 6a 20 63 6f 6e 74 61  ew Tcl_Obj conta
5050: 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  ins pointers to 
5060: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6c 69 73  the original lis
5070: 74 20 65 6c 65 6d 65 6e 74 73 2e 20 0a 20 20 20  t elements. .   
5080: 20 2a 2a 20 54 68 61 74 20 77 61 79 2c 20 77 68   ** That way, wh
5090: 65 6e 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28  en Tcl_EvalObjv(
50a0: 29 20 69 73 20 72 75 6e 20 61 6e 64 20 73 68 69  ) is run and shi
50b0: 6d 6d 65 72 73 20 74 68 65 20 66 69 72 73 74 20  mmers the first 
50c0: 65 6c 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 6f  element.    ** o
50d0: 66 20 74 68 65 20 6c 69 73 74 20 74 6f 20 74 63  f the list to tc
50e0: 6c 43 6d 64 4e 61 6d 65 54 79 70 65 2c 20 74 68  lCmdNameType, th
50f0: 61 74 20 61 6c 74 65 72 6e 61 74 65 20 72 65 70  at alternate rep
5100: 72 65 73 65 6e 74 61 74 69 6f 6e 20 77 69 6c 6c  resentation will
5110: 0a 20 20 20 20 2a 2a 20 62 65 20 70 72 65 73 65  .    ** be prese
5120: 72 76 65 64 20 61 6e 64 20 72 65 75 73 65 64 20  rved and reused 
5130: 6f 6e 20 74 68 65 20 6e 65 78 74 20 69 6e 76 6f  on the next invo
5140: 63 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  cation..    */. 
5150: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 41 72     Tcl_Obj **aAr
5160: 67 3b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b  g;.    int nArg;
5170: 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 4c 69 73  .    if( Tcl_Lis
5180: 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28  tObjGetElements(
5190: 70 2d 3e 69 6e 74 65 72 70 2c 20 70 2d 3e 70 53  p->interp, p->pS
51a0: 63 72 69 70 74 2c 20 26 6e 41 72 67 2c 20 26 61  cript, &nArg, &a
51b0: 41 72 67 29 20 29 7b 0a 20 20 20 20 20 20 73 71  Arg) ){.      sq
51c0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
51d0: 6f 72 28 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f  or(context, Tcl_
51e0: 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
51f0: 70 2d 3e 69 6e 74 65 72 70 29 2c 20 2d 31 29 3b  p->interp), -1);
5200: 20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a   .      return;.
5210: 20 20 20 20 7d 20 20 20 20 20 0a 20 20 20 20 70      }     .    p
5220: 43 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73  Cmd = Tcl_NewLis
5230: 74 4f 62 6a 28 6e 41 72 67 2c 20 61 41 72 67 29  tObj(nArg, aArg)
5240: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ;.    Tcl_IncrRe
5250: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
5260: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67    for(i=0; i<arg
5270: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  c; i++){.      s
5280: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 49  qlite3_value *pI
5290: 6e 20 3d 20 61 72 67 76 5b 69 5d 3b 0a 20 20 20  n = argv[i];.   
52a0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c     Tcl_Obj *pVal
52b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 0a 20  ;.            . 
52c0: 20 20 20 20 20 2f 2a 20 53 65 74 20 70 56 61 6c       /* Set pVal
52d0: 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
52e0: 69 27 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  i'th column of t
52f0: 68 69 73 20 72 6f 77 2e 20 2a 2f 0a 20 20 20 20  his row. */.    
5300: 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65    switch( sqlite
5310: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 49 6e  3_value_type(pIn
5320: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73  ) ){.        cas
5330: 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b  e SQLITE_BLOB: {
5340: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 62  .          int b
5350: 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  ytes = sqlite3_v
5360: 61 6c 75 65 5f 62 79 74 65 73 28 70 49 6e 29 3b  alue_bytes(pIn);
5370: 0a 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20  .          pVal 
5380: 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72  = Tcl_NewByteArr
5390: 61 79 4f 62 6a 28 73 71 6c 69 74 65 33 5f 76 61  ayObj(sqlite3_va
53a0: 6c 75 65 5f 62 6c 6f 62 28 70 49 6e 29 2c 20 62  lue_blob(pIn), b
53b0: 79 74 65 73 29 3b 0a 20 20 20 20 20 20 20 20 20  ytes);.         
53c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
53d0: 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  }.        case S
53e0: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b  QLITE_INTEGER: {
53f0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
5400: 65 5f 69 6e 74 36 34 20 76 20 3d 20 73 71 6c 69  e_int64 v = sqli
5410: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28  te3_value_int64(
5420: 70 49 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pIn);.          
5430: 69 66 28 20 76 3e 3d 2d 32 31 34 37 34 38 33 36  if( v>=-21474836
5440: 34 37 20 26 26 20 76 3c 3d 32 31 34 37 34 38 33  47 && v<=2147483
5450: 36 34 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20  647 ){.         
5460: 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65     pVal = Tcl_Ne
5470: 77 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20  wIntObj(v);.    
5480: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
5490: 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20           pVal = 
54a0: 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62  Tcl_NewWideIntOb
54b0: 6a 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  j(v);.          
54c0: 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  }.          brea
54d0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
54e0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
54f0: 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20  _FLOAT: {.      
5500: 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 73      double r = s
5510: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75  qlite3_value_dou
5520: 62 6c 65 28 70 49 6e 29 3b 0a 20 20 20 20 20 20  ble(pIn);.      
5530: 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e      pVal = Tcl_N
5540: 65 77 44 6f 75 62 6c 65 4f 62 6a 28 72 29 3b 0a  ewDoubleObj(r);.
5550: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
5560: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5570: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
5580: 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  ULL: {.         
5590: 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53   pVal = Tcl_NewS
55a0: 74 72 69 6e 67 4f 62 6a 28 22 22 2c 20 30 29 3b  tringObj("", 0);
55b0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
55c0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
55d0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
55e0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 62 79 74           int byt
55f0: 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  es = sqlite3_val
5600: 75 65 5f 62 79 74 65 73 28 70 49 6e 29 3b 0a 20  ue_bytes(pIn);. 
5610: 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20           pVal = 
5620: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
5630: 28 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33  ((char *)sqlite3
5640: 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 49 6e 29  _value_text(pIn)
5650: 2c 20 62 79 74 65 73 29 3b 0a 20 20 20 20 20 20  , bytes);.      
5660: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
5670: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
5680: 20 20 20 72 63 20 3d 20 54 63 6c 5f 4c 69 73 74     rc = Tcl_List
5690: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
56a0: 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64  (p->interp, pCmd
56b0: 2c 20 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 69  , pVal);.      i
56c0: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
56d0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
56e0: 74 28 70 43 6d 64 29 3b 0a 20 20 20 20 20 20 20  t(pCmd);.       
56f0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
5700: 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 54  error(context, T
5710: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
5720: 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c 20 2d  lt(p->interp), -
5730: 31 29 3b 20 0a 20 20 20 20 20 20 20 20 72 65 74  1); .        ret
5740: 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
5750: 20 7d 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 75   }.    if( !p->u
5760: 73 65 45 76 61 6c 4f 62 6a 76 20 29 7b 0a 20 20  seEvalObjv ){.  
5770: 20 20 20 20 2f 2a 20 54 63 6c 5f 45 76 61 6c 4f      /* Tcl_EvalO
5780: 62 6a 45 78 28 29 20 77 69 6c 6c 20 61 75 74 6f  bjEx() will auto
5790: 6d 61 74 69 63 61 6c 6c 79 20 63 61 6c 6c 20 54  matically call T
57a0: 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 69 66  cl_EvalObjv() if
57b0: 20 70 43 6d 64 0a 20 20 20 20 20 20 2a 2a 20 69   pCmd.      ** i
57c0: 73 20 61 20 6c 69 73 74 20 77 69 74 68 6f 75 74  s a list without
57d0: 20 61 20 73 74 72 69 6e 67 20 72 65 70 72 65 73   a string repres
57e0: 65 6e 74 61 74 69 6f 6e 2e 20 20 54 6f 20 70 72  entation.  To pr
57f0: 65 76 65 6e 74 20 74 68 69 73 20 66 72 6f 6d 0a  event this from.
5800: 20 20 20 20 20 20 2a 2a 20 68 61 70 70 65 6e 69        ** happeni
5810: 6e 67 2c 20 6d 61 6b 65 20 73 75 72 65 20 70 43  ng, make sure pC
5820: 6d 64 20 68 61 73 20 61 20 76 61 6c 69 64 20 73  md has a valid s
5830: 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61  tring representa
5840: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 54 63  tion */.      Tc
5850: 6c 5f 47 65 74 53 74 72 69 6e 67 28 70 43 6d 64  l_GetString(pCmd
5860: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  );.    }.    rc 
5870: 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28  = Tcl_EvalObjEx(
5880: 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c  p->interp, pCmd,
5890: 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54   TCL_EVAL_DIRECT
58a0: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52  );.    Tcl_DecrR
58b0: 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20  efCount(pCmd);. 
58c0: 20 7d 0a 0a 20 20 69 66 28 20 72 63 20 26 26 20   }..  if( rc && 
58d0: 72 63 21 3d 54 43 4c 5f 52 45 54 55 52 4e 20 29  rc!=TCL_RETURN )
58e0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
58f0: 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
5900: 78 74 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  xt, Tcl_GetStrin
5910: 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72  gResult(p->inter
5920: 70 29 2c 20 2d 31 29 3b 20 0a 20 20 7d 65 6c 73  p), -1); .  }els
5930: 65 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  e{.    Tcl_Obj *
5940: 70 56 61 72 20 3d 20 54 63 6c 5f 47 65 74 4f 62  pVar = Tcl_GetOb
5950: 6a 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72  jResult(p->inter
5960: 70 29 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20  p);.    int n;. 
5970: 20 20 20 75 38 20 2a 64 61 74 61 3b 0a 20 20 20     u8 *data;.   
5980: 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 70   char *zType = p
5990: 56 61 72 2d 3e 74 79 70 65 50 74 72 20 3f 20 70  Var->typePtr ? p
59a0: 56 61 72 2d 3e 74 79 70 65 50 74 72 2d 3e 6e 61  Var->typePtr->na
59b0: 6d 65 20 3a 20 22 22 3b 0a 20 20 20 20 63 68 61  me : "";.    cha
59c0: 72 20 63 20 3d 20 7a 54 79 70 65 5b 30 5d 3b 0a  r c = zType[0];.
59d0: 20 20 20 20 69 66 28 20 63 3d 3d 27 62 27 20 26      if( c=='b' &
59e0: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
59f0: 62 79 74 65 61 72 72 61 79 22 29 3d 3d 30 20 26  bytearray")==0 &
5a00: 26 20 70 56 61 72 2d 3e 62 79 74 65 73 3d 3d 30  & pVar->bytes==0
5a10: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 6c   ){.      /* Onl
5a20: 79 20 72 65 74 75 72 6e 20 61 20 42 4c 4f 42 20  y return a BLOB 
5a30: 74 79 70 65 20 69 66 20 74 68 65 20 54 63 6c 20  type if the Tcl 
5a40: 76 61 72 69 61 62 6c 65 20 69 73 20 61 20 62 79  variable is a by
5a50: 74 65 61 72 72 61 79 20 61 6e 64 0a 20 20 20 20  tearray and.    
5a60: 20 20 2a 2a 20 68 61 73 20 6e 6f 20 73 74 72 69    ** has no stri
5a70: 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ng representatio
5a80: 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 64 61 74 61  n. */.      data
5a90: 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72   = Tcl_GetByteAr
5aa0: 72 61 79 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c  rayFromObj(pVar,
5ab0: 20 26 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   &n);.      sqli
5ac0: 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 28  te3_result_blob(
5ad0: 63 6f 6e 74 65 78 74 2c 20 64 61 74 61 2c 20 6e  context, data, n
5ae0: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
5af0: 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  NT);.    }else i
5b00: 66 28 20 63 3d 3d 27 62 27 20 26 26 20 73 74 72  f( c=='b' && str
5b10: 63 6d 70 28 7a 54 79 70 65 2c 22 62 6f 6f 6c 65  cmp(zType,"boole
5b20: 61 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  an")==0 ){.     
5b30: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
5b40: 62 6a 28 30 2c 20 70 56 61 72 2c 20 26 6e 29 3b  bj(0, pVar, &n);
5b50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
5b60: 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78  esult_int(contex
5b70: 74 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t, n);.    }else
5b80: 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20 73   if( c=='d' && s
5b90: 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 64 6f 75  trcmp(zType,"dou
5ba0: 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ble")==0 ){.    
5bb0: 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20    double r;.    
5bc0: 20 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46    Tcl_GetDoubleF
5bd0: 72 6f 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c 20  romObj(0, pVar, 
5be0: 26 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  &r);.      sqlit
5bf0: 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65  e3_result_double
5c00: 28 63 6f 6e 74 65 78 74 2c 20 72 29 3b 0a 20 20  (context, r);.  
5c10: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63 3d 3d    }else if( (c==
5c20: 27 77 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54  'w' && strcmp(zT
5c30: 79 70 65 2c 22 77 69 64 65 49 6e 74 22 29 3d 3d  ype,"wideInt")==
5c40: 30 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  0) ||.          
5c50: 28 63 3d 3d 27 69 27 20 26 26 20 73 74 72 63 6d  (c=='i' && strcm
5c60: 70 28 7a 54 79 70 65 2c 22 69 6e 74 22 29 3d 3d  p(zType,"int")==
5c70: 30 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  0) ){.      Tcl_
5c80: 57 69 64 65 49 6e 74 20 76 3b 0a 20 20 20 20 20  WideInt v;.     
5c90: 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46   Tcl_GetWideIntF
5ca0: 72 6f 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c 20  romObj(0, pVar, 
5cb0: 26 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  &v);.      sqlit
5cc0: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28  e3_result_int64(
5cd0: 63 6f 6e 74 65 78 74 2c 20 76 29 3b 0a 20 20 20  context, v);.   
5ce0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 61   }else{.      da
5cf0: 74 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  ta = (unsigned c
5d00: 68 61 72 20 2a 29 54 63 6c 5f 47 65 74 53 74 72  har *)Tcl_GetStr
5d10: 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c  ingFromObj(pVar,
5d20: 20 26 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   &n);.      sqli
5d30: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
5d40: 63 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 20 2a  context, (char *
5d50: 29 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45  )data, n, SQLITE
5d60: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
5d70: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65   }.  }.}..#ifnde
5d80: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
5d90: 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a  THORIZATION./*.*
5da0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 61 75  * This is the au
5db0: 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 66 75 6e  thentication fun
5dc0: 63 74 69 6f 6e 2e 20 20 49 74 20 61 70 70 65 6e  ction.  It appen
5dd0: 64 73 20 74 68 65 20 61 75 74 68 65 6e 74 69 63  ds the authentic
5de0: 61 74 69 6f 6e 0a 2a 2a 20 74 79 70 65 20 63 6f  ation.** type co
5df0: 64 65 20 61 6e 64 20 74 68 65 20 74 77 6f 20 61  de and the two a
5e00: 72 67 75 6d 65 6e 74 73 20 74 6f 20 7a 43 6d 64  rguments to zCmd
5e10: 5b 5d 20 74 68 65 6e 20 69 6e 76 6f 6b 65 73 20  [] then invokes 
5e20: 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 6f 6e  the result.** on
5e30: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
5e40: 2e 20 20 54 68 65 20 72 65 70 6c 79 20 69 73 20  .  The reply is 
5e50: 65 78 61 6d 69 6e 65 64 20 74 6f 20 64 65 74 65  examined to dete
5e60: 72 6d 69 6e 65 20 69 66 20 74 68 65 0a 2a 2a 20  rmine if the.** 
5e70: 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 66  authentication f
5e80: 61 69 6c 73 20 6f 72 20 73 75 63 63 65 65 64 73  ails or succeeds
5e90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5ea0: 61 75 74 68 5f 63 61 6c 6c 62 61 63 6b 28 0a 20  auth_callback(. 
5eb0: 20 76 6f 69 64 20 2a 70 41 72 67 2c 0a 20 20 69   void *pArg,.  i
5ec0: 6e 74 20 63 6f 64 65 2c 0a 20 20 63 6f 6e 73 74  nt code,.  const
5ed0: 20 63 68 61 72 20 2a 7a 41 72 67 31 2c 0a 20 20   char *zArg1,.  
5ee0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
5ef0: 32 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  2,.  const char 
5f00: 2a 7a 41 72 67 33 2c 0a 20 20 63 6f 6e 73 74 20  *zArg3,.  const 
5f10: 63 68 61 72 20 2a 7a 41 72 67 34 0a 29 7b 0a 20  char *zArg4.){. 
5f20: 20 63 68 61 72 20 2a 7a 43 6f 64 65 3b 0a 20 20   char *zCode;.  
5f30: 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b  Tcl_DString str;
5f40: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e  .  int rc;.  con
5f50: 73 74 20 63 68 61 72 20 2a 7a 52 65 70 6c 79 3b  st char *zReply;
5f60: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
5f70: 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 70 41   = (SqliteDb*)pA
5f80: 72 67 3b 0a 20 20 69 66 28 20 70 44 62 2d 3e 64  rg;.  if( pDb->d
5f90: 69 73 61 62 6c 65 41 75 74 68 20 29 20 72 65 74  isableAuth ) ret
5fa0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
5fb0: 20 20 73 77 69 74 63 68 28 20 63 6f 64 65 20 29    switch( code )
5fc0: 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
5fd0: 45 5f 43 4f 50 59 20 20 20 20 20 20 20 20 20 20  E_COPY          
5fe0: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
5ff0: 49 54 45 5f 43 4f 50 59 22 3b 20 62 72 65 61 6b  ITE_COPY"; break
6000: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
6010: 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 20 20  E_CREATE_INDEX  
6020: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
6030: 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58  ITE_CREATE_INDEX
6040: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
6050: 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45  se SQLITE_CREATE
6060: 5f 54 41 42 4c 45 20 20 20 20 20 20 3a 20 7a 43  _TABLE      : zC
6070: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41  ode="SQLITE_CREA
6080: 54 45 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b  TE_TABLE"; break
6090: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
60a0: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e  E_CREATE_TEMP_IN
60b0: 44 45 58 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c  DEX : zCode="SQL
60c0: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
60d0: 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20  INDEX"; break;. 
60e0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
60f0: 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45  REATE_TEMP_TABLE
6100: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
6110: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42  _CREATE_TEMP_TAB
6120: 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  LE"; break;.    
6130: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41  case SQLITE_CREA
6140: 54 45 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 3a  TE_TEMP_TRIGGER:
6150: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43   zCode="SQLITE_C
6160: 52 45 41 54 45 5f 54 45 4d 50 5f 54 52 49 47 47  REATE_TEMP_TRIGG
6170: 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  ER"; break;.    
6180: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41  case SQLITE_CREA
6190: 54 45 5f 54 45 4d 50 5f 56 49 45 57 20 20 3a 20  TE_TEMP_VIEW  : 
61a0: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52  zCode="SQLITE_CR
61b0: 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 22 3b  EATE_TEMP_VIEW";
61c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
61d0: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
61e0: 52 49 47 47 45 52 20 20 20 20 3a 20 7a 43 6f 64  RIGGER    : zCod
61f0: 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45  e="SQLITE_CREATE
6200: 5f 54 52 49 47 47 45 52 22 3b 20 62 72 65 61 6b  _TRIGGER"; break
6210: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
6220: 45 5f 43 52 45 41 54 45 5f 56 49 45 57 20 20 20  E_CREATE_VIEW   
6230: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
6240: 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57 22  ITE_CREATE_VIEW"
6250: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
6260: 65 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 20  e SQLITE_DELETE 
6270: 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f             : zCo
6280: 64 65 3d 22 53 51 4c 49 54 45 5f 44 45 4c 45 54  de="SQLITE_DELET
6290: 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  E"; break;.    c
62a0: 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  ase SQLITE_DROP_
62b0: 49 4e 44 45 58 20 20 20 20 20 20 20 20 3a 20 7a  INDEX        : z
62c0: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f  Code="SQLITE_DRO
62d0: 50 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b  P_INDEX"; break;
62e0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
62f0: 5f 44 52 4f 50 5f 54 41 42 4c 45 20 20 20 20 20  _DROP_TABLE     
6300: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
6310: 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 22 3b 20  TE_DROP_TABLE"; 
6320: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
6330: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
6340: 5f 49 4e 44 45 58 20 20 20 3a 20 7a 43 6f 64 65  _INDEX   : zCode
6350: 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  ="SQLITE_DROP_TE
6360: 4d 50 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b  MP_INDEX"; break
6370: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
6380: 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c  E_DROP_TEMP_TABL
6390: 45 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c  E   : zCode="SQL
63a0: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41  ITE_DROP_TEMP_TA
63b0: 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  BLE"; break;.   
63c0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f   case SQLITE_DRO
63d0: 50 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 20 3a  P_TEMP_TRIGGER :
63e0: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44   zCode="SQLITE_D
63f0: 52 4f 50 5f 54 45 4d 50 5f 54 52 49 47 47 45 52  ROP_TEMP_TRIGGER
6400: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
6410: 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54  se SQLITE_DROP_T
6420: 45 4d 50 5f 56 49 45 57 20 20 20 20 3a 20 7a 43  EMP_VIEW    : zC
6430: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50  ode="SQLITE_DROP
6440: 5f 54 45 4d 50 5f 56 49 45 57 22 3b 20 62 72 65  _TEMP_VIEW"; bre
6450: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
6460: 49 54 45 5f 44 52 4f 50 5f 54 52 49 47 47 45 52  ITE_DROP_TRIGGER
6470: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
6480: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 52 49 47 47  QLITE_DROP_TRIGG
6490: 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  ER"; break;.    
64a0: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50  case SQLITE_DROP
64b0: 5f 56 49 45 57 20 20 20 20 20 20 20 20 20 3a 20  _VIEW         : 
64c0: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52  zCode="SQLITE_DR
64d0: 4f 50 5f 56 49 45 57 22 3b 20 62 72 65 61 6b 3b  OP_VIEW"; break;
64e0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
64f0: 5f 49 4e 53 45 52 54 20 20 20 20 20 20 20 20 20  _INSERT         
6500: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
6510: 54 45 5f 49 4e 53 45 52 54 22 3b 20 62 72 65 61  TE_INSERT"; brea
6520: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
6530: 54 45 5f 50 52 41 47 4d 41 20 20 20 20 20 20 20  TE_PRAGMA       
6540: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
6550: 4c 49 54 45 5f 50 52 41 47 4d 41 22 3b 20 62 72  LITE_PRAGMA"; br
6560: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
6570: 4c 49 54 45 5f 52 45 41 44 20 20 20 20 20 20 20  LITE_READ       
6580: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
6590: 53 51 4c 49 54 45 5f 52 45 41 44 22 3b 20 62 72  SQLITE_READ"; br
65a0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
65b0: 4c 49 54 45 5f 53 45 4c 45 43 54 20 20 20 20 20  LITE_SELECT     
65c0: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
65d0: 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 22 3b 20  SQLITE_SELECT"; 
65e0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
65f0: 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49  SQLITE_TRANSACTI
6600: 4f 4e 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65  ON       : zCode
6610: 3d 22 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43  ="SQLITE_TRANSAC
6620: 54 49 4f 4e 22 3b 20 62 72 65 61 6b 3b 0a 20 20  TION"; break;.  
6630: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55 50    case SQLITE_UP
6640: 44 41 54 45 20 20 20 20 20 20 20 20 20 20 20 20  DATE            
6650: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
6660: 55 50 44 41 54 45 22 3b 20 62 72 65 61 6b 3b 0a  UPDATE"; break;.
6670: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
6680: 41 54 54 41 43 48 20 20 20 20 20 20 20 20 20 20  ATTACH          
6690: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
66a0: 45 5f 41 54 54 41 43 48 22 3b 20 62 72 65 61 6b  E_ATTACH"; break
66b0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
66c0: 45 5f 44 45 54 41 43 48 20 20 20 20 20 20 20 20  E_DETACH        
66d0: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
66e0: 49 54 45 5f 44 45 54 41 43 48 22 3b 20 62 72 65  ITE_DETACH"; bre
66f0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
6700: 49 54 45 5f 41 4c 54 45 52 5f 54 41 42 4c 45 20  ITE_ALTER_TABLE 
6710: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
6720: 51 4c 49 54 45 5f 41 4c 54 45 52 5f 54 41 42 4c  QLITE_ALTER_TABL
6730: 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  E"; break;.    c
6740: 61 73 65 20 53 51 4c 49 54 45 5f 52 45 49 4e 44  ase SQLITE_REIND
6750: 45 58 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a  EX           : z
6760: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 52 45 49  Code="SQLITE_REI
6770: 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20  NDEX"; break;.  
6780: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 4e    case SQLITE_AN
6790: 41 4c 59 5a 45 20 20 20 20 20 20 20 20 20 20 20  ALYZE           
67a0: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
67b0: 41 4e 41 4c 59 5a 45 22 3b 20 62 72 65 61 6b 3b  ANALYZE"; break;
67c0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
67d0: 5f 43 52 45 41 54 45 5f 56 54 41 42 4c 45 20 20  _CREATE_VTABLE  
67e0: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
67f0: 54 45 5f 43 52 45 41 54 45 5f 56 54 41 42 4c 45  TE_CREATE_VTABLE
6800: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
6810: 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56  se SQLITE_DROP_V
6820: 54 41 42 4c 45 20 20 20 20 20 20 20 3a 20 7a 43  TABLE       : zC
6830: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50  ode="SQLITE_DROP
6840: 5f 56 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b  _VTABLE"; break;
6850: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
6860: 5f 46 55 4e 43 54 49 4f 4e 20 20 20 20 20 20 20  _FUNCTION       
6870: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
6880: 54 45 5f 46 55 4e 43 54 49 4f 4e 22 3b 20 62 72  TE_FUNCTION"; br
6890: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
68a0: 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e 54 20 20  LITE_SAVEPOINT  
68b0: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
68c0: 53 51 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e 54  SQLITE_SAVEPOINT
68d0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65  "; break;.    de
68e0: 66 61 75 6c 74 20 20 20 20 20 20 20 20 20 20 20  fault           
68f0: 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43              : zC
6900: 6f 64 65 3d 22 3f 3f 3f 3f 22 3b 20 62 72 65 61  ode="????"; brea
6910: 6b 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 44 53 74  k;.  }.  Tcl_DSt
6920: 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a  ringInit(&str);.
6930: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
6940: 65 6e 64 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a  end(&str, pDb->z
6950: 41 75 74 68 2c 20 2d 31 29 3b 0a 20 20 54 63 6c  Auth, -1);.  Tcl
6960: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c  _DStringAppendEl
6970: 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 43 6f 64  ement(&str, zCod
6980: 65 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  e);.  Tcl_DStrin
6990: 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26  gAppendElement(&
69a0: 73 74 72 2c 20 7a 41 72 67 31 20 3f 20 7a 41 72  str, zArg1 ? zAr
69b0: 67 31 20 3a 20 22 22 29 3b 0a 20 20 54 63 6c 5f  g1 : "");.  Tcl_
69c0: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65  DStringAppendEle
69d0: 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41 72 67 32  ment(&str, zArg2
69e0: 20 3f 20 7a 41 72 67 32 20 3a 20 22 22 29 3b 0a   ? zArg2 : "");.
69f0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
6a00: 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c  endElement(&str,
6a10: 20 7a 41 72 67 33 20 3f 20 7a 41 72 67 33 20 3a   zArg3 ? zArg3 :
6a20: 20 22 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72   "");.  Tcl_DStr
6a30: 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ingAppendElement
6a40: 28 26 73 74 72 2c 20 7a 41 72 67 34 20 3f 20 7a  (&str, zArg4 ? z
6a50: 41 72 67 34 20 3a 20 22 22 29 3b 0a 20 20 72 63  Arg4 : "");.  rc
6a60: 20 3d 20 54 63 6c 5f 47 6c 6f 62 61 6c 45 76 61   = Tcl_GlobalEva
6a70: 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 54  l(pDb->interp, T
6a80: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28  cl_DStringValue(
6a90: 26 73 74 72 29 29 3b 0a 20 20 54 63 6c 5f 44 53  &str));.  Tcl_DS
6aa0: 74 72 69 6e 67 46 72 65 65 28 26 73 74 72 29 3b  tringFree(&str);
6ab0: 0a 20 20 7a 52 65 70 6c 79 20 3d 20 54 63 6c 5f  .  zReply = Tcl_
6ac0: 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
6ad0: 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20  pDb->interp);.  
6ae0: 69 66 28 20 73 74 72 63 6d 70 28 7a 52 65 70 6c  if( strcmp(zRepl
6af0: 79 2c 22 53 51 4c 49 54 45 5f 4f 4b 22 29 3d 3d  y,"SQLITE_OK")==
6b00: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
6b10: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
6b20: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 52 65 70   if( strcmp(zRep
6b30: 6c 79 2c 22 53 51 4c 49 54 45 5f 44 45 4e 59 22  ly,"SQLITE_DENY"
6b40: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )==0 ){.    rc =
6b50: 20 53 51 4c 49 54 45 5f 44 45 4e 59 3b 0a 20 20   SQLITE_DENY;.  
6b60: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
6b70: 28 7a 52 65 70 6c 79 2c 22 53 51 4c 49 54 45 5f  (zReply,"SQLITE_
6b80: 49 47 4e 4f 52 45 22 29 3d 3d 30 20 29 7b 0a 20  IGNORE")==0 ){. 
6b90: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
6ba0: 47 4e 4f 52 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  GNORE;.  }else{.
6bb0: 20 20 20 20 72 63 20 3d 20 39 39 39 3b 0a 20 20      rc = 999;.  
6bc0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
6bd0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
6be0: 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
6bf0: 54 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 7a  TION */../*.** z
6c00: 54 65 78 74 20 69 73 20 61 20 70 6f 69 6e 74 65  Text is a pointe
6c10: 72 20 74 6f 20 74 65 78 74 20 6f 62 74 61 69 6e  r to text obtain
6c20: 65 64 20 76 69 61 20 61 6e 20 73 71 6c 69 74 65  ed via an sqlite
6c30: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 29 0a  3_result_text().
6c40: 2a 2a 20 6f 72 20 73 69 6d 69 6c 61 72 20 69 6e  ** or similar in
6c50: 74 65 72 66 61 63 65 2e 20 54 68 69 73 20 72 6f  terface. This ro
6c60: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 61 20  utine returns a 
6c70: 54 63 6c 20 73 74 72 69 6e 67 20 6f 62 6a 65 63  Tcl string objec
6c80: 74 2c 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  t, .** reference
6c90: 20 63 6f 75 6e 74 20 73 65 74 20 74 6f 20 30 2c   count set to 0,
6ca0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
6cb0: 74 65 78 74 2e 20 49 66 20 61 20 74 72 61 6e 73  text. If a trans
6cc0: 6c 61 74 69 6f 6e 0a 2a 2a 20 62 65 74 77 65 65  lation.** betwee
6cd0: 6e 20 69 73 6f 38 38 35 39 20 61 6e 64 20 55 54  n iso8859 and UT
6ce0: 46 2d 38 20 69 73 20 72 65 71 75 69 72 65 64 2c  F-8 is required,
6cf0: 20 69 74 20 69 73 20 70 72 65 66 6f 72 6d 65 64   it is preformed
6d00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 63 6c 5f  ..*/.static Tcl_
6d10: 4f 62 6a 20 2a 64 62 54 65 78 74 54 6f 4f 62 6a  Obj *dbTextToObj
6d20: 28 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 65  (char const *zTe
6d30: 78 74 29 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  xt){.  Tcl_Obj *
6d40: 70 56 61 6c 3b 0a 23 69 66 64 65 66 20 55 54 46  pVal;.#ifdef UTF
6d50: 5f 54 52 41 4e 53 4c 41 54 49 4f 4e 5f 4e 45 45  _TRANSLATION_NEE
6d60: 44 45 44 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  DED.  Tcl_DStrin
6d70: 67 20 64 43 6f 6c 3b 0a 20 20 54 63 6c 5f 44 53  g dCol;.  Tcl_DS
6d80: 74 72 69 6e 67 49 6e 69 74 28 26 64 43 6f 6c 29  tringInit(&dCol)
6d90: 3b 0a 20 20 54 63 6c 5f 45 78 74 65 72 6e 61 6c  ;.  Tcl_External
6da0: 54 6f 55 74 66 44 53 74 72 69 6e 67 28 4e 55 4c  ToUtfDString(NUL
6db0: 4c 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20 26 64  L, zText, -1, &d
6dc0: 43 6f 6c 29 3b 0a 20 20 70 56 61 6c 20 3d 20 54  Col);.  pVal = T
6dd0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
6de0: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65  Tcl_DStringValue
6df0: 28 26 64 43 6f 6c 29 2c 20 2d 31 29 3b 0a 20 20  (&dCol), -1);.  
6e00: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
6e10: 26 64 43 6f 6c 29 3b 0a 23 65 6c 73 65 0a 20 20  &dCol);.#else.  
6e20: 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74  pVal = Tcl_NewSt
6e30: 72 69 6e 67 4f 62 6a 28 7a 54 65 78 74 2c 20 2d  ringObj(zText, -
6e40: 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  1);.#endif.  ret
6e50: 75 72 6e 20 70 56 61 6c 3b 0a 7d 0a 0a 2f 2a 0a  urn pVal;.}../*.
6e60: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6e70: 72 65 61 64 73 20 61 20 6c 69 6e 65 20 6f 66 20  reads a line of 
6e80: 74 65 78 74 20 66 72 6f 6d 20 46 49 4c 45 20 69  text from FILE i
6e90: 6e 2c 20 73 74 6f 72 65 73 0a 2a 2a 20 74 68 65  n, stores.** the
6ea0: 20 74 65 78 74 20 69 6e 20 6d 65 6d 6f 72 79 20   text in memory 
6eb0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
6ec0: 6c 6c 6f 63 28 29 20 61 6e 64 20 72 65 74 75 72  lloc() and retur
6ed0: 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  ns a pointer.** 
6ee0: 74 6f 20 74 68 65 20 74 65 78 74 2e 20 20 4e 55  to the text.  NU
6ef0: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  LL is returned a
6f00: 74 20 65 6e 64 20 6f 66 20 66 69 6c 65 2c 20 6f  t end of file, o
6f10: 72 20 69 66 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a  r if malloc().**
6f20: 20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   fails..**.** Th
6f30: 65 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 6c  e interface is l
6f40: 69 6b 65 20 22 72 65 61 64 6c 69 6e 65 22 20 62  ike "readline" b
6f50: 75 74 20 6e 6f 20 63 6f 6d 6d 61 6e 64 2d 6c 69  ut no command-li
6f60: 6e 65 20 65 64 69 74 69 6e 67 0a 2a 2a 20 69 73  ne editing.** is
6f70: 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 63 6f 70   done..**.** cop
6f80: 69 65 64 20 66 72 6f 6d 20 73 68 65 6c 6c 2e 63  ied from shell.c
6f90: 20 66 72 6f 6d 20 27 2e 69 6d 70 6f 72 74 27 20   from '.import' 
6fa0: 63 6f 6d 6d 61 6e 64 0a 2a 2f 0a 73 74 61 74 69  command.*/.stati
6fb0: 63 20 63 68 61 72 20 2a 6c 6f 63 61 6c 5f 67 65  c char *local_ge
6fc0: 74 6c 69 6e 65 28 63 68 61 72 20 2a 7a 50 72 6f  tline(char *zPro
6fd0: 6d 70 74 2c 20 46 49 4c 45 20 2a 69 6e 29 7b 0a  mpt, FILE *in){.
6fe0: 20 20 63 68 61 72 20 2a 7a 4c 69 6e 65 3b 0a 20    char *zLine;. 
6ff0: 20 69 6e 74 20 6e 4c 69 6e 65 3b 0a 20 20 69 6e   int nLine;.  in
7000: 74 20 6e 3b 0a 20 20 69 6e 74 20 65 6f 6c 3b 0a  t n;.  int eol;.
7010: 0a 20 20 6e 4c 69 6e 65 20 3d 20 31 30 30 3b 0a  .  nLine = 100;.
7020: 20 20 7a 4c 69 6e 65 20 3d 20 6d 61 6c 6c 6f 63    zLine = malloc
7030: 28 20 6e 4c 69 6e 65 20 29 3b 0a 20 20 69 66 28  ( nLine );.  if(
7040: 20 7a 4c 69 6e 65 3d 3d 30 20 29 20 72 65 74 75   zLine==0 ) retu
7050: 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20  rn 0;.  n = 0;. 
7060: 20 65 6f 6c 20 3d 20 30 3b 0a 20 20 77 68 69 6c   eol = 0;.  whil
7070: 65 28 20 21 65 6f 6c 20 29 7b 0a 20 20 20 20 69  e( !eol ){.    i
7080: 66 28 20 6e 2b 31 30 30 3e 6e 4c 69 6e 65 20 29  f( n+100>nLine )
7090: 7b 0a 20 20 20 20 20 20 6e 4c 69 6e 65 20 3d 20  {.      nLine = 
70a0: 6e 4c 69 6e 65 2a 32 20 2b 20 31 30 30 3b 0a 20  nLine*2 + 100;. 
70b0: 20 20 20 20 20 7a 4c 69 6e 65 20 3d 20 72 65 61       zLine = rea
70c0: 6c 6c 6f 63 28 7a 4c 69 6e 65 2c 20 6e 4c 69 6e  lloc(zLine, nLin
70d0: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4c  e);.      if( zL
70e0: 69 6e 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ine==0 ) return 
70f0: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
7100: 20 66 67 65 74 73 28 26 7a 4c 69 6e 65 5b 6e 5d   fgets(&zLine[n]
7110: 2c 20 6e 4c 69 6e 65 20 2d 20 6e 2c 20 69 6e 29  , nLine - n, in)
7120: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
7130: 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   n==0 ){.       
7140: 20 66 72 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20   free(zLine);.  
7150: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
7160: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4c        }.      zL
7170: 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20  ine[n] = 0;.    
7180: 20 20 65 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 20    eol = 1;.     
7190: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
71a0: 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 6e    while( zLine[n
71b0: 5d 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 20 20  ] ){ n++; }.    
71c0: 69 66 28 20 6e 3e 30 20 26 26 20 7a 4c 69 6e 65  if( n>0 && zLine
71d0: 5b 6e 2d 31 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20  [n-1]=='\n' ){. 
71e0: 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20 20       n--;.      
71f0: 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20  zLine[n] = 0;.  
7200: 20 20 20 20 65 6f 6c 20 3d 20 31 3b 0a 20 20 20      eol = 1;.   
7210: 20 7d 0a 20 20 7d 0a 20 20 7a 4c 69 6e 65 20 3d   }.  }.  zLine =
7220: 20 72 65 61 6c 6c 6f 63 28 20 7a 4c 69 6e 65 2c   realloc( zLine,
7230: 20 6e 2b 31 20 29 3b 0a 20 20 72 65 74 75 72 6e   n+1 );.  return
7240: 20 7a 4c 69 6e 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a   zLine;.}.../*.*
7250: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65  * Figure out the
7260: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f   column names fo
7270: 72 20 74 68 65 20 64 61 74 61 20 72 65 74 75 72  r the data retur
7280: 6e 65 64 20 62 79 20 74 68 65 20 73 74 61 74 65  ned by the state
7290: 6d 65 6e 74 0a 2a 2a 20 70 61 73 73 65 64 20 61  ment.** passed a
72a0: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
72b0: 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ument..**.** If 
72c0: 70 61 72 61 6d 65 74 65 72 20 70 61 70 43 6f 6c  parameter papCol
72d0: 4e 61 6d 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Name is not NULL
72e0: 2c 20 74 68 65 6e 20 2a 70 61 70 43 6f 6c 4e 61  , then *papColNa
72f0: 6d 65 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  me is set to poi
7300: 6e 74 0a 2a 2a 20 61 74 20 61 6e 20 61 72 72 61  nt.** at an arra
7310: 79 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e  y allocated usin
7320: 67 20 54 63 6c 5f 41 6c 6c 6f 63 28 29 2e 20 49  g Tcl_Alloc(). I
7330: 74 20 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73  t is the callers
7340: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a   responsibility.
7350: 2a 2a 20 74 6f 20 66 72 65 65 20 74 68 69 73 20  ** to free this 
7360: 61 72 72 61 79 20 75 73 69 6e 67 20 54 63 6c 5f  array using Tcl_
7370: 46 72 65 65 28 29 2c 20 61 6e 64 20 74 6f 20 64  Free(), and to d
7380: 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ecrement the ref
7390: 65 72 65 6e 63 65 0a 2a 2a 20 63 6f 75 6e 74 20  erence.** count 
73a0: 6f 66 20 65 61 63 68 20 54 63 6c 5f 4f 62 6a 2a  of each Tcl_Obj*
73b0: 20 6d 65 6d 62 65 72 20 6f 66 20 74 68 65 20 61   member of the a
73c0: 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rray..**.** The 
73d0: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
73e0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
73f0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
7400: 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 0a 2a  olumns of data.*
7410: 2a 20 72 65 74 75 72 6e 65 64 20 62 79 20 70 53  * returned by pS
7420: 74 6d 74 20 28 61 6e 64 20 68 65 6e 63 65 20 74  tmt (and hence t
7430: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 2a  he size of the *
7440: 70 61 70 43 6f 6c 4e 61 6d 65 20 61 72 72 61 79  papColName array
7450: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 41 72 72  )..**.** If pArr
7460: 61 79 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  ay is not NULL, 
7470: 74 68 65 6e 20 69 74 20 63 6f 6e 74 61 69 6e 73  then it contains
7480: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 54   the name of a T
7490: 63 6c 20 61 72 72 61 79 0a 2a 2a 20 76 61 72 69  cl array.** vari
74a0: 61 62 6c 65 2e 20 54 68 65 20 22 2a 22 20 6d 65  able. The "*" me
74b0: 6d 62 65 72 20 6f 66 20 74 68 69 73 20 61 72 72  mber of this arr
74c0: 61 79 20 69 73 20 73 65 74 20 74 6f 20 61 20 6c  ay is set to a l
74d0: 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a  ist containing.*
74e0: 2a 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74  * the names of t
74f0: 68 65 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72  he columns retur
7500: 6e 65 64 20 62 79 20 74 68 65 20 73 74 61 74 65  ned by the state
7510: 6d 65 6e 74 2c 20 69 6e 20 6f 72 64 65 72 20 66  ment, in order f
7520: 72 6f 6d 0a 2a 2a 20 6c 65 66 74 20 74 6f 20 72  rom.** left to r
7530: 69 67 68 74 2e 20 65 2e 67 2e 20 69 66 20 74 68  ight. e.g. if th
7540: 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 72  e names of the r
7550: 65 74 75 72 6e 65 64 20 63 6f 6c 75 6d 6e 73 20  eturned columns 
7560: 61 72 65 20 61 2c 20 62 20 61 6e 64 0a 2a 2a 20  are a, b and.** 
7570: 63 2c 20 69 74 20 64 6f 65 73 20 74 68 65 20 65  c, it does the e
7580: 71 75 69 76 61 6c 65 6e 74 20 6f 66 20 74 68 65  quivalent of the
7590: 20 74 63 6c 20 63 6f 6d 6d 61 6e 64 3a 0a 2a 2a   tcl command:.**
75a0: 0a 2a 2a 20 20 20 20 20 73 65 74 20 24 7b 70 41  .**     set ${pA
75b0: 72 72 61 79 7d 28 2a 29 20 7b 61 20 62 20 63 7d  rray}(*) {a b c}
75c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 63  .*/.static int.c
75d0: 6f 6d 70 75 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  omputeColumnName
75e0: 73 28 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  s(.  Tcl_Interp 
75f0: 2a 69 6e 74 65 72 70 2c 20 0a 20 20 73 71 6c 69  *interp, .  sqli
7600: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 2c  te3_stmt *pStmt,
7610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7620: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a   SQL statement *
7630: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 2a 70  /.  Tcl_Obj ***p
7640: 61 70 43 6f 6c 4e 61 6d 65 2c 20 20 20 20 20 20  apColName,      
7650: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 72        /* OUT: Ar
7660: 72 61 79 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61  ray of column na
7670: 6d 65 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  mes */.  Tcl_Obj
7680: 20 2a 70 41 72 72 61 79 20 20 20 20 20 20 20 20   *pArray        
7690: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
76a0: 6d 65 20 6f 66 20 61 72 72 61 79 20 76 61 72 69  me of array vari
76b0: 61 62 6c 65 20 28 6d 61 79 20 62 65 20 6e 75 6c  able (may be nul
76c0: 6c 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  l) */.){.  int n
76d0: 43 6f 6c 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  Col;..  /* Compu
76e0: 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  te column names 
76f0: 2a 2f 0a 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69  */.  nCol = sqli
7700: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  te3_column_count
7710: 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 70  (pStmt);.  if( p
7720: 61 70 43 6f 6c 4e 61 6d 65 20 29 7b 0a 20 20 20  apColName ){.   
7730: 20 69 6e 74 20 69 3b 0a 20 20 20 20 54 63 6c 5f   int i;.    Tcl_
7740: 4f 62 6a 20 2a 2a 61 70 43 6f 6c 4e 61 6d 65 20  Obj **apColName 
7750: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 2a 29 54 63 6c  = (Tcl_Obj**)Tcl
7760: 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54  _Alloc( sizeof(T
7770: 63 6c 5f 4f 62 6a 2a 29 2a 6e 43 6f 6c 20 29 3b  cl_Obj*)*nCol );
7780: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
7790: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
77a0: 20 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 20 3d    apColName[i] =
77b0: 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c   dbTextToObj(sql
77c0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65  ite3_column_name
77d0: 28 70 53 74 6d 74 2c 69 29 29 3b 0a 20 20 20 20  (pStmt,i));.    
77e0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
77f0: 6e 74 28 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29  nt(apColName[i])
7800: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
7810: 49 66 20 72 65 73 75 6c 74 73 20 61 72 65 20 62  If results are b
7820: 65 69 6e 67 20 73 74 6f 72 65 64 20 69 6e 20 61  eing stored in a
7830: 6e 20 61 72 72 61 79 20 76 61 72 69 61 62 6c 65  n array variable
7840: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 0a 20 20  , then create.  
7850: 20 20 2a 2a 20 74 68 65 20 61 72 72 61 79 28 2a    ** the array(*
7860: 29 20 65 6e 74 72 79 20 66 6f 72 20 74 68 61 74  ) entry for that
7870: 20 61 72 72 61 79 0a 20 20 20 20 2a 2f 0a 20 20   array.    */.  
7880: 20 20 69 66 28 20 70 41 72 72 61 79 20 29 7b 0a    if( pArray ){.
7890: 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70        Tcl_Obj *p
78a0: 43 6f 6c 4c 69 73 74 20 3d 20 54 63 6c 5f 4e 65  ColList = Tcl_Ne
78b0: 77 4f 62 6a 28 29 3b 0a 20 20 20 20 20 20 54 63  wObj();.      Tc
78c0: 6c 5f 4f 62 6a 20 2a 70 53 74 61 72 20 3d 20 54  l_Obj *pStar = T
78d0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
78e0: 22 2a 22 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  "*", -1);.      
78f0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
7900: 28 70 43 6f 6c 4c 69 73 74 29 3b 0a 20 20 20 20  (pColList);.    
7910: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
7920: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
7930: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
7940: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
7950: 2c 20 70 43 6f 6c 4c 69 73 74 2c 20 61 70 43 6f  , pColList, apCo
7960: 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 20  lName[i]);.     
7970: 20 7d 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63   }.      Tcl_Inc
7980: 72 52 65 66 43 6f 75 6e 74 28 70 53 74 61 72 29  rRefCount(pStar)
7990: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53  ;.      Tcl_ObjS
79a0: 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 70  etVar2(interp, p
79b0: 41 72 72 61 79 2c 20 70 53 74 61 72 2c 20 70 43  Array, pStar, pC
79c0: 6f 6c 4c 69 73 74 2c 30 29 3b 0a 20 20 20 20 20  olList,0);.     
79d0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
79e0: 74 28 70 43 6f 6c 4c 69 73 74 29 3b 0a 20 20 20  t(pColList);.   
79f0: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
7a00: 75 6e 74 28 70 53 74 61 72 29 3b 0a 20 20 20 20  unt(pStar);.    
7a10: 7d 0a 20 20 20 20 2a 70 61 70 43 6f 6c 4e 61 6d  }.    *papColNam
7a20: 65 20 3d 20 61 70 43 6f 6c 4e 61 6d 65 3b 0a 20  e = apColName;. 
7a30: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 43 6f   }..  return nCo
7a40: 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  l;.}../*.** The 
7a50: 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d 61 6e 64  "sqlite" command
7a60: 20 62 65 6c 6f 77 20 63 72 65 61 74 65 73 20 61   below creates a
7a70: 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d 61 6e 64   new Tcl command
7a80: 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6e   for each.** con
7a90: 6e 65 63 74 69 6f 6e 20 69 74 20 6f 70 65 6e 73  nection it opens
7aa0: 20 74 6f 20 61 6e 20 53 51 4c 69 74 65 20 64 61   to an SQLite da
7ab0: 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f  tabase.  This ro
7ac0: 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64  utine is invoked
7ad0: 0a 2a 2a 20 77 68 65 6e 65 76 65 72 20 6f 6e 65  .** whenever one
7ae0: 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63   of those connec
7af0: 74 69 6f 6e 2d 73 70 65 63 69 66 69 63 20 63 6f  tion-specific co
7b00: 6d 6d 61 6e 64 73 20 69 73 20 65 78 65 63 75 74  mmands is execut
7b10: 65 64 0a 2a 2a 20 69 6e 20 54 63 6c 2e 20 20 46  ed.** in Tcl.  F
7b20: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 79  or example, if y
7b30: 6f 75 20 72 75 6e 20 54 63 6c 20 63 6f 64 65 20  ou run Tcl code 
7b40: 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
7b50: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 64         sqlite3 d
7b60: 62 31 20 20 22 6d 79 5f 64 61 74 61 62 61 73 65  b1  "my_database
7b70: 22 0a 2a 2a 20 20 20 20 20 20 20 64 62 31 20 63  ".**       db1 c
7b80: 6c 6f 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  lose.**.** The f
7b90: 69 72 73 74 20 63 6f 6d 6d 61 6e 64 20 6f 70 65  irst command ope
7ba0: 6e 73 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ns a connection 
7bb0: 74 6f 20 74 68 65 20 22 6d 79 5f 64 61 74 61 62  to the "my_datab
7bc0: 61 73 65 22 20 64 61 74 61 62 61 73 65 0a 2a 2a  ase" database.**
7bd0: 20 61 6e 64 20 63 61 6c 6c 73 20 74 68 61 74 20   and calls that 
7be0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 22 64 62 31 22  connection "db1"
7bf0: 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20 63 6f  .  The second co
7c00: 6d 6d 61 6e 64 20 63 61 75 73 65 73 20 74 68 69  mmand causes thi
7c10: 73 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 20  s.** subroutine 
7c20: 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 2e 0a 2a  to be invoked..*
7c30: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 4f  /.static int DbO
7c40: 62 6a 43 6d 64 28 76 6f 69 64 20 2a 63 64 2c 20  bjCmd(void *cd, 
7c50: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
7c60: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 54 63 6c  rp, int objc,Tcl
7c70: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76  _Obj *const*objv
7c80: 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  ){.  SqliteDb *p
7c90: 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29  Db = (SqliteDb*)
7ca0: 63 64 3b 0a 20 20 69 6e 74 20 63 68 6f 69 63 65  cd;.  int choice
7cb0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 54 43 4c  ;.  int rc = TCL
7cc0: 5f 4f 4b 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  _OK;.  static co
7cd0: 6e 73 74 20 63 68 61 72 20 2a 44 42 5f 73 74 72  nst char *DB_str
7ce0: 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 61 75 74  s[] = {.    "aut
7cf0: 68 6f 72 69 7a 65 72 22 2c 20 20 20 20 20 20 20  horizer",       
7d00: 20 20 22 62 61 63 6b 75 70 22 2c 20 20 20 20 20    "backup",     
7d10: 20 20 20 20 20 20 20 22 62 75 73 79 22 2c 0a 20         "busy",. 
7d20: 20 20 20 22 63 61 63 68 65 22 2c 20 20 20 20 20     "cache",     
7d30: 20 20 20 20 20 20 20 20 20 22 63 68 61 6e 67 65           "change
7d40: 73 22 2c 20 20 20 20 20 20 20 20 20 20 20 22 63  s",           "c
7d50: 6c 6f 73 65 22 2c 0a 20 20 20 20 22 63 6f 6c 6c  lose",.    "coll
7d60: 61 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ate",           
7d70: 20 22 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64   "collation_need
7d80: 65 64 22 2c 20 20 22 63 6f 6d 6d 69 74 5f 68 6f  ed",  "commit_ho
7d90: 6f 6b 22 2c 0a 20 20 20 20 22 63 6f 6d 70 6c 65  ok",.    "comple
7da0: 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 22  te",           "
7db0: 63 6f 70 79 22 2c 20 20 20 20 20 20 20 20 20 20  copy",          
7dc0: 20 20 20 20 22 65 6e 61 62 6c 65 5f 6c 6f 61 64      "enable_load
7dd0: 5f 65 78 74 65 6e 73 69 6f 6e 22 2c 0a 20 20 20  _extension",.   
7de0: 20 22 65 72 72 6f 72 63 6f 64 65 22 2c 20 20 20   "errorcode",   
7df0: 20 20 20 20 20 20 20 22 65 76 61 6c 22 2c 20 20         "eval",  
7e00: 20 20 20 20 20 20 20 20 20 20 20 20 22 65 78 69              "exi
7e10: 73 74 73 22 2c 0a 20 20 20 20 22 66 75 6e 63 74  sts",.    "funct
7e20: 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20  ion",           
7e30: 22 69 6e 63 72 62 6c 6f 62 22 2c 20 20 20 20 20  "incrblob",     
7e40: 20 20 20 20 20 22 69 6e 74 65 72 72 75 70 74 22       "interrupt"
7e50: 2c 0a 20 20 20 20 22 6c 61 73 74 5f 69 6e 73 65  ,.    "last_inse
7e60: 72 74 5f 72 6f 77 69 64 22 2c 20 20 22 6e 75 6c  rt_rowid",  "nul
7e70: 6c 76 61 6c 75 65 22 2c 20 20 20 20 20 20 20 20  lvalue",        
7e80: 20 22 6f 6e 65 63 6f 6c 75 6d 6e 22 2c 0a 20 20   "onecolumn",.  
7e90: 20 20 22 70 72 6f 66 69 6c 65 22 2c 20 20 20 20    "profile",    
7ea0: 20 20 20 20 20 20 20 20 22 70 72 6f 67 72 65 73          "progres
7eb0: 73 22 2c 20 20 20 20 20 20 20 20 20 20 22 72 65  s",          "re
7ec0: 6b 65 79 22 2c 0a 20 20 20 20 22 72 65 73 74 6f  key",.    "resto
7ed0: 72 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  re",            
7ee0: 22 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 22 2c  "rollback_hook",
7ef0: 20 20 20 20 20 22 73 74 61 74 75 73 22 2c 0a 20       "status",. 
7f00: 20 20 20 22 74 69 6d 65 6f 75 74 22 2c 20 20 20     "timeout",   
7f10: 20 20 20 20 20 20 20 20 20 22 74 6f 74 61 6c 5f           "total_
7f20: 63 68 61 6e 67 65 73 22 2c 20 20 20 20 20 22 74  changes",     "t
7f30: 72 61 63 65 22 2c 0a 20 20 20 20 22 74 72 61 6e  race",.    "tran
7f40: 73 61 63 74 69 6f 6e 22 2c 20 20 20 20 20 20 20  saction",       
7f50: 20 22 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 22   "unlock_notify"
7f60: 2c 20 20 20 20 20 22 75 70 64 61 74 65 5f 68 6f  ,     "update_ho
7f70: 6f 6b 22 2c 0a 20 20 20 20 22 76 65 72 73 69 6f  ok",.    "versio
7f80: 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 30  n",            0
7f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fa0: 20 20 20 20 0a 20 20 7d 3b 0a 20 20 65 6e 75 6d      .  };.  enum
7fb0: 20 44 42 5f 65 6e 75 6d 20 7b 0a 20 20 20 20 44   DB_enum {.    D
7fc0: 42 5f 41 55 54 48 4f 52 49 5a 45 52 2c 20 20 20  B_AUTHORIZER,   
7fd0: 20 20 20 20 20 44 42 5f 42 41 43 4b 55 50 2c 20       DB_BACKUP, 
7fe0: 20 20 20 20 20 20 20 20 20 20 44 42 5f 42 55 53            DB_BUS
7ff0: 59 2c 0a 20 20 20 20 44 42 5f 43 41 43 48 45 2c  Y,.    DB_CACHE,
8000: 20 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f               DB_
8010: 43 48 41 4e 47 45 53 2c 20 20 20 20 20 20 20 20  CHANGES,        
8020: 20 20 44 42 5f 43 4c 4f 53 45 2c 0a 20 20 20 20    DB_CLOSE,.    
8030: 44 42 5f 43 4f 4c 4c 41 54 45 2c 20 20 20 20 20  DB_COLLATE,     
8040: 20 20 20 20 20 20 44 42 5f 43 4f 4c 4c 41 54 49        DB_COLLATI
8050: 4f 4e 5f 4e 45 45 44 45 44 2c 20 44 42 5f 43 4f  ON_NEEDED, DB_CO
8060: 4d 4d 49 54 5f 48 4f 4f 4b 2c 0a 20 20 20 20 44  MMIT_HOOK,.    D
8070: 42 5f 43 4f 4d 50 4c 45 54 45 2c 20 20 20 20 20  B_COMPLETE,     
8080: 20 20 20 20 20 44 42 5f 43 4f 50 59 2c 20 20 20       DB_COPY,   
8090: 20 20 20 20 20 20 20 20 20 20 44 42 5f 45 4e 41            DB_ENA
80a0: 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  BLE_LOAD_EXTENSI
80b0: 4f 4e 2c 0a 20 20 20 20 44 42 5f 45 52 52 4f 52  ON,.    DB_ERROR
80c0: 43 4f 44 45 2c 20 20 20 20 20 20 20 20 20 44 42  CODE,         DB
80d0: 5f 45 56 41 4c 2c 20 20 20 20 20 20 20 20 20 20  _EVAL,          
80e0: 20 20 20 44 42 5f 45 58 49 53 54 53 2c 0a 20 20     DB_EXISTS,.  
80f0: 20 20 44 42 5f 46 55 4e 43 54 49 4f 4e 2c 20 20    DB_FUNCTION,  
8100: 20 20 20 20 20 20 20 20 44 42 5f 49 4e 43 52 42          DB_INCRB
8110: 4c 4f 42 2c 20 20 20 20 20 20 20 20 20 44 42 5f  LOB,         DB_
8120: 49 4e 54 45 52 52 55 50 54 2c 0a 20 20 20 20 44  INTERRUPT,.    D
8130: 42 5f 4c 41 53 54 5f 49 4e 53 45 52 54 5f 52 4f  B_LAST_INSERT_RO
8140: 57 49 44 2c 20 44 42 5f 4e 55 4c 4c 56 41 4c 55  WID, DB_NULLVALU
8150: 45 2c 20 20 20 20 20 20 20 20 44 42 5f 4f 4e 45  E,        DB_ONE
8160: 43 4f 4c 55 4d 4e 2c 0a 20 20 20 20 44 42 5f 50  COLUMN,.    DB_P
8170: 52 4f 46 49 4c 45 2c 20 20 20 20 20 20 20 20 20  ROFILE,         
8180: 20 20 44 42 5f 50 52 4f 47 52 45 53 53 2c 20 20    DB_PROGRESS,  
8190: 20 20 20 20 20 20 20 44 42 5f 52 45 4b 45 59 2c         DB_REKEY,
81a0: 0a 20 20 20 20 44 42 5f 52 45 53 54 4f 52 45 2c  .    DB_RESTORE,
81b0: 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 52 4f             DB_RO
81c0: 4c 4c 42 41 43 4b 5f 48 4f 4f 4b 2c 20 20 20 20  LLBACK_HOOK,    
81d0: 44 42 5f 53 54 41 54 55 53 2c 0a 20 20 20 20 44  DB_STATUS,.    D
81e0: 42 5f 54 49 4d 45 4f 55 54 2c 20 20 20 20 20 20  B_TIMEOUT,      
81f0: 20 20 20 20 20 44 42 5f 54 4f 54 41 4c 5f 43 48       DB_TOTAL_CH
8200: 41 4e 47 45 53 2c 20 20 20 20 44 42 5f 54 52 41  ANGES,    DB_TRA
8210: 43 45 2c 0a 20 20 20 20 44 42 5f 54 52 41 4e 53  CE,.    DB_TRANS
8220: 41 43 54 49 4f 4e 2c 20 20 20 20 20 20 20 44 42  ACTION,       DB
8230: 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 2c 20  _UNLOCK_NOTIFY, 
8240: 20 20 20 44 42 5f 55 50 44 41 54 45 5f 48 4f 4f     DB_UPDATE_HOO
8250: 4b 2c 0a 20 20 20 20 44 42 5f 56 45 52 53 49 4f  K,.    DB_VERSIO
8260: 4e 2c 0a 20 20 7d 3b 0a 20 20 2f 2a 20 64 6f 6e  N,.  };.  /* don
8270: 27 74 20 6c 65 61 76 65 20 74 72 61 69 6c 69 6e  't leave trailin
8280: 67 20 63 6f 6d 6d 61 73 20 6f 6e 20 44 42 5f 65  g commas on DB_e
8290: 6e 75 6d 2c 20 69 74 20 63 6f 6e 66 75 73 65 73  num, it confuses
82a0: 20 74 68 65 20 41 49 58 20 78 6c 63 20 63 6f 6d   the AIX xlc com
82b0: 70 69 6c 65 72 20 2a 2f 0a 0a 20 20 69 66 28 20  piler */..  if( 
82c0: 6f 62 6a 63 3c 32 20 29 7b 0a 20 20 20 20 54 63  objc<2 ){.    Tc
82d0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
82e0: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
82f0: 22 53 55 42 43 4f 4d 4d 41 4e 44 20 2e 2e 2e 22  "SUBCOMMAND ..."
8300: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
8310: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
8320: 66 28 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46  f( Tcl_GetIndexF
8330: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
8340: 62 6a 76 5b 31 5d 2c 20 44 42 5f 73 74 72 73 2c  bjv[1], DB_strs,
8350: 20 22 6f 70 74 69 6f 6e 22 2c 20 30 2c 20 26 63   "option", 0, &c
8360: 68 6f 69 63 65 29 20 29 7b 0a 20 20 20 20 72 65  hoice) ){.    re
8370: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8380: 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 28    }..  switch( (
8390: 65 6e 75 6d 20 44 42 5f 65 6e 75 6d 29 63 68 6f  enum DB_enum)cho
83a0: 69 63 65 20 29 7b 0a 0a 20 20 2f 2a 20 20 20 20  ice ){..  /*    
83b0: 24 64 62 20 61 75 74 68 6f 72 69 7a 65 72 20 3f  $db authorizer ?
83c0: 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20  CALLBACK?.  **. 
83d0: 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67   ** Invoke the g
83e0: 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 74 6f  iven callback to
83f0: 20 61 75 74 68 6f 72 69 7a 65 20 65 61 63 68 20   authorize each 
8400: 53 51 4c 20 6f 70 65 72 61 74 69 6f 6e 20 61 73  SQL operation as
8410: 20 69 74 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70   it is.  ** comp
8420: 69 6c 65 64 2e 20 20 35 20 61 72 67 75 6d 65 6e  iled.  5 argumen
8430: 74 73 20 61 72 65 20 61 70 70 65 6e 64 65 64 20  ts are appended 
8440: 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  to the callback 
8450: 62 65 66 6f 72 65 20 69 74 20 69 73 0a 20 20 2a  before it is.  *
8460: 2a 20 69 6e 76 6f 6b 65 64 3a 0a 20 20 2a 2a 0a  * invoked:.  **.
8470: 20 20 2a 2a 20 20 20 28 31 29 20 54 68 65 20 61    **   (1) The a
8480: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 79 70  uthorization typ
8490: 65 20 28 65 78 3a 20 53 51 4c 49 54 45 5f 43 52  e (ex: SQLITE_CR
84a0: 45 41 54 45 5f 54 41 42 4c 45 2c 20 53 51 4c 49  EATE_TABLE, SQLI
84b0: 54 45 5f 49 4e 53 45 52 54 2c 20 2e 2e 2e 29 0a  TE_INSERT, ...).
84c0: 20 20 2a 2a 20 20 20 28 32 29 20 46 69 72 73 74    **   (2) First
84d0: 20 64 65 73 63 72 69 70 74 69 76 65 20 6e 61 6d   descriptive nam
84e0: 65 20 28 64 65 70 65 6e 64 73 20 6f 6e 20 61 75  e (depends on au
84f0: 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 79 70 65  thorization type
8500: 29 0a 20 20 2a 2a 20 20 20 28 33 29 20 53 65 63  ).  **   (3) Sec
8510: 6f 6e 64 20 64 65 73 63 72 69 70 74 69 76 65 20  ond descriptive 
8520: 6e 61 6d 65 0a 20 20 2a 2a 20 20 20 28 34 29 20  name.  **   (4) 
8530: 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
8540: 62 61 73 65 20 28 65 78 3a 20 22 6d 61 69 6e 22  base (ex: "main"
8550: 2c 20 22 74 65 6d 70 22 29 0a 20 20 2a 2a 20 20  , "temp").  **  
8560: 20 28 35 29 20 4e 61 6d 65 20 6f 66 20 74 72 69   (5) Name of tri
8570: 67 67 65 72 20 74 68 61 74 20 69 73 20 64 6f 69  gger that is doi
8580: 6e 67 20 74 68 65 20 61 63 63 65 73 73 0a 20 20  ng the access.  
8590: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c  **.  ** The call
85a0: 62 61 63 6b 20 73 68 6f 75 6c 64 20 72 65 74 75  back should retu
85b0: 72 6e 20 6f 6e 20 6f 66 20 74 68 65 20 66 6f 6c  rn on of the fol
85c0: 6c 6f 77 69 6e 67 20 73 74 72 69 6e 67 73 3a 20  lowing strings: 
85d0: 53 51 4c 49 54 45 5f 4f 4b 2c 0a 20 20 2a 2a 20  SQLITE_OK,.  ** 
85e0: 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 2c 20 6f  SQLITE_IGNORE, o
85f0: 72 20 53 51 4c 49 54 45 5f 44 45 4e 59 2e 20 20  r SQLITE_DENY.  
8600: 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e  Any other return
8610: 20 76 61 6c 75 65 20 69 73 20 61 6e 20 65 72 72   value is an err
8620: 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  or..  **.  ** If
8630: 20 74 68 69 73 20 6d 65 74 68 6f 64 20 69 73 20   this method is 
8640: 69 6e 76 6f 6b 65 64 20 77 69 74 68 20 6e 6f 20  invoked with no 
8650: 61 72 67 75 6d 65 6e 74 73 2c 20 74 68 65 20 63  arguments, the c
8660: 75 72 72 65 6e 74 20 61 75 74 68 6f 72 69 7a 61  urrent authoriza
8670: 74 69 6f 6e 0a 20 20 2a 2a 20 63 61 6c 6c 62 61  tion.  ** callba
8680: 63 6b 20 73 74 72 69 6e 67 20 69 73 20 72 65 74  ck string is ret
8690: 75 72 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61  urned..  */.  ca
86a0: 73 65 20 44 42 5f 41 55 54 48 4f 52 49 5a 45 52  se DB_AUTHORIZER
86b0: 3a 20 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  : {.#ifdef SQLIT
86c0: 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
86d0: 54 49 4f 4e 0a 20 20 20 20 54 63 6c 5f 41 70 70  TION.    Tcl_App
86e0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
86f0: 2c 20 22 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  , "authorization
8700: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 69   not available i
8710: 6e 20 74 68 69 73 20 62 75 69 6c 64 22 2c 20 30  n this build", 0
8720: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
8730: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20  L_ERROR;.#else. 
8740: 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b     if( objc>3 ){
8750: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
8760: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
8770: 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42  2, objv, "?CALLB
8780: 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65  ACK?");.      re
8790: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
87a0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62      }else if( ob
87b0: 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69  jc==2 ){.      i
87c0: 66 28 20 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b  f( pDb->zAuth ){
87d0: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70  .        Tcl_App
87e0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
87f0: 2c 20 70 44 62 2d 3e 7a 41 75 74 68 2c 20 30 29  , pDb->zAuth, 0)
8800: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
8810: 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20  lse{.      char 
8820: 2a 7a 41 75 74 68 3b 0a 20 20 20 20 20 20 69 6e  *zAuth;.      in
8830: 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28  t len;.      if(
8840: 20 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20   pDb->zAuth ){. 
8850: 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28         Tcl_Free(
8860: 70 44 62 2d 3e 7a 41 75 74 68 29 3b 0a 20 20 20  pDb->zAuth);.   
8870: 20 20 20 7d 0a 20 20 20 20 20 20 7a 41 75 74 68     }.      zAuth
8880: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
8890: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
88a0: 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66   &len);.      if
88b0: 28 20 7a 41 75 74 68 20 26 26 20 6c 65 6e 3e 30  ( zAuth && len>0
88c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
88d0: 3e 7a 41 75 74 68 20 3d 20 54 63 6c 5f 41 6c 6c  >zAuth = Tcl_All
88e0: 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20  oc( len + 1 );. 
88f0: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44         memcpy(pD
8900: 62 2d 3e 7a 41 75 74 68 2c 20 7a 41 75 74 68 2c  b->zAuth, zAuth,
8910: 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d   len+1);.      }
8920: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44  else{.        pD
8930: 62 2d 3e 7a 41 75 74 68 20 3d 20 30 3b 0a 20 20  b->zAuth = 0;.  
8940: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
8950: 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20  pDb->zAuth ){.  
8960: 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72        pDb->inter
8970: 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20  p = interp;.    
8980: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f      sqlite3_set_
8990: 61 75 74 68 6f 72 69 7a 65 72 28 70 44 62 2d 3e  authorizer(pDb->
89a0: 64 62 2c 20 61 75 74 68 5f 63 61 6c 6c 62 61 63  db, auth_callbac
89b0: 6b 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d  k, pDb);.      }
89c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
89d0: 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72  lite3_set_author
89e0: 69 7a 65 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c  izer(pDb->db, 0,
89f0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
8a00: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72   }.#endif.    br
8a10: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
8a20: 20 20 24 64 62 20 62 61 63 6b 75 70 20 3f 44 41    $db backup ?DA
8a30: 54 41 42 41 53 45 3f 20 46 49 4c 45 4e 41 4d 45  TABASE? FILENAME
8a40: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 70 65 6e 20  .  **.  ** Open 
8a50: 6f 72 20 63 72 65 61 74 65 20 61 20 64 61 74 61  or create a data
8a60: 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 64 20  base file named 
8a70: 46 49 4c 45 4e 41 4d 45 2e 20 20 54 72 61 6e 73  FILENAME.  Trans
8a80: 66 65 72 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6e  fer the.  ** con
8a90: 74 65 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 64 61  tent of local da
8aa0: 74 61 62 61 73 65 20 44 41 54 41 42 41 53 45 20  tabase DATABASE 
8ab0: 28 64 65 66 61 75 6c 74 3a 20 22 6d 61 69 6e 22  (default: "main"
8ac0: 29 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  ) into the.  ** 
8ad0: 46 49 4c 45 4e 41 4d 45 20 64 61 74 61 62 61 73  FILENAME databas
8ae0: 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  e..  */.  case D
8af0: 42 5f 42 41 43 4b 55 50 3a 20 7b 0a 20 20 20 20  B_BACKUP: {.    
8b00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 73  const char *zDes
8b10: 74 46 69 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74  tFile;.    const
8b20: 20 63 68 61 72 20 2a 7a 53 72 63 44 62 3b 0a 20   char *zSrcDb;. 
8b30: 20 20 20 73 71 6c 69 74 65 33 20 2a 70 44 65 73     sqlite3 *pDes
8b40: 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  t;.    sqlite3_b
8b50: 61 63 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b 0a  ackup *pBackup;.
8b60: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33  .    if( objc==3
8b70: 20 29 7b 0a 20 20 20 20 20 20 7a 53 72 63 44 62   ){.      zSrcDb
8b80: 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 20   = "main";.     
8b90: 20 7a 44 65 73 74 46 69 6c 65 20 3d 20 54 63 6c   zDestFile = Tcl
8ba0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
8bb0: 32 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  2]);.    }else i
8bc0: 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20  f( objc==4 ){.  
8bd0: 20 20 20 20 7a 53 72 63 44 62 20 3d 20 54 63 6c      zSrcDb = Tcl
8be0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
8bf0: 32 5d 29 3b 0a 20 20 20 20 20 20 7a 44 65 73 74  2]);.      zDest
8c00: 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  File = Tcl_GetSt
8c10: 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20  ring(objv[3]);. 
8c20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8c30: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
8c40: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
8c50: 2c 20 22 3f 44 41 54 41 42 41 53 45 3f 20 46 49  , "?DATABASE? FI
8c60: 4c 45 4e 41 4d 45 22 29 3b 0a 20 20 20 20 20 20  LENAME");.      
8c70: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
8c80: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
8c90: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 44   sqlite3_open(zD
8ca0: 65 73 74 46 69 6c 65 2c 20 26 70 44 65 73 74 29  estFile, &pDest)
8cb0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
8cc0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
8cd0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
8ce0: 74 28 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f  t(interp, "canno
8cf0: 74 20 6f 70 65 6e 20 74 61 72 67 65 74 20 64 61  t open target da
8d00: 74 61 62 61 73 65 3a 20 22 2c 0a 20 20 20 20 20  tabase: ",.     
8d10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72        sqlite3_er
8d20: 72 6d 73 67 28 70 44 65 73 74 29 2c 20 28 63 68  rmsg(pDest), (ch
8d30: 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 73 71  ar*)0);.      sq
8d40: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 44 65 73  lite3_close(pDes
8d50: 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
8d60: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
8d70: 7d 0a 20 20 20 20 70 42 61 63 6b 75 70 20 3d 20  }.    pBackup = 
8d80: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 69  sqlite3_backup_i
8d90: 6e 69 74 28 70 44 65 73 74 2c 20 22 6d 61 69 6e  nit(pDest, "main
8da0: 22 2c 20 70 44 62 2d 3e 64 62 2c 20 7a 53 72 63  ", pDb->db, zSrc
8db0: 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70 42 61  Db);.    if( pBa
8dc0: 63 6b 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ckup==0 ){.     
8dd0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
8de0: 74 28 69 6e 74 65 72 70 2c 20 22 62 61 63 6b 75  t(interp, "backu
8df0: 70 20 66 61 69 6c 65 64 3a 20 22 2c 0a 20 20 20  p failed: ",.   
8e00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
8e10: 65 72 72 6d 73 67 28 70 44 65 73 74 29 2c 20 28  errmsg(pDest), (
8e20: 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
8e30: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 44  sqlite3_close(pD
8e40: 65 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  est);.      retu
8e50: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
8e60: 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 20    }.    while(  
8e70: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 61  (rc = sqlite3_ba
8e80: 63 6b 75 70 5f 73 74 65 70 28 70 42 61 63 6b 75  ckup_step(pBacku
8e90: 70 2c 31 30 30 29 29 3d 3d 53 51 4c 49 54 45 5f  p,100))==SQLITE_
8ea0: 4f 4b 20 29 7b 7d 0a 20 20 20 20 73 71 6c 69 74  OK ){}.    sqlit
8eb0: 65 33 5f 62 61 63 6b 75 70 5f 66 69 6e 69 73 68  e3_backup_finish
8ec0: 28 70 42 61 63 6b 75 70 29 3b 0a 20 20 20 20 69  (pBackup);.    i
8ed0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
8ee0: 4e 45 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  NE ){.      rc =
8ef0: 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c   TCL_OK;.    }el
8f00: 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  se{.      Tcl_Ap
8f10: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
8f20: 70 2c 20 22 62 61 63 6b 75 70 20 66 61 69 6c 65  p, "backup faile
8f30: 64 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d: ",.          
8f40: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
8f50: 70 44 65 73 74 29 2c 20 28 63 68 61 72 2a 29 30  pDest), (char*)0
8f60: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43  );.      rc = TC
8f70: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
8f80: 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
8f90: 28 70 44 65 73 74 29 3b 0a 20 20 20 20 62 72 65  (pDest);.    bre
8fa0: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
8fb0: 20 24 64 62 20 62 75 73 79 20 3f 43 41 4c 4c 42   $db busy ?CALLB
8fc0: 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ACK?.  **.  ** I
8fd0: 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20  nvoke the given 
8fe0: 63 61 6c 6c 62 61 63 6b 20 69 66 20 61 6e 20 53  callback if an S
8ff0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 74 74  QL statement att
9000: 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 0a 20 20  empts to open.  
9010: 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 64 61 74 61  ** a locked data
9020: 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  base file..  */.
9030: 20 20 63 61 73 65 20 44 42 5f 42 55 53 59 3a 20    case DB_BUSY: 
9040: 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33  {.    if( objc>3
9050: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
9060: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
9070: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 43 41 4c  p, 2, objv, "CAL
9080: 4c 42 41 43 4b 22 29 3b 0a 20 20 20 20 20 20 72  LBACK");.      r
9090: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
90a0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
90b0: 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  bjc==2 ){.      
90c0: 69 66 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29  if( pDb->zBusy )
90d0: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  {.        Tcl_Ap
90e0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
90f0: 70 2c 20 70 44 62 2d 3e 7a 42 75 73 79 2c 20 30  p, pDb->zBusy, 0
9100: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
9110: 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72  else{.      char
9120: 20 2a 7a 42 75 73 79 3b 0a 20 20 20 20 20 20 69   *zBusy;.      i
9130: 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66  nt len;.      if
9140: 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a  ( pDb->zBusy ){.
9150: 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65          Tcl_Free
9160: 28 70 44 62 2d 3e 7a 42 75 73 79 29 3b 0a 20 20  (pDb->zBusy);.  
9170: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 42 75 73      }.      zBus
9180: 79 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  y = Tcl_GetStrin
9190: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
91a0: 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69  , &len);.      i
91b0: 66 28 20 7a 42 75 73 79 20 26 26 20 6c 65 6e 3e  f( zBusy && len>
91c0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  0 ){.        pDb
91d0: 2d 3e 7a 42 75 73 79 20 3d 20 54 63 6c 5f 41 6c  ->zBusy = Tcl_Al
91e0: 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a  loc( len + 1 );.
91f0: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
9200: 44 62 2d 3e 7a 42 75 73 79 2c 20 7a 42 75 73 79  Db->zBusy, zBusy
9210: 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20  , len+1);.      
9220: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
9230: 44 62 2d 3e 7a 42 75 73 79 20 3d 20 30 3b 0a 20  Db->zBusy = 0;. 
9240: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
9250: 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20   pDb->zBusy ){. 
9260: 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65         pDb->inte
9270: 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp = interp;.   
9280: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73       sqlite3_bus
9290: 79 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64  y_handler(pDb->d
92a0: 62 2c 20 44 62 42 75 73 79 48 61 6e 64 6c 65 72  b, DbBusyHandler
92b0: 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65  , pDb);.      }e
92c0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
92d0: 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65  ite3_busy_handle
92e0: 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29  r(pDb->db, 0, 0)
92f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9300: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
9310: 20 20 2f 2a 20 20 20 20 20 24 64 62 20 63 61 63    /*     $db cac
9320: 68 65 20 66 6c 75 73 68 0a 20 20 2a 2a 20 20 20  he flush.  **   
9330: 20 20 24 64 62 20 63 61 63 68 65 20 73 69 7a 65    $db cache size
9340: 20 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6c 75   n.  **.  ** Flu
9350: 73 68 20 74 68 65 20 70 72 65 70 61 72 65 64 20  sh the prepared 
9360: 73 74 61 74 65 6d 65 6e 74 20 63 61 63 68 65 2c  statement cache,
9370: 20 6f 72 20 73 65 74 20 74 68 65 20 6d 61 78 69   or set the maxi
9380: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  mum number of.  
9390: 2a 2a 20 63 61 63 68 65 64 20 73 74 61 74 65 6d  ** cached statem
93a0: 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  ents..  */.  cas
93b0: 65 20 44 42 5f 43 41 43 48 45 3a 20 7b 0a 20 20  e DB_CACHE: {.  
93c0: 20 20 63 68 61 72 20 2a 73 75 62 43 6d 64 3b 0a    char *subCmd;.
93d0: 20 20 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 20 20      int n;..    
93e0: 69 66 28 20 6f 62 6a 63 3c 3d 32 20 29 7b 0a 20  if( objc<=2 ){. 
93f0: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
9400: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
9410: 20 6f 62 6a 76 2c 20 22 63 61 63 68 65 20 6f 70   objv, "cache op
9420: 74 69 6f 6e 20 3f 61 72 67 3f 22 29 3b 0a 20 20  tion ?arg?");.  
9430: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
9440: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
9450: 73 75 62 43 6d 64 20 3d 20 54 63 6c 5f 47 65 74  subCmd = Tcl_Get
9460: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 20 6f  StringFromObj( o
9470: 62 6a 76 5b 32 5d 2c 20 30 20 29 3b 0a 20 20 20  bjv[2], 0 );.   
9480: 20 69 66 28 20 2a 73 75 62 43 6d 64 3d 3d 27 66   if( *subCmd=='f
9490: 27 20 26 26 20 73 74 72 63 6d 70 28 73 75 62 43  ' && strcmp(subC
94a0: 6d 64 2c 22 66 6c 75 73 68 22 29 3d 3d 30 20 29  md,"flush")==0 )
94b0: 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63  {.      if( objc
94c0: 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 54  !=3 ){.        T
94d0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
94e0: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
94f0: 20 22 66 6c 75 73 68 22 29 3b 0a 20 20 20 20 20   "flush");.     
9500: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
9510: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ROR;.      }else
9520: 7b 0a 20 20 20 20 20 20 20 20 66 6c 75 73 68 53  {.        flushS
9530: 74 6d 74 43 61 63 68 65 28 20 70 44 62 20 29 3b  tmtCache( pDb );
9540: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
9550: 73 65 20 69 66 28 20 2a 73 75 62 43 6d 64 3d 3d  se if( *subCmd==
9560: 27 73 27 20 26 26 20 73 74 72 63 6d 70 28 73 75  's' && strcmp(su
9570: 62 43 6d 64 2c 22 73 69 7a 65 22 29 3d 3d 30 20  bCmd,"size")==0 
9580: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a  ){.      if( obj
9590: 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20  c!=4 ){.        
95a0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
95b0: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
95c0: 2c 20 22 73 69 7a 65 20 6e 22 29 3b 0a 20 20 20  , "size n");.   
95d0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
95e0: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c  ERROR;.      }el
95f0: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  se{.        if( 
9600: 54 43 4c 5f 45 52 52 4f 52 3d 3d 54 63 6c 5f 47  TCL_ERROR==Tcl_G
9610: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
9620: 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e  erp, objv[3], &n
9630: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  ) ){.          T
9640: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
9650: 20 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74   interp, "cannot
9660: 20 63 6f 6e 76 65 72 74 20 5c 22 22 2c 20 0a 20   convert \"", . 
9670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
9680: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
9690: 62 6a 28 6f 62 6a 76 5b 33 5d 2c 30 29 2c 20 22  bj(objv[3],0), "
96a0: 5c 22 20 74 6f 20 69 6e 74 65 67 65 72 22 2c 20  \" to integer", 
96b0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  0);.          re
96c0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
96d0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
96e0: 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 3c 30           if( n<0
96f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
9700: 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28 20  flushStmtCache( 
9710: 70 44 62 20 29 3b 0a 20 20 20 20 20 20 20 20 20  pDb );.         
9720: 20 20 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20     n = 0;.      
9730: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3e      }else if( n>
9740: 4d 41 58 5f 50 52 45 50 41 52 45 44 5f 53 54 4d  MAX_PREPARED_STM
9750: 54 53 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  TS ){.          
9760: 20 20 6e 20 3d 20 4d 41 58 5f 50 52 45 50 41 52    n = MAX_PREPAR
9770: 45 44 5f 53 54 4d 54 53 3b 0a 20 20 20 20 20 20  ED_STMTS;.      
9780: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
9790: 70 44 62 2d 3e 6d 61 78 53 74 6d 74 20 3d 20 6e  pDb->maxStmt = n
97a0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
97b0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
97c0: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
97d0: 65 73 75 6c 74 28 20 69 6e 74 65 72 70 2c 20 22  esult( interp, "
97e0: 62 61 64 20 6f 70 74 69 6f 6e 20 5c 22 22 2c 20  bad option \"", 
97f0: 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47  .          Tcl_G
9800: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
9810: 6f 62 6a 76 5b 32 5d 2c 30 29 2c 20 22 5c 22 3a  objv[2],0), "\":
9820: 20 6d 75 73 74 20 62 65 20 66 6c 75 73 68 20 6f   must be flush o
9830: 72 20 73 69 7a 65 22 2c 20 30 29 3b 0a 20 20 20  r size", 0);.   
9840: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
9850: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  ROR;.    }.    b
9860: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
9870: 20 20 20 20 24 64 62 20 63 68 61 6e 67 65 73 0a      $db changes.
9880: 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e    **.  ** Return
9890: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
98a0: 6f 77 73 20 74 68 61 74 20 77 65 72 65 20 6d 6f  ows that were mo
98b0: 64 69 66 69 65 64 2c 20 69 6e 73 65 72 74 65 64  dified, inserted
98c0: 2c 20 6f 72 20 64 65 6c 65 74 65 64 20 62 79 0a  , or deleted by.
98d0: 20 20 2a 2a 20 74 68 65 20 6d 6f 73 74 20 72 65    ** the most re
98e0: 63 65 6e 74 20 49 4e 53 45 52 54 2c 20 55 50 44  cent INSERT, UPD
98f0: 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74  ATE or DELETE st
9900: 61 74 65 6d 65 6e 74 2c 20 6e 6f 74 20 69 6e 63  atement, not inc
9910: 6c 75 64 69 6e 67 20 0a 20 20 2a 2a 20 61 6e 79  luding .  ** any
9920: 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79   changes made by
9930: 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d   trigger program
9940: 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  s..  */.  case D
9950: 42 5f 43 48 41 4e 47 45 53 3a 20 7b 0a 20 20 20  B_CHANGES: {.   
9960: 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c   Tcl_Obj *pResul
9970: 74 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  t;.    if( objc!
9980: 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =2 ){.      Tcl_
9990: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
99a0: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22  erp, 2, objv, ""
99b0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
99c0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
99d0: 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54  .    pResult = T
99e0: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_GetObjResult(
99f0: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c  interp);.    Tcl
9a00: 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52 65 73 75  _SetIntObj(pResu
9a10: 6c 74 2c 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  lt, sqlite3_chan
9a20: 67 65 73 28 70 44 62 2d 3e 64 62 29 29 3b 0a 20  ges(pDb->db));. 
9a30: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
9a40: 20 2f 2a 20 20 20 20 24 64 62 20 63 6c 6f 73 65   /*    $db close
9a50: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 68 75 74 64  .  **.  ** Shutd
9a60: 6f 77 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  own the database
9a70: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
9a80: 43 4c 4f 53 45 3a 20 7b 0a 20 20 20 20 54 63 6c  CLOSE: {.    Tcl
9a90: 5f 44 65 6c 65 74 65 43 6f 6d 6d 61 6e 64 28 69  _DeleteCommand(i
9aa0: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
9ab0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
9ac0: 5b 30 5d 2c 20 30 29 29 3b 0a 20 20 20 20 62 72  [0], 0));.    br
9ad0: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
9ae0: 20 2a 2a 20 20 20 20 20 24 64 62 20 63 6f 6c 6c   **     $db coll
9af0: 61 74 65 20 4e 41 4d 45 20 53 43 52 49 50 54 0a  ate NAME SCRIPT.
9b00: 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65 61 74 65    **.  ** Create
9b10: 20 61 20 6e 65 77 20 53 51 4c 20 63 6f 6c 6c 61   a new SQL colla
9b20: 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 63 61  tion function ca
9b30: 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 57 68 65 6e  lled NAME.  When
9b40: 65 76 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 66  ever.  ** that f
9b50: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
9b60: 64 2c 20 69 6e 76 6f 6b 65 20 53 43 52 49 50 54  d, invoke SCRIPT
9b70: 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65   to evaluate the
9b80: 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a   function..  */.
9b90: 20 20 63 61 73 65 20 44 42 5f 43 4f 4c 4c 41 54    case DB_COLLAT
9ba0: 45 3a 20 7b 0a 20 20 20 20 53 71 6c 43 6f 6c 6c  E: {.    SqlColl
9bb0: 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65 3b 0a 20  ate *pCollate;. 
9bc0: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a     char *zName;.
9bd0: 20 20 20 20 63 68 61 72 20 2a 7a 53 63 72 69 70      char *zScrip
9be0: 74 3b 0a 20 20 20 20 69 6e 74 20 6e 53 63 72 69  t;.    int nScri
9bf0: 70 74 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  pt;.    if( objc
9c00: 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=4 ){.      Tcl
9c10: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
9c20: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
9c30: 4e 41 4d 45 20 53 43 52 49 50 54 22 29 3b 0a 20  NAME SCRIPT");. 
9c40: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
9c50: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
9c60: 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74   zName = Tcl_Get
9c70: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
9c80: 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20 7a  jv[2], 0);.    z
9c90: 53 63 72 69 70 74 20 3d 20 54 63 6c 5f 47 65 74  Script = Tcl_Get
9ca0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
9cb0: 6a 76 5b 33 5d 2c 20 26 6e 53 63 72 69 70 74 29  jv[3], &nScript)
9cc0: 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 20 3d  ;.    pCollate =
9cd0: 20 28 53 71 6c 43 6f 6c 6c 61 74 65 2a 29 54 63   (SqlCollate*)Tc
9ce0: 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  l_Alloc( sizeof(
9cf0: 2a 70 43 6f 6c 6c 61 74 65 29 20 2b 20 6e 53 63  *pCollate) + nSc
9d00: 72 69 70 74 20 2b 20 31 20 29 3b 0a 20 20 20 20  ript + 1 );.    
9d10: 69 66 28 20 70 43 6f 6c 6c 61 74 65 3d 3d 30 20  if( pCollate==0 
9d20: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
9d30: 4f 52 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65  OR;.    pCollate
9d40: 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  ->interp = inter
9d50: 70 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d  p;.    pCollate-
9d60: 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 70 43  >pNext = pDb->pC
9d70: 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 70 43 6f 6c  ollate;.    pCol
9d80: 6c 61 74 65 2d 3e 7a 53 63 72 69 70 74 20 3d 20  late->zScript = 
9d90: 28 63 68 61 72 2a 29 26 70 43 6f 6c 6c 61 74 65  (char*)&pCollate
9da0: 5b 31 5d 3b 0a 20 20 20 20 70 44 62 2d 3e 70 43  [1];.    pDb->pC
9db0: 6f 6c 6c 61 74 65 20 3d 20 70 43 6f 6c 6c 61 74  ollate = pCollat
9dc0: 65 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 43  e;.    memcpy(pC
9dd0: 6f 6c 6c 61 74 65 2d 3e 7a 53 63 72 69 70 74 2c  ollate->zScript,
9de0: 20 7a 53 63 72 69 70 74 2c 20 6e 53 63 72 69 70   zScript, nScrip
9df0: 74 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 73 71  t+1);.    if( sq
9e00: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
9e10: 6c 61 74 69 6f 6e 28 70 44 62 2d 3e 64 62 2c 20  lation(pDb->db, 
9e20: 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54  zName, SQLITE_UT
9e30: 46 38 2c 20 0a 20 20 20 20 20 20 20 20 70 43 6f  F8, .        pCo
9e40: 6c 6c 61 74 65 2c 20 74 63 6c 53 71 6c 43 6f 6c  llate, tclSqlCol
9e50: 6c 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20 54  late) ){.      T
9e60: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
9e70: 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c  erp, (char *)sql
9e80: 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d  ite3_errmsg(pDb-
9e90: 3e 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49  >db), TCL_VOLATI
9ea0: 4c 45 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  LE);.      retur
9eb0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
9ec0: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
9ed0: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
9ee0: 20 24 64 62 20 63 6f 6c 6c 61 74 69 6f 6e 5f 6e   $db collation_n
9ef0: 65 65 64 65 64 20 53 43 52 49 50 54 0a 20 20 2a  eeded SCRIPT.  *
9f00: 2a 0a 20 20 2a 2a 20 43 72 65 61 74 65 20 61 20  *.  ** Create a 
9f10: 6e 65 77 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f  new SQL collatio
9f20: 6e 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65  n function calle
9f30: 64 20 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76 65  d NAME.  Wheneve
9f40: 72 0a 20 20 2a 2a 20 74 68 61 74 20 66 75 6e 63  r.  ** that func
9f50: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
9f60: 69 6e 76 6f 6b 65 20 53 43 52 49 50 54 20 74 6f  invoke SCRIPT to
9f70: 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 66 75   evaluate the fu
9f80: 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63  nction..  */.  c
9f90: 61 73 65 20 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e  ase DB_COLLATION
9fa0: 5f 4e 45 45 44 45 44 3a 20 7b 0a 20 20 20 20 69  _NEEDED: {.    i
9fb0: 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
9fc0: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
9fd0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
9fe0: 6f 62 6a 76 2c 20 22 53 43 52 49 50 54 22 29 3b  objv, "SCRIPT");
9ff0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
a000: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
a010: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 43 6f 6c     if( pDb->pCol
a020: 6c 61 74 65 4e 65 65 64 65 64 20 29 7b 0a 20 20  lateNeeded ){.  
a030: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
a040: 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c 61  ount(pDb->pColla
a050: 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 7d  teNeeded);.    }
a060: 0a 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61  .    pDb->pColla
a070: 74 65 4e 65 65 64 65 64 20 3d 20 54 63 6c 5f 44  teNeeded = Tcl_D
a080: 75 70 6c 69 63 61 74 65 4f 62 6a 28 6f 62 6a 76  uplicateObj(objv
a090: 5b 32 5d 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e  [2]);.    Tcl_In
a0a0: 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e  crRefCount(pDb->
a0b0: 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b  pCollateNeeded);
a0c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c  .    sqlite3_col
a0d0: 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28 70 44  lation_needed(pD
a0e0: 62 2d 3e 64 62 2c 20 70 44 62 2c 20 74 63 6c 43  b->db, pDb, tclC
a0f0: 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20  ollateNeeded);. 
a100: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
a110: 20 2f 2a 20 20 20 20 24 64 62 20 63 6f 6d 6d 69   /*    $db commi
a120: 74 5f 68 6f 6f 6b 20 3f 43 41 4c 4c 42 41 43 4b  t_hook ?CALLBACK
a130: 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f  ?.  **.  ** Invo
a140: 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c  ke the given cal
a150: 6c 62 61 63 6b 20 6a 75 73 74 20 62 65 66 6f 72  lback just befor
a160: 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 65 76 65  e committing eve
a170: 72 79 20 53 51 4c 20 74 72 61 6e 73 61 63 74 69  ry SQL transacti
a180: 6f 6e 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20  on..  ** If the 
a190: 63 61 6c 6c 62 61 63 6b 20 74 68 72 6f 77 73 20  callback throws 
a1a0: 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 6f 72 20  an exception or 
a1b0: 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  returns non-zero
a1c0: 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20  , then the.  ** 
a1d0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
a1e0: 62 6f 72 74 65 64 2e 20 20 49 66 20 43 41 4c 4c  borted.  If CALL
a1f0: 42 41 43 4b 20 69 73 20 61 6e 20 65 6d 70 74 79  BACK is an empty
a200: 20 73 74 72 69 6e 67 2c 20 74 68 65 20 63 61 6c   string, the cal
a210: 6c 62 61 63 6b 0a 20 20 2a 2a 20 69 73 20 64 69  lback.  ** is di
a220: 73 61 62 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 63  sabled..  */.  c
a230: 61 73 65 20 44 42 5f 43 4f 4d 4d 49 54 5f 48 4f  ase DB_COMMIT_HO
a240: 4f 4b 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62  OK: {.    if( ob
a250: 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63  jc>3 ){.      Tc
a260: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
a270: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
a280: 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20  "?CALLBACK?");. 
a290: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
a2a0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65  ERROR;.    }else
a2b0: 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a   if( objc==2 ){.
a2c0: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
a2d0: 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  Commit ){.      
a2e0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
a2f0: 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e  lt(interp, pDb->
a300: 7a 43 6f 6d 6d 69 74 2c 20 30 29 3b 0a 20 20 20  zCommit, 0);.   
a310: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
a320: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6d        char *zCom
a330: 6d 69 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c  mit;.      int l
a340: 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44  en;.      if( pD
a350: 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  b->zCommit ){.  
a360: 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70        Tcl_Free(p
a370: 44 62 2d 3e 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20  Db->zCommit);.  
a380: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 43 6f 6d      }.      zCom
a390: 6d 69 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  mit = Tcl_GetStr
a3a0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
a3b0: 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20  2], &len);.     
a3c0: 20 69 66 28 20 7a 43 6f 6d 6d 69 74 20 26 26 20   if( zCommit && 
a3d0: 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  len>0 ){.       
a3e0: 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20   pDb->zCommit = 
a3f0: 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b  Tcl_Alloc( len +
a400: 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65   1 );.        me
a410: 6d 63 70 79 28 70 44 62 2d 3e 7a 43 6f 6d 6d 69  mcpy(pDb->zCommi
a420: 74 2c 20 7a 43 6f 6d 6d 69 74 2c 20 6c 65 6e 2b  t, zCommit, len+
a430: 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
a440: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 43  .        pDb->zC
a450: 6f 6d 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  ommit = 0;.     
a460: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44 62   }.      if( pDb
a470: 2d 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20  ->zCommit ){.   
a480: 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70       pDb->interp
a490: 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20   = interp;.     
a4a0: 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69     sqlite3_commi
a4b0: 74 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20  t_hook(pDb->db, 
a4c0: 44 62 43 6f 6d 6d 69 74 48 61 6e 64 6c 65 72 2c  DbCommitHandler,
a4d0: 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c   pDb);.      }el
a4e0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
a4f0: 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28  te3_commit_hook(
a500: 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a  pDb->db, 0, 0);.
a510: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
a520: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
a530: 2f 2a 20 20 20 20 24 64 62 20 63 6f 6d 70 6c 65  /*    $db comple
a540: 74 65 20 53 51 4c 0a 20 20 2a 2a 0a 20 20 2a 2a  te SQL.  **.  **
a550: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
a560: 53 51 4c 20 69 73 20 61 20 63 6f 6d 70 6c 65 74  SQL is a complet
a570: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  e SQL statement.
a580: 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69    Return FALSE i
a590: 66 0a 20 20 2a 2a 20 61 64 64 69 74 69 6f 6e 61  f.  ** additiona
a5a0: 6c 20 6c 69 6e 65 73 20 6f 66 20 69 6e 70 75 74  l lines of input
a5b0: 20 61 72 65 20 6e 65 65 64 65 64 2e 20 20 54 68   are needed.  Th
a5c0: 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  is is similar to
a5d0: 20 74 68 65 0a 20 20 2a 2a 20 62 75 69 6c 74 2d   the.  ** built-
a5e0: 69 6e 20 22 69 6e 66 6f 20 63 6f 6d 70 6c 65 74  in "info complet
a5f0: 65 22 20 63 6f 6d 6d 61 6e 64 20 6f 66 20 54 63  e" command of Tc
a600: 6c 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  l..  */.  case D
a610: 42 5f 43 4f 4d 50 4c 45 54 45 3a 20 7b 0a 23 69  B_COMPLETE: {.#i
a620: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
a630: 54 5f 43 4f 4d 50 4c 45 54 45 0a 20 20 20 20 54  T_COMPLETE.    T
a640: 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b  cl_Obj *pResult;
a650: 0a 20 20 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c  .    int isCompl
a660: 65 74 65 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a  ete;.    if( obj
a670: 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=3 ){.      Tc
a680: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
a690: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
a6a0: 22 53 51 4c 22 29 3b 0a 20 20 20 20 20 20 72 65  "SQL");.      re
a6b0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
a6c0: 20 20 20 20 7d 0a 20 20 20 20 69 73 43 6f 6d 70      }.    isComp
a6d0: 6c 65 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63  lete = sqlite3_c
a6e0: 6f 6d 70 6c 65 74 65 28 20 54 63 6c 5f 47 65 74  omplete( Tcl_Get
a6f0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
a700: 6a 76 5b 32 5d 2c 20 30 29 20 29 3b 0a 20 20 20  jv[2], 0) );.   
a710: 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47   pResult = Tcl_G
a720: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
a730: 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  rp);.    Tcl_Set
a740: 42 6f 6f 6c 65 61 6e 4f 62 6a 28 70 52 65 73 75  BooleanObj(pResu
a750: 6c 74 2c 20 69 73 43 6f 6d 70 6c 65 74 65 29 3b  lt, isComplete);
a760: 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61  .#endif.    brea
a770: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
a780: 24 64 62 20 63 6f 70 79 20 63 6f 6e 66 6c 69 63  $db copy conflic
a790: 74 2d 61 6c 67 6f 72 69 74 68 6d 20 74 61 62 6c  t-algorithm tabl
a7a0: 65 20 66 69 6c 65 6e 61 6d 65 20 3f 53 45 50 41  e filename ?SEPA
a7b0: 52 41 54 4f 52 3f 20 3f 4e 55 4c 4c 49 4e 44 49  RATOR? ?NULLINDI
a7c0: 43 41 54 4f 52 3f 0a 20 20 2a 2a 0a 20 20 2a 2a  CATOR?.  **.  **
a7d0: 20 43 6f 70 79 20 64 61 74 61 20 69 6e 74 6f 20   Copy data into 
a7e0: 74 61 62 6c 65 20 66 72 6f 6d 20 66 69 6c 65 6e  table from filen
a7f0: 61 6d 65 2c 20 6f 70 74 69 6f 6e 61 6c 6c 79 20  ame, optionally 
a800: 75 73 69 6e 67 20 53 45 50 41 52 41 54 4f 52 0a  using SEPARATOR.
a810: 20 20 2a 2a 20 61 73 20 63 6f 6c 75 6d 6e 20 73    ** as column s
a820: 65 70 61 72 61 74 6f 72 73 2e 20 20 49 66 20 61  eparators.  If a
a830: 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73   column contains
a840: 20 61 20 6e 75 6c 6c 20 73 74 72 69 6e 67 2c 20   a null string, 
a850: 6f 72 20 74 68 65 0a 20 20 2a 2a 20 76 61 6c 75  or the.  ** valu
a860: 65 20 6f 66 20 4e 55 4c 4c 49 4e 44 49 43 41 54  e of NULLINDICAT
a870: 4f 52 2c 20 61 20 4e 55 4c 4c 20 69 73 20 69 6e  OR, a NULL is in
a880: 73 65 72 74 65 64 20 66 6f 72 20 74 68 65 20 63  serted for the c
a890: 6f 6c 75 6d 6e 2e 0a 20 20 2a 2a 20 63 6f 6e 66  olumn..  ** conf
a8a0: 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20 69  lict-algorithm i
a8b0: 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 71 6c  s one of the sql
a8c0: 69 74 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67  ite conflict alg
a8d0: 6f 72 69 74 68 6d 73 3a 0a 20 20 2a 2a 20 20 20  orithms:.  **   
a8e0: 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 62 6f 72 74   rollback, abort
a8f0: 2c 20 66 61 69 6c 2c 20 69 67 6e 6f 72 65 2c 20  , fail, ignore, 
a900: 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 4f 6e 20  replace.  ** On 
a910: 73 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20  success, return 
a920: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 69  the number of li
a930: 6e 65 73 20 70 72 6f 63 65 73 73 65 64 2c 20 6e  nes processed, n
a940: 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 73  ot necessarily s
a950: 61 6d 65 0a 20 20 2a 2a 20 61 73 20 27 64 62 20  ame.  ** as 'db 
a960: 63 68 61 6e 67 65 73 27 20 64 75 65 20 74 6f 20  changes' due to 
a970: 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74  conflict-algorit
a980: 68 6d 20 73 65 6c 65 63 74 65 64 2e 0a 20 20 2a  hm selected..  *
a990: 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65  *.  ** This code
a9a0: 20 69 73 20 62 61 73 69 63 61 6c 6c 79 20 61 6e   is basically an
a9b0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2f   implementation/
a9c0: 65 6e 68 61 6e 63 65 6d 65 6e 74 20 6f 66 0a 20  enhancement of. 
a9d0: 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 20   ** the sqlite3 
a9e0: 73 68 65 6c 6c 2e 63 20 22 2e 69 6d 70 6f 72 74  shell.c ".import
a9f0: 22 20 63 6f 6d 6d 61 6e 64 2e 0a 20 20 2a 2a 0a  " command..  **.
aa00: 20 20 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e    ** This comman
aa10: 64 20 75 73 61 67 65 20 69 73 20 65 71 75 69 76  d usage is equiv
aa20: 61 6c 65 6e 74 20 74 6f 20 74 68 65 20 73 71 6c  alent to the sql
aa30: 69 74 65 32 2e 78 20 43 4f 50 59 20 73 74 61 74  ite2.x COPY stat
aa40: 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 77 68 69 63  ement,.  ** whic
aa50: 68 20 69 6d 70 6f 72 74 73 20 66 69 6c 65 20 64  h imports file d
aa60: 61 74 61 20 69 6e 74 6f 20 61 20 74 61 62 6c 65  ata into a table
aa70: 20 75 73 69 6e 67 20 74 68 65 20 50 6f 73 74 67   using the Postg
aa80: 72 65 53 51 4c 20 43 4f 50 59 20 66 69 6c 65 20  reSQL COPY file 
aa90: 66 6f 72 6d 61 74 3a 0a 20 20 2a 2a 20 20 20 24  format:.  **   $
aaa0: 64 62 20 63 6f 70 79 20 24 63 6f 6e 66 6c 69 74  db copy $conflit
aab0: 5f 61 6c 67 6f 20 24 74 61 62 6c 65 5f 6e 61 6d  _algo $table_nam
aac0: 65 20 24 66 69 6c 65 6e 61 6d 65 20 5c 74 20 5c  e $filename \t \
aad0: 5c 4e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  \N.  */.  case D
aae0: 42 5f 43 4f 50 59 3a 20 7b 0a 20 20 20 20 63 68  B_COPY: {.    ch
aaf0: 61 72 20 2a 7a 54 61 62 6c 65 3b 20 20 20 20 20  ar *zTable;     
ab00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73            /* Ins
ab10: 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68  ert data into th
ab20: 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  is table */.    
ab30: 63 68 61 72 20 2a 7a 46 69 6c 65 3b 20 20 20 20  char *zFile;    
ab40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
ab50: 68 65 20 66 69 6c 65 20 66 72 6f 6d 20 77 68 69  he file from whi
ab60: 63 68 20 74 6f 20 65 78 74 72 61 63 74 20 64 61  ch to extract da
ab70: 74 61 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  ta */.    char *
ab80: 7a 43 6f 6e 66 6c 69 63 74 3b 20 20 20 20 20 20  zConflict;      
ab90: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
aba0: 66 6c 69 63 74 20 61 6c 67 6f 72 69 74 68 6d 20  flict algorithm 
abb0: 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 73 71  to use */.    sq
abc0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
abd0: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73  t;        /* A s
abe0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
abf0: 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20  int nCol;       
ac00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
ac10: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
ac20: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   in the table */
ac30: 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 20  .    int nByte; 
ac40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac50: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
ac60: 74 65 73 20 69 6e 20 61 6e 20 53 51 4c 20 73 74  tes in an SQL st
ac70: 72 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ring */.    int 
ac80: 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
ac90: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
aca0: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 20 20  counters */.    
acb0: 69 6e 74 20 6e 53 65 70 3b 20 20 20 20 20 20 20  int nSep;       
acc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
acd0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
ace0: 6e 20 7a 53 65 70 5b 5d 20 2a 2f 0a 20 20 20 20  n zSep[] */.    
acf0: 69 6e 74 20 6e 4e 75 6c 6c 3b 20 20 20 20 20 20  int nNull;      
ad00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
ad10: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
ad20: 6e 20 7a 4e 75 6c 6c 5b 5d 20 2a 2f 0a 20 20 20  n zNull[] */.   
ad30: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20   char *zSql;    
ad40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ad50: 41 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  An SQL statement
ad60: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c   */.    char *zL
ad70: 69 6e 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ine;            
ad80: 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
ad90: 6c 69 6e 65 20 6f 66 20 69 6e 70 75 74 20 66 72  line of input fr
ada0: 6f 6d 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20  om the file */. 
adb0: 20 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 3b     char **azCol;
adc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
add0: 2a 20 7a 4c 69 6e 65 5b 5d 20 62 72 6f 6b 65 6e  * zLine[] broken
ade0: 20 75 70 20 69 6e 74 6f 20 63 6f 6c 75 6d 6e 73   up into columns
adf0: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 43   */.    char *zC
ae00: 6f 6d 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20  ommit;          
ae10: 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 63 6f      /* How to co
ae20: 6d 6d 69 74 20 63 68 61 6e 67 65 73 20 2a 2f 0a  mmit changes */.
ae30: 20 20 20 20 46 49 4c 45 20 2a 69 6e 3b 20 20 20      FILE *in;   
ae40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae50: 2f 2a 20 54 68 65 20 69 6e 70 75 74 20 66 69 6c  /* The input fil
ae60: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 69 6e  e */.    int lin
ae70: 65 6e 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20  eno = 0;        
ae80: 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d       /* Line num
ae90: 62 65 72 20 6f 66 20 69 6e 70 75 74 20 66 69 6c  ber of input fil
aea0: 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 7a 4c  e */.    char zL
aeb0: 69 6e 65 4e 75 6d 5b 38 30 5d 3b 20 20 20 20 20  ineNum[80];     
aec0: 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d       /* Line num
aed0: 62 65 72 20 70 72 69 6e 74 20 62 75 66 66 65 72  ber print buffer
aee0: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20   */.    Tcl_Obj 
aef0: 2a 70 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20  *pResult;       
af00: 20 20 20 20 2f 2a 20 69 6e 74 65 72 70 20 72 65      /* interp re
af10: 73 75 6c 74 20 2a 2f 0a 0a 20 20 20 20 63 68 61  sult */..    cha
af20: 72 20 2a 7a 53 65 70 3b 0a 20 20 20 20 63 68 61  r *zSep;.    cha
af30: 72 20 2a 7a 4e 75 6c 6c 3b 0a 20 20 20 20 69 66  r *zNull;.    if
af40: 28 20 6f 62 6a 63 3c 35 20 7c 7c 20 6f 62 6a 63  ( objc<5 || objc
af50: 3e 37 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  >7 ){.      Tcl_
af60: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
af70: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 0a 20  erp, 2, objv, . 
af80: 20 20 20 20 20 20 20 20 22 43 4f 4e 46 4c 49 43          "CONFLIC
af90: 54 2d 41 4c 47 4f 52 49 54 48 4d 20 54 41 42 4c  T-ALGORITHM TABL
afa0: 45 20 46 49 4c 45 4e 41 4d 45 20 3f 53 45 50 41  E FILENAME ?SEPA
afb0: 52 41 54 4f 52 3f 20 3f 4e 55 4c 4c 49 4e 44 49  RATOR? ?NULLINDI
afc0: 43 41 54 4f 52 3f 22 29 3b 0a 20 20 20 20 20 20  CATOR?");.      
afd0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
afe0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
aff0: 6f 62 6a 63 3e 3d 36 20 29 7b 0a 20 20 20 20 20  objc>=6 ){.     
b000: 20 7a 53 65 70 20 3d 20 54 63 6c 5f 47 65 74 53   zSep = Tcl_GetS
b010: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
b020: 76 5b 35 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 65  v[5], 0);.    }e
b030: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 53 65 70 20  lse{.      zSep 
b040: 3d 20 22 5c 74 22 3b 0a 20 20 20 20 7d 0a 20 20  = "\t";.    }.  
b050: 20 20 69 66 28 20 6f 62 6a 63 3e 3d 37 20 29 7b    if( objc>=7 ){
b060: 0a 20 20 20 20 20 20 7a 4e 75 6c 6c 20 3d 20 54  .      zNull = T
b070: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
b080: 4f 62 6a 28 6f 62 6a 76 5b 36 5d 2c 20 30 29 3b  Obj(objv[6], 0);
b090: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
b0a0: 20 20 7a 4e 75 6c 6c 20 3d 20 22 22 3b 0a 20 20    zNull = "";.  
b0b0: 20 20 7d 0a 20 20 20 20 7a 43 6f 6e 66 6c 69 63    }.    zConflic
b0c0: 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  t = Tcl_GetStrin
b0d0: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
b0e0: 2c 20 30 29 3b 0a 20 20 20 20 7a 54 61 62 6c 65  , 0);.    zTable
b0f0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
b100: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c  FromObj(objv[3],
b110: 20 30 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d   0);.    zFile =
b120: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
b130: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 34 5d 2c 20 30  omObj(objv[4], 0
b140: 29 3b 0a 20 20 20 20 6e 53 65 70 20 3d 20 73 74  );.    nSep = st
b150: 72 6c 65 6e 33 30 28 7a 53 65 70 29 3b 0a 20 20  rlen30(zSep);.  
b160: 20 20 6e 4e 75 6c 6c 20 3d 20 73 74 72 6c 65 6e    nNull = strlen
b170: 33 30 28 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 69  30(zNull);.    i
b180: 66 28 20 6e 53 65 70 3d 3d 30 20 29 7b 0a 20 20  f( nSep==0 ){.  
b190: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
b1a0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72  sult(interp,"Err
b1b0: 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20 73 65 70  or: non-null sep
b1c0: 61 72 61 74 6f 72 20 72 65 71 75 69 72 65 64 20  arator required 
b1d0: 66 6f 72 20 63 6f 70 79 22 2c 30 29 3b 0a 20 20  for copy",0);.  
b1e0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
b1f0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
b200: 69 66 28 73 74 72 63 6d 70 28 7a 43 6f 6e 66 6c  if(strcmp(zConfl
b210: 69 63 74 2c 20 22 72 6f 6c 6c 62 61 63 6b 22 29  ict, "rollback")
b220: 20 21 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20   != 0 &&.       
b230: 73 74 72 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74  strcmp(zConflict
b240: 2c 20 22 61 62 6f 72 74 22 20 20 20 29 20 21 3d  , "abort"   ) !=
b250: 20 30 20 26 26 0a 20 20 20 20 20 20 20 73 74 72   0 &&.       str
b260: 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22  cmp(zConflict, "
b270: 66 61 69 6c 22 20 20 20 20 29 20 21 3d 20 30 20  fail"    ) != 0 
b280: 26 26 0a 20 20 20 20 20 20 20 73 74 72 63 6d 70  &&.       strcmp
b290: 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 69 67 6e  (zConflict, "ign
b2a0: 6f 72 65 22 20 20 29 20 21 3d 20 30 20 26 26 0a  ore"  ) != 0 &&.
b2b0: 20 20 20 20 20 20 20 73 74 72 63 6d 70 28 7a 43         strcmp(zC
b2c0: 6f 6e 66 6c 69 63 74 2c 20 22 72 65 70 6c 61 63  onflict, "replac
b2d0: 65 22 20 29 20 21 3d 20 30 20 29 20 7b 0a 20 20  e" ) != 0 ) {.  
b2e0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
b2f0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72  sult(interp, "Er
b300: 72 6f 72 3a 20 5c 22 22 2c 20 7a 43 6f 6e 66 6c  ror: \"", zConfl
b310: 69 63 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ict, .          
b320: 20 20 22 5c 22 2c 20 63 6f 6e 66 6c 69 63 74 2d    "\", conflict-
b330: 61 6c 67 6f 72 69 74 68 6d 20 6d 75 73 74 20 62  algorithm must b
b340: 65 20 6f 6e 65 20 6f 66 3a 20 72 6f 6c 6c 62 61  e one of: rollba
b350: 63 6b 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20  ck, ".          
b360: 20 20 22 61 62 6f 72 74 2c 20 66 61 69 6c 2c 20    "abort, fail, 
b370: 69 67 6e 6f 72 65 2c 20 6f 72 20 72 65 70 6c 61  ignore, or repla
b380: 63 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  ce", 0);.      r
b390: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
b3a0: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20  .    }.    zSql 
b3b0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
b3c0: 66 28 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  f("SELECT * FROM
b3d0: 20 27 25 71 27 22 2c 20 7a 54 61 62 6c 65 29 3b   '%q'", zTable);
b3e0: 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  .    if( zSql==0
b3f0: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
b400: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
b410: 70 2c 20 22 45 72 72 6f 72 3a 20 6e 6f 20 73 75  p, "Error: no su
b420: 63 68 20 74 61 62 6c 65 3a 20 22 2c 20 7a 54 61  ch table: ", zTa
b430: 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  ble, 0);.      r
b440: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
b450: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65  .    }.    nByte
b460: 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c   = strlen30(zSql
b470: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
b480: 74 65 33 5f 70 72 65 70 61 72 65 28 70 44 62 2d  te3_prepare(pDb-
b490: 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  >db, zSql, -1, &
b4a0: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73  pStmt, 0);.    s
b4b0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
b4c0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
b4d0: 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
b4e0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
b4f0: 22 45 72 72 6f 72 3a 20 22 2c 20 73 71 6c 69 74  "Error: ", sqlit
b500: 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64  e3_errmsg(pDb->d
b510: 62 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 6e 43  b), 0);.      nC
b520: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ol = 0;.    }els
b530: 65 7b 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20  e{.      nCol = 
b540: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
b550: 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20  ount(pStmt);.   
b560: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
b570: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
b580: 20 20 20 20 69 66 28 20 6e 43 6f 6c 3d 3d 30 20      if( nCol==0 
b590: 29 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ) {.      return
b5a0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
b5b0: 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20 6d 61 6c  }.    zSql = mal
b5c0: 6c 6f 63 28 20 6e 42 79 74 65 20 2b 20 35 30 20  loc( nByte + 50 
b5d0: 2b 20 6e 43 6f 6c 2a 32 20 29 3b 0a 20 20 20 20  + nCol*2 );.    
b5e0: 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20 7b 0a  if( zSql==0 ) {.
b5f0: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
b600: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
b610: 45 72 72 6f 72 3a 20 63 61 6e 27 74 20 6d 61 6c  Error: can't mal
b620: 6c 6f 63 28 29 22 2c 20 30 29 3b 0a 20 20 20 20  loc()", 0);.    
b630: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
b640: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  OR;.    }.    sq
b650: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
b660: 42 79 74 65 2b 35 30 2c 20 7a 53 71 6c 2c 20 22  Byte+50, zSql, "
b670: 49 4e 53 45 52 54 20 4f 52 20 25 71 20 49 4e 54  INSERT OR %q INT
b680: 4f 20 27 25 71 27 20 56 41 4c 55 45 53 28 3f 22  O '%q' VALUES(?"
b690: 2c 0a 20 20 20 20 20 20 20 20 20 7a 43 6f 6e 66  ,.         zConf
b6a0: 6c 69 63 74 2c 20 7a 54 61 62 6c 65 29 3b 0a 20  lict, zTable);. 
b6b0: 20 20 20 6a 20 3d 20 73 74 72 6c 65 6e 33 30 28     j = strlen30(
b6c0: 7a 53 71 6c 29 3b 0a 20 20 20 20 66 6f 72 28 69  zSql);.    for(i
b6d0: 3d 31 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =1; i<nCol; i++)
b6e0: 7b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b  {.      zSql[j++
b6f0: 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 7a  ] = ',';.      z
b700: 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 3f 27 3b 0a  Sql[j++] = '?';.
b710: 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 5b 6a      }.    zSql[j
b720: 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20 7a  ++] = ')';.    z
b730: 53 71 6c 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20  Sql[j] = 0;.    
b740: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
b750: 70 61 72 65 28 70 44 62 2d 3e 64 62 2c 20 7a 53  pare(pDb->db, zS
b760: 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
b770: 30 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 53 71  0);.    free(zSq
b780: 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  l);.    if( rc )
b790: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
b7a0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
b7b0: 20 22 45 72 72 6f 72 3a 20 22 2c 20 73 71 6c 69   "Error: ", sqli
b7c0: 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
b7d0: 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  db), 0);.      s
b7e0: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
b7f0: 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 65  pStmt);.      re
b800: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
b810: 20 20 20 20 7d 0a 20 20 20 20 69 6e 20 3d 20 66      }.    in = f
b820: 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 22 72 62 22  open(zFile, "rb"
b830: 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 3d 3d 30  );.    if( in==0
b840: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
b850: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
b860: 70 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f  p, "Error: canno
b870: 74 20 6f 70 65 6e 20 66 69 6c 65 3a 20 22 2c 20  t open file: ", 
b880: 7a 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 20 20  zFile, NULL);.  
b890: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
b8a0: 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
b8b0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
b8c0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ROR;.    }.    a
b8d0: 7a 43 6f 6c 20 3d 20 6d 61 6c 6c 6f 63 28 20 73  zCol = malloc( s
b8e0: 69 7a 65 6f 66 28 61 7a 43 6f 6c 5b 30 5d 29 2a  izeof(azCol[0])*
b8f0: 28 6e 43 6f 6c 2b 31 29 20 29 3b 0a 20 20 20 20  (nCol+1) );.    
b900: 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 20 7b  if( azCol==0 ) {
b910: 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
b920: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
b930: 22 45 72 72 6f 72 3a 20 63 61 6e 27 74 20 6d 61  "Error: can't ma
b940: 6c 6c 6f 63 28 29 22 2c 20 30 29 3b 0a 20 20 20  lloc()", 0);.   
b950: 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20     fclose(in);. 
b960: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
b970: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
b980: 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f 65   (void)sqlite3_e
b990: 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 22 42 45  xec(pDb->db, "BE
b9a0: 47 49 4e 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  GIN", 0, 0, 0);.
b9b0: 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 43      zCommit = "C
b9c0: 4f 4d 4d 49 54 22 3b 0a 20 20 20 20 77 68 69 6c  OMMIT";.    whil
b9d0: 65 28 20 28 7a 4c 69 6e 65 20 3d 20 6c 6f 63 61  e( (zLine = loca
b9e0: 6c 5f 67 65 74 6c 69 6e 65 28 30 2c 20 69 6e 29  l_getline(0, in)
b9f0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68  )!=0 ){.      ch
ba00: 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 69 20 3d  ar *z;.      i =
ba10: 20 30 3b 0a 20 20 20 20 20 20 6c 69 6e 65 6e 6f   0;.      lineno
ba20: 2b 2b 3b 0a 20 20 20 20 20 20 61 7a 43 6f 6c 5b  ++;.      azCol[
ba30: 30 5d 20 3d 20 7a 4c 69 6e 65 3b 0a 20 20 20 20  0] = zLine;.    
ba40: 20 20 66 6f 72 28 69 3d 30 2c 20 7a 3d 7a 4c 69    for(i=0, z=zLi
ba50: 6e 65 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20 20  ne; *z; z++){.  
ba60: 20 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d 7a 53        if( *z==zS
ba70: 65 70 5b 30 5d 20 26 26 20 73 74 72 6e 63 6d 70  ep[0] && strncmp
ba80: 28 7a 2c 20 7a 53 65 70 2c 20 6e 53 65 70 29 3d  (z, zSep, nSep)=
ba90: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
baa0: 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  *z = 0;.        
bab0: 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20    i++;.         
bac0: 20 69 66 28 20 69 3c 6e 43 6f 6c 20 29 7b 0a 20   if( i<nCol ){. 
bad0: 20 20 20 20 20 20 20 20 20 20 20 61 7a 43 6f 6c             azCol
bae0: 5b 69 5d 20 3d 20 26 7a 5b 6e 53 65 70 5d 3b 0a  [i] = &z[nSep];.
baf0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 20 2b 3d              z +=
bb00: 20 6e 53 65 70 2d 31 3b 0a 20 20 20 20 20 20 20   nSep-1;.       
bb10: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
bb20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
bb30: 20 69 2b 31 21 3d 6e 43 6f 6c 20 29 7b 0a 20 20   i+1!=nCol ){.  
bb40: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72        char *zErr
bb50: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 45  ;.        int nE
bb60: 72 72 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 46  rr = strlen30(zF
bb70: 69 6c 65 29 20 2b 20 32 30 30 3b 0a 20 20 20 20  ile) + 200;.    
bb80: 20 20 20 20 7a 45 72 72 20 3d 20 6d 61 6c 6c 6f      zErr = mallo
bb90: 63 28 6e 45 72 72 29 3b 0a 20 20 20 20 20 20 20  c(nErr);.       
bba0: 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20   if( zErr ){.   
bbb0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
bbc0: 6e 70 72 69 6e 74 66 28 6e 45 72 72 2c 20 7a 45  nprintf(nErr, zE
bbd0: 72 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rr,.            
bbe0: 20 22 45 72 72 6f 72 3a 20 25 73 20 6c 69 6e 65   "Error: %s line
bbf0: 20 25 64 3a 20 65 78 70 65 63 74 65 64 20 25 64   %d: expected %d
bc00: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61   columns of data
bc10: 20 62 75 74 20 66 6f 75 6e 64 20 25 64 22 2c 0a   but found %d",.
bc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 46 69               zFi
bc30: 6c 65 2c 20 6c 69 6e 65 6e 6f 2c 20 6e 43 6f 6c  le, lineno, nCol
bc40: 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  , i+1);.        
bc50: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
bc60: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72 2c  lt(interp, zErr,
bc70: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66   0);.          f
bc80: 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 20 20 20  ree(zErr);.     
bc90: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 43 6f     }.        zCo
bca0: 6d 6d 69 74 20 3d 20 22 52 4f 4c 4c 42 41 43 4b  mmit = "ROLLBACK
bcb0: 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ";.        break
bcc0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
bcd0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
bce0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 2f   i++){.        /
bcf0: 2a 20 63 68 65 63 6b 20 66 6f 72 20 6e 75 6c 6c  * check for null
bd00: 20 64 61 74 61 2c 20 69 66 20 73 6f 2c 20 62 69   data, if so, bi
bd10: 6e 64 20 61 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20  nd as null */.  
bd20: 20 20 20 20 20 20 69 66 28 20 28 6e 4e 75 6c 6c        if( (nNull
bd30: 3e 30 20 26 26 20 73 74 72 63 6d 70 28 61 7a 43  >0 && strcmp(azC
bd40: 6f 6c 5b 69 5d 2c 20 7a 4e 75 6c 6c 29 3d 3d 30  ol[i], zNull)==0
bd50: 29 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73  ).          || s
bd60: 74 72 6c 65 6e 33 30 28 61 7a 43 6f 6c 5b 69 5d  trlen30(azCol[i]
bd70: 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 29 7b  )==0 .        ){
bd80: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
bd90: 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74  e3_bind_null(pSt
bda0: 6d 74 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20  mt, i+1);.      
bdb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
bdc0: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
bdd0: 74 65 78 74 28 70 53 74 6d 74 2c 20 69 2b 31 2c  text(pStmt, i+1,
bde0: 20 61 7a 43 6f 6c 5b 69 5d 2c 20 2d 31 2c 20 53   azCol[i], -1, S
bdf0: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
be00: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
be10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
be20: 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  tep(pStmt);.    
be30: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
be40: 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20  eset(pStmt);.   
be50: 20 20 20 66 72 65 65 28 7a 4c 69 6e 65 29 3b 0a     free(zLine);.
be60: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
be70: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
be80: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
be90: 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f  ult(interp,"Erro
bea0: 72 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  r: ", sqlite3_er
beb0: 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30  rmsg(pDb->db), 0
bec0: 29 3b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6d 6d  );.        zComm
bed0: 69 74 20 3d 20 22 52 4f 4c 4c 42 41 43 4b 22 3b  it = "ROLLBACK";
bee0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
bef0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
bf00: 20 20 66 72 65 65 28 61 7a 43 6f 6c 29 3b 0a 20    free(azCol);. 
bf10: 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20     fclose(in);. 
bf20: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
bf30: 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
bf40: 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f 65 78  (void)sqlite3_ex
bf50: 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a 43 6f 6d  ec(pDb->db, zCom
bf60: 6d 69 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 0a  mit, 0, 0, 0);..
bf70: 20 20 20 20 69 66 28 20 7a 43 6f 6d 6d 69 74 5b      if( zCommit[
bf80: 30 5d 20 3d 3d 20 27 43 27 20 29 7b 0a 20 20 20  0] == 'C' ){.   
bf90: 20 20 20 2f 2a 20 73 75 63 63 65 73 73 2c 20 73     /* success, s
bfa0: 65 74 20 72 65 73 75 6c 74 20 61 73 20 6e 75 6d  et result as num
bfb0: 62 65 72 20 6f 66 20 6c 69 6e 65 73 20 70 72 6f  ber of lines pro
bfc0: 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20 20 20  cessed */.      
bfd0: 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65  pResult = Tcl_Ge
bfe0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
bff0: 70 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65  p);.      Tcl_Se
c000: 74 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c  tIntObj(pResult,
c010: 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20   lineno);.      
c020: 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20  rc = TCL_OK;.   
c030: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
c040: 20 66 61 69 6c 75 72 65 2c 20 61 70 70 65 6e 64   failure, append
c050: 20 6c 69 6e 65 6e 6f 20 77 68 65 72 65 20 66 61   lineno where fa
c060: 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 73 71  iled */.      sq
c070: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
c080: 69 7a 65 6f 66 28 7a 4c 69 6e 65 4e 75 6d 29 2c  izeof(zLineNum),
c090: 20 7a 4c 69 6e 65 4e 75 6d 2c 22 25 64 22 2c 6c   zLineNum,"%d",l
c0a0: 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20 54 63  ineno);.      Tc
c0b0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
c0c0: 6e 74 65 72 70 2c 22 2c 20 66 61 69 6c 65 64 20  nterp,", failed 
c0d0: 77 68 69 6c 65 20 70 72 6f 63 65 73 73 69 6e 67  while processing
c0e0: 20 6c 69 6e 65 3a 20 22 2c 7a 4c 69 6e 65 4e 75   line: ",zLineNu
c0f0: 6d 2c 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  m,0);.      rc =
c100: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
c110: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
c120: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24  ..  /*.  **    $
c130: 64 62 20 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65  db enable_load_e
c140: 78 74 65 6e 73 69 6f 6e 20 42 4f 4f 4c 45 41 4e  xtension BOOLEAN
c150: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 75 72 6e 20  .  **.  ** Turn 
c160: 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 20 6c 6f  the extension lo
c170: 61 64 69 6e 67 20 66 65 61 74 75 72 65 20 6f 6e  ading feature on
c180: 20 6f 72 20 6f 66 66 2e 20 20 49 74 20 69 66 20   or off.  It if 
c190: 6f 66 66 20 62 79 0a 20 20 2a 2a 20 64 65 66 61  off by.  ** defa
c1a0: 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ult..  */.  case
c1b0: 20 44 42 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f   DB_ENABLE_LOAD_
c1c0: 45 58 54 45 4e 53 49 4f 4e 3a 20 7b 0a 23 69 66  EXTENSION: {.#if
c1d0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
c1e0: 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
c1f0: 20 20 20 20 69 6e 74 20 6f 6e 6f 66 66 3b 0a 20      int onoff;. 
c200: 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29     if( objc!=3 )
c210: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
c220: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
c230: 20 32 2c 20 6f 62 6a 76 2c 20 22 42 4f 4f 4c 45   2, objv, "BOOLE
c240: 41 4e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  AN");.      retu
c250: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
c260: 20 20 7d 0a 20 20 20 20 69 66 28 20 54 63 6c 5f    }.    if( Tcl_
c270: 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62  GetBooleanFromOb
c280: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
c290: 5d 2c 20 26 6f 6e 6f 66 66 29 20 29 7b 0a 20 20  ], &onoff) ){.  
c2a0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
c2b0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
c2c0: 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c  sqlite3_enable_l
c2d0: 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 70 44  oad_extension(pD
c2e0: 62 2d 3e 64 62 2c 20 6f 6e 6f 66 66 29 3b 0a 20  b->db, onoff);. 
c2f0: 20 20 20 62 72 65 61 6b 3b 0a 23 65 6c 73 65 0a     break;.#else.
c300: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
c310: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 65 78  sult(interp, "ex
c320: 74 65 6e 73 69 6f 6e 20 6c 6f 61 64 69 6e 67 20  tension loading 
c330: 69 73 20 74 75 72 6e 65 64 20 6f 66 66 20 61 74  is turned off at
c340: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 22 2c 0a   compile-time",.
c350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c360: 20 20 20 20 20 30 29 3b 0a 20 20 20 20 72 65 74       0);.    ret
c370: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23  urn TCL_ERROR;.#
c380: 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  endif.  }..  /*.
c390: 20 20 2a 2a 20 20 20 20 24 64 62 20 65 72 72 6f    **    $db erro
c3a0: 72 63 6f 64 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rcode.  **.  ** 
c3b0: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 65 72  Return the numer
c3c0: 69 63 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68  ic error code th
c3d0: 61 74 20 77 61 73 20 72 65 74 75 72 6e 65 64 20  at was returned 
c3e0: 62 79 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  by the most rece
c3f0: 6e 74 0a 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20  nt.  ** call to 
c400: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 2e 0a  sqlite3_exec()..
c410: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 45    */.  case DB_E
c420: 52 52 4f 52 43 4f 44 45 3a 20 7b 0a 20 20 20 20  RRORCODE: {.    
c430: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
c440: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
c450: 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65  IntObj(sqlite3_e
c460: 72 72 63 6f 64 65 28 70 44 62 2d 3e 64 62 29 29  rrcode(pDb->db))
c470: 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
c480: 7d 0a 20 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20  }.   .  /*.  ** 
c490: 20 20 20 24 64 62 20 65 76 61 6c 20 24 73 71 6c     $db eval $sql
c4a0: 20 3f 61 72 72 61 79 3f 20 3f 7b 20 20 2e 2e 2e   ?array? ?{  ...
c4b0: 63 6f 64 65 2e 2e 2e 20 7d 3f 0a 20 20 2a 2a 20  code... }?.  ** 
c4c0: 20 20 20 24 64 62 20 6f 6e 65 63 6f 6c 75 6d 6e     $db onecolumn
c4d0: 20 24 73 71 6c 0a 20 20 2a 2a 0a 20 20 2a 2a 20   $sql.  **.  ** 
c4e0: 54 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  The SQL statemen
c4f0: 74 20 69 6e 20 24 73 71 6c 20 69 73 20 65 76 61  t in $sql is eva
c500: 6c 75 61 74 65 64 2e 20 20 46 6f 72 20 65 61 63  luated.  For eac
c510: 68 20 72 6f 77 2c 20 74 68 65 20 76 61 6c 75 65  h row, the value
c520: 73 20 61 72 65 0a 20 20 2a 2a 20 70 6c 61 63 65  s are.  ** place
c530: 64 20 69 6e 20 65 6c 65 6d 65 6e 74 73 20 6f 66  d in elements of
c540: 20 74 68 65 20 61 72 72 61 79 20 6e 61 6d 65 64   the array named
c550: 20 22 61 72 72 61 79 22 20 61 6e 64 20 2e 2e 2e   "array" and ...
c560: 63 6f 64 65 2e 2e 2e 20 69 73 20 65 78 65 63 75  code... is execu
c570: 74 65 64 2e 0a 20 20 2a 2a 20 49 66 20 22 61 72  ted..  ** If "ar
c580: 72 61 79 22 20 61 6e 64 20 22 63 6f 64 65 22 20  ray" and "code" 
c590: 61 72 65 20 6f 6d 69 74 74 65 64 2c 20 74 68 65  are omitted, the
c5a0: 6e 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 20 69 73  n no callback is
c5b0: 20 65 76 65 72 79 20 69 6e 76 6f 6b 65 64 2e 0a   every invoked..
c5c0: 20 20 2a 2a 20 49 66 20 22 61 72 72 61 79 22 20    ** If "array" 
c5d0: 69 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69  is an empty stri
c5e0: 6e 67 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c  ng, then the val
c5f0: 75 65 73 20 61 72 65 20 70 6c 61 63 65 64 20 69  ues are placed i
c600: 6e 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a  n variables.  **
c610: 20 74 68 61 74 20 68 61 76 65 20 74 68 65 20 73   that have the s
c620: 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20  ame name as the 
c630: 66 69 65 6c 64 73 20 65 78 74 72 61 63 74 65 64  fields extracted
c640: 20 62 79 20 74 68 65 20 71 75 65 72 79 2e 0a 20   by the query.. 
c650: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65   **.  ** The one
c660: 63 6f 6c 75 6d 6e 20 6d 65 74 68 6f 64 20 69 73  column method is
c670: 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20   the equivalent 
c680: 6f 66 3a 0a 20 20 2a 2a 20 20 20 20 20 6c 69 6e  of:.  **     lin
c690: 64 65 78 20 5b 24 64 62 20 65 76 61 6c 20 24 73  dex [$db eval $s
c6a0: 71 6c 5d 20 30 0a 20 20 2a 2f 0a 20 20 63 61 73  ql] 0.  */.  cas
c6b0: 65 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 3a 0a  e DB_ONECOLUMN:.
c6c0: 20 20 63 61 73 65 20 44 42 5f 45 56 41 4c 3a 0a    case DB_EVAL:.
c6d0: 20 20 63 61 73 65 20 44 42 5f 45 58 49 53 54 53    case DB_EXISTS
c6e0: 3a 20 7b 0a 20 20 20 20 63 68 61 72 20 63 6f 6e  : {.    char con
c6f0: 73 74 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 2f  st *zSql;      /
c700: 2a 20 4e 65 78 74 20 53 51 4c 20 73 74 61 74 65  * Next SQL state
c710: 6d 65 6e 74 20 74 6f 20 65 78 65 63 75 74 65 20  ment to execute 
c720: 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73  */.    char cons
c730: 74 20 2a 7a 4c 65 66 74 3b 20 20 20 20 20 2f 2a  t *zLeft;     /*
c740: 20 57 68 61 74 20 69 73 20 6c 65 66 74 20 61 66   What is left af
c750: 74 65 72 20 66 69 72 73 74 20 73 74 6d 74 20 69  ter first stmt i
c760: 6e 20 7a 53 71 6c 20 2a 2f 0a 20 20 20 20 73 71  n zSql */.    sq
c770: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
c780: 74 3b 20 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 64  t;   /* Compiled
c790: 20 53 51 4c 20 73 74 61 74 6d 65 6e 74 20 2a 2f   SQL statment */
c7a0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 41  .    Tcl_Obj *pA
c7b0: 72 72 61 79 3b 20 20 20 20 20 20 20 2f 2a 20 4e  rray;       /* N
c7c0: 61 6d 65 20 6f 66 20 61 72 72 61 79 20 69 6e 74  ame of array int
c7d0: 6f 20 77 68 69 63 68 20 72 65 73 75 6c 74 73 20  o which results 
c7e0: 61 72 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20  are written */. 
c7f0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72     Tcl_Obj *pScr
c800: 69 70 74 3b 20 20 20 20 20 20 2f 2a 20 53 63 72  ipt;      /* Scr
c810: 69 70 74 20 74 6f 20 72 75 6e 20 66 6f 72 20 65  ipt to run for e
c820: 61 63 68 20 72 65 73 75 6c 74 20 73 65 74 20 2a  ach result set *
c830: 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a  /.    Tcl_Obj **
c840: 61 70 50 61 72 6d 3b 20 20 20 20 20 20 2f 2a 20  apParm;      /* 
c850: 50 61 72 61 6d 65 74 65 72 73 20 74 68 61 74 20  Parameters that 
c860: 6e 65 65 64 20 61 20 54 63 6c 5f 44 65 63 72 52  need a Tcl_DecrR
c870: 65 66 43 6f 75 6e 74 28 29 20 2a 2f 0a 20 20 20  efCount() */.   
c880: 20 69 6e 74 20 6e 50 61 72 6d 3b 20 20 20 20 20   int nParm;     
c890: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
c8a0: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 75 73 65  r of entries use
c8b0: 64 20 69 6e 20 61 70 50 61 72 6d 5b 5d 20 2a 2f  d in apParm[] */
c8c0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 61 50  .    Tcl_Obj *aP
c8d0: 61 72 6d 5b 31 30 5d 3b 20 20 20 20 2f 2a 20 53  arm[10];    /* S
c8e0: 74 61 74 69 63 20 73 70 61 63 65 20 66 6f 72 20  tatic space for 
c8f0: 61 70 50 61 72 6d 5b 5d 20 69 6e 20 74 68 65 20  apParm[] in the 
c900: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20  common case */. 
c910: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74     Tcl_Obj *pRet
c920: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c  ;         /* Val
c930: 75 65 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ue to be returne
c940: 64 20 2a 2f 0a 20 20 20 20 53 71 6c 50 72 65 70  d */.    SqlPrep
c950: 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65 53 74  aredStmt *pPreSt
c960: 6d 74 3b 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  mt;  /* Pointer 
c970: 74 6f 20 61 20 70 72 65 70 61 72 65 64 20 73 74  to a prepared st
c980: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69  atement */.    i
c990: 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 69 66 28  nt rc2;..    if(
c9a0: 20 63 68 6f 69 63 65 3d 3d 44 42 5f 45 56 41 4c   choice==DB_EVAL
c9b0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 62   ){.      if( ob
c9c0: 6a 63 3c 33 20 7c 7c 20 6f 62 6a 63 3e 35 20 29  jc<3 || objc>5 )
c9d0: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72  {.        Tcl_Wr
c9e0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
c9f0: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c  p, 2, objv, "SQL
ca00: 20 3f 41 52 52 41 59 2d 4e 41 4d 45 3f 20 3f 53   ?ARRAY-NAME? ?S
ca10: 43 52 49 50 54 3f 22 29 3b 0a 20 20 20 20 20 20  CRIPT?");.      
ca20: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
ca30: 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
ca40: 20 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77    pRet = Tcl_New
ca50: 4f 62 6a 28 29 3b 0a 20 20 20 20 20 20 54 63 6c  Obj();.      Tcl
ca60: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 52  _IncrRefCount(pR
ca70: 65 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  et);.    }else{.
ca80: 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d        if( objc!=
ca90: 33 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  3 ){.        Tcl
caa0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
cab0: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
cac0: 53 51 4c 22 29 3b 0a 20 20 20 20 20 20 20 20 72  SQL");.        r
cad0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
cae0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
caf0: 66 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f 45 58  f( choice==DB_EX
cb00: 49 53 54 53 20 29 7b 0a 20 20 20 20 20 20 20 20  ISTS ){.        
cb10: 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 42 6f  pRet = Tcl_NewBo
cb20: 6f 6c 65 61 6e 4f 62 6a 28 30 29 3b 0a 20 20 20  oleanObj(0);.   
cb30: 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66       Tcl_IncrRef
cb40: 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20  Count(pRet);.   
cb50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
cb60: 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20    pRet = 0;.    
cb70: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
cb80: 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20  ( objc==3 ){.   
cb90: 20 20 20 70 41 72 72 61 79 20 3d 20 70 53 63 72     pArray = pScr
cba0: 69 70 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ipt = 0;.    }el
cbb0: 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29  se if( objc==4 )
cbc0: 7b 0a 20 20 20 20 20 20 70 41 72 72 61 79 20 3d  {.      pArray =
cbd0: 20 30 3b 0a 20 20 20 20 20 20 70 53 63 72 69 70   0;.      pScrip
cbe0: 74 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20  t = objv[3];.   
cbf0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 41   }else{.      pA
cc00: 72 72 61 79 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a  rray = objv[3];.
cc10: 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65        if( Tcl_Ge
cc20: 74 53 74 72 69 6e 67 28 70 41 72 72 61 79 29 5b  tString(pArray)[
cc30: 30 5d 3d 3d 30 20 29 20 70 41 72 72 61 79 20 3d  0]==0 ) pArray =
cc40: 20 30 3b 0a 20 20 20 20 20 20 70 53 63 72 69 70   0;.      pScrip
cc50: 74 20 3d 20 6f 62 6a 76 5b 34 5d 3b 0a 20 20 20  t = objv[4];.   
cc60: 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72   }..    Tcl_Incr
cc70: 52 65 66 43 6f 75 6e 74 28 6f 62 6a 76 5b 32 5d  RefCount(objv[2]
cc80: 29 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 54 63  );.    zSql = Tc
cc90: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
cca0: 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a  bj(objv[2], 0);.
ccb0: 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 54      while( rc==T
ccc0: 43 4c 5f 4f 4b 20 26 26 20 7a 53 71 6c 5b 30 5d  CL_OK && zSql[0]
ccd0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
cce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ccf0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
cd00: 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e  nter */.      in
cd10: 74 20 6e 56 61 72 3b 20 20 20 20 20 20 20 20 20  t nVar;         
cd20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
cd30: 65 72 20 6f 66 20 62 69 6e 64 20 70 61 72 61 6d  er of bind param
cd40: 65 74 65 72 73 20 69 6e 20 74 68 65 20 70 53 74  eters in the pSt
cd50: 6d 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  mt */.      int 
cd60: 6e 43 6f 6c 20 3d 20 2d 31 3b 20 20 20 20 20 20  nCol = -1;      
cd70: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
cd80: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
cd90: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
cda0: 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  .      Tcl_Obj *
cdb0: 2a 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 30 3b 20  *apColName = 0; 
cdc0: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 6f    /* Array of co
cdd0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20  lumn names */.  
cde0: 20 20 20 20 69 6e 74 20 6c 65 6e 3b 20 20 20 20      int len;    
cdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ce00: 2a 20 53 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  * String length 
ce10: 6f 66 20 7a 53 71 6c 20 2a 2f 0a 20 20 0a 20 20  of zSql */.  .  
ce20: 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69      /* Try to fi
ce30: 6e 64 20 61 20 53 51 4c 20 73 74 61 74 65 6d 65  nd a SQL stateme
ce40: 6e 74 20 74 68 61 74 20 68 61 73 20 61 6c 72 65  nt that has alre
ce50: 61 64 79 20 62 65 65 6e 20 63 6f 6d 70 69 6c 65  ady been compile
ce60: 64 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 77  d and.      ** w
ce70: 68 69 63 68 20 6d 61 74 63 68 65 73 20 74 68 65  hich matches the
ce80: 20 6e 65 78 74 20 73 65 71 75 65 6e 63 65 20 6f   next sequence o
ce90: 66 20 53 51 4c 2e 0a 20 20 20 20 20 20 2a 2f 0a  f SQL..      */.
cea0: 20 20 20 20 20 20 70 53 74 6d 74 20 3d 20 30 3b        pStmt = 0;
ceb0: 0a 20 20 20 20 20 20 6c 65 6e 20 3d 20 73 74 72  .      len = str
cec0: 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 20 20 20  len30(zSql);.   
ced0: 20 20 20 66 6f 72 28 70 50 72 65 53 74 6d 74 20     for(pPreStmt 
cee0: 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 3b  = pDb->stmtList;
cef0: 20 70 50 72 65 53 74 6d 74 3b 20 70 50 72 65 53   pPreStmt; pPreS
cf00: 74 6d 74 3d 70 50 72 65 53 74 6d 74 2d 3e 70 4e  tmt=pPreStmt->pN
cf10: 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ext){.        in
cf20: 74 20 6e 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e  t n = pPreStmt->
cf30: 6e 53 71 6c 3b 0a 20 20 20 20 20 20 20 20 69 66  nSql;.        if
cf40: 28 20 6c 65 6e 3e 3d 6e 20 0a 20 20 20 20 20 20  ( len>=n .      
cf50: 20 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28        && memcmp(
cf60: 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c 20  pPreStmt->zSql, 
cf70: 7a 53 71 6c 2c 20 6e 29 3d 3d 30 0a 20 20 20 20  zSql, n)==0.    
cf80: 20 20 20 20 20 20 20 20 26 26 20 28 7a 53 71 6c          && (zSql
cf90: 5b 6e 5d 3d 3d 30 20 7c 7c 20 7a 53 71 6c 5b 6e  [n]==0 || zSql[n
cfa0: 2d 31 5d 3d 3d 27 3b 27 29 0a 20 20 20 20 20 20  -1]==';').      
cfb0: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70    ){.          p
cfc0: 53 74 6d 74 20 3d 20 70 50 72 65 53 74 6d 74 2d  Stmt = pPreStmt-
cfd0: 3e 70 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20  >pStmt;.        
cfe0: 20 20 7a 4c 65 66 74 20 3d 20 26 7a 53 71 6c 5b    zLeft = &zSql[
cff0: 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 5d 3b  pPreStmt->nSql];
d000: 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  ..          /* W
d010: 68 65 6e 20 61 20 70 72 65 70 61 72 65 64 20 73  hen a prepared s
d020: 74 61 74 65 6d 65 6e 74 20 69 73 20 66 6f 75 6e  tatement is foun
d030: 64 2c 20 75 6e 6c 69 6e 6b 20 69 74 20 66 72 6f  d, unlink it fro
d040: 6d 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  m the.          
d050: 2a 2a 20 63 61 63 68 65 20 6c 69 73 74 2e 20 20  ** cache list.  
d060: 49 74 20 77 69 6c 6c 20 6c 61 74 65 72 20 62 65  It will later be
d070: 20 61 64 64 65 64 20 62 61 63 6b 20 74 6f 20 74   added back to t
d080: 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20  he beginning.   
d090: 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65         ** of the
d0a0: 20 63 61 63 68 65 20 6c 69 73 74 20 69 6e 20 6f   cache list in o
d0b0: 72 64 65 72 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  rder to implemen
d0c0: 74 20 4c 52 55 20 72 65 70 6c 61 63 65 6d 65 6e  t LRU replacemen
d0d0: 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  t..          */.
d0e0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50            if( pP
d0f0: 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 20 29 7b  reStmt->pPrev ){
d100: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50 72  .            pPr
d110: 65 53 74 6d 74 2d 3e 70 50 72 65 76 2d 3e 70 4e  eStmt->pPrev->pN
d120: 65 78 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e  ext = pPreStmt->
d130: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
d140: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
d150: 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73      pDb->stmtLis
d160: 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e  t = pPreStmt->pN
d170: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ext;.          }
d180: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
d190: 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 20 29  PreStmt->pNext )
d1a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  {.            pP
d1b0: 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 2d 3e 70  reStmt->pNext->p
d1c0: 50 72 65 76 20 3d 20 70 50 72 65 53 74 6d 74 2d  Prev = pPreStmt-
d1d0: 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20 20 20  >pPrev;.        
d1e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
d1f0: 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61       pDb->stmtLa
d200: 73 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70  st = pPreStmt->p
d210: 50 72 65 76 3b 0a 20 20 20 20 20 20 20 20 20 20  Prev;.          
d220: 7d 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d  }.          pDb-
d230: 3e 6e 53 74 6d 74 2d 2d 3b 0a 20 20 20 20 20 20  >nStmt--;.      
d240: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
d250: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 0a     }.      }.  .
d260: 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 70        /* If no p
d270: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
d280: 74 20 77 61 73 20 66 6f 75 6e 64 2e 20 20 43 6f  t was found.  Co
d290: 6d 70 69 6c 65 20 74 68 65 20 53 51 4c 20 74 65  mpile the SQL te
d2a0: 78 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  xt.      */.    
d2b0: 20 20 69 66 28 20 70 53 74 6d 74 3d 3d 30 20 29    if( pStmt==0 )
d2c0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 53 51  {.        if( SQ
d2d0: 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
d2e0: 5f 70 72 65 70 61 72 65 5f 76 32 28 70 44 62 2d  _prepare_v2(pDb-
d2f0: 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  >db, zSql, -1, &
d300: 70 53 74 6d 74 2c 20 26 7a 4c 65 66 74 29 20 29  pStmt, &zLeft) )
d310: 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  {.          Tcl_
d320: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
d330: 65 72 70 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a  erp, dbTextToObj
d340: 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28  (sqlite3_errmsg(
d350: 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20  pDb->db)));.    
d360: 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45        rc = TCL_E
d370: 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20  RROR;.          
d380: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
d390: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53 74  .        if( pSt
d3a0: 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  mt==0 ){.       
d3b0: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
d3c0: 21 3d 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  !=sqlite3_errcod
d3d0: 65 28 70 44 62 2d 3e 64 62 29 20 29 7b 0a 20 20  e(pDb->db) ){.  
d3e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63            /* A c
d3f0: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 65 72 72 6f  ompile-time erro
d400: 72 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  r in the stateme
d410: 6e 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  nt.            *
d420: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 63  /.            Tc
d430: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
d440: 6e 74 65 72 70 2c 20 64 62 54 65 78 74 54 6f 4f  nterp, dbTextToO
d450: 62 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  bj(sqlite3_errms
d460: 67 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20  g(pDb->db)));.  
d470: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 54            rc = T
d480: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
d490: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
d4a0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
d4b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
d4c0: 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 61   statement was a
d4d0: 20 6e 6f 2d 6f 70 2e 20 20 43 6f 6e 74 69 6e 75   no-op.  Continu
d4e0: 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 74  e to the next st
d4f0: 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 20 20  atement.        
d500: 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51      ** in the SQ
d510: 4c 20 73 74 72 69 6e 67 2e 0a 20 20 20 20 20 20  L string..      
d520: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
d530: 20 20 20 20 20 7a 53 71 6c 20 3d 20 7a 4c 65 66       zSql = zLef
d540: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  t;.            c
d550: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
d560: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
d570: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
d580: 50 72 65 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20  PreStmt==0 );.  
d590: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
d5a0: 42 69 6e 64 20 76 61 6c 75 65 73 20 74 6f 20 70  Bind values to p
d5b0: 61 72 61 6d 65 74 65 72 73 20 74 68 61 74 20 62  arameters that b
d5c0: 65 67 69 6e 20 77 69 74 68 20 24 20 6f 72 20 3a  egin with $ or :
d5d0: 0a 20 20 20 20 20 20 2a 2f 20 20 0a 20 20 20 20  .      */  .    
d5e0: 20 20 6e 56 61 72 20 3d 20 73 71 6c 69 74 65 33    nVar = sqlite3
d5f0: 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
d600: 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20  count(pStmt);.  
d610: 20 20 20 20 6e 50 61 72 6d 20 3d 20 30 3b 0a 20      nParm = 0;. 
d620: 20 20 20 20 20 69 66 28 20 6e 56 61 72 3e 73 69       if( nVar>si
d630: 7a 65 6f 66 28 61 50 61 72 6d 29 2f 73 69 7a 65  zeof(aParm)/size
d640: 6f 66 28 61 50 61 72 6d 5b 30 5d 29 20 29 7b 0a  of(aParm[0]) ){.
d650: 20 20 20 20 20 20 20 20 61 70 50 61 72 6d 20 3d          apParm =
d660: 20 28 54 63 6c 5f 4f 62 6a 2a 2a 29 54 63 6c 5f   (Tcl_Obj**)Tcl_
d670: 41 6c 6c 6f 63 28 6e 56 61 72 2a 73 69 7a 65 6f  Alloc(nVar*sizeo
d680: 66 28 61 70 50 61 72 6d 5b 30 5d 29 29 3b 0a 20  f(apParm[0]));. 
d690: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
d6a0: 20 20 20 20 61 70 50 61 72 6d 20 3d 20 61 50 61      apParm = aPa
d6b0: 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rm;.      }.    
d6c0: 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 56    for(i=1; i<=nV
d6d0: 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ar; i++){.      
d6e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56    const char *zV
d6f0: 61 72 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e  ar = sqlite3_bin
d700: 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65  d_parameter_name
d710: 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  (pStmt, i);.    
d720: 20 20 20 20 69 66 28 20 7a 56 61 72 21 3d 30 20      if( zVar!=0 
d730: 26 26 20 28 7a 56 61 72 5b 30 5d 3d 3d 27 24 27  && (zVar[0]=='$'
d740: 20 7c 7c 20 7a 56 61 72 5b 30 5d 3d 3d 27 3a 27   || zVar[0]==':'
d750: 20 7c 7c 20 7a 56 61 72 5b 30 5d 3d 3d 27 40 27   || zVar[0]=='@'
d760: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  ) ){.          T
d770: 63 6c 5f 4f 62 6a 20 2a 70 56 61 72 20 3d 20 54  cl_Obj *pVar = T
d780: 63 6c 5f 47 65 74 56 61 72 32 45 78 28 69 6e 74  cl_GetVar2Ex(int
d790: 65 72 70 2c 20 26 7a 56 61 72 5b 31 5d 2c 20 30  erp, &zVar[1], 0
d7a0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
d7b0: 69 66 28 20 70 56 61 72 20 29 7b 0a 20 20 20 20  if( pVar ){.    
d7c0: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20          int n;. 
d7d0: 20 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 64             u8 *d
d7e0: 61 74 61 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ata;.           
d7f0: 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 70   char *zType = p
d800: 56 61 72 2d 3e 74 79 70 65 50 74 72 20 3f 20 70  Var->typePtr ? p
d810: 56 61 72 2d 3e 74 79 70 65 50 74 72 2d 3e 6e 61  Var->typePtr->na
d820: 6d 65 20 3a 20 22 22 3b 0a 20 20 20 20 20 20 20  me : "";.       
d830: 20 20 20 20 20 63 68 61 72 20 63 20 3d 20 7a 54       char c = zT
d840: 79 70 65 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20  ype[0];.        
d850: 20 20 20 20 69 66 28 20 7a 56 61 72 5b 30 5d 3d      if( zVar[0]=
d860: 3d 27 40 27 20 7c 7c 0a 20 20 20 20 20 20 20 20  ='@' ||.        
d870: 20 20 20 20 20 20 20 28 63 3d 3d 27 62 27 20 26         (c=='b' &
d880: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
d890: 62 79 74 65 61 72 72 61 79 22 29 3d 3d 30 20 26  bytearray")==0 &
d8a0: 26 20 70 56 61 72 2d 3e 62 79 74 65 73 3d 3d 30  & pVar->bytes==0
d8b0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
d8c0: 20 20 20 2f 2a 20 4c 6f 61 64 20 61 20 42 4c 4f     /* Load a BLO
d8d0: 42 20 74 79 70 65 20 69 66 20 74 68 65 20 54 63  B type if the Tc
d8e0: 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 61 20  l variable is a 
d8f0: 62 79 74 65 61 72 72 61 79 20 61 6e 64 0a 20 20  bytearray and.  
d900: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69              ** i
d910: 74 20 68 61 73 20 6e 6f 20 73 74 72 69 6e 67 20  t has no string 
d920: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
d930: 72 20 74 68 65 20 68 6f 73 74 0a 20 20 20 20 20  r the host.     
d940: 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 72 61           ** para
d950: 6d 65 74 65 72 20 6e 61 6d 65 20 62 65 67 69 6e  meter name begin
d960: 73 20 77 69 74 68 20 22 40 22 2e 20 2a 2f 0a 20  s with "@". */. 
d970: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
d980: 61 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41  a = Tcl_GetByteA
d990: 72 72 61 79 46 72 6f 6d 4f 62 6a 28 70 56 61 72  rrayFromObj(pVar
d9a0: 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  , &n);.         
d9b0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
d9c0: 64 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69 2c  d_blob(pStmt, i,
d9d0: 20 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45   data, n, SQLITE
d9e0: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
d9f0: 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72          Tcl_Incr
da00: 52 65 66 43 6f 75 6e 74 28 70 56 61 72 29 3b 0a  RefCount(pVar);.
da10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70                ap
da20: 50 61 72 6d 5b 6e 50 61 72 6d 2b 2b 5d 20 3d 20  Parm[nParm++] = 
da30: 70 56 61 72 3b 0a 20 20 20 20 20 20 20 20 20 20  pVar;.          
da40: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
da50: 62 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79  b' && strcmp(zTy
da60: 70 65 2c 22 62 6f 6f 6c 65 61 6e 22 29 3d 3d 30  pe,"boolean")==0
da70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
da80: 20 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d    Tcl_GetIntFrom
da90: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 56 61 72  Obj(interp, pVar
daa0: 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  , &n);.         
dab0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
dac0: 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20 69 2c 20  d_int(pStmt, i, 
dad0: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
dae0: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 64 27  }else if( c=='d'
daf0: 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65   && strcmp(zType
db00: 2c 22 64 6f 75 62 6c 65 22 29 3d 3d 30 20 29 7b  ,"double")==0 ){
db10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  .              d
db20: 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20 20 20 20  ouble r;.       
db30: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 44 6f         Tcl_GetDo
db40: 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  ubleFromObj(inte
db50: 72 70 2c 20 70 56 61 72 2c 20 26 72 29 3b 0a 20  rp, pVar, &r);. 
db60: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
db70: 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65  ite3_bind_double
db80: 28 70 53 74 6d 74 2c 20 69 2c 20 72 29 3b 0a 20  (pStmt, i, r);. 
db90: 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
dba0: 20 69 66 28 20 28 63 3d 3d 27 77 27 20 26 26 20   if( (c=='w' && 
dbb0: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 77 69  strcmp(zType,"wi
dbc0: 64 65 49 6e 74 22 29 3d 3d 30 29 20 7c 7c 0a 20  deInt")==0) ||. 
dbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbe0: 20 28 63 3d 3d 27 69 27 20 26 26 20 73 74 72 63   (c=='i' && strc
dbf0: 6d 70 28 7a 54 79 70 65 2c 22 69 6e 74 22 29 3d  mp(zType,"int")=
dc00: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =0) ){.         
dc10: 20 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74       Tcl_WideInt
dc20: 20 76 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   v;.            
dc30: 20 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74    Tcl_GetWideInt
dc40: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
dc50: 70 56 61 72 2c 20 26 76 29 3b 0a 20 20 20 20 20  pVar, &v);.     
dc60: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
dc70: 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d  _bind_int64(pStm
dc80: 74 2c 20 69 2c 20 76 29 3b 0a 20 20 20 20 20 20  t, i, v);.      
dc90: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
dca0: 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 20             data 
dcb0: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
dcc0: 20 2a 29 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   *)Tcl_GetString
dcd0: 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e  FromObj(pVar, &n
dce0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
dcf0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
dd00: 78 74 28 70 53 74 6d 74 2c 20 69 2c 20 28 63 68  xt(pStmt, i, (ch
dd10: 61 72 20 2a 29 64 61 74 61 2c 20 6e 2c 20 53 51  ar *)data, n, SQ
dd20: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
dd30: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
dd40: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 56 61  IncrRefCount(pVa
dd50: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
dd60: 20 20 61 70 50 61 72 6d 5b 6e 50 61 72 6d 2b 2b    apParm[nParm++
dd70: 5d 20 3d 20 70 56 61 72 3b 0a 20 20 20 20 20 20  ] = pVar;.      
dd80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
dd90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
dda0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
ddb0: 64 5f 6e 75 6c 6c 28 20 70 53 74 6d 74 2c 20 69  d_null( pStmt, i
ddc0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   );.          }.
ddd0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
dde0: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45 78 65 63  }..      /* Exec
ddf0: 75 74 65 20 74 68 65 20 53 51 4c 0a 20 20 20 20  ute the SQL.    
de00: 20 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65    */.      while
de10: 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 26 26 20  ( rc==TCL_OK && 
de20: 70 53 74 6d 74 20 26 26 20 53 51 4c 49 54 45 5f  pStmt && SQLITE_
de30: 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
de40: 70 28 70 53 74 6d 74 29 20 29 7b 0a 0a 09 2f 2a  p(pStmt) ){.../*
de50: 20 43 6f 6d 70 75 74 65 20 63 6f 6c 75 6d 6e 20   Compute column 
de60: 6e 61 6d 65 73 2e 20 54 68 69 73 20 6d 75 73 74  names. This must
de70: 20 62 65 20 64 6f 6e 65 20 61 66 74 65 72 20 74   be done after t
de80: 68 65 20 66 69 72 73 74 20 73 75 63 63 65 73 73  he first success
de90: 66 75 6c 0a 09 2a 2a 20 63 61 6c 6c 20 74 6f 20  ful..** call to 
dea0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2c 20  sqlite3_step(), 
deb0: 69 6e 20 63 61 73 65 20 74 68 65 20 71 75 65 72  in case the quer
dec0: 79 20 69 73 20 72 65 63 6f 6d 70 69 6c 65 64 20  y is recompiled 
ded0: 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20 20 20  and the.        
dee0: 2a 2a 20 6e 75 6d 62 65 72 20 6f 72 20 6e 61 6d  ** number or nam
def0: 65 73 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e  es of the return
df00: 65 64 20 63 6f 6c 75 6d 6e 73 20 63 68 61 6e 67  ed columns chang
df10: 65 73 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a  es. .        */.
df20: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 21          assert(!
df30: 70 41 72 72 61 79 7c 7c 70 53 63 72 69 70 74 29  pArray||pScript)
df40: 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28 6e 43  ;.        if (nC
df50: 6f 6c 20 3c 20 30 29 20 7b 0a 20 20 20 20 20 20  ol < 0) {.      
df60: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 2a 61      Tcl_Obj ***a
df70: 70 20 3d 20 28 70 53 63 72 69 70 74 3f 26 61 70  p = (pScript?&ap
df80: 43 6f 6c 4e 61 6d 65 3a 30 29 3b 0a 20 20 20 20  ColName:0);.    
df90: 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 63 6f 6d        nCol = com
dfa0: 70 75 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  puteColumnNames(
dfb0: 69 6e 74 65 72 70 2c 20 70 53 74 6d 74 2c 20 61  interp, pStmt, a
dfc0: 70 2c 20 70 41 72 72 61 79 29 3b 0a 20 20 20 20  p, pArray);.    
dfd0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 66      }..        f
dfe0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
dff0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
e000: 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b 0a 20  Tcl_Obj *pVal;. 
e010: 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20           .      
e020: 20 20 20 20 2f 2a 20 53 65 74 20 70 56 61 6c 20      /* Set pVal 
e030: 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 69  to contain the i
e040: 27 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  'th column of th
e050: 69 73 20 72 6f 77 2e 20 2a 2f 0a 20 20 20 20 20  is row. */.     
e060: 20 20 20 20 20 73 77 69 74 63 68 28 20 73 71 6c       switch( sql
e070: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65  ite3_column_type
e080: 28 70 53 74 6d 74 2c 20 69 29 20 29 7b 0a 20 20  (pStmt, i) ){.  
e090: 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53            case S
e0a0: 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20  QLITE_BLOB: {.  
e0b0: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
e0c0: 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f  bytes = sqlite3_
e0d0: 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74  column_bytes(pSt
e0e0: 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  mt, i);.        
e0f0: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
e100: 20 2a 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65   *zBlob = sqlite
e110: 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53  3_column_blob(pS
e120: 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  tmt, i);.       
e130: 20 20 20 20 20 20 20 69 66 28 20 21 7a 42 6c 6f         if( !zBlo
e140: 62 20 29 20 62 79 74 65 73 20 3d 20 30 3b 0a 20  b ) bytes = 0;. 
e150: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56 61               pVa
e160: 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41  l = Tcl_NewByteA
e170: 72 72 61 79 4f 62 6a 28 28 75 38 2a 29 7a 42 6c  rrayObj((u8*)zBl
e180: 6f 62 2c 20 62 79 74 65 73 29 3b 0a 20 20 20 20  ob, bytes);.    
e190: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
e1a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
e1b0: 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20             case 
e1c0: 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20  SQLITE_INTEGER: 
e1d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
e1e0: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 76 20 3d  sqlite_int64 v =
e1f0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
e200: 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 69 29 3b  int64(pStmt, i);
e210: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
e220: 66 28 20 76 3e 3d 2d 32 31 34 37 34 38 33 36 34  f( v>=-214748364
e230: 37 20 26 26 20 76 3c 3d 32 31 34 37 34 38 33 36  7 && v<=21474836
e240: 34 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  47 ){.          
e250: 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c        pVal = Tcl
e260: 5f 4e 65 77 49 6e 74 4f 62 6a 28 76 29 3b 0a 20  _NewIntObj(v);. 
e270: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c               }el
e280: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
e290: 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e      pVal = Tcl_N
e2a0: 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 76 29 3b  ewWideIntObj(v);
e2b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
e2c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
e2d0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
e2e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
e2f0: 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41  case SQLITE_FLOA
e300: 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  T: {.           
e310: 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 73 71     double r = sq
e320: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75  lite3_column_dou
e330: 62 6c 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20  ble(pStmt, i);. 
e340: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56 61               pVa
e350: 6c 20 3d 20 54 63 6c 5f 4e 65 77 44 6f 75 62 6c  l = Tcl_NewDoubl
e360: 65 4f 62 6a 28 72 29 3b 0a 20 20 20 20 20 20 20  eObj(r);.       
e370: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
e380: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
e390: 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
e3a0: 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  ITE_NULL: {.    
e3b0: 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d            pVal =
e3c0: 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 70 44 62   dbTextToObj(pDb
e3d0: 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  ->zNull);.      
e3e0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
e3f0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
e400: 20 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74           default
e410: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  : {.            
e420: 20 20 70 56 61 6c 20 3d 20 64 62 54 65 78 74 54    pVal = dbTextT
e430: 6f 4f 62 6a 28 28 63 68 61 72 20 2a 29 73 71 6c  oObj((char *)sql
e440: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
e450: 28 70 53 74 6d 74 2c 20 69 29 29 3b 0a 20 20 20  (pStmt, i));.   
e460: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
e470: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
e480: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20            }.  . 
e490: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 63           if( pSc
e4a0: 72 69 70 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ript ){.        
e4b0: 20 20 20 20 69 66 28 20 70 41 72 72 61 79 3d 3d      if( pArray==
e4c0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
e4d0: 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72     Tcl_ObjSetVar
e4e0: 32 28 69 6e 74 65 72 70 2c 20 61 70 43 6f 6c 4e  2(interp, apColN
e4f0: 61 6d 65 5b 69 5d 2c 20 30 2c 20 70 56 61 6c 2c  ame[i], 0, pVal,
e500: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
e510: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e520: 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74        Tcl_ObjSet
e530: 56 61 72 32 28 69 6e 74 65 72 70 2c 20 70 41 72  Var2(interp, pAr
e540: 72 61 79 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b 69  ray, apColName[i
e550: 5d 2c 20 70 56 61 6c 2c 20 30 29 3b 0a 20 20 20  ], pVal, 0);.   
e560: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
e570: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
e580: 68 6f 69 63 65 3d 3d 44 42 5f 4f 4e 45 43 4f 4c  hoice==DB_ONECOL
e590: 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  UMN ){.         
e5a0: 20 20 20 61 73 73 65 72 74 28 20 70 52 65 74 3d     assert( pRet=
e5b0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
e5c0: 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 29 7b    if( pRet==0 ){
e5d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
e5e0: 52 65 74 20 3d 20 70 56 61 6c 3b 0a 20 20 20 20  Ret = pVal;.    
e5f0: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e            Tcl_In
e600: 63 72 52 65 66 43 6f 75 6e 74 28 70 52 65 74 29  crRefCount(pRet)
e610: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
e620: 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
e630: 20 54 43 4c 5f 42 52 45 41 4b 3b 0a 20 20 20 20   TCL_BREAK;.    
e640: 20 20 20 20 20 20 20 20 69 20 3d 20 6e 43 6f 6c          i = nCol
e650: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
e660: 65 20 69 66 28 20 63 68 6f 69 63 65 3d 3d 44 42  e if( choice==DB
e670: 5f 45 58 49 53 54 53 20 29 7b 0a 20 20 20 20 20  _EXISTS ){.     
e680: 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52         Tcl_DecrR
e690: 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20  efCount(pRet);. 
e6a0: 20 20 20 20 20 20 20 20 20 20 20 70 52 65 74 20             pRet 
e6b0: 3d 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e  = Tcl_NewBoolean
e6c0: 4f 62 6a 28 31 29 3b 0a 20 20 20 20 20 20 20 20  Obj(1);.        
e6d0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
e6e0: 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20  ount(pRet);.    
e6f0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c          rc = TCL
e700: 5f 42 52 45 41 4b 3b 0a 20 20 20 20 20 20 20 20  _BREAK;.        
e710: 20 20 20 20 69 20 3d 20 6e 43 6f 6c 3b 0a 20 20      i = nCol;.  
e720: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
e730: 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4c             Tcl_L
e740: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
e750: 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ent(interp, pRet
e760: 2c 20 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 20  , pVal);.       
e770: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
e780: 20 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53   .        if( pS
e790: 63 72 69 70 74 20 29 7b 0a 20 20 20 20 20 20 20  cript ){.       
e7a0: 20 20 20 70 44 62 2d 3e 6e 53 74 65 70 20 3d 20     pDb->nStep = 
e7b0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61  sqlite3_stmt_sta
e7c0: 74 75 73 28 70 53 74 6d 74 2c 20 0a 20 20 20 20  tus(pStmt, .    
e7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
e7f0: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
e800: 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 2c 20 30  FULLSCAN_STEP, 0
e810: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 62  );.          pDb
e820: 2d 3e 6e 53 6f 72 74 20 3d 20 73 71 6c 69 74 65  ->nSort = sqlite
e830: 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 53  3_stmt_status(pS
e840: 74 6d 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  tmt,.           
e850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e860: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 54         SQLITE_ST
e870: 4d 54 53 54 41 54 55 53 5f 53 4f 52 54 2c 20 30  MTSTATUS_SORT, 0
e880: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
e890: 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28  = Tcl_EvalObjEx(
e8a0: 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c  interp, pScript,
e8b0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   0);.          i
e8c0: 66 28 20 72 63 3d 3d 54 43 4c 5f 43 4f 4e 54 49  f( rc==TCL_CONTI
e8d0: 4e 55 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NUE ){.         
e8e0: 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a     rc = TCL_OK;.
e8f0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
e900: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
e910: 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f      if( rc==TCL_
e920: 42 52 45 41 4b 20 29 7b 0a 20 20 20 20 20 20 20  BREAK ){.       
e930: 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20   rc = TCL_OK;.  
e940: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
e950: 46 72 65 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  Free the column 
e960: 6e 61 6d 65 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  name objects */.
e970: 20 20 20 20 20 20 69 66 28 20 70 53 63 72 69 70        if( pScrip
e980: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
e990: 49 66 20 74 68 65 20 71 75 65 72 79 20 72 65 74  If the query ret
e9a0: 75 72 6e 65 64 20 6e 6f 20 72 6f 77 73 2c 20 62  urned no rows, b
e9b0: 75 74 20 61 6e 20 61 72 72 61 79 20 76 61 72 69  ut an array vari
e9c0: 61 62 6c 65 20 77 61 73 20 0a 20 20 20 20 20 20  able was .      
e9d0: 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64 2c 20    ** specified, 
e9e0: 63 61 6c 6c 20 63 6f 6d 70 75 74 65 43 6f 6c 75  call computeColu
e9f0: 6d 6e 4e 61 6d 65 73 28 29 20 6e 6f 77 20 74 6f  mnNames() now to
ea00: 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 0a 20   populate the . 
ea10: 20 20 20 20 20 20 20 2a 2a 20 61 72 72 61 79 6e         ** arrayn
ea20: 61 6d 65 28 2a 29 20 76 61 72 69 61 62 6c 65 2e  ame(*) variable.
ea30: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
ea40: 20 20 20 20 69 66 20 28 70 41 72 72 61 79 20 26      if (pArray &
ea50: 26 20 6e 43 6f 6c 20 3c 20 30 29 20 7b 0a 20 20  & nCol < 0) {.  
ea60: 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20          Tcl_Obj 
ea70: 2a 2a 2a 61 70 20 3d 20 28 70 53 63 72 69 70 74  ***ap = (pScript
ea80: 3f 26 61 70 43 6f 6c 4e 61 6d 65 3a 30 29 3b 0a  ?&apColName:0);.
ea90: 20 20 20 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d            nCol =
eaa0: 20 63 6f 6d 70 75 74 65 43 6f 6c 75 6d 6e 4e 61   computeColumnNa
eab0: 6d 65 73 28 69 6e 74 65 72 70 2c 20 70 53 74 6d  mes(interp, pStm
eac0: 74 2c 20 61 70 2c 20 70 41 72 72 61 79 29 3b 0a  t, ap, pArray);.
ead0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
eae0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
eaf0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
eb00: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
eb10: 75 6e 74 28 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d  unt(apColName[i]
eb20: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
eb30: 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63       Tcl_Free((c
eb40: 68 61 72 2a 29 61 70 43 6f 6c 4e 61 6d 65 29 3b  har*)apColName);
eb50: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
eb60: 2f 2a 20 46 72 65 65 20 74 68 65 20 62 6f 75 6e  /* Free the boun
eb70: 64 20 73 74 72 69 6e 67 20 61 6e 64 20 62 6c 6f  d string and blo
eb80: 62 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a  b parameters */.
eb90: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
eba0: 3c 6e 50 61 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20  <nParm; i++){.  
ebb0: 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65        Tcl_DecrRe
ebc0: 66 43 6f 75 6e 74 28 61 70 50 61 72 6d 5b 69 5d  fCount(apParm[i]
ebd0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
ebe0: 20 69 66 28 20 61 70 50 61 72 6d 21 3d 61 50 61   if( apParm!=aPa
ebf0: 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  rm ){.        Tc
ec00: 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 61 70  l_Free((char*)ap
ec10: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  Parm);.      }..
ec20: 20 20 20 20 20 20 2f 2a 20 52 65 73 65 74 20 74        /* Reset t
ec30: 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49  he statement.  I
ec40: 66 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64  f the result cod
ec50: 65 20 69 73 20 53 51 4c 49 54 45 5f 53 43 48 45  e is SQLITE_SCHE
ec60: 4d 41 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a  MA, then.      *
ec70: 2a 20 66 6c 75 73 68 20 74 68 65 20 73 74 61 74  * flush the stat
ec80: 65 6d 65 6e 74 20 63 61 63 68 65 20 61 6e 64 20  ement cache and 
ec90: 74 72 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e  try the statemen
eca0: 74 20 61 67 61 69 6e 2e 0a 20 20 20 20 20 20 2a  t again..      *
ecb0: 2f 0a 20 20 20 20 20 20 72 63 32 20 3d 20 73 71  /.      rc2 = sq
ecc0: 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d  lite3_reset(pStm
ecd0: 74 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 6e  t);.      pDb->n
ece0: 53 74 65 70 20 3d 20 73 71 6c 69 74 65 33 5f 73  Step = sqlite3_s
ecf0: 74 6d 74 5f 73 74 61 74 75 73 28 70 53 74 6d 74  tmt_status(pStmt
ed00: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
ed10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed20: 20 20 20 20 20 53 51 4c 49 54 45 5f 53 54 4d 54       SQLITE_STMT
ed30: 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f  STATUS_FULLSCAN_
ed40: 53 54 45 50 2c 20 31 29 3b 0a 20 20 20 20 20 20  STEP, 1);.      
ed50: 70 44 62 2d 3e 6e 53 6f 72 74 20 3d 20 73 71 6c  pDb->nSort = sql
ed60: 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73  ite3_stmt_status
ed70: 28 70 53 74 6d 74 2c 0a 20 20 20 20 20 20 20 20  (pStmt,.        
ed80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed90: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
eda0: 5f 53 54 4d 54 53 54 41 54 55 53 5f 53 4f 52 54  _STMTSTATUS_SORT
edb0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
edc0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 32 20 29  SQLITE_OK!=rc2 )
edd0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
ede0: 61 20 72 75 6e 2d 74 69 6d 65 20 65 72 72 6f 72  a run-time error
edf0: 20 6f 63 63 75 72 73 2c 20 72 65 70 6f 72 74 20   occurs, report 
ee00: 74 68 65 20 65 72 72 6f 72 20 61 6e 64 20 73 74  the error and st
ee10: 6f 70 20 72 65 61 64 69 6e 67 0a 20 20 20 20 20  op reading.     
ee20: 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 0a 20 20     ** the SQL.  
ee30: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
ee40: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
ee50: 74 28 69 6e 74 65 72 70 2c 20 64 62 54 65 78 74  t(interp, dbText
ee60: 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 72  ToObj(sqlite3_er
ee70: 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 29 29 3b  rmsg(pDb->db)));
ee80: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ee90: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
eea0: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 54  ;.        rc = T
eeb0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
eec0: 20 20 69 66 28 20 70 50 72 65 53 74 6d 74 20 29    if( pPreStmt )
eed0: 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a   Tcl_Free((char*
eee0: 29 70 50 72 65 53 74 6d 74 29 3b 0a 20 20 20 20  )pPreStmt);.    
eef0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
ef00: 20 7d 65 6c 73 65 20 69 66 28 20 70 44 62 2d 3e   }else if( pDb->
ef10: 6d 61 78 53 74 6d 74 3c 3d 30 20 29 7b 0a 20 20  maxStmt<=0 ){.  
ef20: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
ef30: 63 61 63 68 65 20 69 73 20 74 75 72 6e 65 64 20  cache is turned 
ef40: 6f 66 66 2c 20 64 65 61 6c 6c 6f 63 61 74 65 64  off, deallocated
ef50: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a   the statement *
ef60: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  /.        if( pP
ef70: 72 65 53 74 6d 74 20 29 20 54 63 6c 5f 46 72 65  reStmt ) Tcl_Fre
ef80: 65 28 28 63 68 61 72 2a 29 70 50 72 65 53 74 6d  e((char*)pPreStm
ef90: 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
efa0: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
efb0: 6d 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  mt);.      }else
efc0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 76 65  {.        /* Eve
efd0: 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 20 61  rything worked a
efe0: 6e 64 20 74 68 65 20 63 61 63 68 65 20 69 73 20  nd the cache is 
eff0: 6f 70 65 72 61 74 69 6f 6e 61 6c 2e 0a 20 20 20  operational..   
f000: 20 20 20 20 20 2a 2a 20 43 72 65 61 74 65 20 61       ** Create a
f010: 20 6e 65 77 20 53 71 6c 50 72 65 70 61 72 65 64   new SqlPrepared
f020: 53 74 6d 74 20 73 74 72 75 63 74 75 72 65 20 69  Stmt structure i
f030: 66 20 77 65 20 6e 65 65 64 20 6f 6e 65 2e 0a 20  f we need one.. 
f040: 20 20 20 20 20 20 20 2a 2a 20 28 49 66 20 77 65         ** (If we
f050: 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 6f 6e   already have on
f060: 65 20 77 65 20 63 61 6e 20 6a 75 73 74 20 72 65  e we can just re
f070: 75 73 65 20 69 74 2e 29 0a 20 20 20 20 20 20 20  use it.).       
f080: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
f090: 70 50 72 65 53 74 6d 74 3d 3d 30 20 29 7b 0a 20  pPreStmt==0 ){. 
f0a0: 20 20 20 20 20 20 20 20 20 6c 65 6e 20 3d 20 7a           len = z
f0b0: 4c 65 66 74 20 2d 20 7a 53 71 6c 3b 0a 20 20 20  Left - zSql;.   
f0c0: 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 20         pPreStmt 
f0d0: 3d 20 28 53 71 6c 50 72 65 70 61 72 65 64 53 74  = (SqlPreparedSt
f0e0: 6d 74 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73  mt*)Tcl_Alloc( s
f0f0: 69 7a 65 6f 66 28 2a 70 50 72 65 53 74 6d 74 29  izeof(*pPreStmt)
f100: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
f110: 28 20 70 50 72 65 53 74 6d 74 3d 3d 30 20 29 20  ( pPreStmt==0 ) 
f120: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
f130: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 72 65  ;.          pPre
f140: 53 74 6d 74 2d 3e 70 53 74 6d 74 20 3d 20 70 53  Stmt->pStmt = pS
f150: 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70  tmt;.          p
f160: 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 20 3d 20  PreStmt->nSql = 
f170: 6c 65 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 70  len;.          p
f180: 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 20 3d 20  PreStmt->zSql = 
f190: 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d  sqlite3_sql(pStm
f1a0: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  t);.          as
f1b0: 73 65 72 74 28 20 73 74 72 6c 65 6e 33 30 28 70  sert( strlen30(p
f1c0: 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 29 3d 3d  PreStmt->zSql)==
f1d0: 6c 65 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20  len );.         
f1e0: 20 61 73 73 65 72 74 28 20 30 3d 3d 6d 65 6d 63   assert( 0==memc
f1f0: 6d 70 28 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71  mp(pPreStmt->zSq
f200: 6c 2c 20 7a 53 71 6c 2c 20 6c 65 6e 29 20 29 3b  l, zSql, len) );
f210: 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
f220: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 70      /* Add the p
f230: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
f240: 74 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  t to the beginni
f250: 6e 67 20 6f 66 20 74 68 65 20 63 61 63 68 65 20  ng of the cache 
f260: 6c 69 73 74 0a 20 20 20 20 20 20 20 20 2a 2f 0a  list.        */.
f270: 20 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74          pPreStmt
f280: 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 73  ->pNext = pDb->s
f290: 74 6d 74 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  tmtList;.       
f2a0: 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76   pPreStmt->pPrev
f2b0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66   = 0;.        if
f2c0: 28 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20  ( pDb->stmtList 
f2d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 70 44 62 2d  ){.         pDb-
f2e0: 3e 73 74 6d 74 4c 69 73 74 2d 3e 70 50 72 65 76  >stmtList->pPrev
f2f0: 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20 20 20   = pPreStmt;.   
f300: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
f310: 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20 70  Db->stmtList = p
f320: 50 72 65 53 74 6d 74 3b 0a 20 20 20 20 20 20 20  PreStmt;.       
f330: 20 69 66 28 20 70 44 62 2d 3e 73 74 6d 74 4c 61   if( pDb->stmtLa
f340: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  st==0 ){.       
f350: 20 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e     assert( pDb->
f360: 6e 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20  nStmt==0 );.    
f370: 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c        pDb->stmtL
f380: 61 73 74 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a  ast = pPreStmt;.
f390: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
f3a0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
f3b0: 20 70 44 62 2d 3e 6e 53 74 6d 74 3e 30 20 29 3b   pDb->nStmt>0 );
f3c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f3d0: 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74 2b 2b 3b     pDb->nStmt++;
f3e0: 0a 20 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20  .   .        /* 
f3f0: 49 66 20 77 65 20 68 61 76 65 20 74 6f 6f 20 6d  If we have too m
f400: 61 6e 79 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  any statement in
f410: 20 63 61 63 68 65 2c 20 72 65 6d 6f 76 65 20 74   cache, remove t
f420: 68 65 20 73 75 72 70 6c 75 73 20 66 72 6f 6d 20  he surplus from 
f430: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65  the.        ** e
f440: 6e 64 20 6f 66 20 74 68 65 20 63 61 63 68 65 20  nd of the cache 
f450: 6c 69 73 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f  list..        */
f460: 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
f470: 70 44 62 2d 3e 6e 53 74 6d 74 3e 70 44 62 2d 3e  pDb->nStmt>pDb->
f480: 6d 61 78 53 74 6d 74 20 29 7b 0a 20 20 20 20 20  maxStmt ){.     
f490: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e       sqlite3_fin
f4a0: 61 6c 69 7a 65 28 70 44 62 2d 3e 73 74 6d 74 4c  alize(pDb->stmtL
f4b0: 61 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20  ast->pStmt);.   
f4c0: 20 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74         pDb->stmt
f4d0: 4c 61 73 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74  Last = pDb->stmt
f4e0: 4c 61 73 74 2d 3e 70 50 72 65 76 3b 0a 20 20 20  Last->pPrev;.   
f4f0: 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28         Tcl_Free(
f500: 28 63 68 61 72 2a 29 70 44 62 2d 3e 73 74 6d 74  (char*)pDb->stmt
f510: 4c 61 73 74 2d 3e 70 4e 65 78 74 29 3b 0a 20 20  Last->pNext);.  
f520: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d          pDb->stm
f530: 74 4c 61 73 74 2d 3e 70 4e 65 78 74 20 3d 20 30  tLast->pNext = 0
f540: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d  ;.          pDb-
f550: 3e 6e 53 74 6d 74 2d 2d 3b 0a 20 20 20 20 20 20  >nStmt--;.      
f560: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
f570: 20 20 20 2f 2a 20 50 72 6f 63 65 65 64 20 74 6f     /* Proceed to
f580: 20 74 68 65 20 6e 65 78 74 20 73 74 61 74 65 6d   the next statem
f590: 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 7a 53 71  ent */.      zSq
f5a0: 6c 20 3d 20 7a 4c 65 66 74 3b 0a 20 20 20 20 7d  l = zLeft;.    }
f5b0: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
f5c0: 43 6f 75 6e 74 28 6f 62 6a 76 5b 32 5d 29 3b 0a  Count(objv[2]);.
f5d0: 0a 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b  .    if( pRet ){
f5e0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 54  .      if( rc==T
f5f0: 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  CL_OK ){.       
f600: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
f610: 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b  t(interp, pRet);
f620: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54  .      }.      T
f630: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
f640: 70 52 65 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pRet);.    }else
f650: 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20   if( rc==TCL_OK 
f660: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 52 65 73  ){.      Tcl_Res
f670: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  etResult(interp)
f680: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  ;.    }.    brea
f690: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
f6a0: 2a 20 20 20 20 20 24 64 62 20 66 75 6e 63 74 69  *     $db functi
f6b0: 6f 6e 20 4e 41 4d 45 20 5b 2d 61 72 67 63 6f 75  on NAME [-argcou
f6c0: 6e 74 20 4e 5d 20 53 43 52 49 50 54 0a 20 20 2a  nt N] SCRIPT.  *
f6d0: 2a 0a 20 20 2a 2a 20 43 72 65 61 74 65 20 61 20  *.  ** Create a 
f6e0: 6e 65 77 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  new SQL function
f6f0: 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 57   called NAME.  W
f700: 68 65 6e 65 76 65 72 20 74 68 61 74 20 66 75 6e  henever that fun
f710: 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 61  ction is.  ** ca
f720: 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53 43 52  lled, invoke SCR
f730: 49 50 54 20 74 6f 20 65 76 61 6c 75 61 74 65 20  IPT to evaluate 
f740: 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  the function..  
f750: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 46 55 4e  */.  case DB_FUN
f760: 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 53 71 6c  CTION: {.    Sql
f770: 46 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20 20  Func *pFunc;.   
f780: 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70   Tcl_Obj *pScrip
f790: 74 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61  t;.    char *zNa
f7a0: 6d 65 3b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67  me;.    int nArg
f7b0: 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 6f   = -1;.    if( o
f7c0: 62 6a 63 3d 3d 36 20 29 7b 0a 20 20 20 20 20 20  bjc==6 ){.      
f7d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
f7e0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
f7f0: 6a 76 5b 33 5d 29 3b 0a 20 20 20 20 20 20 69 6e  jv[3]);.      in
f800: 74 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a  t n = strlen30(z
f810: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 32  );.      if( n>2
f820: 20 26 26 20 73 74 72 6e 63 6d 70 28 7a 2c 20 22   && strncmp(z, "
f830: 2d 61 72 67 63 6f 75 6e 74 22 2c 6e 29 3d 3d 30  -argcount",n)==0
f840: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
f850: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
f860: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34  j(interp, objv[4
f870: 5d 2c 20 26 6e 41 72 67 29 20 29 20 72 65 74 75  ], &nArg) ) retu
f880: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
f890: 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3c 30        if( nArg<0
f8a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63   ){.          Tc
f8b0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
f8c0: 6e 74 65 72 70 2c 20 22 6e 75 6d 62 65 72 20 6f  nterp, "number o
f8d0: 66 20 61 72 67 75 6d 65 6e 74 73 20 6d 75 73 74  f arguments must
f8e0: 20 62 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65   be non-negative
f8f0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
f900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
f910: 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 20  har*)0);.       
f920: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
f930: 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ROR;.        }. 
f940: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 63       }.      pSc
f950: 72 69 70 74 20 3d 20 6f 62 6a 76 5b 35 5d 3b 0a  ript = objv[5];.
f960: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62      }else if( ob
f970: 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 54  jc!=4 ){.      T
f980: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
f990: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
f9a0: 20 22 4e 41 4d 45 20 5b 2d 61 72 67 63 6f 75 6e   "NAME [-argcoun
f9b0: 74 20 4e 5d 20 53 43 52 49 50 54 22 29 3b 0a 20  t N] SCRIPT");. 
f9c0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
f9d0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65  ERROR;.    }else
f9e0: 7b 0a 20 20 20 20 20 20 70 53 63 72 69 70 74 20  {.      pScript 
f9f0: 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20 7d  = objv[3];.    }
fa00: 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 54 63 6c  .    zName = Tcl
fa10: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
fa20: 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20  j(objv[2], 0);. 
fa30: 20 20 20 70 46 75 6e 63 20 3d 20 66 69 6e 64 53     pFunc = findS
fa40: 71 6c 46 75 6e 63 28 70 44 62 2c 20 7a 4e 61 6d  qlFunc(pDb, zNam
fa50: 65 29 3b 0a 20 20 20 20 69 66 28 20 70 46 75 6e  e);.    if( pFun
fa60: 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 54 43  c==0 ) return TC
fa70: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 69 66 28  L_ERROR;.    if(
fa80: 20 70 46 75 6e 63 2d 3e 70 53 63 72 69 70 74 20   pFunc->pScript 
fa90: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63  ){.      Tcl_Dec
faa0: 72 52 65 66 43 6f 75 6e 74 28 70 46 75 6e 63 2d  rRefCount(pFunc-
fab0: 3e 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20 7d  >pScript);.    }
fac0: 0a 20 20 20 20 70 46 75 6e 63 2d 3e 70 53 63 72  .    pFunc->pScr
fad0: 69 70 74 20 3d 20 70 53 63 72 69 70 74 3b 0a 20  ipt = pScript;. 
fae0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
faf0: 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 20 20  unt(pScript);.  
fb00: 20 20 70 46 75 6e 63 2d 3e 75 73 65 45 76 61 6c    pFunc->useEval
fb10: 4f 62 6a 76 20 3d 20 73 61 66 65 54 6f 55 73 65  Objv = safeToUse
fb20: 45 76 61 6c 4f 62 6a 76 28 69 6e 74 65 72 70 2c  EvalObjv(interp,
fb30: 20 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20 72   pScript);.    r
fb40: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
fb50: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 44 62 2d  te_function(pDb-
fb60: 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72 67  >db, zName, nArg
fb70: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20  , SQLITE_UTF8,. 
fb80: 20 20 20 20 20 20 20 70 46 75 6e 63 2c 20 74 63         pFunc, tc
fb90: 6c 53 71 6c 46 75 6e 63 2c 20 30 2c 20 30 29 3b  lSqlFunc, 0, 0);
fba0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
fbb0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
fbc0: 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  rc = TCL_ERROR;.
fbd0: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73        Tcl_SetRes
fbe0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
fbf0: 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72 6d  r *)sqlite3_errm
fc00: 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 54 43 4c  sg(pDb->db), TCL
fc10: 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20  _VOLATILE);.    
fc20: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
fc30: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  /*.  **     
fc40: 24 64 62 20 69 6e 63 72 62 6c 6f 62 20 3f 2d 72  $db incrblob ?-r
fc50: 65 61 64 6f 6e 6c 79 3f 20 3f 44 42 3f 20 54 41  eadonly? ?DB? TA
fc60: 42 4c 45 20 43 4f 4c 55 4d 4e 20 52 4f 57 49 44  BLE COLUMN ROWID
fc70: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
fc80: 49 4e 43 52 42 4c 4f 42 3a 20 7b 0a 23 69 66 64  INCRBLOB: {.#ifd
fc90: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
fca0: 4e 43 52 42 4c 4f 42 0a 20 20 20 20 54 63 6c 5f  NCRBLOB.    Tcl_
fcb0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
fcc0: 65 72 70 2c 20 22 69 6e 63 72 62 6c 6f 62 20 6e  erp, "incrblob n
fcd0: 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  ot available in 
fce0: 74 68 69 73 20 62 75 69 6c 64 22 2c 20 30 29 3b  this build", 0);
fcf0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
fd00: 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 20  ERROR;.#else.   
fd10: 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20   int isReadonly 
fd20: 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  = 0;.    const c
fd30: 68 61 72 20 2a 7a 44 62 20 3d 20 22 6d 61 69 6e  har *zDb = "main
fd40: 22 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ";.    const cha
fd50: 72 20 2a 7a 54 61 62 6c 65 3b 0a 20 20 20 20 63  r *zTable;.    c
fd60: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75  onst char *zColu
fd70: 6d 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 5f 69  mn;.    sqlite_i
fd80: 6e 74 36 34 20 69 52 6f 77 3b 0a 0a 20 20 20 20  nt64 iRow;..    
fd90: 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 74 68 65  /* Check for the
fda0: 20 2d 72 65 61 64 6f 6e 6c 79 20 6f 70 74 69 6f   -readonly optio
fdb0: 6e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 62 6a  n */.    if( obj
fdc0: 63 3e 33 20 26 26 20 73 74 72 63 6d 70 28 54 63  c>3 && strcmp(Tc
fdd0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
fde0: 5b 32 5d 29 2c 20 22 2d 72 65 61 64 6f 6e 6c 79  [2]), "-readonly
fdf0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
fe00: 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20  sReadonly = 1;. 
fe10: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62     }..    if( ob
fe20: 6a 63 21 3d 28 35 2b 69 73 52 65 61 64 6f 6e 6c  jc!=(5+isReadonl
fe30: 79 29 20 26 26 20 6f 62 6a 63 21 3d 28 36 2b 69  y) && objc!=(6+i
fe40: 73 52 65 61 64 6f 6e 6c 79 29 20 29 7b 0a 20 20  sReadonly) ){.  
fe50: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
fe60: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
fe70: 6f 62 6a 76 2c 20 22 3f 2d 72 65 61 64 6f 6e 6c  objv, "?-readonl
fe80: 79 3f 20 3f 44 42 3f 20 54 41 42 4c 45 20 43 4f  y? ?DB? TABLE CO
fe90: 4c 55 4d 4e 20 52 4f 57 49 44 22 29 3b 0a 20 20  LUMN ROWID");.  
fea0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
feb0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
fec0: 20 69 66 28 20 6f 62 6a 63 3d 3d 28 36 2b 69 73   if( objc==(6+is
fed0: 52 65 61 64 6f 6e 6c 79 29 20 29 7b 0a 20 20 20  Readonly) ){.   
fee0: 20 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74     zDb = Tcl_Get
fef0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
ff00: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 54 61 62 6c  .    }.    zTabl
ff10: 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
ff20: 67 28 6f 62 6a 76 5b 6f 62 6a 63 2d 33 5d 29 3b  g(objv[objc-3]);
ff30: 0a 20 20 20 20 7a 43 6f 6c 75 6d 6e 20 3d 20 54  .    zColumn = T
ff40: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
ff50: 76 5b 6f 62 6a 63 2d 32 5d 29 3b 0a 20 20 20 20  v[objc-2]);.    
ff60: 72 63 20 3d 20 54 63 6c 5f 47 65 74 57 69 64 65  rc = Tcl_GetWide
ff70: 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
ff80: 70 2c 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 2c  p, objv[objc-1],
ff90: 20 26 69 52 6f 77 29 3b 0a 0a 20 20 20 20 69 66   &iRow);..    if
ffa0: 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a  ( rc==TCL_OK ){.
ffb0: 20 20 20 20 20 20 72 63 20 3d 20 63 72 65 61 74        rc = creat
ffc0: 65 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c  eIncrblobChannel
ffd0: 28 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 65  (.          inte
ffe0: 72 70 2c 20 70 44 62 2c 20 7a 44 62 2c 20 7a 54  rp, pDb, zDb, zT
fff0: 61 62 6c 65 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 69  able, zColumn, i
10000 52 6f 77 2c 20 69 73 52 65 61 64 6f 6e 6c 79 0a  Row, isReadonly.
10010 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 23        );.    }.#
10020 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b  endif.    break;
10030 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
10040 20 20 20 20 24 64 62 20 69 6e 74 65 72 72 75 70      $db interrup
10050 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 74 65  t.  **.  ** Inte
10060 72 72 75 70 74 20 74 68 65 20 65 78 65 63 75 74  rrupt the execut
10070 69 6f 6e 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  ion of the inner
10080 2d 6d 6f 73 74 20 53 51 4c 20 69 6e 74 65 72 70  -most SQL interp
10090 72 65 74 65 72 2e 20 20 54 68 69 73 0a 20 20 2a  reter.  This.  *
100a0 2a 20 63 61 75 73 65 73 20 74 68 65 20 53 51 4c  * causes the SQL
100b0 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 72 65   statement to re
100c0 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 6f 66  turn an error of
100d0 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
100e0 54 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  T..  */.  case D
100f0 42 5f 49 4e 54 45 52 52 55 50 54 3a 20 7b 0a 20  B_INTERRUPT: {. 
10100 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72     sqlite3_inter
10110 72 75 70 74 28 70 44 62 2d 3e 64 62 29 3b 0a 20  rupt(pDb->db);. 
10120 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
10130 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62   /*.  **     $db
10140 20 6e 75 6c 6c 76 61 6c 75 65 20 3f 53 54 52 49   nullvalue ?STRI
10150 4e 47 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 68  NG?.  **.  ** Ch
10160 61 6e 67 65 20 74 65 78 74 20 75 73 65 64 20 77  ange text used w
10170 68 65 6e 20 61 20 4e 55 4c 4c 20 63 6f 6d 65 73  hen a NULL comes
10180 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 64   back from the d
10190 61 74 61 62 61 73 65 2e 20 49 66 20 3f 53 54 52  atabase. If ?STR
101a0 49 4e 47 3f 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  ING?.  ** is not
101b0 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 74   present, then t
101c0 68 65 20 63 75 72 72 65 6e 74 20 73 74 72 69 6e  he current strin
101d0 67 20 75 73 65 64 20 66 6f 72 20 4e 55 4c 4c 20  g used for NULL 
101e0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a  is returned..  *
101f0 2a 20 49 66 20 53 54 52 49 4e 47 20 69 73 20 70  * If STRING is p
10200 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 53 54 52  resent, then STR
10210 49 4e 47 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ING is returned.
10220 0a 20 20 2a 2a 0a 20 20 2a 2f 0a 20 20 63 61 73  .  **.  */.  cas
10230 65 20 44 42 5f 4e 55 4c 4c 56 41 4c 55 45 3a 20  e DB_NULLVALUE: 
10240 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  {.    if( objc!=
10250 32 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a  2 && objc!=3 ){.
10260 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
10270 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
10280 2c 20 6f 62 6a 76 2c 20 22 4e 55 4c 4c 56 41 4c  , objv, "NULLVAL
10290 55 45 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  UE");.      retu
102a0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
102b0 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63    }.    if( objc
102c0 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==3 ){.      int
102d0 20 6c 65 6e 3b 0a 20 20 20 20 20 20 63 68 61 72   len;.      char
102e0 20 2a 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 47 65   *zNull = Tcl_Ge
102f0 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
10300 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20  bjv[2], &len);. 
10310 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 4e       if( pDb->zN
10320 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 54  ull ){.        T
10330 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 4e 75  cl_Free(pDb->zNu
10340 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ll);.      }.   
10350 20 20 20 69 66 28 20 7a 4e 75 6c 6c 20 26 26 20     if( zNull && 
10360 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  len>0 ){.       
10370 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 3d 20 54 63   pDb->zNull = Tc
10380 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31  l_Alloc( len + 1
10390 20 29 3b 0a 20 20 20 20 20 20 20 20 73 74 72 6e   );.        strn
103a0 63 70 79 28 70 44 62 2d 3e 7a 4e 75 6c 6c 2c 20  cpy(pDb->zNull, 
103b0 7a 4e 75 6c 6c 2c 20 6c 65 6e 29 3b 0a 20 20 20  zNull, len);.   
103c0 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c 5b       pDb->zNull[
103d0 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  len] = '\0';.   
103e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
103f0 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 3d 20 30    pDb->zNull = 0
10400 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10410 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
10420 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 64 62 54  sult(interp, dbT
10430 65 78 74 54 6f 4f 62 6a 28 70 44 62 2d 3e 7a 4e  extToObj(pDb->zN
10440 75 6c 6c 29 29 3b 0a 20 20 20 20 62 72 65 61 6b  ull));.    break
10450 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
10460 20 20 20 20 20 24 64 62 20 6c 61 73 74 5f 69 6e       $db last_in
10470 73 65 72 74 5f 72 6f 77 69 64 20 0a 20 20 2a 2a  sert_rowid .  **
10480 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20  .  ** Return an 
10490 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
104a0 20 74 68 65 20 52 4f 57 49 44 20 66 6f 72 20 74   the ROWID for t
104b0 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 69  he most recent i
104c0 6e 73 65 72 74 2e 0a 20 20 2a 2f 0a 20 20 63 61  nsert..  */.  ca
104d0 73 65 20 44 42 5f 4c 41 53 54 5f 49 4e 53 45 52  se DB_LAST_INSER
104e0 54 5f 52 4f 57 49 44 3a 20 7b 0a 20 20 20 20 54  T_ROWID: {.    T
104f0 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b  cl_Obj *pResult;
10500 0a 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74  .    Tcl_WideInt
10510 20 72 6f 77 69 64 3b 0a 20 20 20 20 69 66 28 20   rowid;.    if( 
10520 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 20  objc!=2 ){.     
10530 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
10540 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
10550 76 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 72 65  v, "");.      re
10560 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
10570 20 20 20 20 7d 0a 20 20 20 20 72 6f 77 69 64 20      }.    rowid 
10580 3d 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69  = sqlite3_last_i
10590 6e 73 65 72 74 5f 72 6f 77 69 64 28 70 44 62 2d  nsert_rowid(pDb-
105a0 3e 64 62 29 3b 0a 20 20 20 20 70 52 65 73 75 6c  >db);.    pResul
105b0 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65  t = Tcl_GetObjRe
105c0 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
105d0 20 20 54 63 6c 5f 53 65 74 57 69 64 65 49 6e 74    Tcl_SetWideInt
105e0 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 72 6f 77  Obj(pResult, row
105f0 69 64 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  id);.    break;.
10600 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54    }..  /*.  ** T
10610 68 65 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 20  he DB_ONECOLUMN 
10620 6d 65 74 68 6f 64 20 69 73 20 69 6d 70 6c 65 6d  method is implem
10630 65 6e 74 65 64 20 74 6f 67 65 74 68 65 72 20 77  ented together w
10640 69 74 68 20 44 42 5f 45 56 41 4c 2e 0a 20 20 2a  ith DB_EVAL..  *
10650 2f 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 70  /..  /*    $db p
10660 72 6f 67 72 65 73 73 20 3f 4e 20 43 41 4c 4c 42  rogress ?N CALLB
10670 41 43 4b 3f 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20  ACK?.  ** .  ** 
10680 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e  Invoke the given
10690 20 63 61 6c 6c 62 61 63 6b 20 65 76 65 72 79 20   callback every 
106a0 4e 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  N virtual machin
106b0 65 20 6f 70 63 6f 64 65 73 20 77 68 69 6c 65 20  e opcodes while 
106c0 65 78 65 63 75 74 69 6e 67 0a 20 20 2a 2a 20 71  executing.  ** q
106d0 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 63  ueries..  */.  c
106e0 61 73 65 20 44 42 5f 50 52 4f 47 52 45 53 53 3a  ase DB_PROGRESS:
106f0 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d   {.    if( objc=
10700 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =2 ){.      if( 
10710 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29  pDb->zProgress )
10720 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  {.        Tcl_Ap
10730 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
10740 70 2c 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73  p, pDb->zProgres
10750 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  s, 0);.      }. 
10760 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a     }else if( obj
10770 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 63 68  c==4 ){.      ch
10780 61 72 20 2a 7a 50 72 6f 67 72 65 73 73 3b 0a 20  ar *zProgress;. 
10790 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20       int len;.  
107a0 20 20 20 20 69 6e 74 20 4e 3b 0a 20 20 20 20 20      int N;.     
107b0 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c   if( TCL_OK!=Tcl
107c0 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
107d0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
107e0 26 4e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  &N) ){.        r
107f0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10800 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  .      };.      
10810 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65  if( pDb->zProgre
10820 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  ss ){.        Tc
10830 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 50 72 6f  l_Free(pDb->zPro
10840 67 72 65 73 73 29 3b 0a 20 20 20 20 20 20 7d 0a  gress);.      }.
10850 20 20 20 20 20 20 7a 50 72 6f 67 72 65 73 73 20        zProgress 
10860 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
10870 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20  romObj(objv[3], 
10880 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  &len);.      if(
10890 20 7a 50 72 6f 67 72 65 73 73 20 26 26 20 6c 65   zProgress && le
108a0 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  n>0 ){.        p
108b0 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 3d 20  Db->zProgress = 
108c0 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b  Tcl_Alloc( len +
108d0 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65   1 );.        me
108e0 6d 63 70 79 28 70 44 62 2d 3e 7a 50 72 6f 67 72  mcpy(pDb->zProgr
108f0 65 73 73 2c 20 7a 50 72 6f 67 72 65 73 73 2c 20  ess, zProgress, 
10900 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65  len+1);.      }e
10910 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62  lse{.        pDb
10920 2d 3e 7a 50 72 6f 67 72 65 73 73 20 3d 20 30 3b  ->zProgress = 0;
10930 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  .      }.#ifndef
10940 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f   SQLITE_OMIT_PRO
10950 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 20  GRESS_CALLBACK. 
10960 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50       if( pDb->zP
10970 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20 20  rogress ){.     
10980 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d     pDb->interp =
10990 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20   interp;.       
109a0 20 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65 73   sqlite3_progres
109b0 73 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64  s_handler(pDb->d
109c0 62 2c 20 4e 2c 20 44 62 50 72 6f 67 72 65 73 73  b, N, DbProgress
109d0 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20  Handler, pDb);. 
109e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
109f0 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 67      sqlite3_prog
10a00 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 70 44 62  ress_handler(pDb
10a10 2d 3e 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  ->db, 0, 0, 0);.
10a20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
10a30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10a40 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
10a50 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
10a60 2c 20 22 4e 20 43 41 4c 4c 42 41 43 4b 22 29 3b  , "N CALLBACK");
10a70 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
10a80 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
10a90 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
10aa0 20 2f 2a 20 20 20 20 24 64 62 20 70 72 6f 66 69   /*    $db profi
10ab0 6c 65 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20  le ?CALLBACK?.  
10ac0 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 61 72 72  **.  ** Make arr
10ad0 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20 69 6e 76  angements to inv
10ae0 6f 6b 65 20 74 68 65 20 43 41 4c 4c 42 41 43 4b  oke the CALLBACK
10af0 20 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20 65   routine after e
10b00 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ach SQL statemen
10b10 74 0a 20 20 2a 2a 20 74 68 61 74 20 68 61 73 20  t.  ** that has 
10b20 72 75 6e 2e 20 20 54 68 65 20 74 65 78 74 20 6f  run.  The text o
10b30 66 20 74 68 65 20 53 51 4c 20 61 6e 64 20 74 68  f the SQL and th
10b40 65 20 61 6d 6f 75 6e 74 20 6f 66 20 65 6c 61 70  e amount of elap
10b50 73 65 20 74 69 6d 65 20 61 72 65 0a 20 20 2a 2a  se time are.  **
10b60 20 61 70 70 65 6e 64 65 64 20 74 6f 20 43 41 4c   appended to CAL
10b70 4c 42 41 43 4b 20 62 65 66 6f 72 65 20 74 68 65  LBACK before the
10b80 20 73 63 72 69 70 74 20 69 73 20 72 75 6e 2e 0a   script is run..
10b90 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 50    */.  case DB_P
10ba0 52 4f 46 49 4c 45 3a 20 7b 0a 20 20 20 20 69 66  ROFILE: {.    if
10bb0 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20  ( objc>3 ){.    
10bc0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
10bd0 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
10be0 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22  jv, "?CALLBACK?"
10bf0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
10c00 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
10c10 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32  else if( objc==2
10c20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44   ){.      if( pD
10c30 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20  b->zProfile ){. 
10c40 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
10c50 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
10c60 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20 30  pDb->zProfile, 0
10c70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
10c80 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72  else{.      char
10c90 20 2a 7a 50 72 6f 66 69 6c 65 3b 0a 20 20 20 20   *zProfile;.    
10ca0 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20    int len;.     
10cb0 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69   if( pDb->zProfi
10cc0 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  le ){.        Tc
10cd0 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 50 72 6f  l_Free(pDb->zPro
10ce0 66 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  file);.      }. 
10cf0 20 20 20 20 20 7a 50 72 6f 66 69 6c 65 20 3d 20       zProfile = 
10d00 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
10d10 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c  mObj(objv[2], &l
10d20 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  en);.      if( z
10d30 50 72 6f 66 69 6c 65 20 26 26 20 6c 65 6e 3e 30  Profile && len>0
10d40 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
10d50 3e 7a 50 72 6f 66 69 6c 65 20 3d 20 54 63 6c 5f  >zProfile = Tcl_
10d60 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29  Alloc( len + 1 )
10d70 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
10d80 28 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20  (pDb->zProfile, 
10d90 7a 50 72 6f 66 69 6c 65 2c 20 6c 65 6e 2b 31 29  zProfile, len+1)
10da0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
10db0 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f         pDb->zPro
10dc0 66 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  file = 0;.      
10dd0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
10de0 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 20 20  _OMIT_TRACE.    
10df0 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66    if( pDb->zProf
10e00 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ile ){.        p
10e10 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74  Db->interp = int
10e20 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  erp;.        sql
10e30 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 70 44 62  ite3_profile(pDb
10e40 2d 3e 64 62 2c 20 44 62 50 72 6f 66 69 6c 65 48  ->db, DbProfileH
10e50 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20  andler, pDb);.  
10e60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10e70 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 66 69     sqlite3_profi
10e80 6c 65 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30  le(pDb->db, 0, 0
10e90 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
10ea0 66 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  f.    }.    brea
10eb0 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
10ec0 2a 20 20 20 20 20 24 64 62 20 72 65 6b 65 79 20  *     $db rekey 
10ed0 4b 45 59 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 68  KEY.  **.  ** Ch
10ee0 61 6e 67 65 20 74 68 65 20 65 6e 63 72 79 70 74  ange the encrypt
10ef0 69 6f 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 63  ion key on the c
10f00 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 64 61  urrently open da
10f10 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63  tabase..  */.  c
10f20 61 73 65 20 44 42 5f 52 45 4b 45 59 3a 20 7b 0a  ase DB_REKEY: {.
10f30 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20      int nKey;.  
10f40 20 20 76 6f 69 64 20 2a 70 4b 65 79 3b 0a 20 20    void *pKey;.  
10f50 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
10f60 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
10f70 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
10f80 32 2c 20 6f 62 6a 76 2c 20 22 4b 45 59 22 29 3b  2, objv, "KEY");
10f90 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
10fa0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
10fb0 20 20 20 70 4b 65 79 20 3d 20 54 63 6c 5f 47 65     pKey = Tcl_Ge
10fc0 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62  tByteArrayFromOb
10fd0 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6e 4b 65 79  j(objv[2], &nKey
10fe0 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
10ff0 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 72  _HAS_CODEC.    r
11000 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 6b 65  c = sqlite3_reke
11010 79 28 70 44 62 2d 3e 64 62 2c 20 70 4b 65 79 2c  y(pDb->db, pKey,
11020 20 6e 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20   nKey);.    if( 
11030 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  rc ){.      Tcl_
11040 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
11050 65 72 70 2c 20 73 71 6c 69 74 65 33 45 72 72 53  erp, sqlite3ErrS
11060 74 72 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20  tr(rc), 0);.    
11070 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52    rc = TCL_ERROR
11080 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
11090 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
110a0 20 2f 2a 20 20 20 20 24 64 62 20 72 65 73 74 6f   /*    $db resto
110b0 72 65 20 3f 44 41 54 41 42 41 53 45 3f 20 46 49  re ?DATABASE? FI
110c0 4c 45 4e 41 4d 45 0a 20 20 2a 2a 0a 20 20 2a 2a  LENAME.  **.  **
110d0 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73 65   Open a database
110e0 20 66 69 6c 65 20 6e 61 6d 65 64 20 46 49 4c 45   file named FILE
110f0 4e 41 4d 45 2e 20 20 54 72 61 6e 73 66 65 72 20  NAME.  Transfer 
11100 74 68 65 20 63 6f 6e 74 65 6e 74 20 0a 20 20 2a  the content .  *
11110 2a 20 6f 66 20 46 49 4c 45 4e 41 4d 45 20 69 6e  * of FILENAME in
11120 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 64 61 74  to the local dat
11130 61 62 61 73 65 20 44 41 54 41 42 41 53 45 20 28  abase DATABASE (
11140 64 65 66 61 75 6c 74 3a 20 22 6d 61 69 6e 22 29  default: "main")
11150 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
11160 5f 52 45 53 54 4f 52 45 3a 20 7b 0a 20 20 20 20  _RESTORE: {.    
11170 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 72 63  const char *zSrc
11180 46 69 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  File;.    const 
11190 63 68 61 72 20 2a 7a 44 65 73 74 44 62 3b 0a 20  char *zDestDb;. 
111a0 20 20 20 73 71 6c 69 74 65 33 20 2a 70 53 72 63     sqlite3 *pSrc
111b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61  ;.    sqlite3_ba
111c0 63 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b 0a 20  ckup *pBackup;. 
111d0 20 20 20 69 6e 74 20 6e 54 69 6d 65 6f 75 74 20     int nTimeout 
111e0 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 6f 62  = 0;..    if( ob
111f0 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 7a  jc==3 ){.      z
11200 44 65 73 74 44 62 20 3d 20 22 6d 61 69 6e 22 3b  DestDb = "main";
11210 0a 20 20 20 20 20 20 7a 53 72 63 46 69 6c 65 20  .      zSrcFile 
11220 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
11230 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 7d 65  objv[2]);.    }e
11240 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20  lse if( objc==4 
11250 29 7b 0a 20 20 20 20 20 20 7a 44 65 73 74 44 62  ){.      zDestDb
11260 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
11270 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 20  (objv[2]);.     
11280 20 7a 53 72 63 46 69 6c 65 20 3d 20 54 63 6c 5f   zSrcFile = Tcl_
11290 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33  GetString(objv[3
112a0 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
112b0 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
112c0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
112d0 20 6f 62 6a 76 2c 20 22 3f 44 41 54 41 42 41 53   objv, "?DATABAS
112e0 45 3f 20 46 49 4c 45 4e 41 4d 45 22 29 3b 0a 20  E? FILENAME");. 
112f0 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
11300 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
11310 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70   rc = sqlite3_op
11320 65 6e 5f 76 32 28 7a 53 72 63 46 69 6c 65 2c 20  en_v2(zSrcFile, 
11330 26 70 53 72 63 2c 20 53 51 4c 49 54 45 5f 4f 50  &pSrc, SQLITE_OP
11340 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c 20 30 29 3b  EN_READONLY, 0);
11350 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
11360 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11370 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
11380 28 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74  (interp, "cannot
11390 20 6f 70 65 6e 20 73 6f 75 72 63 65 20 64 61 74   open source dat
113a0 61 62 61 73 65 3a 20 22 2c 0a 20 20 20 20 20 20  abase: ",.      
113b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72       sqlite3_err
113c0 6d 73 67 28 70 53 72 63 29 2c 20 28 63 68 61 72  msg(pSrc), (char
113d0 2a 29 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  *)0);.      sqli
113e0 74 65 33 5f 63 6c 6f 73 65 28 70 53 72 63 29 3b  te3_close(pSrc);
113f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
11400 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
11410 20 20 20 70 42 61 63 6b 75 70 20 3d 20 73 71 6c     pBackup = sql
11420 69 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69 74  ite3_backup_init
11430 28 70 44 62 2d 3e 64 62 2c 20 7a 44 65 73 74 44  (pDb->db, zDestD
11440 62 2c 20 70 53 72 63 2c 20 22 6d 61 69 6e 22 29  b, pSrc, "main")
11450 3b 0a 20 20 20 20 69 66 28 20 70 42 61 63 6b 75  ;.    if( pBacku
11460 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63  p==0 ){.      Tc
11470 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
11480 6e 74 65 72 70 2c 20 22 72 65 73 74 6f 72 65 20  nterp, "restore 
11490 66 61 69 6c 65 64 3a 20 22 2c 0a 20 20 20 20 20  failed: ",.     
114a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72        sqlite3_er
114b0 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 28  rmsg(pDb->db), (
114c0 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
114d0 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 53  sqlite3_close(pS
114e0 72 63 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  rc);.      retur
114f0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
11500 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 28 72   }.    while( (r
11510 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  c = sqlite3_back
11520 75 70 5f 73 74 65 70 28 70 42 61 63 6b 75 70 2c  up_step(pBackup,
11530 31 30 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  100))==SQLITE_OK
11540 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  .              |
11550 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  | rc==SQLITE_BUS
11560 59 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72  Y ){.      if( r
11570 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c==SQLITE_BUSY )
11580 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 54  {.        if( nT
11590 69 6d 65 6f 75 74 2b 2b 20 3e 3d 20 33 20 29 20  imeout++ >= 3 ) 
115a0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 73  break;.        s
115b0 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 31 30 30  qlite3_sleep(100
115c0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
115d0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63  .    sqlite3_bac
115e0 6b 75 70 5f 66 69 6e 69 73 68 28 70 42 61 63 6b  kup_finish(pBack
115f0 75 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  up);.    if( rc=
11600 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
11610 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f        rc = TCL_O
11620 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  K;.    }else if(
11630 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
11640 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4c   || rc==SQLITE_L
11650 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 20 20 54  OCKED ){.      T
11660 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
11670 69 6e 74 65 72 70 2c 20 22 72 65 73 74 6f 72 65  interp, "restore
11680 20 66 61 69 6c 65 64 3a 20 73 6f 75 72 63 65 20   failed: source 
11690 64 61 74 61 62 61 73 65 20 62 75 73 79 22 2c 0a  database busy",.
116a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116b0 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 30 29         (char*)0)
116c0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c  ;.      rc = TCL
116d0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73  _ERROR;.    }els
116e0 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  e{.      Tcl_App
116f0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
11700 2c 20 22 72 65 73 74 6f 72 65 20 66 61 69 6c 65  , "restore faile
11710 64 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d: ",.          
11720 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
11730 70 44 62 2d 3e 64 62 29 2c 20 28 63 68 61 72 2a  pDb->db), (char*
11740 29 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  )0);.      rc = 
11750 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
11760 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f  .    sqlite3_clo
11770 73 65 28 70 53 72 63 29 3b 0a 20 20 20 20 62 72  se(pSrc);.    br
11780 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
11790 20 2a 2a 20 20 20 20 20 24 64 62 20 73 74 61 74   **     $db stat
117a0 75 73 20 28 73 74 65 70 7c 73 6f 72 74 29 0a 20  us (step|sort). 
117b0 20 2a 2a 0a 20 20 2a 2a 20 44 69 73 70 6c 61 79   **.  ** Display
117c0 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
117d0 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50  US_FULLSCAN_STEP
117e0 20 6f 72 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45   or .  ** SQLITE
117f0 5f 53 54 4d 54 53 54 41 54 55 53 5f 53 4f 52 54  _STMTSTATUS_SORT
11800 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65   for the most re
11810 63 65 6e 74 20 65 76 61 6c 2e 0a 20 20 2a 2f 0a  cent eval..  */.
11820 20 20 63 61 73 65 20 44 42 5f 53 54 41 54 55 53    case DB_STATUS
11830 3a 20 7b 0a 20 20 20 20 69 6e 74 20 76 3b 0a 20  : {.    int v;. 
11840 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
11850 4f 70 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  Op;.    if( objc
11860 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=3 ){.      Tcl
11870 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
11880 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
11890 28 73 74 65 70 7c 73 6f 72 74 29 22 29 3b 0a 20  (step|sort)");. 
118a0 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
118b0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
118c0 20 7a 4f 70 20 3d 20 54 63 6c 5f 47 65 74 53 74   zOp = Tcl_GetSt
118d0 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
118e0 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4f     if( strcmp(zO
118f0 70 2c 20 22 73 74 65 70 22 29 3d 3d 30 20 29 7b  p, "step")==0 ){
11900 0a 20 20 20 20 20 20 76 20 3d 20 70 44 62 2d 3e  .      v = pDb->
11910 6e 53 74 65 70 3b 0a 20 20 20 20 7d 65 6c 73 65  nStep;.    }else
11920 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4f 70 2c   if( strcmp(zOp,
11930 20 22 73 6f 72 74 22 29 3d 3d 30 20 29 7b 0a 20   "sort")==0 ){. 
11940 20 20 20 20 20 76 20 3d 20 70 44 62 2d 3e 6e 53       v = pDb->nS
11950 6f 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ort;.    }else{.
11960 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
11970 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
11980 62 61 64 20 61 72 67 75 6d 65 6e 74 3a 20 73 68  bad argument: sh
11990 6f 75 6c 64 20 62 65 20 73 74 65 70 20 6f 72 20  ould be step or 
119a0 73 6f 72 74 22 2c 20 0a 20 20 20 20 20 20 20 20  sort", .        
119b0 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20      (char*)0);. 
119c0 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
119d0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
119e0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
119f0 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
11a00 77 49 6e 74 4f 62 6a 28 76 29 29 3b 0a 20 20 20  wIntObj(v));.   
11a10 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 0a 20   break;.  }.  . 
11a20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62   /*.  **     $db
11a30 20 74 69 6d 65 6f 75 74 20 4d 49 4c 4c 45 53 45   timeout MILLESE
11a40 43 4f 4e 44 53 0a 20 20 2a 2a 0a 20 20 2a 2a 20  CONDS.  **.  ** 
11a50 44 65 6c 61 79 20 66 6f 72 20 74 68 65 20 6e 75  Delay for the nu
11a60 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63  mber of millisec
11a70 6f 6e 64 73 20 73 70 65 63 69 66 69 65 64 20 77  onds specified w
11a80 68 65 6e 20 61 20 66 69 6c 65 20 69 73 20 6c 6f  hen a file is lo
11a90 63 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  cked..  */.  cas
11aa0 65 20 44 42 5f 54 49 4d 45 4f 55 54 3a 20 7b 0a  e DB_TIMEOUT: {.
11ab0 20 20 20 20 69 6e 74 20 6d 73 3b 0a 20 20 20 20      int ms;.    
11ac0 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
11ad0 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
11ae0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
11af0 20 6f 62 6a 76 2c 20 22 4d 49 4c 4c 49 53 45 43   objv, "MILLISEC
11b00 4f 4e 44 53 22 29 3b 0a 20 20 20 20 20 20 72 65  ONDS");.      re
11b10 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
11b20 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 54 63      }.    if( Tc
11b30 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
11b40 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
11b50 20 26 6d 73 29 20 29 20 72 65 74 75 72 6e 20 54   &ms) ) return T
11b60 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71  CL_ERROR;.    sq
11b70 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f  lite3_busy_timeo
11b80 75 74 28 70 44 62 2d 3e 64 62 2c 20 6d 73 29 3b  ut(pDb->db, ms);
11b90 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
11ba0 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20    .  /*.  **    
11bb0 20 24 64 62 20 74 6f 74 61 6c 5f 63 68 61 6e 67   $db total_chang
11bc0 65 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74  es.  **.  ** Ret
11bd0 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
11be0 66 20 72 6f 77 73 20 74 68 61 74 20 77 65 72 65  f rows that were
11bf0 20 6d 6f 64 69 66 69 65 64 2c 20 69 6e 73 65 72   modified, inser
11c00 74 65 64 2c 20 6f 72 20 64 65 6c 65 74 65 64 20  ted, or deleted 
11c10 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 20  .  ** since the 
11c20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
11c30 77 61 73 20 63 72 65 61 74 65 64 2e 0a 20 20 2a  was created..  *
11c40 2f 0a 20 20 63 61 73 65 20 44 42 5f 54 4f 54 41  /.  case DB_TOTA
11c50 4c 5f 43 48 41 4e 47 45 53 3a 20 7b 0a 20 20 20  L_CHANGES: {.   
11c60 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c   Tcl_Obj *pResul
11c70 74 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  t;.    if( objc!
11c80 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =2 ){.      Tcl_
11c90 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
11ca0 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22  erp, 2, objv, ""
11cb0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
11cc0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
11cd0 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54  .    pResult = T
11ce0 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_GetObjResult(
11cf0 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c  interp);.    Tcl
11d00 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52 65 73 75  _SetIntObj(pResu
11d10 6c 74 2c 20 73 71 6c 69 74 65 33 5f 74 6f 74 61  lt, sqlite3_tota
11d20 6c 5f 63 68 61 6e 67 65 73 28 70 44 62 2d 3e 64  l_changes(pDb->d
11d30 62 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  b));.    break;.
11d40 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62    }..  /*    $db
11d50 20 74 72 61 63 65 20 3f 43 41 4c 4c 42 41 43 4b   trace ?CALLBACK
11d60 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65  ?.  **.  ** Make
11d70 20 61 72 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f   arrangements to
11d80 20 69 6e 76 6f 6b 65 20 74 68 65 20 43 41 4c 4c   invoke the CALL
11d90 42 41 43 4b 20 72 6f 75 74 69 6e 65 20 66 6f 72  BACK routine for
11da0 20 65 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d   each SQL statem
11db0 65 6e 74 0a 20 20 2a 2a 20 74 68 61 74 20 69 73  ent.  ** that is
11dc0 20 65 78 65 63 75 74 65 64 2e 20 20 54 68 65 20   executed.  The 
11dd0 74 65 78 74 20 6f 66 20 74 68 65 20 53 51 4c 20  text of the SQL 
11de0 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 43  is appended to C
11df0 41 4c 4c 42 41 43 4b 20 62 65 66 6f 72 65 0a 20  ALLBACK before. 
11e00 20 2a 2a 20 69 74 20 69 73 20 65 78 65 63 75 74   ** it is execut
11e10 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ed..  */.  case 
11e20 44 42 5f 54 52 41 43 45 3a 20 7b 0a 20 20 20 20  DB_TRACE: {.    
11e30 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20  if( objc>3 ){.  
11e40 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
11e50 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
11e60 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b  objv, "?CALLBACK
11e70 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ?");.      retur
11e80 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
11e90 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d   }else if( objc=
11ea0 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =2 ){.      if( 
11eb0 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20  pDb->zTrace ){. 
11ec0 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
11ed0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
11ee0 70 44 62 2d 3e 7a 54 72 61 63 65 2c 20 30 29 3b  pDb->zTrace, 0);
11ef0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
11f00 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  se{.      char *
11f10 7a 54 72 61 63 65 3b 0a 20 20 20 20 20 20 69 6e  zTrace;.      in
11f20 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28  t len;.      if(
11f30 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a   pDb->zTrace ){.
11f40 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65          Tcl_Free
11f50 28 70 44 62 2d 3e 7a 54 72 61 63 65 29 3b 0a 20  (pDb->zTrace);. 
11f60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 72       }.      zTr
11f70 61 63 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ace = Tcl_GetStr
11f80 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
11f90 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20  2], &len);.     
11fa0 20 69 66 28 20 7a 54 72 61 63 65 20 26 26 20 6c   if( zTrace && l
11fb0 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  en>0 ){.        
11fc0 70 44 62 2d 3e 7a 54 72 61 63 65 20 3d 20 54 63  pDb->zTrace = Tc
11fd0 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31  l_Alloc( len + 1
11fe0 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   );.        memc
11ff0 70 79 28 70 44 62 2d 3e 7a 54 72 61 63 65 2c 20  py(pDb->zTrace, 
12000 7a 54 72 61 63 65 2c 20 6c 65 6e 2b 31 29 3b 0a  zTrace, len+1);.
12010 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
12020 20 20 20 20 20 70 44 62 2d 3e 7a 54 72 61 63 65       pDb->zTrace
12030 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69   = 0;.      }.#i
12040 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12050 54 5f 54 52 41 43 45 0a 20 20 20 20 20 20 69 66  T_TRACE.      if
12060 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b  ( pDb->zTrace ){
12070 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e  .        pDb->in
12080 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20  terp = interp;. 
12090 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74         sqlite3_t
120a0 72 61 63 65 28 70 44 62 2d 3e 64 62 2c 20 44 62  race(pDb->db, Db
120b0 54 72 61 63 65 48 61 6e 64 6c 65 72 2c 20 70 44  TraceHandler, pD
120c0 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  b);.      }else{
120d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
120e0 5f 74 72 61 63 65 28 70 44 62 2d 3e 64 62 2c 20  _trace(pDb->db, 
120f0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23  0, 0);.      }.#
12100 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
12110 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
12120 20 20 20 20 24 64 62 20 74 72 61 6e 73 61 63 74      $db transact
12130 69 6f 6e 20 5b 2d 64 65 66 65 72 72 65 64 7c 2d  ion [-deferred|-
12140 69 6d 6d 65 64 69 61 74 65 7c 2d 65 78 63 6c 75  immediate|-exclu
12150 73 69 76 65 5d 20 53 43 52 49 50 54 0a 20 20 2a  sive] SCRIPT.  *
12160 2a 0a 20 20 2a 2a 20 53 74 61 72 74 20 61 20 6e  *.  ** Start a n
12170 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28  ew transaction (
12180 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c  if we are not al
12190 72 65 61 64 79 20 69 6e 20 74 68 65 20 6d 69 64  ready in the mid
121a0 73 74 20 6f 66 20 61 0a 20 20 2a 2a 20 74 72 61  st of a.  ** tra
121b0 6e 73 61 63 74 69 6f 6e 29 20 61 6e 64 20 65 78  nsaction) and ex
121c0 65 63 75 74 65 20 74 68 65 20 54 43 4c 20 73 63  ecute the TCL sc
121d0 72 69 70 74 20 53 43 52 49 50 54 2e 20 20 41 66  ript SCRIPT.  Af
121e0 74 65 72 20 53 43 52 49 50 54 0a 20 20 2a 2a 20  ter SCRIPT.  ** 
121f0 63 6f 6d 70 6c 65 74 65 73 2c 20 65 69 74 68 65  completes, eithe
12200 72 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  r commit the tra
12210 6e 73 61 63 74 69 6f 6e 20 6f 72 20 72 6f 6c 6c  nsaction or roll
12220 20 69 74 20 62 61 63 6b 20 69 66 20 53 43 52 49   it back if SCRI
12230 50 54 0a 20 20 2a 2a 20 74 68 72 6f 77 73 20 61  PT.  ** throws a
12240 6e 20 65 78 63 65 70 74 69 6f 6e 2e 20 20 4f 72  n exception.  Or
12250 20 69 66 20 6e 6f 20 6e 65 77 20 74 72 61 6e 73   if no new trans
12260 61 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65  ation was starte
12270 64 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 20  d, do nothing.. 
12280 20 2a 2a 20 70 61 73 73 20 74 68 65 20 65 78 63   ** pass the exc
12290 65 70 74 69 6f 6e 20 6f 6e 20 75 70 20 74 68 65  eption on up the
122a0 20 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a   stack..  **.  *
122b0 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 77  * This command w
122c0 61 73 20 69 6e 73 70 69 72 65 64 20 62 79 20 44  as inspired by D
122d0 61 76 65 20 54 68 6f 6d 61 73 27 73 20 74 61 6c  ave Thomas's tal
122e0 6b 20 6f 6e 20 52 75 62 79 20 61 74 20 74 68 65  k on Ruby at the
122f0 0a 20 20 2a 2a 20 32 30 30 35 20 4f 27 52 65 69  .  ** 2005 O'Rei
12300 6c 6c 79 20 4f 70 65 6e 20 53 6f 75 72 63 65 20  lly Open Source 
12310 43 6f 6e 76 65 6e 74 69 6f 6e 20 28 4f 53 43 4f  Convention (OSCO
12320 4e 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  N)..  */.  case 
12330 44 42 5f 54 52 41 4e 53 41 43 54 49 4f 4e 3a 20  DB_TRANSACTION: 
12340 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  {.    Tcl_Obj *p
12350 53 63 72 69 70 74 3b 0a 20 20 20 20 63 6f 6e 73  Script;.    cons
12360 74 20 63 68 61 72 20 2a 7a 42 65 67 69 6e 20 3d  t char *zBegin =
12370 20 22 53 41 56 45 50 4f 49 4e 54 20 5f 74 63 6c   "SAVEPOINT _tcl
12380 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22 3b 0a 20  _transaction";. 
12390 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
123a0 45 6e 64 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a  End;.    if( obj
123b0 63 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d 34 20  c!=3 && objc!=4 
123c0 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
123d0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
123e0 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 5b 54 59 50  , 2, objv, "[TYP
123f0 45 5d 20 53 43 52 49 50 54 22 29 3b 0a 20 20 20  E] SCRIPT");.   
12400 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
12410 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
12420 69 66 28 20 70 44 62 2d 3e 6e 54 72 61 6e 73 61  if( pDb->nTransa
12430 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 7a  ction ){.      z
12440 42 65 67 69 6e 20 3d 20 22 53 41 56 45 50 4f 49  Begin = "SAVEPOI
12450 4e 54 20 5f 74 63 6c 5f 74 72 61 6e 73 61 63 74  NT _tcl_transact
12460 69 6f 6e 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ion";.    }else 
12470 69 66 28 20 70 44 62 2d 3e 6e 54 72 61 6e 73 61  if( pDb->nTransa
12480 63 74 69 6f 6e 3d 3d 30 20 26 26 20 6f 62 6a 63  ction==0 && objc
12490 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 73 74 61  ==4 ){.      sta
124a0 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
124b0 54 54 59 50 45 5f 73 74 72 73 5b 5d 20 3d 20 7b  TTYPE_strs[] = {
124c0 0a 20 20 20 20 20 20 20 20 22 64 65 66 65 72 72  .        "deferr
124d0 65 64 22 2c 20 20 20 22 65 78 63 6c 75 73 69 76  ed",   "exclusiv
124e0 65 22 2c 20 20 22 69 6d 6d 65 64 69 61 74 65 22  e",  "immediate"
124f0 2c 20 30 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20  , 0.      };.   
12500 20 20 20 65 6e 75 6d 20 54 54 59 50 45 5f 65 6e     enum TTYPE_en
12510 75 6d 20 7b 0a 20 20 20 20 20 20 20 20 54 54 59  um {.        TTY
12520 50 45 5f 44 45 46 45 52 52 45 44 2c 20 54 54 59  PE_DEFERRED, TTY
12530 50 45 5f 45 58 43 4c 55 53 49 56 45 2c 20 54 54  PE_EXCLUSIVE, TT
12540 59 50 45 5f 49 4d 4d 45 44 49 41 54 45 0a 20 20  YPE_IMMEDIATE.  
12550 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 69 6e 74      };.      int
12560 20 74 74 79 70 65 3b 0a 20 20 20 20 20 20 69 66   ttype;.      if
12570 28 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72  ( Tcl_GetIndexFr
12580 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
12590 6a 76 5b 32 5d 2c 20 54 54 59 50 45 5f 73 74 72  jv[2], TTYPE_str
125a0 73 2c 20 22 74 72 61 6e 73 61 63 74 69 6f 6e 20  s, "transaction 
125b0 74 79 70 65 22 2c 0a 20 20 20 20 20 20 20 20 20  type",.         
125c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125d0 20 20 20 20 20 30 2c 20 26 74 74 79 70 65 29 20       0, &ttype) 
125e0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
125f0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
12600 20 20 20 7d 0a 20 20 20 20 20 20 73 77 69 74 63     }.      switc
12610 68 28 20 28 65 6e 75 6d 20 54 54 59 50 45 5f 65  h( (enum TTYPE_e
12620 6e 75 6d 29 74 74 79 70 65 20 29 7b 0a 20 20 20  num)ttype ){.   
12630 20 20 20 20 20 63 61 73 65 20 54 54 59 50 45 5f       case TTYPE_
12640 44 45 46 45 52 52 45 44 3a 20 20 20 20 2f 2a 20  DEFERRED:    /* 
12650 6e 6f 2d 6f 70 20 2a 2f 3b 20 20 20 20 20 20 20  no-op */;       
12660 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
12670 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 54 54  .        case TT
12680 59 50 45 5f 45 58 43 4c 55 53 49 56 45 3a 20 20  YPE_EXCLUSIVE:  
12690 20 7a 42 65 67 69 6e 20 3d 20 22 42 45 47 49 4e   zBegin = "BEGIN
126a0 20 45 58 43 4c 55 53 49 56 45 22 3b 20 20 62 72   EXCLUSIVE";  br
126b0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
126c0 65 20 54 54 59 50 45 5f 49 4d 4d 45 44 49 41 54  e TTYPE_IMMEDIAT
126d0 45 3a 20 20 20 7a 42 65 67 69 6e 20 3d 20 22 42  E:   zBegin = "B
126e0 45 47 49 4e 20 49 4d 4d 45 44 49 41 54 45 22 3b  EGIN IMMEDIATE";
126f0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
12700 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 63 72 69  .    }.    pScri
12710 70 74 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31  pt = objv[objc-1
12720 5d 3b 0a 0a 20 20 20 20 70 44 62 2d 3e 64 69 73  ];..    pDb->dis
12730 61 62 6c 65 41 75 74 68 2b 2b 3b 0a 20 20 20 20  ableAuth++;.    
12740 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
12750 63 28 70 44 62 2d 3e 64 62 2c 20 7a 42 65 67 69  c(pDb->db, zBegi
12760 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  n, 0, 0, 0);.   
12770 20 70 44 62 2d 3e 64 69 73 61 62 6c 65 41 75 74   pDb->disableAut
12780 68 2d 2d 3b 0a 20 20 20 20 69 66 28 20 72 63 21  h--;.    if( rc!
12790 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
127a0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
127b0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c  sult(interp, sql
127c0 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d  ite3_errmsg(pDb-
127d0 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  >db), 0);.      
127e0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
127f0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 44 62  ;.    }..    pDb
12800 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b  ->nTransaction++
12810 3b 0a 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 45  ;.    rc = Tcl_E
12820 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c  valObjEx(interp,
12830 20 70 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20   pScript, 0);.  
12840 20 20 70 44 62 2d 3e 6e 54 72 61 6e 73 61 63 74    pDb->nTransact
12850 69 6f 6e 2d 2d 3b 0a 0a 20 20 20 20 69 66 28 20  ion--;..    if( 
12860 72 63 21 3d 54 43 4c 5f 45 52 52 4f 52 20 29 7b  rc!=TCL_ERROR ){
12870 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
12880 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a  nTransaction ){.
12890 20 20 20 20 20 20 20 20 7a 45 6e 64 20 3d 20 22          zEnd = "
128a0 52 45 4c 45 41 53 45 20 5f 74 63 6c 5f 74 72 61  RELEASE _tcl_tra
128b0 6e 73 61 63 74 69 6f 6e 22 3b 0a 20 20 20 20 20  nsaction";.     
128c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
128d0 7a 45 6e 64 20 3d 20 22 43 4f 4d 4d 49 54 22 3b  zEnd = "COMMIT";
128e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
128f0 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44  se{.      if( pD
12900 62 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  b->nTransaction 
12910 29 7b 0a 20 20 20 20 20 20 20 20 7a 45 6e 64 20  ){.        zEnd 
12920 3d 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 5f  = "ROLLBACK TO _
12930 74 63 6c 5f 74 72 61 6e 73 61 63 74 69 6f 6e 20  tcl_transaction 
12940 3b 20 52 45 4c 45 41 53 45 20 5f 74 63 6c 5f 74  ; RELEASE _tcl_t
12950 72 61 6e 73 61 63 74 69 6f 6e 22 3b 0a 20 20 20  ransaction";.   
12960 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12970 20 20 7a 45 6e 64 20 3d 20 22 52 4f 4c 4c 42 41    zEnd = "ROLLBA
12980 43 4b 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  CK";.      }.   
12990 20 7d 0a 0a 20 20 20 20 70 44 62 2d 3e 64 69 73   }..    pDb->dis
129a0 61 62 6c 65 41 75 74 68 2b 2b 3b 0a 20 20 20 20  ableAuth++;.    
129b0 69 66 28 20 73 71 6c 69 74 65 33 5f 65 78 65 63  if( sqlite3_exec
129c0 28 70 44 62 2d 3e 64 62 2c 20 7a 45 6e 64 2c 20  (pDb->db, zEnd, 
129d0 30 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20  0, 0, 0) ){.    
129e0 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 74    /* This is a t
129f0 72 69 63 6b 79 20 73 63 65 6e 61 72 69 6f 20 74  ricky scenario t
12a00 6f 20 68 61 6e 64 6c 65 2e 20 54 68 65 20 6d 6f  o handle. The mo
12a10 73 74 20 6c 69 6b 65 6c 79 20 63 61 75 73 65 20  st likely cause 
12a20 6f 66 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 65  of an.      ** e
12a30 72 72 6f 72 20 69 73 20 74 68 61 74 20 74 68 65  rror is that the
12a40 20 65 78 65 63 28 29 20 61 62 6f 76 65 20 77 61   exec() above wa
12a50 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  s an attempt to 
12a60 63 6f 6d 6d 69 74 20 74 68 65 20 0a 20 20 20 20  commit the .    
12a70 20 20 2a 2a 20 74 6f 70 2d 6c 65 76 65 6c 20 74    ** top-level t
12a80 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20  ransaction that 
12a90 72 65 74 75 72 6e 65 64 20 53 51 4c 49 54 45 5f  returned SQLITE_
12aa0 42 55 53 59 2e 20 4f 72 2c 20 6c 65 73 73 20 6c  BUSY. Or, less l
12ab0 69 6b 65 6c 79 2c 0a 20 20 20 20 20 20 2a 2a 20  ikely,.      ** 
12ac0 74 68 61 74 20 61 6e 20 49 4f 2d 65 72 72 6f 72  that an IO-error
12ad0 20 68 61 73 20 6f 63 63 75 72 65 64 2e 20 49 6e   has occured. In
12ae0 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 74 68   either case, th
12af0 72 6f 77 20 61 20 54 63 6c 20 65 78 63 65 70 74  row a Tcl except
12b00 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  ion.      ** and
12b10 20 74 72 79 20 74 6f 20 72 6f 6c 6c 62 61 63 6b   try to rollback
12b20 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
12b30 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
12b40 20 2a 2a 20 42 75 74 20 69 74 20 63 6f 75 6c 64   ** But it could
12b50 20 61 6c 73 6f 20 62 65 20 74 68 61 74 20 74 68   also be that th
12b60 65 20 75 73 65 72 20 65 78 65 63 75 74 65 64 20  e user executed 
12b70 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 42 45 47 49  one or more BEGI
12b80 4e 2c 20 0a 20 20 20 20 20 20 2a 2a 20 43 4f 4d  N, .      ** COM
12b90 4d 49 54 2c 20 53 41 56 45 50 4f 49 4e 54 2c 20  MIT, SAVEPOINT, 
12ba0 52 45 4c 45 41 53 45 20 6f 72 20 52 4f 4c 4c 42  RELEASE or ROLLB
12bb0 41 43 4b 20 63 6f 6d 6d 61 6e 64 73 20 74 68 61  ACK commands tha
12bc0 74 20 61 72 65 20 63 6f 6e 66 75 73 69 6e 67 0a  t are confusing.
12bd0 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 6d 65        ** this me
12be0 74 68 6f 64 27 73 20 6c 6f 67 69 63 2e 20 4e 6f  thod's logic. No
12bf0 74 20 63 6c 65 61 72 20 68 6f 77 20 74 68 69 73  t clear how this
12c00 20 77 6f 75 6c 64 20 62 65 20 62 65 73 74 20 68   would be best h
12c10 61 6e 64 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f  andled..      */
12c20 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 54  .      if( rc!=T
12c30 43 4c 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20  CL_ERROR ){.    
12c40 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
12c50 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c  sult(interp, sql
12c60 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d  ite3_errmsg(pDb-
12c70 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  >db), 0);.      
12c80 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52    rc = TCL_ERROR
12c90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12ca0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62  sqlite3_exec(pDb
12cb0 2d 3e 64 62 2c 20 22 52 4f 4c 4c 42 41 43 4b 22  ->db, "ROLLBACK"
12cc0 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
12cd0 7d 0a 20 20 20 20 70 44 62 2d 3e 64 69 73 61 62  }.    pDb->disab
12ce0 6c 65 41 75 74 68 2d 2d 3b 0a 0a 20 20 20 20 62  leAuth--;..    b
12cf0 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
12d00 20 20 2a 2a 20 20 20 20 24 64 62 20 75 6e 6c 6f    **    $db unlo
12d10 63 6b 5f 6e 6f 74 69 66 79 20 3f 73 63 72 69 70  ck_notify ?scrip
12d20 74 3f 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  t?.  */.  case D
12d30 42 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 3a  B_UNLOCK_NOTIFY:
12d40 20 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   {.#ifndef SQLIT
12d50 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f  E_ENABLE_UNLOCK_
12d60 4e 4f 54 49 46 59 0a 20 20 20 20 54 63 6c 5f 41  NOTIFY.    Tcl_A
12d70 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
12d80 72 70 2c 20 22 75 6e 6c 6f 63 6b 5f 6e 6f 74 69  rp, "unlock_noti
12d90 66 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  fy not available
12da0 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64 22 2c   in this build",
12db0 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 54 43   0);.    rc = TC
12dc0 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20  L_ERROR;.#else. 
12dd0 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26     if( objc!=2 &
12de0 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  & objc!=3 ){.   
12df0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
12e00 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
12e10 62 6a 76 2c 20 22 3f 53 43 52 49 50 54 3f 22 29  bjv, "?SCRIPT?")
12e20 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c  ;.      rc = TCL
12e30 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73  _ERROR;.    }els
12e40 65 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 28 2a  e{.      void (*
12e50 78 4e 6f 74 69 66 79 29 28 76 6f 69 64 20 2a 2a  xNotify)(void **
12e60 2c 20 69 6e 74 29 20 3d 20 30 3b 0a 20 20 20 20  , int) = 0;.    
12e70 20 20 76 6f 69 64 20 2a 70 4e 6f 74 69 66 79 41    void *pNotifyA
12e80 72 67 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69  rg = 0;..      i
12e90 66 28 20 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e  f( pDb->pUnlockN
12ea0 6f 74 69 66 79 20 29 7b 0a 20 20 20 20 20 20 20  otify ){.       
12eb0 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
12ec0 74 28 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f  t(pDb->pUnlockNo
12ed0 74 69 66 79 29 3b 0a 20 20 20 20 20 20 20 20 70  tify);.        p
12ee0 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66  Db->pUnlockNotif
12ef0 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  y = 0;.      }. 
12f00 20 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63   .      if( objc
12f10 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 78  ==3 ){.        x
12f20 4e 6f 74 69 66 79 20 3d 20 44 62 55 6e 6c 6f 63  Notify = DbUnloc
12f30 6b 4e 6f 74 69 66 79 3b 0a 20 20 20 20 20 20 20  kNotify;.       
12f40 20 70 4e 6f 74 69 66 79 41 72 67 20 3d 20 28 76   pNotifyArg = (v
12f50 6f 69 64 20 2a 29 70 44 62 3b 0a 20 20 20 20 20  oid *)pDb;.     
12f60 20 20 20 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e     pDb->pUnlockN
12f70 6f 74 69 66 79 20 3d 20 6f 62 6a 76 5b 32 5d 3b  otify = objv[2];
12f80 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63  .        Tcl_Inc
12f90 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70  rRefCount(pDb->p
12fa0 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 29 3b 0a 20  UnlockNotify);. 
12fb0 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
12fc0 69 66 28 20 73 71 6c 69 74 65 33 5f 75 6e 6c 6f  if( sqlite3_unlo
12fd0 63 6b 5f 6e 6f 74 69 66 79 28 70 44 62 2d 3e 64  ck_notify(pDb->d
12fe0 62 2c 20 78 4e 6f 74 69 66 79 2c 20 70 4e 6f 74  b, xNotify, pNot
12ff0 69 66 79 41 72 67 29 20 29 7b 0a 20 20 20 20 20  ifyArg) ){.     
13000 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
13010 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69  ult(interp, sqli
13020 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
13030 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  db), 0);.       
13040 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b   rc = TCL_ERROR;
13050 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
13060 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b  endif.    break;
13070 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
13080 20 20 20 24 64 62 20 75 70 64 61 74 65 5f 68 6f     $db update_ho
13090 6f 6b 20 3f 73 63 72 69 70 74 3f 0a 20 20 2a 2a  ok ?script?.  **
130a0 20 20 20 20 24 64 62 20 72 6f 6c 6c 62 61 63 6b      $db rollback
130b0 5f 68 6f 6f 6b 20 3f 73 63 72 69 70 74 3f 0a 20  _hook ?script?. 
130c0 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 55 50   */.  case DB_UP
130d0 44 41 54 45 5f 48 4f 4f 4b 3a 20 0a 20 20 63 61  DATE_HOOK: .  ca
130e0 73 65 20 44 42 5f 52 4f 4c 4c 42 41 43 4b 5f 48  se DB_ROLLBACK_H
130f0 4f 4f 4b 3a 20 7b 0a 0a 20 20 20 20 2f 2a 20 73  OOK: {..    /* s
13100 65 74 20 70 70 48 6f 6f 6b 20 74 6f 20 70 6f 69  et ppHook to poi
13110 6e 74 20 61 74 20 70 55 70 64 61 74 65 48 6f 6f  nt at pUpdateHoo
13120 6b 20 6f 72 20 70 52 6f 6c 6c 62 61 63 6b 48 6f  k or pRollbackHo
13130 6f 6b 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  ok, depending on
13140 20 0a 20 20 20 20 2a 2a 20 77 68 65 74 68 65 72   .    ** whether
13150 20 5b 24 64 62 20 75 70 64 61 74 65 5f 68 6f 6f   [$db update_hoo
13160 6b 5d 20 6f 72 20 5b 24 64 62 20 72 6f 6c 6c 62  k] or [$db rollb
13170 61 63 6b 5f 68 6f 6f 6b 5d 20 77 61 73 20 69 6e  ack_hook] was in
13180 76 6f 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  voked..    */.  
13190 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 70 70 48 6f    Tcl_Obj **ppHo
131a0 6f 6b 3b 20 0a 20 20 20 20 69 66 28 20 63 68 6f  ok; .    if( cho
131b0 69 63 65 3d 3d 44 42 5f 55 50 44 41 54 45 5f 48  ice==DB_UPDATE_H
131c0 4f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 70 48  OOK ){.      ppH
131d0 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e 70 55 70 64  ook = &pDb->pUpd
131e0 61 74 65 48 6f 6f 6b 3b 0a 20 20 20 20 7d 65 6c  ateHook;.    }el
131f0 73 65 7b 0a 20 20 20 20 20 20 70 70 48 6f 6f 6b  se{.      ppHook
13200 20 3d 20 26 70 44 62 2d 3e 70 52 6f 6c 6c 62 61   = &pDb->pRollba
13210 63 6b 48 6f 6f 6b 3b 0a 20 20 20 20 7d 0a 0a 20  ckHook;.    }.. 
13220 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26     if( objc!=2 &
13230 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  & objc!=3 ){.   
13240 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
13250 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
13260 6f 62 6a 76 2c 20 22 3f 53 43 52 49 50 54 3f 22  objv, "?SCRIPT?"
13270 29 3b 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e  );.       return
13280 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
13290 7d 0a 20 20 20 20 69 66 28 20 2a 70 70 48 6f 6f  }.    if( *ppHoo
132a0 6b 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53  k ){.      Tcl_S
132b0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
132c0 72 70 2c 20 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20  rp, *ppHook);.  
132d0 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20      if( objc==3 
132e0 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 44  ){.        Tcl_D
132f0 65 63 72 52 65 66 43 6f 75 6e 74 28 2a 70 70 48  ecrRefCount(*ppH
13300 6f 6f 6b 29 3b 0a 20 20 20 20 20 20 20 20 2a 70  ook);.        *p
13310 70 48 6f 6f 6b 20 3d 20 30 3b 0a 20 20 20 20 20  pHook = 0;.     
13320 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
13330 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20   objc==3 ){.    
13340 20 20 61 73 73 65 72 74 28 20 21 28 2a 70 70 48    assert( !(*ppH
13350 6f 6f 6b 29 20 29 3b 0a 20 20 20 20 20 20 69 66  ook) );.      if
13360 28 20 54 63 6c 5f 47 65 74 43 68 61 72 4c 65 6e  ( Tcl_GetCharLen
13370 67 74 68 28 6f 62 6a 76 5b 32 5d 29 3e 30 20 29  gth(objv[2])>0 )
13380 7b 0a 20 20 20 20 20 20 20 20 2a 70 70 48 6f 6f  {.        *ppHoo
13390 6b 20 3d 20 6f 62 6a 76 5b 32 5d 3b 0a 20 20 20  k = objv[2];.   
133a0 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66       Tcl_IncrRef
133b0 43 6f 75 6e 74 28 2a 70 70 48 6f 6f 6b 29 3b 0a  Count(*ppHook);.
133c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
133d0 20 20 20 73 71 6c 69 74 65 33 5f 75 70 64 61 74     sqlite3_updat
133e0 65 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20  e_hook(pDb->db, 
133f0 28 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f  (pDb->pUpdateHoo
13400 6b 3f 44 62 55 70 64 61 74 65 48 61 6e 64 6c 65  k?DbUpdateHandle
13410 72 3a 30 29 2c 20 70 44 62 29 3b 0a 20 20 20 20  r:0), pDb);.    
13420 73 71 6c 69 74 65 33 5f 72 6f 6c 6c 62 61 63 6b  sqlite3_rollback
13430 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 28 70  _hook(pDb->db,(p
13440 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f  Db->pRollbackHoo
13450 6b 3f 44 62 52 6f 6c 6c 62 61 63 6b 48 61 6e 64  k?DbRollbackHand
13460 6c 65 72 3a 30 29 2c 70 44 62 29 3b 0a 0a 20 20  ler:0),pDb);..  
13470 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
13480 2f 2a 20 20 20 20 24 64 62 20 76 65 72 73 69 6f  /*    $db versio
13490 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75  n.  **.  ** Retu
134a0 72 6e 20 74 68 65 20 76 65 72 73 69 6f 6e 20 73  rn the version s
134b0 74 72 69 6e 67 20 66 6f 72 20 74 68 69 73 20 64  tring for this d
134c0 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
134d0 63 61 73 65 20 44 42 5f 56 45 52 53 49 4f 4e 3a  case DB_VERSION:
134e0 20 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65   {.    Tcl_SetRe
134f0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
13500 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6c 69 62  ar *)sqlite3_lib
13510 76 65 72 73 69 6f 6e 28 29 2c 20 54 43 4c 5f 53  version(), TCL_S
13520 54 41 54 49 43 29 3b 0a 20 20 20 20 62 72 65 61  TATIC);.    brea
13530 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 7d 20 2f 2a 20  k;.  }...  } /* 
13540 45 6e 64 20 6f 66 20 74 68 65 20 53 57 49 54 43  End of the SWITC
13550 48 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  H statement */. 
13560 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
13570 2a 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 20 44  *.**   sqlite3 D
13580 42 4e 41 4d 45 20 46 49 4c 45 4e 41 4d 45 20 3f  BNAME FILENAME ?
13590 2d 76 66 73 20 56 46 53 4e 41 4d 45 3f 20 3f 2d  -vfs VFSNAME? ?-
135a0 6b 65 79 20 4b 45 59 3f 20 3f 2d 72 65 61 64 6f  key KEY? ?-reado
135b0 6e 6c 79 20 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a 20  nly BOOLEAN?.** 
135c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135d0 20 20 20 20 20 20 20 20 20 20 3f 2d 63 72 65 61            ?-crea
135e0 74 65 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 6e 6f  te BOOLEAN? ?-no
135f0 6d 75 74 65 78 20 42 4f 4f 4c 45 41 4e 3f 0a 2a  mutex BOOLEAN?.*
13600 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
13610 20 6d 61 69 6e 20 54 63 6c 20 63 6f 6d 6d 61 6e   main Tcl comman
13620 64 2e 20 20 57 68 65 6e 20 74 68 65 20 22 73 71  d.  When the "sq
13630 6c 69 74 65 22 20 54 63 6c 20 63 6f 6d 6d 61 6e  lite" Tcl comman
13640 64 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2c  d is.** invoked,
13650 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75   this routine ru
13660 6e 73 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68  ns to process th
13670 61 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a  at command..**.*
13680 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  * The first argu
13690 6d 65 6e 74 2c 20 44 42 4e 41 4d 45 2c 20 69 73  ment, DBNAME, is
136a0 20 61 6e 20 61 72 62 69 74 72 61 72 79 20 6e 61   an arbitrary na
136b0 6d 65 20 66 6f 72 20 61 20 6e 65 77 0a 2a 2a 20  me for a new.** 
136c0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
136d0 69 6f 6e 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61  ion.  This comma
136e0 6e 64 20 63 72 65 61 74 65 73 20 61 20 6e 65 77  nd creates a new
136f0 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64 0a 2a   command named.*
13700 2a 20 44 42 4e 41 4d 45 20 74 68 61 74 20 69 73  * DBNAME that is
13710 20 75 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c   used to control
13720 20 74 68 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e   that connection
13730 2e 20 20 54 68 65 20 64 61 74 61 62 61 73 65 0a  .  The database.
13740 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  ** connection is
13750 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68   deleted when th
13760 65 20 44 42 4e 41 4d 45 20 63 6f 6d 6d 61 6e 64  e DBNAME command
13770 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a   is deleted..**.
13780 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  ** The second ar
13790 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 61  gument is the na
137a0 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
137b0 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2f 0a 73  se file..**.*/.s
137c0 74 61 74 69 63 20 69 6e 74 20 44 62 4d 61 69 6e  tatic int DbMain
137d0 28 76 6f 69 64 20 2a 63 64 2c 20 54 63 6c 5f 49  (void *cd, Tcl_I
137e0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
137f0 6e 74 20 6f 62 6a 63 2c 54 63 6c 5f 4f 62 6a 20  nt objc,Tcl_Obj 
13800 2a 63 6f 6e 73 74 2a 6f 62 6a 76 29 7b 0a 20 20  *const*objv){.  
13810 53 71 6c 69 74 65 44 62 20 2a 70 3b 0a 20 20 76  SqliteDb *p;.  v
13820 6f 69 64 20 2a 70 4b 65 79 20 3d 20 30 3b 0a 20  oid *pKey = 0;. 
13830 20 69 6e 74 20 6e 4b 65 79 20 3d 20 30 3b 0a 20   int nKey = 0;. 
13840 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
13850 67 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  g;.  char *zErrM
13860 73 67 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  sg;.  int i;.  c
13870 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
13880 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
13890 7a 56 66 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20  zVfs = 0;.  int 
138a0 66 6c 61 67 73 3b 0a 20 20 54 63 6c 5f 44 53 74  flags;.  Tcl_DSt
138b0 72 69 6e 67 20 74 72 61 6e 73 6c 61 74 65 64 46  ring translatedF
138c0 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20 2f 2a 20 49  ilename;..  /* I
138d0 6e 20 6e 6f 72 6d 61 6c 20 75 73 65 2c 20 65 61  n normal use, ea
138e0 63 68 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  ch TCL interpret
138f0 65 72 20 72 75 6e 73 20 69 6e 20 61 20 73 69 6e  er runs in a sin
13900 67 6c 65 20 74 68 72 65 61 64 2e 20 20 53 6f 0a  gle thread.  So.
13910 20 20 2a 2a 20 62 79 20 64 65 66 61 75 6c 74 2c    ** by default,
13920 20 77 65 20 63 61 6e 20 74 75 72 6e 20 6f 66 20   we can turn of 
13930 6d 75 74 65 78 69 6e 67 20 6f 6e 20 53 51 4c 69  mutexing on SQLi
13940 74 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  te database conn
13950 65 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a 20 48 6f  ections..  ** Ho
13960 77 65 76 65 72 2c 20 66 6f 72 20 74 65 73 74 69  wever, for testi
13970 6e 67 20 70 75 72 70 6f 73 65 73 20 69 74 20 69  ng purposes it i
13980 73 20 75 73 65 66 75 6c 20 74 6f 20 68 61 76 65  s useful to have
13990 20 6d 75 74 65 78 65 73 20 74 75 72 6e 65 64 0a   mutexes turned.
139a0 20 20 2a 2a 20 6f 6e 2e 20 20 53 6f 2c 20 62 79    ** on.  So, by
139b0 20 64 65 66 61 75 6c 74 2c 20 6d 75 74 65 78 65   default, mutexe
139c0 73 20 64 65 66 61 75 6c 74 20 6f 66 66 2e 20 20  s default off.  
139d0 42 75 74 20 69 66 20 63 6f 6d 70 69 6c 65 64 20  But if compiled 
139e0 77 69 74 68 0a 20 20 2a 2a 20 53 51 4c 49 54 45  with.  ** SQLITE
139f0 5f 54 43 4c 5f 44 45 46 41 55 4c 54 5f 46 55 4c  _TCL_DEFAULT_FUL
13a00 4c 4d 55 54 45 58 20 74 68 65 6e 20 6d 75 74 65  LMUTEX then mute
13a10 78 65 73 20 64 65 66 61 75 6c 74 20 6f 6e 2e 0a  xes default on..
13a20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
13a30 54 45 5f 54 43 4c 5f 44 45 46 41 55 4c 54 5f 46  TE_TCL_DEFAULT_F
13a40 55 4c 4c 4d 55 54 45 58 0a 20 20 66 6c 61 67 73  ULLMUTEX.  flags
13a50 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
13a60 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54  EADWRITE | SQLIT
13a70 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 20  E_OPEN_CREATE | 
13a80 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c  SQLITE_OPEN_FULL
13a90 4d 55 54 45 58 3b 0a 23 65 6c 73 65 0a 20 20 66  MUTEX;.#else.  f
13aa0 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50  lags = SQLITE_OP
13ab0 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53  EN_READWRITE | S
13ac0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
13ad0 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
13ae0 4e 4f 4d 55 54 45 58 3b 0a 23 65 6e 64 69 66 0a  NOMUTEX;.#endif.
13af0 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29  .  if( objc==2 )
13b00 7b 0a 20 20 20 20 7a 41 72 67 20 3d 20 54 63 6c  {.    zArg = Tcl
13b10 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
13b20 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20  j(objv[1], 0);. 
13b30 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41     if( strcmp(zA
13b40 72 67 2c 22 2d 76 65 72 73 69 6f 6e 22 29 3d 3d  rg,"-version")==
13b50 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  0 ){.      Tcl_A
13b60 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
13b70 72 70 2c 73 71 6c 69 74 65 33 5f 76 65 72 73 69  rp,sqlite3_versi
13b80 6f 6e 2c 30 29 3b 0a 20 20 20 20 20 20 72 65 74  on,0);.      ret
13b90 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20  urn TCL_OK;.    
13ba0 7d 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  }.    if( strcmp
13bb0 28 7a 41 72 67 2c 22 2d 68 61 73 2d 63 6f 64 65  (zArg,"-has-code
13bc0 63 22 29 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66  c")==0 ){.#ifdef
13bd0 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
13be0 43 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  C.      Tcl_Appe
13bf0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
13c00 22 31 22 2c 30 29 3b 0a 23 65 6c 73 65 0a 20 20  "1",0);.#else.  
13c10 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
13c20 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 30 22 2c  sult(interp,"0",
13c30 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  0);.#endif.     
13c40 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
13c50 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
13c60 69 3d 33 3b 20 69 2b 31 3c 6f 62 6a 63 3b 20 69  i=3; i+1<objc; i
13c70 2b 3d 32 29 7b 0a 20 20 20 20 7a 41 72 67 20 3d  +=2){.    zArg =
13c80 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
13c90 62 6a 76 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28  bjv[i]);.    if(
13ca0 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 6b   strcmp(zArg,"-k
13cb0 65 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ey")==0 ){.     
13cc0 20 70 4b 65 79 20 3d 20 54 63 6c 5f 47 65 74 42   pKey = Tcl_GetB
13cd0 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28  yteArrayFromObj(
13ce0 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 6e 4b 65 79  objv[i+1], &nKey
13cf0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
13d00 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d   strcmp(zArg, "-
13d10 76 66 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  vfs")==0 ){.    
13d20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7a 56 66    i++;.      zVf
13d30 73 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  s = Tcl_GetStrin
13d40 67 28 6f 62 6a 76 5b 69 5d 29 3b 0a 20 20 20 20  g(objv[i]);.    
13d50 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
13d60 28 7a 41 72 67 2c 20 22 2d 72 65 61 64 6f 6e 6c  (zArg, "-readonl
13d70 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  y")==0 ){.      
13d80 69 6e 74 20 62 3b 0a 20 20 20 20 20 20 69 66 28  int b;.      if(
13d90 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46   Tcl_GetBooleanF
13da0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
13db0 62 6a 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20  bjv[i+1], &b) ) 
13dc0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
13dd0 3b 0a 20 20 20 20 20 20 69 66 28 20 62 20 29 7b  ;.      if( b ){
13de0 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 26  .        flags &
13df0 3d 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  = ~(SQLITE_OPEN_
13e00 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
13e10 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20  _OPEN_CREATE);. 
13e20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20         flags |= 
13e30 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
13e40 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ONLY;.      }els
13e50 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  e{.        flags
13e60 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e   &= ~SQLITE_OPEN
13e70 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20  _READONLY;.     
13e80 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49     flags |= SQLI
13e90 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
13ea0 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
13eb0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
13ec0 7a 41 72 67 2c 20 22 2d 63 72 65 61 74 65 22 29  zArg, "-create")
13ed0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
13ee0 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63   b;.      if( Tc
13ef0 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
13f00 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
13f10 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20 72 65 74  [i+1], &b) ) ret
13f20 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
13f30 20 20 20 20 20 69 66 28 20 62 20 26 26 20 28 66       if( b && (f
13f40 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
13f50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d 30 20  EN_READONLY)==0 
13f60 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  ){.        flags
13f70 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   |= SQLITE_OPEN_
13f80 43 52 45 41 54 45 3b 0a 20 20 20 20 20 20 7d 65  CREATE;.      }e
13f90 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 61  lse{.        fla
13fa0 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50  gs &= ~SQLITE_OP
13fb0 45 4e 5f 43 52 45 41 54 45 3b 0a 20 20 20 20 20  EN_CREATE;.     
13fc0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
13fd0 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d   strcmp(zArg, "-
13fe0 6e 6f 6d 75 74 65 78 22 29 3d 3d 30 20 29 7b 0a  nomutex")==0 ){.
13ff0 20 20 20 20 20 20 69 6e 74 20 62 3b 0a 20 20 20        int b;.   
14000 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f     if( Tcl_GetBo
14010 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
14020 65 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20  erp, objv[i+1], 
14030 26 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  &b) ) return TCL
14040 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 69 66  _ERROR;.      if
14050 28 20 62 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ( b ){.        f
14060 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
14070 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 20 20 20  PEN_NOMUTEX;.   
14080 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53       flags &= ~S
14090 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d  QLITE_OPEN_FULLM
140a0 55 54 45 58 3b 0a 20 20 20 20 20 20 7d 65 6c 73  UTEX;.      }els
140b0 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  e{.        flags
140c0 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e   &= ~SQLITE_OPEN
140d0 5f 4e 4f 4d 55 54 45 58 3b 0a 20 20 20 20 20 20  _NOMUTEX;.      
140e0 7d 0a 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  }.   }else if( s
140f0 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d 66 75  trcmp(zArg, "-fu
14100 6c 6c 6d 75 74 65 78 22 29 3d 3d 30 20 29 7b 0a  llmutex")==0 ){.
14110 20 20 20 20 20 20 69 6e 74 20 62 3b 0a 20 20 20        int b;.   
14120 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f     if( Tcl_GetBo
14130 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
14140 65 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20  erp, objv[i+1], 
14150 26 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  &b) ) return TCL
14160 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 69 66  _ERROR;.      if
14170 28 20 62 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ( b ){.        f
14180 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
14190 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a 20  PEN_FULLMUTEX;. 
141a0 20 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20         flags &= 
141b0 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d  ~SQLITE_OPEN_NOM
141c0 55 54 45 58 3b 0a 20 20 20 20 20 20 7d 65 6c 73  UTEX;.      }els
141d0 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  e{.        flags
141e0 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e   &= ~SQLITE_OPEN
141f0 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a 20 20 20 20  _FULLMUTEX;.    
14200 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
14210 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
14220 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75  esult(interp, "u
14230 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 22  nknown option: "
14240 2c 20 7a 41 72 67 2c 20 28 63 68 61 72 2a 29 30  , zArg, (char*)0
14250 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
14260 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
14270 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3c  .  }.  if( objc<
14280 33 20 7c 7c 20 28 6f 62 6a 63 26 31 29 21 3d 31  3 || (objc&1)!=1
14290 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
142a0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
142b0 20 31 2c 20 6f 62 6a 76 2c 20 0a 20 20 20 20 20   1, objv, .     
142c0 20 22 48 41 4e 44 4c 45 20 46 49 4c 45 4e 41 4d   "HANDLE FILENAM
142d0 45 20 3f 2d 76 66 73 20 56 46 53 4e 41 4d 45 3f  E ?-vfs VFSNAME?
142e0 20 3f 2d 72 65 61 64 6f 6e 6c 79 20 42 4f 4f 4c   ?-readonly BOOL
142f0 45 41 4e 3f 20 3f 2d 63 72 65 61 74 65 20 42 4f  EAN? ?-create BO
14300 4f 4c 45 41 4e 3f 22 0a 20 20 20 20 20 20 22 20  OLEAN?".      " 
14310 3f 2d 6e 6f 6d 75 74 65 78 20 42 4f 4f 4c 45 41  ?-nomutex BOOLEA
14320 4e 3f 20 3f 2d 66 75 6c 6c 6d 75 74 65 78 20 42  N? ?-fullmutex B
14330 4f 4f 4c 45 41 4e 3f 22 0a 23 69 66 64 65 66 20  OOLEAN?".#ifdef 
14340 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
14350 0a 20 20 20 20 20 20 22 20 3f 2d 6b 65 79 20 43  .      " ?-key C
14360 4f 44 45 43 4b 45 59 3f 22 0a 23 65 6e 64 69 66  ODECKEY?".#endif
14370 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 65 74 75  .    );.    retu
14380 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
14390 7d 0a 20 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b  }.  zErrMsg = 0;
143a0 0a 20 20 70 20 3d 20 28 53 71 6c 69 74 65 44 62  .  p = (SqliteDb
143b0 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a  *)Tcl_Alloc( siz
143c0 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28  eof(*p) );.  if(
143d0 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c   p==0 ){.    Tcl
143e0 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
143f0 70 2c 20 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65  p, "malloc faile
14400 64 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  d", TCL_STATIC);
14410 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
14420 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 6d 65 6d  ERROR;.  }.  mem
14430 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66  set(p, 0, sizeof
14440 28 2a 70 29 29 3b 0a 20 20 7a 46 69 6c 65 20 3d  (*p));.  zFile =
14450 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
14460 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30  omObj(objv[2], 0
14470 29 3b 0a 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c  );.  zFile = Tcl
14480 5f 54 72 61 6e 73 6c 61 74 65 46 69 6c 65 4e 61  _TranslateFileNa
14490 6d 65 28 69 6e 74 65 72 70 2c 20 7a 46 69 6c 65  me(interp, zFile
144a0 2c 20 26 74 72 61 6e 73 6c 61 74 65 64 46 69 6c  , &translatedFil
144b0 65 6e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  ename);.  sqlite
144c0 33 5f 6f 70 65 6e 5f 76 32 28 7a 46 69 6c 65 2c  3_open_v2(zFile,
144d0 20 26 70 2d 3e 64 62 2c 20 66 6c 61 67 73 2c 20   &p->db, flags, 
144e0 7a 56 66 73 29 3b 0a 20 20 54 63 6c 5f 44 53 74  zVfs);.  Tcl_DSt
144f0 72 69 6e 67 46 72 65 65 28 26 74 72 61 6e 73 6c  ringFree(&transl
14500 61 74 65 64 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  atedFilename);. 
14510 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
14520 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
14530 70 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20 7a 45  p->db) ){.    zE
14540 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
14550 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71  mprintf("%s", sq
14560 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e  lite3_errmsg(p->
14570 64 62 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  db));.    sqlite
14580 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 29 3b 0a  3_close(p->db);.
14590 20 20 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20      p->db = 0;. 
145a0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
145b0 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28  _HAS_CODEC.  if(
145c0 20 70 2d 3e 64 62 20 29 7b 0a 20 20 20 20 73 71   p->db ){.    sq
145d0 6c 69 74 65 33 5f 6b 65 79 28 70 2d 3e 64 62 2c  lite3_key(p->db,
145e0 20 70 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20   pKey, nKey);.  
145f0 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
14600 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20 54  ->db==0 ){.    T
14610 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
14620 65 72 70 2c 20 7a 45 72 72 4d 73 67 2c 20 54 43  erp, zErrMsg, TC
14630 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20  L_VOLATILE);.   
14640 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a   Tcl_Free((char*
14650 29 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  )p);.    sqlite3
14660 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a  _free(zErrMsg);.
14670 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
14680 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d  RROR;.  }.  p->m
14690 61 78 53 74 6d 74 20 3d 20 4e 55 4d 5f 50 52 45  axStmt = NUM_PRE
146a0 50 41 52 45 44 5f 53 54 4d 54 53 3b 0a 20 20 70  PARED_STMTS;.  p
146b0 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  ->interp = inter
146c0 70 3b 0a 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f  p;.  zArg = Tcl_
146d0 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
146e0 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20  (objv[1], 0);.  
146f0 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
14700 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 7a 41 72  mand(interp, zAr
14710 67 2c 20 44 62 4f 62 6a 43 6d 64 2c 20 28 63 68  g, DbObjCmd, (ch
14720 61 72 2a 29 70 2c 20 44 62 44 65 6c 65 74 65 43  ar*)p, DbDeleteC
14730 6d 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  md);.  return TC
14740 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  L_OK;.}../*.** P
14750 72 6f 76 69 64 65 20 61 20 64 75 6d 6d 79 20 54  rovide a dummy T
14760 63 6c 5f 49 6e 69 74 53 74 75 62 73 20 69 66 20  cl_InitStubs if 
14770 77 65 20 61 72 65 20 75 73 69 6e 67 20 74 68 69  we are using thi
14780 73 20 61 73 20 61 20 73 74 61 74 69 63 0a 2a 2a  s as a static.**
14790 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66   library..*/.#if
147a0 6e 64 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55  ndef USE_TCL_STU
147b0 42 53 0a 23 20 75 6e 64 65 66 20 20 54 63 6c 5f  BS.# undef  Tcl_
147c0 49 6e 69 74 53 74 75 62 73 0a 23 20 64 65 66 69  InitStubs.# defi
147d0 6e 65 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73  ne Tcl_InitStubs
147e0 28 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a  (a,b,c).#endif..
147f0 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
14800 77 65 20 68 61 76 65 20 61 20 50 41 43 4b 41 47  we have a PACKAG
14810 45 5f 56 45 52 53 49 4f 4e 20 6d 61 63 72 6f 20  E_VERSION macro 
14820 64 65 66 69 6e 65 64 2e 20 20 54 68 69 73 20 77  defined.  This w
14830 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 66 69 6e 65  ill be.** define
14840 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
14850 62 79 20 74 68 65 20 54 45 41 20 6d 61 6b 65 66  by the TEA makef
14860 69 6c 65 2e 20 20 42 75 74 20 6f 74 68 65 72 20  ile.  But other 
14870 6d 61 6b 65 66 69 6c 65 73 0a 2a 2a 20 64 6f 20  makefiles.** do 
14880 6e 6f 74 20 64 65 66 69 6e 65 20 69 74 2e 0a 2a  not define it..*
14890 2f 0a 23 69 66 6e 64 65 66 20 50 41 43 4b 41 47  /.#ifndef PACKAG
148a0 45 5f 56 45 52 53 49 4f 4e 0a 23 20 64 65 66 69  E_VERSION.# defi
148b0 6e 65 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49  ne PACKAGE_VERSI
148c0 4f 4e 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f  ON SQLITE_VERSIO
148d0 4e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  N.#endif../*.** 
148e0 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20  Initialize this 
148f0 6d 6f 64 75 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  module..**.** Th
14900 69 73 20 54 63 6c 20 6d 6f 64 75 6c 65 20 63 6f  is Tcl module co
14910 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 61 20 73 69  ntains only a si
14920 6e 67 6c 65 20 6e 65 77 20 54 63 6c 20 63 6f 6d  ngle new Tcl com
14930 6d 61 6e 64 20 6e 61 6d 65 64 20 22 73 71 6c 69  mand named "sqli
14940 74 65 22 2e 0a 2a 2a 20 28 48 65 6e 63 65 20 74  te"..** (Hence t
14950 68 65 72 65 20 69 73 20 6e 6f 20 6e 61 6d 65 73  here is no names
14960 70 61 63 65 2e 20 20 54 68 65 72 65 20 69 73 20  pace.  There is 
14970 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 75 73 69 6e  no point in usin
14980 67 20 61 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a  g a namespace.**
14990 20 69 66 20 74 68 65 20 65 78 74 65 6e 73 69 6f   if the extensio
149a0 6e 20 6f 6e 6c 79 20 73 75 70 70 6c 69 65 73 20  n only supplies 
149b0 6f 6e 65 20 6e 65 77 20 6e 61 6d 65 21 29 20 20  one new name!)  
149c0 54 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d  The "sqlite" com
149d0 6d 61 6e 64 20 69 73 0a 2a 2a 20 75 73 65 64 20  mand is.** used 
149e0 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 53 51  to open a new SQ
149f0 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e 20 20  Lite database.  
14a00 53 65 65 20 74 68 65 20 44 62 4d 61 69 6e 28 29  See the DbMain()
14a10 20 72 6f 75 74 69 6e 65 20 61 62 6f 76 65 0a 2a   routine above.*
14a20 2a 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  * for additional
14a30 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f   information..*/
14a40 0a 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69  .EXTERN int Sqli
14a50 74 65 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  te3_Init(Tcl_Int
14a60 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20  erp *interp){.  
14a70 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 69 6e  Tcl_InitStubs(in
14a80 74 65 72 70 2c 20 22 38 2e 34 22 2c 20 30 29 3b  terp, "8.4", 0);
14a90 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a  .  Tcl_CreateObj
14aa0 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
14ab0 22 73 71 6c 69 74 65 33 22 2c 20 28 54 63 6c 5f  "sqlite3", (Tcl_
14ac0 4f 62 6a 43 6d 64 50 72 6f 63 2a 29 44 62 4d 61  ObjCmdProc*)DbMa
14ad0 69 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c  in, 0, 0);.  Tcl
14ae0 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65  _PkgProvide(inte
14af0 72 70 2c 20 22 73 71 6c 69 74 65 33 22 2c 20 50  rp, "sqlite3", P
14b00 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29 3b  ACKAGE_VERSION);
14b10 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a  .  Tcl_CreateObj
14b20 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
14b30 22 73 71 6c 69 74 65 22 2c 20 28 54 63 6c 5f 4f  "sqlite", (Tcl_O
14b40 62 6a 43 6d 64 50 72 6f 63 2a 29 44 62 4d 61 69  bjCmdProc*)DbMai
14b50 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f  n, 0, 0);.  Tcl_
14b60 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72  PkgProvide(inter
14b70 70 2c 20 22 73 71 6c 69 74 65 22 2c 20 50 41 43  p, "sqlite", PAC
14b80 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29 3b 0a 20  KAGE_VERSION);. 
14b90 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
14ba0 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63 6c  }.EXTERN int Tcl
14bb0 73 71 6c 69 74 65 33 5f 49 6e 69 74 28 54 63 6c  sqlite3_Init(Tcl
14bc0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
14bd0 7b 20 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33  { return Sqlite3
14be0 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d  _Init(interp); }
14bf0 0a 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69  .EXTERN int Sqli
14c00 74 65 33 5f 53 61 66 65 49 6e 69 74 28 54 63 6c  te3_SafeInit(Tcl
14c10 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
14c20 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b  { return TCL_OK;
14c30 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63   }.EXTERN int Tc
14c40 6c 73 71 6c 69 74 65 33 5f 53 61 66 65 49 6e 69  lsqlite3_SafeIni
14c50 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
14c60 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 54 43  terp){ return TC
14c70 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e 20 69  L_OK; }.EXTERN i
14c80 6e 74 20 53 71 6c 69 74 65 33 5f 55 6e 6c 6f 61  nt Sqlite3_Unloa
14c90 64 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  d(Tcl_Interp *in
14ca0 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  terp, int flags)
14cb0 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b  { return TCL_OK;
14cc0 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63   }.EXTERN int Tc
14cd0 6c 73 71 6c 69 74 65 33 5f 55 6e 6c 6f 61 64 28  lsqlite3_Unload(
14ce0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
14cf0 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 20  rp, int flags){ 
14d00 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d  return TCL_OK; }
14d10 0a 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69  .EXTERN int Sqli
14d20 74 65 33 5f 53 61 66 65 55 6e 6c 6f 61 64 28 54  te3_SafeUnload(T
14d30 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
14d40 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 20 72  p, int flags){ r
14d50 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a  eturn TCL_OK; }.
14d60 45 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73 71  EXTERN int Tclsq
14d70 6c 69 74 65 33 5f 53 61 66 65 55 6e 6c 6f 61 64  lite3_SafeUnload
14d80 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
14d90 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  erp, int flags){
14da0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 7d   return TCL_OK;}
14db0 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
14dc0 45 5f 33 5f 53 55 46 46 49 58 5f 4f 4e 4c 59 0a  E_3_SUFFIX_ONLY.
14dd0 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74  EXTERN int Sqlit
14de0 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  e_Init(Tcl_Inter
14df0 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75  p *interp){ retu
14e00 72 6e 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28  rn Sqlite3_Init(
14e10 69 6e 74 65 72 70 29 3b 20 7d 0a 45 58 54 45 52  interp); }.EXTER
14e20 4e 20 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 5f  N int Tclsqlite_
14e30 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
14e40 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e  *interp){ return
14e50 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e   Sqlite3_Init(in
14e60 74 65 72 70 29 3b 20 7d 0a 45 58 54 45 52 4e 20  terp); }.EXTERN 
14e70 69 6e 74 20 53 71 6c 69 74 65 5f 53 61 66 65 49  int Sqlite_SafeI
14e80 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
14e90 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20  interp){ return 
14ea0 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e  TCL_OK; }.EXTERN
14eb0 20 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 5f 53   int Tclsqlite_S
14ec0 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  afeInit(Tcl_Inte
14ed0 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74  rp *interp){ ret
14ee0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58  urn TCL_OK; }.EX
14ef0 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65 5f  TERN int Sqlite_
14f00 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72  Unload(Tcl_Inter
14f10 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66  p *interp, int f
14f20 6c 61 67 73 29 7b 20 72 65 74 75 72 6e 20 54 43  lags){ return TC
14f30 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e 20 69  L_OK; }.EXTERN i
14f40 6e 74 20 54 63 6c 73 71 6c 69 74 65 5f 55 6e 6c  nt Tclsqlite_Unl
14f50 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  oad(Tcl_Interp *
14f60 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67  interp, int flag
14f70 73 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  s){ return TCL_O
14f80 4b 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20  K; }.EXTERN int 
14f90 53 71 6c 69 74 65 5f 53 61 66 65 55 6e 6c 6f 61  Sqlite_SafeUnloa
14fa0 64 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  d(Tcl_Interp *in
14fb0 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  terp, int flags)
14fc0 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b  { return TCL_OK;
14fd0 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63   }.EXTERN int Tc
14fe0 6c 73 71 6c 69 74 65 5f 53 61 66 65 55 6e 6c 6f  lsqlite_SafeUnlo
14ff0 61 64 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  ad(Tcl_Interp *i
15000 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 73  nterp, int flags
15010 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  ){ return TCL_OK
15020 3b 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  ;}.#endif..#ifde
15030 66 20 54 43 4c 53 48 0a 2f 2a 2a 2a 2a 2a 2a 2a  f TCLSH./*******
15040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15080 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ******.** The co
15090 64 65 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20  de that follows 
150a0 69 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64  is used to build
150b0 20 73 74 61 6e 64 61 6c 6f 6e 65 20 54 43 4c 20   standalone TCL 
150c0 69 6e 74 65 72 70 72 65 74 65 72 73 0a 2a 2a 20  interpreters.** 
150d0 74 68 61 74 20 61 72 65 20 73 74 61 74 69 63 61  that are statica
150e0 6c 6c 79 20 6c 69 6e 6b 65 64 20 77 69 74 68 20  lly linked with 
150f0 53 51 4c 69 74 65 2e 20 20 0a 2a 2f 0a 0a 2f 2a  SQLite.  .*/../*
15100 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 63 72 6f  .** If the macro
15110 20 54 43 4c 53 48 20 69 73 20 6f 6e 65 2c 20 74   TCLSH is one, t
15120 68 65 6e 20 70 75 74 20 69 6e 20 63 6f 64 65 20  hen put in code 
15130 74 68 69 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20  this for the.** 
15140 22 6d 61 69 6e 22 20 72 6f 75 74 69 6e 65 20 74  "main" routine t
15150 68 61 74 20 77 69 6c 6c 20 69 6e 69 74 69 61 6c  hat will initial
15160 69 7a 65 20 54 63 6c 20 61 6e 64 20 74 61 6b 65  ize Tcl and take
15170 20 69 6e 70 75 74 20 66 72 6f 6d 0a 2a 2a 20 73   input from.** s
15180 74 61 6e 64 61 72 64 20 69 6e 70 75 74 2c 20 6f  tandard input, o
15190 72 20 69 66 20 61 20 66 69 6c 65 20 69 73 20 6e  r if a file is n
151a0 61 6d 65 64 20 6f 6e 20 74 68 65 20 63 6f 6d 6d  amed on the comm
151b0 61 6e 64 20 6c 69 6e 65 0a 2a 2a 20 74 68 65 20  and line.** the 
151c0 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
151d0 72 65 61 64 73 20 61 6e 64 20 65 76 61 6c 75 61  reads and evalua
151e0 74 65 73 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a  tes that file..*
151f0 2f 0a 23 69 66 20 54 43 4c 53 48 3d 3d 31 0a 73  /.#if TCLSH==1.s
15200 74 61 74 69 63 20 63 68 61 72 20 7a 4d 61 69 6e  tatic char zMain
15210 6c 6f 6f 70 5b 5d 20 3d 0a 20 20 22 73 65 74 20  loop[] =.  "set 
15220 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20 22 77 68  line {}\n".  "wh
15230 69 6c 65 20 7b 21 5b 65 6f 66 20 73 74 64 69 6e  ile {![eof stdin
15240 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 22 69 66 20  ]} {\n".    "if 
15250 7b 24 6c 69 6e 65 21 3d 5c 22 5c 22 7d 20 7b 5c  {$line!=\"\"} {\
15260 6e 22 0a 20 20 20 20 20 20 22 70 75 74 73 20 2d  n".      "puts -
15270 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22 3e 20 5c 22  nonewline \"> \"
15280 5c 6e 22 0a 20 20 20 20 22 7d 20 65 6c 73 65 20  \n".    "} else 
15290 7b 5c 6e 22 0a 20 20 20 20 20 20 22 70 75 74 73  {\n".      "puts
152a0 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22 25 20   -nonewline \"% 
152b0 5c 22 5c 6e 22 0a 20 20 20 20 22 7d 5c 6e 22 0a  \"\n".    "}\n".
152c0 20 20 20 20 22 66 6c 75 73 68 20 73 74 64 6f 75      "flush stdou
152d0 74 5c 6e 22 0a 20 20 20 20 22 61 70 70 65 6e 64  t\n".    "append
152e0 20 6c 69 6e 65 20 5b 67 65 74 73 20 73 74 64 69   line [gets stdi
152f0 6e 5d 5c 6e 22 0a 20 20 20 20 22 69 66 20 7b 5b  n]\n".    "if {[
15300 69 6e 66 6f 20 63 6f 6d 70 6c 65 74 65 20 24 6c  info complete $l
15310 69 6e 65 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 20  ine]} {\n".     
15320 20 22 69 66 20 7b 5b 63 61 74 63 68 20 7b 75 70   "if {[catch {up
15330 6c 65 76 65 6c 20 23 30 20 24 6c 69 6e 65 7d 20  level #0 $line} 
15340 72 65 73 75 6c 74 5d 7d 20 7b 5c 6e 22 0a 20 20  result]} {\n".  
15350 20 20 20 20 20 20 22 70 75 74 73 20 73 74 64 65        "puts stde
15360 72 72 20 5c 22 45 72 72 6f 72 3a 20 24 72 65 73  rr \"Error: $res
15370 75 6c 74 5c 22 5c 6e 22 0a 20 20 20 20 20 20 22  ult\"\n".      "
15380 7d 20 65 6c 73 65 69 66 20 7b 24 72 65 73 75 6c  } elseif {$resul
15390 74 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20  t!=\"\"} {\n".  
153a0 20 20 20 20 20 20 22 70 75 74 73 20 24 72 65 73        "puts $res
153b0 75 6c 74 5c 6e 22 0a 20 20 20 20 20 20 22 7d 5c  ult\n".      "}\
153c0 6e 22 0a 20 20 20 20 20 20 22 73 65 74 20 6c 69  n".      "set li
153d0 6e 65 20 7b 7d 5c 6e 22 0a 20 20 20 20 22 7d 20  ne {}\n".    "} 
153e0 65 6c 73 65 20 7b 5c 6e 22 0a 20 20 20 20 20 20  else {\n".      
153f0 22 61 70 70 65 6e 64 20 6c 69 6e 65 20 5c 5c 6e  "append line \\n
15400 5c 6e 22 0a 20 20 20 20 22 7d 5c 6e 22 0a 20 20  \n".    "}\n".  
15410 22 7d 5c 6e 22 0a 3b 0a 23 65 6e 64 69 66 0a 0a  "}\n".;.#endif..
15420 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 63  /*.** If the mac
15430 72 6f 20 54 43 4c 53 48 20 69 73 20 74 77 6f 2c  ro TCLSH is two,
15440 20 74 68 65 6e 20 67 65 74 20 74 68 65 20 6d 61   then get the ma
15450 69 6e 20 6c 6f 6f 70 20 63 6f 64 65 20 6f 75 74  in loop code out
15460 20 6f 66 0a 2a 2a 20 74 68 65 20 73 65 70 61 72   of.** the separ
15470 61 74 65 20 66 69 6c 65 20 22 73 70 61 63 65 61  ate file "spacea
15480 6e 61 6c 5f 74 63 6c 2e 68 22 2e 0a 2a 2f 0a 23  nal_tcl.h"..*/.#
15490 69 66 20 54 43 4c 53 48 3d 3d 32 0a 73 74 61 74  if TCLSH==2.stat
154a0 69 63 20 63 68 61 72 20 7a 4d 61 69 6e 6c 6f 6f  ic char zMainloo
154b0 70 5b 5d 20 3d 20 0a 23 69 6e 63 6c 75 64 65 20  p[] = .#include 
154c0 22 73 70 61 63 65 61 6e 61 6c 5f 74 63 6c 2e 68  "spaceanal_tcl.h
154d0 22 0a 3b 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66  ".;.#endif..#def
154e0 69 6e 65 20 54 43 4c 53 48 5f 4d 41 49 4e 20 6d  ine TCLSH_MAIN m
154f0 61 69 6e 20 20 20 2f 2a 20 4e 65 65 64 65 64 20  ain   /* Needed 
15500 74 6f 20 66 61 6b 65 20 6f 75 74 20 6d 6b 74 63  to fake out mktc
15510 6c 61 70 70 20 2a 2f 0a 69 6e 74 20 54 43 4c 53  lapp */.int TCLS
15520 48 5f 4d 41 49 4e 28 69 6e 74 20 61 72 67 63 2c  H_MAIN(int argc,
15530 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20   char **argv){. 
15540 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
15550 65 72 70 3b 0a 20 20 0a 20 20 2f 2a 20 43 61 6c  erp;.  .  /* Cal
15560 6c 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f  l sqlite3_shutdo
15570 77 6e 28 29 20 6f 6e 63 65 20 62 65 66 6f 72 65  wn() once before
15580 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20   doing anything 
15590 65 6c 73 65 2e 20 54 68 69 73 20 69 73 20 74 6f  else. This is to
155a0 0a 20 20 2a 2a 20 74 65 73 74 20 74 68 61 74 20  .  ** test that 
155b0 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e  sqlite3_shutdown
155c0 28 29 20 63 61 6e 20 62 65 20 73 61 66 65 6c 79  () can be safely
155d0 20 63 61 6c 6c 65 64 20 62 79 20 61 20 70 72 6f   called by a pro
155e0 63 65 73 73 20 62 65 66 6f 72 65 0a 20 20 2a 2a  cess before.  **
155f0 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
15600 69 7a 65 28 29 20 69 73 2e 20 2a 2f 0a 20 20 73  ize() is. */.  s
15610 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28  qlite3_shutdown(
15620 29 3b 0a 0a 20 20 54 63 6c 5f 46 69 6e 64 45 78  );..  Tcl_FindEx
15630 65 63 75 74 61 62 6c 65 28 61 72 67 76 5b 30 5d  ecutable(argv[0]
15640 29 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20 54 63  );.  interp = Tc
15650 6c 5f 43 72 65 61 74 65 49 6e 74 65 72 70 28 29  l_CreateInterp()
15660 3b 0a 20 20 53 71 6c 69 74 65 33 5f 49 6e 69 74  ;.  Sqlite3_Init
15670 28 69 6e 74 65 72 70 29 3b 0a 23 69 66 64 65 66  (interp);.#ifdef
15680 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 7b   SQLITE_TEST.  {
15690 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
156a0 4d 64 35 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  Md5_Init(Tcl_Int
156b0 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
156c0 6e 20 69 6e 74 20 53 71 6c 69 74 65 63 6f 6e 66  n int Sqliteconf
156d0 69 67 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  ig_Init(Tcl_Inte
156e0 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
156f0 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 31   int Sqlitetest1
15700 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
15710 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
15720 6e 74 20 53 71 6c 69 74 65 74 65 73 74 32 5f 49  nt Sqlitetest2_I
15730 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
15740 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
15750 20 53 71 6c 69 74 65 74 65 73 74 33 5f 49 6e 69   Sqlitetest3_Ini
15760 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
15770 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
15780 71 6c 69 74 65 74 65 73 74 34 5f 49 6e 69 74 28  qlitetest4_Init(
15790 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
157a0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
157b0 69 74 65 74 65 73 74 35 5f 49 6e 69 74 28 54 63  itetest5_Init(Tc
157c0 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
157d0 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
157e0 65 74 65 73 74 36 5f 49 6e 69 74 28 54 63 6c 5f  etest6_Init(Tcl_
157f0 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
15800 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
15810 65 73 74 37 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  est7_Init(Tcl_In
15820 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
15830 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
15840 74 38 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  t8_Init(Tcl_Inte
15850 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
15860 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 39   int Sqlitetest9
15870 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
15880 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
15890 6e 74 20 53 71 6c 69 74 65 74 65 73 74 61 73 79  nt Sqlitetestasy
158a0 6e 63 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  nc_Init(Tcl_Inte
158b0 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
158c0 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f   int Sqlitetest_
158d0 61 75 74 6f 65 78 74 5f 49 6e 69 74 28 54 63 6c  autoext_Init(Tcl
158e0 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
158f0 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
15900 74 65 73 74 5f 66 75 6e 63 5f 49 6e 69 74 28 54  test_func_Init(T
15910 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
15920 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
15930 74 65 74 65 73 74 5f 68 65 78 69 6f 5f 49 6e 69  tetest_hexio_Ini
15940 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
15950 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
15960 71 6c 69 74 65 74 65 73 74 5f 6d 61 6c 6c 6f 63  qlitetest_malloc
15970 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
15980 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
15990 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f 6d 75  nt Sqlitetest_mu
159a0 74 65 78 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  tex_Init(Tcl_Int
159b0 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
159c0 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
159d0 73 63 68 65 6d 61 5f 49 6e 69 74 28 54 63 6c 5f  schema_Init(Tcl_
159e0 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
159f0 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
15a00 65 73 74 73 73 65 5f 49 6e 69 74 28 54 63 6c 5f  estsse_Init(Tcl_
15a10 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
15a20 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
15a30 65 73 74 74 63 6c 76 61 72 5f 49 6e 69 74 28 54  esttclvar_Init(T
15a40 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
15a50 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
15a60 74 65 74 65 73 74 54 68 72 65 61 64 5f 49 6e 69  tetestThread_Ini
15a70 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
15a80 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
15a90 71 6c 69 74 65 74 65 73 74 4f 6e 65 66 69 6c 65  qlitetestOnefile
15aa0 5f 49 6e 69 74 28 29 3b 0a 20 20 20 20 65 78 74  _Init();.    ext
15ab0 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
15ac0 73 74 4f 73 69 6e 73 74 5f 49 6e 69 74 28 54 63  stOsinst_Init(Tc
15ad0 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
15ae0 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
15af0 65 74 65 73 74 62 61 63 6b 75 70 5f 49 6e 69 74  etestbackup_Init
15b00 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 0a  (Tcl_Interp*);..
15b10 20 20 20 20 4d 64 35 5f 49 6e 69 74 28 69 6e 74      Md5_Init(int
15b20 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
15b30 63 6f 6e 66 69 67 5f 49 6e 69 74 28 69 6e 74 65  config_Init(inte
15b40 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
15b50 65 73 74 31 5f 49 6e 69 74 28 69 6e 74 65 72 70  est1_Init(interp
15b60 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
15b70 74 32 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  t2_Init(interp);
15b80 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 33  .    Sqlitetest3
15b90 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
15ba0 20 20 20 53 71 6c 69 74 65 74 65 73 74 34 5f 49     Sqlitetest4_I
15bb0 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
15bc0 20 53 71 6c 69 74 65 74 65 73 74 35 5f 49 6e 69   Sqlitetest5_Ini
15bd0 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
15be0 71 6c 69 74 65 74 65 73 74 36 5f 49 6e 69 74 28  qlitetest6_Init(
15bf0 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
15c00 69 74 65 74 65 73 74 37 5f 49 6e 69 74 28 69 6e  itetest7_Init(in
15c10 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
15c20 65 74 65 73 74 38 5f 49 6e 69 74 28 69 6e 74 65  etest8_Init(inte
15c30 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
15c40 65 73 74 39 5f 49 6e 69 74 28 69 6e 74 65 72 70  est9_Init(interp
15c50 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
15c60 74 61 73 79 6e 63 5f 49 6e 69 74 28 69 6e 74 65  tasync_Init(inte
15c70 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
15c80 65 73 74 5f 61 75 74 6f 65 78 74 5f 49 6e 69 74  est_autoext_Init
15c90 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
15ca0 6c 69 74 65 74 65 73 74 5f 66 75 6e 63 5f 49 6e  litetest_func_In
15cb0 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
15cc0 53 71 6c 69 74 65 74 65 73 74 5f 68 65 78 69 6f  Sqlitetest_hexio
15cd0 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
15ce0 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f 6d 61     Sqlitetest_ma
15cf0 6c 6c 6f 63 5f 49 6e 69 74 28 69 6e 74 65 72 70  lloc_Init(interp
15d00 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
15d10 74 5f 6d 75 74 65 78 5f 49 6e 69 74 28 69 6e 74  t_mutex_Init(int
15d20 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
15d30 74 65 73 74 73 63 68 65 6d 61 5f 49 6e 69 74 28  testschema_Init(
15d40 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
15d50 69 74 65 74 65 73 74 74 63 6c 76 61 72 5f 49 6e  itetesttclvar_In
15d60 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
15d70 53 71 6c 69 74 65 74 65 73 74 54 68 72 65 61 64  SqlitetestThread
15d80 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
15d90 20 20 20 53 71 6c 69 74 65 74 65 73 74 4f 6e 65     SqlitetestOne
15da0 66 69 6c 65 5f 49 6e 69 74 28 69 6e 74 65 72 70  file_Init(interp
15db0 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
15dc0 74 4f 73 69 6e 73 74 5f 49 6e 69 74 28 69 6e 74  tOsinst_Init(int
15dd0 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
15de0 74 65 73 74 62 61 63 6b 75 70 5f 49 6e 69 74 28  testbackup_Init(
15df0 69 6e 74 65 72 70 29 3b 0a 0a 23 69 66 64 65 66  interp);..#ifdef
15e00 20 53 51 4c 49 54 45 5f 53 53 45 0a 20 20 20 20   SQLITE_SSE.    
15e10 53 71 6c 69 74 65 74 65 73 74 73 73 65 5f 49 6e  Sqlitetestsse_In
15e20 69 74 28 69 6e 74 65 72 70 29 3b 0a 23 65 6e 64  it(interp);.#end
15e30 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  if.  }.#endif.  
15e40 69 66 28 20 61 72 67 63 3e 3d 32 20 7c 7c 20 54  if( argc>=2 || T
15e50 43 4c 53 48 3d 3d 32 20 29 7b 0a 20 20 20 20 69  CLSH==2 ){.    i
15e60 6e 74 20 69 3b 0a 20 20 20 20 63 68 61 72 20 7a  nt i;.    char z
15e70 41 72 67 63 5b 33 32 5d 3b 0a 20 20 20 20 73 71  Argc[32];.    sq
15e80 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
15e90 69 7a 65 6f 66 28 7a 41 72 67 63 29 2c 20 7a 41  izeof(zArgc), zA
15ea0 72 67 63 2c 20 22 25 64 22 2c 20 61 72 67 63 2d  rgc, "%d", argc-
15eb0 28 33 2d 54 43 4c 53 48 29 29 3b 0a 20 20 20 20  (3-TCLSH));.    
15ec0 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72  Tcl_SetVar(inter
15ed0 70 2c 22 61 72 67 63 22 2c 20 7a 41 72 67 63 2c  p,"argc", zArgc,
15ee0 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59   TCL_GLOBAL_ONLY
15ef0 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 56 61  );.    Tcl_SetVa
15f00 72 28 69 6e 74 65 72 70 2c 22 61 72 67 76 30 22  r(interp,"argv0"
15f10 2c 61 72 67 76 5b 31 5d 2c 54 43 4c 5f 47 4c 4f  ,argv[1],TCL_GLO
15f20 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 54  BAL_ONLY);.    T
15f30 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70  cl_SetVar(interp
15f40 2c 22 61 72 67 76 22 2c 20 22 22 2c 20 54 43 4c  ,"argv", "", TCL
15f50 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20  _GLOBAL_ONLY);. 
15f60 20 20 20 66 6f 72 28 69 3d 33 2d 54 43 4c 53 48     for(i=3-TCLSH
15f70 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a  ; i<argc; i++){.
15f80 20 20 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72        Tcl_SetVar
15f90 28 69 6e 74 65 72 70 2c 20 22 61 72 67 76 22 2c  (interp, "argv",
15fa0 20 61 72 67 76 5b 69 5d 2c 0a 20 20 20 20 20 20   argv[i],.      
15fb0 20 20 20 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f      TCL_GLOBAL_O
15fc0 4e 4c 59 20 7c 20 54 43 4c 5f 4c 49 53 54 5f 45  NLY | TCL_LIST_E
15fd0 4c 45 4d 45 4e 54 20 7c 20 54 43 4c 5f 41 50 50  LEMENT | TCL_APP
15fe0 45 4e 44 5f 56 41 4c 55 45 29 3b 0a 20 20 20 20  END_VALUE);.    
15ff0 7d 0a 20 20 20 20 69 66 28 20 54 43 4c 53 48 3d  }.    if( TCLSH=
16000 3d 31 20 26 26 20 54 63 6c 5f 45 76 61 6c 46 69  =1 && Tcl_EvalFi
16010 6c 65 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  le(interp, argv[
16020 31 5d 29 21 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20  1])!=TCL_OK ){. 
16030 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
16040 2a 7a 49 6e 66 6f 20 3d 20 54 63 6c 5f 47 65 74  *zInfo = Tcl_Get
16050 56 61 72 28 69 6e 74 65 72 70 2c 20 22 65 72 72  Var(interp, "err
16060 6f 72 49 6e 66 6f 22 2c 20 54 43 4c 5f 47 4c 4f  orInfo", TCL_GLO
16070 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 20  BAL_ONLY);.     
16080 20 69 66 28 20 7a 49 6e 66 6f 3d 3d 30 20 29 20   if( zInfo==0 ) 
16090 7a 49 6e 66 6f 20 3d 20 54 63 6c 5f 47 65 74 53  zInfo = Tcl_GetS
160a0 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65  tringResult(inte
160b0 72 70 29 3b 0a 20 20 20 20 20 20 66 70 72 69 6e  rp);.      fprin
160c0 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a 20 25  tf(stderr,"%s: %
160d0 73 5c 6e 22 2c 20 2a 61 72 67 76 2c 20 7a 49 6e  s\n", *argv, zIn
160e0 66 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  fo);.      retur
160f0 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
16100 20 69 66 28 20 61 72 67 63 3c 3d 31 20 7c 7c 20   if( argc<=1 || 
16110 54 43 4c 53 48 3d 3d 32 20 29 7b 0a 20 20 20 20  TCLSH==2 ){.    
16120 54 63 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 28 69  Tcl_GlobalEval(i
16130 6e 74 65 72 70 2c 20 7a 4d 61 69 6e 6c 6f 6f 70  nterp, zMainloop
16140 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
16150 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 54  0;.}.#endif /* T
16160 43 4c 53 48 20 2a 2f 0a                          CLSH */.