/ Hex Artifact Content
Login

Artifact 63fcca6796db7dc0a5f65da953cf548cdc559c72:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 41 20 54 43 4c 20  ******.** A TCL 
0180: 49 6e 74 65 72 66 61 63 65 20 74 6f 20 53 51 4c  Interface to SQL
0190: 69 74 65 2e 20 20 41 70 70 65 6e 64 20 74 68 69  ite.  Append thi
01a0: 73 20 66 69 6c 65 20 74 6f 20 73 71 6c 69 74 65  s file to sqlite
01b0: 33 2e 63 20 61 6e 64 0a 2a 2a 20 63 6f 6d 70 69  3.c and.** compi
01c0: 6c 65 20 74 68 65 20 77 68 6f 6c 65 20 74 68 69  le the whole thi
01d0: 6e 67 20 74 6f 20 62 75 69 6c 64 20 61 20 54 43  ng to build a TC
01e0: 4c 2d 65 6e 61 62 6c 65 64 20 76 65 72 73 69 6f  L-enabled versio
01f0: 6e 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a 0a  n of SQLite..**.
0200: 2a 2a 20 24 49 64 3a 20 74 63 6c 73 71 6c 69 74  ** $Id: tclsqlit
0210: 65 2e 63 2c 76 20 31 2e 32 32 39 20 32 30 30 38  e.c,v 1.229 2008
0220: 2f 31 32 2f 31 30 20 31 39 3a 32 36 3a 32 34 20  /12/10 19:26:24 
0230: 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e  drh Exp $.*/.#in
0240: 63 6c 75 64 65 20 22 74 63 6c 2e 68 22 0a 23 69  clude "tcl.h".#i
0250: 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e 68 3e  nclude <errno.h>
0260: 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 61 64 64  ../*.** Some add
0270: 69 74 69 6f 6e 61 6c 20 69 6e 63 6c 75 64 65 20  itional include 
0280: 66 69 6c 65 73 20 61 72 65 20 6e 65 65 64 65 64  files are needed
0290: 20 69 66 20 74 68 69 73 20 66 69 6c 65 20 69 73   if this file is
02a0: 20 6e 6f 74 0a 2a 2a 20 61 70 70 65 6e 64 65 64   not.** appended
02b0: 20 74 6f 20 74 68 65 20 61 6d 61 6c 67 61 6d 61   to the amalgama
02c0: 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tion..*/.#ifndef
02d0: 20 53 51 4c 49 54 45 5f 41 4d 41 4c 47 41 4d 41   SQLITE_AMALGAMA
02e0: 54 49 4f 4e 0a 23 20 69 6e 63 6c 75 64 65 20 22  TION.# include "
02f0: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 20 69  sqliteInt.h".# i
0300: 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e 68  nclude <stdlib.h
0310: 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 74 72  >.# include <str
0320: 69 6e 67 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65  ing.h>.# include
0330: 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23 20 69 6e   <assert.h>.# in
0340: 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a  clude <ctype.h>.
0350: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 57 69  #endif../*. * Wi
0360: 6e 64 6f 77 73 20 6e 65 65 64 73 20 74 6f 20 6b  ndows needs to k
0370: 6e 6f 77 20 77 68 69 63 68 20 73 79 6d 62 6f 6c  now which symbol
0380: 73 20 74 6f 20 65 78 70 6f 72 74 2e 20 20 55 6e  s to export.  Un
0390: 69 78 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 2a 20  ix does not.. * 
03a0: 42 55 49 4c 44 5f 73 71 6c 69 74 65 20 73 68 6f  BUILD_sqlite sho
03b0: 75 6c 64 20 62 65 20 75 6e 64 65 66 69 6e 65 64  uld be undefined
03c0: 20 66 6f 72 20 55 6e 69 78 2e 0a 20 2a 2f 0a 23   for Unix.. */.#
03d0: 69 66 64 65 66 20 42 55 49 4c 44 5f 73 71 6c 69  ifdef BUILD_sqli
03e0: 74 65 0a 23 75 6e 64 65 66 20 54 43 4c 5f 53 54  te.#undef TCL_ST
03f0: 4f 52 41 47 45 5f 43 4c 41 53 53 0a 23 64 65 66  ORAGE_CLASS.#def
0400: 69 6e 65 20 54 43 4c 5f 53 54 4f 52 41 47 45 5f  ine TCL_STORAGE_
0410: 43 4c 41 53 53 20 44 4c 4c 45 58 50 4f 52 54 0a  CLASS DLLEXPORT.
0420: 23 65 6e 64 69 66 20 2f 2a 20 42 55 49 4c 44 5f  #endif /* BUILD_
0430: 73 71 6c 69 74 65 20 2a 2f 0a 0a 23 64 65 66 69  sqlite */..#defi
0440: 6e 65 20 4e 55 4d 5f 50 52 45 50 41 52 45 44 5f  ne NUM_PREPARED_
0450: 53 54 4d 54 53 20 31 30 0a 23 64 65 66 69 6e 65  STMTS 10.#define
0460: 20 4d 41 58 5f 50 52 45 50 41 52 45 44 5f 53 54   MAX_PREPARED_ST
0470: 4d 54 53 20 31 30 30 0a 0a 2f 2a 0a 2a 2a 20 49  MTS 100../*.** I
0480: 66 20 54 43 4c 20 75 73 65 73 20 55 54 46 2d 38  f TCL uses UTF-8
0490: 20 61 6e 64 20 53 51 4c 69 74 65 20 69 73 20 63   and SQLite is c
04a0: 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73 65  onfigured to use
04b0: 20 69 73 6f 38 38 35 39 2c 20 74 68 65 6e 20 77   iso8859, then w
04c0: 65 0a 2a 2a 20 68 61 76 65 20 74 6f 20 64 6f 20  e.** have to do 
04d0: 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 77 68  a translation wh
04e0: 65 6e 20 67 6f 69 6e 67 20 62 65 74 77 65 65 6e  en going between
04f0: 20 74 68 65 20 74 77 6f 2e 20 20 53 65 74 20 74   the two.  Set t
0500: 68 65 20 0a 2a 2a 20 55 54 46 5f 54 52 41 4e 53  he .** UTF_TRANS
0510: 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 20 6d 61  LATION_NEEDED ma
0520: 63 72 6f 20 74 6f 20 69 6e 64 69 63 61 74 65 20  cro to indicate 
0530: 74 68 61 74 20 77 65 20 6e 65 65 64 20 74 6f 20  that we need to 
0540: 64 6f 0a 2a 2a 20 74 68 69 73 20 74 72 61 6e 73  do.** this trans
0550: 6c 61 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 23 69 66  lation.  .*/.#if
0560: 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 55 54 46   defined(TCL_UTF
0570: 5f 4d 41 58 29 20 26 26 20 21 64 65 66 69 6e 65  _MAX) && !define
0580: 64 28 53 51 4c 49 54 45 5f 55 54 46 38 29 0a 23  d(SQLITE_UTF8).#
0590: 20 64 65 66 69 6e 65 20 55 54 46 5f 54 52 41 4e   define UTF_TRAN
05a0: 53 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 20 31  SLATION_NEEDED 1
05b0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4e  .#endif../*.** N
05c0: 65 77 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73  ew SQL functions
05d0: 20 63 61 6e 20 62 65 20 63 72 65 61 74 65 64 20   can be created 
05e0: 61 73 20 54 43 4c 20 73 63 72 69 70 74 73 2e 20  as TCL scripts. 
05f0: 20 45 61 63 68 20 73 75 63 68 20 66 75 6e 63 74   Each such funct
0600: 69 6f 6e 0a 2a 2a 20 69 73 20 64 65 73 63 72 69  ion.** is descri
0610: 62 65 64 20 62 79 20 61 6e 20 69 6e 73 74 61 6e  bed by an instan
0620: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
0630: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ing structure..*
0640: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0650: 20 53 71 6c 46 75 6e 63 20 53 71 6c 46 75 6e 63   SqlFunc SqlFunc
0660: 3b 0a 73 74 72 75 63 74 20 53 71 6c 46 75 6e 63  ;.struct SqlFunc
0670: 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20   {.  Tcl_Interp 
0680: 2a 69 6e 74 65 72 70 3b 20 20 20 2f 2a 20 54 68  *interp;   /* Th
0690: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 20  e TCL interpret 
06a0: 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20 66  to execute the f
06b0: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
06c0: 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 20 20  _Obj *pScript;  
06d0: 20 20 20 2f 2a 20 54 68 65 20 54 63 6c 5f 4f 62     /* The Tcl_Ob
06e0: 6a 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  j representation
06f0: 20 6f 66 20 74 68 65 20 73 63 72 69 70 74 20 2a   of the script *
0700: 2f 0a 20 20 69 6e 74 20 75 73 65 45 76 61 6c 4f  /.  int useEvalO
0710: 62 6a 76 3b 20 20 20 20 20 20 2f 2a 20 54 72 75  bjv;      /* Tru
0720: 65 20 69 66 20 69 74 20 69 73 20 73 61 66 65 20  e if it is safe 
0730: 74 6f 20 75 73 65 20 54 63 6c 5f 45 76 61 6c 4f  to use Tcl_EvalO
0740: 62 6a 76 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  bjv */.  char *z
0750: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 2f  Name;          /
0760: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 69 73 20 66  * Name of this f
0770: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 53 71 6c  unction */.  Sql
0780: 46 75 6e 63 20 2a 70 4e 65 78 74 3b 20 20 20 20  Func *pNext;    
0790: 20 20 20 2f 2a 20 4e 65 78 74 20 66 75 6e 63 74     /* Next funct
07a0: 69 6f 6e 20 6f 6e 20 74 68 65 20 6c 69 73 74 20  ion on the list 
07b0: 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 7d  of them all */.}
07c0: 3b 0a 0a 2f 2a 0a 2a 2a 20 4e 65 77 20 63 6f 6c  ;../*.** New col
07d0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73  lation sequences
07e0: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 62 65   function can be
07f0: 20 63 72 65 61 74 65 64 20 61 73 20 54 43 4c 20   created as TCL 
0800: 73 63 72 69 70 74 73 2e 20 20 45 61 63 68 20 73  scripts.  Each s
0810: 75 63 68 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  uch.** function 
0820: 69 73 20 64 65 73 63 72 69 62 65 64 20 62 79 20  is described by 
0830: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
0840: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
0850: 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65 64  ucture..*/.typed
0860: 65 66 20 73 74 72 75 63 74 20 53 71 6c 43 6f 6c  ef struct SqlCol
0870: 6c 61 74 65 20 53 71 6c 43 6f 6c 6c 61 74 65 3b  late SqlCollate;
0880: 0a 73 74 72 75 63 74 20 53 71 6c 43 6f 6c 6c 61  .struct SqlColla
0890: 74 65 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72  te {.  Tcl_Inter
08a0: 70 20 2a 69 6e 74 65 72 70 3b 20 20 20 2f 2a 20  p *interp;   /* 
08b0: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
08c0: 74 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  t to execute the
08d0: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 63   function */.  c
08e0: 68 61 72 20 2a 7a 53 63 72 69 70 74 3b 20 20 20  har *zScript;   
08f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 63 72 69       /* The scri
0900: 70 74 20 74 6f 20 62 65 20 72 75 6e 20 2a 2f 0a  pt to be run */.
0910: 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 4e    SqlCollate *pN
0920: 65 78 74 3b 20 20 20 20 2f 2a 20 4e 65 78 74 20  ext;    /* Next 
0930: 66 75 6e 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  function on the 
0940: 6c 69 73 74 20 6f 66 20 74 68 65 6d 20 61 6c 6c  list of them all
0950: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72   */.};../*.** Pr
0960: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
0970: 73 20 61 72 65 20 63 61 63 68 65 64 20 66 6f 72  s are cached for
0980: 20 66 61 73 74 65 72 20 65 78 65 63 75 74 69 6f   faster executio
0990: 6e 2e 20 20 45 61 63 68 20 70 72 65 70 61 72 65  n.  Each prepare
09a0: 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 69  d.** statement i
09b0: 73 20 64 65 73 63 72 69 62 65 64 20 62 79 20 61  s described by a
09c0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
09d0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
09e0: 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65 64 65  cture..*/.typede
09f0: 66 20 73 74 72 75 63 74 20 53 71 6c 50 72 65 70  f struct SqlPrep
0a00: 61 72 65 64 53 74 6d 74 20 53 71 6c 50 72 65 70  aredStmt SqlPrep
0a10: 61 72 65 64 53 74 6d 74 3b 0a 73 74 72 75 63 74  aredStmt;.struct
0a20: 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74   SqlPreparedStmt
0a30: 20 7b 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64   {.  SqlPrepared
0a40: 53 74 6d 74 20 2a 70 4e 65 78 74 3b 20 20 2f 2a  Stmt *pNext;  /*
0a50: 20 4e 65 78 74 20 69 6e 20 6c 69 6e 6b 65 64 20   Next in linked 
0a60: 6c 69 73 74 20 2a 2f 0a 20 20 53 71 6c 50 72 65  list */.  SqlPre
0a70: 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65 76  paredStmt *pPrev
0a80: 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 6f  ;  /* Previous o
0a90: 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20  n the list */.  
0aa0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
0ab0: 74 6d 74 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  tmt;     /* The 
0ac0: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
0ad0: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 71 6c  nt */.  int nSql
0ae0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0af0: 20 2f 2a 20 63 68 61 72 73 20 69 6e 20 7a 53 71   /* chars in zSq
0b00: 6c 5b 5d 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  l[] */.  const c
0b10: 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20  har *zSql;      
0b20: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65    /* Text of the
0b30: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a   SQL statement *
0b40: 2f 0a 7d 3b 0a 0a 74 79 70 65 64 65 66 20 73 74  /.};..typedef st
0b50: 72 75 63 74 20 49 6e 63 72 62 6c 6f 62 43 68 61  ruct IncrblobCha
0b60: 6e 6e 65 6c 20 49 6e 63 72 62 6c 6f 62 43 68 61  nnel IncrblobCha
0b70: 6e 6e 65 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  nnel;../*.** The
0b80: 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e  re is one instan
0b90: 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  ce of this struc
0ba0: 74 75 72 65 20 66 6f 72 20 65 61 63 68 20 53 51  ture for each SQ
0bb0: 4c 69 74 65 20 64 61 74 61 62 61 73 65 0a 2a 2a  Lite database.**
0bc0: 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 6f   that has been o
0bd0: 70 65 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c  pened by the SQL
0be0: 69 74 65 20 54 43 4c 20 69 6e 74 65 72 66 61 63  ite TCL interfac
0bf0: 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  e..*/.typedef st
0c00: 72 75 63 74 20 53 71 6c 69 74 65 44 62 20 53 71  ruct SqliteDb Sq
0c10: 6c 69 74 65 44 62 3b 0a 73 74 72 75 63 74 20 53  liteDb;.struct S
0c20: 71 6c 69 74 65 44 62 20 7b 0a 20 20 73 71 6c 69  qliteDb {.  sqli
0c30: 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
0c40: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 72         /* The "r
0c50: 65 61 6c 22 20 64 61 74 61 62 61 73 65 20 73 74  eal" database st
0c60: 72 75 63 74 75 72 65 2e 20 4d 55 53 54 20 42 45  ructure. MUST BE
0c70: 20 46 49 52 53 54 20 2a 2f 0a 20 20 54 63 6c 5f   FIRST */.  Tcl_
0c80: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 20  Interp *interp; 
0c90: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
0ca0: 74 65 72 70 72 65 74 65 72 20 75 73 65 64 20 66  terpreter used f
0cb0: 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65  or this database
0cc0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 42 75 73   */.  char *zBus
0cd0: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
0ce0: 20 2f 2a 20 54 68 65 20 62 75 73 79 20 63 61 6c   /* The busy cal
0cf0: 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f  lback routine */
0d00: 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74  .  char *zCommit
0d10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
0d20: 20 54 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b   The commit hook
0d30: 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e   callback routin
0d40: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 72  e */.  char *zTr
0d50: 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
0d60: 20 20 2f 2a 20 54 68 65 20 74 72 61 63 65 20 63    /* The trace c
0d70: 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20  allback routine 
0d80: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 72 6f 66  */.  char *zProf
0d90: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
0da0: 2f 2a 20 54 68 65 20 70 72 6f 66 69 6c 65 20 63  /* The profile c
0db0: 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20  allback routine 
0dc0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 72 6f 67  */.  char *zProg
0dd0: 72 65 73 73 3b 20 20 20 20 20 20 20 20 20 20 20  ress;           
0de0: 2f 2a 20 54 68 65 20 70 72 6f 67 72 65 73 73 20  /* The progress 
0df0: 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65  callback routine
0e00: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 75 74   */.  char *zAut
0e10: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
0e20: 20 2f 2a 20 54 68 65 20 61 75 74 68 6f 72 69 7a   /* The authoriz
0e30: 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 20 72  ation callback r
0e40: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
0e50: 64 69 73 61 62 6c 65 41 75 74 68 3b 20 20 20 20  disableAuth;    
0e60: 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c         /* Disabl
0e70: 65 20 74 68 65 20 61 75 74 68 6f 72 69 7a 65 72  e the authorizer
0e80: 20 69 66 20 69 74 20 65 78 69 73 74 73 20 2a 2f   if it exists */
0e90: 0a 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c 3b 20  .  char *zNull; 
0ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0eb0: 20 54 65 78 74 20 74 6f 20 73 75 62 73 74 69 74   Text to substit
0ec0: 75 74 65 20 66 6f 72 20 61 6e 20 53 51 4c 20 4e  ute for an SQL N
0ed0: 55 4c 4c 20 76 61 6c 75 65 20 2a 2f 0a 20 20 53  ULL value */.  S
0ee0: 71 6c 46 75 6e 63 20 2a 70 46 75 6e 63 3b 20 20  qlFunc *pFunc;  
0ef0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
0f00: 74 20 6f 66 20 53 51 4c 20 66 75 6e 63 74 69 6f  t of SQL functio
0f10: 6e 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ns */.  Tcl_Obj 
0f20: 2a 70 55 70 64 61 74 65 48 6f 6f 6b 3b 20 20 20  *pUpdateHook;   
0f30: 20 20 20 2f 2a 20 55 70 64 61 74 65 20 68 6f 6f     /* Update hoo
0f40: 6b 20 73 63 72 69 70 74 20 28 69 66 20 61 6e 79  k script (if any
0f50: 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  ) */.  Tcl_Obj *
0f60: 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3b 20 20  pRollbackHook;  
0f70: 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 68 6f    /* Rollback ho
0f80: 6f 6b 20 73 63 72 69 70 74 20 28 69 66 20 61 6e  ok script (if an
0f90: 79 29 20 2a 2f 0a 20 20 53 71 6c 43 6f 6c 6c 61  y) */.  SqlColla
0fa0: 74 65 20 2a 70 43 6f 6c 6c 61 74 65 3b 20 20 20  te *pCollate;   
0fb0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 53 51     /* List of SQ
0fc0: 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63  L collation func
0fd0: 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 72  tions */.  int r
0fe0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
0ff0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1000: 63 6f 64 65 20 6f 66 20 6d 6f 73 74 20 72 65 63  code of most rec
1010: 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63  ent sqlite3_exec
1020: 28 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  () */.  Tcl_Obj 
1030: 2a 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 3b  *pCollateNeeded;
1040: 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20     /* Collation 
1050: 6e 65 65 64 65 64 20 73 63 72 69 70 74 20 2a 2f  needed script */
1060: 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74  .  SqlPreparedSt
1070: 6d 74 20 2a 73 74 6d 74 4c 69 73 74 3b 20 2f 2a  mt *stmtList; /*
1080: 20 4c 69 73 74 20 6f 66 20 70 72 65 70 61 72 65   List of prepare
1090: 64 20 73 74 61 74 65 6d 65 6e 74 73 2a 2f 0a 20  d statements*/. 
10a0: 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74   SqlPreparedStmt
10b0: 20 2a 73 74 6d 74 4c 61 73 74 3b 20 2f 2a 20 4c   *stmtLast; /* L
10c0: 61 73 74 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  ast statement in
10d0: 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69   the list */.  i
10e0: 6e 74 20 6d 61 78 53 74 6d 74 3b 20 20 20 20 20  nt maxStmt;     
10f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1100: 20 6e 65 78 74 20 6d 61 78 69 6d 75 6d 20 6e 75   next maximum nu
1110: 6d 62 65 72 20 6f 66 20 73 74 6d 74 4c 69 73 74  mber of stmtList
1120: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 74 6d 74 3b   */.  int nStmt;
1130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1140: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 74   /* Number of st
1150: 61 74 65 6d 65 6e 74 73 20 69 6e 20 73 74 6d 74  atements in stmt
1160: 4c 69 73 74 20 2a 2f 0a 20 20 49 6e 63 72 62 6c  List */.  Incrbl
1170: 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 49 6e 63 72  obChannel *pIncr
1180: 62 6c 6f 62 3b 2f 2a 20 4c 69 6e 6b 65 64 20 6c  blob;/* Linked l
1190: 69 73 74 20 6f 66 20 6f 70 65 6e 20 69 6e 63 72  ist of open incr
11a0: 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 73 20 2a 2f  blob channels */
11b0: 0a 20 20 69 6e 74 20 6e 53 74 65 70 2c 20 6e 53  .  int nStep, nS
11c0: 6f 72 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ort;          /*
11d0: 20 53 74 61 74 69 73 74 69 63 73 20 66 6f 72 20   Statistics for 
11e0: 6d 6f 73 74 20 72 65 63 65 6e 74 20 6f 70 65 72  most recent oper
11f0: 61 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a 0a 73 74 72  ation */.};..str
1200: 75 63 74 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e  uct IncrblobChan
1210: 6e 65 6c 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  nel {.  sqlite3_
1220: 62 6c 6f 62 20 2a 70 42 6c 6f 62 3b 20 20 20 20  blob *pBlob;    
1230: 20 20 2f 2a 20 73 71 6c 69 74 65 33 20 62 6c 6f    /* sqlite3 blo
1240: 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 53 71  b handle */.  Sq
1250: 6c 69 74 65 44 62 20 2a 70 44 62 3b 20 20 20 20  liteDb *pDb;    
1260: 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63          /* Assoc
1270: 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20 63  iated database c
1280: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
1290: 6e 74 20 69 53 65 65 6b 3b 20 20 20 20 20 20 20  nt iSeek;       
12a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
12b0: 65 6e 74 20 73 65 65 6b 20 6f 66 66 73 65 74 20  ent seek offset 
12c0: 2a 2f 0a 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c  */.  Tcl_Channel
12d0: 20 63 68 61 6e 6e 65 6c 3b 20 20 20 20 20 20 2f   channel;      /
12e0: 2a 20 43 68 61 6e 6e 65 6c 20 69 64 65 6e 74 69  * Channel identi
12f0: 66 69 65 72 20 2a 2f 0a 20 20 49 6e 63 72 62 6c  fier */.  Incrbl
1300: 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 4e 65 78 74  obChannel *pNext
1310: 3b 20 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69  ;   /* Linked li
1320: 73 74 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 69  st of all open i
1330: 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 73  ncrblob channels
1340: 20 2a 2f 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68   */.  IncrblobCh
1350: 61 6e 6e 65 6c 20 2a 70 50 72 65 76 3b 20 20 20  annel *pPrev;   
1360: 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f  /* Linked list o
1370: 66 20 61 6c 6c 20 6f 70 65 6e 20 69 6e 63 72 62  f all open incrb
1380: 6c 6f 62 20 63 68 61 6e 6e 65 6c 73 20 2a 2f 0a  lob channels */.
1390: 7d 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  };..#ifndef SQLI
13a0: 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 0a  TE_AMALGAMATION.
13b0: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20  /*.** Compute a 
13c0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 74 68  string length th
13d0: 61 74 20 69 73 20 6c 69 6d 69 74 65 64 20 74 6f  at is limited to
13e0: 20 77 68 61 74 20 63 61 6e 20 62 65 20 73 74 6f   what can be sto
13f0: 72 65 64 20 69 6e 0a 2a 2a 20 6c 6f 77 65 72 20  red in.** lower 
1400: 33 30 20 62 69 74 73 20 6f 66 20 61 20 33 32 2d  30 bits of a 32-
1410: 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65 67  bit signed integ
1420: 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
1430: 65 33 53 74 72 6c 65 6e 33 30 28 63 6f 6e 73 74  e3Strlen30(const
1440: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63 6f 6e   char *z){.  con
1450: 73 74 20 63 68 61 72 20 2a 7a 32 20 3d 20 7a 3b  st char *z2 = z;
1460: 0a 20 20 77 68 69 6c 65 28 20 2a 7a 32 20 29 7b  .  while( *z2 ){
1470: 20 7a 32 2b 2b 3b 20 7d 0a 20 20 72 65 74 75 72   z2++; }.  retur
1480: 6e 20 30 78 33 66 66 66 66 66 66 66 20 26 20 28  n 0x3fffffff & (
1490: 69 6e 74 29 28 7a 32 20 2d 20 7a 29 3b 0a 7d 0a  int)(z2 - z);.}.
14a0: 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66  #endif...#ifndef
14b0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
14c0: 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  RBLOB./*.** Clos
14d0: 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 20 63  e all incrblob c
14e0: 68 61 6e 6e 65 6c 73 20 6f 70 65 6e 65 64 20 75  hannels opened u
14f0: 73 69 6e 67 20 64 61 74 61 62 61 73 65 20 63 6f  sing database co
1500: 6e 6e 65 63 74 69 6f 6e 20 70 44 62 2e 0a 2a 2a  nnection pDb..**
1510: 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   This is called 
1520: 77 68 65 6e 20 73 68 75 74 74 69 6e 67 20 64 6f  when shutting do
1530: 77 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  wn the database 
1540: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  connection..*/.s
1550: 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65  tatic void close
1560: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 73  IncrblobChannels
1570: 28 53 71 6c 69 74 65 44 62 20 2a 70 44 62 29 7b  (SqliteDb *pDb){
1580: 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  .  IncrblobChann
1590: 65 6c 20 2a 70 3b 0a 20 20 49 6e 63 72 62 6c 6f  el *p;.  Incrblo
15a0: 62 43 68 61 6e 6e 65 6c 20 2a 70 4e 65 78 74 3b  bChannel *pNext;
15b0: 0a 0a 20 20 66 6f 72 28 70 3d 70 44 62 2d 3e 70  ..  for(p=pDb->p
15c0: 49 6e 63 72 62 6c 6f 62 3b 20 70 3b 20 70 3d 70  Incrblob; p; p=p
15d0: 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
15e0: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20   = p->pNext;..  
15f0: 20 20 2f 2a 20 4e 6f 74 65 3a 20 43 61 6c 6c 69    /* Note: Calli
1600: 6e 67 20 75 6e 72 65 67 69 73 74 65 72 20 68 65  ng unregister he
1610: 72 65 20 63 61 6c 6c 20 54 63 6c 5f 43 6c 6f 73  re call Tcl_Clos
1620: 65 20 6f 6e 20 74 68 65 20 69 6e 63 72 62 6c 6f  e on the incrblo
1630: 62 20 63 68 61 6e 6e 65 6c 2c 20 0a 20 20 20 20  b channel, .    
1640: 2a 2a 20 77 68 69 63 68 20 64 65 6c 65 74 65 73  ** which deletes
1650: 20 74 68 65 20 49 6e 63 72 62 6c 6f 62 43 68 61   the IncrblobCha
1660: 6e 6e 65 6c 20 73 74 72 75 63 74 75 72 65 20 61  nnel structure a
1670: 74 20 2a 70 2e 20 53 6f 20 64 6f 20 6e 6f 74 0a  t *p. So do not.
1680: 20 20 20 20 2a 2a 20 63 61 6c 6c 20 54 63 6c 5f      ** call Tcl_
1690: 46 72 65 65 28 29 20 68 65 72 65 2e 0a 20 20 20  Free() here..   
16a0: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 55 6e 72 65   */.    Tcl_Unre
16b0: 67 69 73 74 65 72 43 68 61 6e 6e 65 6c 28 70 44  gisterChannel(pD
16c0: 62 2d 3e 69 6e 74 65 72 70 2c 20 70 2d 3e 63 68  b->interp, p->ch
16d0: 61 6e 6e 65 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  annel);.  }.}../
16e0: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 69 6e  *.** Close an in
16f0: 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63  cremental blob c
1700: 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69  hannel..*/.stati
1710: 63 20 69 6e 74 20 69 6e 63 72 62 6c 6f 62 43 6c  c int incrblobCl
1720: 6f 73 65 28 43 6c 69 65 6e 74 44 61 74 61 20 69  ose(ClientData i
1730: 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 54 63 6c  nstanceData, Tcl
1740: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
1750: 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e  {.  IncrblobChan
1760: 6e 65 6c 20 2a 70 20 3d 20 28 49 6e 63 72 62 6c  nel *p = (Incrbl
1770: 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 69 6e 73 74  obChannel *)inst
1780: 61 6e 63 65 44 61 74 61 3b 0a 20 20 69 6e 74 20  anceData;.  int 
1790: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f  rc = sqlite3_blo
17a0: 62 5f 63 6c 6f 73 65 28 70 2d 3e 70 42 6c 6f 62  b_close(p->pBlob
17b0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  );.  sqlite3 *db
17c0: 20 3d 20 70 2d 3e 70 44 62 2d 3e 64 62 3b 0a 0a   = p->pDb->db;..
17d0: 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
17e0: 63 68 61 6e 6e 65 6c 20 66 72 6f 6d 20 74 68 65  channel from the
17f0: 20 53 71 6c 69 74 65 44 62 2e 70 49 6e 63 72 62   SqliteDb.pIncrb
1800: 6c 6f 62 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 69  lob list. */.  i
1810: 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  f( p->pNext ){. 
1820: 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72     p->pNext->pPr
1830: 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20  ev = p->pPrev;. 
1840: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65   }.  if( p->pPre
1850: 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65  v ){.    p->pPre
1860: 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e  v->pNext = p->pN
1870: 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ext;.  }.  if( p
1880: 2d 3e 70 44 62 2d 3e 70 49 6e 63 72 62 6c 6f 62  ->pDb->pIncrblob
1890: 3d 3d 70 20 29 7b 0a 20 20 20 20 70 2d 3e 70 44  ==p ){.    p->pD
18a0: 62 2d 3e 70 49 6e 63 72 62 6c 6f 62 20 3d 20 70  b->pIncrblob = p
18b0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20  ->pNext;.  }..  
18c0: 2f 2a 20 46 72 65 65 20 74 68 65 20 49 6e 63 72  /* Free the Incr
18d0: 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 73 74 72 75  blobChannel stru
18e0: 63 74 75 72 65 20 2a 2f 0a 20 20 54 63 6c 5f 46  cture */.  Tcl_F
18f0: 72 65 65 28 28 63 68 61 72 20 2a 29 70 29 3b 0a  ree((char *)p);.
1900: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1910: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  E_OK ){.    Tcl_
1920: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
1930: 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  , (char *)sqlite
1940: 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 54 43  3_errmsg(db), TC
1950: 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20  L_VOLATILE);.   
1960: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1970: 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
1980: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1990: 20 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20   Read data from 
19a0: 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62  an incremental b
19b0: 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a  lob channel..*/.
19c0: 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 62  static int incrb
19d0: 6c 6f 62 49 6e 70 75 74 28 0a 20 20 43 6c 69 65  lobInput(.  Clie
19e0: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44  ntData instanceD
19f0: 61 74 61 2c 20 0a 20 20 63 68 61 72 20 2a 62 75  ata, .  char *bu
1a00: 66 2c 20 0a 20 20 69 6e 74 20 62 75 66 53 69 7a  f, .  int bufSiz
1a10: 65 2c 0a 20 20 69 6e 74 20 2a 65 72 72 6f 72 43  e,.  int *errorC
1a20: 6f 64 65 50 74 72 0a 29 7b 0a 20 20 49 6e 63 72  odePtr.){.  Incr
1a30: 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 20 3d  blobChannel *p =
1a40: 20 28 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65   (IncrblobChanne
1a50: 6c 20 2a 29 69 6e 73 74 61 6e 63 65 44 61 74 61  l *)instanceData
1a60: 3b 0a 20 20 69 6e 74 20 6e 52 65 61 64 20 3d 20  ;.  int nRead = 
1a70: 62 75 66 53 69 7a 65 3b 20 20 20 20 20 20 20 20  bufSize;        
1a80: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
1a90: 74 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20  tes to read */. 
1aa0: 20 69 6e 74 20 6e 42 6c 6f 62 3b 20 20 20 20 20   int nBlob;     
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ac0: 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74   Total size of t
1ad0: 68 65 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 6e 74  he blob */.  int
1ae0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1af0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
1b00: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a  ite error code *
1b10: 2f 0a 0a 20 20 6e 42 6c 6f 62 20 3d 20 73 71 6c  /..  nBlob = sql
1b20: 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28  ite3_blob_bytes(
1b30: 70 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20 69 66 28  p->pBlob);.  if(
1b40: 20 28 70 2d 3e 69 53 65 65 6b 2b 6e 52 65 61 64   (p->iSeek+nRead
1b50: 29 3e 6e 42 6c 6f 62 20 29 7b 0a 20 20 20 20 6e  )>nBlob ){.    n
1b60: 52 65 61 64 20 3d 20 6e 42 6c 6f 62 2d 70 2d 3e  Read = nBlob-p->
1b70: 69 53 65 65 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  iSeek;.  }.  if(
1b80: 20 6e 52 65 61 64 3c 3d 30 20 29 7b 0a 20 20 20   nRead<=0 ){.   
1b90: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
1ba0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
1bb0: 6c 6f 62 5f 72 65 61 64 28 70 2d 3e 70 42 6c 6f  lob_read(p->pBlo
1bc0: 62 2c 20 28 76 6f 69 64 20 2a 29 62 75 66 2c 20  b, (void *)buf, 
1bd0: 6e 52 65 61 64 2c 20 70 2d 3e 69 53 65 65 6b 29  nRead, p->iSeek)
1be0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1bf0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 65 72  TE_OK ){.    *er
1c00: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 72 63 3b  rorCodePtr = rc;
1c10: 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .    return -1;.
1c20: 20 20 7d 0a 0a 20 20 70 2d 3e 69 53 65 65 6b 20    }..  p->iSeek 
1c30: 2b 3d 20 6e 52 65 61 64 3b 0a 20 20 72 65 74 75  += nRead;.  retu
1c40: 72 6e 20 6e 52 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a  rn nRead;.}../*.
1c50: 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20 74 6f  ** Write data to
1c60: 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
1c70: 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f  blob channel..*/
1c80: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72  .static int incr
1c90: 62 6c 6f 62 4f 75 74 70 75 74 28 0a 20 20 43 6c  blobOutput(.  Cl
1ca0: 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63  ientData instanc
1cb0: 65 44 61 74 61 2c 20 0a 20 20 43 4f 4e 53 54 20  eData, .  CONST 
1cc0: 63 68 61 72 20 2a 62 75 66 2c 20 0a 20 20 69 6e  char *buf, .  in
1cd0: 74 20 74 6f 57 72 69 74 65 2c 0a 20 20 69 6e 74  t toWrite,.  int
1ce0: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 0a 29   *errorCodePtr.)
1cf0: 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e  {.  IncrblobChan
1d00: 6e 65 6c 20 2a 70 20 3d 20 28 49 6e 63 72 62 6c  nel *p = (Incrbl
1d10: 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 69 6e 73 74  obChannel *)inst
1d20: 61 6e 63 65 44 61 74 61 3b 0a 20 20 69 6e 74 20  anceData;.  int 
1d30: 6e 57 72 69 74 65 20 3d 20 74 6f 57 72 69 74 65  nWrite = toWrite
1d40: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ;        /* Numb
1d50: 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 77  er of bytes to w
1d60: 72 69 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  rite */.  int nB
1d70: 6c 6f 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  lob;            
1d80: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
1d90: 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 62  size of the blob
1da0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
1db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc0: 20 20 20 2f 2a 20 73 71 6c 69 74 65 20 65 72 72     /* sqlite err
1dd0: 6f 72 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 6e 42  or code */..  nB
1de0: 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c  lob = sqlite3_bl
1df0: 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70 42 6c 6f  ob_bytes(p->pBlo
1e00: 62 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 69 53  b);.  if( (p->iS
1e10: 65 65 6b 2b 6e 57 72 69 74 65 29 3e 6e 42 6c 6f  eek+nWrite)>nBlo
1e20: 62 20 29 7b 0a 20 20 20 20 2a 65 72 72 6f 72 43  b ){.    *errorC
1e30: 6f 64 65 50 74 72 20 3d 20 45 49 4e 56 41 4c 3b  odePtr = EINVAL;
1e40: 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .    return -1;.
1e50: 20 20 7d 0a 20 20 69 66 28 20 6e 57 72 69 74 65    }.  if( nWrite
1e60: 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  <=0 ){.    retur
1e70: 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  n 0;.  }..  rc =
1e80: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72   sqlite3_blob_wr
1e90: 69 74 65 28 70 2d 3e 70 42 6c 6f 62 2c 20 28 76  ite(p->pBlob, (v
1ea0: 6f 69 64 20 2a 29 62 75 66 2c 20 6e 57 72 69 74  oid *)buf, nWrit
1eb0: 65 2c 20 70 2d 3e 69 53 65 65 6b 29 3b 0a 20 20  e, p->iSeek);.  
1ec0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1ed0: 4b 20 29 7b 0a 20 20 20 20 2a 65 72 72 6f 72 43  K ){.    *errorC
1ee0: 6f 64 65 50 74 72 20 3d 20 45 49 4f 3b 0a 20 20  odePtr = EIO;.  
1ef0: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d    return -1;.  }
1f00: 0a 0a 20 20 70 2d 3e 69 53 65 65 6b 20 2b 3d 20  ..  p->iSeek += 
1f10: 6e 57 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e  nWrite;.  return
1f20: 20 6e 57 72 69 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a   nWrite;.}../*.*
1f30: 2a 20 53 65 65 6b 20 61 6e 20 69 6e 63 72 65 6d  * Seek an increm
1f40: 65 6e 74 61 6c 20 62 6c 6f 62 20 63 68 61 6e 6e  ental blob chann
1f50: 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
1f60: 74 20 69 6e 63 72 62 6c 6f 62 53 65 65 6b 28 0a  t incrblobSeek(.
1f70: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73    ClientData ins
1f80: 74 61 6e 63 65 44 61 74 61 2c 20 0a 20 20 6c 6f  tanceData, .  lo
1f90: 6e 67 20 6f 66 66 73 65 74 2c 0a 20 20 69 6e 74  ng offset,.  int
1fa0: 20 73 65 65 6b 4d 6f 64 65 2c 0a 20 20 69 6e 74   seekMode,.  int
1fb0: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 0a 29   *errorCodePtr.)
1fc0: 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e  {.  IncrblobChan
1fd0: 6e 65 6c 20 2a 70 20 3d 20 28 49 6e 63 72 62 6c  nel *p = (Incrbl
1fe0: 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 69 6e 73 74  obChannel *)inst
1ff0: 61 6e 63 65 44 61 74 61 3b 0a 0a 20 20 73 77 69  anceData;..  swi
2000: 74 63 68 28 20 73 65 65 6b 4d 6f 64 65 20 29 7b  tch( seekMode ){
2010: 0a 20 20 20 20 63 61 73 65 20 53 45 45 4b 5f 53  .    case SEEK_S
2020: 45 54 3a 0a 20 20 20 20 20 20 70 2d 3e 69 53 65  ET:.      p->iSe
2030: 65 6b 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 20  ek = offset;.   
2040: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
2050: 73 65 20 53 45 45 4b 5f 43 55 52 3a 0a 20 20 20  se SEEK_CUR:.   
2060: 20 20 20 70 2d 3e 69 53 65 65 6b 20 2b 3d 20 6f     p->iSeek += o
2070: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 62 72 65  ffset;.      bre
2080: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 45 45  ak;.    case SEE
2090: 4b 5f 45 4e 44 3a 0a 20 20 20 20 20 20 70 2d 3e  K_END:.      p->
20a0: 69 53 65 65 6b 20 3d 20 73 71 6c 69 74 65 33 5f  iSeek = sqlite3_
20b0: 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70 42  blob_bytes(p->pB
20c0: 6c 6f 62 29 20 2b 20 6f 66 66 73 65 74 3b 0a 20  lob) + offset;. 
20d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
20e0: 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74   default: assert
20f0: 28 21 22 42 61 64 20 73 65 65 6b 4d 6f 64 65 22  (!"Bad seekMode"
2100: 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
2110: 20 70 2d 3e 69 53 65 65 6b 3b 0a 7d 0a 0a 0a 73   p->iSeek;.}...s
2120: 74 61 74 69 63 20 76 6f 69 64 20 69 6e 63 72 62  tatic void incrb
2130: 6c 6f 62 57 61 74 63 68 28 43 6c 69 65 6e 74 44  lobWatch(ClientD
2140: 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61  ata instanceData
2150: 2c 20 69 6e 74 20 6d 6f 64 65 29 7b 20 0a 20 20  , int mode){ .  
2160: 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 20 0a 7d 0a 73  /* NO-OP */ .}.s
2170: 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 62 6c  tatic int incrbl
2180: 6f 62 48 61 6e 64 6c 65 28 43 6c 69 65 6e 74 44  obHandle(ClientD
2190: 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61  ata instanceData
21a0: 2c 20 69 6e 74 20 64 69 72 2c 20 43 6c 69 65 6e  , int dir, Clien
21b0: 74 44 61 74 61 20 2a 68 50 74 72 29 7b 0a 20 20  tData *hPtr){.  
21c0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
21d0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 54 63 6c 5f  ;.}..static Tcl_
21e0: 43 68 61 6e 6e 65 6c 54 79 70 65 20 49 6e 63 72  ChannelType Incr
21f0: 62 6c 6f 62 43 68 61 6e 6e 65 6c 54 79 70 65 20  blobChannelType 
2200: 3d 20 7b 0a 20 20 22 69 6e 63 72 62 6c 6f 62 22  = {.  "incrblob"
2210: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2220: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 79 70 65           /* type
2230: 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20  Name            
2240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2250: 20 2a 2f 0a 20 20 54 43 4c 5f 43 48 41 4e 4e 45   */.  TCL_CHANNE
2260: 4c 5f 56 45 52 53 49 4f 4e 5f 32 2c 20 20 20 20  L_VERSION_2,    
2270: 20 20 20 20 20 20 20 20 20 2f 2a 20 76 65 72 73           /* vers
2280: 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  ion             
2290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a0: 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 43 6c   */.  incrblobCl
22b0: 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
22c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6c 6f 73           /* clos
22d0: 65 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20  eProc           
22e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f0: 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 49 6e   */.  incrblobIn
2300: 70 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  put,            
2310: 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 70 75           /* inpu
2320: 74 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20  tProc           
2330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2340: 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 4f 75   */.  incrblobOu
2350: 74 70 75 74 2c 20 20 20 20 20 20 20 20 20 20 20  tput,           
2360: 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 70           /* outp
2370: 75 74 50 72 6f 63 20 20 20 20 20 20 20 20 20 20  utProc          
2380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2390: 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 53 65   */.  incrblobSe
23a0: 65 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ek,             
23b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 65 65 6b           /* seek
23c0: 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20  Proc            
23d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e0: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
23f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2400: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 65 74 4f           /* setO
2410: 70 74 69 6f 6e 50 72 6f 63 20 20 20 20 20 20 20  ptionProc       
2420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2430: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
2440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2450: 20 20 20 20 20 20 20 20 20 2f 2a 20 67 65 74 4f           /* getO
2460: 70 74 69 6f 6e 50 72 6f 63 20 20 20 20 20 20 20  ptionProc       
2470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2480: 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 57 61   */.  incrblobWa
2490: 74 63 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  tch,            
24a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 77 61 74 63           /* watc
24b0: 68 50 72 6f 63 20 28 74 68 69 73 20 69 73 20 61  hProc (this is a
24c0: 20 6e 6f 2d 6f 70 29 20 20 20 20 20 20 20 20 20   no-op)         
24d0: 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 48 61   */.  incrblobHa
24e0: 6e 64 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  ndle,           
24f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 67 65 74 48           /* getH
2500: 61 6e 64 6c 65 50 72 6f 63 20 28 61 6c 77 61 79  andleProc (alway
2510: 73 20 72 65 74 75 72 6e 73 20 65 72 72 6f 72 29  s returns error)
2520: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
2530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2540: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6c 6f 73           /* clos
2550: 65 32 50 72 6f 63 20 20 20 20 20 20 20 20 20 20  e2Proc          
2560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2570: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
2580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2590: 20 20 20 20 20 20 20 20 20 2f 2a 20 62 6c 6f 63           /* bloc
25a0: 6b 4d 6f 64 65 50 72 6f 63 20 20 20 20 20 20 20  kModeProc       
25b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c0: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 75 73           /* flus
25f0: 68 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20  hProc           
2600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2610: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
2620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2630: 20 20 20 20 20 20 20 20 20 2f 2a 20 68 61 6e 64           /* hand
2640: 6c 65 72 50 72 6f 63 20 20 20 20 20 20 20 20 20  lerProc         
2650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2660: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
2670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2680: 20 20 20 20 20 20 20 20 20 2f 2a 20 77 69 64 65           /* wide
2690: 53 65 65 6b 50 72 6f 63 20 20 20 20 20 20 20 20  SeekProc        
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 72   */.};../*.** Cr
26c0: 65 61 74 65 20 61 20 6e 65 77 20 69 6e 63 72 62  eate a new incrb
26d0: 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a  lob channel..*/.
26e0: 73 74 61 74 69 63 20 69 6e 74 20 63 72 65 61 74  static int creat
26f0: 65 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c  eIncrblobChannel
2700: 28 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  (.  Tcl_Interp *
2710: 69 6e 74 65 72 70 2c 20 0a 20 20 53 71 6c 69 74  interp, .  Sqlit
2720: 65 44 62 20 2a 70 44 62 2c 20 0a 20 20 63 6f 6e  eDb *pDb, .  con
2730: 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 0a 20 20  st char *zDb,.  
2740: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
2750: 6c 65 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  le, .  const cha
2760: 72 20 2a 7a 43 6f 6c 75 6d 6e 2c 20 0a 20 20 73  r *zColumn, .  s
2770: 71 6c 69 74 65 5f 69 6e 74 36 34 20 69 52 6f 77  qlite_int64 iRow
2780: 2c 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e  ,.  int isReadon
2790: 6c 79 0a 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62  ly.){.  Incrblob
27a0: 43 68 61 6e 6e 65 6c 20 2a 70 3b 0a 20 20 73 71  Channel *p;.  sq
27b0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 44 62 2d  lite3 *db = pDb-
27c0: 3e 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62  >db;.  sqlite3_b
27d0: 6c 6f 62 20 2a 70 42 6c 6f 62 3b 0a 20 20 69 6e  lob *pBlob;.  in
27e0: 74 20 72 63 3b 0a 20 20 69 6e 74 20 66 6c 61 67  t rc;.  int flag
27f0: 73 20 3d 20 54 43 4c 5f 52 45 41 44 41 42 4c 45  s = TCL_READABLE
2800: 7c 28 69 73 52 65 61 64 6f 6e 6c 79 20 3f 20 30  |(isReadonly ? 0
2810: 20 3a 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29   : TCL_WRITABLE)
2820: 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 76 61 72  ;..  /* This var
2830: 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f  iable is used to
2840: 20 6e 61 6d 65 20 74 68 65 20 63 68 61 6e 6e 65   name the channe
2850: 6c 73 3a 20 22 69 6e 63 72 62 6c 6f 62 5f 5b 69  ls: "incrblob_[i
2860: 6e 63 72 20 63 6f 75 6e 74 5d 22 20 2a 2f 0a 20  ncr count]" */. 
2870: 20 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e   static int coun
2880: 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 43  t = 0;.  char zC
2890: 68 61 6e 6e 65 6c 5b 36 34 5d 3b 0a 0a 20 20 72  hannel[64];..  r
28a0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
28b0: 5f 6f 70 65 6e 28 64 62 2c 20 7a 44 62 2c 20 7a  _open(db, zDb, z
28c0: 54 61 62 6c 65 2c 20 7a 43 6f 6c 75 6d 6e 2c 20  Table, zColumn, 
28d0: 69 52 6f 77 2c 20 21 69 73 52 65 61 64 6f 6e 6c  iRow, !isReadonl
28e0: 79 2c 20 26 70 42 6c 6f 62 29 3b 0a 20 20 69 66  y, &pBlob);.  if
28f0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2900: 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65  ){.    Tcl_SetRe
2910: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
2920: 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72  ar *)sqlite3_err
2930: 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 54 43  msg(pDb->db), TC
2940: 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20  L_VOLATILE);.   
2950: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2960: 52 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 28 49  R;.  }..  p = (I
2970: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a  ncrblobChannel *
2980: 29 54 63 6c 5f 41 6c 6c 6f 63 28 73 69 7a 65 6f  )Tcl_Alloc(sizeo
2990: 66 28 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65  f(IncrblobChanne
29a0: 6c 29 29 3b 0a 20 20 70 2d 3e 69 53 65 65 6b 20  l));.  p->iSeek 
29b0: 3d 20 30 3b 0a 20 20 70 2d 3e 70 42 6c 6f 62 20  = 0;.  p->pBlob 
29c0: 3d 20 70 42 6c 6f 62 3b 0a 0a 20 20 73 71 6c 69  = pBlob;..  sqli
29d0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
29e0: 65 6f 66 28 7a 43 68 61 6e 6e 65 6c 29 2c 20 7a  eof(zChannel), z
29f0: 43 68 61 6e 6e 65 6c 2c 20 22 69 6e 63 72 62 6c  Channel, "incrbl
2a00: 6f 62 5f 25 64 22 2c 20 2b 2b 63 6f 75 6e 74 29  ob_%d", ++count)
2a10: 3b 0a 20 20 70 2d 3e 63 68 61 6e 6e 65 6c 20 3d  ;.  p->channel =
2a20: 20 54 63 6c 5f 43 72 65 61 74 65 43 68 61 6e 6e   Tcl_CreateChann
2a30: 65 6c 28 26 49 6e 63 72 62 6c 6f 62 43 68 61 6e  el(&IncrblobChan
2a40: 6e 65 6c 54 79 70 65 2c 20 7a 43 68 61 6e 6e 65  nelType, zChanne
2a50: 6c 2c 20 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20  l, p, flags);.  
2a60: 54 63 6c 5f 52 65 67 69 73 74 65 72 43 68 61 6e  Tcl_RegisterChan
2a70: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 70 2d 3e 63  nel(interp, p->c
2a80: 68 61 6e 6e 65 6c 29 3b 0a 0a 20 20 2f 2a 20 4c  hannel);..  /* L
2a90: 69 6e 6b 20 74 68 65 20 6e 65 77 20 63 68 61 6e  ink the new chan
2aa0: 6e 65 6c 20 69 6e 74 6f 20 74 68 65 20 53 71 6c  nel into the Sql
2ab0: 69 74 65 44 62 2e 70 49 6e 63 72 62 6c 6f 62 20  iteDb.pIncrblob 
2ac0: 6c 69 73 74 2e 20 2a 2f 0a 20 20 70 2d 3e 70 4e  list. */.  p->pN
2ad0: 65 78 74 20 3d 20 70 44 62 2d 3e 70 49 6e 63 72  ext = pDb->pIncr
2ae0: 62 6c 6f 62 3b 0a 20 20 70 2d 3e 70 50 72 65 76  blob;.  p->pPrev
2af0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 70   = 0;.  if( p->p
2b00: 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70  Next ){.    p->p
2b10: 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b  Next->pPrev = p;
2b20: 0a 20 20 7d 0a 20 20 70 44 62 2d 3e 70 49 6e 63  .  }.  pDb->pInc
2b30: 72 62 6c 6f 62 20 3d 20 70 3b 0a 20 20 70 2d 3e  rblob = p;.  p->
2b40: 70 44 62 20 3d 20 70 44 62 3b 0a 0a 20 20 54 63  pDb = pDb;..  Tc
2b50: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
2b60: 72 70 2c 20 28 63 68 61 72 20 2a 29 54 63 6c 5f  rp, (char *)Tcl_
2b70: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 70  GetChannelName(p
2b80: 2d 3e 63 68 61 6e 6e 65 6c 29 2c 20 54 43 4c 5f  ->channel), TCL_
2b90: 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 72 65 74  VOLATILE);.  ret
2ba0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65  urn TCL_OK;.}.#e
2bb0: 6c 73 65 20 20 2f 2a 20 65 6c 73 65 20 63 6c 61  lse  /* else cla
2bc0: 75 73 65 20 66 6f 72 20 22 23 69 66 6e 64 65 66  use for "#ifndef
2bd0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
2be0: 52 42 4c 4f 42 22 20 2a 2f 0a 20 20 23 64 65 66  RBLOB" */.  #def
2bf0: 69 6e 65 20 63 6c 6f 73 65 49 6e 63 72 62 6c 6f  ine closeIncrblo
2c00: 62 43 68 61 6e 6e 65 6c 73 28 70 44 62 29 0a 23  bChannels(pDb).#
2c10: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f  endif../*.** Loo
2c20: 6b 20 61 74 20 74 68 65 20 73 63 72 69 70 74 20  k at the script 
2c30: 70 72 65 66 69 78 20 69 6e 20 70 43 6d 64 2e 20  prefix in pCmd. 
2c40: 20 57 65 20 77 69 6c 6c 20 62 65 20 65 78 65 63   We will be exec
2c50: 75 74 69 6e 67 20 74 68 69 73 20 73 63 72 69 70  uting this scrip
2c60: 74 0a 2a 2a 20 61 66 74 65 72 20 66 69 72 73 74  t.** after first
2c70: 20 61 70 70 65 6e 64 69 6e 67 20 6f 6e 65 20 6f   appending one o
2c80: 72 20 6d 6f 72 65 20 61 72 67 75 6d 65 6e 74 73  r more arguments
2c90: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
2ca0: 61 6e 61 6c 79 7a 65 73 0a 2a 2a 20 74 68 65 20  analyzes.** the 
2cb0: 73 63 72 69 70 74 20 74 6f 20 73 65 65 20 69 66  script to see if
2cc0: 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 75   it is safe to u
2cd0: 73 65 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28  se Tcl_EvalObjv(
2ce0: 29 20 6f 6e 20 74 68 65 20 73 63 72 69 70 74 0a  ) on the script.
2cf0: 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20 74  ** rather than t
2d00: 68 65 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20  he more general 
2d10: 54 63 6c 5f 45 76 61 6c 45 78 28 29 2e 20 20 54  Tcl_EvalEx().  T
2d20: 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 69 73  cl_EvalObjv() is
2d30: 20 6d 75 63 68 0a 2a 2a 20 66 61 73 74 65 72 2e   much.** faster.
2d40: 0a 2a 2a 0a 2a 2a 20 53 63 72 69 70 74 73 20 74  .**.** Scripts t
2d50: 68 61 74 20 61 72 65 20 73 61 66 65 20 74 6f 20  hat are safe to 
2d60: 75 73 65 20 77 69 74 68 20 54 63 6c 5f 45 76 61  use with Tcl_Eva
2d70: 6c 4f 62 6a 76 28 29 20 63 6f 6e 73 69 73 74 73  lObjv() consists
2d80: 20 6f 66 20 61 0a 2a 2a 20 63 6f 6d 6d 61 6e 64   of a.** command
2d90: 20 6e 61 6d 65 20 66 6f 6c 6c 6f 77 65 64 20 62   name followed b
2da0: 79 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 61  y zero or more a
2db0: 72 67 75 6d 65 6e 74 73 20 77 69 74 68 20 6e 6f  rguments with no
2dc0: 20 5b 2e 2e 2e 5d 20 6f 72 20 24 0a 2a 2a 20 6f   [...] or $.** o
2dd0: 72 20 7b 2e 2e 2e 7d 20 6f 72 20 3b 20 74 6f 20  r {...} or ; to 
2de0: 62 65 20 73 65 65 6e 20 61 6e 79 77 68 65 72 65  be seen anywhere
2df0: 2e 20 20 4d 6f 73 74 20 63 61 6c 6c 62 61 63 6b  .  Most callback
2e00: 20 73 63 72 69 70 74 73 20 63 6f 6e 73 69 73 74   scripts consist
2e10: 0a 2a 2a 20 6f 66 20 6a 75 73 74 20 61 20 73 69  .** of just a si
2e20: 6e 67 6c 65 20 70 72 6f 63 65 64 75 72 65 20 6e  ngle procedure n
2e30: 61 6d 65 20 61 6e 64 20 74 68 65 79 20 6d 65 65  ame and they mee
2e40: 74 20 74 68 69 73 20 72 65 71 75 69 72 65 6d 65  t this requireme
2e50: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
2e60: 74 20 73 61 66 65 54 6f 55 73 65 45 76 61 6c 4f  t safeToUseEvalO
2e70: 62 6a 76 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  bjv(Tcl_Interp *
2e80: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 20  interp, Tcl_Obj 
2e90: 2a 70 43 6d 64 29 7b 0a 20 20 2f 2a 20 57 65 20  *pCmd){.  /* We 
2ea0: 63 6f 75 6c 64 20 74 72 79 20 74 6f 20 64 6f 20  could try to do 
2eb0: 73 6f 6d 65 74 68 69 6e 67 20 77 69 74 68 20 54  something with T
2ec0: 63 6c 5f 50 61 72 73 65 28 29 2e 20 20 42 75 74  cl_Parse().  But
2ed0: 20 77 65 20 77 69 6c 6c 20 69 6e 73 74 65 61 64   we will instead
2ee0: 0a 20 20 2a 2a 20 6a 75 73 74 20 64 6f 20 61 20  .  ** just do a 
2ef0: 73 65 61 72 63 68 20 66 6f 72 20 66 6f 72 62 69  search for forbi
2f00: 64 64 65 6e 20 63 68 61 72 61 63 74 65 72 73 2e  dden characters.
2f10: 20 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20    If any of the 
2f20: 66 6f 72 62 69 64 64 65 6e 0a 20 20 2a 2a 20 63  forbidden.  ** c
2f30: 68 61 72 61 63 74 65 72 73 20 61 70 70 65 61 72  haracters appear
2f40: 20 69 6e 20 70 43 6d 64 2c 20 77 65 20 77 69 6c   in pCmd, we wil
2f50: 6c 20 72 65 70 6f 72 74 20 74 68 65 20 73 74 72  l report the str
2f60: 69 6e 67 20 61 73 20 75 6e 73 61 66 65 2e 0a 20  ing as unsafe.. 
2f70: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2f80: 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20   *z;.  int n;.  
2f90: 7a 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  z = Tcl_GetStrin
2fa0: 67 46 72 6f 6d 4f 62 6a 28 70 43 6d 64 2c 20 26  gFromObj(pCmd, &
2fb0: 6e 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d  n);.  while( n--
2fc0: 20 3e 20 30 20 29 7b 0a 20 20 20 20 69 6e 74 20   > 0 ){.    int 
2fd0: 63 20 3d 20 2a 28 7a 2b 2b 29 3b 0a 20 20 20 20  c = *(z++);.    
2fe0: 69 66 28 20 63 3d 3d 27 24 27 20 7c 7c 20 63 3d  if( c=='$' || c=
2ff0: 3d 27 5b 27 20 7c 7c 20 63 3d 3d 27 3b 27 20 29  ='[' || c==';' )
3000: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
3010: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
3020: 0a 2a 2a 20 46 69 6e 64 20 61 6e 20 53 71 6c 46  .** Find an SqlF
3030: 75 6e 63 20 73 74 72 75 63 74 75 72 65 20 77 69  unc structure wi
3040: 74 68 20 74 68 65 20 67 69 76 65 6e 20 6e 61 6d  th the given nam
3050: 65 2e 20 20 4f 72 20 63 72 65 61 74 65 20 61 20  e.  Or create a 
3060: 6e 65 77 0a 2a 2a 20 6f 6e 65 20 69 66 20 61 6e  new.** one if an
3070: 20 65 78 69 73 74 69 6e 67 20 6f 6e 65 20 63 61   existing one ca
3080: 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 20 20  nnot be found.  
3090: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
30a0: 20 74 6f 20 74 68 65 0a 2a 2a 20 73 74 72 75 63   to the.** struc
30b0: 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
30c0: 53 71 6c 46 75 6e 63 20 2a 66 69 6e 64 53 71 6c  SqlFunc *findSql
30d0: 46 75 6e 63 28 53 71 6c 69 74 65 44 62 20 2a 70  Func(SqliteDb *p
30e0: 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  Db, const char *
30f0: 7a 4e 61 6d 65 29 7b 0a 20 20 53 71 6c 46 75 6e  zName){.  SqlFun
3100: 63 20 2a 70 2c 20 2a 70 4e 65 77 3b 0a 20 20 69  c *p, *pNew;.  i
3110: 6e 74 20 69 3b 0a 20 20 70 4e 65 77 20 3d 20 28  nt i;.  pNew = (
3120: 53 71 6c 46 75 6e 63 2a 29 54 63 6c 5f 41 6c 6c  SqlFunc*)Tcl_All
3130: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  oc( sizeof(*pNew
3140: 29 20 2b 20 73 71 6c 69 74 65 33 53 74 72 6c 65  ) + sqlite3Strle
3150: 6e 33 30 28 7a 4e 61 6d 65 29 20 2b 20 31 20 29  n30(zName) + 1 )
3160: 3b 0a 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20  ;.  pNew->zName 
3170: 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31  = (char*)&pNew[1
3180: 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4e  ];.  for(i=0; zN
3190: 61 6d 65 5b 69 5d 3b 20 69 2b 2b 29 7b 20 70 4e  ame[i]; i++){ pN
31a0: 65 77 2d 3e 7a 4e 61 6d 65 5b 69 5d 20 3d 20 74  ew->zName[i] = t
31b0: 6f 6c 6f 77 65 72 28 7a 4e 61 6d 65 5b 69 5d 29  olower(zName[i])
31c0: 3b 20 7d 0a 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d  ; }.  pNew->zNam
31d0: 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 66 6f 72 28  e[i] = 0;.  for(
31e0: 70 3d 70 44 62 2d 3e 70 46 75 6e 63 3b 20 70 3b  p=pDb->pFunc; p;
31f0: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 20 0a 20   p=p->pNext){ . 
3200: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 70 2d     if( strcmp(p-
3210: 3e 7a 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 4e  >zName, pNew->zN
3220: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
3230: 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a   Tcl_Free((char*
3240: 29 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 72 65  )pNew);.      re
3250: 74 75 72 6e 20 70 3b 0a 20 20 20 20 7d 0a 20 20  turn p;.    }.  
3260: 7d 0a 20 20 70 4e 65 77 2d 3e 69 6e 74 65 72 70  }.  pNew->interp
3270: 20 3d 20 70 44 62 2d 3e 69 6e 74 65 72 70 3b 0a   = pDb->interp;.
3280: 20 20 70 4e 65 77 2d 3e 70 53 63 72 69 70 74 20    pNew->pScript 
3290: 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65  = 0;.  pNew->pNe
32a0: 78 74 20 3d 20 70 44 62 2d 3e 70 46 75 6e 63 3b  xt = pDb->pFunc;
32b0: 0a 20 20 70 44 62 2d 3e 70 46 75 6e 63 20 3d 20  .  pDb->pFunc = 
32c0: 70 4e 65 77 3b 0a 20 20 72 65 74 75 72 6e 20 70  pNew;.  return p
32d0: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  New;.}../*.** Fi
32e0: 6e 61 6c 69 7a 65 20 61 6e 64 20 66 72 65 65 20  nalize and free 
32f0: 61 20 6c 69 73 74 20 6f 66 20 70 72 65 70 61 72  a list of prepar
3300: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2f  ed statements.*/
3310: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 6c 75  .static void flu
3320: 73 68 53 74 6d 74 43 61 63 68 65 28 20 53 71 6c  shStmtCache( Sql
3330: 69 74 65 44 62 20 2a 70 44 62 20 29 7b 0a 20 20  iteDb *pDb ){.  
3340: 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20  SqlPreparedStmt 
3350: 2a 70 50 72 65 53 74 6d 74 3b 0a 0a 20 20 77 68  *pPreStmt;..  wh
3360: 69 6c 65 28 20 20 70 44 62 2d 3e 73 74 6d 74 4c  ile(  pDb->stmtL
3370: 69 73 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ist ){.    sqlit
3380: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 20 70 44 62  e3_finalize( pDb
3390: 2d 3e 73 74 6d 74 4c 69 73 74 2d 3e 70 53 74 6d  ->stmtList->pStm
33a0: 74 20 29 3b 0a 20 20 20 20 70 50 72 65 53 74 6d  t );.    pPreStm
33b0: 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73  t = pDb->stmtLis
33c0: 74 3b 0a 20 20 20 20 70 44 62 2d 3e 73 74 6d 74  t;.    pDb->stmt
33d0: 4c 69 73 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74  List = pDb->stmt
33e0: 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  List->pNext;.   
33f0: 20 54 63 6c 5f 46 72 65 65 28 20 28 63 68 61 72   Tcl_Free( (char
3400: 2a 29 70 50 72 65 53 74 6d 74 20 29 3b 0a 20 20  *)pPreStmt );.  
3410: 7d 0a 20 20 70 44 62 2d 3e 6e 53 74 6d 74 20 3d  }.  pDb->nStmt =
3420: 20 30 3b 0a 20 20 70 44 62 2d 3e 73 74 6d 74 4c   0;.  pDb->stmtL
3430: 61 73 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ast = 0;.}../*.*
3440: 2a 20 54 43 4c 20 63 61 6c 6c 73 20 74 68 69 73  * TCL calls this
3450: 20 70 72 6f 63 65 64 75 72 65 20 77 68 65 6e 20   procedure when 
3460: 61 6e 20 73 71 6c 69 74 65 33 20 64 61 74 61 62  an sqlite3 datab
3470: 61 73 65 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a  ase command is.*
3480: 2a 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74  * deleted..*/.st
3490: 61 74 69 63 20 76 6f 69 64 20 44 62 44 65 6c 65  atic void DbDele
34a0: 74 65 43 6d 64 28 76 6f 69 64 20 2a 64 62 29 7b  teCmd(void *db){
34b0: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
34c0: 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 64 62   = (SqliteDb*)db
34d0: 3b 0a 20 20 66 6c 75 73 68 53 74 6d 74 43 61 63  ;.  flushStmtCac
34e0: 68 65 28 70 44 62 29 3b 0a 20 20 63 6c 6f 73 65  he(pDb);.  close
34f0: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 73  IncrblobChannels
3500: 28 70 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33  (pDb);.  sqlite3
3510: 5f 63 6c 6f 73 65 28 70 44 62 2d 3e 64 62 29 3b  _close(pDb->db);
3520: 0a 20 20 77 68 69 6c 65 28 20 70 44 62 2d 3e 70  .  while( pDb->p
3530: 46 75 6e 63 20 29 7b 0a 20 20 20 20 53 71 6c 46  Func ){.    SqlF
3540: 75 6e 63 20 2a 70 46 75 6e 63 20 3d 20 70 44 62  unc *pFunc = pDb
3550: 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 70 44 62  ->pFunc;.    pDb
3560: 2d 3e 70 46 75 6e 63 20 3d 20 70 46 75 6e 63 2d  ->pFunc = pFunc-
3570: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 54 63 6c 5f  >pNext;.    Tcl_
3580: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 46 75  DecrRefCount(pFu
3590: 6e 63 2d 3e 70 53 63 72 69 70 74 29 3b 0a 20 20  nc->pScript);.  
35a0: 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72    Tcl_Free((char
35b0: 2a 29 70 46 75 6e 63 29 3b 0a 20 20 7d 0a 20 20  *)pFunc);.  }.  
35c0: 77 68 69 6c 65 28 20 70 44 62 2d 3e 70 43 6f 6c  while( pDb->pCol
35d0: 6c 61 74 65 20 29 7b 0a 20 20 20 20 53 71 6c 43  late ){.    SqlC
35e0: 6f 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65  ollate *pCollate
35f0: 20 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65   = pDb->pCollate
3600: 3b 0a 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c  ;.    pDb->pColl
3610: 61 74 65 20 3d 20 70 43 6f 6c 6c 61 74 65 2d 3e  ate = pCollate->
3620: 70 4e 65 78 74 3b 0a 20 20 20 20 54 63 6c 5f 46  pNext;.    Tcl_F
3630: 72 65 65 28 28 63 68 61 72 2a 29 70 43 6f 6c 6c  ree((char*)pColl
3640: 61 74 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ate);.  }.  if( 
3650: 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20  pDb->zBusy ){.  
3660: 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e    Tcl_Free(pDb->
3670: 7a 42 75 73 79 29 3b 0a 20 20 7d 0a 20 20 69 66  zBusy);.  }.  if
3680: 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b  ( pDb->zTrace ){
3690: 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44  .    Tcl_Free(pD
36a0: 62 2d 3e 7a 54 72 61 63 65 29 3b 0a 20 20 7d 0a  b->zTrace);.  }.
36b0: 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66    if( pDb->zProf
36c0: 69 6c 65 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46  ile ){.    Tcl_F
36d0: 72 65 65 28 70 44 62 2d 3e 7a 50 72 6f 66 69 6c  ree(pDb->zProfil
36e0: 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44  e);.  }.  if( pD
36f0: 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20  b->zAuth ){.    
3700: 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 41  Tcl_Free(pDb->zA
3710: 75 74 68 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  uth);.  }.  if( 
3720: 70 44 62 2d 3e 7a 4e 75 6c 6c 20 29 7b 0a 20 20  pDb->zNull ){.  
3730: 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e    Tcl_Free(pDb->
3740: 7a 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69 66  zNull);.  }.  if
3750: 28 20 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f  ( pDb->pUpdateHo
3760: 6f 6b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65  ok ){.    Tcl_De
3770: 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e  crRefCount(pDb->
3780: 70 55 70 64 61 74 65 48 6f 6f 6b 29 3b 0a 20 20  pUpdateHook);.  
3790: 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 52 6f  }.  if( pDb->pRo
37a0: 6c 6c 62 61 63 6b 48 6f 6f 6b 20 29 7b 0a 20 20  llbackHook ){.  
37b0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
37c0: 6e 74 28 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63  nt(pDb->pRollbac
37d0: 6b 48 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20 69 66  kHook);.  }.  if
37e0: 28 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e  ( pDb->pCollateN
37f0: 65 65 64 65 64 20 29 7b 0a 20 20 20 20 54 63 6c  eeded ){.    Tcl
3800: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44  _DecrRefCount(pD
3810: 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65  b->pCollateNeede
3820: 64 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 46 72  d);.  }.  Tcl_Fr
3830: 65 65 28 28 63 68 61 72 2a 29 70 44 62 29 3b 0a  ee((char*)pDb);.
3840: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
3850: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
3860: 77 68 65 6e 20 61 20 64 61 74 61 62 61 73 65 20  when a database 
3870: 66 69 6c 65 20 69 73 20 6c 6f 63 6b 65 64 20 77  file is locked w
3880: 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74  hile trying.** t
3890: 6f 20 65 78 65 63 75 74 65 20 53 51 4c 2e 0a 2a  o execute SQL..*
38a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 42  /.static int DbB
38b0: 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20  usyHandler(void 
38c0: 2a 63 64 2c 20 69 6e 74 20 6e 54 72 69 65 73 29  *cd, int nTries)
38d0: 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  {.  SqliteDb *pD
38e0: 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63  b = (SqliteDb*)c
38f0: 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  d;.  int rc;.  c
3900: 68 61 72 20 7a 56 61 6c 5b 33 30 5d 3b 0a 0a 20  har zVal[30];.. 
3910: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
3920: 66 28 73 69 7a 65 6f 66 28 7a 56 61 6c 29 2c 20  f(sizeof(zVal), 
3930: 7a 56 61 6c 2c 20 22 25 64 22 2c 20 6e 54 72 69  zVal, "%d", nTri
3940: 65 73 29 3b 0a 20 20 72 63 20 3d 20 54 63 6c 5f  es);.  rc = Tcl_
3950: 56 61 72 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74  VarEval(pDb->int
3960: 65 72 70 2c 20 70 44 62 2d 3e 7a 42 75 73 79 2c  erp, pDb->zBusy,
3970: 20 22 20 22 2c 20 7a 56 61 6c 2c 20 28 63 68 61   " ", zVal, (cha
3980: 72 2a 29 30 29 3b 0a 20 20 69 66 28 20 72 63 21  r*)0);.  if( rc!
3990: 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28  =TCL_OK || atoi(
39a0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73  Tcl_GetStringRes
39b0: 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29  ult(pDb->interp)
39c0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
39d0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
39e0: 31 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  1;.}..#ifndef SQ
39f0: 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45  LITE_OMIT_PROGRE
3a00: 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f 2a 0a 2a  SS_CALLBACK./*.*
3a10: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
3a20: 73 20 69 6e 76 6f 6b 65 64 20 61 73 20 74 68 65  s invoked as the
3a30: 20 27 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62   'progress callb
3a40: 61 63 6b 27 20 66 6f 72 20 74 68 65 20 64 61 74  ack' for the dat
3a50: 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  abase..*/.static
3a60: 20 69 6e 74 20 44 62 50 72 6f 67 72 65 73 73 48   int DbProgressH
3a70: 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 29  andler(void *cd)
3a80: 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  {.  SqliteDb *pD
3a90: 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63  b = (SqliteDb*)c
3aa0: 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  d;.  int rc;..  
3ab0: 61 73 73 65 72 74 28 20 70 44 62 2d 3e 7a 50 72  assert( pDb->zPr
3ac0: 6f 67 72 65 73 73 20 29 3b 0a 20 20 72 63 20 3d  ogress );.  rc =
3ad0: 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69   Tcl_Eval(pDb->i
3ae0: 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f  nterp, pDb->zPro
3af0: 67 72 65 73 73 29 3b 0a 20 20 69 66 28 20 72 63  gress);.  if( rc
3b00: 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69  !=TCL_OK || atoi
3b10: 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65  (Tcl_GetStringRe
3b20: 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70  sult(pDb->interp
3b30: 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  )) ){.    return
3b40: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
3b50: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69   0;.}.#endif..#i
3b60: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
3b70: 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 54 68  T_TRACE./*.** Th
3b80: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
3b90: 6c 6c 65 64 20 62 79 20 74 68 65 20 53 51 4c 69  lled by the SQLi
3ba0: 74 65 20 74 72 61 63 65 20 68 61 6e 64 6c 65 72  te trace handler
3bb0: 20 77 68 65 6e 65 76 65 72 20 61 20 6e 65 77 0a   whenever a new.
3bc0: 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 53 51 4c 20  ** block of SQL 
3bd0: 69 73 20 65 78 65 63 75 74 65 64 2e 20 20 54 68  is executed.  Th
3be0: 65 20 54 43 4c 20 73 63 72 69 70 74 20 69 6e 20  e TCL script in 
3bf0: 70 44 62 2d 3e 7a 54 72 61 63 65 20 69 73 20 65  pDb->zTrace is e
3c00: 78 65 63 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  xecuted..*/.stat
3c10: 69 63 20 76 6f 69 64 20 44 62 54 72 61 63 65 48  ic void DbTraceH
3c20: 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 2c  andler(void *cd,
3c30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
3c40: 6c 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  l){.  SqliteDb *
3c50: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a  pDb = (SqliteDb*
3c60: 29 63 64 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  )cd;.  Tcl_DStri
3c70: 6e 67 20 73 74 72 3b 0a 0a 20 20 54 63 6c 5f 44  ng str;..  Tcl_D
3c80: 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29  StringInit(&str)
3c90: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41  ;.  Tcl_DStringA
3ca0: 70 70 65 6e 64 28 26 73 74 72 2c 20 70 44 62 2d  ppend(&str, pDb-
3cb0: 3e 7a 54 72 61 63 65 2c 20 2d 31 29 3b 0a 20 20  >zTrace, -1);.  
3cc0: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
3cd0: 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a  dElement(&str, z
3ce0: 53 71 6c 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c  Sql);.  Tcl_Eval
3cf0: 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 54 63  (pDb->interp, Tc
3d00: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26  l_DStringValue(&
3d10: 73 74 72 29 29 3b 0a 20 20 54 63 6c 5f 44 53 74  str));.  Tcl_DSt
3d20: 72 69 6e 67 46 72 65 65 28 26 73 74 72 29 3b 0a  ringFree(&str);.
3d30: 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c    Tcl_ResetResul
3d40: 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b 0a  t(pDb->interp);.
3d50: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
3d60: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
3d70: 41 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  ACE./*.** This r
3d80: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
3d90: 20 62 79 20 74 68 65 20 53 51 4c 69 74 65 20 70   by the SQLite p
3da0: 72 6f 66 69 6c 65 20 68 61 6e 64 6c 65 72 20 61  rofile handler a
3db0: 66 74 65 72 20 61 20 73 74 61 74 65 6d 65 6e 74  fter a statement
3dc0: 0a 2a 2a 20 53 51 4c 20 68 61 73 20 65 78 65 63  .** SQL has exec
3dd0: 75 74 65 64 2e 20 20 54 68 65 20 54 43 4c 20 73  uted.  The TCL s
3de0: 63 72 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a 50  cript in pDb->zP
3df0: 72 6f 66 69 6c 65 20 69 73 20 65 76 61 6c 75 61  rofile is evalua
3e00: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ted..*/.static v
3e10: 6f 69 64 20 44 62 50 72 6f 66 69 6c 65 48 61 6e  oid DbProfileHan
3e20: 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 2c 20 63  dler(void *cd, c
3e30: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c  onst char *zSql,
3e40: 20 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 20 74   sqlite_uint64 t
3e50: 6d 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  m){.  SqliteDb *
3e60: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a  pDb = (SqliteDb*
3e70: 29 63 64 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  )cd;.  Tcl_DStri
3e80: 6e 67 20 73 74 72 3b 0a 20 20 63 68 61 72 20 7a  ng str;.  char z
3e90: 54 6d 5b 31 30 30 5d 3b 0a 0a 20 20 73 71 6c 69  Tm[100];..  sqli
3ea0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
3eb0: 65 6f 66 28 7a 54 6d 29 2d 31 2c 20 7a 54 6d 2c  eof(zTm)-1, zTm,
3ec0: 20 22 25 6c 6c 64 22 2c 20 74 6d 29 3b 0a 20 20   "%lld", tm);.  
3ed0: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
3ee0: 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74  &str);.  Tcl_DSt
3ef0: 72 69 6e 67 41 70 70 65 6e 64 28 26 73 74 72 2c  ringAppend(&str,
3f00: 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20   pDb->zProfile, 
3f10: 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  -1);.  Tcl_DStri
3f20: 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  ngAppendElement(
3f30: 26 73 74 72 2c 20 7a 53 71 6c 29 3b 0a 20 20 54  &str, zSql);.  T
3f40: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
3f50: 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 54  Element(&str, zT
3f60: 6d 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 28 70  m);.  Tcl_Eval(p
3f70: 44 62 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f  Db->interp, Tcl_
3f80: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74  DStringValue(&st
3f90: 72 29 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  r));.  Tcl_DStri
3fa0: 6e 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20  ngFree(&str);.  
3fb0: 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28  Tcl_ResetResult(
3fc0: 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 7d 0a  pDb->interp);.}.
3fd0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
3fe0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
3ff0: 6c 6c 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e  lled when a tran
4000: 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69  saction is commi
4010: 74 74 65 64 2e 20 20 54 68 65 0a 2a 2a 20 54 43  tted.  The.** TC
4020: 4c 20 73 63 72 69 70 74 20 69 6e 20 70 44 62 2d  L script in pDb-
4030: 3e 7a 43 6f 6d 6d 69 74 20 69 73 20 65 78 65 63  >zCommit is exec
4040: 75 74 65 64 2e 20 20 49 66 20 69 74 20 72 65 74  uted.  If it ret
4050: 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72  urns non-zero or
4060: 0a 2a 2a 20 69 66 20 69 74 20 74 68 72 6f 77 73  .** if it throws
4070: 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 2c 20 74   an exception, t
4080: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
4090: 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e  s rolled back in
40a0: 73 74 65 61 64 0a 2a 2a 20 6f 66 20 62 65 69 6e  stead.** of bein
40b0: 67 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f 0a  g committed..*/.
40c0: 73 74 61 74 69 63 20 69 6e 74 20 44 62 43 6f 6d  static int DbCom
40d0: 6d 69 74 48 61 6e 64 6c 65 72 28 76 6f 69 64 20  mitHandler(void 
40e0: 2a 63 64 29 7b 0a 20 20 53 71 6c 69 74 65 44 62  *cd){.  SqliteDb
40f0: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
4100: 62 2a 29 63 64 3b 0a 20 20 69 6e 74 20 72 63 3b  b*)cd;.  int rc;
4110: 0a 0a 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61  ..  rc = Tcl_Eva
4120: 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70  l(pDb->interp, p
4130: 44 62 2d 3e 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20  Db->zCommit);.  
4140: 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 7c  if( rc!=TCL_OK |
4150: 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65 74 53 74  | atoi(Tcl_GetSt
4160: 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62 2d 3e  ringResult(pDb->
4170: 69 6e 74 65 72 70 29 29 20 29 7b 0a 20 20 20 20  interp)) ){.    
4180: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
4190: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61  return 0;.}..sta
41a0: 74 69 63 20 76 6f 69 64 20 44 62 52 6f 6c 6c 62  tic void DbRollb
41b0: 61 63 6b 48 61 6e 64 6c 65 72 28 76 6f 69 64 20  ackHandler(void 
41c0: 2a 63 6c 69 65 6e 74 44 61 74 61 29 7b 0a 20 20  *clientData){.  
41d0: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
41e0: 28 53 71 6c 69 74 65 44 62 2a 29 63 6c 69 65 6e  (SqliteDb*)clien
41f0: 74 44 61 74 61 3b 0a 20 20 61 73 73 65 72 74 28  tData;.  assert(
4200: 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f  pDb->pRollbackHo
4210: 6f 6b 29 3b 0a 20 20 69 66 28 20 54 43 4c 5f 4f  ok);.  if( TCL_O
4220: 4b 21 3d 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78  K!=Tcl_EvalObjEx
4230: 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44  (pDb->interp, pD
4240: 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b  b->pRollbackHook
4250: 2c 20 30 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f  , 0) ){.    Tcl_
4260: 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28  BackgroundError(
4270: 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20  pDb->interp);.  
4280: 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
4290: 20 44 62 55 70 64 61 74 65 48 61 6e 64 6c 65 72   DbUpdateHandler
42a0: 28 0a 20 20 76 6f 69 64 20 2a 70 2c 20 0a 20 20  (.  void *p, .  
42b0: 69 6e 74 20 6f 70 2c 0a 20 20 63 6f 6e 73 74 20  int op,.  const 
42c0: 63 68 61 72 20 2a 7a 44 62 2c 20 0a 20 20 63 6f  char *zDb, .  co
42d0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 62 6c 2c 20  nst char *zTbl, 
42e0: 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  .  sqlite_int64 
42f0: 72 6f 77 69 64 0a 29 7b 0a 20 20 53 71 6c 69 74  rowid.){.  Sqlit
4300: 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69  eDb *pDb = (Sqli
4310: 74 65 44 62 20 2a 29 70 3b 0a 20 20 54 63 6c 5f  teDb *)p;.  Tcl_
4320: 4f 62 6a 20 2a 70 43 6d 64 3b 0a 0a 20 20 61 73  Obj *pCmd;..  as
4330: 73 65 72 74 28 20 70 44 62 2d 3e 70 55 70 64 61  sert( pDb->pUpda
4340: 74 65 48 6f 6f 6b 20 29 3b 0a 20 20 61 73 73 65  teHook );.  asse
4350: 72 74 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 49  rt( op==SQLITE_I
4360: 4e 53 45 52 54 20 7c 7c 20 6f 70 3d 3d 53 51 4c  NSERT || op==SQL
4370: 49 54 45 5f 55 50 44 41 54 45 20 7c 7c 20 6f 70  ITE_UPDATE || op
4380: 3d 3d 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 20  ==SQLITE_DELETE 
4390: 29 3b 0a 0a 20 20 70 43 6d 64 20 3d 20 54 63 6c  );..  pCmd = Tcl
43a0: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 44  _DuplicateObj(pD
43b0: 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 29 3b  b->pUpdateHook);
43c0: 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  .  Tcl_IncrRefCo
43d0: 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 54 63 6c  unt(pCmd);.  Tcl
43e0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
43f0: 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54  ement(0, pCmd, T
4400: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
4410: 0a 20 20 20 20 28 20 28 6f 70 3d 3d 53 51 4c 49  .    ( (op==SQLI
4420: 54 45 5f 49 4e 53 45 52 54 29 3f 22 49 4e 53 45  TE_INSERT)?"INSE
4430: 52 54 22 3a 28 6f 70 3d 3d 53 51 4c 49 54 45 5f  RT":(op==SQLITE_
4440: 55 50 44 41 54 45 29 3f 22 55 50 44 41 54 45 22  UPDATE)?"UPDATE"
4450: 3a 22 44 45 4c 45 54 45 22 29 2c 20 2d 31 29 29  :"DELETE"), -1))
4460: 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
4470: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20  ppendElement(0, 
4480: 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72  pCmd, Tcl_NewStr
4490: 69 6e 67 4f 62 6a 28 7a 44 62 2c 20 2d 31 29 29  ingObj(zDb, -1))
44a0: 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
44b0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20  ppendElement(0, 
44c0: 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72  pCmd, Tcl_NewStr
44d0: 69 6e 67 4f 62 6a 28 7a 54 62 6c 2c 20 2d 31 29  ingObj(zTbl, -1)
44e0: 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
44f0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
4500: 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 57 69   pCmd, Tcl_NewWi
4510: 64 65 49 6e 74 4f 62 6a 28 72 6f 77 69 64 29 29  deIntObj(rowid))
4520: 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  ;.  Tcl_EvalObjE
4530: 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70  x(pDb->interp, p
4540: 43 6d 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49  Cmd, TCL_EVAL_DI
4550: 52 45 43 54 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  RECT);.}..static
4560: 20 76 6f 69 64 20 74 63 6c 43 6f 6c 6c 61 74 65   void tclCollate
4570: 4e 65 65 64 65 64 28 0a 20 20 76 6f 69 64 20 2a  Needed(.  void *
4580: 70 43 74 78 2c 0a 20 20 73 71 6c 69 74 65 33 20  pCtx,.  sqlite3 
4590: 2a 64 62 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a  *db,.  int enc,.
45a0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
45b0: 61 6d 65 0a 29 7b 0a 20 20 53 71 6c 69 74 65 44  ame.){.  SqliteD
45c0: 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65  b *pDb = (Sqlite
45d0: 44 62 20 2a 29 70 43 74 78 3b 0a 20 20 54 63 6c  Db *)pCtx;.  Tcl
45e0: 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 20 3d 20  _Obj *pScript = 
45f0: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
4600: 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65  (pDb->pCollateNe
4610: 65 64 65 64 29 3b 0a 20 20 54 63 6c 5f 49 6e 63  eded);.  Tcl_Inc
4620: 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70  rRefCount(pScrip
4630: 74 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  t);.  Tcl_ListOb
4640: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
4650: 2c 20 70 53 63 72 69 70 74 2c 20 54 63 6c 5f 4e  , pScript, Tcl_N
4660: 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 4e 61 6d  ewStringObj(zNam
4670: 65 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45  e, -1));.  Tcl_E
4680: 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69 6e  valObjEx(pDb->in
4690: 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20 30  terp, pScript, 0
46a0: 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66  );.  Tcl_DecrRef
46b0: 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a  Count(pScript);.
46c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
46d0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
46e0: 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20 53  to evaluate an S
46f0: 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e  QL collation fun
4700: 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 65  ction implemente
4710: 64 0a 2a 2a 20 75 73 69 6e 67 20 54 43 4c 20 73  d.** using TCL s
4720: 63 72 69 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  cript..*/.static
4730: 20 69 6e 74 20 74 63 6c 53 71 6c 43 6f 6c 6c 61   int tclSqlColla
4740: 74 65 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78  te(.  void *pCtx
4750: 2c 0a 20 20 69 6e 74 20 6e 41 2c 0a 20 20 63 6f  ,.  int nA,.  co
4760: 6e 73 74 20 76 6f 69 64 20 2a 7a 41 2c 0a 20 20  nst void *zA,.  
4770: 69 6e 74 20 6e 42 2c 0a 20 20 63 6f 6e 73 74 20  int nB,.  const 
4780: 76 6f 69 64 20 2a 7a 42 0a 29 7b 0a 20 20 53 71  void *zB.){.  Sq
4790: 6c 43 6f 6c 6c 61 74 65 20 2a 70 20 3d 20 28 53  lCollate *p = (S
47a0: 71 6c 43 6f 6c 6c 61 74 65 20 2a 29 70 43 74 78  qlCollate *)pCtx
47b0: 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d  ;.  Tcl_Obj *pCm
47c0: 64 3b 0a 0a 20 20 70 43 6d 64 20 3d 20 54 63 6c  d;..  pCmd = Tcl
47d0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 2d  _NewStringObj(p-
47e0: 3e 7a 53 63 72 69 70 74 2c 20 2d 31 29 3b 0a 20  >zScript, -1);. 
47f0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
4800: 74 28 70 43 6d 64 29 3b 0a 20 20 54 63 6c 5f 4c  t(pCmd);.  Tcl_L
4810: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
4820: 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70  ent(p->interp, p
4830: 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Cmd, Tcl_NewStri
4840: 6e 67 4f 62 6a 28 7a 41 2c 20 6e 41 29 29 3b 0a  ngObj(zA, nA));.
4850: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
4860: 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d 3e 69 6e  endElement(p->in
4870: 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 63 6c 5f  terp, pCmd, Tcl_
4880: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 42 2c  NewStringObj(zB,
4890: 20 6e 42 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61   nB));.  Tcl_Eva
48a0: 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70  lObjEx(p->interp
48b0: 2c 20 70 43 6d 64 2c 20 54 43 4c 5f 45 56 41 4c  , pCmd, TCL_EVAL
48c0: 5f 44 49 52 45 43 54 29 3b 0a 20 20 54 63 6c 5f  _DIRECT);.  Tcl_
48d0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d  DecrRefCount(pCm
48e0: 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 61 74  d);.  return (at
48f0: 6f 69 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  oi(Tcl_GetString
4900: 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70  Result(p->interp
4910: 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  )));.}../*.** Th
4920: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
4930: 6c 6c 65 64 20 74 6f 20 65 76 61 6c 75 61 74 65  lled to evaluate
4940: 20 61 6e 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e   an SQL function
4950: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20   implemented.** 
4960: 75 73 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74  using TCL script
4970: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4980: 20 74 63 6c 53 71 6c 46 75 6e 63 28 73 71 6c 69   tclSqlFunc(sqli
4990: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
49a0: 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20  text, int argc, 
49b0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 61  sqlite3_value**a
49c0: 72 67 76 29 7b 0a 20 20 53 71 6c 46 75 6e 63 20  rgv){.  SqlFunc 
49d0: 2a 70 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65  *p = sqlite3_use
49e0: 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29 3b  r_data(context);
49f0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64  .  Tcl_Obj *pCmd
4a00: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
4a10: 20 72 63 3b 0a 0a 20 20 69 66 28 20 61 72 67 63   rc;..  if( argc
4a20: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ==0 ){.    /* If
4a30: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 61 72   there are no ar
4a40: 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 66  guments to the f
4a50: 75 6e 63 74 69 6f 6e 2c 20 63 61 6c 6c 20 54 63  unction, call Tc
4a60: 6c 5f 45 76 61 6c 4f 62 6a 45 78 20 6f 6e 20 74  l_EvalObjEx on t
4a70: 68 65 0a 20 20 20 20 2a 2a 20 73 63 72 69 70 74  he.    ** script
4a80: 20 6f 62 6a 65 63 74 20 64 69 72 65 63 74 6c 79   object directly
4a90: 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74  .  This allows t
4aa0: 68 65 20 54 43 4c 20 63 6f 6d 70 69 6c 65 72 20  he TCL compiler 
4ab0: 74 6f 20 67 65 6e 65 72 61 74 65 0a 20 20 20 20  to generate.    
4ac0: 2a 2a 20 62 79 74 65 63 6f 64 65 20 66 6f 72 20  ** bytecode for 
4ad0: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6f 6e 20 74  the command on t
4ae0: 68 65 20 66 69 72 73 74 20 69 6e 76 6f 63 61 74  he first invocat
4af0: 69 6f 6e 20 61 6e 64 20 74 68 75 73 20 6d 61 6b  ion and thus mak
4b00: 65 0a 20 20 20 20 2a 2a 20 73 75 62 73 65 71 75  e.    ** subsequ
4b10: 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73 20  ent invocations 
4b20: 6d 75 63 68 20 66 61 73 74 65 72 2e 20 2a 2f 0a  much faster. */.
4b30: 20 20 20 20 70 43 6d 64 20 3d 20 70 2d 3e 70 53      pCmd = p->pS
4b40: 63 72 69 70 74 3b 0a 20 20 20 20 54 63 6c 5f 49  cript;.    Tcl_I
4b50: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64  ncrRefCount(pCmd
4b60: 29 3b 0a 20 20 20 20 72 63 20 3d 20 54 63 6c 5f  );.    rc = Tcl_
4b70: 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74  EvalObjEx(p->int
4b80: 65 72 70 2c 20 70 43 6d 64 2c 20 30 29 3b 0a 20  erp, pCmd, 0);. 
4b90: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
4ba0: 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 7d 65 6c  unt(pCmd);.  }el
4bb0: 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  se{.    /* If th
4bc0: 65 72 65 20 61 72 65 20 61 72 67 75 6d 65 6e 74  ere are argument
4bd0: 73 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f  s to the functio
4be0: 6e 2c 20 6d 61 6b 65 20 61 20 73 68 61 6c 6c 6f  n, make a shallo
4bf0: 77 20 63 6f 70 79 20 6f 66 20 74 68 65 0a 20 20  w copy of the.  
4c00: 20 20 2a 2a 20 73 63 72 69 70 74 20 6f 62 6a 65    ** script obje
4c10: 63 74 2c 20 6c 61 70 70 65 6e 64 20 74 68 65 20  ct, lappend the 
4c20: 61 72 67 75 6d 65 6e 74 73 2c 20 74 68 65 6e 20  arguments, then 
4c30: 65 76 61 6c 75 61 74 65 20 74 68 65 20 63 6f 70  evaluate the cop
4c40: 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  y..    **.    **
4c50: 20 42 79 20 22 73 68 61 6c 6c 6f 77 22 20 63 6f   By "shallow" co
4c60: 70 79 2c 20 77 65 20 6d 65 61 6e 20 61 20 6f 6e  py, we mean a on
4c70: 6c 79 20 74 68 65 20 6f 75 74 65 72 20 6c 69 73  ly the outer lis
4c80: 74 20 54 63 6c 5f 4f 62 6a 20 69 73 20 64 75 70  t Tcl_Obj is dup
4c90: 6c 69 63 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20  licated..    ** 
4ca0: 54 68 65 20 6e 65 77 20 54 63 6c 5f 4f 62 6a 20  The new Tcl_Obj 
4cb0: 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74 65 72  contains pointer
4cc0: 73 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  s to the origina
4cd0: 6c 20 6c 69 73 74 20 65 6c 65 6d 65 6e 74 73 2e  l list elements.
4ce0: 20 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 77 61   .    ** That wa
4cf0: 79 2c 20 77 68 65 6e 20 54 63 6c 5f 45 76 61 6c  y, when Tcl_Eval
4d00: 4f 62 6a 76 28 29 20 69 73 20 72 75 6e 20 61 6e  Objv() is run an
4d10: 64 20 73 68 69 6d 6d 65 72 73 20 74 68 65 20 66  d shimmers the f
4d20: 69 72 73 74 20 65 6c 65 6d 65 6e 74 0a 20 20 20  irst element.   
4d30: 20 2a 2a 20 6f 66 20 74 68 65 20 6c 69 73 74 20   ** of the list 
4d40: 74 6f 20 74 63 6c 43 6d 64 4e 61 6d 65 54 79 70  to tclCmdNameTyp
4d50: 65 2c 20 74 68 61 74 20 61 6c 74 65 72 6e 61 74  e, that alternat
4d60: 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  e representation
4d70: 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20   will.    ** be 
4d80: 70 72 65 73 65 72 76 65 64 20 61 6e 64 20 72 65  preserved and re
4d90: 75 73 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74  used on the next
4da0: 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 20 20 20   invocation..   
4db0: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20   */.    Tcl_Obj 
4dc0: 2a 2a 61 41 72 67 3b 0a 20 20 20 20 69 6e 74 20  **aArg;.    int 
4dd0: 6e 41 72 67 3b 0a 20 20 20 20 69 66 28 20 54 63  nArg;.    if( Tc
4de0: 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d  l_ListObjGetElem
4df0: 65 6e 74 73 28 70 2d 3e 69 6e 74 65 72 70 2c 20  ents(p->interp, 
4e00: 70 2d 3e 70 53 63 72 69 70 74 2c 20 26 6e 41 72  p->pScript, &nAr
4e10: 67 2c 20 26 61 41 72 67 29 20 29 7b 0a 20 20 20  g, &aArg) ){.   
4e20: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
4e30: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
4e40: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65   Tcl_GetStringRe
4e50: 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c  sult(p->interp),
4e60: 20 2d 31 29 3b 20 0a 20 20 20 20 20 20 72 65 74   -1); .      ret
4e70: 75 72 6e 3b 0a 20 20 20 20 7d 20 20 20 20 20 0a  urn;.    }     .
4e80: 20 20 20 20 70 43 6d 64 20 3d 20 54 63 6c 5f 4e      pCmd = Tcl_N
4e90: 65 77 4c 69 73 74 4f 62 6a 28 6e 41 72 67 2c 20  ewListObj(nArg, 
4ea0: 61 41 72 67 29 3b 0a 20 20 20 20 54 63 6c 5f 49  aArg);.    Tcl_I
4eb0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64  ncrRefCount(pCmd
4ec0: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
4ed0: 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20  i<argc; i++){.  
4ee0: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
4ef0: 65 20 2a 70 49 6e 20 3d 20 61 72 67 76 5b 69 5d  e *pIn = argv[i]
4f00: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20  ;.      Tcl_Obj 
4f10: 2a 70 56 61 6c 3b 0a 20 20 20 20 20 20 20 20 20  *pVal;.         
4f20: 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 53 65 74     .      /* Set
4f30: 20 70 56 61 6c 20 74 6f 20 63 6f 6e 74 61 69 6e   pVal to contain
4f40: 20 74 68 65 20 69 27 74 68 20 63 6f 6c 75 6d 6e   the i'th column
4f50: 20 6f 66 20 74 68 69 73 20 72 6f 77 2e 20 2a 2f   of this row. */
4f60: 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20 73  .      switch( s
4f70: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
4f80: 65 28 70 49 6e 29 20 29 7b 0a 20 20 20 20 20 20  e(pIn) ){.      
4f90: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 4c    case SQLITE_BL
4fa0: 4f 42 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  OB: {.          
4fb0: 69 6e 74 20 62 79 74 65 73 20 3d 20 73 71 6c 69  int bytes = sqli
4fc0: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
4fd0: 70 49 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pIn);.          
4fe0: 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79  pVal = Tcl_NewBy
4ff0: 74 65 41 72 72 61 79 4f 62 6a 28 73 71 6c 69 74  teArrayObj(sqlit
5000: 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 70 49  e3_value_blob(pI
5010: 6e 29 2c 20 62 79 74 65 73 29 3b 0a 20 20 20 20  n), bytes);.    
5020: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5030: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63       }.        c
5040: 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  ase SQLITE_INTEG
5050: 45 52 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ER: {.          
5060: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 76 20 3d  sqlite_int64 v =
5070: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
5080: 6e 74 36 34 28 70 49 6e 29 3b 0a 20 20 20 20 20  nt64(pIn);.     
5090: 20 20 20 20 20 69 66 28 20 76 3e 3d 2d 32 31 34       if( v>=-214
50a0: 37 34 38 33 36 34 37 20 26 26 20 76 3c 3d 32 31  7483647 && v<=21
50b0: 34 37 34 38 33 36 34 37 20 29 7b 0a 20 20 20 20  47483647 ){.    
50c0: 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54          pVal = T
50d0: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 76 29 3b  cl_NewIntObj(v);
50e0: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
50f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 56  {.            pV
5100: 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 57 69 64 65  al = Tcl_NewWide
5110: 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20 20  IntObj(v);.     
5120: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
5130: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
5140: 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  }.        case S
5150: 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20  QLITE_FLOAT: {. 
5160: 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20           double 
5170: 72 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  r = sqlite3_valu
5180: 65 5f 64 6f 75 62 6c 65 28 70 49 6e 29 3b 0a 20  e_double(pIn);. 
5190: 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20           pVal = 
51a0: 54 63 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f 62 6a  Tcl_NewDoubleObj
51b0: 28 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  (r);.          b
51c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
51d0: 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
51e0: 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  ITE_NULL: {.    
51f0: 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c        pVal = Tcl
5200: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22  _NewStringObj(""
5210: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
5220: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
5230: 0a 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74  .        default
5240: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  : {.          in
5250: 74 20 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65  t bytes = sqlite
5260: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70 49  3_value_bytes(pI
5270: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 56  n);.          pV
5280: 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  al = Tcl_NewStri
5290: 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29 73 71  ngObj((char *)sq
52a0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
52b0: 28 70 49 6e 29 2c 20 62 79 74 65 73 29 3b 0a 20  (pIn), bytes);. 
52c0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
52d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
52e0: 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 54 63 6c  }.      rc = Tcl
52f0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
5300: 65 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c  ement(p->interp,
5310: 20 70 43 6d 64 2c 20 70 56 61 6c 29 3b 0a 20 20   pCmd, pVal);.  
5320: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
5330: 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65        Tcl_DecrRe
5340: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
5350: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
5360: 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
5370: 78 74 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  xt, Tcl_GetStrin
5380: 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72  gResult(p->inter
5390: 70 29 2c 20 2d 31 29 3b 20 0a 20 20 20 20 20 20  p), -1); .      
53a0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
53b0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
53c0: 21 70 2d 3e 75 73 65 45 76 61 6c 4f 62 6a 76 20  !p->useEvalObjv 
53d0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 63 6c 5f  ){.      /* Tcl_
53e0: 45 76 61 6c 4f 62 6a 45 78 28 29 20 77 69 6c 6c  EvalObjEx() will
53f0: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
5400: 61 6c 6c 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76  all Tcl_EvalObjv
5410: 28 29 20 69 66 20 70 43 6d 64 0a 20 20 20 20 20  () if pCmd.     
5420: 20 2a 2a 20 69 73 20 61 20 6c 69 73 74 20 77 69   ** is a list wi
5430: 74 68 6f 75 74 20 61 20 73 74 72 69 6e 67 20 72  thout a string r
5440: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20 20  epresentation.  
5450: 54 6f 20 70 72 65 76 65 6e 74 20 74 68 69 73 20  To prevent this 
5460: 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 68 61  from.      ** ha
5470: 70 70 65 6e 69 6e 67 2c 20 6d 61 6b 65 20 73 75  ppening, make su
5480: 72 65 20 70 43 6d 64 20 68 61 73 20 61 20 76 61  re pCmd has a va
5490: 6c 69 64 20 73 74 72 69 6e 67 20 72 65 70 72 65  lid string repre
54a0: 73 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  sentation */.   
54b0: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
54c0: 28 70 43 6d 64 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCmd);.    }.  
54d0: 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f    rc = Tcl_EvalO
54e0: 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20  bjEx(p->interp, 
54f0: 70 43 6d 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44  pCmd, TCL_EVAL_D
5500: 49 52 45 43 54 29 3b 0a 20 20 20 20 54 63 6c 5f  IRECT);.    Tcl_
5510: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d  DecrRefCount(pCm
5520: 64 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  d);.  }..  if( r
5530: 63 20 26 26 20 72 63 21 3d 54 43 4c 5f 52 45 54  c && rc!=TCL_RET
5540: 55 52 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  URN ){.    sqlit
5550: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
5560: 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f 47 65 74  context, Tcl_Get
5570: 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e  StringResult(p->
5580: 69 6e 74 65 72 70 29 2c 20 2d 31 29 3b 20 0a 20  interp), -1); . 
5590: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f   }else{.    Tcl_
55a0: 4f 62 6a 20 2a 70 56 61 72 20 3d 20 54 63 6c 5f  Obj *pVar = Tcl_
55b0: 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 70 2d 3e  GetObjResult(p->
55c0: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 69 6e 74  interp);.    int
55d0: 20 6e 3b 0a 20 20 20 20 75 38 20 2a 64 61 74 61   n;.    u8 *data
55e0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70  ;.    char *zTyp
55f0: 65 20 3d 20 70 56 61 72 2d 3e 74 79 70 65 50 74  e = pVar->typePt
5600: 72 20 3f 20 70 56 61 72 2d 3e 74 79 70 65 50 74  r ? pVar->typePt
5610: 72 2d 3e 6e 61 6d 65 20 3a 20 22 22 3b 0a 20 20  r->name : "";.  
5620: 20 20 63 68 61 72 20 63 20 3d 20 7a 54 79 70 65    char c = zType
5630: 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d  [0];.    if( c==
5640: 27 62 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54  'b' && strcmp(zT
5650: 79 70 65 2c 22 62 79 74 65 61 72 72 61 79 22 29  ype,"bytearray")
5660: 3d 3d 30 20 26 26 20 70 56 61 72 2d 3e 62 79 74  ==0 && pVar->byt
5670: 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  es==0 ){.      /
5680: 2a 20 4f 6e 6c 79 20 72 65 74 75 72 6e 20 61 20  * Only return a 
5690: 42 4c 4f 42 20 74 79 70 65 20 69 66 20 74 68 65  BLOB type if the
56a0: 20 54 63 6c 20 76 61 72 69 61 62 6c 65 20 69 73   Tcl variable is
56b0: 20 61 20 62 79 74 65 61 72 72 61 79 20 61 6e 64   a bytearray and
56c0: 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f  .      ** has no
56d0: 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e   string represen
56e0: 74 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20  tation. */.     
56f0: 20 64 61 74 61 20 3d 20 54 63 6c 5f 47 65 74 42   data = Tcl_GetB
5700: 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28  yteArrayFromObj(
5710: 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20  pVar, &n);.     
5720: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
5730: 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20 64 61  blob(context, da
5740: 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 54 52  ta, n, SQLITE_TR
5750: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d 65  ANSIENT);.    }e
5760: 6c 73 65 20 69 66 28 20 63 3d 3d 27 62 27 20 26  lse if( c=='b' &
5770: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
5780: 62 6f 6f 6c 65 61 6e 22 29 3d 3d 30 20 29 7b 0a  boolean")==0 ){.
5790: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 49 6e 74        Tcl_GetInt
57a0: 46 72 6f 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c  FromObj(0, pVar,
57b0: 20 26 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   &n);.      sqli
57c0: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63  te3_result_int(c
57d0: 6f 6e 74 65 78 74 2c 20 6e 29 3b 0a 20 20 20 20  ontext, n);.    
57e0: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 64 27  }else if( c=='d'
57f0: 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65   && strcmp(zType
5800: 2c 22 64 6f 75 62 6c 65 22 29 3d 3d 30 20 29 7b  ,"double")==0 ){
5810: 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 3b  .      double r;
5820: 0a 20 20 20 20 20 20 54 63 6c 5f 47 65 74 44 6f  .      Tcl_GetDo
5830: 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 30 2c 20 70  ubleFromObj(0, p
5840: 56 61 72 2c 20 26 72 29 3b 0a 20 20 20 20 20 20  Var, &r);.      
5850: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64  sqlite3_result_d
5860: 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 72  ouble(context, r
5870: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
5880: 20 28 63 3d 3d 27 77 27 20 26 26 20 73 74 72 63   (c=='w' && strc
5890: 6d 70 28 7a 54 79 70 65 2c 22 77 69 64 65 49 6e  mp(zType,"wideIn
58a0: 74 22 29 3d 3d 30 29 20 7c 7c 0a 20 20 20 20 20  t")==0) ||.     
58b0: 20 20 20 20 20 28 63 3d 3d 27 69 27 20 26 26 20       (c=='i' && 
58c0: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 69 6e  strcmp(zType,"in
58d0: 74 22 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20  t")==0) ){.     
58e0: 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 76 3b 0a   Tcl_WideInt v;.
58f0: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 57 69 64        Tcl_GetWid
5900: 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 30 2c 20 70  eIntFromObj(0, p
5910: 56 61 72 2c 20 26 76 29 3b 0a 20 20 20 20 20 20  Var, &v);.      
5920: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
5930: 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 76 29  nt64(context, v)
5940: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
5950: 20 20 20 64 61 74 61 20 3d 20 28 75 6e 73 69 67     data = (unsig
5960: 6e 65 64 20 63 68 61 72 20 2a 29 54 63 6c 5f 47  ned char *)Tcl_G
5970: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
5980: 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20  pVar, &n);.     
5990: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
59a0: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 28 63  text(context, (c
59b0: 68 61 72 20 2a 29 64 61 74 61 2c 20 6e 2c 20 53  har *)data, n, S
59c0: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
59d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23  ;.    }.  }.}..#
59e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
59f0: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
5a00: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  ./*.** This is t
5a10: 68 65 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f  he authenticatio
5a20: 6e 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49 74 20  n function.  It 
5a30: 61 70 70 65 6e 64 73 20 74 68 65 20 61 75 74 68  appends the auth
5a40: 65 6e 74 69 63 61 74 69 6f 6e 0a 2a 2a 20 74 79  entication.** ty
5a50: 70 65 20 63 6f 64 65 20 61 6e 64 20 74 68 65 20  pe code and the 
5a60: 74 77 6f 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  two arguments to
5a70: 20 7a 43 6d 64 5b 5d 20 74 68 65 6e 20 69 6e 76   zCmd[] then inv
5a80: 6f 6b 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a  okes the result.
5a90: 2a 2a 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 70  ** on the interp
5aa0: 72 65 74 65 72 2e 20 20 54 68 65 20 72 65 70 6c  reter.  The repl
5ab0: 79 20 69 73 20 65 78 61 6d 69 6e 65 64 20 74 6f  y is examined to
5ac0: 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
5ad0: 65 0a 2a 2a 20 61 75 74 68 65 6e 74 69 63 61 74  e.** authenticat
5ae0: 69 6f 6e 20 66 61 69 6c 73 20 6f 72 20 73 75 63  ion fails or suc
5af0: 63 65 65 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ceeds..*/.static
5b00: 20 69 6e 74 20 61 75 74 68 5f 63 61 6c 6c 62 61   int auth_callba
5b10: 63 6b 28 0a 20 20 76 6f 69 64 20 2a 70 41 72 67  ck(.  void *pArg
5b20: 2c 0a 20 20 69 6e 74 20 63 6f 64 65 2c 0a 20 20  ,.  int code,.  
5b30: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
5b40: 31 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  1,.  const char 
5b50: 2a 7a 41 72 67 32 2c 0a 20 20 63 6f 6e 73 74 20  *zArg2,.  const 
5b60: 63 68 61 72 20 2a 7a 41 72 67 33 2c 0a 20 20 63  char *zArg3,.  c
5b70: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 34  onst char *zArg4
5b80: 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 64  .){.  char *zCod
5b90: 65 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  e;.  Tcl_DString
5ba0: 20 73 74 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   str;.  int rc;.
5bb0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52    const char *zR
5bc0: 65 70 6c 79 3b 0a 20 20 53 71 6c 69 74 65 44 62  eply;.  SqliteDb
5bd0: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
5be0: 62 2a 29 70 41 72 67 3b 0a 20 20 69 66 28 20 70  b*)pArg;.  if( p
5bf0: 44 62 2d 3e 64 69 73 61 62 6c 65 41 75 74 68 20  Db->disableAuth 
5c00: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
5c10: 4f 4b 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 63  OK;..  switch( c
5c20: 6f 64 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ode ){.    case 
5c30: 53 51 4c 49 54 45 5f 43 4f 50 59 20 20 20 20 20  SQLITE_COPY     
5c40: 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65           : zCode
5c50: 3d 22 53 51 4c 49 54 45 5f 43 4f 50 59 22 3b 20  ="SQLITE_COPY"; 
5c60: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
5c70: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e  SQLITE_CREATE_IN
5c80: 44 45 58 20 20 20 20 20 20 3a 20 7a 43 6f 64 65  DEX      : zCode
5c90: 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  ="SQLITE_CREATE_
5ca0: 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20  INDEX"; break;. 
5cb0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
5cc0: 52 45 41 54 45 5f 54 41 42 4c 45 20 20 20 20 20  REATE_TABLE     
5cd0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
5ce0: 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 22 3b 20  _CREATE_TABLE"; 
5cf0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
5d00: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
5d10: 4d 50 5f 49 4e 44 45 58 20 3a 20 7a 43 6f 64 65  MP_INDEX : zCode
5d20: 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  ="SQLITE_CREATE_
5d30: 54 45 4d 50 5f 49 4e 44 45 58 22 3b 20 62 72 65  TEMP_INDEX"; bre
5d40: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
5d50: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
5d60: 54 41 42 4c 45 20 3a 20 7a 43 6f 64 65 3d 22 53  TABLE : zCode="S
5d70: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
5d80: 50 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b  P_TABLE"; break;
5d90: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
5da0: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 52 49  _CREATE_TEMP_TRI
5db0: 47 47 45 52 3a 20 7a 43 6f 64 65 3d 22 53 51 4c  GGER: zCode="SQL
5dc0: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
5dd0: 54 52 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b  TRIGGER"; break;
5de0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
5df0: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45  _CREATE_TEMP_VIE
5e00: 57 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49  W  : zCode="SQLI
5e10: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56  TE_CREATE_TEMP_V
5e20: 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  IEW"; break;.   
5e30: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45   case SQLITE_CRE
5e40: 41 54 45 5f 54 52 49 47 47 45 52 20 20 20 20 3a  ATE_TRIGGER    :
5e50: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43   zCode="SQLITE_C
5e60: 52 45 41 54 45 5f 54 52 49 47 47 45 52 22 3b 20  REATE_TRIGGER"; 
5e70: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
5e80: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49  SQLITE_CREATE_VI
5e90: 45 57 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65  EW       : zCode
5ea0: 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  ="SQLITE_CREATE_
5eb0: 56 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20  VIEW"; break;.  
5ec0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 45    case SQLITE_DE
5ed0: 4c 45 54 45 20 20 20 20 20 20 20 20 20 20 20 20  LETE            
5ee0: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
5ef0: 44 45 4c 45 54 45 22 3b 20 62 72 65 61 6b 3b 0a  DELETE"; break;.
5f00: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
5f10: 44 52 4f 50 5f 49 4e 44 45 58 20 20 20 20 20 20  DROP_INDEX      
5f20: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
5f30: 45 5f 44 52 4f 50 5f 49 4e 44 45 58 22 3b 20 62  E_DROP_INDEX"; b
5f40: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
5f50: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45  QLITE_DROP_TABLE
5f60: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
5f70: 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42  "SQLITE_DROP_TAB
5f80: 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  LE"; break;.    
5f90: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50  case SQLITE_DROP
5fa0: 5f 54 45 4d 50 5f 49 4e 44 45 58 20 20 20 3a 20  _TEMP_INDEX   : 
5fb0: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52  zCode="SQLITE_DR
5fc0: 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 22 3b 20  OP_TEMP_INDEX"; 
5fd0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
5fe0: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
5ff0: 5f 54 41 42 4c 45 20 20 20 3a 20 7a 43 6f 64 65  _TABLE   : zCode
6000: 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  ="SQLITE_DROP_TE
6010: 4d 50 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b  MP_TABLE"; break
6020: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
6030: 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 52 49 47  E_DROP_TEMP_TRIG
6040: 47 45 52 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c  GER : zCode="SQL
6050: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 52  ITE_DROP_TEMP_TR
6060: 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20  IGGER"; break;. 
6070: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
6080: 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 20 20 20  ROP_TEMP_VIEW   
6090: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
60a0: 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 22  _DROP_TEMP_VIEW"
60b0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
60c0: 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 52  e SQLITE_DROP_TR
60d0: 49 47 47 45 52 20 20 20 20 20 20 3a 20 7a 43 6f  IGGER      : zCo
60e0: 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f  de="SQLITE_DROP_
60f0: 54 52 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b  TRIGGER"; break;
6100: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
6110: 5f 44 52 4f 50 5f 56 49 45 57 20 20 20 20 20 20  _DROP_VIEW      
6120: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
6130: 54 45 5f 44 52 4f 50 5f 56 49 45 57 22 3b 20 62  TE_DROP_VIEW"; b
6140: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
6150: 51 4c 49 54 45 5f 49 4e 53 45 52 54 20 20 20 20  QLITE_INSERT    
6160: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
6170: 22 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 22 3b  "SQLITE_INSERT";
6180: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
6190: 20 53 51 4c 49 54 45 5f 50 52 41 47 4d 41 20 20   SQLITE_PRAGMA  
61a0: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
61b0: 65 3d 22 53 51 4c 49 54 45 5f 50 52 41 47 4d 41  e="SQLITE_PRAGMA
61c0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
61d0: 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 20 20  se SQLITE_READ  
61e0: 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43              : zC
61f0: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 52 45 41 44  ode="SQLITE_READ
6200: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
6210: 73 65 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54  se SQLITE_SELECT
6220: 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43              : zC
6230: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 53 45 4c 45  ode="SQLITE_SELE
6240: 43 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  CT"; break;.    
6250: 63 61 73 65 20 53 51 4c 49 54 45 5f 54 52 41 4e  case SQLITE_TRAN
6260: 53 41 43 54 49 4f 4e 20 20 20 20 20 20 20 3a 20  SACTION       : 
6270: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 54 52  zCode="SQLITE_TR
6280: 41 4e 53 41 43 54 49 4f 4e 22 3b 20 62 72 65 61  ANSACTION"; brea
6290: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
62a0: 54 45 5f 55 50 44 41 54 45 20 20 20 20 20 20 20  TE_UPDATE       
62b0: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
62c0: 4c 49 54 45 5f 55 50 44 41 54 45 22 3b 20 62 72  LITE_UPDATE"; br
62d0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
62e0: 4c 49 54 45 5f 41 54 54 41 43 48 20 20 20 20 20  LITE_ATTACH     
62f0: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
6300: 53 51 4c 49 54 45 5f 41 54 54 41 43 48 22 3b 20  SQLITE_ATTACH"; 
6310: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
6320: 53 51 4c 49 54 45 5f 44 45 54 41 43 48 20 20 20  SQLITE_DETACH   
6330: 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65           : zCode
6340: 3d 22 53 51 4c 49 54 45 5f 44 45 54 41 43 48 22  ="SQLITE_DETACH"
6350: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
6360: 65 20 53 51 4c 49 54 45 5f 41 4c 54 45 52 5f 54  e SQLITE_ALTER_T
6370: 41 42 4c 45 20 20 20 20 20 20 20 3a 20 7a 43 6f  ABLE       : zCo
6380: 64 65 3d 22 53 51 4c 49 54 45 5f 41 4c 54 45 52  de="SQLITE_ALTER
6390: 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a  _TABLE"; break;.
63a0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
63b0: 52 45 49 4e 44 45 58 20 20 20 20 20 20 20 20 20  REINDEX         
63c0: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
63d0: 45 5f 52 45 49 4e 44 45 58 22 3b 20 62 72 65 61  E_REINDEX"; brea
63e0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
63f0: 54 45 5f 41 4e 41 4c 59 5a 45 20 20 20 20 20 20  TE_ANALYZE      
6400: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
6410: 4c 49 54 45 5f 41 4e 41 4c 59 5a 45 22 3b 20 62  LITE_ANALYZE"; b
6420: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
6430: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 54 41  QLITE_CREATE_VTA
6440: 42 4c 45 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d  BLE     : zCode=
6450: 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56  "SQLITE_CREATE_V
6460: 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20  TABLE"; break;. 
6470: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
6480: 52 4f 50 5f 56 54 41 42 4c 45 20 20 20 20 20 20  ROP_VTABLE      
6490: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
64a0: 5f 44 52 4f 50 5f 56 54 41 42 4c 45 22 3b 20 62  _DROP_VTABLE"; b
64b0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
64c0: 51 4c 49 54 45 5f 46 55 4e 43 54 49 4f 4e 20 20  QLITE_FUNCTION  
64d0: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
64e0: 22 53 51 4c 49 54 45 5f 46 55 4e 43 54 49 4f 4e  "SQLITE_FUNCTION
64f0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65  "; break;.    de
6500: 66 61 75 6c 74 20 20 20 20 20 20 20 20 20 20 20  fault           
6510: 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43              : zC
6520: 6f 64 65 3d 22 3f 3f 3f 3f 22 3b 20 62 72 65 61  ode="????"; brea
6530: 6b 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 44 53 74  k;.  }.  Tcl_DSt
6540: 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a  ringInit(&str);.
6550: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
6560: 65 6e 64 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a  end(&str, pDb->z
6570: 41 75 74 68 2c 20 2d 31 29 3b 0a 20 20 54 63 6c  Auth, -1);.  Tcl
6580: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c  _DStringAppendEl
6590: 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 43 6f 64  ement(&str, zCod
65a0: 65 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  e);.  Tcl_DStrin
65b0: 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26  gAppendElement(&
65c0: 73 74 72 2c 20 7a 41 72 67 31 20 3f 20 7a 41 72  str, zArg1 ? zAr
65d0: 67 31 20 3a 20 22 22 29 3b 0a 20 20 54 63 6c 5f  g1 : "");.  Tcl_
65e0: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65  DStringAppendEle
65f0: 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41 72 67 32  ment(&str, zArg2
6600: 20 3f 20 7a 41 72 67 32 20 3a 20 22 22 29 3b 0a   ? zArg2 : "");.
6610: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
6620: 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c  endElement(&str,
6630: 20 7a 41 72 67 33 20 3f 20 7a 41 72 67 33 20 3a   zArg3 ? zArg3 :
6640: 20 22 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72   "");.  Tcl_DStr
6650: 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ingAppendElement
6660: 28 26 73 74 72 2c 20 7a 41 72 67 34 20 3f 20 7a  (&str, zArg4 ? z
6670: 41 72 67 34 20 3a 20 22 22 29 3b 0a 20 20 72 63  Arg4 : "");.  rc
6680: 20 3d 20 54 63 6c 5f 47 6c 6f 62 61 6c 45 76 61   = Tcl_GlobalEva
6690: 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 54  l(pDb->interp, T
66a0: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28  cl_DStringValue(
66b0: 26 73 74 72 29 29 3b 0a 20 20 54 63 6c 5f 44 53  &str));.  Tcl_DS
66c0: 74 72 69 6e 67 46 72 65 65 28 26 73 74 72 29 3b  tringFree(&str);
66d0: 0a 20 20 7a 52 65 70 6c 79 20 3d 20 54 63 6c 5f  .  zReply = Tcl_
66e0: 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
66f0: 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20  pDb->interp);.  
6700: 69 66 28 20 73 74 72 63 6d 70 28 7a 52 65 70 6c  if( strcmp(zRepl
6710: 79 2c 22 53 51 4c 49 54 45 5f 4f 4b 22 29 3d 3d  y,"SQLITE_OK")==
6720: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
6730: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
6740: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 52 65 70   if( strcmp(zRep
6750: 6c 79 2c 22 53 51 4c 49 54 45 5f 44 45 4e 59 22  ly,"SQLITE_DENY"
6760: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )==0 ){.    rc =
6770: 20 53 51 4c 49 54 45 5f 44 45 4e 59 3b 0a 20 20   SQLITE_DENY;.  
6780: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
6790: 28 7a 52 65 70 6c 79 2c 22 53 51 4c 49 54 45 5f  (zReply,"SQLITE_
67a0: 49 47 4e 4f 52 45 22 29 3d 3d 30 20 29 7b 0a 20  IGNORE")==0 ){. 
67b0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
67c0: 47 4e 4f 52 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  GNORE;.  }else{.
67d0: 20 20 20 20 72 63 20 3d 20 39 39 39 3b 0a 20 20      rc = 999;.  
67e0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
67f0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
6800: 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
6810: 54 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 7a  TION */../*.** z
6820: 54 65 78 74 20 69 73 20 61 20 70 6f 69 6e 74 65  Text is a pointe
6830: 72 20 74 6f 20 74 65 78 74 20 6f 62 74 61 69 6e  r to text obtain
6840: 65 64 20 76 69 61 20 61 6e 20 73 71 6c 69 74 65  ed via an sqlite
6850: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 29 0a  3_result_text().
6860: 2a 2a 20 6f 72 20 73 69 6d 69 6c 61 72 20 69 6e  ** or similar in
6870: 74 65 72 66 61 63 65 2e 20 54 68 69 73 20 72 6f  terface. This ro
6880: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 61 20  utine returns a 
6890: 54 63 6c 20 73 74 72 69 6e 67 20 6f 62 6a 65 63  Tcl string objec
68a0: 74 2c 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  t, .** reference
68b0: 20 63 6f 75 6e 74 20 73 65 74 20 74 6f 20 30 2c   count set to 0,
68c0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
68d0: 74 65 78 74 2e 20 49 66 20 61 20 74 72 61 6e 73  text. If a trans
68e0: 6c 61 74 69 6f 6e 0a 2a 2a 20 62 65 74 77 65 65  lation.** betwee
68f0: 6e 20 69 73 6f 38 38 35 39 20 61 6e 64 20 55 54  n iso8859 and UT
6900: 46 2d 38 20 69 73 20 72 65 71 75 69 72 65 64 2c  F-8 is required,
6910: 20 69 74 20 69 73 20 70 72 65 66 6f 72 6d 65 64   it is preformed
6920: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 63 6c 5f  ..*/.static Tcl_
6930: 4f 62 6a 20 2a 64 62 54 65 78 74 54 6f 4f 62 6a  Obj *dbTextToObj
6940: 28 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 65  (char const *zTe
6950: 78 74 29 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  xt){.  Tcl_Obj *
6960: 70 56 61 6c 3b 0a 23 69 66 64 65 66 20 55 54 46  pVal;.#ifdef UTF
6970: 5f 54 52 41 4e 53 4c 41 54 49 4f 4e 5f 4e 45 45  _TRANSLATION_NEE
6980: 44 45 44 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  DED.  Tcl_DStrin
6990: 67 20 64 43 6f 6c 3b 0a 20 20 54 63 6c 5f 44 53  g dCol;.  Tcl_DS
69a0: 74 72 69 6e 67 49 6e 69 74 28 26 64 43 6f 6c 29  tringInit(&dCol)
69b0: 3b 0a 20 20 54 63 6c 5f 45 78 74 65 72 6e 61 6c  ;.  Tcl_External
69c0: 54 6f 55 74 66 44 53 74 72 69 6e 67 28 4e 55 4c  ToUtfDString(NUL
69d0: 4c 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20 26 64  L, zText, -1, &d
69e0: 43 6f 6c 29 3b 0a 20 20 70 56 61 6c 20 3d 20 54  Col);.  pVal = T
69f0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
6a00: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65  Tcl_DStringValue
6a10: 28 26 64 43 6f 6c 29 2c 20 2d 31 29 3b 0a 20 20  (&dCol), -1);.  
6a20: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
6a30: 26 64 43 6f 6c 29 3b 0a 23 65 6c 73 65 0a 20 20  &dCol);.#else.  
6a40: 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74  pVal = Tcl_NewSt
6a50: 72 69 6e 67 4f 62 6a 28 7a 54 65 78 74 2c 20 2d  ringObj(zText, -
6a60: 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  1);.#endif.  ret
6a70: 75 72 6e 20 70 56 61 6c 3b 0a 7d 0a 0a 2f 2a 0a  urn pVal;.}../*.
6a80: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6a90: 72 65 61 64 73 20 61 20 6c 69 6e 65 20 6f 66 20  reads a line of 
6aa0: 74 65 78 74 20 66 72 6f 6d 20 46 49 4c 45 20 69  text from FILE i
6ab0: 6e 2c 20 73 74 6f 72 65 73 0a 2a 2a 20 74 68 65  n, stores.** the
6ac0: 20 74 65 78 74 20 69 6e 20 6d 65 6d 6f 72 79 20   text in memory 
6ad0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
6ae0: 6c 6c 6f 63 28 29 20 61 6e 64 20 72 65 74 75 72  lloc() and retur
6af0: 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  ns a pointer.** 
6b00: 74 6f 20 74 68 65 20 74 65 78 74 2e 20 20 4e 55  to the text.  NU
6b10: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  LL is returned a
6b20: 74 20 65 6e 64 20 6f 66 20 66 69 6c 65 2c 20 6f  t end of file, o
6b30: 72 20 69 66 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a  r if malloc().**
6b40: 20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   fails..**.** Th
6b50: 65 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 6c  e interface is l
6b60: 69 6b 65 20 22 72 65 61 64 6c 69 6e 65 22 20 62  ike "readline" b
6b70: 75 74 20 6e 6f 20 63 6f 6d 6d 61 6e 64 2d 6c 69  ut no command-li
6b80: 6e 65 20 65 64 69 74 69 6e 67 0a 2a 2a 20 69 73  ne editing.** is
6b90: 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 63 6f 70   done..**.** cop
6ba0: 69 65 64 20 66 72 6f 6d 20 73 68 65 6c 6c 2e 63  ied from shell.c
6bb0: 20 66 72 6f 6d 20 27 2e 69 6d 70 6f 72 74 27 20   from '.import' 
6bc0: 63 6f 6d 6d 61 6e 64 0a 2a 2f 0a 73 74 61 74 69  command.*/.stati
6bd0: 63 20 63 68 61 72 20 2a 6c 6f 63 61 6c 5f 67 65  c char *local_ge
6be0: 74 6c 69 6e 65 28 63 68 61 72 20 2a 7a 50 72 6f  tline(char *zPro
6bf0: 6d 70 74 2c 20 46 49 4c 45 20 2a 69 6e 29 7b 0a  mpt, FILE *in){.
6c00: 20 20 63 68 61 72 20 2a 7a 4c 69 6e 65 3b 0a 20    char *zLine;. 
6c10: 20 69 6e 74 20 6e 4c 69 6e 65 3b 0a 20 20 69 6e   int nLine;.  in
6c20: 74 20 6e 3b 0a 20 20 69 6e 74 20 65 6f 6c 3b 0a  t n;.  int eol;.
6c30: 0a 20 20 6e 4c 69 6e 65 20 3d 20 31 30 30 3b 0a  .  nLine = 100;.
6c40: 20 20 7a 4c 69 6e 65 20 3d 20 6d 61 6c 6c 6f 63    zLine = malloc
6c50: 28 20 6e 4c 69 6e 65 20 29 3b 0a 20 20 69 66 28  ( nLine );.  if(
6c60: 20 7a 4c 69 6e 65 3d 3d 30 20 29 20 72 65 74 75   zLine==0 ) retu
6c70: 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20  rn 0;.  n = 0;. 
6c80: 20 65 6f 6c 20 3d 20 30 3b 0a 20 20 77 68 69 6c   eol = 0;.  whil
6c90: 65 28 20 21 65 6f 6c 20 29 7b 0a 20 20 20 20 69  e( !eol ){.    i
6ca0: 66 28 20 6e 2b 31 30 30 3e 6e 4c 69 6e 65 20 29  f( n+100>nLine )
6cb0: 7b 0a 20 20 20 20 20 20 6e 4c 69 6e 65 20 3d 20  {.      nLine = 
6cc0: 6e 4c 69 6e 65 2a 32 20 2b 20 31 30 30 3b 0a 20  nLine*2 + 100;. 
6cd0: 20 20 20 20 20 7a 4c 69 6e 65 20 3d 20 72 65 61       zLine = rea
6ce0: 6c 6c 6f 63 28 7a 4c 69 6e 65 2c 20 6e 4c 69 6e  lloc(zLine, nLin
6cf0: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4c  e);.      if( zL
6d00: 69 6e 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ine==0 ) return 
6d10: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
6d20: 20 66 67 65 74 73 28 26 7a 4c 69 6e 65 5b 6e 5d   fgets(&zLine[n]
6d30: 2c 20 6e 4c 69 6e 65 20 2d 20 6e 2c 20 69 6e 29  , nLine - n, in)
6d40: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
6d50: 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   n==0 ){.       
6d60: 20 66 72 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20   free(zLine);.  
6d70: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
6d80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4c        }.      zL
6d90: 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20  ine[n] = 0;.    
6da0: 20 20 65 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 20    eol = 1;.     
6db0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6dc0: 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 6e    while( zLine[n
6dd0: 5d 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 20 20  ] ){ n++; }.    
6de0: 69 66 28 20 6e 3e 30 20 26 26 20 7a 4c 69 6e 65  if( n>0 && zLine
6df0: 5b 6e 2d 31 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20  [n-1]=='\n' ){. 
6e00: 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20 20       n--;.      
6e10: 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20  zLine[n] = 0;.  
6e20: 20 20 20 20 65 6f 6c 20 3d 20 31 3b 0a 20 20 20      eol = 1;.   
6e30: 20 7d 0a 20 20 7d 0a 20 20 7a 4c 69 6e 65 20 3d   }.  }.  zLine =
6e40: 20 72 65 61 6c 6c 6f 63 28 20 7a 4c 69 6e 65 2c   realloc( zLine,
6e50: 20 6e 2b 31 20 29 3b 0a 20 20 72 65 74 75 72 6e   n+1 );.  return
6e60: 20 7a 4c 69 6e 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a   zLine;.}.../*.*
6e70: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65  * Figure out the
6e80: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f   column names fo
6e90: 72 20 74 68 65 20 64 61 74 61 20 72 65 74 75 72  r the data retur
6ea0: 6e 65 64 20 62 79 20 74 68 65 20 73 74 61 74 65  ned by the state
6eb0: 6d 65 6e 74 0a 2a 2a 20 70 61 73 73 65 64 20 61  ment.** passed a
6ec0: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
6ed0: 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ument..**.** If 
6ee0: 70 61 72 61 6d 65 74 65 72 20 70 61 70 43 6f 6c  parameter papCol
6ef0: 4e 61 6d 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Name is not NULL
6f00: 2c 20 74 68 65 6e 20 2a 70 61 70 43 6f 6c 4e 61  , then *papColNa
6f10: 6d 65 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  me is set to poi
6f20: 6e 74 0a 2a 2a 20 61 74 20 61 6e 20 61 72 72 61  nt.** at an arra
6f30: 79 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e  y allocated usin
6f40: 67 20 54 63 6c 5f 41 6c 6c 6f 63 28 29 2e 20 49  g Tcl_Alloc(). I
6f50: 74 20 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73  t is the callers
6f60: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a   responsibility.
6f70: 2a 2a 20 74 6f 20 66 72 65 65 20 74 68 69 73 20  ** to free this 
6f80: 61 72 72 61 79 20 75 73 69 6e 67 20 54 63 6c 5f  array using Tcl_
6f90: 46 72 65 65 28 29 2c 20 61 6e 64 20 74 6f 20 64  Free(), and to d
6fa0: 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ecrement the ref
6fb0: 65 72 65 6e 63 65 0a 2a 2a 20 63 6f 75 6e 74 20  erence.** count 
6fc0: 6f 66 20 65 61 63 68 20 54 63 6c 5f 4f 62 6a 2a  of each Tcl_Obj*
6fd0: 20 6d 65 6d 62 65 72 20 6f 66 20 74 68 65 20 61   member of the a
6fe0: 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rray..**.** The 
6ff0: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
7000: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
7010: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
7020: 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 0a 2a  olumns of data.*
7030: 2a 20 72 65 74 75 72 6e 65 64 20 62 79 20 70 53  * returned by pS
7040: 74 6d 74 20 28 61 6e 64 20 68 65 6e 63 65 20 74  tmt (and hence t
7050: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 2a  he size of the *
7060: 70 61 70 43 6f 6c 4e 61 6d 65 20 61 72 72 61 79  papColName array
7070: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 41 72 72  )..**.** If pArr
7080: 61 79 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  ay is not NULL, 
7090: 74 68 65 6e 20 69 74 20 63 6f 6e 74 61 69 6e 73  then it contains
70a0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 54   the name of a T
70b0: 63 6c 20 61 72 72 61 79 0a 2a 2a 20 76 61 72 69  cl array.** vari
70c0: 61 62 6c 65 2e 20 54 68 65 20 22 2a 22 20 6d 65  able. The "*" me
70d0: 6d 62 65 72 20 6f 66 20 74 68 69 73 20 61 72 72  mber of this arr
70e0: 61 79 20 69 73 20 73 65 74 20 74 6f 20 61 20 6c  ay is set to a l
70f0: 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a  ist containing.*
7100: 2a 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74  * the names of t
7110: 68 65 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72  he columns retur
7120: 6e 65 64 20 62 79 20 74 68 65 20 73 74 61 74 65  ned by the state
7130: 6d 65 6e 74 2c 20 69 6e 20 6f 72 64 65 72 20 66  ment, in order f
7140: 72 6f 6d 0a 2a 2a 20 6c 65 66 74 20 74 6f 20 72  rom.** left to r
7150: 69 67 68 74 2e 20 65 2e 67 2e 20 69 66 20 74 68  ight. e.g. if th
7160: 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 72  e names of the r
7170: 65 74 75 72 6e 65 64 20 63 6f 6c 75 6d 6e 73 20  eturned columns 
7180: 61 72 65 20 61 2c 20 62 20 61 6e 64 0a 2a 2a 20  are a, b and.** 
7190: 63 2c 20 69 74 20 64 6f 65 73 20 74 68 65 20 65  c, it does the e
71a0: 71 75 69 76 61 6c 65 6e 74 20 6f 66 20 74 68 65  quivalent of the
71b0: 20 74 63 6c 20 63 6f 6d 6d 61 6e 64 3a 0a 2a 2a   tcl command:.**
71c0: 0a 2a 2a 20 20 20 20 20 73 65 74 20 24 7b 70 41  .**     set ${pA
71d0: 72 72 61 79 7d 28 2a 29 20 7b 61 20 62 20 63 7d  rray}(*) {a b c}
71e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 63  .*/.static int.c
71f0: 6f 6d 70 75 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  omputeColumnName
7200: 73 28 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  s(.  Tcl_Interp 
7210: 2a 69 6e 74 65 72 70 2c 20 0a 20 20 73 71 6c 69  *interp, .  sqli
7220: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 2c  te3_stmt *pStmt,
7230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7240: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a   SQL statement *
7250: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 2a 70  /.  Tcl_Obj ***p
7260: 61 70 43 6f 6c 4e 61 6d 65 2c 20 20 20 20 20 20  apColName,      
7270: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 72        /* OUT: Ar
7280: 72 61 79 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61  ray of column na
7290: 6d 65 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  mes */.  Tcl_Obj
72a0: 20 2a 70 41 72 72 61 79 20 20 20 20 20 20 20 20   *pArray        
72b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
72c0: 6d 65 20 6f 66 20 61 72 72 61 79 20 76 61 72 69  me of array vari
72d0: 61 62 6c 65 20 28 6d 61 79 20 62 65 20 6e 75 6c  able (may be nul
72e0: 6c 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  l) */.){.  int n
72f0: 43 6f 6c 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  Col;..  /* Compu
7300: 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  te column names 
7310: 2a 2f 0a 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69  */.  nCol = sqli
7320: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  te3_column_count
7330: 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 70  (pStmt);.  if( p
7340: 61 70 43 6f 6c 4e 61 6d 65 20 29 7b 0a 20 20 20  apColName ){.   
7350: 20 69 6e 74 20 69 3b 0a 20 20 20 20 54 63 6c 5f   int i;.    Tcl_
7360: 4f 62 6a 20 2a 2a 61 70 43 6f 6c 4e 61 6d 65 20  Obj **apColName 
7370: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 2a 29 54 63 6c  = (Tcl_Obj**)Tcl
7380: 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54  _Alloc( sizeof(T
7390: 63 6c 5f 4f 62 6a 2a 29 2a 6e 43 6f 6c 20 29 3b  cl_Obj*)*nCol );
73a0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
73b0: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
73c0: 20 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 20 3d    apColName[i] =
73d0: 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c   dbTextToObj(sql
73e0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65  ite3_column_name
73f0: 28 70 53 74 6d 74 2c 69 29 29 3b 0a 20 20 20 20  (pStmt,i));.    
7400: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
7410: 6e 74 28 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29  nt(apColName[i])
7420: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
7430: 49 66 20 72 65 73 75 6c 74 73 20 61 72 65 20 62  If results are b
7440: 65 69 6e 67 20 73 74 6f 72 65 64 20 69 6e 20 61  eing stored in a
7450: 6e 20 61 72 72 61 79 20 76 61 72 69 61 62 6c 65  n array variable
7460: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 0a 20 20  , then create.  
7470: 20 20 2a 2a 20 74 68 65 20 61 72 72 61 79 28 2a    ** the array(*
7480: 29 20 65 6e 74 72 79 20 66 6f 72 20 74 68 61 74  ) entry for that
7490: 20 61 72 72 61 79 0a 20 20 20 20 2a 2f 0a 20 20   array.    */.  
74a0: 20 20 69 66 28 20 70 41 72 72 61 79 20 29 7b 0a    if( pArray ){.
74b0: 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70        Tcl_Obj *p
74c0: 43 6f 6c 4c 69 73 74 20 3d 20 54 63 6c 5f 4e 65  ColList = Tcl_Ne
74d0: 77 4f 62 6a 28 29 3b 0a 20 20 20 20 20 20 54 63  wObj();.      Tc
74e0: 6c 5f 4f 62 6a 20 2a 70 53 74 61 72 20 3d 20 54  l_Obj *pStar = T
74f0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
7500: 22 2a 22 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  "*", -1);.      
7510: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
7520: 28 70 43 6f 6c 4c 69 73 74 29 3b 0a 20 20 20 20  (pColList);.    
7530: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
7540: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
7550: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
7560: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
7570: 2c 20 70 43 6f 6c 4c 69 73 74 2c 20 61 70 43 6f  , pColList, apCo
7580: 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 20  lName[i]);.     
7590: 20 7d 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63   }.      Tcl_Inc
75a0: 72 52 65 66 43 6f 75 6e 74 28 70 53 74 61 72 29  rRefCount(pStar)
75b0: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53  ;.      Tcl_ObjS
75c0: 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 70  etVar2(interp, p
75d0: 41 72 72 61 79 2c 20 70 53 74 61 72 2c 20 70 43  Array, pStar, pC
75e0: 6f 6c 4c 69 73 74 2c 30 29 3b 0a 20 20 20 20 20  olList,0);.     
75f0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
7600: 74 28 70 43 6f 6c 4c 69 73 74 29 3b 0a 20 20 20  t(pColList);.   
7610: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
7620: 75 6e 74 28 70 53 74 61 72 29 3b 0a 20 20 20 20  unt(pStar);.    
7630: 7d 0a 20 20 20 20 2a 70 61 70 43 6f 6c 4e 61 6d  }.    *papColNam
7640: 65 20 3d 20 61 70 43 6f 6c 4e 61 6d 65 3b 0a 20  e = apColName;. 
7650: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 43 6f   }..  return nCo
7660: 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  l;.}../*.** The 
7670: 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d 61 6e 64  "sqlite" command
7680: 20 62 65 6c 6f 77 20 63 72 65 61 74 65 73 20 61   below creates a
7690: 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d 61 6e 64   new Tcl command
76a0: 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6e   for each.** con
76b0: 6e 65 63 74 69 6f 6e 20 69 74 20 6f 70 65 6e 73  nection it opens
76c0: 20 74 6f 20 61 6e 20 53 51 4c 69 74 65 20 64 61   to an SQLite da
76d0: 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f  tabase.  This ro
76e0: 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64  utine is invoked
76f0: 0a 2a 2a 20 77 68 65 6e 65 76 65 72 20 6f 6e 65  .** whenever one
7700: 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63   of those connec
7710: 74 69 6f 6e 2d 73 70 65 63 69 66 69 63 20 63 6f  tion-specific co
7720: 6d 6d 61 6e 64 73 20 69 73 20 65 78 65 63 75 74  mmands is execut
7730: 65 64 0a 2a 2a 20 69 6e 20 54 63 6c 2e 20 20 46  ed.** in Tcl.  F
7740: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 79  or example, if y
7750: 6f 75 20 72 75 6e 20 54 63 6c 20 63 6f 64 65 20  ou run Tcl code 
7760: 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
7770: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 64         sqlite3 d
7780: 62 31 20 20 22 6d 79 5f 64 61 74 61 62 61 73 65  b1  "my_database
7790: 22 0a 2a 2a 20 20 20 20 20 20 20 64 62 31 20 63  ".**       db1 c
77a0: 6c 6f 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  lose.**.** The f
77b0: 69 72 73 74 20 63 6f 6d 6d 61 6e 64 20 6f 70 65  irst command ope
77c0: 6e 73 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ns a connection 
77d0: 74 6f 20 74 68 65 20 22 6d 79 5f 64 61 74 61 62  to the "my_datab
77e0: 61 73 65 22 20 64 61 74 61 62 61 73 65 0a 2a 2a  ase" database.**
77f0: 20 61 6e 64 20 63 61 6c 6c 73 20 74 68 61 74 20   and calls that 
7800: 63 6f 6e 6e 65 63 74 69 6f 6e 20 22 64 62 31 22  connection "db1"
7810: 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20 63 6f  .  The second co
7820: 6d 6d 61 6e 64 20 63 61 75 73 65 73 20 74 68 69  mmand causes thi
7830: 73 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 20  s.** subroutine 
7840: 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 2e 0a 2a  to be invoked..*
7850: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 4f  /.static int DbO
7860: 62 6a 43 6d 64 28 76 6f 69 64 20 2a 63 64 2c 20  bjCmd(void *cd, 
7870: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
7880: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 54 63 6c  rp, int objc,Tcl
7890: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76  _Obj *const*objv
78a0: 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  ){.  SqliteDb *p
78b0: 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29  Db = (SqliteDb*)
78c0: 63 64 3b 0a 20 20 69 6e 74 20 63 68 6f 69 63 65  cd;.  int choice
78d0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 54 43 4c  ;.  int rc = TCL
78e0: 5f 4f 4b 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  _OK;.  static co
78f0: 6e 73 74 20 63 68 61 72 20 2a 44 42 5f 73 74 72  nst char *DB_str
7900: 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 61 75 74  s[] = {.    "aut
7910: 68 6f 72 69 7a 65 72 22 2c 20 20 20 20 20 20 20  horizer",       
7920: 20 20 22 62 75 73 79 22 2c 20 20 20 20 20 20 20    "busy",       
7930: 20 20 20 20 20 20 20 22 63 61 63 68 65 22 2c 0a         "cache",.
7940: 20 20 20 20 22 63 68 61 6e 67 65 73 22 2c 20 20      "changes",  
7950: 20 20 20 20 20 20 20 20 20 20 22 63 6c 6f 73 65            "close
7960: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ",             "
7970: 63 6f 6c 6c 61 74 65 22 2c 0a 20 20 20 20 22 63  collate",.    "c
7980: 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 22  ollation_needed"
7990: 2c 20 20 20 22 63 6f 6d 6d 69 74 5f 68 6f 6f 6b  ,   "commit_hook
79a0: 22 2c 20 20 20 20 20 20 20 22 63 6f 6d 70 6c 65  ",       "comple
79b0: 74 65 22 2c 0a 20 20 20 20 22 63 6f 70 79 22 2c  te",.    "copy",
79c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
79d0: 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65  enable_load_exte
79e0: 6e 73 69 6f 6e 22 2c 22 65 72 72 6f 72 63 6f 64  nsion","errorcod
79f0: 65 22 2c 0a 20 20 20 20 22 65 76 61 6c 22 2c 20  e",.    "eval", 
7a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 65                "e
7a10: 78 69 73 74 73 22 2c 20 20 20 20 20 20 20 20 20  xists",         
7a20: 20 20 20 22 66 75 6e 63 74 69 6f 6e 22 2c 0a 20     "function",. 
7a30: 20 20 20 22 69 6e 63 72 62 6c 6f 62 22 2c 20 20     "incrblob",  
7a40: 20 20 20 20 20 20 20 20 20 22 69 6e 74 65 72 72           "interr
7a50: 75 70 74 22 2c 20 20 20 20 20 20 20 20 20 22 6c  upt",         "l
7a60: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
7a70: 22 2c 0a 20 20 20 20 22 6e 75 6c 6c 76 61 6c 75  ",.    "nullvalu
7a80: 65 22 2c 20 20 20 20 20 20 20 20 20 20 22 6f 6e  e",          "on
7a90: 65 63 6f 6c 75 6d 6e 22 2c 20 20 20 20 20 20 20  ecolumn",       
7aa0: 20 20 22 70 72 6f 66 69 6c 65 22 2c 0a 20 20 20    "profile",.   
7ab0: 20 22 70 72 6f 67 72 65 73 73 22 2c 20 20 20 20   "progress",    
7ac0: 20 20 20 20 20 20 20 22 72 65 6b 65 79 22 2c 20         "rekey", 
7ad0: 20 20 20 20 20 20 20 20 20 20 20 20 22 72 6f 6c              "rol
7ae0: 6c 62 61 63 6b 5f 68 6f 6f 6b 22 2c 0a 20 20 20  lback_hook",.   
7af0: 20 22 73 74 61 74 75 73 22 2c 20 20 20 20 20 20   "status",      
7b00: 20 20 20 20 20 20 20 22 74 69 6d 65 6f 75 74 22         "timeout"
7b10: 2c 20 20 20 20 20 20 20 20 20 20 20 22 74 6f 74  ,           "tot
7b20: 61 6c 5f 63 68 61 6e 67 65 73 22 2c 0a 20 20 20  al_changes",.   
7b30: 20 22 74 72 61 63 65 22 2c 20 20 20 20 20 20 20   "trace",       
7b40: 20 20 20 20 20 20 20 22 74 72 61 6e 73 61 63 74         "transact
7b50: 69 6f 6e 22 2c 20 20 20 20 20 20 20 22 75 70 64  ion",       "upd
7b60: 61 74 65 5f 68 6f 6f 6b 22 2c 0a 20 20 20 20 22  ate_hook",.    "
7b70: 76 65 72 73 69 6f 6e 22 2c 20 20 20 20 20 20 20  version",       
7b80: 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
7b90: 20 20 20 20 20 20 20 20 20 20 0a 20 20 7d 3b 0a            .  };.
7ba0: 20 20 65 6e 75 6d 20 44 42 5f 65 6e 75 6d 20 7b    enum DB_enum {
7bb0: 0a 20 20 20 20 44 42 5f 41 55 54 48 4f 52 49 5a  .    DB_AUTHORIZ
7bc0: 45 52 2c 20 20 20 20 20 20 20 20 44 42 5f 42 55  ER,        DB_BU
7bd0: 53 59 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  SY,             
7be0: 44 42 5f 43 41 43 48 45 2c 0a 20 20 20 20 44 42  DB_CACHE,.    DB
7bf0: 5f 43 48 41 4e 47 45 53 2c 20 20 20 20 20 20 20  _CHANGES,       
7c00: 20 20 20 20 44 42 5f 43 4c 4f 53 45 2c 20 20 20      DB_CLOSE,   
7c10: 20 20 20 20 20 20 20 20 20 44 42 5f 43 4f 4c 4c           DB_COLL
7c20: 41 54 45 2c 0a 20 20 20 20 44 42 5f 43 4f 4c 4c  ATE,.    DB_COLL
7c30: 41 54 49 4f 4e 5f 4e 45 45 44 45 44 2c 20 20 44  ATION_NEEDED,  D
7c40: 42 5f 43 4f 4d 4d 49 54 5f 48 4f 4f 4b 2c 20 20  B_COMMIT_HOOK,  
7c50: 20 20 20 20 44 42 5f 43 4f 4d 50 4c 45 54 45 2c      DB_COMPLETE,
7c60: 0a 20 20 20 20 44 42 5f 43 4f 50 59 2c 20 20 20  .    DB_COPY,   
7c70: 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 45 4e             DB_EN
7c80: 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  ABLE_LOAD_EXTENS
7c90: 49 4f 4e 2c 44 42 5f 45 52 52 4f 52 43 4f 44 45  ION,DB_ERRORCODE
7ca0: 2c 0a 20 20 20 20 44 42 5f 45 56 41 4c 2c 20 20  ,.    DB_EVAL,  
7cb0: 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 45              DB_E
7cc0: 58 49 53 54 53 2c 20 20 20 20 20 20 20 20 20 20  XISTS,          
7cd0: 20 44 42 5f 46 55 4e 43 54 49 4f 4e 2c 0a 20 20   DB_FUNCTION,.  
7ce0: 20 20 44 42 5f 49 4e 43 52 42 4c 4f 42 2c 20 20    DB_INCRBLOB,  
7cf0: 20 20 20 20 20 20 20 20 44 42 5f 49 4e 54 45 52          DB_INTER
7d00: 52 55 50 54 2c 20 20 20 20 20 20 20 20 44 42 5f  RUPT,        DB_
7d10: 4c 41 53 54 5f 49 4e 53 45 52 54 5f 52 4f 57 49  LAST_INSERT_ROWI
7d20: 44 2c 0a 20 20 20 20 44 42 5f 4e 55 4c 4c 56 41  D,.    DB_NULLVA
7d30: 4c 55 45 2c 20 20 20 20 20 20 20 20 20 44 42 5f  LUE,         DB_
7d40: 4f 4e 45 43 4f 4c 55 4d 4e 2c 20 20 20 20 20 20  ONECOLUMN,      
7d50: 20 20 44 42 5f 50 52 4f 46 49 4c 45 2c 0a 20 20    DB_PROFILE,.  
7d60: 20 20 44 42 5f 50 52 4f 47 52 45 53 53 2c 20 20    DB_PROGRESS,  
7d70: 20 20 20 20 20 20 20 20 44 42 5f 52 45 4b 45 59          DB_REKEY
7d80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f  ,            DB_
7d90: 52 4f 4c 4c 42 41 43 4b 5f 48 4f 4f 4b 2c 0a 20  ROLLBACK_HOOK,. 
7da0: 20 20 20 44 42 5f 53 54 41 54 55 53 2c 20 20 20     DB_STATUS,   
7db0: 20 20 20 20 20 20 20 20 20 44 42 5f 54 49 4d 45           DB_TIME
7dc0: 4f 55 54 2c 20 20 20 20 20 20 20 20 20 20 44 42  OUT,          DB
7dd0: 5f 54 4f 54 41 4c 5f 43 48 41 4e 47 45 53 2c 0a  _TOTAL_CHANGES,.
7de0: 20 20 20 20 44 42 5f 54 52 41 43 45 2c 20 20 20      DB_TRACE,   
7df0: 20 20 20 20 20 20 20 20 20 20 44 42 5f 54 52 41            DB_TRA
7e00: 4e 53 41 43 54 49 4f 4e 2c 20 20 20 20 20 20 44  NSACTION,      D
7e10: 42 5f 55 50 44 41 54 45 5f 48 4f 4f 4b 2c 20 0a  B_UPDATE_HOOK, .
7e20: 20 20 20 20 44 42 5f 56 45 52 53 49 4f 4e 0a 20      DB_VERSION. 
7e30: 20 7d 3b 0a 20 20 2f 2a 20 64 6f 6e 27 74 20 6c   };.  /* don't l
7e40: 65 61 76 65 20 74 72 61 69 6c 69 6e 67 20 63 6f  eave trailing co
7e50: 6d 6d 61 73 20 6f 6e 20 44 42 5f 65 6e 75 6d 2c  mmas on DB_enum,
7e60: 20 69 74 20 63 6f 6e 66 75 73 65 73 20 74 68 65   it confuses the
7e70: 20 41 49 58 20 78 6c 63 20 63 6f 6d 70 69 6c 65   AIX xlc compile
7e80: 72 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63  r */..  if( objc
7e90: 3c 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  <2 ){.    Tcl_Wr
7ea0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
7eb0: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 55 42  p, 1, objv, "SUB
7ec0: 43 4f 4d 4d 41 4e 44 20 2e 2e 2e 22 29 3b 0a 20  COMMAND ...");. 
7ed0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
7ee0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54  ROR;.  }.  if( T
7ef0: 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f  cl_GetIndexFromO
7f00: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
7f10: 31 5d 2c 20 44 42 5f 73 74 72 73 2c 20 22 6f 70  1], DB_strs, "op
7f20: 74 69 6f 6e 22 2c 20 30 2c 20 26 63 68 6f 69 63  tion", 0, &choic
7f30: 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
7f40: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
7f50: 0a 20 20 73 77 69 74 63 68 28 20 28 65 6e 75 6d  .  switch( (enum
7f60: 20 44 42 5f 65 6e 75 6d 29 63 68 6f 69 63 65 20   DB_enum)choice 
7f70: 29 7b 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20  ){..  /*    $db 
7f80: 61 75 74 68 6f 72 69 7a 65 72 20 3f 43 41 4c 4c  authorizer ?CALL
7f90: 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20  BACK?.  **.  ** 
7fa0: 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e  Invoke the given
7fb0: 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61 75 74   callback to aut
7fc0: 68 6f 72 69 7a 65 20 65 61 63 68 20 53 51 4c 20  horize each SQL 
7fd0: 6f 70 65 72 61 74 69 6f 6e 20 61 73 20 69 74 20  operation as it 
7fe0: 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64  is.  ** compiled
7ff0: 2e 20 20 35 20 61 72 67 75 6d 65 6e 74 73 20 61  .  5 arguments a
8000: 72 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  re appended to t
8010: 68 65 20 63 61 6c 6c 62 61 63 6b 20 62 65 66 6f  he callback befo
8020: 72 65 20 69 74 20 69 73 0a 20 20 2a 2a 20 69 6e  re it is.  ** in
8030: 76 6f 6b 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  voked:.  **.  **
8040: 20 20 20 28 31 29 20 54 68 65 20 61 75 74 68 6f     (1) The autho
8050: 72 69 7a 61 74 69 6f 6e 20 74 79 70 65 20 28 65  rization type (e
8060: 78 3a 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45  x: SQLITE_CREATE
8070: 5f 54 41 42 4c 45 2c 20 53 51 4c 49 54 45 5f 49  _TABLE, SQLITE_I
8080: 4e 53 45 52 54 2c 20 2e 2e 2e 29 0a 20 20 2a 2a  NSERT, ...).  **
8090: 20 20 20 28 32 29 20 46 69 72 73 74 20 64 65 73     (2) First des
80a0: 63 72 69 70 74 69 76 65 20 6e 61 6d 65 20 28 64  criptive name (d
80b0: 65 70 65 6e 64 73 20 6f 6e 20 61 75 74 68 6f 72  epends on author
80c0: 69 7a 61 74 69 6f 6e 20 74 79 70 65 29 0a 20 20  ization type).  
80d0: 2a 2a 20 20 20 28 33 29 20 53 65 63 6f 6e 64 20  **   (3) Second 
80e0: 64 65 73 63 72 69 70 74 69 76 65 20 6e 61 6d 65  descriptive name
80f0: 0a 20 20 2a 2a 20 20 20 28 34 29 20 4e 61 6d 65  .  **   (4) Name
8100: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
8110: 20 28 65 78 3a 20 22 6d 61 69 6e 22 2c 20 22 74   (ex: "main", "t
8120: 65 6d 70 22 29 0a 20 20 2a 2a 20 20 20 28 35 29  emp").  **   (5)
8130: 20 4e 61 6d 65 20 6f 66 20 74 72 69 67 67 65 72   Name of trigger
8140: 20 74 68 61 74 20 69 73 20 64 6f 69 6e 67 20 74   that is doing t
8150: 68 65 20 61 63 63 65 73 73 0a 20 20 2a 2a 0a 20  he access.  **. 
8160: 20 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61 63 6b   ** The callback
8170: 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 6f   should return o
8180: 6e 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  n of the followi
8190: 6e 67 20 73 74 72 69 6e 67 73 3a 20 53 51 4c 49  ng strings: SQLI
81a0: 54 45 5f 4f 4b 2c 0a 20 20 2a 2a 20 53 51 4c 49  TE_OK,.  ** SQLI
81b0: 54 45 5f 49 47 4e 4f 52 45 2c 20 6f 72 20 53 51  TE_IGNORE, or SQ
81c0: 4c 49 54 45 5f 44 45 4e 59 2e 20 20 41 6e 79 20  LITE_DENY.  Any 
81d0: 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c  other return val
81e0: 75 65 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 0a  ue is an error..
81f0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69    **.  ** If thi
8200: 73 20 6d 65 74 68 6f 64 20 69 73 20 69 6e 76 6f  s method is invo
8210: 6b 65 64 20 77 69 74 68 20 6e 6f 20 61 72 67 75  ked with no argu
8220: 6d 65 6e 74 73 2c 20 74 68 65 20 63 75 72 72 65  ments, the curre
8230: 6e 74 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  nt authorization
8240: 0a 20 20 2a 2a 20 63 61 6c 6c 62 61 63 6b 20 73  .  ** callback s
8250: 74 72 69 6e 67 20 69 73 20 72 65 74 75 72 6e 65  tring is returne
8260: 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  d..  */.  case D
8270: 42 5f 41 55 54 48 4f 52 49 5a 45 52 3a 20 7b 0a  B_AUTHORIZER: {.
8280: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
8290: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
82a0: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
82b0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 61  esult(interp, "a
82c0: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 6e 6f 74  uthorization not
82d0: 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68   available in th
82e0: 69 73 20 62 75 69 6c 64 22 2c 20 30 29 3b 0a 20  is build", 0);. 
82f0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
8300: 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69  ROR;.#else.    i
8310: 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20  f( objc>3 ){.   
8320: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
8330: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
8340: 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f  bjv, "?CALLBACK?
8350: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
8360: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
8370: 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d  }else if( objc==
8380: 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  2 ){.      if( p
8390: 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20  Db->zAuth ){.   
83a0: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
83b0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44  esult(interp, pD
83c0: 62 2d 3e 7a 41 75 74 68 2c 20 30 29 3b 0a 20 20  b->zAuth, 0);.  
83d0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
83e0: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 41 75  .      char *zAu
83f0: 74 68 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65  th;.      int le
8400: 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  n;.      if( pDb
8410: 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 20  ->zAuth ){.     
8420: 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d     Tcl_Free(pDb-
8430: 3e 7a 41 75 74 68 29 3b 0a 20 20 20 20 20 20 7d  >zAuth);.      }
8440: 0a 20 20 20 20 20 20 7a 41 75 74 68 20 3d 20 54  .      zAuth = T
8450: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
8460: 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65  Obj(objv[2], &le
8470: 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41  n);.      if( zA
8480: 75 74 68 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a  uth && len>0 ){.
8490: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 41 75          pDb->zAu
84a0: 74 68 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20  th = Tcl_Alloc( 
84b0: 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20  len + 1 );.     
84c0: 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a     memcpy(pDb->z
84d0: 41 75 74 68 2c 20 7a 41 75 74 68 2c 20 6c 65 6e  Auth, zAuth, len
84e0: 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  +1);.      }else
84f0: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
8500: 41 75 74 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  Auth = 0;.      
8510: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  }.      if( pDb-
8520: 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 20 20  >zAuth ){.      
8530: 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20    pDb->interp = 
8540: 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20  interp;.        
8550: 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68  sqlite3_set_auth
8560: 6f 72 69 7a 65 72 28 70 44 62 2d 3e 64 62 2c 20  orizer(pDb->db, 
8570: 61 75 74 68 5f 63 61 6c 6c 62 61 63 6b 2c 20 70  auth_callback, p
8580: 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Db);.      }else
8590: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
85a0: 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72  3_set_authorizer
85b0: 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b  (pDb->db, 0, 0);
85c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
85d0: 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b  endif.    break;
85e0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
85f0: 62 20 62 75 73 79 20 3f 43 41 4c 4c 42 41 43 4b  b busy ?CALLBACK
8600: 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f  ?.  **.  ** Invo
8610: 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c  ke the given cal
8620: 6c 62 61 63 6b 20 69 66 20 61 6e 20 53 51 4c 20  lback if an SQL 
8630: 73 74 61 74 65 6d 65 6e 74 20 61 74 74 65 6d 70  statement attemp
8640: 74 73 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20  ts to open.  ** 
8650: 61 20 6c 6f 63 6b 65 64 20 64 61 74 61 62 61 73  a locked databas
8660: 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 63  e file..  */.  c
8670: 61 73 65 20 44 42 5f 42 55 53 59 3a 20 7b 0a 20  ase DB_BUSY: {. 
8680: 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b     if( objc>3 ){
8690: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
86a0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
86b0: 32 2c 20 6f 62 6a 76 2c 20 22 43 41 4c 4c 42 41  2, objv, "CALLBA
86c0: 43 4b 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  CK");.      retu
86d0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
86e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63    }else if( objc
86f0: 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==2 ){.      if(
8700: 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20   pDb->zBusy ){. 
8710: 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
8720: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
8730: 70 44 62 2d 3e 7a 42 75 73 79 2c 20 30 29 3b 0a  pDb->zBusy, 0);.
8740: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
8750: 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  e{.      char *z
8760: 42 75 73 79 3b 0a 20 20 20 20 20 20 69 6e 74 20  Busy;.      int 
8770: 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70  len;.      if( p
8780: 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20  Db->zBusy ){.   
8790: 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44       Tcl_Free(pD
87a0: 62 2d 3e 7a 42 75 73 79 29 3b 0a 20 20 20 20 20  b->zBusy);.     
87b0: 20 7d 0a 20 20 20 20 20 20 7a 42 75 73 79 20 3d   }.      zBusy =
87c0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
87d0: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26  omObj(objv[2], &
87e0: 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  len);.      if( 
87f0: 7a 42 75 73 79 20 26 26 20 6c 65 6e 3e 30 20 29  zBusy && len>0 )
8800: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
8810: 42 75 73 79 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63  Busy = Tcl_Alloc
8820: 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20  ( len + 1 );.   
8830: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d       memcpy(pDb-
8840: 3e 7a 42 75 73 79 2c 20 7a 42 75 73 79 2c 20 6c  >zBusy, zBusy, l
8850: 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  en+1);.      }el
8860: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  se{.        pDb-
8870: 3e 7a 42 75 73 79 20 3d 20 30 3b 0a 20 20 20 20  >zBusy = 0;.    
8880: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44    }.      if( pD
8890: 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20  b->zBusy ){.    
88a0: 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20      pDb->interp 
88b0: 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20  = interp;.      
88c0: 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68    sqlite3_busy_h
88d0: 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20  andler(pDb->db, 
88e0: 44 62 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70  DbBusyHandler, p
88f0: 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Db);.      }else
8900: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8910: 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 70  3_busy_handler(p
8920: 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20  Db->db, 0, 0);. 
8930: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
8940: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
8950: 2a 20 20 20 20 20 24 64 62 20 63 61 63 68 65 20  *     $db cache 
8960: 66 6c 75 73 68 0a 20 20 2a 2a 20 20 20 20 20 24  flush.  **     $
8970: 64 62 20 63 61 63 68 65 20 73 69 7a 65 20 6e 0a  db cache size n.
8980: 20 20 2a 2a 0a 20 20 2a 2a 20 46 6c 75 73 68 20    **.  ** Flush 
8990: 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
89a0: 74 65 6d 65 6e 74 20 63 61 63 68 65 2c 20 6f 72  tement cache, or
89b0: 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d   set the maximum
89c0: 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20   number of.  ** 
89d0: 63 61 63 68 65 64 20 73 74 61 74 65 6d 65 6e 74  cached statement
89e0: 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  s..  */.  case D
89f0: 42 5f 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 63  B_CACHE: {.    c
8a00: 68 61 72 20 2a 73 75 62 43 6d 64 3b 0a 20 20 20  har *subCmd;.   
8a10: 20 69 6e 74 20 6e 3b 0a 0a 20 20 20 20 69 66 28   int n;..    if(
8a20: 20 6f 62 6a 63 3c 3d 32 20 29 7b 0a 20 20 20 20   objc<=2 ){.    
8a30: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
8a40: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
8a50: 6a 76 2c 20 22 63 61 63 68 65 20 6f 70 74 69 6f  jv, "cache optio
8a60: 6e 20 3f 61 72 67 3f 22 29 3b 0a 20 20 20 20 20  n ?arg?");.     
8a70: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
8a80: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 75 62  R;.    }.    sub
8a90: 43 6d 64 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Cmd = Tcl_GetStr
8aa0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 20 6f 62 6a 76  ingFromObj( objv
8ab0: 5b 32 5d 2c 20 30 20 29 3b 0a 20 20 20 20 69 66  [2], 0 );.    if
8ac0: 28 20 2a 73 75 62 43 6d 64 3d 3d 27 66 27 20 26  ( *subCmd=='f' &
8ad0: 26 20 73 74 72 63 6d 70 28 73 75 62 43 6d 64 2c  & strcmp(subCmd,
8ae0: 22 66 6c 75 73 68 22 29 3d 3d 30 20 29 7b 0a 20  "flush")==0 ){. 
8af0: 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33       if( objc!=3
8b00: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
8b10: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
8b20: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 66  erp, 2, objv, "f
8b30: 6c 75 73 68 22 29 3b 0a 20 20 20 20 20 20 20 20  lush");.        
8b40: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
8b50: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
8b60: 20 20 20 20 20 20 20 66 6c 75 73 68 53 74 6d 74         flushStmt
8b70: 43 61 63 68 65 28 20 70 44 62 20 29 3b 0a 20 20  Cache( pDb );.  
8b80: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
8b90: 69 66 28 20 2a 73 75 62 43 6d 64 3d 3d 27 73 27  if( *subCmd=='s'
8ba0: 20 26 26 20 73 74 72 63 6d 70 28 73 75 62 43 6d   && strcmp(subCm
8bb0: 64 2c 22 73 69 7a 65 22 29 3d 3d 30 20 29 7b 0a  d,"size")==0 ){.
8bc0: 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d        if( objc!=
8bd0: 34 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  4 ){.        Tcl
8be0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
8bf0: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
8c00: 73 69 7a 65 20 6e 22 29 3b 0a 20 20 20 20 20 20  size n");.      
8c10: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
8c20: 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  OR;.      }else{
8c30: 0a 20 20 20 20 20 20 20 20 69 66 28 20 54 43 4c  .        if( TCL
8c40: 5f 45 52 52 4f 52 3d 3d 54 63 6c 5f 47 65 74 49  _ERROR==Tcl_GetI
8c50: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
8c60: 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 29 20 29  , objv[3], &n) )
8c70: 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  {.          Tcl_
8c80: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 20 69 6e  AppendResult( in
8c90: 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74 20 63 6f  terp, "cannot co
8ca0: 6e 76 65 72 74 20 5c 22 22 2c 20 0a 20 20 20 20  nvert \"", .    
8cb0: 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47             Tcl_G
8cc0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
8cd0: 6f 62 6a 76 5b 33 5d 2c 30 29 2c 20 22 5c 22 20  objv[3],0), "\" 
8ce0: 74 6f 20 69 6e 74 65 67 65 72 22 2c 20 30 29 3b  to integer", 0);
8cf0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
8d00: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
8d10: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8d20: 20 20 20 20 20 20 69 66 28 20 6e 3c 30 20 29 7b        if( n<0 ){
8d30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6c 75  .            flu
8d40: 73 68 53 74 6d 74 43 61 63 68 65 28 20 70 44 62  shStmtCache( pDb
8d50: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
8d60: 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  n = 0;.         
8d70: 20 7d 65 6c 73 65 20 69 66 28 20 6e 3e 4d 41 58   }else if( n>MAX
8d80: 5f 50 52 45 50 41 52 45 44 5f 53 54 4d 54 53 20  _PREPARED_STMTS 
8d90: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  ){.            n
8da0: 20 3d 20 4d 41 58 5f 50 52 45 50 41 52 45 44 5f   = MAX_PREPARED_
8db0: 53 54 4d 54 53 3b 0a 20 20 20 20 20 20 20 20 20  STMTS;.         
8dc0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 44 62   }.          pDb
8dd0: 2d 3e 6d 61 78 53 74 6d 74 20 3d 20 6e 3b 0a 20  ->maxStmt = n;. 
8de0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
8df0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8e00: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
8e10: 6c 74 28 20 69 6e 74 65 72 70 2c 20 22 62 61 64  lt( interp, "bad
8e20: 20 6f 70 74 69 6f 6e 20 5c 22 22 2c 20 0a 20 20   option \"", .  
8e30: 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
8e40: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
8e50: 76 5b 32 5d 2c 30 29 2c 20 22 5c 22 3a 20 6d 75  v[2],0), "\": mu
8e60: 73 74 20 62 65 20 66 6c 75 73 68 20 6f 72 20 73  st be flush or s
8e70: 69 7a 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  ize", 0);.      
8e80: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
8e90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  ;.    }.    brea
8ea0: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
8eb0: 20 24 64 62 20 63 68 61 6e 67 65 73 0a 20 20 2a   $db changes.  *
8ec0: 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68  *.  ** Return th
8ed0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
8ee0: 20 74 68 61 74 20 77 65 72 65 20 6d 6f 64 69 66   that were modif
8ef0: 69 65 64 2c 20 69 6e 73 65 72 74 65 64 2c 20 6f  ied, inserted, o
8f00: 72 20 64 65 6c 65 74 65 64 20 62 79 0a 20 20 2a  r deleted by.  *
8f10: 2a 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  * the most recen
8f20: 74 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45  t INSERT, UPDATE
8f30: 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65   or DELETE state
8f40: 6d 65 6e 74 2c 20 6e 6f 74 20 69 6e 63 6c 75 64  ment, not includ
8f50: 69 6e 67 20 0a 20 20 2a 2a 20 61 6e 79 20 63 68  ing .  ** any ch
8f60: 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 72  anges made by tr
8f70: 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 0a  igger programs..
8f80: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43    */.  case DB_C
8f90: 48 41 4e 47 45 53 3a 20 7b 0a 20 20 20 20 54 63  HANGES: {.    Tc
8fa0: 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a  l_Obj *pResult;.
8fb0: 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20      if( objc!=2 
8fc0: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
8fd0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
8fe0: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a  , 2, objv, "");.
8ff0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
9000: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
9010: 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f    pResult = Tcl_
9020: 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  GetObjResult(int
9030: 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  erp);.    Tcl_Se
9040: 74 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c  tIntObj(pResult,
9050: 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
9060: 28 70 44 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20  (pDb->db));.    
9070: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
9080: 20 20 20 20 24 64 62 20 63 6c 6f 73 65 0a 20 20      $db close.  
9090: 2a 2a 0a 20 20 2a 2a 20 53 68 75 74 64 6f 77 6e  **.  ** Shutdown
90a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
90b0: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4c 4f  */.  case DB_CLO
90c0: 53 45 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 44 65  SE: {.    Tcl_De
90d0: 6c 65 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  leteCommand(inte
90e0: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
90f0: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
9100: 2c 20 30 29 29 3b 0a 20 20 20 20 62 72 65 61 6b  , 0));.    break
9110: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
9120: 20 20 20 20 20 24 64 62 20 63 6f 6c 6c 61 74 65       $db collate
9130: 20 4e 41 4d 45 20 53 43 52 49 50 54 0a 20 20 2a   NAME SCRIPT.  *
9140: 2a 0a 20 20 2a 2a 20 43 72 65 61 74 65 20 61 20  *.  ** Create a 
9150: 6e 65 77 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f  new SQL collatio
9160: 6e 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65  n function calle
9170: 64 20 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76 65  d NAME.  Wheneve
9180: 72 0a 20 20 2a 2a 20 74 68 61 74 20 66 75 6e 63  r.  ** that func
9190: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
91a0: 69 6e 76 6f 6b 65 20 53 43 52 49 50 54 20 74 6f  invoke SCRIPT to
91b0: 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 66 75   evaluate the fu
91c0: 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63  nction..  */.  c
91d0: 61 73 65 20 44 42 5f 43 4f 4c 4c 41 54 45 3a 20  ase DB_COLLATE: 
91e0: 7b 0a 20 20 20 20 53 71 6c 43 6f 6c 6c 61 74 65  {.    SqlCollate
91f0: 20 2a 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20   *pCollate;.    
9200: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
9210: 20 63 68 61 72 20 2a 7a 53 63 72 69 70 74 3b 0a   char *zScript;.
9220: 20 20 20 20 69 6e 74 20 6e 53 63 72 69 70 74 3b      int nScript;
9230: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 34  .    if( objc!=4
9240: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
9250: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
9260: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d  p, 2, objv, "NAM
9270: 45 20 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20  E SCRIPT");.    
9280: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
9290: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e  OR;.    }.    zN
92a0: 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ame = Tcl_GetStr
92b0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
92c0: 32 5d 2c 20 30 29 3b 0a 20 20 20 20 7a 53 63 72  2], 0);.    zScr
92d0: 69 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ipt = Tcl_GetStr
92e0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
92f0: 33 5d 2c 20 26 6e 53 63 72 69 70 74 29 3b 0a 20  3], &nScript);. 
9300: 20 20 20 70 43 6f 6c 6c 61 74 65 20 3d 20 28 53     pCollate = (S
9310: 71 6c 43 6f 6c 6c 61 74 65 2a 29 54 63 6c 5f 41  qlCollate*)Tcl_A
9320: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43  lloc( sizeof(*pC
9330: 6f 6c 6c 61 74 65 29 20 2b 20 6e 53 63 72 69 70  ollate) + nScrip
9340: 74 20 2b 20 31 20 29 3b 0a 20 20 20 20 69 66 28  t + 1 );.    if(
9350: 20 70 43 6f 6c 6c 61 74 65 3d 3d 30 20 29 20 72   pCollate==0 ) r
9360: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9370: 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 69  .    pCollate->i
9380: 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a  nterp = interp;.
9390: 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 70 4e      pCollate->pN
93a0: 65 78 74 20 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c  ext = pDb->pColl
93b0: 61 74 65 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74  ate;.    pCollat
93c0: 65 2d 3e 7a 53 63 72 69 70 74 20 3d 20 28 63 68  e->zScript = (ch
93d0: 61 72 2a 29 26 70 43 6f 6c 6c 61 74 65 5b 31 5d  ar*)&pCollate[1]
93e0: 3b 0a 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c  ;.    pDb->pColl
93f0: 61 74 65 20 3d 20 70 43 6f 6c 6c 61 74 65 3b 0a  ate = pCollate;.
9400: 20 20 20 20 6d 65 6d 63 70 79 28 70 43 6f 6c 6c      memcpy(pColl
9410: 61 74 65 2d 3e 7a 53 63 72 69 70 74 2c 20 7a 53  ate->zScript, zS
9420: 63 72 69 70 74 2c 20 6e 53 63 72 69 70 74 2b 31  cript, nScript+1
9430: 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
9440: 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
9450: 69 6f 6e 28 70 44 62 2d 3e 64 62 2c 20 7a 4e 61  ion(pDb->db, zNa
9460: 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  me, SQLITE_UTF8,
9470: 20 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 61   .        pColla
9480: 74 65 2c 20 74 63 6c 53 71 6c 43 6f 6c 6c 61 74  te, tclSqlCollat
9490: 65 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  e) ){.      Tcl_
94a0: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
94b0: 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  , (char *)sqlite
94c0: 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
94d0: 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29  ), TCL_VOLATILE)
94e0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
94f0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
9500: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
9510: 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64    /*.  **     $d
9520: 62 20 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64  b collation_need
9530: 65 64 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20  ed SCRIPT.  **. 
9540: 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77   ** Create a new
9550: 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   SQL collation f
9560: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e  unction called N
9570: 41 4d 45 2e 20 20 57 68 65 6e 65 76 65 72 0a 20  AME.  Whenever. 
9580: 20 2a 2a 20 74 68 61 74 20 66 75 6e 63 74 69 6f   ** that functio
9590: 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 6e 76  n is called, inv
95a0: 6f 6b 65 20 53 43 52 49 50 54 20 74 6f 20 65 76  oke SCRIPT to ev
95b0: 61 6c 75 61 74 65 20 74 68 65 20 66 75 6e 63 74  aluate the funct
95c0: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ion..  */.  case
95d0: 20 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e 45   DB_COLLATION_NE
95e0: 45 44 45 44 3a 20 7b 0a 20 20 20 20 69 66 28 20  EDED: {.    if( 
95f0: 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20  objc!=3 ){.     
9600: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
9610: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
9620: 76 2c 20 22 53 43 52 49 50 54 22 29 3b 0a 20 20  v, "SCRIPT");.  
9630: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
9640: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
9650: 69 66 28 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74  if( pDb->pCollat
9660: 65 4e 65 65 64 65 64 20 29 7b 0a 20 20 20 20 20  eNeeded ){.     
9670: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
9680: 74 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e  t(pDb->pCollateN
9690: 65 65 64 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20  eeded);.    }.  
96a0: 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e    pDb->pCollateN
96b0: 65 65 64 65 64 20 3d 20 54 63 6c 5f 44 75 70 6c  eeded = Tcl_Dupl
96c0: 69 63 61 74 65 4f 62 6a 28 6f 62 6a 76 5b 32 5d  icateObj(objv[2]
96d0: 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  );.    Tcl_IncrR
96e0: 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f  efCount(pDb->pCo
96f0: 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20  llateNeeded);.  
9700: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74    sqlite3_collat
9710: 69 6f 6e 5f 6e 65 65 64 65 64 28 70 44 62 2d 3e  ion_needed(pDb->
9720: 64 62 2c 20 70 44 62 2c 20 74 63 6c 43 6f 6c 6c  db, pDb, tclColl
9730: 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 20 20  ateNeeded);.    
9740: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
9750: 20 20 20 20 24 64 62 20 63 6f 6d 6d 69 74 5f 68      $db commit_h
9760: 6f 6f 6b 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20  ook ?CALLBACK?. 
9770: 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20   **.  ** Invoke 
9780: 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61  the given callba
9790: 63 6b 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63  ck just before c
97a0: 6f 6d 6d 69 74 74 69 6e 67 20 65 76 65 72 79 20  ommitting every 
97b0: 53 51 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  SQL transaction.
97c0: 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 63 61 6c  .  ** If the cal
97d0: 6c 62 61 63 6b 20 74 68 72 6f 77 73 20 61 6e 20  lback throws an 
97e0: 65 78 63 65 70 74 69 6f 6e 20 6f 72 20 72 65 74  exception or ret
97f0: 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  urns non-zero, t
9800: 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 74 72 61  hen the.  ** tra
9810: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 62 6f 72  nsaction is abor
9820: 74 65 64 2e 20 20 49 66 20 43 41 4c 4c 42 41 43  ted.  If CALLBAC
9830: 4b 20 69 73 20 61 6e 20 65 6d 70 74 79 20 73 74  K is an empty st
9840: 72 69 6e 67 2c 20 74 68 65 20 63 61 6c 6c 62 61  ring, the callba
9850: 63 6b 0a 20 20 2a 2a 20 69 73 20 64 69 73 61 62  ck.  ** is disab
9860: 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  led..  */.  case
9870: 20 44 42 5f 43 4f 4d 4d 49 54 5f 48 4f 4f 4b 3a   DB_COMMIT_HOOK:
9880: 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e   {.    if( objc>
9890: 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
98a0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
98b0: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43  rp, 2, objv, "?C
98c0: 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20  ALLBACK?");.    
98d0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
98e0: 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  OR;.    }else if
98f0: 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20  ( objc==2 ){.   
9900: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d     if( pDb->zCom
9910: 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 54  mit ){.        T
9920: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
9930: 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 43 6f  interp, pDb->zCo
9940: 6d 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  mmit, 0);.      
9950: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
9960: 20 20 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74     char *zCommit
9970: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b  ;.      int len;
9980: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
9990: 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20  zCommit ){.     
99a0: 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d     Tcl_Free(pDb-
99b0: 3e 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20  >zCommit);.     
99c0: 20 7d 0a 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74   }.      zCommit
99d0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
99e0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
99f0: 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66   &len);.      if
9a00: 28 20 7a 43 6f 6d 6d 69 74 20 26 26 20 6c 65 6e  ( zCommit && len
9a10: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  >0 ){.        pD
9a20: 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20 54 63 6c  b->zCommit = Tcl
9a30: 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20  _Alloc( len + 1 
9a40: 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  );.        memcp
9a50: 79 28 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 2c 20  y(pDb->zCommit, 
9a60: 7a 43 6f 6d 6d 69 74 2c 20 6c 65 6e 2b 31 29 3b  zCommit, len+1);
9a70: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
9a80: 20 20 20 20 20 20 70 44 62 2d 3e 7a 43 6f 6d 6d        pDb->zComm
9a90: 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  it = 0;.      }.
9aa0: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
9ab0: 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  Commit ){.      
9ac0: 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20    pDb->interp = 
9ad0: 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20  interp;.        
9ae0: 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68  sqlite3_commit_h
9af0: 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20 44 62 43  ook(pDb->db, DbC
9b00: 6f 6d 6d 69 74 48 61 6e 64 6c 65 72 2c 20 70 44  ommitHandler, pD
9b10: 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  b);.      }else{
9b20: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9b30: 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 70 44 62  _commit_hook(pDb
9b40: 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ->db, 0, 0);.   
9b50: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62     }.    }.    b
9b60: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
9b70: 20 20 20 24 64 62 20 63 6f 6d 70 6c 65 74 65 20     $db complete 
9b80: 53 51 4c 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  SQL.  **.  ** Re
9b90: 74 75 72 6e 20 54 52 55 45 20 69 66 20 53 51 4c  turn TRUE if SQL
9ba0: 20 69 73 20 61 20 63 6f 6d 70 6c 65 74 65 20 53   is a complete S
9bb0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 52  QL statement.  R
9bc0: 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 0a 20  eturn FALSE if. 
9bd0: 20 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c   ** additional l
9be0: 69 6e 65 73 20 6f 66 20 69 6e 70 75 74 20 61 72  ines of input ar
9bf0: 65 20 6e 65 65 64 65 64 2e 20 20 54 68 69 73 20  e needed.  This 
9c00: 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68  is similar to th
9c10: 65 0a 20 20 2a 2a 20 62 75 69 6c 74 2d 69 6e 20  e.  ** built-in 
9c20: 22 69 6e 66 6f 20 63 6f 6d 70 6c 65 74 65 22 20  "info complete" 
9c30: 63 6f 6d 6d 61 6e 64 20 6f 66 20 54 63 6c 2e 0a  command of Tcl..
9c40: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43    */.  case DB_C
9c50: 4f 4d 50 4c 45 54 45 3a 20 7b 0a 23 69 66 6e 64  OMPLETE: {.#ifnd
9c60: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
9c70: 4f 4d 50 4c 45 54 45 0a 20 20 20 20 54 63 6c 5f  OMPLETE.    Tcl_
9c80: 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20  Obj *pResult;.  
9c90: 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c 65 74 65    int isComplete
9ca0: 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
9cb0: 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
9cc0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
9cd0: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51  rp, 2, objv, "SQ
9ce0: 4c 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  L");.      retur
9cf0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
9d00: 20 7d 0a 20 20 20 20 69 73 43 6f 6d 70 6c 65 74   }.    isComplet
9d10: 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70  e = sqlite3_comp
9d20: 6c 65 74 65 28 20 54 63 6c 5f 47 65 74 53 74 72  lete( Tcl_GetStr
9d30: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
9d40: 32 5d 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 52  2], 0) );.    pR
9d50: 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f  esult = Tcl_GetO
9d60: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  bjResult(interp)
9d70: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 42 6f 6f  ;.    Tcl_SetBoo
9d80: 6c 65 61 6e 4f 62 6a 28 70 52 65 73 75 6c 74 2c  leanObj(pResult,
9d90: 20 69 73 43 6f 6d 70 6c 65 74 65 29 3b 0a 23 65   isComplete);.#e
9da0: 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a  ndif.    break;.
9db0: 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62    }..  /*    $db
9dc0: 20 63 6f 70 79 20 63 6f 6e 66 6c 69 63 74 2d 61   copy conflict-a
9dd0: 6c 67 6f 72 69 74 68 6d 20 74 61 62 6c 65 20 66  lgorithm table f
9de0: 69 6c 65 6e 61 6d 65 20 3f 53 45 50 41 52 41 54  ilename ?SEPARAT
9df0: 4f 52 3f 20 3f 4e 55 4c 4c 49 4e 44 49 43 41 54  OR? ?NULLINDICAT
9e00: 4f 52 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f  OR?.  **.  ** Co
9e10: 70 79 20 64 61 74 61 20 69 6e 74 6f 20 74 61 62  py data into tab
9e20: 6c 65 20 66 72 6f 6d 20 66 69 6c 65 6e 61 6d 65  le from filename
9e30: 2c 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 75 73 69  , optionally usi
9e40: 6e 67 20 53 45 50 41 52 41 54 4f 52 0a 20 20 2a  ng SEPARATOR.  *
9e50: 2a 20 61 73 20 63 6f 6c 75 6d 6e 20 73 65 70 61  * as column sepa
9e60: 72 61 74 6f 72 73 2e 20 20 49 66 20 61 20 63 6f  rators.  If a co
9e70: 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 20  lumn contains a 
9e80: 6e 75 6c 6c 20 73 74 72 69 6e 67 2c 20 6f 72 20  null string, or 
9e90: 74 68 65 0a 20 20 2a 2a 20 76 61 6c 75 65 20 6f  the.  ** value o
9ea0: 66 20 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52 2c  f NULLINDICATOR,
9eb0: 20 61 20 4e 55 4c 4c 20 69 73 20 69 6e 73 65 72   a NULL is inser
9ec0: 74 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  ted for the colu
9ed0: 6d 6e 2e 0a 20 20 2a 2a 20 63 6f 6e 66 6c 69 63  mn..  ** conflic
9ee0: 74 2d 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 6f  t-algorithm is o
9ef0: 6e 65 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  ne of the sqlite
9f00: 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67 6f 72 69   conflict algori
9f10: 74 68 6d 73 3a 0a 20 20 2a 2a 20 20 20 20 72 6f  thms:.  **    ro
9f20: 6c 6c 62 61 63 6b 2c 20 61 62 6f 72 74 2c 20 66  llback, abort, f
9f30: 61 69 6c 2c 20 69 67 6e 6f 72 65 2c 20 72 65 70  ail, ignore, rep
9f40: 6c 61 63 65 0a 20 20 2a 2a 20 4f 6e 20 73 75 63  lace.  ** On suc
9f50: 63 65 73 73 2c 20 72 65 74 75 72 6e 20 74 68 65  cess, return the
9f60: 20 6e 75 6d 62 65 72 20 6f 66 20 6c 69 6e 65 73   number of lines
9f70: 20 70 72 6f 63 65 73 73 65 64 2c 20 6e 6f 74 20   processed, not 
9f80: 6e 65 63 65 73 73 61 72 69 6c 79 20 73 61 6d 65  necessarily same
9f90: 0a 20 20 2a 2a 20 61 73 20 27 64 62 20 63 68 61  .  ** as 'db cha
9fa0: 6e 67 65 73 27 20 64 75 65 20 74 6f 20 63 6f 6e  nges' due to con
9fb0: 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20  flict-algorithm 
9fc0: 73 65 6c 65 63 74 65 64 2e 0a 20 20 2a 2a 0a 20  selected..  **. 
9fd0: 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 69 73   ** This code is
9fe0: 20 62 61 73 69 63 61 6c 6c 79 20 61 6e 20 69 6d   basically an im
9ff0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2f 65 6e 68  plementation/enh
a000: 61 6e 63 65 6d 65 6e 74 20 6f 66 0a 20 20 2a 2a  ancement of.  **
a010: 20 74 68 65 20 73 71 6c 69 74 65 33 20 73 68 65   the sqlite3 she
a020: 6c 6c 2e 63 20 22 2e 69 6d 70 6f 72 74 22 20 63  ll.c ".import" c
a030: 6f 6d 6d 61 6e 64 2e 0a 20 20 2a 2a 0a 20 20 2a  ommand..  **.  *
a040: 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 75  * This command u
a050: 73 61 67 65 20 69 73 20 65 71 75 69 76 61 6c 65  sage is equivale
a060: 6e 74 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65  nt to the sqlite
a070: 32 2e 78 20 43 4f 50 59 20 73 74 61 74 65 6d 65  2.x COPY stateme
a080: 6e 74 2c 0a 20 20 2a 2a 20 77 68 69 63 68 20 69  nt,.  ** which i
a090: 6d 70 6f 72 74 73 20 66 69 6c 65 20 64 61 74 61  mports file data
a0a0: 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 75 73   into a table us
a0b0: 69 6e 67 20 74 68 65 20 50 6f 73 74 67 72 65 53  ing the PostgreS
a0c0: 51 4c 20 43 4f 50 59 20 66 69 6c 65 20 66 6f 72  QL COPY file for
a0d0: 6d 61 74 3a 0a 20 20 2a 2a 20 20 20 24 64 62 20  mat:.  **   $db 
a0e0: 63 6f 70 79 20 24 63 6f 6e 66 6c 69 74 5f 61 6c  copy $conflit_al
a0f0: 67 6f 20 24 74 61 62 6c 65 5f 6e 61 6d 65 20 24  go $table_name $
a100: 66 69 6c 65 6e 61 6d 65 20 5c 74 20 5c 5c 4e 0a  filename \t \\N.
a110: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43    */.  case DB_C
a120: 4f 50 59 3a 20 7b 0a 20 20 20 20 63 68 61 72 20  OPY: {.    char 
a130: 2a 7a 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20  *zTable;        
a140: 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74         /* Insert
a150: 20 64 61 74 61 20 69 6e 74 6f 20 74 68 69 73 20   data into this 
a160: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61  table */.    cha
a170: 72 20 2a 7a 46 69 6c 65 3b 20 20 20 20 20 20 20  r *zFile;       
a180: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
a190: 66 69 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20  file from which 
a1a0: 74 6f 20 65 78 74 72 61 63 74 20 64 61 74 61 20  to extract data 
a1b0: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  */.    char *zCo
a1c0: 6e 66 6c 69 63 74 3b 20 20 20 20 20 20 20 20 20  nflict;         
a1d0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 66 6c 69     /* The confli
a1e0: 63 74 20 61 6c 67 6f 72 69 74 68 6d 20 74 6f 20  ct algorithm to 
a1f0: 75 73 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  use */.    sqlit
a200: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20  e3_stmt *pStmt; 
a210: 20 20 20 20 20 20 20 2f 2a 20 41 20 73 74 61 74         /* A stat
a220: 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74  ement */.    int
a230: 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   nCol;          
a240: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
a250: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
a260: 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
a270: 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20    int nByte;    
a280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a290: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
a2a0: 20 69 6e 20 61 6e 20 53 51 4c 20 73 74 72 69 6e   in an SQL strin
a2b0: 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 20  g */.    int i, 
a2c0: 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
a2d0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
a2e0: 6e 74 65 72 73 20 2a 2f 0a 20 20 20 20 69 6e 74  nters */.    int
a2f0: 20 6e 53 65 70 3b 20 20 20 20 20 20 20 20 20 20   nSep;          
a300: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
a310: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a  er of bytes in z
a320: 53 65 70 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74  Sep[] */.    int
a330: 20 6e 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20   nNull;         
a340: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
a350: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a  er of bytes in z
a360: 4e 75 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 63 68  Null[] */.    ch
a370: 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20  ar *zSql;       
a380: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
a390: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  SQL statement */
a3a0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c 69 6e 65  .    char *zLine
a3b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a3c0: 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 69 6e   /* A single lin
a3d0: 65 20 6f 66 20 69 6e 70 75 74 20 66 72 6f 6d 20  e of input from 
a3e0: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  the file */.    
a3f0: 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 3b 20 20 20  char **azCol;   
a400: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
a410: 4c 69 6e 65 5b 5d 20 62 72 6f 6b 65 6e 20 75 70  Line[] broken up
a420: 20 69 6e 74 6f 20 63 6f 6c 75 6d 6e 73 20 2a 2f   into columns */
a430: 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6d 6d  .    char *zComm
a440: 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
a450: 20 2f 2a 20 48 6f 77 20 74 6f 20 63 6f 6d 6d 69   /* How to commi
a460: 74 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 20  t changes */.   
a470: 20 46 49 4c 45 20 2a 69 6e 3b 20 20 20 20 20 20   FILE *in;      
a480: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a490: 54 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a  The input file *
a4a0: 2f 0a 20 20 20 20 69 6e 74 20 6c 69 6e 65 6e 6f  /.    int lineno
a4b0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
a4c0: 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72    /* Line number
a4d0: 20 6f 66 20 69 6e 70 75 74 20 66 69 6c 65 20 2a   of input file *
a4e0: 2f 0a 20 20 20 20 63 68 61 72 20 7a 4c 69 6e 65  /.    char zLine
a4f0: 4e 75 6d 5b 38 30 5d 3b 20 20 20 20 20 20 20 20  Num[80];        
a500: 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72    /* Line number
a510: 20 70 72 69 6e 74 20 62 75 66 66 65 72 20 2a 2f   print buffer */
a520: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52  .    Tcl_Obj *pR
a530: 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20  esult;          
a540: 20 2f 2a 20 69 6e 74 65 72 70 20 72 65 73 75 6c   /* interp resul
a550: 74 20 2a 2f 0a 0a 20 20 20 20 63 68 61 72 20 2a  t */..    char *
a560: 7a 53 65 70 3b 0a 20 20 20 20 63 68 61 72 20 2a  zSep;.    char *
a570: 7a 4e 75 6c 6c 3b 0a 20 20 20 20 69 66 28 20 6f  zNull;.    if( o
a580: 62 6a 63 3c 35 20 7c 7c 20 6f 62 6a 63 3e 37 20  bjc<5 || objc>7 
a590: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
a5a0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
a5b0: 2c 20 32 2c 20 6f 62 6a 76 2c 20 0a 20 20 20 20  , 2, objv, .    
a5c0: 20 20 20 20 20 22 43 4f 4e 46 4c 49 43 54 2d 41       "CONFLICT-A
a5d0: 4c 47 4f 52 49 54 48 4d 20 54 41 42 4c 45 20 46  LGORITHM TABLE F
a5e0: 49 4c 45 4e 41 4d 45 20 3f 53 45 50 41 52 41 54  ILENAME ?SEPARAT
a5f0: 4f 52 3f 20 3f 4e 55 4c 4c 49 4e 44 49 43 41 54  OR? ?NULLINDICAT
a600: 4f 52 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74  OR?");.      ret
a610: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
a620: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a     }.    if( obj
a630: 63 3e 3d 36 20 29 7b 0a 20 20 20 20 20 20 7a 53  c>=6 ){.      zS
a640: 65 70 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  ep = Tcl_GetStri
a650: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 35  ngFromObj(objv[5
a660: 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ], 0);.    }else
a670: 7b 0a 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22  {.      zSep = "
a680: 5c 74 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  \t";.    }.    i
a690: 66 28 20 6f 62 6a 63 3e 3d 37 20 29 7b 0a 20 20  f( objc>=7 ){.  
a6a0: 20 20 20 20 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f      zNull = Tcl_
a6b0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
a6c0: 28 6f 62 6a 76 5b 36 5d 2c 20 30 29 3b 0a 20 20  (objv[6], 0);.  
a6d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
a6e0: 4e 75 6c 6c 20 3d 20 22 22 3b 0a 20 20 20 20 7d  Null = "";.    }
a6f0: 0a 20 20 20 20 7a 43 6f 6e 66 6c 69 63 74 20 3d  .    zConflict =
a700: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
a710: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30  omObj(objv[2], 0
a720: 29 3b 0a 20 20 20 20 7a 54 61 62 6c 65 20 3d 20  );.    zTable = 
a730: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
a740: 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 30 29  mObj(objv[3], 0)
a750: 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 54 63  ;.    zFile = Tc
a760: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
a770: 62 6a 28 6f 62 6a 76 5b 34 5d 2c 20 30 29 3b 0a  bj(objv[4], 0);.
a780: 20 20 20 20 6e 53 65 70 20 3d 20 73 71 6c 69 74      nSep = sqlit
a790: 65 33 53 74 72 6c 65 6e 33 30 28 7a 53 65 70 29  e3Strlen30(zSep)
a7a0: 3b 0a 20 20 20 20 6e 4e 75 6c 6c 20 3d 20 73 71  ;.    nNull = sq
a7b0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e  lite3Strlen30(zN
a7c0: 75 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 6e 53  ull);.    if( nS
a7d0: 65 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54  ep==0 ){.      T
a7e0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
a7f0: 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 3a 20 6e  interp,"Error: n
a800: 6f 6e 2d 6e 75 6c 6c 20 73 65 70 61 72 61 74 6f  on-null separato
a810: 72 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 63  r required for c
a820: 6f 70 79 22 2c 30 29 3b 0a 20 20 20 20 20 20 72  opy",0);.      r
a830: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
a840: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 73 74  .    }.    if(st
a850: 72 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20  rcmp(zConflict, 
a860: 22 72 6f 6c 6c 62 61 63 6b 22 29 20 21 3d 20 30  "rollback") != 0
a870: 20 26 26 0a 20 20 20 20 20 20 20 73 74 72 63 6d   &&.       strcm
a880: 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 61 62  p(zConflict, "ab
a890: 6f 72 74 22 20 20 20 29 20 21 3d 20 30 20 26 26  ort"   ) != 0 &&
a8a0: 0a 20 20 20 20 20 20 20 73 74 72 63 6d 70 28 7a  .       strcmp(z
a8b0: 43 6f 6e 66 6c 69 63 74 2c 20 22 66 61 69 6c 22  Conflict, "fail"
a8c0: 20 20 20 20 29 20 21 3d 20 30 20 26 26 0a 20 20      ) != 0 &&.  
a8d0: 20 20 20 20 20 73 74 72 63 6d 70 28 7a 43 6f 6e       strcmp(zCon
a8e0: 66 6c 69 63 74 2c 20 22 69 67 6e 6f 72 65 22 20  flict, "ignore" 
a8f0: 20 29 20 21 3d 20 30 20 26 26 0a 20 20 20 20 20   ) != 0 &&.     
a900: 20 20 73 74 72 63 6d 70 28 7a 43 6f 6e 66 6c 69    strcmp(zConfli
a910: 63 74 2c 20 22 72 65 70 6c 61 63 65 22 20 29 20  ct, "replace" ) 
a920: 21 3d 20 30 20 29 20 7b 0a 20 20 20 20 20 20 54  != 0 ) {.      T
a930: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
a940: 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20  interp, "Error: 
a950: 5c 22 22 2c 20 7a 43 6f 6e 66 6c 69 63 74 2c 20  \"", zConflict, 
a960: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22  .            "\"
a970: 2c 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72  , conflict-algor
a980: 69 74 68 6d 20 6d 75 73 74 20 62 65 20 6f 6e 65  ithm must be one
a990: 20 6f 66 3a 20 72 6f 6c 6c 62 61 63 6b 2c 20 22   of: rollback, "
a9a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 61 62  .            "ab
a9b0: 6f 72 74 2c 20 66 61 69 6c 2c 20 69 67 6e 6f 72  ort, fail, ignor
a9c0: 65 2c 20 6f 72 20 72 65 70 6c 61 63 65 22 2c 20  e, or replace", 
a9d0: 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
a9e0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
a9f0: 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c  }.    zSql = sql
aa00: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45  ite3_mprintf("SE
aa10: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 27 25 71 27  LECT * FROM '%q'
aa20: 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20  ", zTable);.    
aa30: 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20  if( zSql==0 ){. 
aa40: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
aa50: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45  esult(interp, "E
aa60: 72 72 6f 72 3a 20 6e 6f 20 73 75 63 68 20 74 61  rror: no such ta
aa70: 62 6c 65 3a 20 22 2c 20 7a 54 61 62 6c 65 2c 20  ble: ", zTable, 
aa80: 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
aa90: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
aaa0: 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73 71  }.    nByte = sq
aab0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 53  lite3Strlen30(zS
aac0: 71 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ql);.    rc = sq
aad0: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 70 44  lite3_prepare(pD
aae0: 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  b->db, zSql, -1,
aaf0: 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
ab00: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
ab10: 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ql);.    if( rc 
ab20: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
ab30: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
ab40: 2c 20 22 45 72 72 6f 72 3a 20 22 2c 20 73 71 6c  , "Error: ", sql
ab50: 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d  ite3_errmsg(pDb-
ab60: 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  >db), 0);.      
ab70: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65  nCol = 0;.    }e
ab80: 6c 73 65 7b 0a 20 20 20 20 20 20 6e 43 6f 6c 20  lse{.      nCol 
ab90: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
aba0: 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20  _count(pStmt);. 
abb0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
abc0: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
abd0: 3b 0a 20 20 20 20 69 66 28 20 6e 43 6f 6c 3d 3d  ;.    if( nCol==
abe0: 30 20 29 20 7b 0a 20 20 20 20 20 20 72 65 74 75  0 ) {.      retu
abf0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
ac00: 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20 6d    }.    zSql = m
ac10: 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 2b 20 35  alloc( nByte + 5
ac20: 30 20 2b 20 6e 43 6f 6c 2a 32 20 29 3b 0a 20 20  0 + nCol*2 );.  
ac30: 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20    if( zSql==0 ) 
ac40: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
ac50: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
ac60: 20 22 45 72 72 6f 72 3a 20 63 61 6e 27 74 20 6d   "Error: can't m
ac70: 61 6c 6c 6f 63 28 29 22 2c 20 30 29 3b 0a 20 20  alloc()", 0);.  
ac80: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
ac90: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
aca0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
acb0: 28 6e 42 79 74 65 2b 35 30 2c 20 7a 53 71 6c 2c  (nByte+50, zSql,
acc0: 20 22 49 4e 53 45 52 54 20 4f 52 20 25 71 20 49   "INSERT OR %q I
acd0: 4e 54 4f 20 27 25 71 27 20 56 41 4c 55 45 53 28  NTO '%q' VALUES(
ace0: 3f 22 2c 0a 20 20 20 20 20 20 20 20 20 7a 43 6f  ?",.         zCo
acf0: 6e 66 6c 69 63 74 2c 20 7a 54 61 62 6c 65 29 3b  nflict, zTable);
ad00: 0a 20 20 20 20 6a 20 3d 20 73 71 6c 69 74 65 33  .    j = sqlite3
ad10: 53 74 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a  Strlen30(zSql);.
ad20: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e      for(i=1; i<n
ad30: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
ad40: 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 2c 27   zSql[j++] = ','
ad50: 3b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b  ;.      zSql[j++
ad60: 5d 20 3d 20 27 3f 27 3b 0a 20 20 20 20 7d 0a 20  ] = '?';.    }. 
ad70: 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27     zSql[j++] = '
ad80: 29 27 3b 0a 20 20 20 20 7a 53 71 6c 5b 6a 5d 20  )';.    zSql[j] 
ad90: 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  = 0;.    rc = sq
ada0: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 70 44  lite3_prepare(pD
adb0: 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  b->db, zSql, -1,
adc0: 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
add0: 20 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20   free(zSql);.   
ade0: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
adf0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
ae00: 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72  t(interp, "Error
ae10: 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  : ", sqlite3_err
ae20: 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30 29  msg(pDb->db), 0)
ae30: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
ae40: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
ae50: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
ae60: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
ae70: 20 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 46     in = fopen(zF
ae80: 69 6c 65 2c 20 22 72 62 22 29 3b 0a 20 20 20 20  ile, "rb");.    
ae90: 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20  if( in==0 ){.   
aea0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
aeb0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72  ult(interp, "Err
aec0: 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20  or: cannot open 
aed0: 66 69 6c 65 3a 20 22 2c 20 7a 46 69 6c 65 2c 20  file: ", zFile, 
aee0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c  NULL);.      sql
aef0: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
af00: 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  tmt);.      retu
af10: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
af20: 20 20 7d 0a 20 20 20 20 61 7a 43 6f 6c 20 3d 20    }.    azCol = 
af30: 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 61  malloc( sizeof(a
af40: 7a 43 6f 6c 5b 30 5d 29 2a 28 6e 43 6f 6c 2b 31  zCol[0])*(nCol+1
af50: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 43  ) );.    if( azC
af60: 6f 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20 20  ol==0 ) {.      
af70: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
af80: 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a  (interp, "Error:
af90: 20 63 61 6e 27 74 20 6d 61 6c 6c 6f 63 28 29 22   can't malloc()"
afa0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 63 6c 6f  , 0);.      fclo
afb0: 73 65 28 69 6e 29 3b 0a 20 20 20 20 20 20 72 65  se(in);.      re
afc0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
afd0: 20 20 20 20 7d 0a 20 20 20 20 28 76 6f 69 64 29      }.    (void)
afe0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62  sqlite3_exec(pDb
aff0: 2d 3e 64 62 2c 20 22 42 45 47 49 4e 22 2c 20 30  ->db, "BEGIN", 0
b000: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7a 43 6f  , 0, 0);.    zCo
b010: 6d 6d 69 74 20 3d 20 22 43 4f 4d 4d 49 54 22 3b  mmit = "COMMIT";
b020: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4c 69  .    while( (zLi
b030: 6e 65 20 3d 20 6c 6f 63 61 6c 5f 67 65 74 6c 69  ne = local_getli
b040: 6e 65 28 30 2c 20 69 6e 29 29 21 3d 30 20 29 7b  ne(0, in))!=0 ){
b050: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a  .      char *z;.
b060: 20 20 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 20        i = 0;.   
b070: 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20     lineno++;.   
b080: 20 20 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20 7a 4c     azCol[0] = zL
b090: 69 6e 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  ine;.      for(i
b0a0: 3d 30 2c 20 7a 3d 7a 4c 69 6e 65 3b 20 2a 7a 3b  =0, z=zLine; *z;
b0b0: 20 7a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   z++){.        i
b0c0: 66 28 20 2a 7a 3d 3d 7a 53 65 70 5b 30 5d 20 26  f( *z==zSep[0] &
b0d0: 26 20 73 74 72 6e 63 6d 70 28 7a 2c 20 7a 53 65  & strncmp(z, zSe
b0e0: 70 2c 20 6e 53 65 70 29 3d 3d 30 20 29 7b 0a 20  p, nSep)==0 ){. 
b0f0: 20 20 20 20 20 20 20 20 20 2a 7a 20 3d 20 30 3b           *z = 0;
b100: 0a 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a  .          i++;.
b110: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c            if( i<
b120: 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  nCol ){.        
b130: 20 20 20 20 61 7a 43 6f 6c 5b 69 5d 20 3d 20 26      azCol[i] = &
b140: 7a 5b 6e 53 65 70 5d 3b 0a 20 20 20 20 20 20 20  z[nSep];.       
b150: 20 20 20 20 20 7a 20 2b 3d 20 6e 53 65 70 2d 31       z += nSep-1
b160: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
b170: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
b180: 20 20 20 20 20 20 69 66 28 20 69 2b 31 21 3d 6e        if( i+1!=n
b190: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 63  Col ){.        c
b1a0: 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20 20  har *zErr;.     
b1b0: 20 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 73 71     int nErr = sq
b1c0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
b1d0: 69 6c 65 29 20 2b 20 32 30 30 3b 0a 20 20 20 20  ile) + 200;.    
b1e0: 20 20 20 20 7a 45 72 72 20 3d 20 6d 61 6c 6c 6f      zErr = mallo
b1f0: 63 28 6e 45 72 72 29 3b 0a 20 20 20 20 20 20 20  c(nErr);.       
b200: 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20   if( zErr ){.   
b210: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
b220: 6e 70 72 69 6e 74 66 28 6e 45 72 72 2c 20 7a 45  nprintf(nErr, zE
b230: 72 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rr,.            
b240: 20 22 45 72 72 6f 72 3a 20 25 73 20 6c 69 6e 65   "Error: %s line
b250: 20 25 64 3a 20 65 78 70 65 63 74 65 64 20 25 64   %d: expected %d
b260: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61   columns of data
b270: 20 62 75 74 20 66 6f 75 6e 64 20 25 64 22 2c 0a   but found %d",.
b280: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 46 69               zFi
b290: 6c 65 2c 20 6c 69 6e 65 6e 6f 2c 20 6e 43 6f 6c  le, lineno, nCol
b2a0: 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  , i+1);.        
b2b0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
b2c0: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72 2c  lt(interp, zErr,
b2d0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66   0);.          f
b2e0: 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 20 20 20  ree(zErr);.     
b2f0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 43 6f     }.        zCo
b300: 6d 6d 69 74 20 3d 20 22 52 4f 4c 4c 42 41 43 4b  mmit = "ROLLBACK
b310: 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ";.        break
b320: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b330: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
b340: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 2f   i++){.        /
b350: 2a 20 63 68 65 63 6b 20 66 6f 72 20 6e 75 6c 6c  * check for null
b360: 20 64 61 74 61 2c 20 69 66 20 73 6f 2c 20 62 69   data, if so, bi
b370: 6e 64 20 61 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20  nd as null */.  
b380: 20 20 20 20 20 20 69 66 28 20 28 6e 4e 75 6c 6c        if( (nNull
b390: 3e 30 20 26 26 20 73 74 72 63 6d 70 28 61 7a 43  >0 && strcmp(azC
b3a0: 6f 6c 5b 69 5d 2c 20 7a 4e 75 6c 6c 29 3d 3d 30  ol[i], zNull)==0
b3b0: 29 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73  ).          || s
b3c0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 61  qlite3Strlen30(a
b3d0: 7a 43 6f 6c 5b 69 5d 29 3d 3d 30 20 0a 20 20 20  zCol[i])==0 .   
b3e0: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
b3f0: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e    sqlite3_bind_n
b400: 75 6c 6c 28 70 53 74 6d 74 2c 20 69 2b 31 29 3b  ull(pStmt, i+1);
b410: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
b420: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b430: 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d  3_bind_text(pStm
b440: 74 2c 20 69 2b 31 2c 20 61 7a 43 6f 6c 5b 69 5d  t, i+1, azCol[i]
b450: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41  , -1, SQLITE_STA
b460: 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  TIC);.        }.
b470: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
b480: 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
b490: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
b4a0: 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d  lite3_reset(pStm
b4b0: 74 29 3b 0a 20 20 20 20 20 20 66 72 65 65 28 7a  t);.      free(z
b4c0: 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Line);.      if(
b4d0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
b4e0: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  {.        Tcl_Ap
b4f0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
b500: 70 2c 22 45 72 72 6f 72 3a 20 22 2c 20 73 71 6c  p,"Error: ", sql
b510: 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d  ite3_errmsg(pDb-
b520: 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  >db), 0);.      
b530: 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 52 4f 4c    zCommit = "ROL
b540: 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20 20 20 20  LBACK";.        
b550: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
b560: 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28 61 7a     }.    free(az
b570: 43 6f 6c 29 3b 0a 20 20 20 20 66 63 6c 6f 73 65  Col);.    fclose
b580: 28 69 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  (in);.    sqlite
b590: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
b5a0: 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 73 71 6c  );.    (void)sql
b5b0: 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64  ite3_exec(pDb->d
b5c0: 62 2c 20 7a 43 6f 6d 6d 69 74 2c 20 30 2c 20 30  b, zCommit, 0, 0
b5d0: 2c 20 30 29 3b 0a 0a 20 20 20 20 69 66 28 20 7a  , 0);..    if( z
b5e0: 43 6f 6d 6d 69 74 5b 30 5d 20 3d 3d 20 27 43 27  Commit[0] == 'C'
b5f0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 73 75 63   ){.      /* suc
b600: 63 65 73 73 2c 20 73 65 74 20 72 65 73 75 6c 74  cess, set result
b610: 20 61 73 20 6e 75 6d 62 65 72 20 6f 66 20 6c 69   as number of li
b620: 6e 65 73 20 70 72 6f 63 65 73 73 65 64 20 2a 2f  nes processed */
b630: 0a 20 20 20 20 20 20 70 52 65 73 75 6c 74 20 3d  .      pResult =
b640: 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c   Tcl_GetObjResul
b650: 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 20  t(interp);.     
b660: 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70   Tcl_SetIntObj(p
b670: 52 65 73 75 6c 74 2c 20 6c 69 6e 65 6e 6f 29 3b  Result, lineno);
b680: 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f  .      rc = TCL_
b690: 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OK;.    }else{. 
b6a0: 20 20 20 20 20 2f 2a 20 66 61 69 6c 75 72 65 2c       /* failure,
b6b0: 20 61 70 70 65 6e 64 20 6c 69 6e 65 6e 6f 20 77   append lineno w
b6c0: 68 65 72 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20  here failed */. 
b6d0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
b6e0: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c 69  rintf(sizeof(zLi
b6f0: 6e 65 4e 75 6d 29 2c 20 7a 4c 69 6e 65 4e 75 6d  neNum), zLineNum
b700: 2c 22 25 64 22 2c 6c 69 6e 65 6e 6f 29 3b 0a 20  ,"%d",lineno);. 
b710: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
b720: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 2c 20  esult(interp,", 
b730: 66 61 69 6c 65 64 20 77 68 69 6c 65 20 70 72 6f  failed while pro
b740: 63 65 73 73 69 6e 67 20 6c 69 6e 65 3a 20 22 2c  cessing line: ",
b750: 7a 4c 69 6e 65 4e 75 6d 2c 30 29 3b 0a 20 20 20  zLineNum,0);.   
b760: 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f     rc = TCL_ERRO
b770: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  R;.    }.    bre
b780: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
b790: 2a 2a 20 20 20 20 24 64 62 20 65 6e 61 62 6c 65  **    $db enable
b7a0: 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 20  _load_extension 
b7b0: 42 4f 4f 4c 45 41 4e 0a 20 20 2a 2a 0a 20 20 2a  BOOLEAN.  **.  *
b7c0: 2a 20 54 75 72 6e 20 74 68 65 20 65 78 74 65 6e  * Turn the exten
b7d0: 73 69 6f 6e 20 6c 6f 61 64 69 6e 67 20 66 65 61  sion loading fea
b7e0: 74 75 72 65 20 6f 6e 20 6f 72 20 6f 66 66 2e 20  ture on or off. 
b7f0: 20 49 74 20 69 66 20 6f 66 66 20 62 79 0a 20 20   It if off by.  
b800: 2a 2a 20 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2f  ** default..  */
b810: 0a 20 20 63 61 73 65 20 44 42 5f 45 4e 41 42 4c  .  case DB_ENABL
b820: 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  E_LOAD_EXTENSION
b830: 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  : {.#ifndef SQLI
b840: 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
b850: 45 4e 53 49 4f 4e 0a 20 20 20 20 69 6e 74 20 6f  ENSION.    int o
b860: 6e 6f 66 66 3b 0a 20 20 20 20 69 66 28 20 6f 62  noff;.    if( ob
b870: 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54  jc!=3 ){.      T
b880: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
b890: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
b8a0: 20 22 42 4f 4f 4c 45 41 4e 22 29 3b 0a 20 20 20   "BOOLEAN");.   
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 69  ROR;.    }.    i
b8d0: 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61  f( Tcl_GetBoolea
b8e0: 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  nFromObj(interp,
b8f0: 20 6f 62 6a 76 5b 32 5d 2c 20 26 6f 6e 6f 66 66   objv[2], &onoff
b900: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
b910: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
b920: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65   }.    sqlite3_e
b930: 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e  nable_load_exten
b940: 73 69 6f 6e 28 70 44 62 2d 3e 64 62 2c 20 6f 6e  sion(pDb->db, on
b950: 6f 66 66 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  off);.    break;
b960: 0a 23 65 6c 73 65 0a 20 20 20 20 54 63 6c 5f 41  .#else.    Tcl_A
b970: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
b980: 72 70 2c 20 22 65 78 74 65 6e 73 69 6f 6e 20 6c  rp, "extension l
b990: 6f 61 64 69 6e 67 20 69 73 20 74 75 72 6e 65 64  oading is turned
b9a0: 20 6f 66 66 20 61 74 20 63 6f 6d 70 69 6c 65 2d   off at compile-
b9b0: 74 69 6d 65 22 2c 0a 20 20 20 20 20 20 20 20 20  time",.         
b9c0: 20 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a              0);.
b9d0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
b9e0: 52 52 4f 52 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  RROR;.#endif.  }
b9f0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24  ..  /*.  **    $
ba00: 64 62 20 65 72 72 6f 72 63 6f 64 65 0a 20 20 2a  db errorcode.  *
ba10: 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68  *.  ** Return th
ba20: 65 20 6e 75 6d 65 72 69 63 20 65 72 72 6f 72 20  e numeric error 
ba30: 63 6f 64 65 20 74 68 61 74 20 77 61 73 20 72 65  code that was re
ba40: 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 6d 6f  turned by the mo
ba50: 73 74 20 72 65 63 65 6e 74 0a 20 20 2a 2a 20 63  st recent.  ** c
ba60: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  all to sqlite3_e
ba70: 78 65 63 28 29 2e 0a 20 20 2a 2f 0a 20 20 63 61  xec()..  */.  ca
ba80: 73 65 20 44 42 5f 45 52 52 4f 52 43 4f 44 45 3a  se DB_ERRORCODE:
ba90: 20 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62   {.    Tcl_SetOb
baa0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
bab0: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71  Tcl_NewIntObj(sq
bac0: 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70 44  lite3_errcode(pD
bad0: 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20 62 72  b->db)));.    br
bae0: 65 61 6b 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 2f  eak;.  }.   .  /
baf0: 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 65 76  *.  **    $db ev
bb00: 61 6c 20 24 73 71 6c 20 3f 61 72 72 61 79 3f 20  al $sql ?array? 
bb10: 3f 7b 20 20 2e 2e 2e 63 6f 64 65 2e 2e 2e 20 7d  ?{  ...code... }
bb20: 3f 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 6f 6e  ?.  **    $db on
bb30: 65 63 6f 6c 75 6d 6e 20 24 73 71 6c 0a 20 20 2a  ecolumn $sql.  *
bb40: 2a 0a 20 20 2a 2a 20 54 68 65 20 53 51 4c 20 73  *.  ** The SQL s
bb50: 74 61 74 65 6d 65 6e 74 20 69 6e 20 24 73 71 6c  tatement in $sql
bb60: 20 69 73 20 65 76 61 6c 75 61 74 65 64 2e 20 20   is evaluated.  
bb70: 46 6f 72 20 65 61 63 68 20 72 6f 77 2c 20 74 68  For each row, th
bb80: 65 20 76 61 6c 75 65 73 20 61 72 65 0a 20 20 2a  e values are.  *
bb90: 2a 20 70 6c 61 63 65 64 20 69 6e 20 65 6c 65 6d  * placed in elem
bba0: 65 6e 74 73 20 6f 66 20 74 68 65 20 61 72 72 61  ents of the arra
bbb0: 79 20 6e 61 6d 65 64 20 22 61 72 72 61 79 22 20  y named "array" 
bbc0: 61 6e 64 20 2e 2e 2e 63 6f 64 65 2e 2e 2e 20 69  and ...code... i
bbd0: 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20 2a 2a  s executed..  **
bbe0: 20 49 66 20 22 61 72 72 61 79 22 20 61 6e 64 20   If "array" and 
bbf0: 22 63 6f 64 65 22 20 61 72 65 20 6f 6d 69 74 74  "code" are omitt
bc00: 65 64 2c 20 74 68 65 6e 20 6e 6f 20 63 61 6c 6c  ed, then no call
bc10: 62 61 63 6b 20 69 73 20 65 76 65 72 79 20 69 6e  back is every in
bc20: 76 6f 6b 65 64 2e 0a 20 20 2a 2a 20 49 66 20 22  voked..  ** If "
bc30: 61 72 72 61 79 22 20 69 73 20 61 6e 20 65 6d 70  array" is an emp
bc40: 74 79 20 73 74 72 69 6e 67 2c 20 74 68 65 6e 20  ty string, then 
bc50: 74 68 65 20 76 61 6c 75 65 73 20 61 72 65 20 70  the values are p
bc60: 6c 61 63 65 64 20 69 6e 20 76 61 72 69 61 62 6c  laced in variabl
bc70: 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 68 61 76  es.  ** that hav
bc80: 65 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20  e the same name 
bc90: 61 73 20 74 68 65 20 66 69 65 6c 64 73 20 65 78  as the fields ex
bca0: 74 72 61 63 74 65 64 20 62 79 20 74 68 65 20 71  tracted by the q
bcb0: 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  uery..  **.  ** 
bcc0: 54 68 65 20 6f 6e 65 63 6f 6c 75 6d 6e 20 6d 65  The onecolumn me
bcd0: 74 68 6f 64 20 69 73 20 74 68 65 20 65 71 75 69  thod is the equi
bce0: 76 61 6c 65 6e 74 20 6f 66 3a 0a 20 20 2a 2a 20  valent of:.  ** 
bcf0: 20 20 20 20 6c 69 6e 64 65 78 20 5b 24 64 62 20      lindex [$db 
bd00: 65 76 61 6c 20 24 73 71 6c 5d 20 30 0a 20 20 2a  eval $sql] 0.  *
bd10: 2f 0a 20 20 63 61 73 65 20 44 42 5f 4f 4e 45 43  /.  case DB_ONEC
bd20: 4f 4c 55 4d 4e 3a 0a 20 20 63 61 73 65 20 44 42  OLUMN:.  case DB
bd30: 5f 45 56 41 4c 3a 0a 20 20 63 61 73 65 20 44 42  _EVAL:.  case DB
bd40: 5f 45 58 49 53 54 53 3a 20 7b 0a 20 20 20 20 63  _EXISTS: {.    c
bd50: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 53 71 6c 3b  har const *zSql;
bd60: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 53 51        /* Next SQ
bd70: 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 65  L statement to e
bd80: 78 65 63 75 74 65 20 2a 2f 0a 20 20 20 20 63 68  xecute */.    ch
bd90: 61 72 20 63 6f 6e 73 74 20 2a 7a 4c 65 66 74 3b  ar const *zLeft;
bda0: 20 20 20 20 20 2f 2a 20 57 68 61 74 20 69 73 20       /* What is 
bdb0: 6c 65 66 74 20 61 66 74 65 72 20 66 69 72 73 74  left after first
bdc0: 20 73 74 6d 74 20 69 6e 20 7a 53 71 6c 20 2a 2f   stmt in zSql */
bdd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
bde0: 74 20 2a 70 53 74 6d 74 3b 20 20 20 2f 2a 20 43  t *pStmt;   /* C
bdf0: 6f 6d 70 69 6c 65 64 20 53 51 4c 20 73 74 61 74  ompiled SQL stat
be00: 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  ment */.    Tcl_
be10: 4f 62 6a 20 2a 70 41 72 72 61 79 3b 20 20 20 20  Obj *pArray;    
be20: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 72     /* Name of ar
be30: 72 61 79 20 69 6e 74 6f 20 77 68 69 63 68 20 72  ray into which r
be40: 65 73 75 6c 74 73 20 61 72 65 20 77 72 69 74 74  esults are writt
be50: 65 6e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62  en */.    Tcl_Ob
be60: 6a 20 2a 70 53 63 72 69 70 74 3b 20 20 20 20 20  j *pScript;     
be70: 20 2f 2a 20 53 63 72 69 70 74 20 74 6f 20 72 75   /* Script to ru
be80: 6e 20 66 6f 72 20 65 61 63 68 20 72 65 73 75 6c  n for each resul
be90: 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 54 63 6c  t set */.    Tcl
bea0: 5f 4f 62 6a 20 2a 2a 61 70 50 61 72 6d 3b 20 20  _Obj **apParm;  
beb0: 20 20 20 20 2f 2a 20 50 61 72 61 6d 65 74 65 72      /* Parameter
bec0: 73 20 74 68 61 74 20 6e 65 65 64 20 61 20 54 63  s that need a Tc
bed0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 29  l_DecrRefCount()
bee0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 72   */.    int nPar
bef0: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  m;             /
bf00: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * Number of entr
bf10: 69 65 73 20 75 73 65 64 20 69 6e 20 61 70 50 61  ies used in apPa
bf20: 72 6d 5b 5d 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  rm[] */.    Tcl_
bf30: 4f 62 6a 20 2a 61 50 61 72 6d 5b 31 30 5d 3b 20  Obj *aParm[10]; 
bf40: 20 20 20 2f 2a 20 53 74 61 74 69 63 20 73 70 61     /* Static spa
bf50: 63 65 20 66 6f 72 20 61 70 50 61 72 6d 5b 5d 20  ce for apParm[] 
bf60: 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  in the common ca
bf70: 73 65 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62  se */.    Tcl_Ob
bf80: 6a 20 2a 70 52 65 74 3b 20 20 20 20 20 20 20 20  j *pRet;        
bf90: 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 62 65 20   /* Value to be 
bfa0: 72 65 74 75 72 6e 65 64 20 2a 2f 0a 20 20 20 20  returned */.    
bfb0: 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20  SqlPreparedStmt 
bfc0: 2a 70 50 72 65 53 74 6d 74 3b 20 20 2f 2a 20 50  *pPreStmt;  /* P
bfd0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 70 72 65 70  ointer to a prep
bfe0: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a  ared statement *
bff0: 2f 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a  /.    int rc2;..
c000: 20 20 20 20 69 66 28 20 63 68 6f 69 63 65 3d 3d      if( choice==
c010: 44 42 5f 45 56 41 4c 20 29 7b 0a 20 20 20 20 20  DB_EVAL ){.     
c020: 20 69 66 28 20 6f 62 6a 63 3c 33 20 7c 7c 20 6f   if( objc<3 || o
c030: 62 6a 63 3e 35 20 29 7b 0a 20 20 20 20 20 20 20  bjc>5 ){.       
c040: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
c050: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
c060: 76 2c 20 22 53 51 4c 20 3f 41 52 52 41 59 2d 4e  v, "SQL ?ARRAY-N
c070: 41 4d 45 3f 20 3f 53 43 52 49 50 54 3f 22 29 3b  AME? ?SCRIPT?");
c080: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
c090: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
c0a0: 20 7d 0a 20 20 20 20 20 20 70 52 65 74 20 3d 20   }.      pRet = 
c0b0: 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20  Tcl_NewObj();.  
c0c0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
c0d0: 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20  ount(pRet);.    
c0e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
c0f0: 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
c100: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
c110: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
c120: 6f 62 6a 76 2c 20 22 53 51 4c 22 29 3b 0a 20 20  objv, "SQL");.  
c130: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
c140: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
c150: 20 20 20 20 20 20 69 66 28 20 63 68 6f 69 63 65        if( choice
c160: 3d 3d 44 42 5f 45 58 49 53 54 53 20 29 7b 0a 20  ==DB_EXISTS ){. 
c170: 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 54 63         pRet = Tc
c180: 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28  l_NewBooleanObj(
c190: 30 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  0);.        Tcl_
c1a0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 52 65  IncrRefCount(pRe
c1b0: 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
c1c0: 0a 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20  .        pRet = 
c1d0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
c1e0: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33  .    if( objc==3
c1f0: 20 29 7b 0a 20 20 20 20 20 20 70 41 72 72 61 79   ){.      pArray
c200: 20 3d 20 70 53 63 72 69 70 74 20 3d 20 30 3b 0a   = pScript = 0;.
c210: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62      }else if( ob
c220: 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 70  jc==4 ){.      p
c230: 41 72 72 61 79 20 3d 20 30 3b 0a 20 20 20 20 20  Array = 0;.     
c240: 20 70 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b   pScript = objv[
c250: 33 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  3];.    }else{. 
c260: 20 20 20 20 20 70 41 72 72 61 79 20 3d 20 6f 62       pArray = ob
c270: 6a 76 5b 33 5d 3b 0a 20 20 20 20 20 20 69 66 28  jv[3];.      if(
c280: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 70   Tcl_GetString(p
c290: 41 72 72 61 79 29 5b 30 5d 3d 3d 30 20 29 20 70  Array)[0]==0 ) p
c2a0: 41 72 72 61 79 20 3d 20 30 3b 0a 20 20 20 20 20  Array = 0;.     
c2b0: 20 70 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b   pScript = objv[
c2c0: 34 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54  4];.    }..    T
c2d0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
c2e0: 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 7a 53  objv[2]);.    zS
c2f0: 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  ql = Tcl_GetStri
c300: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
c310: 5d 2c 20 30 29 3b 0a 20 20 20 20 77 68 69 6c 65  ], 0);.    while
c320: 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 26 26 20  ( rc==TCL_OK && 
c330: 7a 53 71 6c 5b 30 5d 20 29 7b 0a 20 20 20 20 20  zSql[0] ){.     
c340: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
c350: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
c360: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
c370: 20 20 20 20 20 69 6e 74 20 6e 56 61 72 3b 20 20       int nVar;  
c380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c390: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 69 6e  /* Number of bin
c3a0: 64 20 70 61 72 61 6d 65 74 65 72 73 20 69 6e 20  d parameters in 
c3b0: 74 68 65 20 70 53 74 6d 74 20 2a 2f 0a 20 20 20  the pStmt */.   
c3c0: 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 2d 31     int nCol = -1
c3d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
c3e0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
c3f0: 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
c400: 20 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 54 63   set */.      Tc
c410: 6c 5f 4f 62 6a 20 2a 2a 61 70 43 6f 6c 4e 61 6d  l_Obj **apColNam
c420: 65 20 3d 20 30 3b 20 20 20 2f 2a 20 41 72 72 61  e = 0;   /* Arra
c430: 79 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  y of column name
c440: 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6c  s */.      int l
c450: 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  en;             
c460: 20 20 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20        /* String 
c470: 6c 65 6e 67 74 68 20 6f 66 20 7a 53 71 6c 20 2a  length of zSql *
c480: 2f 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 54 72  /.  .      /* Tr
c490: 79 20 74 6f 20 66 69 6e 64 20 61 20 53 51 4c 20  y to find a SQL 
c4a0: 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 68  statement that h
c4b0: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
c4c0: 63 6f 6d 70 69 6c 65 64 20 61 6e 64 0a 20 20 20  compiled and.   
c4d0: 20 20 20 2a 2a 20 77 68 69 63 68 20 6d 61 74 63     ** which matc
c4e0: 68 65 73 20 74 68 65 20 6e 65 78 74 20 73 65 71  hes the next seq
c4f0: 75 65 6e 63 65 20 6f 66 20 53 51 4c 2e 0a 20 20  uence of SQL..  
c500: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 53 74      */.      pSt
c510: 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 6c 65  mt = 0;.      le
c520: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
c530: 6e 33 30 28 7a 53 71 6c 29 3b 0a 20 20 20 20 20  n30(zSql);.     
c540: 20 66 6f 72 28 70 50 72 65 53 74 6d 74 20 3d 20   for(pPreStmt = 
c550: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 20 70  pDb->stmtList; p
c560: 50 72 65 53 74 6d 74 3b 20 70 50 72 65 53 74 6d  PreStmt; pPreStm
c570: 74 3d 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78  t=pPreStmt->pNex
c580: 74 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  t){.        int 
c590: 6e 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53  n = pPreStmt->nS
c5a0: 71 6c 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ql;.        if( 
c5b0: 6c 65 6e 3e 3d 6e 20 0a 20 20 20 20 20 20 20 20  len>=n .        
c5c0: 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 50      && memcmp(pP
c5d0: 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c 20 7a 53  reStmt->zSql, zS
c5e0: 71 6c 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 20 20  ql, n)==0.      
c5f0: 20 20 20 20 20 20 26 26 20 28 7a 53 71 6c 5b 6e        && (zSql[n
c600: 5d 3d 3d 30 20 7c 7c 20 7a 53 71 6c 5b 6e 2d 31  ]==0 || zSql[n-1
c610: 5d 3d 3d 27 3b 27 29 0a 20 20 20 20 20 20 20 20  ]==';').        
c620: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 53 74  ){.          pSt
c630: 6d 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70  mt = pPreStmt->p
c640: 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Stmt;.          
c650: 7a 4c 65 66 74 20 3d 20 26 7a 53 71 6c 5b 70 50  zLeft = &zSql[pP
c660: 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 5d 3b 0a 0a  reStmt->nSql];..
c670: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65            /* Whe
c680: 6e 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61  n a prepared sta
c690: 74 65 6d 65 6e 74 20 69 73 20 66 6f 75 6e 64 2c  tement is found,
c6a0: 20 75 6e 6c 69 6e 6b 20 69 74 20 66 72 6f 6d 20   unlink it from 
c6b0: 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
c6c0: 20 63 61 63 68 65 20 6c 69 73 74 2e 20 20 49 74   cache list.  It
c6d0: 20 77 69 6c 6c 20 6c 61 74 65 72 20 62 65 20 61   will later be a
c6e0: 64 64 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65  dded back to the
c6f0: 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20   beginning.     
c700: 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 63       ** of the c
c710: 61 63 68 65 20 6c 69 73 74 20 69 6e 20 6f 72 64  ache list in ord
c720: 65 72 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  er to implement 
c730: 4c 52 55 20 72 65 70 6c 61 63 65 6d 65 6e 74 2e  LRU replacement.
c740: 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
c750: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65          if( pPre
c760: 53 74 6d 74 2d 3e 70 50 72 65 76 20 29 7b 0a 20  Stmt->pPrev ){. 
c770: 20 20 20 20 20 20 20 20 20 20 20 70 50 72 65 53             pPreS
c780: 74 6d 74 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  tmt->pPrev->pNex
c790: 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e  t = pPreStmt->pN
c7a0: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ext;.          }
c7b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
c7c0: 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20    pDb->stmtList 
c7d0: 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78  = pPreStmt->pNex
c7e0: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
c7f0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72           if( pPr
c800: 65 53 74 6d 74 2d 3e 70 4e 65 78 74 20 29 7b 0a  eStmt->pNext ){.
c810: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 72 65              pPre
c820: 53 74 6d 74 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  Stmt->pNext->pPr
c830: 65 76 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70  ev = pPreStmt->p
c840: 50 72 65 76 3b 0a 20 20 20 20 20 20 20 20 20 20  Prev;.          
c850: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
c860: 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74     pDb->stmtLast
c870: 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72   = pPreStmt->pPr
c880: 65 76 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ev;.          }.
c890: 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 6e            pDb->n
c8a0: 53 74 6d 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20  Stmt--;.        
c8b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
c8c0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20   }.      }.  .  
c8d0: 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 70 72 65      /* If no pre
c8e0: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
c8f0: 77 61 73 20 66 6f 75 6e 64 2e 20 20 43 6f 6d 70  was found.  Comp
c900: 69 6c 65 20 74 68 65 20 53 51 4c 20 74 65 78 74  ile the SQL text
c910: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
c920: 69 66 28 20 70 53 74 6d 74 3d 3d 30 20 29 7b 0a  if( pStmt==0 ){.
c930: 20 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49          if( SQLI
c940: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 70  TE_OK!=sqlite3_p
c950: 72 65 70 61 72 65 5f 76 32 28 70 44 62 2d 3e 64  repare_v2(pDb->d
c960: 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
c970: 74 6d 74 2c 20 26 7a 4c 65 66 74 29 20 29 7b 0a  tmt, &zLeft) ){.
c980: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65            Tcl_Se
c990: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
c9a0: 70 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 73  p, dbTextToObj(s
c9b0: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44  qlite3_errmsg(pD
c9c0: 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20 20 20  b->db)));.      
c9d0: 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52      rc = TCL_ERR
c9e0: 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  OR;.          br
c9f0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
ca00: 20 20 20 20 20 20 20 69 66 28 20 70 53 74 6d 74         if( pStmt
ca10: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
ca20: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
ca30: 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
ca40: 70 44 62 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20  pDb->db) ){.    
ca50: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6d          /* A com
ca60: 70 69 6c 65 2d 74 69 6d 65 20 65 72 72 6f 72 20  pile-time error 
ca70: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
ca80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
ca90: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
caa0: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
cab0: 65 72 70 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a  erp, dbTextToObj
cac0: 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28  (sqlite3_errmsg(
cad0: 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20  pDb->db)));.    
cae0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c          rc = TCL
caf0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
cb00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
cb10: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
cb20: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
cb30: 74 61 74 65 6d 65 6e 74 20 77 61 73 20 61 20 6e  tatement was a n
cb40: 6f 2d 6f 70 2e 20 20 43 6f 6e 74 69 6e 75 65 20  o-op.  Continue 
cb50: 74 6f 20 74 68 65 20 6e 65 78 74 20 73 74 61 74  to the next stat
cb60: 65 6d 65 6e 74 0a 20 20 20 20 20 20 20 20 20 20  ement.          
cb70: 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c 20    ** in the SQL 
cb80: 73 74 72 69 6e 67 2e 0a 20 20 20 20 20 20 20 20  string..        
cb90: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
cba0: 20 20 20 7a 53 71 6c 20 3d 20 7a 4c 65 66 74 3b     zSql = zLeft;
cbb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
cbc0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
cbd0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
cbe0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72       assert( pPr
cbf0: 65 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20  eStmt==0 );.    
cc00: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 42 69    }..      /* Bi
cc10: 6e 64 20 76 61 6c 75 65 73 20 74 6f 20 70 61 72  nd values to par
cc20: 61 6d 65 74 65 72 73 20 74 68 61 74 20 62 65 67  ameters that beg
cc30: 69 6e 20 77 69 74 68 20 24 20 6f 72 20 3a 0a 20  in with $ or :. 
cc40: 20 20 20 20 20 2a 2f 20 20 0a 20 20 20 20 20 20       */  .      
cc50: 6e 56 61 72 20 3d 20 73 71 6c 69 74 65 33 5f 62  nVar = sqlite3_b
cc60: 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f  ind_parameter_co
cc70: 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  unt(pStmt);.    
cc80: 20 20 6e 50 61 72 6d 20 3d 20 30 3b 0a 20 20 20    nParm = 0;.   
cc90: 20 20 20 69 66 28 20 6e 56 61 72 3e 73 69 7a 65     if( nVar>size
cca0: 6f 66 28 61 50 61 72 6d 29 2f 73 69 7a 65 6f 66  of(aParm)/sizeof
ccb0: 28 61 50 61 72 6d 5b 30 5d 29 20 29 7b 0a 20 20  (aParm[0]) ){.  
ccc0: 20 20 20 20 20 20 61 70 50 61 72 6d 20 3d 20 28        apParm = (
ccd0: 54 63 6c 5f 4f 62 6a 2a 2a 29 54 63 6c 5f 41 6c  Tcl_Obj**)Tcl_Al
cce0: 6c 6f 63 28 6e 56 61 72 2a 73 69 7a 65 6f 66 28  loc(nVar*sizeof(
ccf0: 61 70 50 61 72 6d 5b 30 5d 29 29 3b 0a 20 20 20  apParm[0]));.   
cd00: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
cd10: 20 20 61 70 50 61 72 6d 20 3d 20 61 50 61 72 6d    apParm = aParm
cd20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
cd30: 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 56 61 72  for(i=1; i<=nVar
cd40: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
cd50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 72  const char *zVar
cd60: 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
cd70: 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 70  parameter_name(p
cd80: 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Stmt, i);.      
cd90: 20 20 69 66 28 20 7a 56 61 72 21 3d 30 20 26 26    if( zVar!=0 &&
cda0: 20 28 7a 56 61 72 5b 30 5d 3d 3d 27 24 27 20 7c   (zVar[0]=='$' |
cdb0: 7c 20 7a 56 61 72 5b 30 5d 3d 3d 27 3a 27 20 7c  | zVar[0]==':' |
cdc0: 7c 20 7a 56 61 72 5b 30 5d 3d 3d 27 40 27 29 20  | zVar[0]=='@') 
cdd0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  ){.          Tcl
cde0: 5f 4f 62 6a 20 2a 70 56 61 72 20 3d 20 54 63 6c  _Obj *pVar = Tcl
cdf0: 5f 47 65 74 56 61 72 32 45 78 28 69 6e 74 65 72  _GetVar2Ex(inter
ce00: 70 2c 20 26 7a 56 61 72 5b 31 5d 2c 20 30 2c 20  p, &zVar[1], 0, 
ce10: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  0);.          if
ce20: 28 20 70 56 61 72 20 29 7b 0a 20 20 20 20 20 20  ( pVar ){.      
ce30: 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
ce40: 20 20 20 20 20 20 20 20 20 75 38 20 2a 64 61 74           u8 *dat
ce50: 61 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  a;.            c
ce60: 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 70 56 61  har *zType = pVa
ce70: 72 2d 3e 74 79 70 65 50 74 72 20 3f 20 70 56 61  r->typePtr ? pVa
ce80: 72 2d 3e 74 79 70 65 50 74 72 2d 3e 6e 61 6d 65  r->typePtr->name
ce90: 20 3a 20 22 22 3b 0a 20 20 20 20 20 20 20 20 20   : "";.         
cea0: 20 20 20 63 68 61 72 20 63 20 3d 20 7a 54 79 70     char c = zTyp
ceb0: 65 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  e[0];.          
cec0: 20 20 69 66 28 20 7a 56 61 72 5b 30 5d 3d 3d 27    if( zVar[0]=='
ced0: 40 27 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  @' ||.          
cee0: 20 20 20 20 20 28 63 3d 3d 27 62 27 20 26 26 20       (c=='b' && 
cef0: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 62 79  strcmp(zType,"by
cf00: 74 65 61 72 72 61 79 22 29 3d 3d 30 20 26 26 20  tearray")==0 && 
cf10: 70 56 61 72 2d 3e 62 79 74 65 73 3d 3d 30 29 20  pVar->bytes==0) 
cf20: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
cf30: 20 2f 2a 20 4c 6f 61 64 20 61 20 42 4c 4f 42 20   /* Load a BLOB 
cf40: 74 79 70 65 20 69 66 20 74 68 65 20 54 63 6c 20  type if the Tcl 
cf50: 76 61 72 69 61 62 6c 65 20 69 73 20 61 20 62 79  variable is a by
cf60: 74 65 61 72 72 61 79 20 61 6e 64 0a 20 20 20 20  tearray and.    
cf70: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20            ** it 
cf80: 68 61 73 20 6e 6f 20 73 74 72 69 6e 67 20 72 65  has no string re
cf90: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 72 20  presentation or 
cfa0: 74 68 65 20 68 6f 73 74 0a 20 20 20 20 20 20 20  the host.       
cfb0: 20 20 20 20 20 20 20 2a 2a 20 70 61 72 61 6d 65         ** parame
cfc0: 74 65 72 20 6e 61 6d 65 20 62 65 67 69 6e 73 20  ter name begins 
cfd0: 77 69 74 68 20 22 40 22 2e 20 2a 2f 0a 20 20 20  with "@". */.   
cfe0: 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 20             data 
cff0: 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  = Tcl_GetByteArr
d000: 61 79 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20  ayFromObj(pVar, 
d010: 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  &n);.           
d020: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
d030: 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69 2c 20 64  blob(pStmt, i, d
d040: 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 53  ata, n, SQLITE_S
d050: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20  TATIC);.        
d060: 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65        Tcl_IncrRe
d070: 66 43 6f 75 6e 74 28 70 56 61 72 29 3b 0a 20 20  fCount(pVar);.  
d080: 20 20 20 20 20 20 20 20 20 20 20 20 61 70 50 61              apPa
d090: 72 6d 5b 6e 50 61 72 6d 2b 2b 5d 20 3d 20 70 56  rm[nParm++] = pV
d0a0: 61 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ar;.            
d0b0: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 62 27  }else if( c=='b'
d0c0: 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65   && strcmp(zType
d0d0: 2c 22 62 6f 6f 6c 65 61 6e 22 29 3d 3d 30 20 29  ,"boolean")==0 )
d0e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
d0f0: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
d100: 6a 28 69 6e 74 65 72 70 2c 20 70 56 61 72 2c 20  j(interp, pVar, 
d110: 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  &n);.           
d120: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
d130: 69 6e 74 28 70 53 74 6d 74 2c 20 69 2c 20 6e 29  int(pStmt, i, n)
d140: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
d150: 6c 73 65 20 69 66 28 20 63 3d 3d 27 64 27 20 26  lse if( c=='d' &
d160: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
d170: 64 6f 75 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20  double")==0 ){. 
d180: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 6f 75               dou
d190: 62 6c 65 20 72 3b 0a 20 20 20 20 20 20 20 20 20  ble r;.         
d1a0: 20 20 20 20 20 54 63 6c 5f 47 65 74 44 6f 75 62       Tcl_GetDoub
d1b0: 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  leFromObj(interp
d1c0: 2c 20 70 56 61 72 2c 20 26 72 29 3b 0a 20 20 20  , pVar, &r);.   
d1d0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
d1e0: 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28 70  e3_bind_double(p
d1f0: 53 74 6d 74 2c 20 69 2c 20 72 29 3b 0a 20 20 20  Stmt, i, r);.   
d200: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
d210: 66 28 20 28 63 3d 3d 27 77 27 20 26 26 20 73 74  f( (c=='w' && st
d220: 72 63 6d 70 28 7a 54 79 70 65 2c 22 77 69 64 65  rcmp(zType,"wide
d230: 49 6e 74 22 29 3d 3d 30 29 20 7c 7c 0a 20 20 20  Int")==0) ||.   
d240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
d250: 63 3d 3d 27 69 27 20 26 26 20 73 74 72 63 6d 70  c=='i' && strcmp
d260: 28 7a 54 79 70 65 2c 22 69 6e 74 22 29 3d 3d 30  (zType,"int")==0
d270: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
d280: 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 76     Tcl_WideInt v
d290: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
d2a0: 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72  Tcl_GetWideIntFr
d2b0: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 56  omObj(interp, pV
d2c0: 61 72 2c 20 26 76 29 3b 0a 20 20 20 20 20 20 20  ar, &v);.       
d2d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
d2e0: 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c  ind_int64(pStmt,
d2f0: 20 69 2c 20 76 29 3b 0a 20 20 20 20 20 20 20 20   i, v);.        
d300: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d310: 20 20 20 20 20 20 20 20 20 64 61 74 61 20 3d 20           data = 
d320: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
d330: 29 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72  )Tcl_GetStringFr
d340: 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b  omObj(pVar, &n);
d350: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
d360: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
d370: 28 70 53 74 6d 74 2c 20 69 2c 20 28 63 68 61 72  (pStmt, i, (char
d380: 20 2a 29 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49   *)data, n, SQLI
d390: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
d3a0: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e            Tcl_In
d3b0: 63 72 52 65 66 43 6f 75 6e 74 28 70 56 61 72 29  crRefCount(pVar)
d3c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
d3d0: 61 70 50 61 72 6d 5b 6e 50 61 72 6d 2b 2b 5d 20  apParm[nParm++] 
d3e0: 3d 20 70 56 61 72 3b 0a 20 20 20 20 20 20 20 20  = pVar;.        
d3f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
d400: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
d410: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
d420: 6e 75 6c 6c 28 20 70 53 74 6d 74 2c 20 69 20 29  null( pStmt, i )
d430: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
d440: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
d450: 0a 20 20 20 20 20 20 2f 2a 20 45 78 65 63 75 74  .      /* Execut
d460: 65 20 74 68 65 20 53 51 4c 0a 20 20 20 20 20 20  e the SQL.      
d470: 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  */.      while( 
d480: 72 63 3d 3d 54 43 4c 5f 4f 4b 20 26 26 20 70 53  rc==TCL_OK && pS
d490: 74 6d 74 20 26 26 20 53 51 4c 49 54 45 5f 52 4f  tmt && SQLITE_RO
d4a0: 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
d4b0: 70 53 74 6d 74 29 20 29 7b 0a 0a 09 2f 2a 20 43  pStmt) ){.../* C
d4c0: 6f 6d 70 75 74 65 20 63 6f 6c 75 6d 6e 20 6e 61  ompute column na
d4d0: 6d 65 73 2e 20 54 68 69 73 20 6d 75 73 74 20 62  mes. This must b
d4e0: 65 20 64 6f 6e 65 20 61 66 74 65 72 20 74 68 65  e done after the
d4f0: 20 66 69 72 73 74 20 73 75 63 63 65 73 73 66 75   first successfu
d500: 6c 0a 09 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71  l..** call to sq
d510: 6c 69 74 65 33 5f 73 74 65 70 28 29 2c 20 69 6e  lite3_step(), in
d520: 20 63 61 73 65 20 74 68 65 20 71 75 65 72 79 20   case the query 
d530: 69 73 20 72 65 63 6f 6d 70 69 6c 65 64 20 61 6e  is recompiled an
d540: 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  d the.        **
d550: 20 6e 75 6d 62 65 72 20 6f 72 20 6e 61 6d 65 73   number or names
d560: 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65 64   of the returned
d570: 20 63 6f 6c 75 6d 6e 73 20 63 68 61 6e 67 65 73   columns changes
d580: 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  . .        */.  
d590: 20 20 20 20 20 20 61 73 73 65 72 74 28 21 70 41        assert(!pA
d5a0: 72 72 61 79 7c 7c 70 53 63 72 69 70 74 29 3b 0a  rray||pScript);.
d5b0: 20 20 20 20 20 20 20 20 69 66 20 28 6e 43 6f 6c          if (nCol
d5c0: 20 3c 20 30 29 20 7b 0a 20 20 20 20 20 20 20 20   < 0) {.        
d5d0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 2a 61 70 20    Tcl_Obj ***ap 
d5e0: 3d 20 28 70 53 63 72 69 70 74 3f 26 61 70 43 6f  = (pScript?&apCo
d5f0: 6c 4e 61 6d 65 3a 30 29 3b 0a 20 20 20 20 20 20  lName:0);.      
d600: 20 20 20 20 6e 43 6f 6c 20 3d 20 63 6f 6d 70 75      nCol = compu
d610: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 69 6e  teColumnNames(in
d620: 74 65 72 70 2c 20 70 53 74 6d 74 2c 20 61 70 2c  terp, pStmt, ap,
d630: 20 70 41 72 72 61 79 29 3b 0a 20 20 20 20 20 20   pArray);.      
d640: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 66 6f 72    }..        for
d650: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
d660: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63  +){.          Tc
d670: 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b 0a 20 20 20  l_Obj *pVal;.   
d680: 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
d690: 20 20 2f 2a 20 53 65 74 20 70 56 61 6c 20 74 6f    /* Set pVal to
d6a0: 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 69 27 74   contain the i't
d6b0: 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 69 73  h column of this
d6c0: 20 72 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 20   row. */.       
d6d0: 20 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74     switch( sqlit
d6e0: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70  e3_column_type(p
d6f0: 53 74 6d 74 2c 20 69 29 20 29 7b 0a 20 20 20 20  Stmt, i) ){.    
d700: 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
d710: 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20  ITE_BLOB: {.    
d720: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 62 79            int by
d730: 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  tes = sqlite3_co
d740: 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74  lumn_bytes(pStmt
d750: 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , i);.          
d760: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
d770: 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f  zBlob = sqlite3_
d780: 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d  column_blob(pStm
d790: 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20  t, i);.         
d7a0: 20 20 20 20 20 69 66 28 20 21 7a 42 6c 6f 62 20       if( !zBlob 
d7b0: 29 20 62 79 74 65 73 20 3d 20 30 3b 0a 20 20 20  ) bytes = 0;.   
d7c0: 20 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20             pVal 
d7d0: 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72  = Tcl_NewByteArr
d7e0: 61 79 4f 62 6a 28 28 75 38 2a 29 7a 42 6c 6f 62  ayObj((u8*)zBlob
d7f0: 2c 20 62 79 74 65 73 29 3b 0a 20 20 20 20 20 20  , bytes);.      
d800: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
d810: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
d820: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51           case SQ
d830: 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a  LITE_INTEGER: {.
d840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
d850: 6c 69 74 65 5f 69 6e 74 36 34 20 76 20 3d 20 73  lite_int64 v = s
d860: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
d870: 74 36 34 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20  t64(pStmt, i);. 
d880: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
d890: 20 76 3e 3d 2d 32 31 34 37 34 38 33 36 34 37 20   v>=-2147483647 
d8a0: 26 26 20 76 3c 3d 32 31 34 37 34 38 33 36 34 37  && v<=2147483647
d8b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
d8c0: 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e      pVal = Tcl_N
d8d0: 65 77 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20  ewIntObj(v);.   
d8e0: 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
d8f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
d900: 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77    pVal = Tcl_New
d910: 57 69 64 65 49 6e 74 4f 62 6a 28 76 29 3b 0a 20  WideIntObj(v);. 
d920: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
d930: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
d940: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
d950: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61  }.            ca
d960: 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a  se SQLITE_FLOAT:
d970: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
d980: 20 64 6f 75 62 6c 65 20 72 20 3d 20 73 71 6c 69   double r = sqli
d990: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c  te3_column_doubl
d9a0: 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20  e(pStmt, i);.   
d9b0: 20 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20             pVal 
d9c0: 3d 20 54 63 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f  = Tcl_NewDoubleO
d9d0: 62 6a 28 72 29 3b 0a 20 20 20 20 20 20 20 20 20  bj(r);.         
d9e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d9f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
da00: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
da10: 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  E_NULL: {.      
da20: 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 64          pVal = d
da30: 62 54 65 78 74 54 6f 4f 62 6a 28 70 44 62 2d 3e  bTextToObj(pDb->
da40: 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  zNull);.        
da50: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
da60: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
da70: 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20         default: 
da80: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
da90: 70 56 61 6c 20 3d 20 64 62 54 65 78 74 54 6f 4f  pVal = dbTextToO
daa0: 62 6a 28 28 63 68 61 72 20 2a 29 73 71 6c 69 74  bj((char *)sqlit
dab0: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
dac0: 53 74 6d 74 2c 20 69 29 29 3b 0a 20 20 20 20 20  Stmt, i));.     
dad0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
dae0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
daf0: 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20          }.  .   
db00: 20 20 20 20 20 20 20 69 66 28 20 70 53 63 72 69         if( pScri
db10: 70 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  pt ){.          
db20: 20 20 69 66 28 20 70 41 72 72 61 79 3d 3d 30 20    if( pArray==0 
db30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
db40: 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28   Tcl_ObjSetVar2(
db50: 69 6e 74 65 72 70 2c 20 61 70 43 6f 6c 4e 61 6d  interp, apColNam
db60: 65 5b 69 5d 2c 20 30 2c 20 70 56 61 6c 2c 20 30  e[i], 0, pVal, 0
db70: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
db80: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
db90: 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61      Tcl_ObjSetVa
dba0: 72 32 28 69 6e 74 65 72 70 2c 20 70 41 72 72 61  r2(interp, pArra
dbb0: 79 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 2c  y, apColName[i],
dbc0: 20 70 56 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20   pVal, 0);.     
dbd0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
dbe0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 68 6f     }else if( cho
dbf0: 69 63 65 3d 3d 44 42 5f 4f 4e 45 43 4f 4c 55 4d  ice==DB_ONECOLUM
dc00: 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  N ){.           
dc10: 20 61 73 73 65 72 74 28 20 70 52 65 74 3d 3d 30   assert( pRet==0
dc20: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
dc30: 69 66 28 20 70 52 65 74 3d 3d 30 20 29 7b 0a 20  if( pRet==0 ){. 
dc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 52 65               pRe
dc50: 74 20 3d 20 70 56 61 6c 3b 0a 20 20 20 20 20 20  t = pVal;.      
dc60: 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72          Tcl_Incr
dc70: 52 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a  RefCount(pRet);.
dc80: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
dc90: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 54            rc = T
dca0: 43 4c 5f 42 52 45 41 4b 3b 0a 20 20 20 20 20 20  CL_BREAK;.      
dcb0: 20 20 20 20 20 20 69 20 3d 20 6e 43 6f 6c 3b 0a        i = nCol;.
dcc0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
dcd0: 69 66 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f 45  if( choice==DB_E
dce0: 58 49 53 54 53 20 29 7b 0a 20 20 20 20 20 20 20  XISTS ){.       
dcf0: 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
dd00: 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20  Count(pRet);.   
dd10: 20 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20           pRet = 
dd20: 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62  Tcl_NewBooleanOb
dd30: 6a 28 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  j(1);.          
dd40: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
dd50: 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20  nt(pRet);.      
dd60: 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 42        rc = TCL_B
dd70: 52 45 41 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  REAK;.          
dd80: 20 20 69 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20    i = nCol;.    
dd90: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
dda0: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4c 69 73           Tcl_Lis
ddb0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
ddc0: 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20  t(interp, pRet, 
ddd0: 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  pVal);.         
dde0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 0a   }.        }.  .
ddf0: 20 20 20 20 20 20 20 20 69 66 28 20 70 53 63 72          if( pScr
de00: 69 70 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ipt ){.         
de10: 20 70 44 62 2d 3e 6e 53 74 65 70 20 3d 20 73 71   pDb->nStep = sq
de20: 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75  lite3_stmt_statu
de30: 73 28 70 53 74 6d 74 2c 20 0a 20 20 20 20 20 20  s(pStmt, .      
de40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de50: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
de60: 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55  TE_STMTSTATUS_FU
de70: 4c 4c 53 43 41 4e 5f 53 54 45 50 2c 20 30 29 3b  LLSCAN_STEP, 0);
de80: 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e  .          pDb->
de90: 6e 53 6f 72 74 20 3d 20 73 71 6c 69 74 65 33 5f  nSort = sqlite3_
dea0: 73 74 6d 74 5f 73 74 61 74 75 73 28 70 53 74 6d  stmt_status(pStm
deb0: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
dec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ded0: 20 20 20 20 20 53 51 4c 49 54 45 5f 53 54 4d 54       SQLITE_STMT
dee0: 53 54 41 54 55 53 5f 53 4f 52 54 2c 20 30 29 3b  STATUS_SORT, 0);
def0: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
df00: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e  Tcl_EvalObjEx(in
df10: 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20 30  terp, pScript, 0
df20: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
df30: 20 72 63 3d 3d 54 43 4c 5f 43 4f 4e 54 49 4e 55   rc==TCL_CONTINU
df40: 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  E ){.           
df50: 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20   rc = TCL_OK;.  
df60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
df70: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
df80: 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 42 52    if( rc==TCL_BR
df90: 45 41 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  EAK ){.        r
dfa0: 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20  c = TCL_OK;.    
dfb0: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 72    }..      /* Fr
dfc0: 65 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ee the column na
dfd0: 6d 65 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20  me objects */.  
dfe0: 20 20 20 20 69 66 28 20 70 53 63 72 69 70 74 20      if( pScript 
dff0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
e000: 20 74 68 65 20 71 75 65 72 79 20 72 65 74 75 72   the query retur
e010: 6e 65 64 20 6e 6f 20 72 6f 77 73 2c 20 62 75 74  ned no rows, but
e020: 20 61 6e 20 61 72 72 61 79 20 76 61 72 69 61 62   an array variab
e030: 6c 65 20 77 61 73 20 0a 20 20 20 20 20 20 20 20  le was .        
e040: 2a 2a 20 73 70 65 63 69 66 69 65 64 2c 20 63 61  ** specified, ca
e050: 6c 6c 20 63 6f 6d 70 75 74 65 43 6f 6c 75 6d 6e  ll computeColumn
e060: 4e 61 6d 65 73 28 29 20 6e 6f 77 20 74 6f 20 70  Names() now to p
e070: 6f 70 75 6c 61 74 65 20 74 68 65 20 0a 20 20 20  opulate the .   
e080: 20 20 20 20 20 2a 2a 20 61 72 72 61 79 6e 61 6d       ** arraynam
e090: 65 28 2a 29 20 76 61 72 69 61 62 6c 65 2e 0a 20  e(*) variable.. 
e0a0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
e0b0: 20 20 69 66 20 28 70 41 72 72 61 79 20 26 26 20    if (pArray && 
e0c0: 6e 43 6f 6c 20 3c 20 30 29 20 7b 0a 20 20 20 20  nCol < 0) {.    
e0d0: 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a        Tcl_Obj **
e0e0: 2a 61 70 20 3d 20 28 70 53 63 72 69 70 74 3f 26  *ap = (pScript?&
e0f0: 61 70 43 6f 6c 4e 61 6d 65 3a 30 29 3b 0a 20 20  apColName:0);.  
e100: 20 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 63          nCol = c
e110: 6f 6d 70 75 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  omputeColumnName
e120: 73 28 69 6e 74 65 72 70 2c 20 70 53 74 6d 74 2c  s(interp, pStmt,
e130: 20 61 70 2c 20 70 41 72 72 61 79 29 3b 0a 20 20   ap, pArray);.  
e140: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e150: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
e160: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
e170: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
e180: 74 28 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b  t(apColName[i]);
e190: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e1a0: 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61     Tcl_Free((cha
e1b0: 72 2a 29 61 70 43 6f 6c 4e 61 6d 65 29 3b 0a 20  r*)apColName);. 
e1c0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
e1d0: 20 46 72 65 65 20 74 68 65 20 62 6f 75 6e 64 20   Free the bound 
e1e0: 73 74 72 69 6e 67 20 61 6e 64 20 62 6c 6f 62 20  string and blob 
e1f0: 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20  parameters */.  
e200: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
e210: 50 61 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Parm; i++){.    
e220: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
e230: 6f 75 6e 74 28 61 70 50 61 72 6d 5b 69 5d 29 3b  ount(apParm[i]);
e240: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
e250: 66 28 20 61 70 50 61 72 6d 21 3d 61 50 61 72 6d  f( apParm!=aParm
e260: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
e270: 46 72 65 65 28 28 63 68 61 72 2a 29 61 70 50 61  Free((char*)apPa
e280: 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  rm);.      }..  
e290: 20 20 20 20 2f 2a 20 52 65 73 65 74 20 74 68 65      /* Reset the
e2a0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 66 20   statement.  If 
e2b0: 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 20  the result code 
e2c0: 69 73 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41  is SQLITE_SCHEMA
e2d0: 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  , then.      ** 
e2e0: 66 6c 75 73 68 20 74 68 65 20 73 74 61 74 65 6d  flush the statem
e2f0: 65 6e 74 20 63 61 63 68 65 20 61 6e 64 20 74 72  ent cache and tr
e300: 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  y the statement 
e310: 61 67 61 69 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  again..      */.
e320: 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69        rc2 = sqli
e330: 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29  te3_reset(pStmt)
e340: 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 6e 53 74  ;.      pDb->nSt
e350: 65 70 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d  ep = sqlite3_stm
e360: 74 5f 73 74 61 74 75 73 28 70 53 74 6d 74 2c 20  t_status(pStmt, 
e370: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e390: 20 20 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54     SQLITE_STMTST
e3a0: 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54  ATUS_FULLSCAN_ST
e3b0: 45 50 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 44  EP, 1);.      pD
e3c0: 62 2d 3e 6e 53 6f 72 74 20 3d 20 73 71 6c 69 74  b->nSort = sqlit
e3d0: 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70  e3_stmt_status(p
e3e0: 53 74 6d 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Stmt,.          
e3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e400: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53          SQLITE_S
e410: 54 4d 54 53 54 41 54 55 53 5f 53 4f 52 54 2c 20  TMTSTATUS_SORT, 
e420: 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51  1);.      if( SQ
e430: 4c 49 54 45 5f 4f 4b 21 3d 72 63 32 20 29 7b 0a  LITE_OK!=rc2 ){.
e440: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20          /* If a 
e450: 72 75 6e 2d 74 69 6d 65 20 65 72 72 6f 72 20 6f  run-time error o
e460: 63 63 75 72 73 2c 20 72 65 70 6f 72 74 20 74 68  ccurs, report th
e470: 65 20 65 72 72 6f 72 20 61 6e 64 20 73 74 6f 70  e error and stop
e480: 20 72 65 61 64 69 6e 67 0a 20 20 20 20 20 20 20   reading.       
e490: 20 2a 2a 20 74 68 65 20 53 51 4c 0a 20 20 20 20   ** the SQL.    
e4a0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 54      */.        T
e4b0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
e4c0: 69 6e 74 65 72 70 2c 20 64 62 54 65 78 74 54 6f  interp, dbTextTo
e4d0: 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 6d  Obj(sqlite3_errm
e4e0: 73 67 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20  sg(pDb->db)));. 
e4f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
e500: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
e510: 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c          rc = TCL
e520: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
e530: 69 66 28 20 70 50 72 65 53 74 6d 74 20 29 20 54  if( pPreStmt ) T
e540: 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70  cl_Free((char*)p
e550: 50 72 65 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  PreStmt);.      
e560: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
e570: 65 6c 73 65 20 69 66 28 20 70 44 62 2d 3e 6d 61  else if( pDb->ma
e580: 78 53 74 6d 74 3c 3d 30 20 29 7b 0a 20 20 20 20  xStmt<=0 ){.    
e590: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61      /* If the ca
e5a0: 63 68 65 20 69 73 20 74 75 72 6e 65 64 20 6f 66  che is turned of
e5b0: 66 2c 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 74  f, deallocated t
e5c0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  he statement */.
e5d0: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65          if( pPre
e5e0: 53 74 6d 74 20 29 20 54 63 6c 5f 46 72 65 65 28  Stmt ) Tcl_Free(
e5f0: 28 63 68 61 72 2a 29 70 50 72 65 53 74 6d 74 29  (char*)pPreStmt)
e600: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
e610: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
e620: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
e630: 20 20 20 20 20 20 20 20 2f 2a 20 45 76 65 72 79          /* Every
e640: 74 68 69 6e 67 20 77 6f 72 6b 65 64 20 61 6e 64  thing worked and
e650: 20 74 68 65 20 63 61 63 68 65 20 69 73 20 6f 70   the cache is op
e660: 65 72 61 74 69 6f 6e 61 6c 2e 0a 20 20 20 20 20  erational..     
e670: 20 20 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e     ** Create a n
e680: 65 77 20 53 71 6c 50 72 65 70 61 72 65 64 53 74  ew SqlPreparedSt
e690: 6d 74 20 73 74 72 75 63 74 75 72 65 20 69 66 20  mt structure if 
e6a0: 77 65 20 6e 65 65 64 20 6f 6e 65 2e 0a 20 20 20  we need one..   
e6b0: 20 20 20 20 20 2a 2a 20 28 49 66 20 77 65 20 61       ** (If we a
e6c0: 6c 72 65 61 64 79 20 68 61 76 65 20 6f 6e 65 20  lready have one 
e6d0: 77 65 20 63 61 6e 20 6a 75 73 74 20 72 65 75 73  we can just reus
e6e0: 65 20 69 74 2e 29 0a 20 20 20 20 20 20 20 20 2a  e it.).        *
e6f0: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  /.        if( pP
e700: 72 65 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20  reStmt==0 ){.   
e710: 20 20 20 20 20 20 20 6c 65 6e 20 3d 20 7a 4c 65         len = zLe
e720: 66 74 20 2d 20 7a 53 71 6c 3b 0a 20 20 20 20 20  ft - zSql;.     
e730: 20 20 20 20 20 70 50 72 65 53 74 6d 74 20 3d 20       pPreStmt = 
e740: 28 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74  (SqlPreparedStmt
e750: 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a  *)Tcl_Alloc( siz
e760: 65 6f 66 28 2a 70 50 72 65 53 74 6d 74 29 20 29  eof(*pPreStmt) )
e770: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
e780: 70 50 72 65 53 74 6d 74 3d 3d 30 20 29 20 72 65  pPreStmt==0 ) re
e790: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
e7a0: 20 20 20 20 20 20 20 20 20 20 70 50 72 65 53 74            pPreSt
e7b0: 6d 74 2d 3e 70 53 74 6d 74 20 3d 20 70 53 74 6d  mt->pStmt = pStm
e7c0: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 72  t;.          pPr
e7d0: 65 53 74 6d 74 2d 3e 6e 53 71 6c 20 3d 20 6c 65  eStmt->nSql = le
e7e0: 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 72  n;.          pPr
e7f0: 65 53 74 6d 74 2d 3e 7a 53 71 6c 20 3d 20 73 71  eStmt->zSql = sq
e800: 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d 74 29  lite3_sql(pStmt)
e810: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
e820: 72 74 28 20 73 71 6c 69 74 65 33 53 74 72 6c 65  rt( sqlite3Strle
e830: 6e 33 30 28 70 50 72 65 53 74 6d 74 2d 3e 7a 53  n30(pPreStmt->zS
e840: 71 6c 29 3d 3d 6c 65 6e 20 29 3b 0a 20 20 20 20  ql)==len );.    
e850: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30 3d        assert( 0=
e860: 3d 6d 65 6d 63 6d 70 28 70 50 72 65 53 74 6d 74  =memcmp(pPreStmt
e870: 2d 3e 7a 53 71 6c 2c 20 7a 53 71 6c 2c 20 6c 65  ->zSql, zSql, le
e880: 6e 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n) );.        }.
e890: 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20  .        /* Add 
e8a0: 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
e8b0: 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 62 65  tement to the be
e8c0: 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63  ginning of the c
e8d0: 61 63 68 65 20 6c 69 73 74 0a 20 20 20 20 20 20  ache list.      
e8e0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 50 72    */.        pPr
e8f0: 65 53 74 6d 74 2d 3e 70 4e 65 78 74 20 3d 20 70  eStmt->pNext = p
e900: 44 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 0a 20 20  Db->stmtList;.  
e910: 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e        pPreStmt->
e920: 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20  pPrev = 0;.     
e930: 20 20 20 69 66 28 20 70 44 62 2d 3e 73 74 6d 74     if( pDb->stmt
e940: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
e950: 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 2d 3e   pDb->stmtList->
e960: 70 50 72 65 76 20 3d 20 70 50 72 65 53 74 6d 74  pPrev = pPreStmt
e970: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e980: 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73      pDb->stmtLis
e990: 74 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20 20  t = pPreStmt;.  
e9a0: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 73        if( pDb->s
e9b0: 74 6d 74 4c 61 73 74 3d 3d 30 20 29 7b 0a 20 20  tmtLast==0 ){.  
e9c0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
e9d0: 70 44 62 2d 3e 6e 53 74 6d 74 3d 3d 30 20 29 3b  pDb->nStmt==0 );
e9e0: 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e  .          pDb->
e9f0: 73 74 6d 74 4c 61 73 74 20 3d 20 70 50 72 65 53  stmtLast = pPreS
ea00: 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  tmt;.        }el
ea10: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
ea20: 73 65 72 74 28 20 70 44 62 2d 3e 6e 53 74 6d 74  sert( pDb->nStmt
ea30: 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  >0 );.        }.
ea40: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 6e 53 74          pDb->nSt
ea50: 6d 74 2b 2b 3b 0a 20 20 20 0a 20 20 20 20 20 20  mt++;.   .      
ea60: 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20    /* If we have 
ea70: 74 6f 6f 20 6d 61 6e 79 20 73 74 61 74 65 6d 65  too many stateme
ea80: 6e 74 20 69 6e 20 63 61 63 68 65 2c 20 72 65 6d  nt in cache, rem
ea90: 6f 76 65 20 74 68 65 20 73 75 72 70 6c 75 73 20  ove the surplus 
eaa0: 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 20 20 20  from the.       
eab0: 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 63   ** end of the c
eac0: 61 63 68 65 20 6c 69 73 74 2e 0a 20 20 20 20 20  ache list..     
ead0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 77 68     */.        wh
eae0: 69 6c 65 28 20 70 44 62 2d 3e 6e 53 74 6d 74 3e  ile( pDb->nStmt>
eaf0: 70 44 62 2d 3e 6d 61 78 53 74 6d 74 20 29 7b 0a  pDb->maxStmt ){.
eb00: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
eb10: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 44 62 2d 3e  3_finalize(pDb->
eb20: 73 74 6d 74 4c 61 73 74 2d 3e 70 53 74 6d 74 29  stmtLast->pStmt)
eb30: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d  ;.          pDb-
eb40: 3e 73 74 6d 74 4c 61 73 74 20 3d 20 70 44 62 2d  >stmtLast = pDb-
eb50: 3e 73 74 6d 74 4c 61 73 74 2d 3e 70 50 72 65 76  >stmtLast->pPrev
eb60: 3b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  ;.          Tcl_
eb70: 46 72 65 65 28 28 63 68 61 72 2a 29 70 44 62 2d  Free((char*)pDb-
eb80: 3e 73 74 6d 74 4c 61 73 74 2d 3e 70 4e 65 78 74  >stmtLast->pNext
eb90: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 62  );.          pDb
eba0: 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70 4e 65 78  ->stmtLast->pNex
ebb0: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
ebc0: 20 70 44 62 2d 3e 6e 53 74 6d 74 2d 2d 3b 0a 20   pDb->nStmt--;. 
ebd0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
ebe0: 0a 0a 20 20 20 20 20 20 2f 2a 20 50 72 6f 63 65  ..      /* Proce
ebf0: 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  ed to the next s
ec00: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
ec10: 20 20 7a 53 71 6c 20 3d 20 7a 4c 65 66 74 3b 0a    zSql = zLeft;.
ec20: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65      }.    Tcl_De
ec30: 63 72 52 65 66 43 6f 75 6e 74 28 6f 62 6a 76 5b  crRefCount(objv[
ec40: 32 5d 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 52  2]);..    if( pR
ec50: 65 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  et ){.      if( 
ec60: 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20  rc==TCL_OK ){.  
ec70: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a        Tcl_SetObj
ec80: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
ec90: 52 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Ret);.      }.  
eca0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
ecb0: 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20  ount(pRet);.    
ecc0: 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 54 43  }else if( rc==TC
ecd0: 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54 63  L_OK ){.      Tc
ece0: 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e  l_ResetResult(in
ecf0: 74 65 72 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20  terp);.    }.   
ed00: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
ed10: 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 66  *.  **     $db f
ed20: 75 6e 63 74 69 6f 6e 20 4e 41 4d 45 20 5b 2d 61  unction NAME [-a
ed30: 72 67 63 6f 75 6e 74 20 4e 5d 20 53 43 52 49 50  rgcount N] SCRIP
ed40: 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65 61  T.  **.  ** Crea
ed50: 74 65 20 61 20 6e 65 77 20 53 51 4c 20 66 75 6e  te a new SQL fun
ed60: 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d  ction called NAM
ed70: 45 2e 20 20 57 68 65 6e 65 76 65 72 20 74 68 61  E.  Whenever tha
ed80: 74 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 20 20  t function is.  
ed90: 2a 2a 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b  ** called, invok
eda0: 65 20 53 43 52 49 50 54 20 74 6f 20 65 76 61 6c  e SCRIPT to eval
edb0: 75 61 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f  uate the functio
edc0: 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  n..  */.  case D
edd0: 42 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  B_FUNCTION: {.  
ede0: 20 20 53 71 6c 46 75 6e 63 20 2a 70 46 75 6e 63    SqlFunc *pFunc
edf0: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  ;.    Tcl_Obj *p
ee00: 53 63 72 69 70 74 3b 0a 20 20 20 20 63 68 61 72  Script;.    char
ee10: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74   *zName;.    int
ee20: 20 6e 41 72 67 20 3d 20 2d 31 3b 0a 20 20 20 20   nArg = -1;.    
ee30: 69 66 28 20 6f 62 6a 63 3d 3d 36 20 29 7b 0a 20  if( objc==6 ){. 
ee40: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
ee50: 2a 7a 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  *z = Tcl_GetStri
ee60: 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 20  ng(objv[3]);.   
ee70: 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74     int n = sqlit
ee80: 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20  e3Strlen30(z);. 
ee90: 20 20 20 20 20 69 66 28 20 6e 3e 32 20 26 26 20       if( n>2 && 
eea0: 73 74 72 6e 63 6d 70 28 7a 2c 20 22 2d 61 72 67  strncmp(z, "-arg
eeb0: 63 6f 75 6e 74 22 2c 6e 29 3d 3d 30 20 29 7b 0a  count",n)==0 ){.
eec0: 20 20 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f          if( Tcl_
eed0: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
eee0: 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26  terp, objv[4], &
eef0: 6e 41 72 67 29 20 29 20 72 65 74 75 72 6e 20 54  nArg) ) return T
ef00: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
ef10: 20 20 69 66 28 20 6e 41 72 67 3c 30 20 29 7b 0a    if( nArg<0 ){.
ef20: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70            Tcl_Ap
ef30: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
ef40: 70 2c 20 22 6e 75 6d 62 65 72 20 6f 66 20 61 72  p, "number of ar
ef50: 67 75 6d 65 6e 74 73 20 6d 75 73 74 20 62 65 20  guments must be 
ef60: 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 22 2c 0a 20  non-negative",. 
ef70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef80: 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
ef90: 29 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  )0);.          r
efa0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
efb0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
efc0: 20 7d 0a 20 20 20 20 20 20 70 53 63 72 69 70 74   }.      pScript
efd0: 20 3d 20 6f 62 6a 76 5b 35 5d 3b 0a 20 20 20 20   = objv[5];.    
efe0: 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 21 3d  }else if( objc!=
eff0: 34 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  4 ){.      Tcl_W
f000: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
f010: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 41  rp, 2, objv, "NA
f020: 4d 45 20 5b 2d 61 72 67 63 6f 75 6e 74 20 4e 5d  ME [-argcount N]
f030: 20 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20   SCRIPT");.     
f040: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
f050: 52 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  R;.    }else{.  
f060: 20 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62      pScript = ob
f070: 6a 76 5b 33 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  jv[3];.    }.   
f080: 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74   zName = Tcl_Get
f090: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
f0a0: 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20 70  jv[2], 0);.    p
f0b0: 46 75 6e 63 20 3d 20 66 69 6e 64 53 71 6c 46 75  Func = findSqlFu
f0c0: 6e 63 28 70 44 62 2c 20 7a 4e 61 6d 65 29 3b 0a  nc(pDb, zName);.
f0d0: 20 20 20 20 69 66 28 20 70 46 75 6e 63 3d 3d 30      if( pFunc==0
f0e0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
f0f0: 52 4f 52 3b 0a 20 20 20 20 69 66 28 20 70 46 75  ROR;.    if( pFu
f100: 6e 63 2d 3e 70 53 63 72 69 70 74 20 29 7b 0a 20  nc->pScript ){. 
f110: 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
f120: 43 6f 75 6e 74 28 70 46 75 6e 63 2d 3e 70 53 63  Count(pFunc->pSc
f130: 72 69 70 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ript);.    }.   
f140: 20 70 46 75 6e 63 2d 3e 70 53 63 72 69 70 74 20   pFunc->pScript 
f150: 3d 20 70 53 63 72 69 70 74 3b 0a 20 20 20 20 54  = pScript;.    T
f160: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
f170: 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20 70 46  pScript);.    pF
f180: 75 6e 63 2d 3e 75 73 65 45 76 61 6c 4f 62 6a 76  unc->useEvalObjv
f190: 20 3d 20 73 61 66 65 54 6f 55 73 65 45 76 61 6c   = safeToUseEval
f1a0: 4f 62 6a 76 28 69 6e 74 65 72 70 2c 20 70 53 63  Objv(interp, pSc
f1b0: 72 69 70 74 29 3b 0a 20 20 20 20 72 63 20 3d 20  ript);.    rc = 
f1c0: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
f1d0: 75 6e 63 74 69 6f 6e 28 70 44 62 2d 3e 64 62 2c  unction(pDb->db,
f1e0: 20 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51   zName, nArg, SQ
f1f0: 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20  LITE_UTF8,.     
f200: 20 20 20 70 46 75 6e 63 2c 20 74 63 6c 53 71 6c     pFunc, tclSql
f210: 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Func, 0, 0);.   
f220: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
f230: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
f240: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
f250: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
f260: 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
f270: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
f280: 44 62 2d 3e 64 62 29 2c 20 54 43 4c 5f 56 4f 4c  Db->db), TCL_VOL
f290: 41 54 49 4c 45 29 3b 0a 20 20 20 20 7d 0a 20 20  ATILE);.    }.  
f2a0: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
f2b0: 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20  /*.  **     $db 
f2c0: 69 6e 63 72 62 6c 6f 62 20 3f 2d 72 65 61 64 6f  incrblob ?-reado
f2d0: 6e 6c 79 3f 20 3f 44 42 3f 20 54 41 42 4c 45 20  nly? ?DB? TABLE 
f2e0: 43 4f 4c 55 4d 4e 20 52 4f 57 49 44 0a 20 20 2a  COLUMN ROWID.  *
f2f0: 2f 0a 20 20 63 61 73 65 20 44 42 5f 49 4e 43 52  /.  case DB_INCR
f300: 42 4c 4f 42 3a 20 7b 0a 23 69 66 64 65 66 20 53  BLOB: {.#ifdef S
f310: 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
f320: 4c 4f 42 0a 20 20 20 20 54 63 6c 5f 41 70 70 65  LOB.    Tcl_Appe
f330: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
f340: 20 22 69 6e 63 72 62 6c 6f 62 20 6e 6f 74 20 61   "incrblob not a
f350: 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 69 73  vailable in this
f360: 20 62 75 69 6c 64 22 2c 20 30 29 3b 0a 20 20 20   build", 0);.   
f370: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
f380: 52 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 6e 74  R;.#else.    int
f390: 20 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20 30 3b   isReadonly = 0;
f3a0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
f3b0: 2a 7a 44 62 20 3d 20 22 6d 61 69 6e 22 3b 0a 20  *zDb = "main";. 
f3c0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
f3d0: 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74  Table;.    const
f3e0: 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 3b 0a   char *zColumn;.
f3f0: 20 20 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34      sqlite_int64
f400: 20 69 52 6f 77 3b 0a 0a 20 20 20 20 2f 2a 20 43   iRow;..    /* C
f410: 68 65 63 6b 20 66 6f 72 20 74 68 65 20 2d 72 65  heck for the -re
f420: 61 64 6f 6e 6c 79 20 6f 70 74 69 6f 6e 20 2a 2f  adonly option */
f430: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20  .    if( objc>3 
f440: 26 26 20 73 74 72 63 6d 70 28 54 63 6c 5f 47 65  && strcmp(Tcl_Ge
f450: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
f460: 2c 20 22 2d 72 65 61 64 6f 6e 6c 79 22 29 3d 3d  , "-readonly")==
f470: 30 20 29 7b 0a 20 20 20 20 20 20 69 73 52 65 61  0 ){.      isRea
f480: 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 7d  donly = 1;.    }
f490: 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ..    if( objc!=
f4a0: 28 35 2b 69 73 52 65 61 64 6f 6e 6c 79 29 20 26  (5+isReadonly) &
f4b0: 26 20 6f 62 6a 63 21 3d 28 36 2b 69 73 52 65 61  & objc!=(6+isRea
f4c0: 64 6f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20  donly) ){.      
f4d0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
f4e0: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
f4f0: 2c 20 22 3f 2d 72 65 61 64 6f 6e 6c 79 3f 20 3f  , "?-readonly? ?
f500: 44 42 3f 20 54 41 42 4c 45 20 43 4f 4c 55 4d 4e  DB? TABLE COLUMN
f510: 20 52 4f 57 49 44 22 29 3b 0a 20 20 20 20 20 20   ROWID");.      
f520: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
f530: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
f540: 20 6f 62 6a 63 3d 3d 28 36 2b 69 73 52 65 61 64   objc==(6+isRead
f550: 6f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 7a  only) ){.      z
f560: 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  Db = Tcl_GetStri
f570: 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20  ng(objv[2]);.   
f580: 20 7d 0a 20 20 20 20 7a 54 61 62 6c 65 20 3d 20   }.    zTable = 
f590: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
f5a0: 6a 76 5b 6f 62 6a 63 2d 33 5d 29 3b 0a 20 20 20  jv[objc-3]);.   
f5b0: 20 7a 43 6f 6c 75 6d 6e 20 3d 20 54 63 6c 5f 47   zColumn = Tcl_G
f5c0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 6f 62  etString(objv[ob
f5d0: 6a 63 2d 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d  jc-2]);.    rc =
f5e0: 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46   Tcl_GetWideIntF
f5f0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
f600: 62 6a 76 5b 6f 62 6a 63 2d 31 5d 2c 20 26 69 52  bjv[objc-1], &iR
f610: 6f 77 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  ow);..    if( rc
f620: 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20  ==TCL_OK ){.    
f630: 20 20 72 63 20 3d 20 63 72 65 61 74 65 49 6e 63    rc = createInc
f640: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 28 0a 20 20  rblobChannel(.  
f650: 20 20 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20          interp, 
f660: 70 44 62 2c 20 7a 44 62 2c 20 7a 54 61 62 6c 65  pDb, zDb, zTable
f670: 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 69 52 6f 77 2c  , zColumn, iRow,
f680: 20 69 73 52 65 61 64 6f 6e 6c 79 0a 20 20 20 20   isReadonly.    
f690: 20 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69    );.    }.#endi
f6a0: 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  f.    break;.  }
f6b0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  /*.  **     
f6c0: 24 64 62 20 69 6e 74 65 72 72 75 70 74 0a 20 20  $db interrupt.  
f6d0: 2a 2a 0a 20 20 2a 2a 20 49 6e 74 65 72 72 75 70  **.  ** Interrup
f6e0: 74 20 74 68 65 20 65 78 65 63 75 74 69 6f 6e 20  t the execution 
f6f0: 6f 66 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73  of the inner-mos
f700: 74 20 53 51 4c 20 69 6e 74 65 72 70 72 65 74 65  t SQL interprete
f710: 72 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 63 61  r.  This.  ** ca
f720: 75 73 65 73 20 74 68 65 20 53 51 4c 20 73 74 61  uses the SQL sta
f730: 74 65 6d 65 6e 74 20 74 6f 20 72 65 74 75 72 6e  tement to return
f740: 20 61 6e 20 65 72 72 6f 72 20 6f 66 20 53 51 4c   an error of SQL
f750: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 2e 0a 20  ITE_INTERRUPT.. 
f760: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 49 4e   */.  case DB_IN
f770: 54 45 52 52 55 50 54 3a 20 7b 0a 20 20 20 20 73  TERRUPT: {.    s
f780: 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74  qlite3_interrupt
f790: 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20 62  (pDb->db);.    b
f7a0: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
f7b0: 20 20 2a 2a 20 20 20 20 20 24 64 62 20 6e 75 6c    **     $db nul
f7c0: 6c 76 61 6c 75 65 20 3f 53 54 52 49 4e 47 3f 0a  lvalue ?STRING?.
f7d0: 20 20 2a 2a 0a 20 20 2a 2a 20 43 68 61 6e 67 65    **.  ** Change
f7e0: 20 74 65 78 74 20 75 73 65 64 20 77 68 65 6e 20   text used when 
f7f0: 61 20 4e 55 4c 4c 20 63 6f 6d 65 73 20 62 61 63  a NULL comes bac
f800: 6b 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  k from the datab
f810: 61 73 65 2e 20 49 66 20 3f 53 54 52 49 4e 47 3f  ase. If ?STRING?
f820: 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 72 65  .  ** is not pre
f830: 73 65 6e 74 2c 20 74 68 65 6e 20 74 68 65 20 63  sent, then the c
f840: 75 72 72 65 6e 74 20 73 74 72 69 6e 67 20 75 73  urrent string us
f850: 65 64 20 66 6f 72 20 4e 55 4c 4c 20 69 73 20 72  ed for NULL is r
f860: 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2a 20 49 66  eturned..  ** If
f870: 20 53 54 52 49 4e 47 20 69 73 20 70 72 65 73 65   STRING is prese
f880: 6e 74 2c 20 74 68 65 6e 20 53 54 52 49 4e 47 20  nt, then STRING 
f890: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a  is returned..  *
f8a0: 2a 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  *.  */.  case DB
f8b0: 5f 4e 55 4c 4c 56 41 4c 55 45 3a 20 7b 0a 20 20  _NULLVALUE: {.  
f8c0: 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26 26    if( objc!=2 &&
f8d0: 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
f8e0: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
f8f0: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
f900: 6a 76 2c 20 22 4e 55 4c 4c 56 41 4c 55 45 22 29  jv, "NULLVALUE")
f910: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
f920: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
f930: 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20      if( objc==3 
f940: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  ){.      int len
f950: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e  ;.      char *zN
f960: 75 6c 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ull = Tcl_GetStr
f970: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
f980: 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20  2], &len);.     
f990: 20 69 66 28 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20   if( pDb->zNull 
f9a0: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46  ){.        Tcl_F
f9b0: 72 65 65 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29 3b  ree(pDb->zNull);
f9c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
f9d0: 66 28 20 7a 4e 75 6c 6c 20 26 26 20 6c 65 6e 3e  f( zNull && len>
f9e0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  0 ){.        pDb
f9f0: 2d 3e 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 41 6c  ->zNull = Tcl_Al
fa00: 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a  loc( len + 1 );.
fa10: 20 20 20 20 20 20 20 20 73 74 72 6e 63 70 79 28          strncpy(
fa20: 70 44 62 2d 3e 7a 4e 75 6c 6c 2c 20 7a 4e 75 6c  pDb->zNull, zNul
fa30: 6c 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 20 20 20  l, len);.       
fa40: 20 70 44 62 2d 3e 7a 4e 75 6c 6c 5b 6c 65 6e 5d   pDb->zNull[len]
fa50: 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 7d   = '\0';.      }
fa60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44  else{.        pD
fa70: 62 2d 3e 7a 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20  b->zNull = 0;.  
fa80: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
fa90: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
faa0: 28 69 6e 74 65 72 70 2c 20 64 62 54 65 78 74 54  (interp, dbTextT
fab0: 6f 4f 62 6a 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29  oObj(pDb->zNull)
fac0: 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
fad0: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
fae0: 20 24 64 62 20 6c 61 73 74 5f 69 6e 73 65 72 74   $db last_insert
faf0: 5f 72 6f 77 69 64 20 0a 20 20 2a 2a 0a 20 20 2a  _rowid .  **.  *
fb00: 2a 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65  * Return an inte
fb10: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
fb20: 20 52 4f 57 49 44 20 66 6f 72 20 74 68 65 20 6d   ROWID for the m
fb30: 6f 73 74 20 72 65 63 65 6e 74 20 69 6e 73 65 72  ost recent inser
fb40: 74 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  t..  */.  case D
fb50: 42 5f 4c 41 53 54 5f 49 4e 53 45 52 54 5f 52 4f  B_LAST_INSERT_RO
fb60: 57 49 44 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f  WID: {.    Tcl_O
fb70: 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20  bj *pResult;.   
fb80: 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 72 6f 77   Tcl_WideInt row
fb90: 69 64 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  id;.    if( objc
fba0: 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=2 ){.      Tcl
fbb0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
fbc0: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
fbd0: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
fbe0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
fbf0: 7d 0a 20 20 20 20 72 6f 77 69 64 20 3d 20 73 71  }.    rowid = sq
fc00: 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72  lite3_last_inser
fc10: 74 5f 72 6f 77 69 64 28 70 44 62 2d 3e 64 62 29  t_rowid(pDb->db)
fc20: 3b 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20  ;.    pResult = 
fc30: 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_GetObjResult
fc40: 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63  (interp);.    Tc
fc50: 6c 5f 53 65 74 57 69 64 65 49 6e 74 4f 62 6a 28  l_SetWideIntObj(
fc60: 70 52 65 73 75 6c 74 2c 20 72 6f 77 69 64 29 3b  pResult, rowid);
fc70: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
fc80: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 44  .  /*.  ** The D
fc90: 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 20 6d 65 74 68  B_ONECOLUMN meth
fca0: 6f 64 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  od is implemente
fcb0: 64 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 20  d together with 
fcc0: 44 42 5f 45 56 41 4c 2e 0a 20 20 2a 2f 0a 0a 20  DB_EVAL..  */.. 
fcd0: 20 2f 2a 20 20 20 20 24 64 62 20 70 72 6f 67 72   /*    $db progr
fce0: 65 73 73 20 3f 4e 20 43 41 4c 4c 42 41 43 4b 3f  ess ?N CALLBACK?
fcf0: 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 49 6e 76 6f  .  ** .  ** Invo
fd00: 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c  ke the given cal
fd10: 6c 62 61 63 6b 20 65 76 65 72 79 20 4e 20 76 69  lback every N vi
fd20: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 6f 70  rtual machine op
fd30: 63 6f 64 65 73 20 77 68 69 6c 65 20 65 78 65 63  codes while exec
fd40: 75 74 69 6e 67 0a 20 20 2a 2a 20 71 75 65 72 69  uting.  ** queri
fd50: 65 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  es..  */.  case 
fd60: 44 42 5f 50 52 4f 47 52 45 53 53 3a 20 7b 0a 20  DB_PROGRESS: {. 
fd70: 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29     if( objc==2 )
fd80: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  {.      if( pDb-
fd90: 3e 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20  >zProgress ){.  
fda0: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
fdb0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
fdc0: 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 2c 20 30  Db->zProgress, 0
fdd0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
fde0: 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 34  else if( objc==4
fdf0: 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
fe00: 7a 50 72 6f 67 72 65 73 73 3b 0a 20 20 20 20 20  zProgress;.     
fe10: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20   int len;.      
fe20: 69 6e 74 20 4e 3b 0a 20 20 20 20 20 20 69 66 28  int N;.      if(
fe30: 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74   TCL_OK!=Tcl_Get
fe40: 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
fe50: 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 4e 29 20  p, objv[2], &N) 
fe60: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
fe70: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
fe80: 20 20 20 7d 3b 0a 20 20 20 20 20 20 69 66 28 20     };.      if( 
fe90: 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29  pDb->zProgress )
fea0: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72  {.        Tcl_Fr
feb0: 65 65 28 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73  ee(pDb->zProgres
fec0: 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  s);.      }.    
fed0: 20 20 7a 50 72 6f 67 72 65 73 73 20 3d 20 54 63    zProgress = Tc
fee0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
fef0: 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6c 65 6e  bj(objv[3], &len
ff00: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 72  );.      if( zPr
ff10: 6f 67 72 65 73 73 20 26 26 20 6c 65 6e 3e 30 20  ogress && len>0 
ff20: 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
ff30: 7a 50 72 6f 67 72 65 73 73 20 3d 20 54 63 6c 5f  zProgress = Tcl_
ff40: 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29  Alloc( len + 1 )
ff50: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
ff60: 28 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 2c  (pDb->zProgress,
ff70: 20 7a 50 72 6f 67 72 65 73 73 2c 20 6c 65 6e 2b   zProgress, len+
ff80: 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
ff90: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50  .        pDb->zP
ffa0: 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20  rogress = 0;.   
ffb0: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
ffc0: 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53  ITE_OMIT_PROGRES
ffd0: 53 5f 43 41 4c 4c 42 41 43 4b 0a 20 20 20 20 20  S_CALLBACK.     
ffe0: 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72   if( pDb->zProgr
fff0: 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ess ){.        p
10000 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74  Db->interp = int
10010 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  erp;.        sql
10020 69 74 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61  ite3_progress_ha
10030 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20 4e  ndler(pDb->db, N
10040 2c 20 44 62 50 72 6f 67 72 65 73 73 48 61 6e 64  , DbProgressHand
10050 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20  ler, pDb);.     
10060 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
10070 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65 73 73  sqlite3_progress
10080 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62  _handler(pDb->db
10090 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
100a0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
100b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f  else{.      Tcl_
100c0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
100d0 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e  erp, 2, objv, "N
100e0 20 43 41 4c 4c 42 41 43 4b 22 29 3b 0a 20 20 20   CALLBACK");.   
100f0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
10100 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  ROR;.    }.    b
10110 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
10120 20 20 20 24 64 62 20 70 72 6f 66 69 6c 65 20 3f     $db profile ?
10130 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20  CALLBACK?.  **. 
10140 20 2a 2a 20 4d 61 6b 65 20 61 72 72 61 6e 67 65   ** Make arrange
10150 6d 65 6e 74 73 20 74 6f 20 69 6e 76 6f 6b 65 20  ments to invoke 
10160 74 68 65 20 43 41 4c 4c 42 41 43 4b 20 72 6f 75  the CALLBACK rou
10170 74 69 6e 65 20 61 66 74 65 72 20 65 61 63 68 20  tine after each 
10180 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  SQL statement.  
10190 2a 2a 20 74 68 61 74 20 68 61 73 20 72 75 6e 2e  ** that has run.
101a0 20 20 54 68 65 20 74 65 78 74 20 6f 66 20 74 68    The text of th
101b0 65 20 53 51 4c 20 61 6e 64 20 74 68 65 20 61 6d  e SQL and the am
101c0 6f 75 6e 74 20 6f 66 20 65 6c 61 70 73 65 20 74  ount of elapse t
101d0 69 6d 65 20 61 72 65 0a 20 20 2a 2a 20 61 70 70  ime are.  ** app
101e0 65 6e 64 65 64 20 74 6f 20 43 41 4c 4c 42 41 43  ended to CALLBAC
101f0 4b 20 62 65 66 6f 72 65 20 74 68 65 20 73 63 72  K before the scr
10200 69 70 74 20 69 73 20 72 75 6e 2e 0a 20 20 2a 2f  ipt is run..  */
10210 0a 20 20 63 61 73 65 20 44 42 5f 50 52 4f 46 49  .  case DB_PROFI
10220 4c 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62  LE: {.    if( ob
10230 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63  jc>3 ){.      Tc
10240 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
10250 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
10260 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20  "?CALLBACK?");. 
10270 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
10280 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65  ERROR;.    }else
10290 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a   if( objc==2 ){.
102a0 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
102b0 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 20  Profile ){.     
102c0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
102d0 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d  ult(interp, pDb-
102e0 3e 7a 50 72 6f 66 69 6c 65 2c 20 30 29 3b 0a 20  >zProfile, 0);. 
102f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
10300 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 50  {.      char *zP
10310 72 6f 66 69 6c 65 3b 0a 20 20 20 20 20 20 69 6e  rofile;.      in
10320 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28  t len;.      if(
10330 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29   pDb->zProfile )
10340 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72  {.        Tcl_Fr
10350 65 65 28 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65  ee(pDb->zProfile
10360 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
10370 20 7a 50 72 6f 66 69 6c 65 20 3d 20 54 63 6c 5f   zProfile = Tcl_
10380 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
10390 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b  (objv[2], &len);
103a0 0a 20 20 20 20 20 20 69 66 28 20 7a 50 72 6f 66  .      if( zProf
103b0 69 6c 65 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a  ile && len>0 ){.
103c0 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50 72          pDb->zPr
103d0 6f 66 69 6c 65 20 3d 20 54 63 6c 5f 41 6c 6c 6f  ofile = Tcl_Allo
103e0 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20  c( len + 1 );.  
103f0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62        memcpy(pDb
10400 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20 7a 50 72 6f  ->zProfile, zPro
10410 66 69 6c 65 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20  file, len+1);.  
10420 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10430 20 20 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65     pDb->zProfile
10440 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69   = 0;.      }.#i
10450 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10460 54 5f 54 52 41 43 45 0a 20 20 20 20 20 20 69 66  T_TRACE.      if
10470 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20  ( pDb->zProfile 
10480 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
10490 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b  interp = interp;
104a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
104b0 5f 70 72 6f 66 69 6c 65 28 70 44 62 2d 3e 64 62  _profile(pDb->db
104c0 2c 20 44 62 50 72 6f 66 69 6c 65 48 61 6e 64 6c  , DbProfileHandl
104d0 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20  er, pDb);.      
104e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
104f0 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 70  qlite3_profile(p
10500 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20  Db->db, 0, 0);. 
10510 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
10520 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
10530 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
10540 20 20 24 64 62 20 72 65 6b 65 79 20 4b 45 59 0a    $db rekey KEY.
10550 20 20 2a 2a 0a 20 20 2a 2a 20 43 68 61 6e 67 65    **.  ** Change
10560 20 74 68 65 20 65 6e 63 72 79 70 74 69 6f 6e 20   the encryption 
10570 6b 65 79 20 6f 6e 20 74 68 65 20 63 75 72 72 65  key on the curre
10580 6e 74 6c 79 20 6f 70 65 6e 20 64 61 74 61 62 61  ntly open databa
10590 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  se..  */.  case 
105a0 44 42 5f 52 45 4b 45 59 3a 20 7b 0a 20 20 20 20  DB_REKEY: {.    
105b0 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 76 6f  int nKey;.    vo
105c0 69 64 20 2a 70 4b 65 79 3b 0a 20 20 20 20 69 66  id *pKey;.    if
105d0 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
105e0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
105f0 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
10600 62 6a 76 2c 20 22 4b 45 59 22 29 3b 0a 20 20 20  bjv, "KEY");.   
10610 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
10620 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ROR;.    }.    p
10630 4b 65 79 20 3d 20 54 63 6c 5f 47 65 74 42 79 74  Key = Tcl_GetByt
10640 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62  eArrayFromObj(ob
10650 6a 76 5b 32 5d 2c 20 26 6e 4b 65 79 29 3b 0a 23  jv[2], &nKey);.#
10660 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
10670 5f 43 4f 44 45 43 0a 20 20 20 20 72 63 20 3d 20  _CODEC.    rc = 
10680 73 71 6c 69 74 65 33 5f 72 65 6b 65 79 28 70 44  sqlite3_rekey(pD
10690 62 2d 3e 64 62 2c 20 70 4b 65 79 2c 20 6e 4b 65  b->db, pKey, nKe
106a0 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  y);.    if( rc )
106b0 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
106c0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
106d0 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72   sqlite3ErrStr(r
106e0 63 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 63  c), 0);.      rc
106f0 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20   = TCL_ERROR;.  
10700 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 62    }.#endif.    b
10710 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
10720 20 20 2a 2a 20 20 20 20 20 24 64 62 20 73 74 61    **     $db sta
10730 74 75 73 20 28 73 74 65 70 7c 73 6f 72 74 29 0a  tus (step|sort).
10740 20 20 2a 2a 0a 20 20 2a 2a 20 44 69 73 70 6c 61    **.  ** Displa
10750 79 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  y SQLITE_STMTSTA
10760 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45  TUS_FULLSCAN_STE
10770 50 20 6f 72 20 0a 20 20 2a 2a 20 53 51 4c 49 54  P or .  ** SQLIT
10780 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 53 4f 52  E_STMTSTATUS_SOR
10790 54 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72  T for the most r
107a0 65 63 65 6e 74 20 65 76 61 6c 2e 0a 20 20 2a 2f  ecent eval..  */
107b0 0a 20 20 63 61 73 65 20 44 42 5f 53 54 41 54 55  .  case DB_STATU
107c0 53 3a 20 7b 0a 20 20 20 20 69 6e 74 20 76 3b 0a  S: {.    int v;.
107d0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
107e0 7a 4f 70 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a  zOp;.    if( obj
107f0 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=3 ){.      Tc
10800 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
10810 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
10820 22 28 73 74 65 70 7c 73 6f 72 74 29 22 29 3b 0a  "(step|sort)");.
10830 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
10840 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
10850 20 20 7a 4f 70 20 3d 20 54 63 6c 5f 47 65 74 53    zOp = Tcl_GetS
10860 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
10870 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
10880 4f 70 2c 20 22 73 74 65 70 22 29 3d 3d 30 20 29  Op, "step")==0 )
10890 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 44 62 2d  {.      v = pDb-
108a0 3e 6e 53 74 65 70 3b 0a 20 20 20 20 7d 65 6c 73  >nStep;.    }els
108b0 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4f 70  e if( strcmp(zOp
108c0 2c 20 22 73 6f 72 74 22 29 3d 3d 30 20 29 7b 0a  , "sort")==0 ){.
108d0 20 20 20 20 20 20 76 20 3d 20 70 44 62 2d 3e 6e        v = pDb->n
108e0 53 6f 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Sort;.    }else{
108f0 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
10900 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
10910 22 62 61 64 20 61 72 67 75 6d 65 6e 74 3a 20 73  "bad argument: s
10920 68 6f 75 6c 64 20 62 65 20 73 74 65 70 20 6f 72  hould be step or
10930 20 73 6f 72 74 22 2c 20 0a 20 20 20 20 20 20 20   sort", .       
10940 20 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a       (char*)0);.
10950 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
10960 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
10970 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
10980 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
10990 65 77 49 6e 74 4f 62 6a 28 76 29 29 3b 0a 20 20  ewIntObj(v));.  
109a0 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 0a    break;.  }.  .
109b0 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64    /*.  **     $d
109c0 62 20 74 69 6d 65 6f 75 74 20 4d 49 4c 4c 45 53  b timeout MILLES
109d0 45 43 4f 4e 44 53 0a 20 20 2a 2a 0a 20 20 2a 2a  ECONDS.  **.  **
109e0 20 44 65 6c 61 79 20 66 6f 72 20 74 68 65 20 6e   Delay for the n
109f0 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65  umber of millise
10a00 63 6f 6e 64 73 20 73 70 65 63 69 66 69 65 64 20  conds specified 
10a10 77 68 65 6e 20 61 20 66 69 6c 65 20 69 73 20 6c  when a file is l
10a20 6f 63 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61  ocked..  */.  ca
10a30 73 65 20 44 42 5f 54 49 4d 45 4f 55 54 3a 20 7b  se DB_TIMEOUT: {
10a40 0a 20 20 20 20 69 6e 74 20 6d 73 3b 0a 20 20 20  .    int ms;.   
10a50 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
10a60 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
10a70 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
10a80 2c 20 6f 62 6a 76 2c 20 22 4d 49 4c 4c 49 53 45  , objv, "MILLISE
10a90 43 4f 4e 44 53 22 29 3b 0a 20 20 20 20 20 20 72  CONDS");.      r
10aa0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10ab0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 54  .    }.    if( T
10ac0 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
10ad0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
10ae0 2c 20 26 6d 73 29 20 29 20 72 65 74 75 72 6e 20  , &ms) ) return 
10af0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73  TCL_ERROR;.    s
10b00 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65  qlite3_busy_time
10b10 6f 75 74 28 70 44 62 2d 3e 64 62 2c 20 6d 73 29  out(pDb->db, ms)
10b20 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
10b30 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20  .  .  /*.  **   
10b40 20 20 24 64 62 20 74 6f 74 61 6c 5f 63 68 61 6e    $db total_chan
10b50 67 65 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  ges.  **.  ** Re
10b60 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
10b70 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 65 72  of rows that wer
10b80 65 20 6d 6f 64 69 66 69 65 64 2c 20 69 6e 73 65  e modified, inse
10b90 72 74 65 64 2c 20 6f 72 20 64 65 6c 65 74 65 64  rted, or deleted
10ba0 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65   .  ** since the
10bb0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
10bc0 20 77 61 73 20 63 72 65 61 74 65 64 2e 0a 20 20   was created..  
10bd0 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54 4f 54  */.  case DB_TOT
10be0 41 4c 5f 43 48 41 4e 47 45 53 3a 20 7b 0a 20 20  AL_CHANGES: {.  
10bf0 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75    Tcl_Obj *pResu
10c00 6c 74 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  lt;.    if( objc
10c10 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=2 ){.      Tcl
10c20 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
10c30 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
10c40 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
10c50 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
10c60 7d 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20  }.    pResult = 
10c70 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_GetObjResult
10c80 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63  (interp);.    Tc
10c90 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52 65 73  l_SetIntObj(pRes
10ca0 75 6c 74 2c 20 73 71 6c 69 74 65 33 5f 74 6f 74  ult, sqlite3_tot
10cb0 61 6c 5f 63 68 61 6e 67 65 73 28 70 44 62 2d 3e  al_changes(pDb->
10cc0 64 62 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  db));.    break;
10cd0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
10ce0 62 20 74 72 61 63 65 20 3f 43 41 4c 4c 42 41 43  b trace ?CALLBAC
10cf0 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b  K?.  **.  ** Mak
10d00 65 20 61 72 72 61 6e 67 65 6d 65 6e 74 73 20 74  e arrangements t
10d10 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 43 41 4c  o invoke the CAL
10d20 4c 42 41 43 4b 20 72 6f 75 74 69 6e 65 20 66 6f  LBACK routine fo
10d30 72 20 65 61 63 68 20 53 51 4c 20 73 74 61 74 65  r each SQL state
10d40 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 61 74 20 69  ment.  ** that i
10d50 73 20 65 78 65 63 75 74 65 64 2e 20 20 54 68 65  s executed.  The
10d60 20 74 65 78 74 20 6f 66 20 74 68 65 20 53 51 4c   text of the SQL
10d70 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20   is appended to 
10d80 43 41 4c 4c 42 41 43 4b 20 62 65 66 6f 72 65 0a  CALLBACK before.
10d90 20 20 2a 2a 20 69 74 20 69 73 20 65 78 65 63 75    ** it is execu
10da0 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ted..  */.  case
10db0 20 44 42 5f 54 52 41 43 45 3a 20 7b 0a 20 20 20   DB_TRACE: {.   
10dc0 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20   if( objc>3 ){. 
10dd0 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
10de0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
10df0 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43   objv, "?CALLBAC
10e00 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  K?");.      retu
10e10 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
10e20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63    }else if( objc
10e30 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==2 ){.      if(
10e40 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a   pDb->zTrace ){.
10e50 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
10e60 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
10e70 20 70 44 62 2d 3e 7a 54 72 61 63 65 2c 20 30 29   pDb->zTrace, 0)
10e80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
10e90 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20  lse{.      char 
10ea0 2a 7a 54 72 61 63 65 3b 0a 20 20 20 20 20 20 69  *zTrace;.      i
10eb0 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66  nt len;.      if
10ec0 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b  ( pDb->zTrace ){
10ed0 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65  .        Tcl_Fre
10ee0 65 28 70 44 62 2d 3e 7a 54 72 61 63 65 29 3b 0a  e(pDb->zTrace);.
10ef0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54        }.      zT
10f00 72 61 63 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  race = Tcl_GetSt
10f10 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
10f20 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20  [2], &len);.    
10f30 20 20 69 66 28 20 7a 54 72 61 63 65 20 26 26 20    if( zTrace && 
10f40 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  len>0 ){.       
10f50 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 3d 20 54   pDb->zTrace = T
10f60 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20  cl_Alloc( len + 
10f70 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  1 );.        mem
10f80 63 70 79 28 70 44 62 2d 3e 7a 54 72 61 63 65 2c  cpy(pDb->zTrace,
10f90 20 7a 54 72 61 63 65 2c 20 6c 65 6e 2b 31 29 3b   zTrace, len+1);
10fa0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
10fb0 20 20 20 20 20 20 70 44 62 2d 3e 7a 54 72 61 63        pDb->zTrac
10fc0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23  e = 0;.      }.#
10fd0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10fe0 49 54 5f 54 52 41 43 45 0a 20 20 20 20 20 20 69  IT_TRACE.      i
10ff0 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29  f( pDb->zTrace )
11000 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69  {.        pDb->i
11010 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a  nterp = interp;.
11020 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
11030 74 72 61 63 65 28 70 44 62 2d 3e 64 62 2c 20 44  trace(pDb->db, D
11040 62 54 72 61 63 65 48 61 6e 64 6c 65 72 2c 20 70  bTraceHandler, p
11050 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Db);.      }else
11060 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
11070 33 5f 74 72 61 63 65 28 70 44 62 2d 3e 64 62 2c  3_trace(pDb->db,
11080 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
11090 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
110a0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
110b0 2a 20 20 20 20 24 64 62 20 74 72 61 6e 73 61 63  *    $db transac
110c0 74 69 6f 6e 20 5b 2d 64 65 66 65 72 72 65 64 7c  tion [-deferred|
110d0 2d 69 6d 6d 65 64 69 61 74 65 7c 2d 65 78 63 6c  -immediate|-excl
110e0 75 73 69 76 65 5d 20 53 43 52 49 50 54 0a 20 20  usive] SCRIPT.  
110f0 2a 2a 0a 20 20 2a 2a 20 53 74 61 72 74 20 61 20  **.  ** Start a 
11100 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  new transaction 
11110 28 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61  (if we are not a
11120 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6d 69  lready in the mi
11130 64 73 74 20 6f 66 20 61 0a 20 20 2a 2a 20 74 72  dst of a.  ** tr
11140 61 6e 73 61 63 74 69 6f 6e 29 20 61 6e 64 20 65  ansaction) and e
11150 78 65 63 75 74 65 20 74 68 65 20 54 43 4c 20 73  xecute the TCL s
11160 63 72 69 70 74 20 53 43 52 49 50 54 2e 20 20 41  cript SCRIPT.  A
11170 66 74 65 72 20 53 43 52 49 50 54 0a 20 20 2a 2a  fter SCRIPT.  **
11180 20 63 6f 6d 70 6c 65 74 65 73 2c 20 65 69 74 68   completes, eith
11190 65 72 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72  er commit the tr
111a0 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 72 6f 6c  ansaction or rol
111b0 6c 20 69 74 20 62 61 63 6b 20 69 66 20 53 43 52  l it back if SCR
111c0 49 50 54 0a 20 20 2a 2a 20 74 68 72 6f 77 73 20  IPT.  ** throws 
111d0 61 6e 20 65 78 63 65 70 74 69 6f 6e 2e 20 20 4f  an exception.  O
111e0 72 20 69 66 20 6e 6f 20 6e 65 77 20 74 72 61 6e  r if no new tran
111f0 73 61 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74  sation was start
11200 65 64 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a  ed, do nothing..
11210 20 20 2a 2a 20 70 61 73 73 20 74 68 65 20 65 78    ** pass the ex
11220 63 65 70 74 69 6f 6e 20 6f 6e 20 75 70 20 74 68  ception on up th
11230 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20  e stack..  **.  
11240 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ** This command 
11250 77 61 73 20 69 6e 73 70 69 72 65 64 20 62 79 20  was inspired by 
11260 44 61 76 65 20 54 68 6f 6d 61 73 27 73 20 74 61  Dave Thomas's ta
11270 6c 6b 20 6f 6e 20 52 75 62 79 20 61 74 20 74 68  lk on Ruby at th
11280 65 0a 20 20 2a 2a 20 32 30 30 35 20 4f 27 52 65  e.  ** 2005 O'Re
11290 69 6c 6c 79 20 4f 70 65 6e 20 53 6f 75 72 63 65  illy Open Source
112a0 20 43 6f 6e 76 65 6e 74 69 6f 6e 20 28 4f 53 43   Convention (OSC
112b0 4f 4e 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ON)..  */.  case
112c0 20 44 42 5f 54 52 41 4e 53 41 43 54 49 4f 4e 3a   DB_TRANSACTION:
112d0 20 7b 0a 20 20 20 20 69 6e 74 20 69 6e 54 72 61   {.    int inTra
112e0 6e 73 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  ns;.    Tcl_Obj 
112f0 2a 70 53 63 72 69 70 74 3b 0a 20 20 20 20 63 6f  *pScript;.    co
11300 6e 73 74 20 63 68 61 72 20 2a 7a 42 65 67 69 6e  nst char *zBegin
11310 20 3d 20 22 42 45 47 49 4e 22 3b 0a 20 20 20 20   = "BEGIN";.    
11320 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26 20 6f  if( objc!=3 && o
11330 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20  bjc!=4 ){.      
11340 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
11350 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
11360 2c 20 22 5b 54 59 50 45 5d 20 53 43 52 49 50 54  , "[TYPE] SCRIPT
11370 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
11380 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
11390 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d  }.    if( objc==
113a0 33 20 29 7b 0a 20 20 20 20 20 20 70 53 63 72 69  3 ){.      pScri
113b0 70 74 20 3d 20 6f 62 6a 76 5b 32 5d 3b 0a 20 20  pt = objv[2];.  
113c0 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
113d0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
113e0 61 72 20 2a 54 54 59 50 45 5f 73 74 72 73 5b 5d  ar *TTYPE_strs[]
113f0 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 22 64 65   = {.        "de
11400 66 65 72 72 65 64 22 2c 20 20 20 22 65 78 63 6c  ferred",   "excl
11410 75 73 69 76 65 22 2c 20 20 22 69 6d 6d 65 64 69  usive",  "immedi
11420 61 74 65 22 2c 20 30 0a 20 20 20 20 20 20 7d 3b  ate", 0.      };
11430 0a 20 20 20 20 20 20 65 6e 75 6d 20 54 54 59 50  .      enum TTYP
11440 45 5f 65 6e 75 6d 20 7b 0a 20 20 20 20 20 20 20  E_enum {.       
11450 20 54 54 59 50 45 5f 44 45 46 45 52 52 45 44 2c   TTYPE_DEFERRED,
11460 20 54 54 59 50 45 5f 45 58 43 4c 55 53 49 56 45   TTYPE_EXCLUSIVE
11470 2c 20 54 54 59 50 45 5f 49 4d 4d 45 44 49 41 54  , TTYPE_IMMEDIAT
11480 45 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20  E.      };.     
11490 20 69 6e 74 20 74 74 79 70 65 3b 0a 20 20 20 20   int ttype;.    
114a0 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 64    if( Tcl_GetInd
114b0 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  exFromObj(interp
114c0 2c 20 6f 62 6a 76 5b 32 5d 2c 20 54 54 59 50 45  , objv[2], TTYPE
114d0 5f 73 74 72 73 2c 20 22 74 72 61 6e 73 61 63 74  _strs, "transact
114e0 69 6f 6e 20 74 79 70 65 22 2c 0a 20 20 20 20 20  ion type",.     
114f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11500 20 20 20 20 20 20 20 20 20 30 2c 20 26 74 74 79           0, &tty
11510 70 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pe) ){.        r
11520 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
11530 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
11540 77 69 74 63 68 28 20 28 65 6e 75 6d 20 54 54 59  witch( (enum TTY
11550 50 45 5f 65 6e 75 6d 29 74 74 79 70 65 20 29 7b  PE_enum)ttype ){
11560 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 54 54  .        case TT
11570 59 50 45 5f 44 45 46 45 52 52 45 44 3a 20 20 20  YPE_DEFERRED:   
11580 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 3b 20 20 20   /* no-op */;   
11590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
115a0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
115b0 65 20 54 54 59 50 45 5f 45 58 43 4c 55 53 49 56  e TTYPE_EXCLUSIV
115c0 45 3a 20 20 20 7a 42 65 67 69 6e 20 3d 20 22 42  E:   zBegin = "B
115d0 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45 22 3b  EGIN EXCLUSIVE";
115e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
115f0 20 63 61 73 65 20 54 54 59 50 45 5f 49 4d 4d 45   case TTYPE_IMME
11600 44 49 41 54 45 3a 20 20 20 7a 42 65 67 69 6e 20  DIATE:   zBegin 
11610 3d 20 22 42 45 47 49 4e 20 49 4d 4d 45 44 49 41  = "BEGIN IMMEDIA
11620 54 45 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  TE";  break;.   
11630 20 20 20 7d 0a 20 20 20 20 20 20 70 53 63 72 69     }.      pScri
11640 70 74 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20  pt = objv[3];.  
11650 20 20 7d 0a 20 20 20 20 69 6e 54 72 61 6e 73 20    }.    inTrans 
11660 3d 20 21 73 71 6c 69 74 65 33 5f 67 65 74 5f 61  = !sqlite3_get_a
11670 75 74 6f 63 6f 6d 6d 69 74 28 70 44 62 2d 3e 64  utocommit(pDb->d
11680 62 29 3b 0a 20 20 20 20 69 66 28 20 21 69 6e 54  b);.    if( !inT
11690 72 61 6e 73 20 29 7b 0a 20 20 20 20 20 20 70 44  rans ){.      pD
116a0 62 2d 3e 64 69 73 61 62 6c 65 41 75 74 68 2b 2b  b->disableAuth++
116b0 3b 0a 20 20 20 20 20 20 28 76 6f 69 64 29 73 71  ;.      (void)sq
116c0 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e  lite3_exec(pDb->
116d0 64 62 2c 20 7a 42 65 67 69 6e 2c 20 30 2c 20 30  db, zBegin, 0, 0
116e0 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 44 62 2d  , 0);.      pDb-
116f0 3e 64 69 73 61 62 6c 65 41 75 74 68 2d 2d 3b 0a  >disableAuth--;.
11700 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 54      }.    rc = T
11710 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74  cl_EvalObjEx(int
11720 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20 30 29  erp, pScript, 0)
11730 3b 0a 20 20 20 20 69 66 28 20 21 69 6e 54 72 61  ;.    if( !inTra
11740 6e 73 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  ns ){.      cons
11750 74 20 63 68 61 72 20 2a 7a 45 6e 64 3b 0a 20 20  t char *zEnd;.  
11760 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f      if( rc==TCL_
11770 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 20  ERROR ){.       
11780 20 7a 45 6e 64 20 3d 20 22 52 4f 4c 4c 42 41 43   zEnd = "ROLLBAC
11790 4b 22 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  K";.      } else
117a0 20 7b 0a 20 20 20 20 20 20 20 20 7a 45 6e 64 20   {.        zEnd 
117b0 3d 20 22 43 4f 4d 4d 49 54 22 3b 0a 20 20 20 20  = "COMMIT";.    
117c0 20 20 7d 0a 20 20 20 20 20 20 70 44 62 2d 3e 64    }.      pDb->d
117d0 69 73 61 62 6c 65 41 75 74 68 2b 2b 3b 0a 20 20  isableAuth++;.  
117e0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
117f0 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a 45  exec(pDb->db, zE
11800 6e 64 2c 20 30 2c 20 30 2c 20 30 29 20 29 7b 0a  nd, 0, 0, 0) ){.
11810 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
11820 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 22 52  exec(pDb->db, "R
11830 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20 30 2c 20  OLLBACK", 0, 0, 
11840 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
11850 20 20 70 44 62 2d 3e 64 69 73 61 62 6c 65 41 75    pDb->disableAu
11860 74 68 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  th--;.    }.    
11870 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
11880 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 75 70 64  .  **    $db upd
11890 61 74 65 5f 68 6f 6f 6b 20 3f 73 63 72 69 70 74  ate_hook ?script
118a0 3f 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 72 6f  ?.  **    $db ro
118b0 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 20 3f 73 63 72  llback_hook ?scr
118c0 69 70 74 3f 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ipt?.  */.  case
118d0 20 44 42 5f 55 50 44 41 54 45 5f 48 4f 4f 4b 3a   DB_UPDATE_HOOK:
118e0 20 0a 20 20 63 61 73 65 20 44 42 5f 52 4f 4c 4c   .  case DB_ROLL
118f0 42 41 43 4b 5f 48 4f 4f 4b 3a 20 7b 0a 0a 20 20  BACK_HOOK: {..  
11900 20 20 2f 2a 20 73 65 74 20 70 70 48 6f 6f 6b 20    /* set ppHook 
11910 74 6f 20 70 6f 69 6e 74 20 61 74 20 70 55 70 64  to point at pUpd
11920 61 74 65 48 6f 6f 6b 20 6f 72 20 70 52 6f 6c 6c  ateHook or pRoll
11930 62 61 63 6b 48 6f 6f 6b 2c 20 64 65 70 65 6e 64  backHook, depend
11940 69 6e 67 20 6f 6e 20 0a 20 20 20 20 2a 2a 20 77  ing on .    ** w
11950 68 65 74 68 65 72 20 5b 24 64 62 20 75 70 64 61  hether [$db upda
11960 74 65 5f 68 6f 6f 6b 5d 20 6f 72 20 5b 24 64 62  te_hook] or [$db
11970 20 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 5d 20   rollback_hook] 
11980 77 61 73 20 69 6e 76 6f 6b 65 64 2e 0a 20 20 20  was invoked..   
11990 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20   */.    Tcl_Obj 
119a0 2a 2a 70 70 48 6f 6f 6b 3b 20 0a 20 20 20 20 69  **ppHook; .    i
119b0 66 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f 55 50  f( choice==DB_UP
119c0 44 41 54 45 5f 48 4f 4f 4b 20 29 7b 0a 20 20 20  DATE_HOOK ){.   
119d0 20 20 20 70 70 48 6f 6f 6b 20 3d 20 26 70 44 62     ppHook = &pDb
119e0 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 3b 0a 20  ->pUpdateHook;. 
119f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11a00 70 70 48 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e 70  ppHook = &pDb->p
11a10 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3b 0a 20 20  RollbackHook;.  
11a20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a    }..    if( obj
11a30 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33 20  c!=2 && objc!=3 
11a40 29 7b 0a 20 20 20 20 20 20 20 54 63 6c 5f 57 72  ){.       Tcl_Wr
11a50 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
11a60 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 53 43  p, 2, objv, "?SC
11a70 52 49 50 54 3f 22 29 3b 0a 20 20 20 20 20 20 20  RIPT?");.       
11a80 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
11a90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
11aa0 2a 70 70 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 20  *ppHook ){.     
11ab0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
11ac0 74 28 69 6e 74 65 72 70 2c 20 2a 70 70 48 6f 6f  t(interp, *ppHoo
11ad0 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 62  k);.      if( ob
11ae0 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 20  jc==3 ){.       
11af0 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
11b00 74 28 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20  t(*ppHook);.    
11b10 20 20 20 20 2a 70 70 48 6f 6f 6b 20 3d 20 30 3b      *ppHook = 0;
11b20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
11b30 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29     if( objc==3 )
11b40 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
11b50 21 28 2a 70 70 48 6f 6f 6b 29 20 29 3b 0a 20 20  !(*ppHook) );.  
11b60 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 43      if( Tcl_GetC
11b70 68 61 72 4c 65 6e 67 74 68 28 6f 62 6a 76 5b 32  harLength(objv[2
11b80 5d 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ])>0 ){.        
11b90 2a 70 70 48 6f 6f 6b 20 3d 20 6f 62 6a 76 5b 32  *ppHook = objv[2
11ba0 5d 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 49  ];.        Tcl_I
11bb0 6e 63 72 52 65 66 43 6f 75 6e 74 28 2a 70 70 48  ncrRefCount(*ppH
11bc0 6f 6f 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ook);.      }.  
11bd0 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33    }..    sqlite3
11be0 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28 70 44 62  _update_hook(pDb
11bf0 2d 3e 64 62 2c 20 28 70 44 62 2d 3e 70 55 70 64  ->db, (pDb->pUpd
11c00 61 74 65 48 6f 6f 6b 3f 44 62 55 70 64 61 74 65  ateHook?DbUpdate
11c10 48 61 6e 64 6c 65 72 3a 30 29 2c 20 70 44 62 29  Handler:0), pDb)
11c20 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 6f  ;.    sqlite3_ro
11c30 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28 70 44 62 2d  llback_hook(pDb-
11c40 3e 64 62 2c 28 70 44 62 2d 3e 70 52 6f 6c 6c 62  >db,(pDb->pRollb
11c50 61 63 6b 48 6f 6f 6b 3f 44 62 52 6f 6c 6c 62 61  ackHook?DbRollba
11c60 63 6b 48 61 6e 64 6c 65 72 3a 30 29 2c 70 44 62  ckHandler:0),pDb
11c70 29 3b 0a 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  );..    break;. 
11c80 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20   }..  /*    $db 
11c90 76 65 72 73 69 6f 6e 0a 20 20 2a 2a 0a 20 20 2a  version.  **.  *
11ca0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 65 72  * Return the ver
11cb0 73 69 6f 6e 20 73 74 72 69 6e 67 20 66 6f 72 20  sion string for 
11cc0 74 68 69 73 20 64 61 74 61 62 61 73 65 2e 0a 20  this database.. 
11cd0 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 56 45   */.  case DB_VE
11ce0 52 53 49 4f 4e 3a 20 7b 0a 20 20 20 20 54 63 6c  RSION: {.    Tcl
11cf0 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
11d00 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74  p, (char *)sqlit
11d10 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28 29 2c  e3_libversion(),
11d20 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20   TCL_STATIC);.  
11d30 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 0a 20    break;.  }... 
11d40 20 7d 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65   } /* End of the
11d50 20 53 57 49 54 43 48 20 73 74 61 74 65 6d 65 6e   SWITCH statemen
11d60 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63  t */.  return rc
11d70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 73 71 6c  ;.}../*.**   sql
11d80 69 74 65 33 20 44 42 4e 41 4d 45 20 46 49 4c 45  ite3 DBNAME FILE
11d90 4e 41 4d 45 20 3f 2d 76 66 73 20 56 46 53 4e 41  NAME ?-vfs VFSNA
11da0 4d 45 3f 20 3f 2d 6b 65 79 20 4b 45 59 3f 20 3f  ME? ?-key KEY? ?
11db0 2d 72 65 61 64 6f 6e 6c 79 20 42 4f 4f 4c 45 41  -readonly BOOLEA
11dc0 4e 3f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  N?.**           
11dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11de0 3f 2d 63 72 65 61 74 65 20 42 4f 4f 4c 45 41 4e  ?-create BOOLEAN
11df0 3f 20 3f 2d 6e 6f 6d 75 74 65 78 20 42 4f 4f 4c  ? ?-nomutex BOOL
11e00 45 41 4e 3f 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  EAN?.**.** This 
11e10 69 73 20 74 68 65 20 6d 61 69 6e 20 54 63 6c 20  is the main Tcl 
11e20 63 6f 6d 6d 61 6e 64 2e 20 20 57 68 65 6e 20 74  command.  When t
11e30 68 65 20 22 73 71 6c 69 74 65 22 20 54 63 6c 20  he "sqlite" Tcl 
11e40 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 69 6e  command is.** in
11e50 76 6f 6b 65 64 2c 20 74 68 69 73 20 72 6f 75 74  voked, this rout
11e60 69 6e 65 20 72 75 6e 73 20 74 6f 20 70 72 6f 63  ine runs to proc
11e70 65 73 73 20 74 68 61 74 20 63 6f 6d 6d 61 6e 64  ess that command
11e80 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
11e90 74 20 61 72 67 75 6d 65 6e 74 2c 20 44 42 4e 41  t argument, DBNA
11ea0 4d 45 2c 20 69 73 20 61 6e 20 61 72 62 69 74 72  ME, is an arbitr
11eb0 61 72 79 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e  ary name for a n
11ec0 65 77 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  ew.** database c
11ed0 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 54 68 69 73  onnection.  This
11ee0 20 63 6f 6d 6d 61 6e 64 20 63 72 65 61 74 65 73   command creates
11ef0 20 61 20 6e 65 77 20 63 6f 6d 6d 61 6e 64 20 6e   a new command n
11f00 61 6d 65 64 0a 2a 2a 20 44 42 4e 41 4d 45 20 74  amed.** DBNAME t
11f10 68 61 74 20 69 73 20 75 73 65 64 20 74 6f 20 63  hat is used to c
11f20 6f 6e 74 72 6f 6c 20 74 68 61 74 20 63 6f 6e 6e  ontrol that conn
11f30 65 63 74 69 6f 6e 2e 20 20 54 68 65 20 64 61 74  ection.  The dat
11f40 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74  abase.** connect
11f50 69 6f 6e 20 69 73 20 64 65 6c 65 74 65 64 20 77  ion is deleted w
11f60 68 65 6e 20 74 68 65 20 44 42 4e 41 4d 45 20 63  hen the DBNAME c
11f70 6f 6d 6d 61 6e 64 20 69 73 20 64 65 6c 65 74 65  ommand is delete
11f80 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63  d..**.** The sec
11f90 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
11fa0 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
11fb0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
11fc0 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  *.*/.static int 
11fd0 44 62 4d 61 69 6e 28 76 6f 69 64 20 2a 63 64 2c  DbMain(void *cd,
11fe0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
11ff0 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 54 63  erp, int objc,Tc
12000 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a  l_Obj *const*obj
12010 76 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  v){.  SqliteDb *
12020 70 3b 0a 20 20 76 6f 69 64 20 2a 70 4b 65 79 20  p;.  void *pKey 
12030 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 20  = 0;.  int nKey 
12040 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  = 0;.  const cha
12050 72 20 2a 7a 41 72 67 3b 0a 20 20 63 68 61 72 20  r *zArg;.  char 
12060 2a 7a 45 72 72 4d 73 67 3b 0a 20 20 69 6e 74 20  *zErrMsg;.  int 
12070 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  i;.  const char 
12080 2a 7a 46 69 6c 65 3b 0a 20 20 63 6f 6e 73 74 20  *zFile;.  const 
12090 63 68 61 72 20 2a 7a 56 66 73 20 3d 20 30 3b 0a  char *zVfs = 0;.
120a0 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 53 51    int flags = SQ
120b0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
120c0 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
120d0 4e 5f 43 52 45 41 54 45 20 7c 20 53 51 4c 49 54  N_CREATE | SQLIT
120e0 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a  E_OPEN_NOMUTEX;.
120f0 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 74 72    Tcl_DString tr
12100 61 6e 73 6c 61 74 65 64 46 69 6c 65 6e 61 6d 65  anslatedFilename
12110 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20  ;.  if( objc==2 
12120 29 7b 0a 20 20 20 20 7a 41 72 67 20 3d 20 54 63  ){.    zArg = Tc
12130 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
12140 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a  bj(objv[1], 0);.
12150 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
12160 41 72 67 2c 22 2d 76 65 72 73 69 6f 6e 22 29 3d  Arg,"-version")=
12170 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =0 ){.      Tcl_
12180 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
12190 65 72 70 2c 73 71 6c 69 74 65 33 5f 76 65 72 73  erp,sqlite3_vers
121a0 69 6f 6e 2c 30 29 3b 0a 20 20 20 20 20 20 72 65  ion,0);.      re
121b0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20  turn TCL_OK;.   
121c0 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d   }.    if( strcm
121d0 70 28 7a 41 72 67 2c 22 2d 68 61 73 2d 63 6f 64  p(zArg,"-has-cod
121e0 65 63 22 29 3d 3d 30 20 29 7b 0a 23 69 66 64 65  ec")==0 ){.#ifde
121f0 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
12200 45 43 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  EC.      Tcl_App
12210 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
12220 2c 22 31 22 2c 30 29 3b 0a 23 65 6c 73 65 0a 20  ,"1",0);.#else. 
12230 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
12240 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 30 22  esult(interp,"0"
12250 2c 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ,0);.#endif.    
12260 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
12270 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
12280 28 69 3d 33 3b 20 69 2b 31 3c 6f 62 6a 63 3b 20  (i=3; i+1<objc; 
12290 69 2b 3d 32 29 7b 0a 20 20 20 20 7a 41 72 67 20  i+=2){.    zArg 
122a0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
122b0 6f 62 6a 76 5b 69 5d 29 3b 0a 20 20 20 20 69 66  objv[i]);.    if
122c0 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d  ( strcmp(zArg,"-
122d0 6b 65 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  key")==0 ){.    
122e0 20 20 70 4b 65 79 20 3d 20 54 63 6c 5f 47 65 74    pKey = Tcl_Get
122f0 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a  ByteArrayFromObj
12300 28 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 6e 4b 65  (objv[i+1], &nKe
12310 79 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  y);.    }else if
12320 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22  ( strcmp(zArg, "
12330 2d 76 66 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20  -vfs")==0 ){.   
12340 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7a 56     i++;.      zV
12350 66 73 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  fs = Tcl_GetStri
12360 6e 67 28 6f 62 6a 76 5b 69 5d 29 3b 0a 20 20 20  ng(objv[i]);.   
12370 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
12380 70 28 7a 41 72 67 2c 20 22 2d 72 65 61 64 6f 6e  p(zArg, "-readon
12390 6c 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ly")==0 ){.     
123a0 20 69 6e 74 20 62 3b 0a 20 20 20 20 20 20 69 66   int b;.      if
123b0 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  ( Tcl_GetBoolean
123c0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
123d0 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29  objv[i+1], &b) )
123e0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
123f0 52 3b 0a 20 20 20 20 20 20 69 66 28 20 62 20 29  R;.      if( b )
12400 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  {.        flags 
12410 26 3d 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e  &= ~(SQLITE_OPEN
12420 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
12430 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a  E_OPEN_CREATE);.
12440 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d          flags |=
12450 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
12460 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c  DONLY;.      }el
12470 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67  se{.        flag
12480 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45  s &= ~SQLITE_OPE
12490 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  N_READONLY;.    
124a0 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c      flags |= SQL
124b0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
124c0 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  TE;.      }.    
124d0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
124e0 28 7a 41 72 67 2c 20 22 2d 63 72 65 61 74 65 22  (zArg, "-create"
124f0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
12500 74 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20 54  t b;.      if( T
12510 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
12520 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
12530 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20 72 65  v[i+1], &b) ) re
12540 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
12550 20 20 20 20 20 20 69 66 28 20 62 20 26 26 20 28        if( b && (
12560 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
12570 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d 30  PEN_READONLY)==0
12580 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67   ){.        flag
12590 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s |= SQLITE_OPEN
125a0 5f 43 52 45 41 54 45 3b 0a 20 20 20 20 20 20 7d  _CREATE;.      }
125b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6c  else{.        fl
125c0 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f  ags &= ~SQLITE_O
125d0 50 45 4e 5f 43 52 45 41 54 45 3b 0a 20 20 20 20  PEN_CREATE;.    
125e0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
125f0 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22  ( strcmp(zArg, "
12600 2d 6e 6f 6d 75 74 65 78 22 29 3d 3d 30 20 29 7b  -nomutex")==0 ){
12610 0a 20 20 20 20 20 20 69 6e 74 20 62 3b 0a 20 20  .      int b;.  
12620 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42      if( Tcl_GetB
12630 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
12640 74 65 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c  terp, objv[i+1],
12650 20 26 62 29 20 29 20 72 65 74 75 72 6e 20 54 43   &b) ) return TC
12660 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 69  L_ERROR;.      i
12670 66 28 20 62 20 29 7b 0a 20 20 20 20 20 20 20 20  f( b ){.        
12680 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
12690 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 20 20  OPEN_NOMUTEX;.  
126a0 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e        flags &= ~
126b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c  SQLITE_OPEN_FULL
126c0 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 7d 65 6c  MUTEX;.      }el
126d0 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67  se{.        flag
126e0 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45  s &= ~SQLITE_OPE
126f0 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 20 20 20 20 20  N_NOMUTEX;.     
12700 20 7d 0a 20 20 20 7d 65 6c 73 65 20 69 66 28 20   }.   }else if( 
12710 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d 66  strcmp(zArg, "-f
12720 75 6c 6c 6d 75 74 65 78 22 29 3d 3d 30 20 29 7b  ullmutex")==0 ){
12730 0a 20 20 20 20 20 20 69 6e 74 20 62 3b 0a 20 20  .      int b;.  
12740 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42      if( Tcl_GetB
12750 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
12760 74 65 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c  terp, objv[i+1],
12770 20 26 62 29 20 29 20 72 65 74 75 72 6e 20 54 43   &b) ) return TC
12780 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 69  L_ERROR;.      i
12790 66 28 20 62 20 29 7b 0a 20 20 20 20 20 20 20 20  f( b ){.        
127a0 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
127b0 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a  OPEN_FULLMUTEX;.
127c0 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d          flags &=
127d0 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f   ~SQLITE_OPEN_NO
127e0 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 7d 65 6c  MUTEX;.      }el
127f0 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67  se{.        flag
12800 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45  s &= ~SQLITE_OPE
12810 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a 20 20 20  N_FULLMUTEX;.   
12820 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
12830 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
12840 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
12850 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20  unknown option: 
12860 22 2c 20 7a 41 72 67 2c 20 28 63 68 61 72 2a 29  ", zArg, (char*)
12870 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
12880 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
12890 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63  }.  }.  if( objc
128a0 3c 33 20 7c 7c 20 28 6f 62 6a 63 26 31 29 21 3d  <3 || (objc&1)!=
128b0 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  1 ){.    Tcl_Wro
128c0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
128d0 2c 20 31 2c 20 6f 62 6a 76 2c 20 0a 20 20 20 20  , 1, objv, .    
128e0 20 20 22 48 41 4e 44 4c 45 20 46 49 4c 45 4e 41    "HANDLE FILENA
128f0 4d 45 20 3f 2d 76 66 73 20 56 46 53 4e 41 4d 45  ME ?-vfs VFSNAME
12900 3f 20 3f 2d 72 65 61 64 6f 6e 6c 79 20 42 4f 4f  ? ?-readonly BOO
12910 4c 45 41 4e 3f 20 3f 2d 63 72 65 61 74 65 20 42  LEAN? ?-create B
12920 4f 4f 4c 45 41 4e 3f 22 0a 20 20 20 20 20 20 22  OOLEAN?".      "
12930 20 3f 2d 6e 6f 6d 75 74 65 78 20 42 4f 4f 4c 45   ?-nomutex BOOLE
12940 41 4e 3f 20 3f 2d 66 75 6c 6c 6d 75 74 65 78 20  AN? ?-fullmutex 
12950 42 4f 4f 4c 45 41 4e 3f 22 0a 23 69 66 64 65 66  BOOLEAN?".#ifdef
12960 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
12970 43 0a 20 20 20 20 20 20 22 20 3f 2d 6b 65 79 20  C.      " ?-key 
12980 43 4f 44 45 43 4b 45 59 3f 22 0a 23 65 6e 64 69  CODECKEY?".#endi
12990 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 65 74  f.    );.    ret
129a0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
129b0 20 7d 0a 20 20 7a 45 72 72 4d 73 67 20 3d 20 30   }.  zErrMsg = 0
129c0 3b 0a 20 20 70 20 3d 20 28 53 71 6c 69 74 65 44  ;.  p = (SqliteD
129d0 62 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69  b*)Tcl_Alloc( si
129e0 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66  zeof(*p) );.  if
129f0 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63  ( p==0 ){.    Tc
12a00 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
12a10 72 70 2c 20 22 6d 61 6c 6c 6f 63 20 66 61 69 6c  rp, "malloc fail
12a20 65 64 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  ed", TCL_STATIC)
12a30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
12a40 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 6d 65  _ERROR;.  }.  me
12a50 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f  mset(p, 0, sizeo
12a60 66 28 2a 70 29 29 3b 0a 20 20 7a 46 69 6c 65 20  f(*p));.  zFile 
12a70 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
12a80 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
12a90 30 29 3b 0a 20 20 7a 46 69 6c 65 20 3d 20 54 63  0);.  zFile = Tc
12aa0 6c 5f 54 72 61 6e 73 6c 61 74 65 46 69 6c 65 4e  l_TranslateFileN
12ab0 61 6d 65 28 69 6e 74 65 72 70 2c 20 7a 46 69 6c  ame(interp, zFil
12ac0 65 2c 20 26 74 72 61 6e 73 6c 61 74 65 64 46 69  e, &translatedFi
12ad0 6c 65 6e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  lename);.  sqlit
12ae0 65 33 5f 6f 70 65 6e 5f 76 32 28 7a 46 69 6c 65  e3_open_v2(zFile
12af0 2c 20 26 70 2d 3e 64 62 2c 20 66 6c 61 67 73 2c  , &p->db, flags,
12b00 20 7a 56 66 73 29 3b 0a 20 20 54 63 6c 5f 44 53   zVfs);.  Tcl_DS
12b10 74 72 69 6e 67 46 72 65 65 28 26 74 72 61 6e 73  tringFree(&trans
12b20 6c 61 74 65 64 46 69 6c 65 6e 61 6d 65 29 3b 0a  latedFilename);.
12b30 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
12b40 3d 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65  =sqlite3_errcode
12b50 28 70 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20 7a  (p->db) ){.    z
12b60 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33  ErrMsg = sqlite3
12b70 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73  _mprintf("%s", s
12b80 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d  qlite3_errmsg(p-
12b90 3e 64 62 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  >db));.    sqlit
12ba0 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 29 3b  e3_close(p->db);
12bb0 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a  .    p->db = 0;.
12bc0 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
12bd0 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66  E_HAS_CODEC.  if
12be0 28 20 70 2d 3e 64 62 20 29 7b 0a 20 20 20 20 73  ( p->db ){.    s
12bf0 71 6c 69 74 65 33 5f 6b 65 79 28 70 2d 3e 64 62  qlite3_key(p->db
12c00 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20  , pKey, nKey);. 
12c10 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
12c20 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20  p->db==0 ){.    
12c30 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
12c40 74 65 72 70 2c 20 7a 45 72 72 4d 73 67 2c 20 54  terp, zErrMsg, T
12c50 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20  CL_VOLATILE);.  
12c60 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72    Tcl_Free((char
12c70 2a 29 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  *)p);.    sqlite
12c80 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b  3_free(zErrMsg);
12c90 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
12ca0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 2d 3e  ERROR;.  }.  p->
12cb0 6d 61 78 53 74 6d 74 20 3d 20 4e 55 4d 5f 50 52  maxStmt = NUM_PR
12cc0 45 50 41 52 45 44 5f 53 54 4d 54 53 3b 0a 20 20  EPARED_STMTS;.  
12cd0 70 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65  p->interp = inte
12ce0 72 70 3b 0a 20 20 7a 41 72 67 20 3d 20 54 63 6c  rp;.  zArg = Tcl
12cf0 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
12d00 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20  j(objv[1], 0);. 
12d10 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
12d20 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 7a 41  mmand(interp, zA
12d30 72 67 2c 20 44 62 4f 62 6a 43 6d 64 2c 20 28 63  rg, DbObjCmd, (c
12d40 68 61 72 2a 29 70 2c 20 44 62 44 65 6c 65 74 65  har*)p, DbDelete
12d50 43 6d 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  Cmd);.  return T
12d60 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
12d70 50 72 6f 76 69 64 65 20 61 20 64 75 6d 6d 79 20  Provide a dummy 
12d80 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 20 69 66  Tcl_InitStubs if
12d90 20 77 65 20 61 72 65 20 75 73 69 6e 67 20 74 68   we are using th
12da0 69 73 20 61 73 20 61 20 73 74 61 74 69 63 0a 2a  is as a static.*
12db0 2a 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69  * library..*/.#i
12dc0 66 6e 64 65 66 20 55 53 45 5f 54 43 4c 5f 53 54  fndef USE_TCL_ST
12dd0 55 42 53 0a 23 20 75 6e 64 65 66 20 20 54 63 6c  UBS.# undef  Tcl
12de0 5f 49 6e 69 74 53 74 75 62 73 0a 23 20 64 65 66  _InitStubs.# def
12df0 69 6e 65 20 54 63 6c 5f 49 6e 69 74 53 74 75 62  ine Tcl_InitStub
12e00 73 28 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a  s(a,b,c).#endif.
12e10 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
12e20 20 77 65 20 68 61 76 65 20 61 20 50 41 43 4b 41   we have a PACKA
12e30 47 45 5f 56 45 52 53 49 4f 4e 20 6d 61 63 72 6f  GE_VERSION macro
12e40 20 64 65 66 69 6e 65 64 2e 20 20 54 68 69 73 20   defined.  This 
12e50 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 66 69 6e  will be.** defin
12e60 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
12e70 20 62 79 20 74 68 65 20 54 45 41 20 6d 61 6b 65   by the TEA make
12e80 66 69 6c 65 2e 20 20 42 75 74 20 6f 74 68 65 72  file.  But other
12e90 20 6d 61 6b 65 66 69 6c 65 73 0a 2a 2a 20 64 6f   makefiles.** do
12ea0 20 6e 6f 74 20 64 65 66 69 6e 65 20 69 74 2e 0a   not define it..
12eb0 2a 2f 0a 23 69 66 6e 64 65 66 20 50 41 43 4b 41  */.#ifndef PACKA
12ec0 47 45 5f 56 45 52 53 49 4f 4e 0a 23 20 64 65 66  GE_VERSION.# def
12ed0 69 6e 65 20 50 41 43 4b 41 47 45 5f 56 45 52 53  ine PACKAGE_VERS
12ee0 49 4f 4e 20 53 51 4c 49 54 45 5f 56 45 52 53 49  ION SQLITE_VERSI
12ef0 4f 4e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  ON.#endif../*.**
12f00 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73   Initialize this
12f10 20 6d 6f 64 75 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54   module..**.** T
12f20 68 69 73 20 54 63 6c 20 6d 6f 64 75 6c 65 20 63  his Tcl module c
12f30 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 61 20 73  ontains only a s
12f40 69 6e 67 6c 65 20 6e 65 77 20 54 63 6c 20 63 6f  ingle new Tcl co
12f50 6d 6d 61 6e 64 20 6e 61 6d 65 64 20 22 73 71 6c  mmand named "sql
12f60 69 74 65 22 2e 0a 2a 2a 20 28 48 65 6e 63 65 20  ite"..** (Hence 
12f70 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 61 6d 65  there is no name
12f80 73 70 61 63 65 2e 20 20 54 68 65 72 65 20 69 73  space.  There is
12f90 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 75 73 69   no point in usi
12fa0 6e 67 20 61 20 6e 61 6d 65 73 70 61 63 65 0a 2a  ng a namespace.*
12fb0 2a 20 69 66 20 74 68 65 20 65 78 74 65 6e 73 69  * if the extensi
12fc0 6f 6e 20 6f 6e 6c 79 20 73 75 70 70 6c 69 65 73  on only supplies
12fd0 20 6f 6e 65 20 6e 65 77 20 6e 61 6d 65 21 29 20   one new name!) 
12fe0 20 54 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f   The "sqlite" co
12ff0 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 75 73 65 64  mmand is.** used
13000 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 53   to open a new S
13010 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e 20  QLite database. 
13020 20 53 65 65 20 74 68 65 20 44 62 4d 61 69 6e 28   See the DbMain(
13030 29 20 72 6f 75 74 69 6e 65 20 61 62 6f 76 65 0a  ) routine above.
13040 2a 2a 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  ** for additiona
13050 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
13060 2f 0a 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c  /.EXTERN int Sql
13070 69 74 65 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  ite3_Init(Tcl_In
13080 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20  terp *interp){. 
13090 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 69   Tcl_InitStubs(i
130a0 6e 74 65 72 70 2c 20 22 38 2e 34 22 2c 20 30 29  nterp, "8.4", 0)
130b0 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62  ;.  Tcl_CreateOb
130c0 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
130d0 20 22 73 71 6c 69 74 65 33 22 2c 20 28 54 63 6c   "sqlite3", (Tcl
130e0 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a 29 44 62 4d  _ObjCmdProc*)DbM
130f0 61 69 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63  ain, 0, 0);.  Tc
13100 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74  l_PkgProvide(int
13110 65 72 70 2c 20 22 73 71 6c 69 74 65 33 22 2c 20  erp, "sqlite3", 
13120 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29  PACKAGE_VERSION)
13130 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62  ;.  Tcl_CreateOb
13140 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
13150 20 22 73 71 6c 69 74 65 22 2c 20 28 54 63 6c 5f   "sqlite", (Tcl_
13160 4f 62 6a 43 6d 64 50 72 6f 63 2a 29 44 62 4d 61  ObjCmdProc*)DbMa
13170 69 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c  in, 0, 0);.  Tcl
13180 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65  _PkgProvide(inte
13190 72 70 2c 20 22 73 71 6c 69 74 65 22 2c 20 50 41  rp, "sqlite", PA
131a0 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29 3b 0a  CKAGE_VERSION);.
131b0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
131c0 0a 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63  .}.EXTERN int Tc
131d0 6c 73 71 6c 69 74 65 33 5f 49 6e 69 74 28 54 63  lsqlite3_Init(Tc
131e0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
131f0 29 7b 20 72 65 74 75 72 6e 20 53 71 6c 69 74 65  ){ return Sqlite
13200 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 20  3_Init(interp); 
13210 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c  }.EXTERN int Sql
13220 69 74 65 33 5f 53 61 66 65 49 6e 69 74 28 54 63  ite3_SafeInit(Tc
13230 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
13240 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  ){ return TCL_OK
13250 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 54  ; }.EXTERN int T
13260 63 6c 73 71 6c 69 74 65 33 5f 53 61 66 65 49 6e  clsqlite3_SafeIn
13270 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
13280 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 54  nterp){ return T
13290 43 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e 20  CL_OK; }.EXTERN 
132a0 69 6e 74 20 53 71 6c 69 74 65 33 5f 55 6e 6c 6f  int Sqlite3_Unlo
132b0 61 64 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  ad(Tcl_Interp *i
132c0 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 73  nterp, int flags
132d0 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  ){ return TCL_OK
132e0 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 54  ; }.EXTERN int T
132f0 63 6c 73 71 6c 69 74 65 33 5f 55 6e 6c 6f 61 64  clsqlite3_Unload
13300 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
13310 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  erp, int flags){
13320 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
13330 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c  }.EXTERN int Sql
13340 69 74 65 33 5f 53 61 66 65 55 6e 6c 6f 61 64 28  ite3_SafeUnload(
13350 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
13360 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 20  rp, int flags){ 
13370 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d  return TCL_OK; }
13380 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73  .EXTERN int Tcls
13390 71 6c 69 74 65 33 5f 53 61 66 65 55 6e 6c 6f 61  qlite3_SafeUnloa
133a0 64 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  d(Tcl_Interp *in
133b0 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  terp, int flags)
133c0 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b  { return TCL_OK;
133d0 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  }...#ifndef SQLI
133e0 54 45 5f 33 5f 53 55 46 46 49 58 5f 4f 4e 4c 59  TE_3_SUFFIX_ONLY
133f0 0a 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69  .EXTERN int Sqli
13400 74 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  te_Init(Tcl_Inte
13410 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74  rp *interp){ ret
13420 75 72 6e 20 53 71 6c 69 74 65 33 5f 49 6e 69 74  urn Sqlite3_Init
13430 28 69 6e 74 65 72 70 29 3b 20 7d 0a 45 58 54 45  (interp); }.EXTE
13440 52 4e 20 69 6e 74 20 54 63 6c 73 71 6c 69 74 65  RN int Tclsqlite
13450 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
13460 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72   *interp){ retur
13470 6e 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69  n Sqlite3_Init(i
13480 6e 74 65 72 70 29 3b 20 7d 0a 45 58 54 45 52 4e  nterp); }.EXTERN
13490 20 69 6e 74 20 53 71 6c 69 74 65 5f 53 61 66 65   int Sqlite_Safe
134a0 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
134b0 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e  *interp){ return
134c0 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52   TCL_OK; }.EXTER
134d0 4e 20 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 5f  N int Tclsqlite_
134e0 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74  SafeInit(Tcl_Int
134f0 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65  erp *interp){ re
13500 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45  turn TCL_OK; }.E
13510 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65  XTERN int Sqlite
13520 5f 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65  _Unload(Tcl_Inte
13530 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
13540 66 6c 61 67 73 29 7b 20 72 65 74 75 72 6e 20 54  flags){ return T
13550 43 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e 20  CL_OK; }.EXTERN 
13560 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 5f 55 6e  int Tclsqlite_Un
13570 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72 70 20  load(Tcl_Interp 
13580 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c 61  *interp, int fla
13590 67 73 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f  gs){ return TCL_
135a0 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74  OK; }.EXTERN int
135b0 20 53 71 6c 69 74 65 5f 53 61 66 65 55 6e 6c 6f   Sqlite_SafeUnlo
135c0 61 64 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  ad(Tcl_Interp *i
135d0 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 73  nterp, int flags
135e0 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  ){ return TCL_OK
135f0 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 54  ; }.EXTERN int T
13600 63 6c 73 71 6c 69 74 65 5f 53 61 66 65 55 6e 6c  clsqlite_SafeUnl
13610 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  oad(Tcl_Interp *
13620 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67  interp, int flag
13630 73 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  s){ return TCL_O
13640 4b 3b 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  K;}.#endif..#ifd
13650 65 66 20 54 43 4c 53 48 0a 2f 2a 2a 2a 2a 2a 2a  ef TCLSH./******
13660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
136a0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 63  *******.** The c
136b0 6f 64 65 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73  ode that follows
136c0 20 69 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c   is used to buil
136d0 64 20 73 74 61 6e 64 61 6c 6f 6e 65 20 54 43 4c  d standalone TCL
136e0 20 69 6e 74 65 72 70 72 65 74 65 72 73 0a 2a 2a   interpreters.**
136f0 20 74 68 61 74 20 61 72 65 20 73 74 61 74 69 63   that are static
13700 61 6c 6c 79 20 6c 69 6e 6b 65 64 20 77 69 74 68  ally linked with
13710 20 53 51 4c 69 74 65 2e 20 20 0a 2a 2f 0a 0a 2f   SQLite.  .*/../
13720 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 63 72  *.** If the macr
13730 6f 20 54 43 4c 53 48 20 69 73 20 6f 6e 65 2c 20  o TCLSH is one, 
13740 74 68 65 6e 20 70 75 74 20 69 6e 20 63 6f 64 65  then put in code
13750 20 74 68 69 73 20 66 6f 72 20 74 68 65 0a 2a 2a   this for the.**
13760 20 22 6d 61 69 6e 22 20 72 6f 75 74 69 6e 65 20   "main" routine 
13770 74 68 61 74 20 77 69 6c 6c 20 69 6e 69 74 69 61  that will initia
13780 6c 69 7a 65 20 54 63 6c 20 61 6e 64 20 74 61 6b  lize Tcl and tak
13790 65 20 69 6e 70 75 74 20 66 72 6f 6d 0a 2a 2a 20  e input from.** 
137a0 73 74 61 6e 64 61 72 64 20 69 6e 70 75 74 2c 20  standard input, 
137b0 6f 72 20 69 66 20 61 20 66 69 6c 65 20 69 73 20  or if a file is 
137c0 6e 61 6d 65 64 20 6f 6e 20 74 68 65 20 63 6f 6d  named on the com
137d0 6d 61 6e 64 20 6c 69 6e 65 0a 2a 2a 20 74 68 65  mand line.** the
137e0 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
137f0 20 72 65 61 64 73 20 61 6e 64 20 65 76 61 6c 75   reads and evalu
13800 61 74 65 73 20 74 68 61 74 20 66 69 6c 65 2e 0a  ates that file..
13810 2a 2f 0a 23 69 66 20 54 43 4c 53 48 3d 3d 31 0a  */.#if TCLSH==1.
13820 73 74 61 74 69 63 20 63 68 61 72 20 7a 4d 61 69  static char zMai
13830 6e 6c 6f 6f 70 5b 5d 20 3d 0a 20 20 22 73 65 74  nloop[] =.  "set
13840 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20 22 77   line {}\n".  "w
13850 68 69 6c 65 20 7b 21 5b 65 6f 66 20 73 74 64 69  hile {![eof stdi
13860 6e 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 22 69 66  n]} {\n".    "if
13870 20 7b 24 6c 69 6e 65 21 3d 5c 22 5c 22 7d 20 7b   {$line!=\"\"} {
13880 5c 6e 22 0a 20 20 20 20 20 20 22 70 75 74 73 20  \n".      "puts 
13890 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22 3e 20 5c  -nonewline \"> \
138a0 22 5c 6e 22 0a 20 20 20 20 22 7d 20 65 6c 73 65  "\n".    "} else
138b0 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 70 75 74   {\n".      "put
138c0 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22 25  s -nonewline \"%
138d0 20 5c 22 5c 6e 22 0a 20 20 20 20 22 7d 5c 6e 22   \"\n".    "}\n"
138e0 0a 20 20 20 20 22 66 6c 75 73 68 20 73 74 64 6f  .    "flush stdo
138f0 75 74 5c 6e 22 0a 20 20 20 20 22 61 70 70 65 6e  ut\n".    "appen
13900 64 20 6c 69 6e 65 20 5b 67 65 74 73 20 73 74 64  d line [gets std
13910 69 6e 5d 5c 6e 22 0a 20 20 20 20 22 69 66 20 7b  in]\n".    "if {
13920 5b 69 6e 66 6f 20 63 6f 6d 70 6c 65 74 65 20 24  [info complete $
13930 6c 69 6e 65 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20  line]} {\n".    
13940 20 20 22 69 66 20 7b 5b 63 61 74 63 68 20 7b 75    "if {[catch {u
13950 70 6c 65 76 65 6c 20 23 30 20 24 6c 69 6e 65 7d  plevel #0 $line}
13960 20 72 65 73 75 6c 74 5d 7d 20 7b 5c 6e 22 0a 20   result]} {\n". 
13970 20 20 20 20 20 20 20 22 70 75 74 73 20 73 74 64         "puts std
13980 65 72 72 20 5c 22 45 72 72 6f 72 3a 20 24 72 65  err \"Error: $re
13990 73 75 6c 74 5c 22 5c 6e 22 0a 20 20 20 20 20 20  sult\"\n".      
139a0 22 7d 20 65 6c 73 65 69 66 20 7b 24 72 65 73 75  "} elseif {$resu
139b0 6c 74 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a 20  lt!=\"\"} {\n". 
139c0 20 20 20 20 20 20 20 22 70 75 74 73 20 24 72 65         "puts $re
139d0 73 75 6c 74 5c 6e 22 0a 20 20 20 20 20 20 22 7d  sult\n".      "}
139e0 5c 6e 22 0a 20 20 20 20 20 20 22 73 65 74 20 6c  \n".      "set l
139f0 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20 20 20 22 7d  ine {}\n".    "}
13a00 20 65 6c 73 65 20 7b 5c 6e 22 0a 20 20 20 20 20   else {\n".     
13a10 20 22 61 70 70 65 6e 64 20 6c 69 6e 65 20 5c 5c   "append line \\
13a20 6e 5c 6e 22 0a 20 20 20 20 22 7d 5c 6e 22 0a 20  n\n".    "}\n". 
13a30 20 22 7d 5c 6e 22 0a 3b 0a 23 65 6e 64 69 66 0a   "}\n".;.#endif.
13a40 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61  ./*.** If the ma
13a50 63 72 6f 20 54 43 4c 53 48 20 69 73 20 74 77 6f  cro TCLSH is two
13a60 2c 20 74 68 65 6e 20 67 65 74 20 74 68 65 20 6d  , then get the m
13a70 61 69 6e 20 6c 6f 6f 70 20 63 6f 64 65 20 6f 75  ain loop code ou
13a80 74 20 6f 66 0a 2a 2a 20 74 68 65 20 73 65 70 61  t of.** the sepa
13a90 72 61 74 65 20 66 69 6c 65 20 22 73 70 61 63 65  rate file "space
13aa0 61 6e 61 6c 5f 74 63 6c 2e 68 22 2e 0a 2a 2f 0a  anal_tcl.h"..*/.
13ab0 23 69 66 20 54 43 4c 53 48 3d 3d 32 0a 73 74 61  #if TCLSH==2.sta
13ac0 74 69 63 20 63 68 61 72 20 7a 4d 61 69 6e 6c 6f  tic char zMainlo
13ad0 6f 70 5b 5d 20 3d 20 0a 23 69 6e 63 6c 75 64 65  op[] = .#include
13ae0 20 22 73 70 61 63 65 61 6e 61 6c 5f 74 63 6c 2e   "spaceanal_tcl.
13af0 68 22 0a 3b 0a 23 65 6e 64 69 66 0a 0a 23 64 65  h".;.#endif..#de
13b00 66 69 6e 65 20 54 43 4c 53 48 5f 4d 41 49 4e 20  fine TCLSH_MAIN 
13b10 6d 61 69 6e 20 20 20 2f 2a 20 4e 65 65 64 65 64  main   /* Needed
13b20 20 74 6f 20 66 61 6b 65 20 6f 75 74 20 6d 6b 74   to fake out mkt
13b30 63 6c 61 70 70 20 2a 2f 0a 69 6e 74 20 54 43 4c  clapp */.int TCL
13b40 53 48 5f 4d 41 49 4e 28 69 6e 74 20 61 72 67 63  SH_MAIN(int argc
13b50 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a  , char **argv){.
13b60 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
13b70 74 65 72 70 3b 0a 20 20 54 63 6c 5f 46 69 6e 64  terp;.  Tcl_Find
13b80 45 78 65 63 75 74 61 62 6c 65 28 61 72 67 76 5b  Executable(argv[
13b90 30 5d 29 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20  0]);.  interp = 
13ba0 54 63 6c 5f 43 72 65 61 74 65 49 6e 74 65 72 70  Tcl_CreateInterp
13bb0 28 29 3b 0a 20 20 53 71 6c 69 74 65 33 5f 49 6e  ();.  Sqlite3_In
13bc0 69 74 28 69 6e 74 65 72 70 29 3b 0a 23 69 66 64  it(interp);.#ifd
13bd0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
13be0 20 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e   {.    extern in
13bf0 74 20 4d 64 35 5f 49 6e 69 74 28 54 63 6c 5f 49  t Md5_Init(Tcl_I
13c00 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
13c10 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 63 6f  ern int Sqliteco
13c20 6e 66 69 67 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  nfig_Init(Tcl_In
13c30 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
13c40 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
13c50 74 31 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  t1_Init(Tcl_Inte
13c60 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
13c70 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 32   int Sqlitetest2
13c80 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
13c90 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
13ca0 6e 74 20 53 71 6c 69 74 65 74 65 73 74 33 5f 49  nt Sqlitetest3_I
13cb0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
13cc0 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
13cd0 20 53 71 6c 69 74 65 74 65 73 74 34 5f 49 6e 69   Sqlitetest4_Ini
13ce0 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
13cf0 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
13d00 71 6c 69 74 65 74 65 73 74 35 5f 49 6e 69 74 28  qlitetest5_Init(
13d10 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
13d20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
13d30 69 74 65 74 65 73 74 36 5f 49 6e 69 74 28 54 63  itetest6_Init(Tc
13d40 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
13d50 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
13d60 65 74 65 73 74 37 5f 49 6e 69 74 28 54 63 6c 5f  etest7_Init(Tcl_
13d70 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
13d80 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
13d90 65 73 74 38 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  est8_Init(Tcl_In
13da0 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
13db0 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
13dc0 74 39 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  t9_Init(Tcl_Inte
13dd0 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
13de0 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 61   int Sqlitetesta
13df0 73 79 6e 63 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  sync_Init(Tcl_In
13e00 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
13e10 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
13e20 74 5f 61 75 74 6f 65 78 74 5f 49 6e 69 74 28 54  t_autoext_Init(T
13e30 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
13e40 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
13e50 74 65 74 65 73 74 5f 66 75 6e 63 5f 49 6e 69 74  tetest_func_Init
13e60 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
13e70 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
13e80 6c 69 74 65 74 65 73 74 5f 68 65 78 69 6f 5f 49  litetest_hexio_I
13e90 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
13ea0 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
13eb0 20 53 71 6c 69 74 65 74 65 73 74 5f 6d 61 6c 6c   Sqlitetest_mall
13ec0 6f 63 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  oc_Init(Tcl_Inte
13ed0 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
13ee0 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f   int Sqlitetest_
13ef0 6d 75 74 65 78 5f 49 6e 69 74 28 54 63 6c 5f 49  mutex_Init(Tcl_I
13f00 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
13f10 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
13f20 73 74 73 63 68 65 6d 61 5f 49 6e 69 74 28 54 63  stschema_Init(Tc
13f30 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
13f40 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
13f50 65 74 65 73 74 73 73 65 5f 49 6e 69 74 28 54 63  etestsse_Init(Tc
13f60 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
13f70 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
13f80 65 74 65 73 74 74 63 6c 76 61 72 5f 49 6e 69 74  etesttclvar_Init
13f90 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
13fa0 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
13fb0 6c 69 74 65 74 65 73 74 54 68 72 65 61 64 5f 49  litetestThread_I
13fc0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
13fd0 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
13fe0 20 53 71 6c 69 74 65 74 65 73 74 4f 6e 65 66 69   SqlitetestOnefi
13ff0 6c 65 5f 49 6e 69 74 28 29 3b 0a 20 20 20 20 65  le_Init();.    e
14000 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
14010 74 65 73 74 4f 73 69 6e 73 74 5f 49 6e 69 74 28  testOsinst_Init(
14020 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 0a 20  Tcl_Interp*);.. 
14030 20 20 20 4d 64 35 5f 49 6e 69 74 28 69 6e 74 65     Md5_Init(inte
14040 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 63  rp);.    Sqlitec
14050 6f 6e 66 69 67 5f 49 6e 69 74 28 69 6e 74 65 72  onfig_Init(inter
14060 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
14070 73 74 31 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  st1_Init(interp)
14080 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
14090 32 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  2_Init(interp);.
140a0 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 33 5f      Sqlitetest3_
140b0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
140c0 20 20 53 71 6c 69 74 65 74 65 73 74 34 5f 49 6e    Sqlitetest4_In
140d0 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
140e0 53 71 6c 69 74 65 74 65 73 74 35 5f 49 6e 69 74  Sqlitetest5_Init
140f0 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
14100 6c 69 74 65 74 65 73 74 36 5f 49 6e 69 74 28 69  litetest6_Init(i
14110 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
14120 74 65 74 65 73 74 37 5f 49 6e 69 74 28 69 6e 74  tetest7_Init(int
14130 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
14140 74 65 73 74 38 5f 49 6e 69 74 28 69 6e 74 65 72  test8_Init(inter
14150 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
14160 73 74 39 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  st9_Init(interp)
14170 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
14180 61 73 79 6e 63 5f 49 6e 69 74 28 69 6e 74 65 72  async_Init(inter
14190 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
141a0 73 74 5f 61 75 74 6f 65 78 74 5f 49 6e 69 74 28  st_autoext_Init(
141b0 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
141c0 69 74 65 74 65 73 74 5f 66 75 6e 63 5f 49 6e 69  itetest_func_Ini
141d0 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
141e0 71 6c 69 74 65 74 65 73 74 5f 68 65 78 69 6f 5f  qlitetest_hexio_
141f0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
14200 20 20 53 71 6c 69 74 65 74 65 73 74 5f 6d 61 6c    Sqlitetest_mal
14210 6c 6f 63 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  loc_Init(interp)
14220 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
14230 5f 6d 75 74 65 78 5f 49 6e 69 74 28 69 6e 74 65  _mutex_Init(inte
14240 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
14250 65 73 74 73 63 68 65 6d 61 5f 49 6e 69 74 28 69  estschema_Init(i
14260 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
14270 74 65 74 65 73 74 74 63 6c 76 61 72 5f 49 6e 69  tetesttclvar_Ini
14280 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
14290 71 6c 69 74 65 74 65 73 74 54 68 72 65 61 64 5f  qlitetestThread_
142a0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
142b0 20 20 53 71 6c 69 74 65 74 65 73 74 4f 6e 65 66    SqlitetestOnef
142c0 69 6c 65 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  ile_Init(interp)
142d0 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
142e0 4f 73 69 6e 73 74 5f 49 6e 69 74 28 69 6e 74 65  Osinst_Init(inte
142f0 72 70 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  rp);..#ifdef SQL
14300 49 54 45 5f 53 53 45 0a 20 20 20 20 53 71 6c 69  ITE_SSE.    Sqli
14310 74 65 74 65 73 74 73 73 65 5f 49 6e 69 74 28 69  tetestsse_Init(i
14320 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69 66 0a 20  nterp);.#endif. 
14330 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
14340 61 72 67 63 3e 3d 32 20 7c 7c 20 54 43 4c 53 48  argc>=2 || TCLSH
14350 3d 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==2 ){.    int i
14360 3b 0a 20 20 20 20 63 68 61 72 20 7a 41 72 67 63  ;.    char zArgc
14370 5b 33 32 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  [32];.    sqlite
14380 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
14390 66 28 7a 41 72 67 63 29 2c 20 7a 41 72 67 63 2c  f(zArgc), zArgc,
143a0 20 22 25 64 22 2c 20 61 72 67 63 2d 28 33 2d 54   "%d", argc-(3-T
143b0 43 4c 53 48 29 29 3b 0a 20 20 20 20 54 63 6c 5f  CLSH));.    Tcl_
143c0 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 22 61  SetVar(interp,"a
143d0 72 67 63 22 2c 20 7a 41 72 67 63 2c 20 54 43 4c  rgc", zArgc, TCL
143e0 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20  _GLOBAL_ONLY);. 
143f0 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e     Tcl_SetVar(in
14400 74 65 72 70 2c 22 61 72 67 76 30 22 2c 61 72 67  terp,"argv0",arg
14410 76 5b 31 5d 2c 54 43 4c 5f 47 4c 4f 42 41 4c 5f  v[1],TCL_GLOBAL_
14420 4f 4e 4c 59 29 3b 0a 20 20 20 20 54 63 6c 5f 53  ONLY);.    Tcl_S
14430 65 74 56 61 72 28 69 6e 74 65 72 70 2c 22 61 72  etVar(interp,"ar
14440 67 76 22 2c 20 22 22 2c 20 54 43 4c 5f 47 4c 4f  gv", "", TCL_GLO
14450 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 66  BAL_ONLY);.    f
14460 6f 72 28 69 3d 33 2d 54 43 4c 53 48 3b 20 69 3c  or(i=3-TCLSH; i<
14470 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  argc; i++){.    
14480 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74    Tcl_SetVar(int
14490 65 72 70 2c 20 22 61 72 67 76 22 2c 20 61 72 67  erp, "argv", arg
144a0 76 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  v[i],.          
144b0 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 20  TCL_GLOBAL_ONLY 
144c0 7c 20 54 43 4c 5f 4c 49 53 54 5f 45 4c 45 4d 45  | TCL_LIST_ELEME
144d0 4e 54 20 7c 20 54 43 4c 5f 41 50 50 45 4e 44 5f  NT | TCL_APPEND_
144e0 56 41 4c 55 45 29 3b 0a 20 20 20 20 7d 0a 20 20  VALUE);.    }.  
144f0 20 20 69 66 28 20 54 43 4c 53 48 3d 3d 31 20 26    if( TCLSH==1 &
14500 26 20 54 63 6c 5f 45 76 61 6c 46 69 6c 65 28 69  & Tcl_EvalFile(i
14510 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 29 21  nterp, argv[1])!
14520 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  =TCL_OK ){.     
14530 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e   const char *zIn
14540 66 6f 20 3d 20 54 63 6c 5f 47 65 74 56 61 72 28  fo = Tcl_GetVar(
14550 69 6e 74 65 72 70 2c 20 22 65 72 72 6f 72 49 6e  interp, "errorIn
14560 66 6f 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f  fo", TCL_GLOBAL_
14570 4f 4e 4c 59 29 3b 0a 20 20 20 20 20 20 69 66 28  ONLY);.      if(
14580 20 7a 49 6e 66 6f 3d 3d 30 20 29 20 7a 49 6e 66   zInfo==0 ) zInf
14590 6f 20 3d 20 69 6e 74 65 72 70 2d 3e 72 65 73 75  o = interp->resu
145a0 6c 74 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74  lt;.      fprint
145b0 66 28 73 74 64 65 72 72 2c 22 25 73 3a 20 25 73  f(stderr,"%s: %s
145c0 5c 6e 22 2c 20 2a 61 72 67 76 2c 20 7a 49 6e 66  \n", *argv, zInf
145d0 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  o);.      return
145e0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
145f0 69 66 28 20 61 72 67 63 3c 3d 31 20 7c 7c 20 54  if( argc<=1 || T
14600 43 4c 53 48 3d 3d 32 20 29 7b 0a 20 20 20 20 54  CLSH==2 ){.    T
14610 63 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 28 69 6e  cl_GlobalEval(in
14620 74 65 72 70 2c 20 7a 4d 61 69 6e 6c 6f 6f 70 29  terp, zMainloop)
14630 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
14640 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 54 43  ;.}.#endif /* TC
14650 4c 53 48 20 2a 2f 0a                             LSH */.