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

Artifact d272cbd208f87712f67ae7462d2d6cffbb28a676:


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 31 33 20 32 30 30 38  e.c,v 1.213 2008
0220: 2f 30 34 2f 30 34 20 31 32 3a 32 31 3a 30 39 20  /04/04 12:21:09 
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 63 68 61 72  outine */.  char
0e50: 20 2a 7a 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20   *zNull;        
0e60: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 74         /* Text t
0e70: 6f 20 73 75 62 73 74 69 74 75 74 65 20 66 6f 72  o substitute for
0e80: 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 20 76 61 6c   an SQL NULL val
0e90: 75 65 20 2a 2f 0a 20 20 53 71 6c 46 75 6e 63 20  ue */.  SqlFunc 
0ea0: 2a 70 46 75 6e 63 3b 20 20 20 20 20 20 20 20 20  *pFunc;         
0eb0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 53 51     /* List of SQ
0ec0: 4c 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  L functions */. 
0ed0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 55 70 64 61 74   Tcl_Obj *pUpdat
0ee0: 65 48 6f 6f 6b 3b 20 20 20 20 20 20 2f 2a 20 55  eHook;      /* U
0ef0: 70 64 61 74 65 20 68 6f 6f 6b 20 73 63 72 69 70  pdate hook scrip
0f00: 74 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20 20  t (if any) */.  
0f10: 54 63 6c 5f 4f 62 6a 20 2a 70 52 6f 6c 6c 62 61  Tcl_Obj *pRollba
0f20: 63 6b 48 6f 6f 6b 3b 20 20 20 20 2f 2a 20 52 6f  ckHook;    /* Ro
0f30: 6c 6c 62 61 63 6b 20 68 6f 6f 6b 20 73 63 72 69  llback hook scri
0f40: 70 74 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20  pt (if any) */. 
0f50: 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43 6f   SqlCollate *pCo
0f60: 6c 6c 61 74 65 3b 20 20 20 20 20 20 2f 2a 20 4c  llate;      /* L
0f70: 69 73 74 20 6f 66 20 53 51 4c 20 63 6f 6c 6c 61  ist of SQL colla
0f80: 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 73 20 2a  tion functions *
0f90: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
0fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0fb0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 6f 66  * Return code of
0fc0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c   most recent sql
0fd0: 69 74 65 33 5f 65 78 65 63 28 29 20 2a 2f 0a 20  ite3_exec() */. 
0fe0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f 6c 6c 61   Tcl_Obj *pColla
0ff0: 74 65 4e 65 65 64 65 64 3b 20 20 20 2f 2a 20 43  teNeeded;   /* C
1000: 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65 64 65 64 20  ollation needed 
1010: 73 63 72 69 70 74 20 2a 2f 0a 20 20 53 71 6c 50  script */.  SqlP
1020: 72 65 70 61 72 65 64 53 74 6d 74 20 2a 73 74 6d  reparedStmt *stm
1030: 74 4c 69 73 74 3b 20 2f 2a 20 4c 69 73 74 20 6f  tList; /* List o
1040: 66 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  f prepared state
1050: 6d 65 6e 74 73 2a 2f 0a 20 20 53 71 6c 50 72 65  ments*/.  SqlPre
1060: 70 61 72 65 64 53 74 6d 74 20 2a 73 74 6d 74 4c  paredStmt *stmtL
1070: 61 73 74 3b 20 2f 2a 20 4c 61 73 74 20 73 74 61  ast; /* Last sta
1080: 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 6c 69  tement in the li
1090: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 53  st */.  int maxS
10a0: 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tmt;            
10b0: 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 6d     /* The next m
10c0: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
10d0: 20 73 74 6d 74 4c 69 73 74 20 2a 2f 0a 20 20 69   stmtList */.  i
10e0: 6e 74 20 6e 53 74 6d 74 3b 20 20 20 20 20 20 20  nt nStmt;       
10f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1100: 62 65 72 20 6f 66 20 73 74 61 74 65 6d 65 6e 74  ber of statement
1110: 73 20 69 6e 20 73 74 6d 74 4c 69 73 74 20 2a 2f  s in stmtList */
1120: 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  .  IncrblobChann
1130: 65 6c 20 2a 70 49 6e 63 72 62 6c 6f 62 3b 2f 2a  el *pIncrblob;/*
1140: 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   Linked list of 
1150: 6f 70 65 6e 20 69 6e 63 72 62 6c 6f 62 20 63 68  open incrblob ch
1160: 61 6e 6e 65 6c 73 20 2a 2f 0a 7d 3b 0a 0a 73 74  annels */.};..st
1170: 72 75 63 74 20 49 6e 63 72 62 6c 6f 62 43 68 61  ruct IncrblobCha
1180: 6e 6e 65 6c 20 7b 0a 20 20 73 71 6c 69 74 65 33  nnel {.  sqlite3
1190: 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 3b 20 20 20  _blob *pBlob;   
11a0: 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 20 62 6c     /* sqlite3 bl
11b0: 6f 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 53  ob handle */.  S
11c0: 71 6c 69 74 65 44 62 20 2a 70 44 62 3b 20 20 20  qliteDb *pDb;   
11d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f           /* Asso
11e0: 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20  ciated database 
11f0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
1200: 69 6e 74 20 69 53 65 65 6b 3b 20 20 20 20 20 20  int iSeek;      
1210: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
1220: 72 65 6e 74 20 73 65 65 6b 20 6f 66 66 73 65 74  rent seek offset
1230: 20 2a 2f 0a 20 20 54 63 6c 5f 43 68 61 6e 6e 65   */.  Tcl_Channe
1240: 6c 20 63 68 61 6e 6e 65 6c 3b 20 20 20 20 20 20  l channel;      
1250: 2f 2a 20 43 68 61 6e 6e 65 6c 20 69 64 65 6e 74  /* Channel ident
1260: 69 66 69 65 72 20 2a 2f 0a 20 20 49 6e 63 72 62  ifier */.  Incrb
1270: 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 4e 65 78  lobChannel *pNex
1280: 74 3b 20 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c  t;   /* Linked l
1290: 69 73 74 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20  ist of all open 
12a0: 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c  incrblob channel
12b0: 73 20 2a 2f 0a 20 20 49 6e 63 72 62 6c 6f 62 43  s */.  IncrblobC
12c0: 68 61 6e 6e 65 6c 20 2a 70 50 72 65 76 3b 20 20  hannel *pPrev;  
12d0: 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20   /* Linked list 
12e0: 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 69 6e 63 72  of all open incr
12f0: 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 73 20 2a 2f  blob channels */
1300: 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .};..#ifndef SQL
1310: 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
1320: 42 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c  B./*.** Close al
1330: 6c 20 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e  l incrblob chann
1340: 65 6c 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67  els opened using
1350: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
1360: 74 69 6f 6e 20 70 44 62 2e 0a 2a 2a 20 54 68 69  tion pDb..** Thi
1370: 73 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  s is called when
1380: 20 73 68 75 74 74 69 6e 67 20 64 6f 77 6e 20 74   shutting down t
1390: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
13a0: 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ection..*/.stati
13b0: 63 20 76 6f 69 64 20 63 6c 6f 73 65 49 6e 63 72  c void closeIncr
13c0: 62 6c 6f 62 43 68 61 6e 6e 65 6c 73 28 53 71 6c  blobChannels(Sql
13d0: 69 74 65 44 62 20 2a 70 44 62 29 7b 0a 20 20 49  iteDb *pDb){.  I
13e0: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a  ncrblobChannel *
13f0: 70 3b 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61  p;.  IncrblobCha
1400: 6e 6e 65 6c 20 2a 70 4e 65 78 74 3b 0a 0a 20 20  nnel *pNext;..  
1410: 66 6f 72 28 70 3d 70 44 62 2d 3e 70 49 6e 63 72  for(p=pDb->pIncr
1420: 62 6c 6f 62 3b 20 70 3b 20 70 3d 70 4e 65 78 74  blob; p; p=pNext
1430: 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
1440: 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 20 20 2f 2a  ->pNext;..    /*
1450: 20 4e 6f 74 65 3a 20 43 61 6c 6c 69 6e 67 20 75   Note: Calling u
1460: 6e 72 65 67 69 73 74 65 72 20 68 65 72 65 20 63  nregister here c
1470: 61 6c 6c 20 54 63 6c 5f 43 6c 6f 73 65 20 6f 6e  all Tcl_Close on
1480: 20 74 68 65 20 69 6e 63 72 62 6c 6f 62 20 63 68   the incrblob ch
1490: 61 6e 6e 65 6c 2c 20 0a 20 20 20 20 2a 2a 20 77  annel, .    ** w
14a0: 68 69 63 68 20 64 65 6c 65 74 65 73 20 74 68 65  hich deletes the
14b0: 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c   IncrblobChannel
14c0: 20 73 74 72 75 63 74 75 72 65 20 61 74 20 2a 70   structure at *p
14d0: 2e 20 53 6f 20 64 6f 20 6e 6f 74 0a 20 20 20 20  . So do not.    
14e0: 2a 2a 20 63 61 6c 6c 20 54 63 6c 5f 46 72 65 65  ** call Tcl_Free
14f0: 28 29 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a  () here..    */.
1500: 20 20 20 20 54 63 6c 5f 55 6e 72 65 67 69 73 74      Tcl_Unregist
1510: 65 72 43 68 61 6e 6e 65 6c 28 70 44 62 2d 3e 69  erChannel(pDb->i
1520: 6e 74 65 72 70 2c 20 70 2d 3e 63 68 61 6e 6e 65  nterp, p->channe
1530: 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  l);.  }.}../*.**
1540: 20 43 6c 6f 73 65 20 61 6e 20 69 6e 63 72 65 6d   Close an increm
1550: 65 6e 74 61 6c 20 62 6c 6f 62 20 63 68 61 6e 6e  ental blob chann
1560: 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
1570: 74 20 69 6e 63 72 62 6c 6f 62 43 6c 6f 73 65 28  t incrblobClose(
1580: 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61  ClientData insta
1590: 6e 63 65 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74  nceData, Tcl_Int
15a0: 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20  erp *interp){.  
15b0: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20  IncrblobChannel 
15c0: 2a 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68  *p = (IncrblobCh
15d0: 61 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e 63 65  annel *)instance
15e0: 44 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Data;.  int rc =
15f0: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c   sqlite3_blob_cl
1600: 6f 73 65 28 70 2d 3e 70 42 6c 6f 62 29 3b 0a 20  ose(p->pBlob);. 
1610: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1620: 2d 3e 70 44 62 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  ->pDb->db;..  /*
1630: 20 52 65 6d 6f 76 65 20 74 68 65 20 63 68 61 6e   Remove the chan
1640: 6e 65 6c 20 66 72 6f 6d 20 74 68 65 20 53 71 6c  nel from the Sql
1650: 69 74 65 44 62 2e 70 49 6e 63 72 62 6c 6f 62 20  iteDb.pIncrblob 
1660: 6c 69 73 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70  list. */.  if( p
1670: 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70  ->pNext ){.    p
1680: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
1690: 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20   p->pPrev;.  }. 
16a0: 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b   if( p->pPrev ){
16b0: 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70  .    p->pPrev->p
16c0: 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Next = p->pNext;
16d0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 44  .  }.  if( p->pD
16e0: 62 2d 3e 70 49 6e 63 72 62 6c 6f 62 3d 3d 70 20  b->pIncrblob==p 
16f0: 29 7b 0a 20 20 20 20 70 2d 3e 70 44 62 2d 3e 70  ){.    p->pDb->p
1700: 49 6e 63 72 62 6c 6f 62 20 3d 20 70 2d 3e 70 4e  Incrblob = p->pN
1710: 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  ext;.  }..  /* F
1720: 72 65 65 20 74 68 65 20 49 6e 63 72 62 6c 6f 62  ree the Incrblob
1730: 43 68 61 6e 6e 65 6c 20 73 74 72 75 63 74 75 72  Channel structur
1740: 65 20 2a 2f 0a 20 20 54 63 6c 5f 46 72 65 65 28  e */.  Tcl_Free(
1750: 28 63 68 61 72 20 2a 29 70 29 3b 0a 0a 20 20 69  (char *)p);..  i
1760: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1770: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52   ){.    Tcl_SetR
1780: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
1790: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72  har *)sqlite3_er
17a0: 72 6d 73 67 28 64 62 29 2c 20 54 43 4c 5f 56 4f  rmsg(db), TCL_VO
17b0: 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 72 65 74  LATILE);.    ret
17c0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
17d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
17e0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  OK;.}../*.** Rea
17f0: 64 20 64 61 74 61 20 66 72 6f 6d 20 61 6e 20 69  d data from an i
1800: 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20  ncremental blob 
1810: 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74  channel..*/.stat
1820: 69 63 20 69 6e 74 20 69 6e 63 72 62 6c 6f 62 49  ic int incrblobI
1830: 6e 70 75 74 28 0a 20 20 43 6c 69 65 6e 74 44 61  nput(.  ClientDa
1840: 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c  ta instanceData,
1850: 20 0a 20 20 63 68 61 72 20 2a 62 75 66 2c 20 0a   .  char *buf, .
1860: 20 20 69 6e 74 20 62 75 66 53 69 7a 65 2c 0a 20    int bufSize,. 
1870: 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50   int *errorCodeP
1880: 74 72 0a 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62  tr.){.  Incrblob
1890: 43 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28 49 6e  Channel *p = (In
18a0: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29  crblobChannel *)
18b0: 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20  instanceData;.  
18c0: 69 6e 74 20 6e 52 65 61 64 20 3d 20 62 75 66 53  int nRead = bufS
18d0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ize;         /* 
18e0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
18f0: 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74  to read */.  int
1900: 20 6e 42 6c 6f 62 3b 20 20 20 20 20 20 20 20 20   nBlob;         
1910: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
1920: 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62  al size of the b
1930: 6c 6f 62 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  lob */.  int rc;
1940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1950: 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 20        /* sqlite 
1960: 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 0a 20  error code */.. 
1970: 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33   nBlob = sqlite3
1980: 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70  _blob_bytes(p->p
1990: 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20 28 70 2d  Blob);.  if( (p-
19a0: 3e 69 53 65 65 6b 2b 6e 52 65 61 64 29 3e 6e 42  >iSeek+nRead)>nB
19b0: 6c 6f 62 20 29 7b 0a 20 20 20 20 6e 52 65 61 64  lob ){.    nRead
19c0: 20 3d 20 6e 42 6c 6f 62 2d 70 2d 3e 69 53 65 65   = nBlob-p->iSee
19d0: 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65  k;.  }.  if( nRe
19e0: 61 64 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ad<=0 ){.    ret
19f0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 63  urn 0;.  }..  rc
1a00: 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f   = sqlite3_blob_
1a10: 72 65 61 64 28 70 2d 3e 70 42 6c 6f 62 2c 20 28  read(p->pBlob, (
1a20: 76 6f 69 64 20 2a 29 62 75 66 2c 20 6e 52 65 61  void *)buf, nRea
1a30: 64 2c 20 70 2d 3e 69 53 65 65 6b 29 3b 0a 20 20  d, p->iSeek);.  
1a40: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1a50: 4b 20 29 7b 0a 20 20 20 20 2a 65 72 72 6f 72 43  K ){.    *errorC
1a60: 6f 64 65 50 74 72 20 3d 20 72 63 3b 0a 20 20 20  odePtr = rc;.   
1a70: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a   return -1;.  }.
1a80: 0a 20 20 70 2d 3e 69 53 65 65 6b 20 2b 3d 20 6e  .  p->iSeek += n
1a90: 52 65 61 64 3b 0a 20 20 72 65 74 75 72 6e 20 6e  Read;.  return n
1aa0: 52 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  Read;.}../*.** W
1ab0: 72 69 74 65 20 64 61 74 61 20 74 6f 20 61 6e 20  rite data to an 
1ac0: 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62  incremental blob
1ad0: 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61   channel..*/.sta
1ae0: 74 69 63 20 69 6e 74 20 69 6e 63 72 62 6c 6f 62  tic int incrblob
1af0: 4f 75 74 70 75 74 28 0a 20 20 43 6c 69 65 6e 74  Output(.  Client
1b00: 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74  Data instanceDat
1b10: 61 2c 20 0a 20 20 43 4f 4e 53 54 20 63 68 61 72  a, .  CONST char
1b20: 20 2a 62 75 66 2c 20 0a 20 20 69 6e 74 20 74 6f   *buf, .  int to
1b30: 57 72 69 74 65 2c 0a 20 20 69 6e 74 20 2a 65 72  Write,.  int *er
1b40: 72 6f 72 43 6f 64 65 50 74 72 0a 29 7b 0a 20 20  rorCodePtr.){.  
1b50: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20  IncrblobChannel 
1b60: 2a 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68  *p = (IncrblobCh
1b70: 61 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e 63 65  annel *)instance
1b80: 44 61 74 61 3b 0a 20 20 69 6e 74 20 6e 57 72 69  Data;.  int nWri
1b90: 74 65 20 3d 20 74 6f 57 72 69 74 65 3b 20 20 20  te = toWrite;   
1ba0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1bb0: 66 20 62 79 74 65 73 20 74 6f 20 77 72 69 74 65  f bytes to write
1bc0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 6c 6f 62 3b   */.  int nBlob;
1bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be0: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65     /* Total size
1bf0: 20 6f 66 20 74 68 65 20 62 6c 6f 62 20 2a 2f 0a   of the blob */.
1c00: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c20: 2a 20 73 71 6c 69 74 65 20 65 72 72 6f 72 20 63  * sqlite error c
1c30: 6f 64 65 20 2a 2f 0a 0a 20 20 6e 42 6c 6f 62 20  ode */..  nBlob 
1c40: 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62  = sqlite3_blob_b
1c50: 79 74 65 73 28 70 2d 3e 70 42 6c 6f 62 29 3b 0a  ytes(p->pBlob);.
1c60: 20 20 69 66 28 20 28 70 2d 3e 69 53 65 65 6b 2b    if( (p->iSeek+
1c70: 6e 57 72 69 74 65 29 3e 6e 42 6c 6f 62 20 29 7b  nWrite)>nBlob ){
1c80: 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50  .    *errorCodeP
1c90: 74 72 20 3d 20 45 49 4e 56 41 4c 3b 0a 20 20 20  tr = EINVAL;.   
1ca0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a   return -1;.  }.
1cb0: 20 20 69 66 28 20 6e 57 72 69 74 65 3c 3d 30 20    if( nWrite<=0 
1cc0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
1cd0: 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c  .  }..  rc = sql
1ce0: 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65 28  ite3_blob_write(
1cf0: 70 2d 3e 70 42 6c 6f 62 2c 20 28 76 6f 69 64 20  p->pBlob, (void 
1d00: 2a 29 62 75 66 2c 20 6e 57 72 69 74 65 2c 20 70  *)buf, nWrite, p
1d10: 2d 3e 69 53 65 65 6b 29 3b 0a 20 20 69 66 28 20  ->iSeek);.  if( 
1d20: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1d30: 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50  .    *errorCodeP
1d40: 74 72 20 3d 20 45 49 4f 3b 0a 20 20 20 20 72 65  tr = EIO;.    re
1d50: 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20  turn -1;.  }..  
1d60: 70 2d 3e 69 53 65 65 6b 20 2b 3d 20 6e 57 72 69  p->iSeek += nWri
1d70: 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 6e 57 72  te;.  return nWr
1d80: 69 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  ite;.}../*.** Se
1d90: 65 6b 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  ek an incrementa
1da0: 6c 20 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a  l blob channel..
1db0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
1dc0: 63 72 62 6c 6f 62 53 65 65 6b 28 0a 20 20 43 6c  crblobSeek(.  Cl
1dd0: 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63  ientData instanc
1de0: 65 44 61 74 61 2c 20 0a 20 20 6c 6f 6e 67 20 6f  eData, .  long o
1df0: 66 66 73 65 74 2c 0a 20 20 69 6e 74 20 73 65 65  ffset,.  int see
1e00: 6b 4d 6f 64 65 2c 0a 20 20 69 6e 74 20 2a 65 72  kMode,.  int *er
1e10: 72 6f 72 43 6f 64 65 50 74 72 0a 29 7b 0a 20 20  rorCodePtr.){.  
1e20: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20  IncrblobChannel 
1e30: 2a 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68  *p = (IncrblobCh
1e40: 61 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e 63 65  annel *)instance
1e50: 44 61 74 61 3b 0a 0a 20 20 73 77 69 74 63 68 28  Data;..  switch(
1e60: 20 73 65 65 6b 4d 6f 64 65 20 29 7b 0a 20 20 20   seekMode ){.   
1e70: 20 63 61 73 65 20 53 45 45 4b 5f 53 45 54 3a 0a   case SEEK_SET:.
1e80: 20 20 20 20 20 20 70 2d 3e 69 53 65 65 6b 20 3d        p->iSeek =
1e90: 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 62   offset;.      b
1ea0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
1eb0: 45 45 4b 5f 43 55 52 3a 0a 20 20 20 20 20 20 70  EEK_CUR:.      p
1ec0: 2d 3e 69 53 65 65 6b 20 2b 3d 20 6f 66 66 73 65  ->iSeek += offse
1ed0: 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  t;.      break;.
1ee0: 20 20 20 20 63 61 73 65 20 53 45 45 4b 5f 45 4e      case SEEK_EN
1ef0: 44 3a 0a 20 20 20 20 20 20 70 2d 3e 69 53 65 65  D:.      p->iSee
1f00: 6b 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  k = sqlite3_blob
1f10: 5f 62 79 74 65 73 28 70 2d 3e 70 42 6c 6f 62 29  _bytes(p->pBlob)
1f20: 20 2b 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20   + offset;.     
1f30: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66   break;..    def
1f40: 61 75 6c 74 3a 20 61 73 73 65 72 74 28 21 22 42  ault: assert(!"B
1f50: 61 64 20 73 65 65 6b 4d 6f 64 65 22 29 3b 0a 20  ad seekMode");. 
1f60: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e   }..  return p->
1f70: 69 53 65 65 6b 3b 0a 7d 0a 0a 0a 73 74 61 74 69  iSeek;.}...stati
1f80: 63 20 76 6f 69 64 20 69 6e 63 72 62 6c 6f 62 57  c void incrblobW
1f90: 61 74 63 68 28 43 6c 69 65 6e 74 44 61 74 61 20  atch(ClientData 
1fa0: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 69 6e  instanceData, in
1fb0: 74 20 6d 6f 64 65 29 7b 20 0a 20 20 2f 2a 20 4e  t mode){ .  /* N
1fc0: 4f 2d 4f 50 20 2a 2f 20 0a 7d 0a 73 74 61 74 69  O-OP */ .}.stati
1fd0: 63 20 69 6e 74 20 69 6e 63 72 62 6c 6f 62 48 61  c int incrblobHa
1fe0: 6e 64 6c 65 28 43 6c 69 65 6e 74 44 61 74 61 20  ndle(ClientData 
1ff0: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 69 6e  instanceData, in
2000: 74 20 64 69 72 2c 20 43 6c 69 65 6e 74 44 61 74  t dir, ClientDat
2010: 61 20 2a 68 50 74 72 29 7b 0a 20 20 72 65 74 75  a *hPtr){.  retu
2020: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a  rn TCL_ERROR;.}.
2030: 0a 73 74 61 74 69 63 20 54 63 6c 5f 43 68 61 6e  .static Tcl_Chan
2040: 6e 65 6c 54 79 70 65 20 49 6e 63 72 62 6c 6f 62  nelType Incrblob
2050: 43 68 61 6e 6e 65 6c 54 79 70 65 20 3d 20 7b 0a  ChannelType = {.
2060: 20 20 22 69 6e 63 72 62 6c 6f 62 22 2c 20 20 20    "incrblob",   
2070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2080: 20 20 20 20 20 2f 2a 20 74 79 70 65 4e 61 6d 65       /* typeName
2090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
20b0: 20 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45    TCL_CHANNEL_VE
20c0: 52 53 49 4f 4e 5f 32 2c 20 20 20 20 20 20 20 20  RSION_2,        
20d0: 20 20 20 20 20 2f 2a 20 76 65 72 73 69 6f 6e 20       /* version 
20e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
2100: 20 20 69 6e 63 72 62 6c 6f 62 43 6c 6f 73 65 2c    incrblobClose,
2110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2120: 20 20 20 20 20 2f 2a 20 63 6c 6f 73 65 50 72 6f       /* closePro
2130: 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
2140: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
2150: 20 20 69 6e 63 72 62 6c 6f 62 49 6e 70 75 74 2c    incrblobInput,
2160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2170: 20 20 20 20 20 2f 2a 20 69 6e 70 75 74 50 72 6f       /* inputPro
2180: 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
21a0: 20 20 69 6e 63 72 62 6c 6f 62 4f 75 74 70 75 74    incrblobOutput
21b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
21c0: 20 20 20 20 20 2f 2a 20 6f 75 74 70 75 74 50 72       /* outputPr
21d0: 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  oc              
21e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
21f0: 20 20 69 6e 63 72 62 6c 6f 62 53 65 65 6b 2c 20    incrblobSeek, 
2200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2210: 20 20 20 20 20 2f 2a 20 73 65 65 6b 50 72 6f 63       /* seekProc
2220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2230: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
2240: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
2250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2260: 20 20 20 20 20 2f 2a 20 73 65 74 4f 70 74 69 6f       /* setOptio
2270: 6e 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20  nProc           
2280: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
2290: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
22a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b0: 20 20 20 20 20 2f 2a 20 67 65 74 4f 70 74 69 6f       /* getOptio
22c0: 6e 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20  nProc           
22d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
22e0: 20 20 69 6e 63 72 62 6c 6f 62 57 61 74 63 68 2c    incrblobWatch,
22f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2300: 20 20 20 20 20 2f 2a 20 77 61 74 63 68 50 72 6f       /* watchPro
2310: 63 20 28 74 68 69 73 20 69 73 20 61 20 6e 6f 2d  c (this is a no-
2320: 6f 70 29 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  op)          */.
2330: 20 20 69 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65    incrblobHandle
2340: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2350: 20 20 20 20 20 2f 2a 20 67 65 74 48 61 6e 64 6c       /* getHandl
2360: 65 50 72 6f 63 20 28 61 6c 77 61 79 73 20 72 65  eProc (always re
2370: 74 75 72 6e 73 20 65 72 72 6f 72 29 20 2a 2f 0a  turns error) */.
2380: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
2390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a0: 20 20 20 20 20 2f 2a 20 63 6c 6f 73 65 32 50 72       /* close2Pr
23b0: 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  oc              
23c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
23d0: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
23e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f0: 20 20 20 20 20 2f 2a 20 62 6c 6f 63 6b 4d 6f 64       /* blockMod
2400: 65 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20  eProc           
2410: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
2420: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
2430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2440: 20 20 20 20 20 2f 2a 20 66 6c 75 73 68 50 72 6f       /* flushPro
2450: 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
2460: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
2470: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
2480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2490: 20 20 20 20 20 2f 2a 20 68 61 6e 64 6c 65 72 50       /* handlerP
24a0: 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20  roc             
24b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
24c0: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
24d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e0: 20 20 20 20 20 2f 2a 20 77 69 64 65 53 65 65 6b       /* wideSeek
24f0: 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20  Proc            
2500: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
2510: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  };../*.** Create
2520: 20 61 20 6e 65 77 20 69 6e 63 72 62 6c 6f 62 20   a new incrblob 
2530: 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74  channel..*/.stat
2540: 69 63 20 69 6e 74 20 63 72 65 61 74 65 49 6e 63  ic int createInc
2550: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 28 0a 20 20  rblobChannel(.  
2560: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2570: 72 70 2c 20 0a 20 20 53 71 6c 69 74 65 44 62 20  rp, .  SqliteDb 
2580: 2a 70 44 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63  *pDb, .  const c
2590: 68 61 72 20 2a 7a 44 62 2c 0a 20 20 63 6f 6e 73  har *zDb,.  cons
25a0: 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 2c 20  t char *zTable, 
25b0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
25c0: 43 6f 6c 75 6d 6e 2c 20 0a 20 20 73 71 6c 69 74  Column, .  sqlit
25d0: 65 5f 69 6e 74 36 34 20 69 52 6f 77 2c 0a 20 20  e_int64 iRow,.  
25e0: 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 0a 29  int isReadonly.)
25f0: 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e  {.  IncrblobChan
2600: 6e 65 6c 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65  nel *p;.  sqlite
2610: 33 20 2a 64 62 20 3d 20 70 44 62 2d 3e 64 62 3b  3 *db = pDb->db;
2620: 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20  .  sqlite3_blob 
2630: 2a 70 42 6c 6f 62 3b 0a 20 20 69 6e 74 20 72 63  *pBlob;.  int rc
2640: 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  ;.  int flags = 
2650: 54 43 4c 5f 52 45 41 44 41 42 4c 45 7c 28 69 73  TCL_READABLE|(is
2660: 52 65 61 64 6f 6e 6c 79 20 3f 20 30 20 3a 20 54  Readonly ? 0 : T
2670: 43 4c 5f 57 52 49 54 41 42 4c 45 29 3b 0a 0a 20  CL_WRITABLE);.. 
2680: 20 2f 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c   /* This variabl
2690: 65 20 69 73 20 75 73 65 64 20 74 6f 20 6e 61 6d  e is used to nam
26a0: 65 20 74 68 65 20 63 68 61 6e 6e 65 6c 73 3a 20  e the channels: 
26b0: 22 69 6e 63 72 62 6c 6f 62 5f 5b 69 6e 63 72 20  "incrblob_[incr 
26c0: 63 6f 75 6e 74 5d 22 20 2a 2f 0a 20 20 73 74 61  count]" */.  sta
26d0: 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 20 3d 20  tic int count = 
26e0: 30 3b 0a 20 20 63 68 61 72 20 7a 43 68 61 6e 6e  0;.  char zChann
26f0: 65 6c 5b 36 34 5d 3b 0a 0a 20 20 72 63 20 3d 20  el[64];..  rc = 
2700: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65  sqlite3_blob_ope
2710: 6e 28 64 62 2c 20 7a 44 62 2c 20 7a 54 61 62 6c  n(db, zDb, zTabl
2720: 65 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 69 52 6f 77  e, zColumn, iRow
2730: 2c 20 21 69 73 52 65 61 64 6f 6e 6c 79 2c 20 26  , !isReadonly, &
2740: 70 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20 72 63  pBlob);.  if( rc
2750: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2760: 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
2770: 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
2780: 29 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28  )sqlite3_errmsg(
2790: 70 44 62 2d 3e 64 62 29 2c 20 54 43 4c 5f 56 4f  pDb->db), TCL_VO
27a0: 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 72 65 74  LATILE);.    ret
27b0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
27c0: 20 7d 0a 0a 20 20 70 20 3d 20 28 49 6e 63 72 62   }..  p = (Incrb
27d0: 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 54 63 6c  lobChannel *)Tcl
27e0: 5f 41 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 49 6e  _Alloc(sizeof(In
27f0: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 29 29 3b  crblobChannel));
2800: 0a 20 20 70 2d 3e 69 53 65 65 6b 20 3d 20 30 3b  .  p->iSeek = 0;
2810: 0a 20 20 70 2d 3e 70 42 6c 6f 62 20 3d 20 70 42  .  p->pBlob = pB
2820: 6c 6f 62 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  lob;..  sqlite3_
2830: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
2840: 7a 43 68 61 6e 6e 65 6c 29 2c 20 7a 43 68 61 6e  zChannel), zChan
2850: 6e 65 6c 2c 20 22 69 6e 63 72 62 6c 6f 62 5f 25  nel, "incrblob_%
2860: 64 22 2c 20 2b 2b 63 6f 75 6e 74 29 3b 0a 20 20  d", ++count);.  
2870: 70 2d 3e 63 68 61 6e 6e 65 6c 20 3d 20 54 63 6c  p->channel = Tcl
2880: 5f 43 72 65 61 74 65 43 68 61 6e 6e 65 6c 28 26  _CreateChannel(&
2890: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 54  IncrblobChannelT
28a0: 79 70 65 2c 20 7a 43 68 61 6e 6e 65 6c 2c 20 70  ype, zChannel, p
28b0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 54 63 6c 5f  , flags);.  Tcl_
28c0: 52 65 67 69 73 74 65 72 43 68 61 6e 6e 65 6c 28  RegisterChannel(
28d0: 69 6e 74 65 72 70 2c 20 70 2d 3e 63 68 61 6e 6e  interp, p->chann
28e0: 65 6c 29 3b 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20  el);..  /* Link 
28f0: 74 68 65 20 6e 65 77 20 63 68 61 6e 6e 65 6c 20  the new channel 
2900: 69 6e 74 6f 20 74 68 65 20 53 71 6c 69 74 65 44  into the SqliteD
2910: 62 2e 70 49 6e 63 72 62 6c 6f 62 20 6c 69 73 74  b.pIncrblob list
2920: 2e 20 2a 2f 0a 20 20 70 2d 3e 70 4e 65 78 74 20  . */.  p->pNext 
2930: 3d 20 70 44 62 2d 3e 70 49 6e 63 72 62 6c 6f 62  = pDb->pIncrblob
2940: 3b 0a 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30  ;.  p->pPrev = 0
2950: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74  ;.  if( p->pNext
2960: 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74   ){.    p->pNext
2970: 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 7d  ->pPrev = p;.  }
2980: 0a 20 20 70 44 62 2d 3e 70 49 6e 63 72 62 6c 6f  .  pDb->pIncrblo
2990: 62 20 3d 20 70 3b 0a 20 20 70 2d 3e 70 44 62 20  b = p;.  p->pDb 
29a0: 3d 20 70 44 62 3b 0a 0a 20 20 54 63 6c 5f 53 65  = pDb;..  Tcl_Se
29b0: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
29c0: 28 63 68 61 72 20 2a 29 54 63 6c 5f 47 65 74 43  (char *)Tcl_GetC
29d0: 68 61 6e 6e 65 6c 4e 61 6d 65 28 70 2d 3e 63 68  hannelName(p->ch
29e0: 61 6e 6e 65 6c 29 2c 20 54 43 4c 5f 56 4f 4c 41  annel), TCL_VOLA
29f0: 54 49 4c 45 29 3b 0a 20 20 72 65 74 75 72 6e 20  TILE);.  return 
2a00: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6c 73 65 20  TCL_OK;.}.#else 
2a10: 20 2f 2a 20 65 6c 73 65 20 63 6c 61 75 73 65 20   /* else clause 
2a20: 66 6f 72 20 22 23 69 66 6e 64 65 66 20 53 51 4c  for "#ifndef SQL
2a30: 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
2a40: 42 22 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  B" */.  #define 
2a50: 63 6c 6f 73 65 49 6e 63 72 62 6c 6f 62 43 68 61  closeIncrblobCha
2a60: 6e 6e 65 6c 73 28 70 44 62 29 0a 23 65 6e 64 69  nnels(pDb).#endi
2a70: 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 61 74  f../*.** Look at
2a80: 20 74 68 65 20 73 63 72 69 70 74 20 70 72 65 66   the script pref
2a90: 69 78 20 69 6e 20 70 43 6d 64 2e 20 20 57 65 20  ix in pCmd.  We 
2aa0: 77 69 6c 6c 20 62 65 20 65 78 65 63 75 74 69 6e  will be executin
2ab0: 67 20 74 68 69 73 20 73 63 72 69 70 74 0a 2a 2a  g this script.**
2ac0: 20 61 66 74 65 72 20 66 69 72 73 74 20 61 70 70   after first app
2ad0: 65 6e 64 69 6e 67 20 6f 6e 65 20 6f 72 20 6d 6f  ending one or mo
2ae0: 72 65 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 54  re arguments.  T
2af0: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c  his routine anal
2b00: 79 7a 65 73 0a 2a 2a 20 74 68 65 20 73 63 72 69  yzes.** the scri
2b10: 70 74 20 74 6f 20 73 65 65 20 69 66 20 69 74 20  pt to see if it 
2b20: 69 73 20 73 61 66 65 20 74 6f 20 75 73 65 20 54  is safe to use T
2b30: 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 6f 6e  cl_EvalObjv() on
2b40: 20 74 68 65 20 73 63 72 69 70 74 0a 2a 2a 20 72   the script.** r
2b50: 61 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6d  ather than the m
2b60: 6f 72 65 20 67 65 6e 65 72 61 6c 20 54 63 6c 5f  ore general Tcl_
2b70: 45 76 61 6c 45 78 28 29 2e 20 20 54 63 6c 5f 45  EvalEx().  Tcl_E
2b80: 76 61 6c 4f 62 6a 76 28 29 20 69 73 20 6d 75 63  valObjv() is muc
2b90: 68 0a 2a 2a 20 66 61 73 74 65 72 2e 0a 2a 2a 0a  h.** faster..**.
2ba0: 2a 2a 20 53 63 72 69 70 74 73 20 74 68 61 74 20  ** Scripts that 
2bb0: 61 72 65 20 73 61 66 65 20 74 6f 20 75 73 65 20  are safe to use 
2bc0: 77 69 74 68 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  with Tcl_EvalObj
2bd0: 76 28 29 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  v() consists of 
2be0: 61 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d  a.** command nam
2bf0: 65 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 7a 65  e followed by ze
2c00: 72 6f 20 6f 72 20 6d 6f 72 65 20 61 72 67 75 6d  ro or more argum
2c10: 65 6e 74 73 20 77 69 74 68 20 6e 6f 20 5b 2e 2e  ents with no [..
2c20: 2e 5d 20 6f 72 20 24 0a 2a 2a 20 6f 72 20 7b 2e  .] or $.** or {.
2c30: 2e 2e 7d 20 6f 72 20 3b 20 74 6f 20 62 65 20 73  ..} or ; to be s
2c40: 65 65 6e 20 61 6e 79 77 68 65 72 65 2e 20 20 4d  een anywhere.  M
2c50: 6f 73 74 20 63 61 6c 6c 62 61 63 6b 20 73 63 72  ost callback scr
2c60: 69 70 74 73 20 63 6f 6e 73 69 73 74 0a 2a 2a 20  ipts consist.** 
2c70: 6f 66 20 6a 75 73 74 20 61 20 73 69 6e 67 6c 65  of just a single
2c80: 20 70 72 6f 63 65 64 75 72 65 20 6e 61 6d 65 20   procedure name 
2c90: 61 6e 64 20 74 68 65 79 20 6d 65 65 74 20 74 68  and they meet th
2ca0: 69 73 20 72 65 71 75 69 72 65 6d 65 6e 74 2e 0a  is requirement..
2cb0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  */.static int sa
2cc0: 66 65 54 6f 55 73 65 45 76 61 6c 4f 62 6a 76 28  feToUseEvalObjv(
2cd0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2ce0: 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d  rp, Tcl_Obj *pCm
2cf0: 64 29 7b 0a 20 20 2f 2a 20 57 65 20 63 6f 75 6c  d){.  /* We coul
2d00: 64 20 74 72 79 20 74 6f 20 64 6f 20 73 6f 6d 65  d try to do some
2d10: 74 68 69 6e 67 20 77 69 74 68 20 54 63 6c 5f 50  thing with Tcl_P
2d20: 61 72 73 65 28 29 2e 20 20 42 75 74 20 77 65 20  arse().  But we 
2d30: 77 69 6c 6c 20 69 6e 73 74 65 61 64 0a 20 20 2a  will instead.  *
2d40: 2a 20 6a 75 73 74 20 64 6f 20 61 20 73 65 61 72  * just do a sear
2d50: 63 68 20 66 6f 72 20 66 6f 72 62 69 64 64 65 6e  ch for forbidden
2d60: 20 63 68 61 72 61 63 74 65 72 73 2e 20 20 49 66   characters.  If
2d70: 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 72 62   any of the forb
2d80: 69 64 64 65 6e 0a 20 20 2a 2a 20 63 68 61 72 61  idden.  ** chara
2d90: 63 74 65 72 73 20 61 70 70 65 61 72 20 69 6e 20  cters appear in 
2da0: 70 43 6d 64 2c 20 77 65 20 77 69 6c 6c 20 72 65  pCmd, we will re
2db0: 70 6f 72 74 20 74 68 65 20 73 74 72 69 6e 67 20  port the string 
2dc0: 61 73 20 75 6e 73 61 66 65 2e 0a 20 20 2a 2f 0a  as unsafe..  */.
2dd0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
2de0: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 7a 20 3d 20  .  int n;.  z = 
2df0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
2e00: 6d 4f 62 6a 28 70 43 6d 64 2c 20 26 6e 29 3b 0a  mObj(pCmd, &n);.
2e10: 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30    while( n-- > 0
2e20: 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 20 3d 20   ){.    int c = 
2e30: 2a 28 7a 2b 2b 29 3b 0a 20 20 20 20 69 66 28 20  *(z++);.    if( 
2e40: 63 3d 3d 27 24 27 20 7c 7c 20 63 3d 3d 27 5b 27  c=='$' || c=='['
2e50: 20 7c 7c 20 63 3d 3d 27 3b 27 20 29 20 72 65 74   || c==';' ) ret
2e60: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
2e70: 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 1;.}../*.** 
2e80: 46 69 6e 64 20 61 6e 20 53 71 6c 46 75 6e 63 20  Find an SqlFunc 
2e90: 73 74 72 75 63 74 75 72 65 20 77 69 74 68 20 74  structure with t
2ea0: 68 65 20 67 69 76 65 6e 20 6e 61 6d 65 2e 20 20  he given name.  
2eb0: 4f 72 20 63 72 65 61 74 65 20 61 20 6e 65 77 0a  Or create a new.
2ec0: 2a 2a 20 6f 6e 65 20 69 66 20 61 6e 20 65 78 69  ** one if an exi
2ed0: 73 74 69 6e 67 20 6f 6e 65 20 63 61 6e 6e 6f 74  sting one cannot
2ee0: 20 62 65 20 66 6f 75 6e 64 2e 20 20 52 65 74 75   be found.  Retu
2ef0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
2f00: 74 68 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  the.** structure
2f10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 71 6c 46  ..*/.static SqlF
2f20: 75 6e 63 20 2a 66 69 6e 64 53 71 6c 46 75 6e 63  unc *findSqlFunc
2f30: 28 53 71 6c 69 74 65 44 62 20 2a 70 44 62 2c 20  (SqliteDb *pDb, 
2f40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
2f50: 65 29 7b 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70  e){.  SqlFunc *p
2f60: 2c 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69  , *pNew;.  int i
2f70: 3b 0a 20 20 70 4e 65 77 20 3d 20 28 53 71 6c 46  ;.  pNew = (SqlF
2f80: 75 6e 63 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20  unc*)Tcl_Alloc( 
2f90: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20  sizeof(*pNew) + 
2fa0: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 20 2b 20  strlen(zName) + 
2fb0: 31 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 7a 4e 61  1 );.  pNew->zNa
2fc0: 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65  me = (char*)&pNe
2fd0: 77 5b 31 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  w[1];.  for(i=0;
2fe0: 20 7a 4e 61 6d 65 5b 69 5d 3b 20 69 2b 2b 29 7b   zName[i]; i++){
2ff0: 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 5b 69 5d 20   pNew->zName[i] 
3000: 3d 20 74 6f 6c 6f 77 65 72 28 7a 4e 61 6d 65 5b  = tolower(zName[
3010: 69 5d 29 3b 20 7d 0a 20 20 70 4e 65 77 2d 3e 7a  i]); }.  pNew->z
3020: 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 66  Name[i] = 0;.  f
3030: 6f 72 28 70 3d 70 44 62 2d 3e 70 46 75 6e 63 3b  or(p=pDb->pFunc;
3040: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
3050: 20 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70   .    if( strcmp
3060: 28 70 2d 3e 7a 4e 61 6d 65 2c 20 70 4e 65 77 2d  (p->zName, pNew-
3070: 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  >zName)==0 ){.  
3080: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68      Tcl_Free((ch
3090: 61 72 2a 29 70 4e 65 77 29 3b 0a 20 20 20 20 20  ar*)pNew);.     
30a0: 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20 20 7d   return p;.    }
30b0: 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 69 6e 74  .  }.  pNew->int
30c0: 65 72 70 20 3d 20 70 44 62 2d 3e 69 6e 74 65 72  erp = pDb->inter
30d0: 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 63 72 69  p;.  pNew->pScri
30e0: 70 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  pt = 0;.  pNew->
30f0: 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 70 46 75  pNext = pDb->pFu
3100: 6e 63 3b 0a 20 20 70 44 62 2d 3e 70 46 75 6e 63  nc;.  pDb->pFunc
3110: 20 3d 20 70 4e 65 77 3b 0a 20 20 72 65 74 75 72   = pNew;.  retur
3120: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
3130: 20 46 69 6e 61 6c 69 7a 65 20 61 6e 64 20 66 72   Finalize and fr
3140: 65 65 20 61 20 6c 69 73 74 20 6f 66 20 70 72 65  ee a list of pre
3150: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73  pared statements
3160: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3170: 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28 20  flushStmtCache( 
3180: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 29 7b  SqliteDb *pDb ){
3190: 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74  .  SqlPreparedSt
31a0: 6d 74 20 2a 70 50 72 65 53 74 6d 74 3b 0a 0a 20  mt *pPreStmt;.. 
31b0: 20 77 68 69 6c 65 28 20 20 70 44 62 2d 3e 73 74   while(  pDb->st
31c0: 6d 74 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 71  mtList ){.    sq
31d0: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 20  lite3_finalize( 
31e0: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 2d 3e 70  pDb->stmtList->p
31f0: 53 74 6d 74 20 29 3b 0a 20 20 20 20 70 50 72 65  Stmt );.    pPre
3200: 53 74 6d 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74  Stmt = pDb->stmt
3210: 4c 69 73 74 3b 0a 20 20 20 20 70 44 62 2d 3e 73  List;.    pDb->s
3220: 74 6d 74 4c 69 73 74 20 3d 20 70 44 62 2d 3e 73  tmtList = pDb->s
3230: 74 6d 74 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a  tmtList->pNext;.
3240: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 20 28 63      Tcl_Free( (c
3250: 68 61 72 2a 29 70 50 72 65 53 74 6d 74 20 29 3b  har*)pPreStmt );
3260: 0a 20 20 7d 0a 20 20 70 44 62 2d 3e 6e 53 74 6d  .  }.  pDb->nStm
3270: 74 20 3d 20 30 3b 0a 20 20 70 44 62 2d 3e 73 74  t = 0;.  pDb->st
3280: 6d 74 4c 61 73 74 20 3d 20 30 3b 0a 7d 0a 0a 2f  mtLast = 0;.}../
3290: 2a 0a 2a 2a 20 54 43 4c 20 63 61 6c 6c 73 20 74  *.** TCL calls t
32a0: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 77 68  his procedure wh
32b0: 65 6e 20 61 6e 20 73 71 6c 69 74 65 33 20 64 61  en an sqlite3 da
32c0: 74 61 62 61 73 65 20 63 6f 6d 6d 61 6e 64 20 69  tabase command i
32d0: 73 0a 2a 2a 20 64 65 6c 65 74 65 64 2e 0a 2a 2f  s.** deleted..*/
32e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44 62 44  .static void DbD
32f0: 65 6c 65 74 65 43 6d 64 28 76 6f 69 64 20 2a 64  eleteCmd(void *d
3300: 62 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  b){.  SqliteDb *
3310: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a  pDb = (SqliteDb*
3320: 29 64 62 3b 0a 20 20 66 6c 75 73 68 53 74 6d 74  )db;.  flushStmt
3330: 43 61 63 68 65 28 70 44 62 29 3b 0a 20 20 63 6c  Cache(pDb);.  cl
3340: 6f 73 65 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  oseIncrblobChann
3350: 65 6c 73 28 70 44 62 29 3b 0a 20 20 73 71 6c 69  els(pDb);.  sqli
3360: 74 65 33 5f 63 6c 6f 73 65 28 70 44 62 2d 3e 64  te3_close(pDb->d
3370: 62 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 44 62  b);.  while( pDb
3380: 2d 3e 70 46 75 6e 63 20 29 7b 0a 20 20 20 20 53  ->pFunc ){.    S
3390: 71 6c 46 75 6e 63 20 2a 70 46 75 6e 63 20 3d 20  qlFunc *pFunc = 
33a0: 70 44 62 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20  pDb->pFunc;.    
33b0: 70 44 62 2d 3e 70 46 75 6e 63 20 3d 20 70 46 75  pDb->pFunc = pFu
33c0: 6e 63 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 54  nc->pNext;.    T
33d0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
33e0: 70 46 75 6e 63 2d 3e 70 53 63 72 69 70 74 29 3b  pFunc->pScript);
33f0: 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63  .    Tcl_Free((c
3400: 68 61 72 2a 29 70 46 75 6e 63 29 3b 0a 20 20 7d  har*)pFunc);.  }
3410: 0a 20 20 77 68 69 6c 65 28 20 70 44 62 2d 3e 70  .  while( pDb->p
3420: 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 53  Collate ){.    S
3430: 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c  qlCollate *pColl
3440: 61 74 65 20 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c  ate = pDb->pColl
3450: 61 74 65 3b 0a 20 20 20 20 70 44 62 2d 3e 70 43  ate;.    pDb->pC
3460: 6f 6c 6c 61 74 65 20 3d 20 70 43 6f 6c 6c 61 74  ollate = pCollat
3470: 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 54 63  e->pNext;.    Tc
3480: 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 43  l_Free((char*)pC
3490: 6f 6c 6c 61 74 65 29 3b 0a 20 20 7d 0a 20 20 69  ollate);.  }.  i
34a0: 66 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b  f( pDb->zBusy ){
34b0: 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44  .    Tcl_Free(pD
34c0: 62 2d 3e 7a 42 75 73 79 29 3b 0a 20 20 7d 0a 20  b->zBusy);.  }. 
34d0: 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65   if( pDb->zTrace
34e0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65   ){.    Tcl_Free
34f0: 28 70 44 62 2d 3e 7a 54 72 61 63 65 29 3b 0a 20  (pDb->zTrace);. 
3500: 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 50   }.  if( pDb->zP
3510: 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 54 63  rofile ){.    Tc
3520: 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 50 72 6f  l_Free(pDb->zPro
3530: 66 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  file);.  }.  if(
3540: 20 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20   pDb->zAuth ){. 
3550: 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d     Tcl_Free(pDb-
3560: 3e 7a 41 75 74 68 29 3b 0a 20 20 7d 0a 20 20 69  >zAuth);.  }.  i
3570: 66 28 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 29 7b  f( pDb->zNull ){
3580: 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44  .    Tcl_Free(pD
3590: 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20  b->zNull);.  }. 
35a0: 20 69 66 28 20 70 44 62 2d 3e 70 55 70 64 61 74   if( pDb->pUpdat
35b0: 65 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 54 63 6c  eHook ){.    Tcl
35c0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44  _DecrRefCount(pD
35d0: 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 29 3b  b->pUpdateHook);
35e0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e  .  }.  if( pDb->
35f0: 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 20 29 7b  pRollbackHook ){
3600: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
3610: 43 6f 75 6e 74 28 70 44 62 2d 3e 70 52 6f 6c 6c  Count(pDb->pRoll
3620: 62 61 63 6b 48 6f 6f 6b 29 3b 0a 20 20 7d 0a 20  backHook);.  }. 
3630: 20 69 66 28 20 70 44 62 2d 3e 70 43 6f 6c 6c 61   if( pDb->pColla
3640: 74 65 4e 65 65 64 65 64 20 29 7b 0a 20 20 20 20  teNeeded ){.    
3650: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
3660: 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65  (pDb->pCollateNe
3670: 65 64 65 64 29 3b 0a 20 20 7d 0a 20 20 54 63 6c  eded);.  }.  Tcl
3680: 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 44 62  _Free((char*)pDb
3690: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
36a0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
36b0: 65 64 20 77 68 65 6e 20 61 20 64 61 74 61 62 61  ed when a databa
36c0: 73 65 20 66 69 6c 65 20 69 73 20 6c 6f 63 6b 65  se file is locke
36d0: 64 20 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a  d while trying.*
36e0: 2a 20 74 6f 20 65 78 65 63 75 74 65 20 53 51 4c  * to execute SQL
36f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3700: 44 62 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f  DbBusyHandler(vo
3710: 69 64 20 2a 63 64 2c 20 69 6e 74 20 6e 54 72 69  id *cd, int nTri
3720: 65 73 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20  es){.  SqliteDb 
3730: 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62  *pDb = (SqliteDb
3740: 2a 29 63 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  *)cd;.  int rc;.
3750: 20 20 63 68 61 72 20 7a 56 61 6c 5b 33 30 5d 3b    char zVal[30];
3760: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ..  sqlite3_snpr
3770: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 56 61 6c  intf(sizeof(zVal
3780: 29 2c 20 7a 56 61 6c 2c 20 22 25 64 22 2c 20 6e  ), zVal, "%d", n
3790: 54 72 69 65 73 29 3b 0a 20 20 72 63 20 3d 20 54  Tries);.  rc = T
37a0: 63 6c 5f 56 61 72 45 76 61 6c 28 70 44 62 2d 3e  cl_VarEval(pDb->
37b0: 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 42 75  interp, pDb->zBu
37c0: 73 79 2c 20 22 20 22 2c 20 7a 56 61 6c 2c 20 28  sy, " ", zVal, (
37d0: 63 68 61 72 2a 29 30 29 3b 0a 20 20 69 66 28 20  char*)0);.  if( 
37e0: 72 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74  rc!=TCL_OK || at
37f0: 6f 69 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  oi(Tcl_GetString
3800: 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65  Result(pDb->inte
3810: 72 70 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75  rp)) ){.    retu
3820: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
3830: 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn 1;.}../*.** T
3840: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69  his routine is i
3850: 6e 76 6f 6b 65 64 20 61 73 20 74 68 65 20 27 70  nvoked as the 'p
3860: 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b  rogress callback
3870: 27 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  ' for the databa
3880: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
3890: 74 20 44 62 50 72 6f 67 72 65 73 73 48 61 6e 64  t DbProgressHand
38a0: 6c 65 72 28 76 6f 69 64 20 2a 63 64 29 7b 0a 20  ler(void *cd){. 
38b0: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
38c0: 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a   (SqliteDb*)cd;.
38d0: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
38e0: 65 72 74 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72  ert( pDb->zProgr
38f0: 65 73 73 20 29 3b 0a 20 20 72 63 20 3d 20 54 63  ess );.  rc = Tc
3900: 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65  l_Eval(pDb->inte
3910: 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65  rp, pDb->zProgre
3920: 73 73 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 54  ss);.  if( rc!=T
3930: 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28 54 63  CL_OK || atoi(Tc
3940: 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
3950: 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 29 20  t(pDb->interp)) 
3960: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
3970: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
3980: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
3990: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a  TE_OMIT_TRACE./*
39a0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
39b0: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
39c0: 65 20 53 51 4c 69 74 65 20 74 72 61 63 65 20 68  e SQLite trace h
39d0: 61 6e 64 6c 65 72 20 77 68 65 6e 65 76 65 72 20  andler whenever 
39e0: 61 20 6e 65 77 0a 2a 2a 20 62 6c 6f 63 6b 20 6f  a new.** block o
39f0: 66 20 53 51 4c 20 69 73 20 65 78 65 63 75 74 65  f SQL is execute
3a00: 64 2e 20 20 54 68 65 20 54 43 4c 20 73 63 72 69  d.  The TCL scri
3a10: 70 74 20 69 6e 20 70 44 62 2d 3e 7a 54 72 61 63  pt in pDb->zTrac
3a20: 65 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a 2a  e is executed..*
3a30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44 62  /.static void Db
3a40: 54 72 61 63 65 48 61 6e 64 6c 65 72 28 76 6f 69  TraceHandler(voi
3a50: 64 20 2a 63 64 2c 20 63 6f 6e 73 74 20 63 68 61  d *cd, const cha
3a60: 72 20 2a 7a 53 71 6c 29 7b 0a 20 20 53 71 6c 69  r *zSql){.  Sqli
3a70: 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c  teDb *pDb = (Sql
3a80: 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 54 63 6c  iteDb*)cd;.  Tcl
3a90: 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a 0a 20  _DString str;.. 
3aa0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
3ab0: 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f 44 53  (&str);.  Tcl_DS
3ac0: 74 72 69 6e 67 41 70 70 65 6e 64 28 26 73 74 72  tringAppend(&str
3ad0: 2c 20 70 44 62 2d 3e 7a 54 72 61 63 65 2c 20 2d  , pDb->zTrace, -
3ae0: 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  1);.  Tcl_DStrin
3af0: 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26  gAppendElement(&
3b00: 73 74 72 2c 20 7a 53 71 6c 29 3b 0a 20 20 54 63  str, zSql);.  Tc
3b10: 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65  l_Eval(pDb->inte
3b20: 72 70 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56  rp, Tcl_DStringV
3b30: 61 6c 75 65 28 26 73 74 72 29 29 3b 0a 20 20 54  alue(&str));.  T
3b40: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
3b50: 73 74 72 29 3b 0a 20 20 54 63 6c 5f 52 65 73 65  str);.  Tcl_Rese
3b60: 74 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74  tResult(pDb->int
3b70: 65 72 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  erp);.}.#endif..
3b80: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
3b90: 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20  MIT_TRACE./*.** 
3ba0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
3bb0: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 53 51  called by the SQ
3bc0: 4c 69 74 65 20 70 72 6f 66 69 6c 65 20 68 61 6e  Lite profile han
3bd0: 64 6c 65 72 20 61 66 74 65 72 20 61 20 73 74 61  dler after a sta
3be0: 74 65 6d 65 6e 74 0a 2a 2a 20 53 51 4c 20 68 61  tement.** SQL ha
3bf0: 73 20 65 78 65 63 75 74 65 64 2e 20 20 54 68 65  s executed.  The
3c00: 20 54 43 4c 20 73 63 72 69 70 74 20 69 6e 20 70   TCL script in p
3c10: 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 69 73 20  Db->zProfile is 
3c20: 65 76 61 6c 75 61 74 65 64 2e 0a 2a 2f 0a 73 74  evaluated..*/.st
3c30: 61 74 69 63 20 76 6f 69 64 20 44 62 50 72 6f 66  atic void DbProf
3c40: 69 6c 65 48 61 6e 64 6c 65 72 28 76 6f 69 64 20  ileHandler(void 
3c50: 2a 63 64 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *cd, const char 
3c60: 2a 7a 53 71 6c 2c 20 73 71 6c 69 74 65 5f 75 69  *zSql, sqlite_ui
3c70: 6e 74 36 34 20 74 6d 29 7b 0a 20 20 53 71 6c 69  nt64 tm){.  Sqli
3c80: 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c  teDb *pDb = (Sql
3c90: 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 54 63 6c  iteDb*)cd;.  Tcl
3ca0: 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a 20 20  _DString str;.  
3cb0: 63 68 61 72 20 7a 54 6d 5b 31 30 30 5d 3b 0a 0a  char zTm[100];..
3cc0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
3cd0: 74 66 28 73 69 7a 65 6f 66 28 7a 54 6d 29 2d 31  tf(sizeof(zTm)-1
3ce0: 2c 20 7a 54 6d 2c 20 22 25 6c 6c 64 22 2c 20 74  , zTm, "%lld", t
3cf0: 6d 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  m);.  Tcl_DStrin
3d00: 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 54  gInit(&str);.  T
3d10: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
3d20: 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a 50 72 6f  (&str, pDb->zPro
3d30: 66 69 6c 65 2c 20 2d 31 29 3b 0a 20 20 54 63 6c  file, -1);.  Tcl
3d40: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c  _DStringAppendEl
3d50: 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 53 71 6c  ement(&str, zSql
3d60: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
3d70: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73  AppendElement(&s
3d80: 74 72 2c 20 7a 54 6d 29 3b 0a 20 20 54 63 6c 5f  tr, zTm);.  Tcl_
3d90: 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70  Eval(pDb->interp
3da0: 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c  , Tcl_DStringVal
3db0: 75 65 28 26 73 74 72 29 29 3b 0a 20 20 54 63 6c  ue(&str));.  Tcl
3dc0: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 73 74  _DStringFree(&st
3dd0: 72 29 3b 0a 20 20 54 63 6c 5f 52 65 73 65 74 52  r);.  Tcl_ResetR
3de0: 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72  esult(pDb->inter
3df0: 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  p);.}.#endif../*
3e00: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
3e10: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
3e20: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
3e30: 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 54 68 65   committed.  The
3e40: 0a 2a 2a 20 54 43 4c 20 73 63 72 69 70 74 20 69  .** TCL script i
3e50: 6e 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 69  n pDb->zCommit i
3e60: 73 20 65 78 65 63 75 74 65 64 2e 20 20 49 66 20  s executed.  If 
3e70: 69 74 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a  it returns non-z
3e80: 65 72 6f 20 6f 72 0a 2a 2a 20 69 66 20 69 74 20  ero or.** if it 
3e90: 74 68 72 6f 77 73 20 61 6e 20 65 78 63 65 70 74  throws an except
3ea0: 69 6f 6e 2c 20 74 68 65 20 74 72 61 6e 73 61 63  ion, the transac
3eb0: 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
3ec0: 61 63 6b 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f  ack instead.** o
3ed0: 66 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65  f being committe
3ee0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
3ef0: 20 44 62 43 6f 6d 6d 69 74 48 61 6e 64 6c 65 72   DbCommitHandler
3f00: 28 76 6f 69 64 20 2a 63 64 29 7b 0a 20 20 53 71  (void *cd){.  Sq
3f10: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
3f20: 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69  qliteDb*)cd;.  i
3f30: 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 54  nt rc;..  rc = T
3f40: 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74  cl_Eval(pDb->int
3f50: 65 72 70 2c 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69  erp, pDb->zCommi
3f60: 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 54 43  t);.  if( rc!=TC
3f70: 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28 54 63 6c  L_OK || atoi(Tcl
3f80: 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74  _GetStringResult
3f90: 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 29 20 29  (pDb->interp)) )
3fa0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
3fb0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
3fc0: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44  }..static void D
3fd0: 62 52 6f 6c 6c 62 61 63 6b 48 61 6e 64 6c 65 72  bRollbackHandler
3fe0: 28 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74  (void *clientDat
3ff0: 61 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  a){.  SqliteDb *
4000: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a  pDb = (SqliteDb*
4010: 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 61  )clientData;.  a
4020: 73 73 65 72 74 28 70 44 62 2d 3e 70 52 6f 6c 6c  ssert(pDb->pRoll
4030: 62 61 63 6b 48 6f 6f 6b 29 3b 0a 20 20 69 66 28  backHook);.  if(
4040: 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 45 76 61   TCL_OK!=Tcl_Eva
4050: 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65  lObjEx(pDb->inte
4060: 72 70 2c 20 70 44 62 2d 3e 70 52 6f 6c 6c 62 61  rp, pDb->pRollba
4070: 63 6b 48 6f 6f 6b 2c 20 30 29 20 29 7b 0a 20 20  ckHook, 0) ){.  
4080: 20 20 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64    Tcl_Background
4090: 45 72 72 6f 72 28 70 44 62 2d 3e 69 6e 74 65 72  Error(pDb->inter
40a0: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  p);.  }.}..stati
40b0: 63 20 76 6f 69 64 20 44 62 55 70 64 61 74 65 48  c void DbUpdateH
40c0: 61 6e 64 6c 65 72 28 0a 20 20 76 6f 69 64 20 2a  andler(.  void *
40d0: 70 2c 20 0a 20 20 69 6e 74 20 6f 70 2c 0a 20 20  p, .  int op,.  
40e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c  const char *zDb,
40f0: 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
4100: 7a 54 62 6c 2c 20 0a 20 20 73 71 6c 69 74 65 5f  zTbl, .  sqlite_
4110: 69 6e 74 36 34 20 72 6f 77 69 64 0a 29 7b 0a 20  int64 rowid.){. 
4120: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
4130: 20 28 53 71 6c 69 74 65 44 62 20 2a 29 70 3b 0a   (SqliteDb *)p;.
4140: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b    Tcl_Obj *pCmd;
4150: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 2d  ..  assert( pDb-
4160: 3e 70 55 70 64 61 74 65 48 6f 6f 6b 20 29 3b 0a  >pUpdateHook );.
4170: 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 51    assert( op==SQ
4180: 4c 49 54 45 5f 49 4e 53 45 52 54 20 7c 7c 20 6f  LITE_INSERT || o
4190: 70 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45  p==SQLITE_UPDATE
41a0: 20 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 44   || op==SQLITE_D
41b0: 45 4c 45 54 45 20 29 3b 0a 0a 20 20 70 43 6d 64  ELETE );..  pCmd
41c0: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
41d0: 4f 62 6a 28 70 44 62 2d 3e 70 55 70 64 61 74 65  Obj(pDb->pUpdate
41e0: 48 6f 6f 6b 29 3b 0a 20 20 54 63 6c 5f 49 6e 63  Hook);.  Tcl_Inc
41f0: 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b  rRefCount(pCmd);
4200: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
4210: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
4220: 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Cmd, Tcl_NewStri
4230: 6e 67 4f 62 6a 28 0a 20 20 20 20 28 20 28 6f 70  ngObj(.    ( (op
4240: 3d 3d 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 29  ==SQLITE_INSERT)
4250: 3f 22 49 4e 53 45 52 54 22 3a 28 6f 70 3d 3d 53  ?"INSERT":(op==S
4260: 51 4c 49 54 45 5f 55 50 44 41 54 45 29 3f 22 55  QLITE_UPDATE)?"U
4270: 50 44 41 54 45 22 3a 22 44 45 4c 45 54 45 22 29  PDATE":"DELETE")
4280: 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
4290: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
42a0: 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f  nt(0, pCmd, Tcl_
42b0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 44 62  NewStringObj(zDb
42c0: 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
42d0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
42e0: 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f  nt(0, pCmd, Tcl_
42f0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54 62  NewStringObj(zTb
4300: 6c 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c  l, -1));.  Tcl_L
4310: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
4320: 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c  ent(0, pCmd, Tcl
4330: 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 72  _NewWideIntObj(r
4340: 6f 77 69 64 29 29 3b 0a 20 20 54 63 6c 5f 45 76  owid));.  Tcl_Ev
4350: 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69 6e 74  alObjEx(pDb->int
4360: 65 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c 5f 45  erp, pCmd, TCL_E
4370: 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 7d 0a 0a  VAL_DIRECT);.}..
4380: 73 74 61 74 69 63 20 76 6f 69 64 20 74 63 6c 43  static void tclC
4390: 6f 6c 6c 61 74 65 4e 65 65 64 65 64 28 0a 20 20  ollateNeeded(.  
43a0: 76 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20 73 71  void *pCtx,.  sq
43b0: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74  lite3 *db,.  int
43c0: 20 65 6e 63 2c 0a 20 20 63 6f 6e 73 74 20 63 68   enc,.  const ch
43d0: 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 53  ar *zName.){.  S
43e0: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
43f0: 53 71 6c 69 74 65 44 62 20 2a 29 70 43 74 78 3b  SqliteDb *)pCtx;
4400: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72  .  Tcl_Obj *pScr
4410: 69 70 74 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63  ipt = Tcl_Duplic
4420: 61 74 65 4f 62 6a 28 70 44 62 2d 3e 70 43 6f 6c  ateObj(pDb->pCol
4430: 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 54  lateNeeded);.  T
4440: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
4450: 70 53 63 72 69 70 74 29 3b 0a 20 20 54 63 6c 5f  pScript);.  Tcl_
4460: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
4470: 6d 65 6e 74 28 30 2c 20 70 53 63 72 69 70 74 2c  ment(0, pScript,
4480: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
4490: 6a 28 7a 4e 61 6d 65 2c 20 2d 31 29 29 3b 0a 20  j(zName, -1));. 
44a0: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70   Tcl_EvalObjEx(p
44b0: 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 53 63 72  Db->interp, pScr
44c0: 69 70 74 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44  ipt, 0);.  Tcl_D
44d0: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72  ecrRefCount(pScr
44e0: 69 70 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ipt);.}../*.** T
44f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
4500: 61 6c 6c 65 64 20 74 6f 20 65 76 61 6c 75 61 74  alled to evaluat
4510: 65 20 61 6e 20 53 51 4c 20 63 6f 6c 6c 61 74 69  e an SQL collati
4520: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c  on function impl
4530: 65 6d 65 6e 74 65 64 0a 2a 2a 20 75 73 69 6e 67  emented.** using
4540: 20 54 43 4c 20 73 63 72 69 70 74 2e 0a 2a 2f 0a   TCL script..*/.
4550: 73 74 61 74 69 63 20 69 6e 74 20 74 63 6c 53 71  static int tclSq
4560: 6c 43 6f 6c 6c 61 74 65 28 0a 20 20 76 6f 69 64  lCollate(.  void
4570: 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e 41   *pCtx,.  int nA
4580: 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ,.  const void *
4590: 7a 41 2c 0a 20 20 69 6e 74 20 6e 42 2c 0a 20 20  zA,.  int nB,.  
45a0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 0a 29  const void *zB.)
45b0: 7b 0a 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a  {.  SqlCollate *
45c0: 70 20 3d 20 28 53 71 6c 43 6f 6c 6c 61 74 65 20  p = (SqlCollate 
45d0: 2a 29 70 43 74 78 3b 0a 20 20 54 63 6c 5f 4f 62  *)pCtx;.  Tcl_Ob
45e0: 6a 20 2a 70 43 6d 64 3b 0a 0a 20 20 70 43 6d 64  j *pCmd;..  pCmd
45f0: 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
4600: 4f 62 6a 28 70 2d 3e 7a 53 63 72 69 70 74 2c 20  Obj(p->zScript, 
4610: 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52  -1);.  Tcl_IncrR
4620: 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20  efCount(pCmd);. 
4630: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
4640: 6e 64 45 6c 65 6d 65 6e 74 28 70 2d 3e 69 6e 74  ndElement(p->int
4650: 65 72 70 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e  erp, pCmd, Tcl_N
4660: 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 41 2c 20  ewStringObj(zA, 
4670: 6e 41 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  nA));.  Tcl_List
4680: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
4690: 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64  (p->interp, pCmd
46a0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
46b0: 62 6a 28 7a 42 2c 20 6e 42 29 29 3b 0a 20 20 54  bj(zB, nB));.  T
46c0: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e  cl_EvalObjEx(p->
46d0: 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 43  interp, pCmd, TC
46e0: 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a  L_EVAL_DIRECT);.
46f0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
4700: 6e 74 28 70 43 6d 64 29 3b 0a 20 20 72 65 74 75  nt(pCmd);.  retu
4710: 72 6e 20 28 61 74 6f 69 28 54 63 6c 5f 47 65 74  rn (atoi(Tcl_Get
4720: 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e  StringResult(p->
4730: 69 6e 74 65 72 70 29 29 29 3b 0a 7d 0a 0a 2f 2a  interp)));.}../*
4740: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
4750: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 76   is called to ev
4760: 61 6c 75 61 74 65 20 61 6e 20 53 51 4c 20 66 75  aluate an SQL fu
4770: 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74  nction implement
4780: 65 64 0a 2a 2a 20 75 73 69 6e 67 20 54 43 4c 20  ed.** using TCL 
4790: 73 63 72 69 70 74 2e 0a 2a 2f 0a 73 74 61 74 69  script..*/.stati
47a0: 63 20 76 6f 69 64 20 74 63 6c 53 71 6c 46 75 6e  c void tclSqlFun
47b0: 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  c(sqlite3_contex
47c0: 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20  t *context, int 
47d0: 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
47e0: 6c 75 65 2a 2a 61 72 67 76 29 7b 0a 20 20 53 71  lue**argv){.  Sq
47f0: 6c 46 75 6e 63 20 2a 70 20 3d 20 73 71 6c 69 74  lFunc *p = sqlit
4800: 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e  e3_user_data(con
4810: 74 65 78 74 29 3b 0a 20 20 54 63 6c 5f 4f 62 6a  text);.  Tcl_Obj
4820: 20 2a 70 43 6d 64 3b 0a 20 20 69 6e 74 20 69 3b   *pCmd;.  int i;
4830: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
4840: 28 20 61 72 67 63 3d 3d 30 20 29 7b 0a 20 20 20  ( argc==0 ){.   
4850: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
4860: 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20 74 6f   no arguments to
4870: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c 20 63   the function, c
4880: 61 6c 6c 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  all Tcl_EvalObjE
4890: 78 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  x on the.    ** 
48a0: 73 63 72 69 70 74 20 6f 62 6a 65 63 74 20 64 69  script object di
48b0: 72 65 63 74 6c 79 2e 20 20 54 68 69 73 20 61 6c  rectly.  This al
48c0: 6c 6f 77 73 20 74 68 65 20 54 43 4c 20 63 6f 6d  lows the TCL com
48d0: 70 69 6c 65 72 20 74 6f 20 67 65 6e 65 72 61 74  piler to generat
48e0: 65 0a 20 20 20 20 2a 2a 20 62 79 74 65 63 6f 64  e.    ** bytecod
48f0: 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 61 6e  e for the comman
4900: 64 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 69  d on the first i
4910: 6e 76 6f 63 61 74 69 6f 6e 20 61 6e 64 20 74 68  nvocation and th
4920: 75 73 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73  us make.    ** s
4930: 75 62 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61  ubsequent invoca
4940: 74 69 6f 6e 73 20 6d 75 63 68 20 66 61 73 74 65  tions much faste
4950: 72 2e 20 2a 2f 0a 20 20 20 20 70 43 6d 64 20 3d  r. */.    pCmd =
4960: 20 70 2d 3e 70 53 63 72 69 70 74 3b 0a 20 20 20   p->pScript;.   
4970: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
4980: 74 28 70 43 6d 64 29 3b 0a 20 20 20 20 72 63 20  t(pCmd);.    rc 
4990: 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28  = Tcl_EvalObjEx(
49a0: 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c  p->interp, pCmd,
49b0: 20 30 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63   0);.    Tcl_Dec
49c0: 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b  rRefCount(pCmd);
49d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
49e0: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61 72   If there are ar
49f0: 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 66  guments to the f
4a00: 75 6e 63 74 69 6f 6e 2c 20 6d 61 6b 65 20 61 20  unction, make a 
4a10: 73 68 61 6c 6c 6f 77 20 63 6f 70 79 20 6f 66 20  shallow copy of 
4a20: 74 68 65 0a 20 20 20 20 2a 2a 20 73 63 72 69 70  the.    ** scrip
4a30: 74 20 6f 62 6a 65 63 74 2c 20 6c 61 70 70 65 6e  t object, lappen
4a40: 64 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 2c  d the arguments,
4a50: 20 74 68 65 6e 20 65 76 61 6c 75 61 74 65 20 74   then evaluate t
4a60: 68 65 20 63 6f 70 79 2e 0a 20 20 20 20 2a 2a 0a  he copy..    **.
4a70: 20 20 20 20 2a 2a 20 42 79 20 22 73 68 61 6c 6c      ** By "shall
4a80: 6f 77 22 20 63 6f 70 79 2c 20 77 65 20 6d 65 61  ow" copy, we mea
4a90: 6e 20 61 20 6f 6e 6c 79 20 74 68 65 20 6f 75 74  n a only the out
4aa0: 65 72 20 6c 69 73 74 20 54 63 6c 5f 4f 62 6a 20  er list Tcl_Obj 
4ab0: 69 73 20 64 75 70 6c 69 63 61 74 65 64 2e 0a 20  is duplicated.. 
4ac0: 20 20 20 2a 2a 20 54 68 65 20 6e 65 77 20 54 63     ** The new Tc
4ad0: 6c 5f 4f 62 6a 20 63 6f 6e 74 61 69 6e 73 20 70  l_Obj contains p
4ae0: 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65 20 6f  ointers to the o
4af0: 72 69 67 69 6e 61 6c 20 6c 69 73 74 20 65 6c 65  riginal list ele
4b00: 6d 65 6e 74 73 2e 20 0a 20 20 20 20 2a 2a 20 54  ments. .    ** T
4b10: 68 61 74 20 77 61 79 2c 20 77 68 65 6e 20 54 63  hat way, when Tc
4b20: 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 69 73 20  l_EvalObjv() is 
4b30: 72 75 6e 20 61 6e 64 20 73 68 69 6d 6d 65 72 73  run and shimmers
4b40: 20 74 68 65 20 66 69 72 73 74 20 65 6c 65 6d 65   the first eleme
4b50: 6e 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  nt.    ** of the
4b60: 20 6c 69 73 74 20 74 6f 20 74 63 6c 43 6d 64 4e   list to tclCmdN
4b70: 61 6d 65 54 79 70 65 2c 20 74 68 61 74 20 61 6c  ameType, that al
4b80: 74 65 72 6e 61 74 65 20 72 65 70 72 65 73 65 6e  ternate represen
4b90: 74 61 74 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20  tation will.    
4ba0: 2a 2a 20 62 65 20 70 72 65 73 65 72 76 65 64 20  ** be preserved 
4bb0: 61 6e 64 20 72 65 75 73 65 64 20 6f 6e 20 74 68  and reused on th
4bc0: 65 20 6e 65 78 74 20 69 6e 76 6f 63 61 74 69 6f  e next invocatio
4bd0: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 54 63  n..    */.    Tc
4be0: 6c 5f 4f 62 6a 20 2a 2a 61 41 72 67 3b 0a 20 20  l_Obj **aArg;.  
4bf0: 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20    int nArg;.    
4c00: 69 66 28 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 47  if( Tcl_ListObjG
4c10: 65 74 45 6c 65 6d 65 6e 74 73 28 70 2d 3e 69 6e  etElements(p->in
4c20: 74 65 72 70 2c 20 70 2d 3e 70 53 63 72 69 70 74  terp, p->pScript
4c30: 2c 20 26 6e 41 72 67 2c 20 26 61 41 72 67 29 20  , &nArg, &aArg) 
4c40: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
4c50: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
4c60: 6e 74 65 78 74 2c 20 54 63 6c 5f 47 65 74 53 74  ntext, Tcl_GetSt
4c70: 72 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e  ringResult(p->in
4c80: 74 65 72 70 29 2c 20 2d 31 29 3b 20 0a 20 20 20  terp), -1); .   
4c90: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
4ca0: 20 20 20 20 20 0a 20 20 20 20 70 43 6d 64 20 3d       .    pCmd =
4cb0: 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28   Tcl_NewListObj(
4cc0: 6e 41 72 67 2c 20 61 41 72 67 29 3b 0a 20 20 20  nArg, aArg);.   
4cd0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
4ce0: 74 28 70 43 6d 64 29 3b 0a 20 20 20 20 66 6f 72  t(pCmd);.    for
4cf0: 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b  (i=0; i<argc; i+
4d00: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
4d10: 33 5f 76 61 6c 75 65 20 2a 70 49 6e 20 3d 20 61  3_value *pIn = a
4d20: 72 67 76 5b 69 5d 3b 0a 20 20 20 20 20 20 54 63  rgv[i];.      Tc
4d30: 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b 0a 20 20 20  l_Obj *pVal;.   
4d40: 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20           .      
4d50: 2f 2a 20 53 65 74 20 70 56 61 6c 20 74 6f 20 63  /* Set pVal to c
4d60: 6f 6e 74 61 69 6e 20 74 68 65 20 69 27 74 68 20  ontain the i'th 
4d70: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 69 73 20 72  column of this r
4d80: 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 73 77 69  ow. */.      swi
4d90: 74 63 68 28 20 73 71 6c 69 74 65 33 5f 76 61 6c  tch( sqlite3_val
4da0: 75 65 5f 74 79 70 65 28 70 49 6e 29 20 29 7b 0a  ue_type(pIn) ){.
4db0: 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
4dc0: 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20  ITE_BLOB: {.    
4dd0: 20 20 20 20 20 20 69 6e 74 20 62 79 74 65 73 20        int bytes 
4de0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
4df0: 62 79 74 65 73 28 70 49 6e 29 3b 0a 20 20 20 20  bytes(pIn);.    
4e00: 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c        pVal = Tcl
4e10: 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a  _NewByteArrayObj
4e20: 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62  (sqlite3_value_b
4e30: 6c 6f 62 28 70 49 6e 29 2c 20 62 79 74 65 73 29  lob(pIn), bytes)
4e40: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
4e50: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
4e60: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
4e70: 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20  _INTEGER: {.    
4e80: 20 20 20 20 20 20 73 71 6c 69 74 65 5f 69 6e 74        sqlite_int
4e90: 36 34 20 76 20 3d 20 73 71 6c 69 74 65 33 5f 76  64 v = sqlite3_v
4ea0: 61 6c 75 65 5f 69 6e 74 36 34 28 70 49 6e 29 3b  alue_int64(pIn);
4eb0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 76  .          if( v
4ec0: 3e 3d 2d 32 31 34 37 34 38 33 36 34 37 20 26 26  >=-2147483647 &&
4ed0: 20 76 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29   v<=2147483647 )
4ee0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 56  {.            pV
4ef0: 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  al = Tcl_NewIntO
4f00: 62 6a 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  bj(v);.         
4f10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
4f20: 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e      pVal = Tcl_N
4f30: 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 76 29 3b  ewWideIntObj(v);
4f40: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
4f50: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
4f60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4f70: 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41  case SQLITE_FLOA
4f80: 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 64  T: {.          d
4f90: 6f 75 62 6c 65 20 72 20 3d 20 73 71 6c 69 74 65  ouble r = sqlite
4fa0: 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 70  3_value_double(p
4fb0: 49 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  In);.          p
4fc0: 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 44 6f 75  Val = Tcl_NewDou
4fd0: 62 6c 65 4f 62 6a 28 72 29 3b 0a 20 20 20 20 20  bleObj(r);.     
4fe0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4ff0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61      }.        ca
5000: 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20  se SQLITE_NULL: 
5010: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 56 61 6c  {.          pVal
5020: 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
5030: 4f 62 6a 28 22 22 2c 20 30 29 3b 0a 20 20 20 20  Obj("", 0);.    
5040: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5050: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 64       }.        d
5060: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
5070: 20 20 20 20 69 6e 74 20 62 79 74 65 73 20 3d 20      int bytes = 
5080: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
5090: 74 65 73 28 70 49 6e 29 3b 0a 20 20 20 20 20 20  tes(pIn);.      
50a0: 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e      pVal = Tcl_N
50b0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61  ewStringObj((cha
50c0: 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  r *)sqlite3_valu
50d0: 65 5f 74 65 78 74 28 70 49 6e 29 2c 20 62 79 74  e_text(pIn), byt
50e0: 65 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  es);.          b
50f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
5100: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
5110: 20 3d 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70   = Tcl_ListObjAp
5120: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d 3e 69  pendElement(p->i
5130: 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 70 56 61  nterp, pCmd, pVa
5140: 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  l);.      if( rc
5150: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
5160: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d  DecrRefCount(pCm
5170: 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  d);.        sqli
5180: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
5190: 28 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f 47 65  (context, Tcl_Ge
51a0: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 2d  tStringResult(p-
51b0: 3e 69 6e 74 65 72 70 29 2c 20 2d 31 29 3b 20 0a  >interp), -1); .
51c0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
51d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
51e0: 20 20 69 66 28 20 21 70 2d 3e 75 73 65 45 76 61    if( !p->useEva
51f0: 6c 4f 62 6a 76 20 29 7b 0a 20 20 20 20 20 20 2f  lObjv ){.      /
5200: 2a 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28  * Tcl_EvalObjEx(
5210: 29 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63  ) will automatic
5220: 61 6c 6c 79 20 63 61 6c 6c 20 54 63 6c 5f 45 76  ally call Tcl_Ev
5230: 61 6c 4f 62 6a 76 28 29 20 69 66 20 70 43 6d 64  alObjv() if pCmd
5240: 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 20 6c  .      ** is a l
5250: 69 73 74 20 77 69 74 68 6f 75 74 20 61 20 73 74  ist without a st
5260: 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74  ring representat
5270: 69 6f 6e 2e 20 20 54 6f 20 70 72 65 76 65 6e 74  ion.  To prevent
5280: 20 74 68 69 73 20 66 72 6f 6d 0a 20 20 20 20 20   this from.     
5290: 20 2a 2a 20 68 61 70 70 65 6e 69 6e 67 2c 20 6d   ** happening, m
52a0: 61 6b 65 20 73 75 72 65 20 70 43 6d 64 20 68 61  ake sure pCmd ha
52b0: 73 20 61 20 76 61 6c 69 64 20 73 74 72 69 6e 67  s a valid string
52c0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
52d0: 2a 2f 0a 20 20 20 20 20 20 54 63 6c 5f 47 65 74  */.      Tcl_Get
52e0: 53 74 72 69 6e 67 28 70 43 6d 64 29 3b 0a 20 20  String(pCmd);.  
52f0: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 54 63 6c    }.    rc = Tcl
5300: 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e  _EvalObjEx(p->in
5310: 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c 5f  terp, pCmd, TCL_
5320: 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20  EVAL_DIRECT);.  
5330: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
5340: 6e 74 28 70 43 6d 64 29 3b 0a 20 20 7d 0a 0a 20  nt(pCmd);.  }.. 
5350: 20 69 66 28 20 72 63 20 26 26 20 72 63 21 3d 54   if( rc && rc!=T
5360: 43 4c 5f 52 45 54 55 52 4e 20 29 7b 0a 20 20 20  CL_RETURN ){.   
5370: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
5380: 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 54  error(context, T
5390: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
53a0: 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c 20 2d  lt(p->interp), -
53b0: 31 29 3b 20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  1); .  }else{.  
53c0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 72 20    Tcl_Obj *pVar 
53d0: 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75  = Tcl_GetObjResu
53e0: 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 3b 0a 20  lt(p->interp);. 
53f0: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 75 38     int n;.    u8
5400: 20 2a 64 61 74 61 3b 0a 20 20 20 20 63 68 61 72   *data;.    char
5410: 20 2a 7a 54 79 70 65 20 3d 20 70 56 61 72 2d 3e   *zType = pVar->
5420: 74 79 70 65 50 74 72 20 3f 20 70 56 61 72 2d 3e  typePtr ? pVar->
5430: 74 79 70 65 50 74 72 2d 3e 6e 61 6d 65 20 3a 20  typePtr->name : 
5440: 22 22 3b 0a 20 20 20 20 63 68 61 72 20 63 20 3d  "";.    char c =
5450: 20 7a 54 79 70 65 5b 30 5d 3b 0a 20 20 20 20 69   zType[0];.    i
5460: 66 28 20 63 3d 3d 27 62 27 20 26 26 20 73 74 72  f( c=='b' && str
5470: 63 6d 70 28 7a 54 79 70 65 2c 22 62 79 74 65 61  cmp(zType,"bytea
5480: 72 72 61 79 22 29 3d 3d 30 20 26 26 20 70 56 61  rray")==0 && pVa
5490: 72 2d 3e 62 79 74 65 73 3d 3d 30 20 29 7b 0a 20  r->bytes==0 ){. 
54a0: 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 72 65 74       /* Only ret
54b0: 75 72 6e 20 61 20 42 4c 4f 42 20 74 79 70 65 20  urn a BLOB type 
54c0: 69 66 20 74 68 65 20 54 63 6c 20 76 61 72 69 61  if the Tcl varia
54d0: 62 6c 65 20 69 73 20 61 20 62 79 74 65 61 72 72  ble is a bytearr
54e0: 61 79 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  ay and.      ** 
54f0: 68 61 73 20 6e 6f 20 73 74 72 69 6e 67 20 72 65  has no string re
5500: 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20 2a 2f  presentation. */
5510: 0a 20 20 20 20 20 20 64 61 74 61 20 3d 20 54 63  .      data = Tc
5520: 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72  l_GetByteArrayFr
5530: 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b  omObj(pVar, &n);
5540: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
5550: 65 73 75 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65  esult_blob(conte
5560: 78 74 2c 20 64 61 74 61 2c 20 6e 2c 20 53 51 4c  xt, data, n, SQL
5570: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
5580: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
5590: 3d 27 62 27 20 26 26 20 73 74 72 63 6d 70 28 7a  ='b' && strcmp(z
55a0: 54 79 70 65 2c 22 62 6f 6f 6c 65 61 6e 22 29 3d  Type,"boolean")=
55b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =0 ){.      Tcl_
55c0: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 30 2c  GetIntFromObj(0,
55d0: 20 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20   pVar, &n);.    
55e0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
55f0: 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 6e 29  _int(context, n)
5600: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
5610: 63 3d 3d 27 64 27 20 26 26 20 73 74 72 63 6d 70  c=='d' && strcmp
5620: 28 7a 54 79 70 65 2c 22 64 6f 75 62 6c 65 22 29  (zType,"double")
5630: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 6f 75  ==0 ){.      dou
5640: 62 6c 65 20 72 3b 0a 20 20 20 20 20 20 54 63 6c  ble r;.      Tcl
5650: 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62  _GetDoubleFromOb
5660: 6a 28 30 2c 20 70 56 61 72 2c 20 26 72 29 3b 0a  j(0, pVar, &r);.
5670: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
5680: 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74  sult_double(cont
5690: 65 78 74 2c 20 72 29 3b 0a 20 20 20 20 7d 65 6c  ext, r);.    }el
56a0: 73 65 20 69 66 28 20 28 63 3d 3d 27 77 27 20 26  se if( (c=='w' &
56b0: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
56c0: 77 69 64 65 49 6e 74 22 29 3d 3d 30 29 20 7c 7c  wideInt")==0) ||
56d0: 0a 20 20 20 20 20 20 20 20 20 20 28 63 3d 3d 27  .          (c=='
56e0: 69 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79  i' && strcmp(zTy
56f0: 70 65 2c 22 69 6e 74 22 29 3d 3d 30 29 20 29 7b  pe,"int")==0) ){
5700: 0a 20 20 20 20 20 20 54 63 6c 5f 57 69 64 65 49  .      Tcl_WideI
5710: 6e 74 20 76 3b 0a 20 20 20 20 20 20 54 63 6c 5f  nt v;.      Tcl_
5720: 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62  GetWideIntFromOb
5730: 6a 28 30 2c 20 70 56 61 72 2c 20 26 76 29 3b 0a  j(0, pVar, &v);.
5740: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
5750: 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65  sult_int64(conte
5760: 78 74 2c 20 76 29 3b 0a 20 20 20 20 7d 65 6c 73  xt, v);.    }els
5770: 65 7b 0a 20 20 20 20 20 20 64 61 74 61 20 3d 20  e{.      data = 
5780: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
5790: 29 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72  )Tcl_GetStringFr
57a0: 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b  omObj(pVar, &n);
57b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
57c0: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
57d0: 78 74 2c 20 28 63 68 61 72 20 2a 29 64 61 74 61  xt, (char *)data
57e0: 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  , n, SQLITE_TRAN
57f0: 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d 0a 20 20  SIENT);.    }.  
5800: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
5810: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
5820: 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 54 68 69  ZATION./*.** Thi
5830: 73 20 69 73 20 74 68 65 20 61 75 74 68 65 6e 74  s is the authent
5840: 69 63 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  ication function
5850: 2e 20 20 49 74 20 61 70 70 65 6e 64 73 20 74 68  .  It appends th
5860: 65 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e  e authentication
5870: 0a 2a 2a 20 74 79 70 65 20 63 6f 64 65 20 61 6e  .** type code an
5880: 64 20 74 68 65 20 74 77 6f 20 61 72 67 75 6d 65  d the two argume
5890: 6e 74 73 20 74 6f 20 7a 43 6d 64 5b 5d 20 74 68  nts to zCmd[] th
58a0: 65 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 72  en invokes the r
58b0: 65 73 75 6c 74 0a 2a 2a 20 6f 6e 20 74 68 65 20  esult.** on the 
58c0: 69 6e 74 65 72 70 72 65 74 65 72 2e 20 20 54 68  interpreter.  Th
58d0: 65 20 72 65 70 6c 79 20 69 73 20 65 78 61 6d 69  e reply is exami
58e0: 6e 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ned to determine
58f0: 20 69 66 20 74 68 65 0a 2a 2a 20 61 75 74 68 65   if the.** authe
5900: 6e 74 69 63 61 74 69 6f 6e 20 66 61 69 6c 73 20  ntication fails 
5910: 6f 72 20 73 75 63 63 65 65 64 73 2e 0a 2a 2f 0a  or succeeds..*/.
5920: 73 74 61 74 69 63 20 69 6e 74 20 61 75 74 68 5f  static int auth_
5930: 63 61 6c 6c 62 61 63 6b 28 0a 20 20 76 6f 69 64  callback(.  void
5940: 20 2a 70 41 72 67 2c 0a 20 20 69 6e 74 20 63 6f   *pArg,.  int co
5950: 64 65 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  de,.  const char
5960: 20 2a 7a 41 72 67 31 2c 0a 20 20 63 6f 6e 73 74   *zArg1,.  const
5970: 20 63 68 61 72 20 2a 7a 41 72 67 32 2c 0a 20 20   char *zArg2,.  
5980: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
5990: 33 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  3,.  const char 
59a0: 2a 7a 41 72 67 34 0a 29 7b 0a 20 20 63 68 61 72  *zArg4.){.  char
59b0: 20 2a 7a 43 6f 64 65 3b 0a 20 20 54 63 6c 5f 44   *zCode;.  Tcl_D
59c0: 53 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 69 6e  String str;.  in
59d0: 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20 63 68  t rc;.  const ch
59e0: 61 72 20 2a 7a 52 65 70 6c 79 3b 0a 20 20 53 71  ar *zReply;.  Sq
59f0: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
5a00: 71 6c 69 74 65 44 62 2a 29 70 41 72 67 3b 0a 0a  qliteDb*)pArg;..
5a10: 20 20 73 77 69 74 63 68 28 20 63 6f 64 65 20 29    switch( code )
5a20: 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
5a30: 45 5f 43 4f 50 59 20 20 20 20 20 20 20 20 20 20  E_COPY          
5a40: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
5a50: 49 54 45 5f 43 4f 50 59 22 3b 20 62 72 65 61 6b  ITE_COPY"; break
5a60: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
5a70: 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 20 20  E_CREATE_INDEX  
5a80: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
5a90: 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58  ITE_CREATE_INDEX
5aa0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
5ab0: 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45  se SQLITE_CREATE
5ac0: 5f 54 41 42 4c 45 20 20 20 20 20 20 3a 20 7a 43  _TABLE      : zC
5ad0: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41  ode="SQLITE_CREA
5ae0: 54 45 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b  TE_TABLE"; break
5af0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
5b00: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e  E_CREATE_TEMP_IN
5b10: 44 45 58 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c  DEX : zCode="SQL
5b20: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
5b30: 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20  INDEX"; break;. 
5b40: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
5b50: 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45  REATE_TEMP_TABLE
5b60: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
5b70: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42  _CREATE_TEMP_TAB
5b80: 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  LE"; break;.    
5b90: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41  case SQLITE_CREA
5ba0: 54 45 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 3a  TE_TEMP_TRIGGER:
5bb0: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43   zCode="SQLITE_C
5bc0: 52 45 41 54 45 5f 54 45 4d 50 5f 54 52 49 47 47  REATE_TEMP_TRIGG
5bd0: 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  ER"; break;.    
5be0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41  case SQLITE_CREA
5bf0: 54 45 5f 54 45 4d 50 5f 56 49 45 57 20 20 3a 20  TE_TEMP_VIEW  : 
5c00: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52  zCode="SQLITE_CR
5c10: 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 22 3b  EATE_TEMP_VIEW";
5c20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
5c30: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
5c40: 52 49 47 47 45 52 20 20 20 20 3a 20 7a 43 6f 64  RIGGER    : zCod
5c50: 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45  e="SQLITE_CREATE
5c60: 5f 54 52 49 47 47 45 52 22 3b 20 62 72 65 61 6b  _TRIGGER"; break
5c70: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
5c80: 45 5f 43 52 45 41 54 45 5f 56 49 45 57 20 20 20  E_CREATE_VIEW   
5c90: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
5ca0: 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57 22  ITE_CREATE_VIEW"
5cb0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
5cc0: 65 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 20  e SQLITE_DELETE 
5cd0: 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f             : zCo
5ce0: 64 65 3d 22 53 51 4c 49 54 45 5f 44 45 4c 45 54  de="SQLITE_DELET
5cf0: 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  E"; break;.    c
5d00: 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  ase SQLITE_DROP_
5d10: 49 4e 44 45 58 20 20 20 20 20 20 20 20 3a 20 7a  INDEX        : z
5d20: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f  Code="SQLITE_DRO
5d30: 50 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b  P_INDEX"; break;
5d40: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
5d50: 5f 44 52 4f 50 5f 54 41 42 4c 45 20 20 20 20 20  _DROP_TABLE     
5d60: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
5d70: 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 22 3b 20  TE_DROP_TABLE"; 
5d80: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
5d90: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
5da0: 5f 49 4e 44 45 58 20 20 20 3a 20 7a 43 6f 64 65  _INDEX   : zCode
5db0: 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  ="SQLITE_DROP_TE
5dc0: 4d 50 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b  MP_INDEX"; break
5dd0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
5de0: 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c  E_DROP_TEMP_TABL
5df0: 45 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c  E   : zCode="SQL
5e00: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41  ITE_DROP_TEMP_TA
5e10: 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  BLE"; break;.   
5e20: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f   case SQLITE_DRO
5e30: 50 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 20 3a  P_TEMP_TRIGGER :
5e40: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44   zCode="SQLITE_D
5e50: 52 4f 50 5f 54 45 4d 50 5f 54 52 49 47 47 45 52  ROP_TEMP_TRIGGER
5e60: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
5e70: 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54  se SQLITE_DROP_T
5e80: 45 4d 50 5f 56 49 45 57 20 20 20 20 3a 20 7a 43  EMP_VIEW    : zC
5e90: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50  ode="SQLITE_DROP
5ea0: 5f 54 45 4d 50 5f 56 49 45 57 22 3b 20 62 72 65  _TEMP_VIEW"; bre
5eb0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
5ec0: 49 54 45 5f 44 52 4f 50 5f 54 52 49 47 47 45 52  ITE_DROP_TRIGGER
5ed0: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
5ee0: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 52 49 47 47  QLITE_DROP_TRIGG
5ef0: 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  ER"; break;.    
5f00: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50  case SQLITE_DROP
5f10: 5f 56 49 45 57 20 20 20 20 20 20 20 20 20 3a 20  _VIEW         : 
5f20: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52  zCode="SQLITE_DR
5f30: 4f 50 5f 56 49 45 57 22 3b 20 62 72 65 61 6b 3b  OP_VIEW"; break;
5f40: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
5f50: 5f 49 4e 53 45 52 54 20 20 20 20 20 20 20 20 20  _INSERT         
5f60: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
5f70: 54 45 5f 49 4e 53 45 52 54 22 3b 20 62 72 65 61  TE_INSERT"; brea
5f80: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
5f90: 54 45 5f 50 52 41 47 4d 41 20 20 20 20 20 20 20  TE_PRAGMA       
5fa0: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
5fb0: 4c 49 54 45 5f 50 52 41 47 4d 41 22 3b 20 62 72  LITE_PRAGMA"; br
5fc0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
5fd0: 4c 49 54 45 5f 52 45 41 44 20 20 20 20 20 20 20  LITE_READ       
5fe0: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
5ff0: 53 51 4c 49 54 45 5f 52 45 41 44 22 3b 20 62 72  SQLITE_READ"; br
6000: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
6010: 4c 49 54 45 5f 53 45 4c 45 43 54 20 20 20 20 20  LITE_SELECT     
6020: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
6030: 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 22 3b 20  SQLITE_SELECT"; 
6040: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
6050: 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49  SQLITE_TRANSACTI
6060: 4f 4e 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65  ON       : zCode
6070: 3d 22 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43  ="SQLITE_TRANSAC
6080: 54 49 4f 4e 22 3b 20 62 72 65 61 6b 3b 0a 20 20  TION"; break;.  
6090: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55 50    case SQLITE_UP
60a0: 44 41 54 45 20 20 20 20 20 20 20 20 20 20 20 20  DATE            
60b0: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
60c0: 55 50 44 41 54 45 22 3b 20 62 72 65 61 6b 3b 0a  UPDATE"; break;.
60d0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
60e0: 41 54 54 41 43 48 20 20 20 20 20 20 20 20 20 20  ATTACH          
60f0: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
6100: 45 5f 41 54 54 41 43 48 22 3b 20 62 72 65 61 6b  E_ATTACH"; break
6110: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
6120: 45 5f 44 45 54 41 43 48 20 20 20 20 20 20 20 20  E_DETACH        
6130: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
6140: 49 54 45 5f 44 45 54 41 43 48 22 3b 20 62 72 65  ITE_DETACH"; bre
6150: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
6160: 49 54 45 5f 41 4c 54 45 52 5f 54 41 42 4c 45 20  ITE_ALTER_TABLE 
6170: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
6180: 51 4c 49 54 45 5f 41 4c 54 45 52 5f 54 41 42 4c  QLITE_ALTER_TABL
6190: 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  E"; break;.    c
61a0: 61 73 65 20 53 51 4c 49 54 45 5f 52 45 49 4e 44  ase SQLITE_REIND
61b0: 45 58 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a  EX           : z
61c0: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 52 45 49  Code="SQLITE_REI
61d0: 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20  NDEX"; break;.  
61e0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 4e    case SQLITE_AN
61f0: 41 4c 59 5a 45 20 20 20 20 20 20 20 20 20 20 20  ALYZE           
6200: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
6210: 41 4e 41 4c 59 5a 45 22 3b 20 62 72 65 61 6b 3b  ANALYZE"; break;
6220: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
6230: 5f 43 52 45 41 54 45 5f 56 54 41 42 4c 45 20 20  _CREATE_VTABLE  
6240: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
6250: 54 45 5f 43 52 45 41 54 45 5f 56 54 41 42 4c 45  TE_CREATE_VTABLE
6260: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
6270: 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56  se SQLITE_DROP_V
6280: 54 41 42 4c 45 20 20 20 20 20 20 20 3a 20 7a 43  TABLE       : zC
6290: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50  ode="SQLITE_DROP
62a0: 5f 56 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b  _VTABLE"; break;
62b0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
62c0: 5f 46 55 4e 43 54 49 4f 4e 20 20 20 20 20 20 20  _FUNCTION       
62d0: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
62e0: 54 45 5f 46 55 4e 43 54 49 4f 4e 22 3b 20 62 72  TE_FUNCTION"; br
62f0: 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
6300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6310: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
6320: 3f 3f 3f 3f 22 3b 20 62 72 65 61 6b 3b 0a 20 20  ????"; break;.  
6330: 7d 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49  }.  Tcl_DStringI
6340: 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 54 63 6c  nit(&str);.  Tcl
6350: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26  _DStringAppend(&
6360: 73 74 72 2c 20 70 44 62 2d 3e 7a 41 75 74 68 2c  str, pDb->zAuth,
6370: 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72   -1);.  Tcl_DStr
6380: 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ingAppendElement
6390: 28 26 73 74 72 2c 20 7a 43 6f 64 65 29 3b 0a 20  (&str, zCode);. 
63a0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
63b0: 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20  ndElement(&str, 
63c0: 7a 41 72 67 31 20 3f 20 7a 41 72 67 31 20 3a 20  zArg1 ? zArg1 : 
63d0: 22 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  "");.  Tcl_DStri
63e0: 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  ngAppendElement(
63f0: 26 73 74 72 2c 20 7a 41 72 67 32 20 3f 20 7a 41  &str, zArg2 ? zA
6400: 72 67 32 20 3a 20 22 22 29 3b 0a 20 20 54 63 6c  rg2 : "");.  Tcl
6410: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c  _DStringAppendEl
6420: 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41 72 67  ement(&str, zArg
6430: 33 20 3f 20 7a 41 72 67 33 20 3a 20 22 22 29 3b  3 ? zArg3 : "");
6440: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70  .  Tcl_DStringAp
6450: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72  pendElement(&str
6460: 2c 20 7a 41 72 67 34 20 3f 20 7a 41 72 67 34 20  , zArg4 ? zArg4 
6470: 3a 20 22 22 29 3b 0a 20 20 72 63 20 3d 20 54 63  : "");.  rc = Tc
6480: 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 28 70 44 62  l_GlobalEval(pDb
6490: 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53  ->interp, Tcl_DS
64a0: 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29  tringValue(&str)
64b0: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
64c0: 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20 7a 52  Free(&str);.  zR
64d0: 65 70 6c 79 20 3d 20 54 63 6c 5f 47 65 74 53 74  eply = Tcl_GetSt
64e0: 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62 2d 3e  ringResult(pDb->
64f0: 69 6e 74 65 72 70 29 3b 0a 20 20 69 66 28 20 73  interp);.  if( s
6500: 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22 53 51  trcmp(zReply,"SQ
6510: 4c 49 54 45 5f 4f 4b 22 29 3d 3d 30 20 29 7b 0a  LITE_OK")==0 ){.
6520: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
6530: 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  OK;.  }else if( 
6540: 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22 53  strcmp(zReply,"S
6550: 51 4c 49 54 45 5f 44 45 4e 59 22 29 3d 3d 30 20  QLITE_DENY")==0 
6560: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
6570: 54 45 5f 44 45 4e 59 3b 0a 20 20 7d 65 6c 73 65  TE_DENY;.  }else
6580: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 52 65 70   if( strcmp(zRep
6590: 6c 79 2c 22 53 51 4c 49 54 45 5f 49 47 4e 4f 52  ly,"SQLITE_IGNOR
65a0: 45 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  E")==0 ){.    rc
65b0: 20 3d 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45   = SQLITE_IGNORE
65c0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
65d0: 63 20 3d 20 39 39 39 3b 0a 20 20 7d 0a 20 20 72  c = 999;.  }.  r
65e0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
65f0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
6600: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 20  T_AUTHORIZATION 
6610: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 7a 54 65 78 74 20  */../*.** zText 
6620: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
6630: 74 65 78 74 20 6f 62 74 61 69 6e 65 64 20 76 69  text obtained vi
6640: 61 20 61 6e 20 73 71 6c 69 74 65 33 5f 72 65 73  a an sqlite3_res
6650: 75 6c 74 5f 74 65 78 74 28 29 0a 2a 2a 20 6f 72  ult_text().** or
6660: 20 73 69 6d 69 6c 61 72 20 69 6e 74 65 72 66 61   similar interfa
6670: 63 65 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  ce. This routine
6680: 20 72 65 74 75 72 6e 73 20 61 20 54 63 6c 20 73   returns a Tcl s
6690: 74 72 69 6e 67 20 6f 62 6a 65 63 74 2c 20 0a 2a  tring object, .*
66a0: 2a 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  * reference coun
66b0: 74 20 73 65 74 20 74 6f 20 30 2c 20 63 6f 6e 74  t set to 0, cont
66c0: 61 69 6e 69 6e 67 20 74 68 65 20 74 65 78 74 2e  aining the text.
66d0: 20 49 66 20 61 20 74 72 61 6e 73 6c 61 74 69 6f   If a translatio
66e0: 6e 0a 2a 2a 20 62 65 74 77 65 65 6e 20 69 73 6f  n.** between iso
66f0: 38 38 35 39 20 61 6e 64 20 55 54 46 2d 38 20 69  8859 and UTF-8 i
6700: 73 20 72 65 71 75 69 72 65 64 2c 20 69 74 20 69  s required, it i
6710: 73 20 70 72 65 66 6f 72 6d 65 64 2e 0a 2a 2f 0a  s preformed..*/.
6720: 73 74 61 74 69 63 20 54 63 6c 5f 4f 62 6a 20 2a  static Tcl_Obj *
6730: 64 62 54 65 78 74 54 6f 4f 62 6a 28 63 68 61 72  dbTextToObj(char
6740: 20 63 6f 6e 73 74 20 2a 7a 54 65 78 74 29 7b 0a   const *zText){.
6750: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b    Tcl_Obj *pVal;
6760: 0a 23 69 66 64 65 66 20 55 54 46 5f 54 52 41 4e  .#ifdef UTF_TRAN
6770: 53 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 0a 20  SLATION_NEEDED. 
6780: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 43 6f   Tcl_DString dCo
6790: 6c 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  l;.  Tcl_DString
67a0: 49 6e 69 74 28 26 64 43 6f 6c 29 3b 0a 20 20 54  Init(&dCol);.  T
67b0: 63 6c 5f 45 78 74 65 72 6e 61 6c 54 6f 55 74 66  cl_ExternalToUtf
67c0: 44 53 74 72 69 6e 67 28 4e 55 4c 4c 2c 20 7a 54  DString(NULL, zT
67d0: 65 78 74 2c 20 2d 31 2c 20 26 64 43 6f 6c 29 3b  ext, -1, &dCol);
67e0: 0a 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65  .  pVal = Tcl_Ne
67f0: 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 44  wStringObj(Tcl_D
6800: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 64 43 6f  StringValue(&dCo
6810: 6c 29 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44  l), -1);.  Tcl_D
6820: 53 74 72 69 6e 67 46 72 65 65 28 26 64 43 6f 6c  StringFree(&dCol
6830: 29 3b 0a 23 65 6c 73 65 0a 20 20 70 56 61 6c 20  );.#else.  pVal 
6840: 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
6850: 62 6a 28 7a 54 65 78 74 2c 20 2d 31 29 3b 0a 23  bj(zText, -1);.#
6860: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 70  endif.  return p
6870: 56 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Val;.}../*.** Th
6880: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 61 64 73  is routine reads
6890: 20 61 20 6c 69 6e 65 20 6f 66 20 74 65 78 74 20   a line of text 
68a0: 66 72 6f 6d 20 46 49 4c 45 20 69 6e 2c 20 73 74  from FILE in, st
68b0: 6f 72 65 73 0a 2a 2a 20 74 68 65 20 74 65 78 74  ores.** the text
68c0: 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   in memory obtai
68d0: 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28  ned from malloc(
68e0: 29 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20  ) and returns a 
68f0: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
6900: 65 20 74 65 78 74 2e 20 20 4e 55 4c 4c 20 69 73  e text.  NULL is
6910: 20 72 65 74 75 72 6e 65 64 20 61 74 20 65 6e 64   returned at end
6920: 20 6f 66 20 66 69 6c 65 2c 20 6f 72 20 69 66 20   of file, or if 
6930: 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 66 61 69 6c  malloc().** fail
6940: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74  s..**.** The int
6950: 65 72 66 61 63 65 20 69 73 20 6c 69 6b 65 20 22  erface is like "
6960: 72 65 61 64 6c 69 6e 65 22 20 62 75 74 20 6e 6f  readline" but no
6970: 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 65 64   command-line ed
6980: 69 74 69 6e 67 0a 2a 2a 20 69 73 20 64 6f 6e 65  iting.** is done
6990: 2e 0a 2a 2a 0a 2a 2a 20 63 6f 70 69 65 64 20 66  ..**.** copied f
69a0: 72 6f 6d 20 73 68 65 6c 6c 2e 63 20 66 72 6f 6d  rom shell.c from
69b0: 20 27 2e 69 6d 70 6f 72 74 27 20 63 6f 6d 6d 61   '.import' comma
69c0: 6e 64 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  nd.*/.static cha
69d0: 72 20 2a 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65  r *local_getline
69e0: 28 63 68 61 72 20 2a 7a 50 72 6f 6d 70 74 2c 20  (char *zPrompt, 
69f0: 46 49 4c 45 20 2a 69 6e 29 7b 0a 20 20 63 68 61  FILE *in){.  cha
6a00: 72 20 2a 7a 4c 69 6e 65 3b 0a 20 20 69 6e 74 20  r *zLine;.  int 
6a10: 6e 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a  nLine;.  int n;.
6a20: 20 20 69 6e 74 20 65 6f 6c 3b 0a 0a 20 20 6e 4c    int eol;..  nL
6a30: 69 6e 65 20 3d 20 31 30 30 3b 0a 20 20 7a 4c 69  ine = 100;.  zLi
6a40: 6e 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 4c 69  ne = malloc( nLi
6a50: 6e 65 20 29 3b 0a 20 20 69 66 28 20 7a 4c 69 6e  ne );.  if( zLin
6a60: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  e==0 ) return 0;
6a70: 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 65 6f 6c 20  .  n = 0;.  eol 
6a80: 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 21 65  = 0;.  while( !e
6a90: 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 2b  ol ){.    if( n+
6aa0: 31 30 30 3e 6e 4c 69 6e 65 20 29 7b 0a 20 20 20  100>nLine ){.   
6ab0: 20 20 20 6e 4c 69 6e 65 20 3d 20 6e 4c 69 6e 65     nLine = nLine
6ac0: 2a 32 20 2b 20 31 30 30 3b 0a 20 20 20 20 20 20  *2 + 100;.      
6ad0: 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28  zLine = realloc(
6ae0: 7a 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29 3b 0a 20  zLine, nLine);. 
6af0: 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d       if( zLine==
6b00: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
6b10: 20 20 7d 0a 20 20 20 20 69 66 28 20 66 67 65 74    }.    if( fget
6b20: 73 28 26 7a 4c 69 6e 65 5b 6e 5d 2c 20 6e 4c 69  s(&zLine[n], nLi
6b30: 6e 65 20 2d 20 6e 2c 20 69 6e 29 3d 3d 30 20 29  ne - n, in)==0 )
6b40: 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30  {.      if( n==0
6b50: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65   ){.        free
6b60: 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20  (zLine);.       
6b70: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
6b80: 20 7d 0a 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6e   }.      zLine[n
6b90: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 65 6f 6c  ] = 0;.      eol
6ba0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61   = 1;.      brea
6bb0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69  k;.    }.    whi
6bc0: 6c 65 28 20 7a 4c 69 6e 65 5b 6e 5d 20 29 7b 20  le( zLine[n] ){ 
6bd0: 6e 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 6e  n++; }.    if( n
6be0: 3e 30 20 26 26 20 7a 4c 69 6e 65 5b 6e 2d 31 5d  >0 && zLine[n-1]
6bf0: 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20  =='\n' ){.      
6c00: 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a 4c 69 6e 65  n--;.      zLine
6c10: 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 65  [n] = 0;.      e
6c20: 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ol = 1;.    }.  
6c30: 7d 0a 20 20 7a 4c 69 6e 65 20 3d 20 72 65 61 6c  }.  zLine = real
6c40: 6c 6f 63 28 20 7a 4c 69 6e 65 2c 20 6e 2b 31 20  loc( zLine, n+1 
6c50: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4c 69 6e  );.  return zLin
6c60: 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 69 67  e;.}.../*.** Fig
6c70: 75 72 65 20 6f 75 74 20 74 68 65 20 63 6f 6c 75  ure out the colu
6c80: 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 65  mn names for the
6c90: 20 64 61 74 61 20 72 65 74 75 72 6e 65 64 20 62   data returned b
6ca0: 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a  y the statement.
6cb0: 2a 2a 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ** passed as the
6cc0: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
6cd0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
6ce0: 65 74 65 72 20 70 61 70 43 6f 6c 4e 61 6d 65 20  eter papColName 
6cf0: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
6d00: 6e 20 2a 70 61 70 43 6f 6c 4e 61 6d 65 20 69 73  n *papColName is
6d10: 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a   set to point.**
6d20: 20 61 74 20 61 6e 20 61 72 72 61 79 20 61 6c 6c   at an array all
6d30: 6f 63 61 74 65 64 20 75 73 69 6e 67 20 54 63 6c  ocated using Tcl
6d40: 5f 41 6c 6c 6f 63 28 29 2e 20 49 74 20 69 73 20  _Alloc(). It is 
6d50: 74 68 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70  the callers resp
6d60: 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20 74 6f  onsibility.** to
6d70: 20 66 72 65 65 20 74 68 69 73 20 61 72 72 61 79   free this array
6d80: 20 75 73 69 6e 67 20 54 63 6c 5f 46 72 65 65 28   using Tcl_Free(
6d90: 29 2c 20 61 6e 64 20 74 6f 20 64 65 63 72 65 6d  ), and to decrem
6da0: 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63  ent the referenc
6db0: 65 0a 2a 2a 20 63 6f 75 6e 74 20 6f 66 20 65 61  e.** count of ea
6dc0: 63 68 20 54 63 6c 5f 4f 62 6a 2a 20 6d 65 6d 62  ch Tcl_Obj* memb
6dd0: 65 72 20 6f 66 20 74 68 65 20 61 72 72 61 79 2e  er of the array.
6de0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
6df0: 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  n value of this 
6e00: 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 20  function is the 
6e10: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
6e20: 73 20 6f 66 20 64 61 74 61 0a 2a 2a 20 72 65 74  s of data.** ret
6e30: 75 72 6e 65 64 20 62 79 20 70 53 74 6d 74 20 28  urned by pStmt (
6e40: 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20 73 69  and hence the si
6e50: 7a 65 20 6f 66 20 74 68 65 20 2a 70 61 70 43 6f  ze of the *papCo
6e60: 6c 4e 61 6d 65 20 61 72 72 61 79 29 2e 0a 2a 2a  lName array)..**
6e70: 0a 2a 2a 20 49 66 20 70 41 72 72 61 79 20 69 73  .** If pArray is
6e80: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
6e90: 69 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  it contains the 
6ea0: 6e 61 6d 65 20 6f 66 20 61 20 54 63 6c 20 61 72  name of a Tcl ar
6eb0: 72 61 79 0a 2a 2a 20 76 61 72 69 61 62 6c 65 2e  ray.** variable.
6ec0: 20 54 68 65 20 22 2a 22 20 6d 65 6d 62 65 72 20   The "*" member 
6ed0: 6f 66 20 74 68 69 73 20 61 72 72 61 79 20 69 73  of this array is
6ee0: 20 73 65 74 20 74 6f 20 61 20 6c 69 73 74 20 63   set to a list c
6ef0: 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 74 68 65  ontaining.** the
6f00: 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f   names of the co
6f10: 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62  lumns returned b
6f20: 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c  y the statement,
6f30: 20 69 6e 20 6f 72 64 65 72 20 66 72 6f 6d 0a 2a   in order from.*
6f40: 2a 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e  * left to right.
6f50: 20 65 2e 67 2e 20 69 66 20 74 68 65 20 6e 61 6d   e.g. if the nam
6f60: 65 73 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e  es of the return
6f70: 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 61  ed columns are a
6f80: 2c 20 62 20 61 6e 64 0a 2a 2a 20 63 2c 20 69 74  , b and.** c, it
6f90: 20 64 6f 65 73 20 74 68 65 20 65 71 75 69 76 61   does the equiva
6fa0: 6c 65 6e 74 20 6f 66 20 74 68 65 20 74 63 6c 20  lent of the tcl 
6fb0: 63 6f 6d 6d 61 6e 64 3a 0a 2a 2a 0a 2a 2a 20 20  command:.**.**  
6fc0: 20 20 20 73 65 74 20 24 7b 70 41 72 72 61 79 7d     set ${pArray}
6fd0: 28 2a 29 20 7b 61 20 62 20 63 7d 0a 2a 2f 0a 73  (*) {a b c}.*/.s
6fe0: 74 61 74 69 63 20 69 6e 74 0a 63 6f 6d 70 75 74  tatic int.comput
6ff0: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20  eColumnNames(.  
7000: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
7010: 72 70 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 73  rp, .  sqlite3_s
7020: 74 6d 74 20 2a 70 53 74 6d 74 2c 20 20 20 20 20  tmt *pStmt,     
7030: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20           /* SQL 
7040: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54  statement */.  T
7050: 63 6c 5f 4f 62 6a 20 2a 2a 2a 70 61 70 43 6f 6c  cl_Obj ***papCol
7060: 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20  Name,           
7070: 20 2f 2a 20 4f 55 54 3a 20 41 72 72 61 79 20 6f   /* OUT: Array o
7080: 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a  f column names *
7090: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72  /.  Tcl_Obj *pAr
70a0: 72 61 79 20 20 20 20 20 20 20 20 20 20 20 20 20  ray             
70b0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
70c0: 20 61 72 72 61 79 20 76 61 72 69 61 62 6c 65 20   array variable 
70d0: 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f  (may be null) */
70e0: 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a  .){.  int nCol;.
70f0: 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f  .  /* Compute co
7100: 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20  lumn names */.  
7110: 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63  nCol = sqlite3_c
7120: 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d  olumn_count(pStm
7130: 74 29 3b 0a 20 20 69 66 28 20 70 61 70 43 6f 6c  t);.  if( papCol
7140: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  Name ){.    int 
7150: 69 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  i;.    Tcl_Obj *
7160: 2a 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 54 63  *apColName = (Tc
7170: 6c 5f 4f 62 6a 2a 2a 29 54 63 6c 5f 41 6c 6c 6f  l_Obj**)Tcl_Allo
7180: 63 28 20 73 69 7a 65 6f 66 28 54 63 6c 5f 4f 62  c( sizeof(Tcl_Ob
7190: 6a 2a 29 2a 6e 43 6f 6c 20 29 3b 0a 20 20 20 20  j*)*nCol );.    
71a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
71b0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 70 43   i++){.      apC
71c0: 6f 6c 4e 61 6d 65 5b 69 5d 20 3d 20 64 62 54 65  olName[i] = dbTe
71d0: 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f  xtToObj(sqlite3_
71e0: 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d  column_name(pStm
71f0: 74 2c 69 29 29 3b 0a 20 20 20 20 20 20 54 63 6c  t,i));.      Tcl
7200: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 61 70  _IncrRefCount(ap
7210: 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20  ColName[i]);.   
7220: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 72 65   }..    /* If re
7230: 73 75 6c 74 73 20 61 72 65 20 62 65 69 6e 67 20  sults are being 
7240: 73 74 6f 72 65 64 20 69 6e 20 61 6e 20 61 72 72  stored in an arr
7250: 61 79 20 76 61 72 69 61 62 6c 65 2c 20 74 68 65  ay variable, the
7260: 6e 20 63 72 65 61 74 65 0a 20 20 20 20 2a 2a 20  n create.    ** 
7270: 74 68 65 20 61 72 72 61 79 28 2a 29 20 65 6e 74  the array(*) ent
7280: 72 79 20 66 6f 72 20 74 68 61 74 20 61 72 72 61  ry for that arra
7290: 79 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  y.    */.    if(
72a0: 20 70 41 72 72 61 79 20 29 7b 0a 20 20 20 20 20   pArray ){.     
72b0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f 6c 4c 69   Tcl_Obj *pColLi
72c0: 73 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28  st = Tcl_NewObj(
72d0: 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a  );.      Tcl_Obj
72e0: 20 2a 70 53 74 61 72 20 3d 20 54 63 6c 5f 4e 65   *pStar = Tcl_Ne
72f0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 2a 22 2c 20  wStringObj("*", 
7300: 2d 31 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 49  -1);.      Tcl_I
7310: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6f 6c  ncrRefCount(pCol
7320: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 66 6f 72  List);.      for
7330: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
7340: 2b 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  +){.        Tcl_
7350: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
7360: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 43 6f  ment(interp, pCo
7370: 6c 4c 69 73 74 2c 20 61 70 43 6f 6c 4e 61 6d 65  lList, apColName
7380: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [i]);.      }.  
7390: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
73a0: 6f 75 6e 74 28 70 53 74 61 72 29 3b 0a 20 20 20  ount(pStar);.   
73b0: 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72     Tcl_ObjSetVar
73c0: 32 28 69 6e 74 65 72 70 2c 20 70 41 72 72 61 79  2(interp, pArray
73d0: 2c 20 70 53 74 61 72 2c 20 70 43 6f 6c 4c 69 73  , pStar, pColLis
73e0: 74 2c 30 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f  t,0);.      Tcl_
73f0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6f  DecrRefCount(pCo
7400: 6c 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 54 63  lList);.      Tc
7410: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
7420: 53 74 61 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Star);.    }.   
7430: 20 2a 70 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 61   *papColName = a
7440: 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 7d 0a 0a 20  pColName;.  }.. 
7450: 20 72 65 74 75 72 6e 20 6e 43 6f 6c 3b 0a 7d 0a   return nCol;.}.
7460: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 22 73 71 6c 69  ./*.** The "sqli
7470: 74 65 22 20 63 6f 6d 6d 61 6e 64 20 62 65 6c 6f  te" command belo
7480: 77 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 20  w creates a new 
7490: 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 66 6f 72 20  Tcl command for 
74a0: 65 61 63 68 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  each.** connecti
74b0: 6f 6e 20 69 74 20 6f 70 65 6e 73 20 74 6f 20 61  on it opens to a
74c0: 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  n SQLite databas
74d0: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
74e0: 20 69 73 20 69 6e 76 6f 6b 65 64 0a 2a 2a 20 77   is invoked.** w
74f0: 68 65 6e 65 76 65 72 20 6f 6e 65 20 6f 66 20 74  henever one of t
7500: 68 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2d  hose connection-
7510: 73 70 65 63 69 66 69 63 20 63 6f 6d 6d 61 6e 64  specific command
7520: 73 20 69 73 20 65 78 65 63 75 74 65 64 0a 2a 2a  s is executed.**
7530: 20 69 6e 20 54 63 6c 2e 20 20 46 6f 72 20 65 78   in Tcl.  For ex
7540: 61 6d 70 6c 65 2c 20 69 66 20 79 6f 75 20 72 75  ample, if you ru
7550: 6e 20 54 63 6c 20 63 6f 64 65 20 6c 69 6b 65 20  n Tcl code like 
7560: 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
7570: 20 20 73 71 6c 69 74 65 33 20 64 62 31 20 20 22    sqlite3 db1  "
7580: 6d 79 5f 64 61 74 61 62 61 73 65 22 0a 2a 2a 20  my_database".** 
7590: 20 20 20 20 20 20 64 62 31 20 63 6c 6f 73 65 0a        db1 close.
75a0: 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
75b0: 63 6f 6d 6d 61 6e 64 20 6f 70 65 6e 73 20 61 20  command opens a 
75c0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68  connection to th
75d0: 65 20 22 6d 79 5f 64 61 74 61 62 61 73 65 22 20  e "my_database" 
75e0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 61 6e 64 20  database.** and 
75f0: 63 61 6c 6c 73 20 74 68 61 74 20 63 6f 6e 6e 65  calls that conne
7600: 63 74 69 6f 6e 20 22 64 62 31 22 2e 20 20 54 68  ction "db1".  Th
7610: 65 20 73 65 63 6f 6e 64 20 63 6f 6d 6d 61 6e 64  e second command
7620: 20 63 61 75 73 65 73 20 74 68 69 73 0a 2a 2a 20   causes this.** 
7630: 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 62 65  subroutine to be
7640: 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 73 74 61   invoked..*/.sta
7650: 74 69 63 20 69 6e 74 20 44 62 4f 62 6a 43 6d 64  tic int DbObjCmd
7660: 28 76 6f 69 64 20 2a 63 64 2c 20 54 63 6c 5f 49  (void *cd, Tcl_I
7670: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
7680: 6e 74 20 6f 62 6a 63 2c 54 63 6c 5f 4f 62 6a 20  nt objc,Tcl_Obj 
7690: 2a 63 6f 6e 73 74 2a 6f 62 6a 76 29 7b 0a 20 20  *const*objv){.  
76a0: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
76b0: 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20  (SqliteDb*)cd;. 
76c0: 20 69 6e 74 20 63 68 6f 69 63 65 3b 0a 20 20 69   int choice;.  i
76d0: 6e 74 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a  nt rc = TCL_OK;.
76e0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
76f0: 68 61 72 20 2a 44 42 5f 73 74 72 73 5b 5d 20 3d  har *DB_strs[] =
7700: 20 7b 0a 20 20 20 20 22 61 75 74 68 6f 72 69 7a   {.    "authoriz
7710: 65 72 22 2c 20 20 20 20 20 20 20 20 20 22 62 75  er",         "bu
7720: 73 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  sy",            
7730: 20 20 22 63 61 63 68 65 22 2c 0a 20 20 20 20 22    "cache",.    "
7740: 63 68 61 6e 67 65 73 22 2c 20 20 20 20 20 20 20  changes",       
7750: 20 20 20 20 20 22 63 6c 6f 73 65 22 2c 20 20 20       "close",   
7760: 20 20 20 20 20 20 20 20 20 20 22 63 6f 6c 6c 61            "colla
7770: 74 65 22 2c 0a 20 20 20 20 22 63 6f 6c 6c 61 74  te",.    "collat
7780: 69 6f 6e 5f 6e 65 65 64 65 64 22 2c 20 20 20 22  ion_needed",   "
7790: 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 22 2c 20 20 20  commit_hook",   
77a0: 20 20 20 20 22 63 6f 6d 70 6c 65 74 65 22 2c 0a      "complete",.
77b0: 20 20 20 20 22 63 6f 70 79 22 2c 20 20 20 20 20      "copy",     
77c0: 20 20 20 20 20 20 20 20 20 20 22 65 6e 61 62 6c            "enabl
77d0: 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e  e_load_extension
77e0: 22 2c 22 65 72 72 6f 72 63 6f 64 65 22 2c 0a 20  ","errorcode",. 
77f0: 20 20 20 22 65 76 61 6c 22 2c 20 20 20 20 20 20     "eval",      
7800: 20 20 20 20 20 20 20 20 20 22 65 78 69 73 74 73           "exists
7810: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 22 66  ",            "f
7820: 75 6e 63 74 69 6f 6e 22 2c 0a 20 20 20 20 22 69  unction",.    "i
7830: 6e 63 72 62 6c 6f 62 22 2c 20 20 20 20 20 20 20  ncrblob",       
7840: 20 20 20 20 22 69 6e 74 65 72 72 75 70 74 22 2c      "interrupt",
7850: 20 20 20 20 20 20 20 20 20 22 6c 61 73 74 5f 69           "last_i
7860: 6e 73 65 72 74 5f 72 6f 77 69 64 22 2c 0a 20 20  nsert_rowid",.  
7870: 20 20 22 6e 75 6c 6c 76 61 6c 75 65 22 2c 20 20    "nullvalue",  
7880: 20 20 20 20 20 20 20 20 22 6f 6e 65 63 6f 6c 75          "onecolu
7890: 6d 6e 22 2c 20 20 20 20 20 20 20 20 20 22 70 72  mn",         "pr
78a0: 6f 66 69 6c 65 22 2c 0a 20 20 20 20 22 70 72 6f  ofile",.    "pro
78b0: 67 72 65 73 73 22 2c 20 20 20 20 20 20 20 20 20  gress",         
78c0: 20 20 22 72 65 6b 65 79 22 2c 20 20 20 20 20 20    "rekey",      
78d0: 20 20 20 20 20 20 20 22 72 6f 6c 6c 62 61 63 6b         "rollback
78e0: 5f 68 6f 6f 6b 22 2c 0a 20 20 20 20 22 74 69 6d  _hook",.    "tim
78f0: 65 6f 75 74 22 2c 20 20 20 20 20 20 20 20 20 20  eout",          
7900: 20 20 22 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73    "total_changes
7910: 22 2c 20 20 20 20 20 22 74 72 61 63 65 22 2c 0a  ",     "trace",.
7920: 20 20 20 20 22 74 72 61 6e 73 61 63 74 69 6f 6e      "transaction
7930: 22 2c 20 20 20 20 20 20 20 20 22 75 70 64 61 74  ",        "updat
7940: 65 5f 68 6f 6f 6b 22 2c 20 20 20 20 20 20 20 22  e_hook",       "
7950: 76 65 72 73 69 6f 6e 22 2c 0a 20 20 20 20 30 20  version",.    0 
7960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7970: 20 20 20 0a 20 20 7d 3b 0a 20 20 65 6e 75 6d 20     .  };.  enum 
7980: 44 42 5f 65 6e 75 6d 20 7b 0a 20 20 20 20 44 42  DB_enum {.    DB
7990: 5f 41 55 54 48 4f 52 49 5a 45 52 2c 20 20 20 20  _AUTHORIZER,    
79a0: 20 20 20 20 44 42 5f 42 55 53 59 2c 20 20 20 20      DB_BUSY,    
79b0: 20 20 20 20 20 20 20 20 20 44 42 5f 43 41 43 48           DB_CACH
79c0: 45 2c 0a 20 20 20 20 44 42 5f 43 48 41 4e 47 45  E,.    DB_CHANGE
79d0: 53 2c 20 20 20 20 20 20 20 20 20 20 20 44 42 5f  S,           DB_
79e0: 43 4c 4f 53 45 2c 20 20 20 20 20 20 20 20 20 20  CLOSE,          
79f0: 20 20 44 42 5f 43 4f 4c 4c 41 54 45 2c 0a 20 20    DB_COLLATE,.  
7a00: 20 20 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e    DB_COLLATION_N
7a10: 45 45 44 45 44 2c 20 20 44 42 5f 43 4f 4d 4d 49  EEDED,  DB_COMMI
7a20: 54 5f 48 4f 4f 4b 2c 20 20 20 20 20 20 44 42 5f  T_HOOK,      DB_
7a30: 43 4f 4d 50 4c 45 54 45 2c 0a 20 20 20 20 44 42  COMPLETE,.    DB
7a40: 5f 43 4f 50 59 2c 20 20 20 20 20 20 20 20 20 20  _COPY,          
7a50: 20 20 20 20 44 42 5f 45 4e 41 42 4c 45 5f 4c 4f      DB_ENABLE_LO
7a60: 41 44 5f 45 58 54 45 4e 53 49 4f 4e 2c 44 42 5f  AD_EXTENSION,DB_
7a70: 45 52 52 4f 52 43 4f 44 45 2c 0a 20 20 20 20 44  ERRORCODE,.    D
7a80: 42 5f 45 56 41 4c 2c 20 20 20 20 20 20 20 20 20  B_EVAL,         
7a90: 20 20 20 20 20 44 42 5f 45 58 49 53 54 53 2c 20       DB_EXISTS, 
7aa0: 20 20 20 20 20 20 20 20 20 20 44 42 5f 46 55 4e            DB_FUN
7ab0: 43 54 49 4f 4e 2c 0a 20 20 20 20 44 42 5f 49 4e  CTION,.    DB_IN
7ac0: 43 52 42 4c 4f 42 2c 20 20 20 20 20 20 20 20 20  CRBLOB,         
7ad0: 20 44 42 5f 49 4e 54 45 52 52 55 50 54 2c 20 20   DB_INTERRUPT,  
7ae0: 20 20 20 20 20 20 44 42 5f 4c 41 53 54 5f 49 4e        DB_LAST_IN
7af0: 53 45 52 54 5f 52 4f 57 49 44 2c 0a 20 20 20 20  SERT_ROWID,.    
7b00: 44 42 5f 4e 55 4c 4c 56 41 4c 55 45 2c 20 20 20  DB_NULLVALUE,   
7b10: 20 20 20 20 20 20 44 42 5f 4f 4e 45 43 4f 4c 55        DB_ONECOLU
7b20: 4d 4e 2c 20 20 20 20 20 20 20 20 44 42 5f 50 52  MN,        DB_PR
7b30: 4f 46 49 4c 45 2c 0a 20 20 20 20 44 42 5f 50 52  OFILE,.    DB_PR
7b40: 4f 47 52 45 53 53 2c 20 20 20 20 20 20 20 20 20  OGRESS,         
7b50: 20 44 42 5f 52 45 4b 45 59 2c 20 20 20 20 20 20   DB_REKEY,      
7b60: 20 20 20 20 20 20 44 42 5f 52 4f 4c 4c 42 41 43        DB_ROLLBAC
7b70: 4b 5f 48 4f 4f 4b 2c 0a 20 20 20 20 44 42 5f 54  K_HOOK,.    DB_T
7b80: 49 4d 45 4f 55 54 2c 20 20 20 20 20 20 20 20 20  IMEOUT,         
7b90: 20 20 44 42 5f 54 4f 54 41 4c 5f 43 48 41 4e 47    DB_TOTAL_CHANG
7ba0: 45 53 2c 20 20 20 20 44 42 5f 54 52 41 43 45 2c  ES,    DB_TRACE,
7bb0: 0a 20 20 20 20 44 42 5f 54 52 41 4e 53 41 43 54  .    DB_TRANSACT
7bc0: 49 4f 4e 2c 20 20 20 20 20 20 20 44 42 5f 55 50  ION,       DB_UP
7bd0: 44 41 54 45 5f 48 4f 4f 4b 2c 20 20 20 20 20 20  DATE_HOOK,      
7be0: 44 42 5f 56 45 52 53 49 4f 4e 0a 20 20 7d 3b 0a  DB_VERSION.  };.
7bf0: 20 20 2f 2a 20 64 6f 6e 27 74 20 6c 65 61 76 65    /* don't leave
7c00: 20 74 72 61 69 6c 69 6e 67 20 63 6f 6d 6d 61 73   trailing commas
7c10: 20 6f 6e 20 44 42 5f 65 6e 75 6d 2c 20 69 74 20   on DB_enum, it 
7c20: 63 6f 6e 66 75 73 65 73 20 74 68 65 20 41 49 58  confuses the AIX
7c30: 20 78 6c 63 20 63 6f 6d 70 69 6c 65 72 20 2a 2f   xlc compiler */
7c40: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3c 32 20 29  ..  if( objc<2 )
7c50: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
7c60: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
7c70: 2c 20 6f 62 6a 76 2c 20 22 53 55 42 43 4f 4d 4d  , objv, "SUBCOMM
7c80: 41 4e 44 20 2e 2e 2e 22 29 3b 0a 20 20 20 20 72  AND ...");.    r
7c90: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
7ca0: 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47  .  }.  if( Tcl_G
7cb0: 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69  etIndexFromObj(i
7cc0: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20  nterp, objv[1], 
7cd0: 44 42 5f 73 74 72 73 2c 20 22 6f 70 74 69 6f 6e  DB_strs, "option
7ce0: 22 2c 20 30 2c 20 26 63 68 6f 69 63 65 29 20 29  ", 0, &choice) )
7cf0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
7d00: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 73  _ERROR;.  }..  s
7d10: 77 69 74 63 68 28 20 28 65 6e 75 6d 20 44 42 5f  witch( (enum DB_
7d20: 65 6e 75 6d 29 63 68 6f 69 63 65 20 29 7b 0a 0a  enum)choice ){..
7d30: 20 20 2f 2a 20 20 20 20 24 64 62 20 61 75 74 68    /*    $db auth
7d40: 6f 72 69 7a 65 72 20 3f 43 41 4c 4c 42 41 43 4b  orizer ?CALLBACK
7d50: 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f  ?.  **.  ** Invo
7d60: 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c  ke the given cal
7d70: 6c 62 61 63 6b 20 74 6f 20 61 75 74 68 6f 72 69  lback to authori
7d80: 7a 65 20 65 61 63 68 20 53 51 4c 20 6f 70 65 72  ze each SQL oper
7d90: 61 74 69 6f 6e 20 61 73 20 69 74 20 69 73 0a 20  ation as it is. 
7da0: 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 2e 20 20 35   ** compiled.  5
7db0: 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 61   arguments are a
7dc0: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 63  ppended to the c
7dd0: 61 6c 6c 62 61 63 6b 20 62 65 66 6f 72 65 20 69  allback before i
7de0: 74 20 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6b 65  t is.  ** invoke
7df0: 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28  d:.  **.  **   (
7e00: 31 29 20 54 68 65 20 61 75 74 68 6f 72 69 7a 61  1) The authoriza
7e10: 74 69 6f 6e 20 74 79 70 65 20 28 65 78 3a 20 53  tion type (ex: S
7e20: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42  QLITE_CREATE_TAB
7e30: 4c 45 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52  LE, SQLITE_INSER
7e40: 54 2c 20 2e 2e 2e 29 0a 20 20 2a 2a 20 20 20 28  T, ...).  **   (
7e50: 32 29 20 46 69 72 73 74 20 64 65 73 63 72 69 70  2) First descrip
7e60: 74 69 76 65 20 6e 61 6d 65 20 28 64 65 70 65 6e  tive name (depen
7e70: 64 73 20 6f 6e 20 61 75 74 68 6f 72 69 7a 61 74  ds on authorizat
7e80: 69 6f 6e 20 74 79 70 65 29 0a 20 20 2a 2a 20 20  ion type).  **  
7e90: 20 28 33 29 20 53 65 63 6f 6e 64 20 64 65 73 63   (3) Second desc
7ea0: 72 69 70 74 69 76 65 20 6e 61 6d 65 0a 20 20 2a  riptive name.  *
7eb0: 2a 20 20 20 28 34 29 20 4e 61 6d 65 20 6f 66 20  *   (4) Name of 
7ec0: 74 68 65 20 64 61 74 61 62 61 73 65 20 28 65 78  the database (ex
7ed0: 3a 20 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22  : "main", "temp"
7ee0: 29 0a 20 20 2a 2a 20 20 20 28 35 29 20 4e 61 6d  ).  **   (5) Nam
7ef0: 65 20 6f 66 20 74 72 69 67 67 65 72 20 74 68 61  e of trigger tha
7f00: 74 20 69 73 20 64 6f 69 6e 67 20 74 68 65 20 61  t is doing the a
7f10: 63 63 65 73 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ccess.  **.  ** 
7f20: 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 73 68 6f  The callback sho
7f30: 75 6c 64 20 72 65 74 75 72 6e 20 6f 6e 20 6f 66  uld return on of
7f40: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
7f50: 74 72 69 6e 67 73 3a 20 53 51 4c 49 54 45 5f 4f  trings: SQLITE_O
7f60: 4b 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 49  K,.  ** SQLITE_I
7f70: 47 4e 4f 52 45 2c 20 6f 72 20 53 51 4c 49 54 45  GNORE, or SQLITE
7f80: 5f 44 45 4e 59 2e 20 20 41 6e 79 20 6f 74 68 65  _DENY.  Any othe
7f90: 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  r return value i
7fa0: 73 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2a  s an error..  **
7fb0: 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 6d 65  .  ** If this me
7fc0: 74 68 6f 64 20 69 73 20 69 6e 76 6f 6b 65 64 20  thod is invoked 
7fd0: 77 69 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74  with no argument
7fe0: 73 2c 20 74 68 65 20 63 75 72 72 65 6e 74 20 61  s, the current a
7ff0: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 0a 20 20 2a  uthorization.  *
8000: 2a 20 63 61 6c 6c 62 61 63 6b 20 73 74 72 69 6e  * callback strin
8010: 67 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 20  g is returned.. 
8020: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 41 55   */.  case DB_AU
8030: 54 48 4f 52 49 5a 45 52 3a 20 7b 0a 23 69 66 64  THORIZER: {.#ifd
8040: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
8050: 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20  UTHORIZATION.   
8060: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
8070: 74 28 69 6e 74 65 72 70 2c 20 22 61 75 74 68 6f  t(interp, "autho
8080: 72 69 7a 61 74 69 6f 6e 20 6e 6f 74 20 61 76 61  rization not ava
8090: 69 6c 61 62 6c 65 20 69 6e 20 74 68 69 73 20 62  ilable in this b
80a0: 75 69 6c 64 22 2c 20 30 29 3b 0a 20 20 20 20 72  uild", 0);.    r
80b0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
80c0: 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 6f  .#else.    if( o
80d0: 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54  bjc>3 ){.      T
80e0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
80f0: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
8100: 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a   "?CALLBACK?");.
8110: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
8120: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73  _ERROR;.    }els
8130: 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b  e if( objc==2 ){
8140: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
8150: 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 20 20 20  zAuth ){.       
8160: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
8170: 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a  t(interp, pDb->z
8180: 41 75 74 68 2c 20 30 29 3b 0a 20 20 20 20 20 20  Auth, 0);.      
8190: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
81a0: 20 20 20 63 68 61 72 20 2a 7a 41 75 74 68 3b 0a     char *zAuth;.
81b0: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20        int len;. 
81c0: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 41       if( pDb->zA
81d0: 75 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 54  uth ){.        T
81e0: 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 41 75  cl_Free(pDb->zAu
81f0: 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  th);.      }.   
8200: 20 20 20 7a 41 75 74 68 20 3d 20 54 63 6c 5f 47     zAuth = Tcl_G
8210: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
8220: 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a  objv[2], &len);.
8230: 20 20 20 20 20 20 69 66 28 20 7a 41 75 74 68 20        if( zAuth 
8240: 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20  && len>0 ){.    
8250: 20 20 20 20 70 44 62 2d 3e 7a 41 75 74 68 20 3d      pDb->zAuth =
8260: 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20   Tcl_Alloc( len 
8270: 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d  + 1 );.        m
8280: 65 6d 63 70 79 28 70 44 62 2d 3e 7a 41 75 74 68  emcpy(pDb->zAuth
8290: 2c 20 7a 41 75 74 68 2c 20 6c 65 6e 2b 31 29 3b  , zAuth, len+1);
82a0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
82b0: 20 20 20 20 20 20 70 44 62 2d 3e 7a 41 75 74 68        pDb->zAuth
82c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
82d0: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75      if( pDb->zAu
82e0: 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  th ){.        pD
82f0: 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65  b->interp = inte
8300: 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  rp;.        sqli
8310: 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a  te3_set_authoriz
8320: 65 72 28 70 44 62 2d 3e 64 62 2c 20 61 75 74 68  er(pDb->db, auth
8330: 5f 63 61 6c 6c 62 61 63 6b 2c 20 70 44 62 29 3b  _callback, pDb);
8340: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
8350: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65        sqlite3_se
8360: 74 5f 61 75 74 68 6f 72 69 7a 65 72 28 70 44 62  t_authorizer(pDb
8370: 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ->db, 0, 0);.   
8380: 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
8390: 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  f.    break;.  }
83a0: 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 62 75  ..  /*    $db bu
83b0: 73 79 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20  sy ?CALLBACK?.  
83c0: 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74  **.  ** Invoke t
83d0: 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63  he given callbac
83e0: 6b 20 69 66 20 61 6e 20 53 51 4c 20 73 74 61 74  k if an SQL stat
83f0: 65 6d 65 6e 74 20 61 74 74 65 6d 70 74 73 20 74  ement attempts t
8400: 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 6c 6f  o open.  ** a lo
8410: 63 6b 65 64 20 64 61 74 61 62 61 73 65 20 66 69  cked database fi
8420: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  le..  */.  case 
8430: 44 42 5f 42 55 53 59 3a 20 7b 0a 20 20 20 20 69  DB_BUSY: {.    i
8440: 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20  f( objc>3 ){.   
8450: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
8460: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
8470: 62 6a 76 2c 20 22 43 41 4c 4c 42 41 43 4b 22 29  bjv, "CALLBACK")
8480: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
8490: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65  CL_ERROR;.    }e
84a0: 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20  lse if( objc==2 
84b0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  ){.      if( pDb
84c0: 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 20  ->zBusy ){.     
84d0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
84e0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d  ult(interp, pDb-
84f0: 3e 7a 42 75 73 79 2c 20 30 29 3b 0a 20 20 20 20  >zBusy, 0);.    
8500: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
8510: 20 20 20 20 20 63 68 61 72 20 2a 7a 42 75 73 79       char *zBusy
8520: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b  ;.      int len;
8530: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
8540: 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20  zBusy ){.       
8550: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
8560: 42 75 73 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Busy);.      }. 
8570: 20 20 20 20 20 7a 42 75 73 79 20 3d 20 54 63 6c       zBusy = Tcl
8580: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
8590: 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29  j(objv[2], &len)
85a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 42 75 73  ;.      if( zBus
85b0: 79 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20  y && len>0 ){.  
85c0: 20 20 20 20 20 20 70 44 62 2d 3e 7a 42 75 73 79        pDb->zBusy
85d0: 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65   = Tcl_Alloc( le
85e0: 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20  n + 1 );.       
85f0: 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 42 75   memcpy(pDb->zBu
8600: 73 79 2c 20 7a 42 75 73 79 2c 20 6c 65 6e 2b 31  sy, zBusy, len+1
8610: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
8620: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 42 75          pDb->zBu
8630: 73 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  sy = 0;.      }.
8640: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
8650: 42 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Busy ){.        
8660: 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e  pDb->interp = in
8670: 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71  terp;.        sq
8680: 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c  lite3_busy_handl
8690: 65 72 28 70 44 62 2d 3e 64 62 2c 20 44 62 42 75  er(pDb->db, DbBu
86a0: 73 79 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b  syHandler, pDb);
86b0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
86c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75        sqlite3_bu
86d0: 73 79 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e  sy_handler(pDb->
86e0: 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  db, 0, 0);.     
86f0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65   }.    }.    bre
8700: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
8710: 20 20 24 64 62 20 63 61 63 68 65 20 66 6c 75 73    $db cache flus
8720: 68 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63  h.  **     $db c
8730: 61 63 68 65 20 73 69 7a 65 20 6e 0a 20 20 2a 2a  ache size n.  **
8740: 0a 20 20 2a 2a 20 46 6c 75 73 68 20 74 68 65 20  .  ** Flush the 
8750: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
8760: 6e 74 20 63 61 63 68 65 2c 20 6f 72 20 73 65 74  nt cache, or set
8770: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
8780: 62 65 72 20 6f 66 0a 20 20 2a 2a 20 63 61 63 68  ber of.  ** cach
8790: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  ed statements.. 
87a0: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 41   */.  case DB_CA
87b0: 43 48 45 3a 20 7b 0a 20 20 20 20 63 68 61 72 20  CHE: {.    char 
87c0: 2a 73 75 62 43 6d 64 3b 0a 20 20 20 20 69 6e 74  *subCmd;.    int
87d0: 20 6e 3b 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a   n;..    if( obj
87e0: 63 3c 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63  c<=2 ){.      Tc
87f0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
8800: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
8810: 22 63 61 63 68 65 20 6f 70 74 69 6f 6e 20 3f 61  "cache option ?a
8820: 72 67 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74  rg?");.      ret
8830: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
8840: 20 20 20 7d 0a 20 20 20 20 73 75 62 43 6d 64 20     }.    subCmd 
8850: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
8860: 72 6f 6d 4f 62 6a 28 20 6f 62 6a 76 5b 32 5d 2c  romObj( objv[2],
8870: 20 30 20 29 3b 0a 20 20 20 20 69 66 28 20 2a 73   0 );.    if( *s
8880: 75 62 43 6d 64 3d 3d 27 66 27 20 26 26 20 73 74  ubCmd=='f' && st
8890: 72 63 6d 70 28 73 75 62 43 6d 64 2c 22 66 6c 75  rcmp(subCmd,"flu
88a0: 73 68 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  sh")==0 ){.     
88b0: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
88c0: 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e          Tcl_Wron
88d0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
88e0: 20 32 2c 20 6f 62 6a 76 2c 20 22 66 6c 75 73 68   2, objv, "flush
88f0: 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ");.        retu
8900: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
8910: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8920: 20 20 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68     flushStmtCach
8930: 65 28 20 70 44 62 20 29 3b 0a 20 20 20 20 20 20  e( pDb );.      
8940: 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
8950: 2a 73 75 62 43 6d 64 3d 3d 27 73 27 20 26 26 20  *subCmd=='s' && 
8960: 73 74 72 63 6d 70 28 73 75 62 43 6d 64 2c 22 73  strcmp(subCmd,"s
8970: 69 7a 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ize")==0 ){.    
8980: 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b    if( objc!=4 ){
8990: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  .        Tcl_Wro
89a0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
89b0: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 73 69 7a 65  , 2, objv, "size
89c0: 20 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65   n");.        re
89d0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
89e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
89f0: 20 20 20 20 20 69 66 28 20 54 43 4c 5f 45 52 52       if( TCL_ERR
8a00: 4f 52 3d 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72  OR==Tcl_GetIntFr
8a10: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
8a20: 6a 76 5b 33 5d 2c 20 26 6e 29 20 29 7b 0a 20 20  jv[3], &n) ){.  
8a30: 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
8a40: 6e 64 52 65 73 75 6c 74 28 20 69 6e 74 65 72 70  ndResult( interp
8a50: 2c 20 22 63 61 6e 6e 6f 74 20 63 6f 6e 76 65 72  , "cannot conver
8a60: 74 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 20  t \"", .        
8a70: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
8a80: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
8a90: 5b 33 5d 2c 30 29 2c 20 22 5c 22 20 74 6f 20 69  [3],0), "\" to i
8aa0: 6e 74 65 67 65 72 22 2c 20 30 29 3b 0a 20 20 20  nteger", 0);.   
8ab0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
8ac0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  L_ERROR;.       
8ad0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8ae0: 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20    if( n<0 ){.   
8af0: 20 20 20 20 20 20 20 20 20 66 6c 75 73 68 53 74           flushSt
8b00: 6d 74 43 61 63 68 65 28 20 70 44 62 20 29 3b 0a  mtCache( pDb );.
8b10: 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20              n = 
8b20: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  0;.          }el
8b30: 73 65 20 69 66 28 20 6e 3e 4d 41 58 5f 50 52 45  se if( n>MAX_PRE
8b40: 50 41 52 45 44 5f 53 54 4d 54 53 20 29 7b 0a 20  PARED_STMTS ){. 
8b50: 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 4d             n = M
8b60: 41 58 5f 50 52 45 50 41 52 45 44 5f 53 54 4d 54  AX_PREPARED_STMT
8b70: 53 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  S;.          }. 
8b80: 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 6d 61           pDb->ma
8b90: 78 53 74 6d 74 20 3d 20 6e 3b 0a 20 20 20 20 20  xStmt = n;.     
8ba0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
8bb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63   }else{.      Tc
8bc0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 20  l_AppendResult( 
8bd0: 69 6e 74 65 72 70 2c 20 22 62 61 64 20 6f 70 74  interp, "bad opt
8be0: 69 6f 6e 20 5c 22 22 2c 20 0a 20 20 20 20 20 20  ion \"", .      
8bf0: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
8c00: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
8c10: 2c 30 29 2c 20 22 5c 22 3a 20 6d 75 73 74 20 62  ,0), "\": must b
8c20: 65 20 66 6c 75 73 68 20 6f 72 20 73 69 7a 65 22  e flush or size"
8c30: 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , 0);.      retu
8c40: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
8c50: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
8c60: 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 20 24 64 62   }..  /*     $db
8c70: 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 0a 20 20   changes.  **.  
8c80: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
8c90: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61  mber of rows tha
8ca0: 74 20 77 65 72 65 20 6d 6f 64 69 66 69 65 64 2c  t were modified,
8cb0: 20 69 6e 73 65 72 74 65 64 2c 20 6f 72 20 64 65   inserted, or de
8cc0: 6c 65 74 65 64 20 62 79 0a 20 20 2a 2a 20 74 68  leted by.  ** th
8cd0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 49 4e  e most recent IN
8ce0: 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20  SERT, UPDATE or 
8cf0: 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74  DELETE statement
8d00: 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67 20  , not including 
8d10: 0a 20 20 2a 2a 20 61 6e 79 20 63 68 61 6e 67 65  .  ** any change
8d20: 73 20 6d 61 64 65 20 62 79 20 74 72 69 67 67 65  s made by trigge
8d30: 72 20 70 72 6f 67 72 61 6d 73 2e 0a 20 20 2a 2f  r programs..  */
8d40: 0a 20 20 63 61 73 65 20 44 42 5f 43 48 41 4e 47  .  case DB_CHANG
8d50: 45 53 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62  ES: {.    Tcl_Ob
8d60: 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20  j *pResult;.    
8d70: 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
8d80: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
8d90: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
8da0: 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20   objv, "");.    
8db0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
8dc0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 52  OR;.    }.    pR
8dd0: 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f  esult = Tcl_GetO
8de0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  bjResult(interp)
8df0: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 49 6e 74  ;.    Tcl_SetInt
8e00: 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 73 71 6c  Obj(pResult, sql
8e10: 69 74 65 33 5f 63 68 61 6e 67 65 73 28 70 44 62  ite3_changes(pDb
8e20: 2d 3e 64 62 29 29 3b 0a 20 20 20 20 62 72 65 61  ->db));.    brea
8e30: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
8e40: 24 64 62 20 63 6c 6f 73 65 0a 20 20 2a 2a 0a 20  $db close.  **. 
8e50: 20 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65   ** Shutdown the
8e60: 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2f 0a 20   database.  */. 
8e70: 20 63 61 73 65 20 44 42 5f 43 4c 4f 53 45 3a 20   case DB_CLOSE: 
8e80: 7b 0a 20 20 20 20 54 63 6c 5f 44 65 6c 65 74 65  {.    Tcl_Delete
8e90: 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
8ea0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
8eb0: 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
8ec0: 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
8ed0: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
8ee0: 20 24 64 62 20 63 6f 6c 6c 61 74 65 20 4e 41 4d   $db collate NAM
8ef0: 45 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20  E SCRIPT.  **.  
8f00: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
8f10: 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75  SQL collation fu
8f20: 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41  nction called NA
8f30: 4d 45 2e 20 20 57 68 65 6e 65 76 65 72 0a 20 20  ME.  Whenever.  
8f40: 2a 2a 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e  ** that function
8f50: 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f   is called, invo
8f60: 6b 65 20 53 43 52 49 50 54 20 74 6f 20 65 76 61  ke SCRIPT to eva
8f70: 6c 75 61 74 65 20 74 68 65 20 66 75 6e 63 74 69  luate the functi
8f80: 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  on..  */.  case 
8f90: 44 42 5f 43 4f 4c 4c 41 54 45 3a 20 7b 0a 20 20  DB_COLLATE: {.  
8fa0: 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43    SqlCollate *pC
8fb0: 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 63 68 61 72  ollate;.    char
8fc0: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 68 61   *zName;.    cha
8fd0: 72 20 2a 7a 53 63 72 69 70 74 3b 0a 20 20 20 20  r *zScript;.    
8fe0: 69 6e 74 20 6e 53 63 72 69 70 74 3b 0a 20 20 20  int nScript;.   
8ff0: 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a   if( objc!=4 ){.
9000: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
9010: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
9020: 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20 53 43  , objv, "NAME SC
9030: 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65  RIPT");.      re
9040: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
9050: 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20      }.    zName 
9060: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
9070: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
9080: 30 29 3b 0a 20 20 20 20 7a 53 63 72 69 70 74 20  0);.    zScript 
9090: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
90a0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20  romObj(objv[3], 
90b0: 26 6e 53 63 72 69 70 74 29 3b 0a 20 20 20 20 70  &nScript);.    p
90c0: 43 6f 6c 6c 61 74 65 20 3d 20 28 53 71 6c 43 6f  Collate = (SqlCo
90d0: 6c 6c 61 74 65 2a 29 54 63 6c 5f 41 6c 6c 6f 63  llate*)Tcl_Alloc
90e0: 28 20 73 69 7a 65 6f 66 28 2a 70 43 6f 6c 6c 61  ( sizeof(*pColla
90f0: 74 65 29 20 2b 20 6e 53 63 72 69 70 74 20 2b 20  te) + nScript + 
9100: 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f  1 );.    if( pCo
9110: 6c 6c 61 74 65 3d 3d 30 20 29 20 72 65 74 75 72  llate==0 ) retur
9120: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
9130: 20 70 43 6f 6c 6c 61 74 65 2d 3e 69 6e 74 65 72   pCollate->inter
9140: 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20  p = interp;.    
9150: 70 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78 74 20  pCollate->pNext 
9160: 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 3b  = pDb->pCollate;
9170: 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 7a  .    pCollate->z
9180: 53 63 72 69 70 74 20 3d 20 28 63 68 61 72 2a 29  Script = (char*)
9190: 26 70 43 6f 6c 6c 61 74 65 5b 31 5d 3b 0a 20 20  &pCollate[1];.  
91a0: 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20    pDb->pCollate 
91b0: 3d 20 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20  = pCollate;.    
91c0: 6d 65 6d 63 70 79 28 70 43 6f 6c 6c 61 74 65 2d  memcpy(pCollate-
91d0: 3e 7a 53 63 72 69 70 74 2c 20 7a 53 63 72 69 70  >zScript, zScrip
91e0: 74 2c 20 6e 53 63 72 69 70 74 2b 31 29 3b 0a 20  t, nScript+1);. 
91f0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63     if( sqlite3_c
9200: 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28  reate_collation(
9210: 70 44 62 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20  pDb->db, zName, 
9220: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20 20  SQLITE_UTF8, .  
9230: 20 20 20 20 20 20 70 43 6f 6c 6c 61 74 65 2c 20        pCollate, 
9240: 74 63 6c 53 71 6c 43 6f 6c 6c 61 74 65 29 20 29  tclSqlCollate) )
9250: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52  {.      Tcl_SetR
9260: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
9270: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72  har *)sqlite3_er
9280: 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 54  rmsg(pDb->db), T
9290: 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20  CL_VOLATILE);.  
92a0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
92b0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
92c0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
92d0: 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63 6f  .  **     $db co
92e0: 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 20 53  llation_needed S
92f0: 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20  CRIPT.  **.  ** 
9300: 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 51 4c  Create a new SQL
9310: 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74   collation funct
9320: 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e  ion called NAME.
9330: 20 20 57 68 65 6e 65 76 65 72 0a 20 20 2a 2a 20    Whenever.  ** 
9340: 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 69 73  that function is
9350: 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65 20   called, invoke 
9360: 53 43 52 49 50 54 20 74 6f 20 65 76 61 6c 75 61  SCRIPT to evalua
9370: 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e  te the function.
9380: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
9390: 43 4f 4c 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44  COLLATION_NEEDED
93a0: 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  : {.    if( objc
93b0: 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=3 ){.      Tcl
93c0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
93d0: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
93e0: 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20  SCRIPT");.      
93f0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
9400: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
9410: 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65  pDb->pCollateNee
9420: 64 65 64 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  ded ){.      Tcl
9430: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44  _DecrRefCount(pD
9440: 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65  b->pCollateNeede
9450: 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44  d);.    }.    pD
9460: 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65  b->pCollateNeede
9470: 64 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  d = Tcl_Duplicat
9480: 65 4f 62 6a 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  eObj(objv[2]);. 
9490: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
94a0: 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74  unt(pDb->pCollat
94b0: 65 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 73 71  eNeeded);.    sq
94c0: 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  lite3_collation_
94d0: 6e 65 65 64 65 64 28 70 44 62 2d 3e 64 62 2c 20  needed(pDb->db, 
94e0: 70 44 62 2c 20 74 63 6c 43 6f 6c 6c 61 74 65 4e  pDb, tclCollateN
94f0: 65 65 64 65 64 29 3b 0a 20 20 20 20 62 72 65 61  eeded);.    brea
9500: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
9510: 24 64 62 20 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 20  $db commit_hook 
9520: 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a  ?CALLBACK?.  **.
9530: 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20    ** Invoke the 
9540: 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 6a  given callback j
9550: 75 73 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69  ust before commi
9560: 74 74 69 6e 67 20 65 76 65 72 79 20 53 51 4c 20  tting every SQL 
9570: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
9580: 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 62 61 63  * If the callbac
9590: 6b 20 74 68 72 6f 77 73 20 61 6e 20 65 78 63 65  k throws an exce
95a0: 70 74 69 6f 6e 20 6f 72 20 72 65 74 75 72 6e 73  ption or returns
95b0: 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
95c0: 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  the.  ** transac
95d0: 74 69 6f 6e 20 69 73 20 61 62 6f 72 74 65 64 2e  tion is aborted.
95e0: 20 20 49 66 20 43 41 4c 4c 42 41 43 4b 20 69 73    If CALLBACK is
95f0: 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67   an empty string
9600: 2c 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 0a 20  , the callback. 
9610: 20 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e   ** is disabled.
9620: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
9630: 43 4f 4d 4d 49 54 5f 48 4f 4f 4b 3a 20 7b 0a 20  COMMIT_HOOK: {. 
9640: 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b     if( objc>3 ){
9650: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
9660: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
9670: 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42  2, objv, "?CALLB
9680: 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65  ACK?");.      re
9690: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
96a0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62      }else if( ob
96b0: 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69  jc==2 ){.      i
96c0: 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20  f( pDb->zCommit 
96d0: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41  ){.        Tcl_A
96e0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
96f0: 72 70 2c 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74  rp, pDb->zCommit
9700: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
9710: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
9720: 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 0a 20 20  har *zCommit;.  
9730: 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
9740: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d     if( pDb->zCom
9750: 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 54  mit ){.        T
9760: 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 43 6f  cl_Free(pDb->zCo
9770: 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  mmit);.      }. 
9780: 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 54       zCommit = T
9790: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
97a0: 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65  Obj(objv[2], &le
97b0: 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 43  n);.      if( zC
97c0: 6f 6d 6d 69 74 20 26 26 20 6c 65 6e 3e 30 20 29  ommit && len>0 )
97d0: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
97e0: 43 6f 6d 6d 69 74 20 3d 20 54 63 6c 5f 41 6c 6c  Commit = Tcl_All
97f0: 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20  oc( len + 1 );. 
9800: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44         memcpy(pD
9810: 62 2d 3e 7a 43 6f 6d 6d 69 74 2c 20 7a 43 6f 6d  b->zCommit, zCom
9820: 6d 69 74 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20  mit, len+1);.   
9830: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9840: 20 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d    pDb->zCommit =
9850: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
9860: 20 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d    if( pDb->zComm
9870: 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  it ){.        pD
9880: 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65  b->interp = inte
9890: 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  rp;.        sqli
98a0: 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28  te3_commit_hook(
98b0: 70 44 62 2d 3e 64 62 2c 20 44 62 43 6f 6d 6d 69  pDb->db, DbCommi
98c0: 74 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a  tHandler, pDb);.
98d0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
98e0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d       sqlite3_com
98f0: 6d 69 74 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62  mit_hook(pDb->db
9900: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
9910: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
9920: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24  ;.  }..  /*    $
9930: 64 62 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c 0a  db complete SQL.
9940: 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e    **.  ** Return
9950: 20 54 52 55 45 20 69 66 20 53 51 4c 20 69 73 20   TRUE if SQL is 
9960: 61 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c 20 73  a complete SQL s
9970: 74 61 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72  tatement.  Retur
9980: 6e 20 46 41 4c 53 45 20 69 66 0a 20 20 2a 2a 20  n FALSE if.  ** 
9990: 61 64 64 69 74 69 6f 6e 61 6c 20 6c 69 6e 65 73  additional lines
99a0: 20 6f 66 20 69 6e 70 75 74 20 61 72 65 20 6e 65   of input are ne
99b0: 65 64 65 64 2e 20 20 54 68 69 73 20 69 73 20 73  eded.  This is s
99c0: 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 0a 20 20  imilar to the.  
99d0: 2a 2a 20 62 75 69 6c 74 2d 69 6e 20 22 69 6e 66  ** built-in "inf
99e0: 6f 20 63 6f 6d 70 6c 65 74 65 22 20 63 6f 6d 6d  o complete" comm
99f0: 61 6e 64 20 6f 66 20 54 63 6c 2e 0a 20 20 2a 2f  and of Tcl..  */
9a00: 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 4d 50 4c  .  case DB_COMPL
9a10: 45 54 45 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53  ETE: {.#ifndef S
9a20: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c  QLITE_OMIT_COMPL
9a30: 45 54 45 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  ETE.    Tcl_Obj 
9a40: 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 6e  *pResult;.    in
9a50: 74 20 69 73 43 6f 6d 70 6c 65 74 65 3b 0a 20 20  t isComplete;.  
9a60: 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
9a70: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
9a80: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
9a90: 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 22 29 3b  2, objv, "SQL");
9aa0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
9ab0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
9ac0: 20 20 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20     isComplete = 
9ad0: 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65  sqlite3_complete
9ae0: 28 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  ( Tcl_GetStringF
9af0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
9b00: 30 29 20 29 3b 0a 20 20 20 20 70 52 65 73 75 6c  0) );.    pResul
9b10: 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65  t = Tcl_GetObjRe
9b20: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
9b30: 20 20 54 63 6c 5f 53 65 74 42 6f 6f 6c 65 61 6e    Tcl_SetBoolean
9b40: 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 69 73 43  Obj(pResult, isC
9b50: 6f 6d 70 6c 65 74 65 29 3b 0a 23 65 6e 64 69 66  omplete);.#endif
9b60: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
9b70: 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6f 70  .  /*    $db cop
9b80: 79 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72  y conflict-algor
9b90: 69 74 68 6d 20 74 61 62 6c 65 20 66 69 6c 65 6e  ithm table filen
9ba0: 61 6d 65 20 3f 53 45 50 41 52 41 54 4f 52 3f 20  ame ?SEPARATOR? 
9bb0: 3f 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f 0a  ?NULLINDICATOR?.
9bc0: 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 70 79 20 64    **.  ** Copy d
9bd0: 61 74 61 20 69 6e 74 6f 20 74 61 62 6c 65 20 66  ata into table f
9be0: 72 6f 6d 20 66 69 6c 65 6e 61 6d 65 2c 20 6f 70  rom filename, op
9bf0: 74 69 6f 6e 61 6c 6c 79 20 75 73 69 6e 67 20 53  tionally using S
9c00: 45 50 41 52 41 54 4f 52 0a 20 20 2a 2a 20 61 73  EPARATOR.  ** as
9c10: 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f   column separato
9c20: 72 73 2e 20 20 49 66 20 61 20 63 6f 6c 75 6d 6e  rs.  If a column
9c30: 20 63 6f 6e 74 61 69 6e 73 20 61 20 6e 75 6c 6c   contains a null
9c40: 20 73 74 72 69 6e 67 2c 20 6f 72 20 74 68 65 0a   string, or the.
9c50: 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 4e 55    ** value of NU
9c60: 4c 4c 49 4e 44 49 43 41 54 4f 52 2c 20 61 20 4e  LLINDICATOR, a N
9c70: 55 4c 4c 20 69 73 20 69 6e 73 65 72 74 65 64 20  ULL is inserted 
9c80: 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a  for the column..
9c90: 20 20 2a 2a 20 63 6f 6e 66 6c 69 63 74 2d 61 6c    ** conflict-al
9ca0: 67 6f 72 69 74 68 6d 20 69 73 20 6f 6e 65 20 6f  gorithm is one o
9cb0: 66 20 74 68 65 20 73 71 6c 69 74 65 20 63 6f 6e  f the sqlite con
9cc0: 66 6c 69 63 74 20 61 6c 67 6f 72 69 74 68 6d 73  flict algorithms
9cd0: 3a 0a 20 20 2a 2a 20 20 20 20 72 6f 6c 6c 62 61  :.  **    rollba
9ce0: 63 6b 2c 20 61 62 6f 72 74 2c 20 66 61 69 6c 2c  ck, abort, fail,
9cf0: 20 69 67 6e 6f 72 65 2c 20 72 65 70 6c 61 63 65   ignore, replace
9d00: 0a 20 20 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73  .  ** On success
9d10: 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  , return the num
9d20: 62 65 72 20 6f 66 20 6c 69 6e 65 73 20 70 72 6f  ber of lines pro
9d30: 63 65 73 73 65 64 2c 20 6e 6f 74 20 6e 65 63 65  cessed, not nece
9d40: 73 73 61 72 69 6c 79 20 73 61 6d 65 0a 20 20 2a  ssarily same.  *
9d50: 2a 20 61 73 20 27 64 62 20 63 68 61 6e 67 65 73  * as 'db changes
9d60: 27 20 64 75 65 20 74 6f 20 63 6f 6e 66 6c 69 63  ' due to conflic
9d70: 74 2d 61 6c 67 6f 72 69 74 68 6d 20 73 65 6c 65  t-algorithm sele
9d80: 63 74 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  cted..  **.  ** 
9d90: 54 68 69 73 20 63 6f 64 65 20 69 73 20 62 61 73  This code is bas
9da0: 69 63 61 6c 6c 79 20 61 6e 20 69 6d 70 6c 65 6d  ically an implem
9db0: 65 6e 74 61 74 69 6f 6e 2f 65 6e 68 61 6e 63 65  entation/enhance
9dc0: 6d 65 6e 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65  ment of.  ** the
9dd0: 20 73 71 6c 69 74 65 33 20 73 68 65 6c 6c 2e 63   sqlite3 shell.c
9de0: 20 22 2e 69 6d 70 6f 72 74 22 20 63 6f 6d 6d 61   ".import" comma
9df0: 6e 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  nd..  **.  ** Th
9e00: 69 73 20 63 6f 6d 6d 61 6e 64 20 75 73 61 67 65  is command usage
9e10: 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
9e20: 6f 20 74 68 65 20 73 71 6c 69 74 65 32 2e 78 20  o the sqlite2.x 
9e30: 43 4f 50 59 20 73 74 61 74 65 6d 65 6e 74 2c 0a  COPY statement,.
9e40: 20 20 2a 2a 20 77 68 69 63 68 20 69 6d 70 6f 72    ** which impor
9e50: 74 73 20 66 69 6c 65 20 64 61 74 61 20 69 6e 74  ts file data int
9e60: 6f 20 61 20 74 61 62 6c 65 20 75 73 69 6e 67 20  o a table using 
9e70: 74 68 65 20 50 6f 73 74 67 72 65 53 51 4c 20 43  the PostgreSQL C
9e80: 4f 50 59 20 66 69 6c 65 20 66 6f 72 6d 61 74 3a  OPY file format:
9e90: 0a 20 20 2a 2a 20 20 20 24 64 62 20 63 6f 70 79  .  **   $db copy
9ea0: 20 24 63 6f 6e 66 6c 69 74 5f 61 6c 67 6f 20 24   $conflit_algo $
9eb0: 74 61 62 6c 65 5f 6e 61 6d 65 20 24 66 69 6c 65  table_name $file
9ec0: 6e 61 6d 65 20 5c 74 20 5c 5c 4e 0a 20 20 2a 2f  name \t \\N.  */
9ed0: 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 50 59 3a  .  case DB_COPY:
9ee0: 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 61   {.    char *zTa
9ef0: 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ble;            
9f00: 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61 74     /* Insert dat
9f10: 61 20 69 6e 74 6f 20 74 68 69 73 20 74 61 62 6c  a into this tabl
9f20: 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  e */.    char *z
9f30: 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  File;           
9f40: 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65       /* The file
9f50: 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 65   from which to e
9f60: 78 74 72 61 63 74 20 64 61 74 61 20 2a 2f 0a 20  xtract data */. 
9f70: 20 20 20 63 68 61 72 20 2a 7a 43 6f 6e 66 6c 69     char *zConfli
9f80: 63 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ct;            /
9f90: 2a 20 54 68 65 20 63 6f 6e 66 6c 69 63 74 20 61  * The conflict a
9fa0: 6c 67 6f 72 69 74 68 6d 20 74 6f 20 75 73 65 20  lgorithm to use 
9fb0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  */.    sqlite3_s
9fc0: 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20  tmt *pStmt;     
9fd0: 20 20 20 2f 2a 20 41 20 73 74 61 74 65 6d 65 6e     /* A statemen
9fe0: 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 3b  t */.    int rc;
9ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a000: 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
a010: 6f 64 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ode */.    int n
a020: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
a030: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
a040: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
a050: 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  he table */.    
a060: 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20  int nByte;      
a070: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
a080: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
a090: 6e 20 61 6e 20 53 51 4c 20 73 74 72 69 6e 67 20  n an SQL string 
a0a0: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b  */.    int i, j;
a0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0c0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
a0d0: 65 72 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ers */.    int n
a0e0: 53 65 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sep;            
a0f0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
a100: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 53 65   of bytes in zSe
a110: 70 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  p[] */.    int n
a120: 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Null;           
a130: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
a140: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 4e 75   of bytes in zNu
a150: 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 63 68 61 72  ll[] */.    char
a160: 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20 20 20   *zSql;         
a170: 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 53 51          /* An SQ
a180: 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  L statement */. 
a190: 20 20 20 63 68 61 72 20 2a 7a 4c 69 6e 65 3b 20     char *zLine; 
a1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a1b0: 2a 20 41 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20  * A single line 
a1c0: 6f 66 20 69 6e 70 75 74 20 66 72 6f 6d 20 74 68  of input from th
a1d0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 63 68  e file */.    ch
a1e0: 61 72 20 2a 2a 61 7a 43 6f 6c 3b 20 20 20 20 20  ar **azCol;     
a1f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4c 69            /* zLi
a200: 6e 65 5b 5d 20 62 72 6f 6b 65 6e 20 75 70 20 69  ne[] broken up i
a210: 6e 74 6f 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  nto columns */. 
a220: 20 20 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74     char *zCommit
a230: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
a240: 2a 20 48 6f 77 20 74 6f 20 63 6f 6d 6d 69 74 20  * How to commit 
a250: 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 20 20 46  changes */.    F
a260: 49 4c 45 20 2a 69 6e 3b 20 20 20 20 20 20 20 20  ILE *in;        
a270: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
a280: 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a  e input file */.
a290: 20 20 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d      int lineno =
a2a0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
a2b0: 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 6f  /* Line number o
a2c0: 66 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a  f input file */.
a2d0: 20 20 20 20 63 68 61 72 20 7a 4c 69 6e 65 4e 75      char zLineNu
a2e0: 6d 5b 38 30 5d 3b 20 20 20 20 20 20 20 20 20 20  m[80];          
a2f0: 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 70  /* Line number p
a300: 72 69 6e 74 20 62 75 66 66 65 72 20 2a 2f 0a 20  rint buffer */. 
a310: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73     Tcl_Obj *pRes
a320: 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ult;           /
a330: 2a 20 69 6e 74 65 72 70 20 72 65 73 75 6c 74 20  * interp result 
a340: 2a 2f 0a 0a 20 20 20 20 63 68 61 72 20 2a 7a 53  */..    char *zS
a350: 65 70 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e  ep;.    char *zN
a360: 75 6c 6c 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a  ull;.    if( obj
a370: 63 3c 35 20 7c 7c 20 6f 62 6a 63 3e 37 20 29 7b  c<5 || objc>7 ){
a380: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
a390: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
a3a0: 32 2c 20 6f 62 6a 76 2c 20 0a 20 20 20 20 20 20  2, objv, .      
a3b0: 20 20 20 22 43 4f 4e 46 4c 49 43 54 2d 41 4c 47     "CONFLICT-ALG
a3c0: 4f 52 49 54 48 4d 20 54 41 42 4c 45 20 46 49 4c  ORITHM TABLE FIL
a3d0: 45 4e 41 4d 45 20 3f 53 45 50 41 52 41 54 4f 52  ENAME ?SEPARATOR
a3e0: 3f 20 3f 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52  ? ?NULLINDICATOR
a3f0: 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ?");.      retur
a400: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
a410: 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e   }.    if( objc>
a420: 3d 36 20 29 7b 0a 20 20 20 20 20 20 7a 53 65 70  =6 ){.      zSep
a430: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
a440: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 35 5d 2c  FromObj(objv[5],
a450: 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
a460: 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 74        zSep = "\t
a470: 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  ";.    }.    if(
a480: 20 6f 62 6a 63 3e 3d 37 20 29 7b 0a 20 20 20 20   objc>=7 ){.    
a490: 20 20 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 47 65    zNull = Tcl_Ge
a4a0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
a4b0: 62 6a 76 5b 36 5d 2c 20 30 29 3b 0a 20 20 20 20  bjv[6], 0);.    
a4c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4e 75  }else{.      zNu
a4d0: 6c 6c 20 3d 20 22 22 3b 0a 20 20 20 20 7d 0a 20  ll = "";.    }. 
a4e0: 20 20 20 7a 43 6f 6e 66 6c 69 63 74 20 3d 20 54     zConflict = T
a4f0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
a500: 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b  Obj(objv[2], 0);
a510: 0a 20 20 20 20 7a 54 61 62 6c 65 20 3d 20 54 63  .    zTable = Tc
a520: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
a530: 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 30 29 3b 0a  bj(objv[3], 0);.
a540: 20 20 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f      zFile = Tcl_
a550: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
a560: 28 6f 62 6a 76 5b 34 5d 2c 20 30 29 3b 0a 20 20  (objv[4], 0);.  
a570: 20 20 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e 28    nSep = strlen(
a580: 7a 53 65 70 29 3b 0a 20 20 20 20 6e 4e 75 6c 6c  zSep);.    nNull
a590: 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 75 6c 6c 29   = strlen(zNull)
a5a0: 3b 0a 20 20 20 20 69 66 28 20 6e 53 65 70 3d 3d  ;.    if( nSep==
a5b0: 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  0 ){.      Tcl_A
a5c0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
a5d0: 72 70 2c 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d 6e  rp,"Error: non-n
a5e0: 75 6c 6c 20 73 65 70 61 72 61 74 6f 72 20 72 65  ull separator re
a5f0: 71 75 69 72 65 64 20 66 6f 72 20 63 6f 70 79 22  quired for copy"
a600: 2c 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ,0);.      retur
a610: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
a620: 20 7d 0a 20 20 20 20 69 66 28 73 74 72 63 61 73   }.    if(strcas
a630: 65 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20  ecmp(zConflict, 
a640: 22 72 6f 6c 6c 62 61 63 6b 22 29 20 21 3d 20 30  "rollback") != 0
a650: 20 26 26 0a 20 20 20 20 20 20 20 73 74 72 63 61   &&.       strca
a660: 73 65 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c  secmp(zConflict,
a670: 20 22 61 62 6f 72 74 22 20 20 20 29 20 21 3d 20   "abort"   ) != 
a680: 30 20 26 26 0a 20 20 20 20 20 20 20 73 74 72 63  0 &&.       strc
a690: 61 73 65 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74  asecmp(zConflict
a6a0: 2c 20 22 66 61 69 6c 22 20 20 20 20 29 20 21 3d  , "fail"    ) !=
a6b0: 20 30 20 26 26 0a 20 20 20 20 20 20 20 73 74 72   0 &&.       str
a6c0: 63 61 73 65 63 6d 70 28 7a 43 6f 6e 66 6c 69 63  casecmp(zConflic
a6d0: 74 2c 20 22 69 67 6e 6f 72 65 22 20 20 29 20 21  t, "ignore"  ) !
a6e0: 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20 73 74  = 0 &&.       st
a6f0: 72 63 61 73 65 63 6d 70 28 7a 43 6f 6e 66 6c 69  rcasecmp(zConfli
a700: 63 74 2c 20 22 72 65 70 6c 61 63 65 22 20 29 20  ct, "replace" ) 
a710: 21 3d 20 30 20 29 20 7b 0a 20 20 20 20 20 20 54  != 0 ) {.      T
a720: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
a730: 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20  interp, "Error: 
a740: 5c 22 22 2c 20 7a 43 6f 6e 66 6c 69 63 74 2c 20  \"", zConflict, 
a750: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22  .            "\"
a760: 2c 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72  , conflict-algor
a770: 69 74 68 6d 20 6d 75 73 74 20 62 65 20 6f 6e 65  ithm must be one
a780: 20 6f 66 3a 20 72 6f 6c 6c 62 61 63 6b 2c 20 22   of: rollback, "
a790: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 61 62  .            "ab
a7a0: 6f 72 74 2c 20 66 61 69 6c 2c 20 69 67 6e 6f 72  ort, fail, ignor
a7b0: 65 2c 20 6f 72 20 72 65 70 6c 61 63 65 22 2c 20  e, or replace", 
a7c0: 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
a7d0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
a7e0: 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c  }.    zSql = sql
a7f0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45  ite3_mprintf("SE
a800: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 27 25 71 27  LECT * FROM '%q'
a810: 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20  ", zTable);.    
a820: 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20  if( zSql==0 ){. 
a830: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
a840: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45  esult(interp, "E
a850: 72 72 6f 72 3a 20 6e 6f 20 73 75 63 68 20 74 61  rror: no such ta
a860: 62 6c 65 3a 20 22 2c 20 7a 54 61 62 6c 65 2c 20  ble: ", zTable, 
a870: 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
a880: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
a890: 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73 74  }.    nByte = st
a8a0: 72 6c 65 6e 28 7a 53 71 6c 29 3b 0a 20 20 20 20  rlen(zSql);.    
a8b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
a8c0: 70 61 72 65 28 70 44 62 2d 3e 64 62 2c 20 7a 53  pare(pDb->db, zS
a8d0: 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
a8e0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
a8f0: 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20  free(zSql);.    
a900: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
a910: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
a920: 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a  (interp, "Error:
a930: 20 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d   ", sqlite3_errm
a940: 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b  sg(pDb->db), 0);
a950: 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 30 3b  .      nCol = 0;
a960: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a970: 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33    nCol = sqlite3
a980: 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53  _column_count(pS
a990: 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tmt);.    }.    
a9a0: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
a9b0: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28  (pStmt);.    if(
a9c0: 20 6e 43 6f 6c 3d 3d 30 20 29 20 7b 0a 20 20 20   nCol==0 ) {.   
a9d0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
a9e0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  ROR;.    }.    z
a9f0: 53 71 6c 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42  Sql = malloc( nB
aa00: 79 74 65 20 2b 20 35 30 20 2b 20 6e 43 6f 6c 2a  yte + 50 + nCol*
aa10: 32 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71  2 );.    if( zSq
aa20: 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20 20 54  l==0 ) {.      T
aa30: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
aa40: 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20  interp, "Error: 
aa50: 63 61 6e 27 74 20 6d 61 6c 6c 6f 63 28 29 22 2c  can't malloc()",
aa60: 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   0);.      retur
aa70: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
aa80: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73   }.    sqlite3_s
aa90: 6e 70 72 69 6e 74 66 28 6e 42 79 74 65 2b 35 30  nprintf(nByte+50
aaa0: 2c 20 7a 53 71 6c 2c 20 22 49 4e 53 45 52 54 20  , zSql, "INSERT 
aab0: 4f 52 20 25 71 20 49 4e 54 4f 20 27 25 71 27 20  OR %q INTO '%q' 
aac0: 56 41 4c 55 45 53 28 3f 22 2c 0a 20 20 20 20 20  VALUES(?",.     
aad0: 20 20 20 20 7a 43 6f 6e 66 6c 69 63 74 2c 20 7a      zConflict, z
aae0: 54 61 62 6c 65 29 3b 0a 20 20 20 20 6a 20 3d 20  Table);.    j = 
aaf0: 73 74 72 6c 65 6e 28 7a 53 71 6c 29 3b 0a 20 20  strlen(zSql);.  
ab00: 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 43 6f    for(i=1; i<nCo
ab10: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 7a  l; i++){.      z
ab20: 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 2c 27 3b 0a  Sql[j++] = ',';.
ab30: 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20        zSql[j++] 
ab40: 3d 20 27 3f 27 3b 0a 20 20 20 20 7d 0a 20 20 20  = '?';.    }.   
ab50: 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 29 27   zSql[j++] = ')'
ab60: 3b 0a 20 20 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20  ;.    zSql[j] = 
ab70: 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  0;.    rc = sqli
ab80: 74 65 33 5f 70 72 65 70 61 72 65 28 70 44 62 2d  te3_prepare(pDb-
ab90: 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  >db, zSql, -1, &
aba0: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 66  pStmt, 0);.    f
abb0: 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69  ree(zSql);.    i
abc0: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54  f( rc ){.      T
abd0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
abe0: 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20  interp, "Error: 
abf0: 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
ac00: 67 28 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a  g(pDb->db), 0);.
ac10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
ac20: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
ac30: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
ac40: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
ac50: 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c   in = fopen(zFil
ac60: 65 2c 20 22 72 62 22 29 3b 0a 20 20 20 20 69 66  e, "rb");.    if
ac70: 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ( in==0 ){.     
ac80: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
ac90: 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72  t(interp, "Error
aca0: 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69  : cannot open fi
acb0: 6c 65 3a 20 22 2c 20 7a 46 69 6c 65 2c 20 4e 55  le: ", zFile, NU
acc0: 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  LL);.      sqlit
acd0: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
ace0: 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
acf0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
ad00: 7d 0a 20 20 20 20 61 7a 43 6f 6c 20 3d 20 6d 61  }.    azCol = ma
ad10: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 61 7a 43  lloc( sizeof(azC
ad20: 6f 6c 5b 30 5d 29 2a 28 6e 43 6f 6c 2b 31 29 20  ol[0])*(nCol+1) 
ad30: 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 43 6f 6c  );.    if( azCol
ad40: 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20 20 54 63  ==0 ) {.      Tc
ad50: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
ad60: 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 63  nterp, "Error: c
ad70: 61 6e 27 74 20 6d 61 6c 6c 6f 63 28 29 22 2c 20  an't malloc()", 
ad80: 30 29 3b 0a 20 20 20 20 20 20 66 63 6c 6f 73 65  0);.      fclose
ad90: 28 69 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75  (in);.      retu
ada0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
adb0: 20 20 7d 0a 20 20 20 20 28 76 6f 69 64 29 73 71    }.    (void)sq
adc0: 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e  lite3_exec(pDb->
add0: 64 62 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20  db, "BEGIN", 0, 
ade0: 30 2c 20 30 29 3b 0a 20 20 20 20 7a 43 6f 6d 6d  0, 0);.    zComm
adf0: 69 74 20 3d 20 22 43 4f 4d 4d 49 54 22 3b 0a 20  it = "COMMIT";. 
ae00: 20 20 20 77 68 69 6c 65 28 20 28 7a 4c 69 6e 65     while( (zLine
ae10: 20 3d 20 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65   = local_getline
ae20: 28 30 2c 20 69 6e 29 29 21 3d 30 20 29 7b 0a 20  (0, in))!=0 ){. 
ae30: 20 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20       char *z;.  
ae40: 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 20 20 20      i = 0;.     
ae50: 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20   lineno++;.     
ae60: 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20 7a 4c 69 6e   azCol[0] = zLin
ae70: 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  e;.      for(i=0
ae80: 2c 20 7a 3d 7a 4c 69 6e 65 3b 20 2a 7a 3b 20 7a  , z=zLine; *z; z
ae90: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
aea0: 20 2a 7a 3d 3d 7a 53 65 70 5b 30 5d 20 26 26 20   *z==zSep[0] && 
aeb0: 73 74 72 6e 63 6d 70 28 7a 2c 20 7a 53 65 70 2c  strncmp(z, zSep,
aec0: 20 6e 53 65 70 29 3d 3d 30 20 29 7b 0a 20 20 20   nSep)==0 ){.   
aed0: 20 20 20 20 20 20 20 2a 7a 20 3d 20 30 3b 0a 20         *z = 0;. 
aee0: 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20           i++;.  
aef0: 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e 43          if( i<nC
af00: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ol ){.          
af10: 20 20 61 7a 43 6f 6c 5b 69 5d 20 3d 20 26 7a 5b    azCol[i] = &z[
af20: 6e 53 65 70 5d 3b 0a 20 20 20 20 20 20 20 20 20  nSep];.         
af30: 20 20 20 7a 20 2b 3d 20 6e 53 65 70 2d 31 3b 0a     z += nSep-1;.
af40: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
af50: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
af60: 20 20 20 20 69 66 28 20 69 2b 31 21 3d 6e 43 6f      if( i+1!=nCo
af70: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  l ){.        cha
af80: 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20 20 20 20  r *zErr;.       
af90: 20 69 6e 74 20 6e 45 72 72 20 3d 20 73 74 72 6c   int nErr = strl
afa0: 65 6e 28 7a 46 69 6c 65 29 20 2b 20 32 30 30 3b  en(zFile) + 200;
afb0: 0a 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20  .        zErr = 
afc0: 6d 61 6c 6c 6f 63 28 6e 45 72 72 29 3b 0a 20 20  malloc(nErr);.  
afd0: 20 20 20 20 20 20 69 66 28 20 7a 45 72 72 20 29        if( zErr )
afe0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
aff0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 45 72  te3_snprintf(nEr
b000: 72 2c 20 7a 45 72 72 2c 0a 20 20 20 20 20 20 20  r, zErr,.       
b010: 20 20 20 20 20 20 22 45 72 72 6f 72 3a 20 25 73        "Error: %s
b020: 20 6c 69 6e 65 20 25 64 3a 20 65 78 70 65 63 74   line %d: expect
b030: 65 64 20 25 64 20 63 6f 6c 75 6d 6e 73 20 6f 66  ed %d columns of
b040: 20 64 61 74 61 20 62 75 74 20 66 6f 75 6e 64 20   data but found 
b050: 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %d",.           
b060: 20 20 7a 46 69 6c 65 2c 20 6c 69 6e 65 6e 6f 2c    zFile, lineno,
b070: 20 6e 43 6f 6c 2c 20 69 2b 31 29 3b 0a 20 20 20   nCol, i+1);.   
b080: 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
b090: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
b0a0: 7a 45 72 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  zErr, 0);.      
b0b0: 20 20 20 20 66 72 65 65 28 7a 45 72 72 29 3b 0a      free(zErr);.
b0c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b0d0: 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 52 4f 4c    zCommit = "ROL
b0e0: 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20 20 20 20  LBACK";.        
b0f0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
b100: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
b110: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
b120: 20 20 20 20 2f 2a 20 63 68 65 63 6b 20 66 6f 72      /* check for
b130: 20 6e 75 6c 6c 20 64 61 74 61 2c 20 69 66 20 73   null data, if s
b140: 6f 2c 20 62 69 6e 64 20 61 73 20 6e 75 6c 6c 20  o, bind as null 
b150: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 20 28 28  */.        if ((
b160: 6e 4e 75 6c 6c 3e 30 20 26 26 20 73 74 72 63 6d  nNull>0 && strcm
b170: 70 28 61 7a 43 6f 6c 5b 69 5d 2c 20 7a 4e 75 6c  p(azCol[i], zNul
b180: 6c 29 3d 3d 30 29 20 7c 7c 20 73 74 72 6c 65 6e  l)==0) || strlen
b190: 28 61 7a 43 6f 6c 5b 69 5d 29 3d 3d 30 29 20 7b  (azCol[i])==0) {
b1a0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
b1b0: 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74  e3_bind_null(pSt
b1c0: 6d 74 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20  mt, i+1);.      
b1d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
b1e0: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
b1f0: 74 65 78 74 28 70 53 74 6d 74 2c 20 69 2b 31 2c  text(pStmt, i+1,
b200: 20 61 7a 43 6f 6c 5b 69 5d 2c 20 2d 31 2c 20 53   azCol[i], -1, S
b210: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
b220: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
b230: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
b240: 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  tep(pStmt);.    
b250: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
b260: 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20  eset(pStmt);.   
b270: 20 20 20 66 72 65 65 28 7a 4c 69 6e 65 29 3b 0a     free(zLine);.
b280: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
b290: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
b2a0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
b2b0: 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f  ult(interp,"Erro
b2c0: 72 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  r: ", sqlite3_er
b2d0: 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30  rmsg(pDb->db), 0
b2e0: 29 3b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6d 6d  );.        zComm
b2f0: 69 74 20 3d 20 22 52 4f 4c 4c 42 41 43 4b 22 3b  it = "ROLLBACK";
b300: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
b310: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
b320: 20 20 66 72 65 65 28 61 7a 43 6f 6c 29 3b 0a 20    free(azCol);. 
b330: 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20     fclose(in);. 
b340: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
b350: 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
b360: 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f 65 78  (void)sqlite3_ex
b370: 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a 43 6f 6d  ec(pDb->db, zCom
b380: 6d 69 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 0a  mit, 0, 0, 0);..
b390: 20 20 20 20 69 66 28 20 7a 43 6f 6d 6d 69 74 5b      if( zCommit[
b3a0: 30 5d 20 3d 3d 20 27 43 27 20 29 7b 0a 20 20 20  0] == 'C' ){.   
b3b0: 20 20 20 2f 2a 20 73 75 63 63 65 73 73 2c 20 73     /* success, s
b3c0: 65 74 20 72 65 73 75 6c 74 20 61 73 20 6e 75 6d  et result as num
b3d0: 62 65 72 20 6f 66 20 6c 69 6e 65 73 20 70 72 6f  ber of lines pro
b3e0: 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20 20 20  cessed */.      
b3f0: 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65  pResult = Tcl_Ge
b400: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
b410: 70 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65  p);.      Tcl_Se
b420: 74 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c  tIntObj(pResult,
b430: 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20   lineno);.      
b440: 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20  rc = TCL_OK;.   
b450: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
b460: 20 66 61 69 6c 75 72 65 2c 20 61 70 70 65 6e 64   failure, append
b470: 20 6c 69 6e 65 6e 6f 20 77 68 65 72 65 20 66 61   lineno where fa
b480: 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 73 71  iled */.      sq
b490: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
b4a0: 69 7a 65 6f 66 28 7a 4c 69 6e 65 4e 75 6d 29 2c  izeof(zLineNum),
b4b0: 20 7a 4c 69 6e 65 4e 75 6d 2c 22 25 64 22 2c 6c   zLineNum,"%d",l
b4c0: 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20 54 63  ineno);.      Tc
b4d0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
b4e0: 6e 74 65 72 70 2c 22 2c 20 66 61 69 6c 65 64 20  nterp,", failed 
b4f0: 77 68 69 6c 65 20 70 72 6f 63 65 73 73 69 6e 67  while processing
b500: 20 6c 69 6e 65 3a 20 22 2c 7a 4c 69 6e 65 4e 75   line: ",zLineNu
b510: 6d 2c 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  m,0);.      rc =
b520: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
b530: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
b540: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24  ..  /*.  **    $
b550: 64 62 20 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65  db enable_load_e
b560: 78 74 65 6e 73 69 6f 6e 20 42 4f 4f 4c 45 41 4e  xtension BOOLEAN
b570: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 75 72 6e 20  .  **.  ** Turn 
b580: 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 20 6c 6f  the extension lo
b590: 61 64 69 6e 67 20 66 65 61 74 75 72 65 20 6f 6e  ading feature on
b5a0: 20 6f 72 20 6f 66 66 2e 20 20 49 74 20 69 66 20   or off.  It if 
b5b0: 6f 66 66 20 62 79 0a 20 20 2a 2a 20 64 65 66 61  off by.  ** defa
b5c0: 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ult..  */.  case
b5d0: 20 44 42 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f   DB_ENABLE_LOAD_
b5e0: 45 58 54 45 4e 53 49 4f 4e 3a 20 7b 0a 23 69 66  EXTENSION: {.#if
b5f0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
b600: 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
b610: 20 20 20 20 69 6e 74 20 6f 6e 6f 66 66 3b 0a 20      int onoff;. 
b620: 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29     if( objc!=3 )
b630: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
b640: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
b650: 20 32 2c 20 6f 62 6a 76 2c 20 22 42 4f 4f 4c 45   2, objv, "BOOLE
b660: 41 4e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  AN");.      retu
b670: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
b680: 20 20 7d 0a 20 20 20 20 69 66 28 20 54 63 6c 5f    }.    if( Tcl_
b690: 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62  GetBooleanFromOb
b6a0: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
b6b0: 5d 2c 20 26 6f 6e 6f 66 66 29 20 29 7b 0a 20 20  ], &onoff) ){.  
b6c0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
b6d0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
b6e0: 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c  sqlite3_enable_l
b6f0: 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 70 44  oad_extension(pD
b700: 62 2d 3e 64 62 2c 20 6f 6e 6f 66 66 29 3b 0a 20  b->db, onoff);. 
b710: 20 20 20 62 72 65 61 6b 3b 0a 23 65 6c 73 65 0a     break;.#else.
b720: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
b730: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 65 78  sult(interp, "ex
b740: 74 65 6e 73 69 6f 6e 20 6c 6f 61 64 69 6e 67 20  tension loading 
b750: 69 73 20 74 75 72 6e 65 64 20 6f 66 66 20 61 74  is turned off at
b760: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 22 2c 0a   compile-time",.
b770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b780: 20 20 20 20 20 30 29 3b 0a 20 20 20 20 72 65 74       0);.    ret
b790: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23  urn TCL_ERROR;.#
b7a0: 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  endif.  }..  /*.
b7b0: 20 20 2a 2a 20 20 20 20 24 64 62 20 65 72 72 6f    **    $db erro
b7c0: 72 63 6f 64 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rcode.  **.  ** 
b7d0: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 65 72  Return the numer
b7e0: 69 63 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68  ic error code th
b7f0: 61 74 20 77 61 73 20 72 65 74 75 72 6e 65 64 20  at was returned 
b800: 62 79 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  by the most rece
b810: 6e 74 0a 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20  nt.  ** call to 
b820: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 2e 0a  sqlite3_exec()..
b830: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 45    */.  case DB_E
b840: 52 52 4f 52 43 4f 44 45 3a 20 7b 0a 20 20 20 20  RRORCODE: {.    
b850: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
b860: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
b870: 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65  IntObj(sqlite3_e
b880: 72 72 63 6f 64 65 28 70 44 62 2d 3e 64 62 29 29  rrcode(pDb->db))
b890: 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
b8a0: 7d 0a 20 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20  }.   .  /*.  ** 
b8b0: 20 20 20 24 64 62 20 65 76 61 6c 20 24 73 71 6c     $db eval $sql
b8c0: 20 3f 61 72 72 61 79 3f 20 3f 7b 20 20 2e 2e 2e   ?array? ?{  ...
b8d0: 63 6f 64 65 2e 2e 2e 20 7d 3f 0a 20 20 2a 2a 20  code... }?.  ** 
b8e0: 20 20 20 24 64 62 20 6f 6e 65 63 6f 6c 75 6d 6e     $db onecolumn
b8f0: 20 24 73 71 6c 0a 20 20 2a 2a 0a 20 20 2a 2a 20   $sql.  **.  ** 
b900: 54 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  The SQL statemen
b910: 74 20 69 6e 20 24 73 71 6c 20 69 73 20 65 76 61  t in $sql is eva
b920: 6c 75 61 74 65 64 2e 20 20 46 6f 72 20 65 61 63  luated.  For eac
b930: 68 20 72 6f 77 2c 20 74 68 65 20 76 61 6c 75 65  h row, the value
b940: 73 20 61 72 65 0a 20 20 2a 2a 20 70 6c 61 63 65  s are.  ** place
b950: 64 20 69 6e 20 65 6c 65 6d 65 6e 74 73 20 6f 66  d in elements of
b960: 20 74 68 65 20 61 72 72 61 79 20 6e 61 6d 65 64   the array named
b970: 20 22 61 72 72 61 79 22 20 61 6e 64 20 2e 2e 2e   "array" and ...
b980: 63 6f 64 65 2e 2e 2e 20 69 73 20 65 78 65 63 75  code... is execu
b990: 74 65 64 2e 0a 20 20 2a 2a 20 49 66 20 22 61 72  ted..  ** If "ar
b9a0: 72 61 79 22 20 61 6e 64 20 22 63 6f 64 65 22 20  ray" and "code" 
b9b0: 61 72 65 20 6f 6d 69 74 74 65 64 2c 20 74 68 65  are omitted, the
b9c0: 6e 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 20 69 73  n no callback is
b9d0: 20 65 76 65 72 79 20 69 6e 76 6f 6b 65 64 2e 0a   every invoked..
b9e0: 20 20 2a 2a 20 49 66 20 22 61 72 72 61 79 22 20    ** If "array" 
b9f0: 69 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69  is an empty stri
ba00: 6e 67 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c  ng, then the val
ba10: 75 65 73 20 61 72 65 20 70 6c 61 63 65 64 20 69  ues are placed i
ba20: 6e 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a  n variables.  **
ba30: 20 74 68 61 74 20 68 61 76 65 20 74 68 65 20 73   that have the s
ba40: 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20  ame name as the 
ba50: 66 69 65 6c 64 73 20 65 78 74 72 61 63 74 65 64  fields extracted
ba60: 20 62 79 20 74 68 65 20 71 75 65 72 79 2e 0a 20   by the query.. 
ba70: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65   **.  ** The one
ba80: 63 6f 6c 75 6d 6e 20 6d 65 74 68 6f 64 20 69 73  column method is
ba90: 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20   the equivalent 
baa0: 6f 66 3a 0a 20 20 2a 2a 20 20 20 20 20 6c 69 6e  of:.  **     lin
bab0: 64 65 78 20 5b 24 64 62 20 65 76 61 6c 20 24 73  dex [$db eval $s
bac0: 71 6c 5d 20 30 0a 20 20 2a 2f 0a 20 20 63 61 73  ql] 0.  */.  cas
bad0: 65 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 3a 0a  e DB_ONECOLUMN:.
bae0: 20 20 63 61 73 65 20 44 42 5f 45 56 41 4c 3a 0a    case DB_EVAL:.
baf0: 20 20 63 61 73 65 20 44 42 5f 45 58 49 53 54 53    case DB_EXISTS
bb00: 3a 20 7b 0a 20 20 20 20 63 68 61 72 20 63 6f 6e  : {.    char con
bb10: 73 74 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 2f  st *zSql;      /
bb20: 2a 20 4e 65 78 74 20 53 51 4c 20 73 74 61 74 65  * Next SQL state
bb30: 6d 65 6e 74 20 74 6f 20 65 78 65 63 75 74 65 20  ment to execute 
bb40: 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73  */.    char cons
bb50: 74 20 2a 7a 4c 65 66 74 3b 20 20 20 20 20 2f 2a  t *zLeft;     /*
bb60: 20 57 68 61 74 20 69 73 20 6c 65 66 74 20 61 66   What is left af
bb70: 74 65 72 20 66 69 72 73 74 20 73 74 6d 74 20 69  ter first stmt i
bb80: 6e 20 7a 53 71 6c 20 2a 2f 0a 20 20 20 20 73 71  n zSql */.    sq
bb90: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
bba0: 74 3b 20 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 64  t;   /* Compiled
bbb0: 20 53 51 4c 20 73 74 61 74 6d 65 6e 74 20 2a 2f   SQL statment */
bbc0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 41  .    Tcl_Obj *pA
bbd0: 72 72 61 79 3b 20 20 20 20 20 20 20 2f 2a 20 4e  rray;       /* N
bbe0: 61 6d 65 20 6f 66 20 61 72 72 61 79 20 69 6e 74  ame of array int
bbf0: 6f 20 77 68 69 63 68 20 72 65 73 75 6c 74 73 20  o which results 
bc00: 61 72 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20  are written */. 
bc10: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72     Tcl_Obj *pScr
bc20: 69 70 74 3b 20 20 20 20 20 20 2f 2a 20 53 63 72  ipt;      /* Scr
bc30: 69 70 74 20 74 6f 20 72 75 6e 20 66 6f 72 20 65  ipt to run for e
bc40: 61 63 68 20 72 65 73 75 6c 74 20 73 65 74 20 2a  ach result set *
bc50: 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a  /.    Tcl_Obj **
bc60: 61 70 50 61 72 6d 3b 20 20 20 20 20 20 2f 2a 20  apParm;      /* 
bc70: 50 61 72 61 6d 65 74 65 72 73 20 74 68 61 74 20  Parameters that 
bc80: 6e 65 65 64 20 61 20 54 63 6c 5f 44 65 63 72 52  need a Tcl_DecrR
bc90: 65 66 43 6f 75 6e 74 28 29 20 2a 2f 0a 20 20 20  efCount() */.   
bca0: 20 69 6e 74 20 6e 50 61 72 6d 3b 20 20 20 20 20   int nParm;     
bcb0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
bcc0: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 75 73 65  r of entries use
bcd0: 64 20 69 6e 20 61 70 50 61 72 6d 5b 5d 20 2a 2f  d in apParm[] */
bce0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 61 50  .    Tcl_Obj *aP
bcf0: 61 72 6d 5b 31 30 5d 3b 20 20 20 20 2f 2a 20 53  arm[10];    /* S
bd00: 74 61 74 69 63 20 73 70 61 63 65 20 66 6f 72 20  tatic space for 
bd10: 61 70 50 61 72 6d 5b 5d 20 69 6e 20 74 68 65 20  apParm[] in the 
bd20: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20  common case */. 
bd30: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74     Tcl_Obj *pRet
bd40: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c  ;         /* Val
bd50: 75 65 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ue to be returne
bd60: 64 20 2a 2f 0a 20 20 20 20 53 71 6c 50 72 65 70  d */.    SqlPrep
bd70: 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65 53 74  aredStmt *pPreSt
bd80: 6d 74 3b 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  mt;  /* Pointer 
bd90: 74 6f 20 61 20 70 72 65 70 61 72 65 64 20 73 74  to a prepared st
bda0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69  atement */.    i
bdb0: 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 69 66 28  nt rc2;..    if(
bdc0: 20 63 68 6f 69 63 65 3d 3d 44 42 5f 45 56 41 4c   choice==DB_EVAL
bdd0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 62   ){.      if( ob
bde0: 6a 63 3c 33 20 7c 7c 20 6f 62 6a 63 3e 35 20 29  jc<3 || objc>5 )
bdf0: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72  {.        Tcl_Wr
be00: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
be10: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c  p, 2, objv, "SQL
be20: 20 3f 41 52 52 41 59 2d 4e 41 4d 45 3f 20 3f 53   ?ARRAY-NAME? ?S
be30: 43 52 49 50 54 3f 22 29 3b 0a 20 20 20 20 20 20  CRIPT?");.      
be40: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
be50: 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
be60: 20 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77    pRet = Tcl_New
be70: 4f 62 6a 28 29 3b 0a 20 20 20 20 20 20 54 63 6c  Obj();.      Tcl
be80: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 52  _IncrRefCount(pR
be90: 65 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  et);.    }else{.
bea0: 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d        if( objc!=
beb0: 33 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  3 ){.        Tcl
bec0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
bed0: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
bee0: 53 51 4c 22 29 3b 0a 20 20 20 20 20 20 20 20 72  SQL");.        r
bef0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
bf00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
bf10: 66 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f 45 58  f( choice==DB_EX
bf20: 49 53 54 53 20 29 7b 0a 20 20 20 20 20 20 20 20  ISTS ){.        
bf30: 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 42 6f  pRet = Tcl_NewBo
bf40: 6f 6c 65 61 6e 4f 62 6a 28 30 29 3b 0a 20 20 20  oleanObj(0);.   
bf50: 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66       Tcl_IncrRef
bf60: 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20  Count(pRet);.   
bf70: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
bf80: 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20    pRet = 0;.    
bf90: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
bfa0: 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20  ( objc==3 ){.   
bfb0: 20 20 20 70 41 72 72 61 79 20 3d 20 70 53 63 72     pArray = pScr
bfc0: 69 70 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ipt = 0;.    }el
bfd0: 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29  se if( objc==4 )
bfe0: 7b 0a 20 20 20 20 20 20 70 41 72 72 61 79 20 3d  {.      pArray =
bff0: 20 30 3b 0a 20 20 20 20 20 20 70 53 63 72 69 70   0;.      pScrip
c000: 74 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20  t = objv[3];.   
c010: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 41   }else{.      pA
c020: 72 72 61 79 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a  rray = objv[3];.
c030: 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65        if( Tcl_Ge
c040: 74 53 74 72 69 6e 67 28 70 41 72 72 61 79 29 5b  tString(pArray)[
c050: 30 5d 3d 3d 30 20 29 20 70 41 72 72 61 79 20 3d  0]==0 ) pArray =
c060: 20 30 3b 0a 20 20 20 20 20 20 70 53 63 72 69 70   0;.      pScrip
c070: 74 20 3d 20 6f 62 6a 76 5b 34 5d 3b 0a 20 20 20  t = objv[4];.   
c080: 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72   }..    Tcl_Incr
c090: 52 65 66 43 6f 75 6e 74 28 6f 62 6a 76 5b 32 5d  RefCount(objv[2]
c0a0: 29 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 54 63  );.    zSql = Tc
c0b0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
c0c0: 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a  bj(objv[2], 0);.
c0d0: 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 54      while( rc==T
c0e0: 43 4c 5f 4f 4b 20 26 26 20 7a 53 71 6c 5b 30 5d  CL_OK && zSql[0]
c0f0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
c100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c110: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
c120: 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e  nter */.      in
c130: 74 20 6e 56 61 72 3b 20 20 20 20 20 20 20 20 20  t nVar;         
c140: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
c150: 65 72 20 6f 66 20 62 69 6e 64 20 70 61 72 61 6d  er of bind param
c160: 65 74 65 72 73 20 69 6e 20 74 68 65 20 70 53 74  eters in the pSt
c170: 6d 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  mt */.      int 
c180: 6e 43 6f 6c 20 3d 20 2d 31 3b 20 20 20 20 20 20  nCol = -1;      
c190: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
c1a0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
c1b0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
c1c0: 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  .      Tcl_Obj *
c1d0: 2a 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 30 3b 20  *apColName = 0; 
c1e0: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 6f    /* Array of co
c1f0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20  lumn names */.  
c200: 20 20 20 20 69 6e 74 20 6c 65 6e 3b 20 20 20 20      int len;    
c210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c220: 2a 20 53 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  * String length 
c230: 6f 66 20 7a 53 71 6c 20 2a 2f 0a 20 20 0a 20 20  of zSql */.  .  
c240: 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69      /* Try to fi
c250: 6e 64 20 61 20 53 51 4c 20 73 74 61 74 65 6d 65  nd a SQL stateme
c260: 6e 74 20 74 68 61 74 20 68 61 73 20 61 6c 72 65  nt that has alre
c270: 61 64 79 20 62 65 65 6e 20 63 6f 6d 70 69 6c 65  ady been compile
c280: 64 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 77  d and.      ** w
c290: 68 69 63 68 20 6d 61 74 63 68 65 73 20 74 68 65  hich matches the
c2a0: 20 6e 65 78 74 20 73 65 71 75 65 6e 63 65 20 6f   next sequence o
c2b0: 66 20 53 51 4c 2e 0a 20 20 20 20 20 20 2a 2f 0a  f SQL..      */.
c2c0: 20 20 20 20 20 20 70 53 74 6d 74 20 3d 20 30 3b        pStmt = 0;
c2d0: 0a 20 20 20 20 20 20 6c 65 6e 20 3d 20 73 74 72  .      len = str
c2e0: 6c 65 6e 28 7a 53 71 6c 29 3b 0a 20 20 20 20 20  len(zSql);.     
c2f0: 20 66 6f 72 28 70 50 72 65 53 74 6d 74 20 3d 20   for(pPreStmt = 
c300: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 20 70  pDb->stmtList; p
c310: 50 72 65 53 74 6d 74 3b 20 70 50 72 65 53 74 6d  PreStmt; pPreStm
c320: 74 3d 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78  t=pPreStmt->pNex
c330: 74 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  t){.        int 
c340: 6e 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53  n = pPreStmt->nS
c350: 71 6c 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ql;.        if( 
c360: 6c 65 6e 3e 3d 6e 20 0a 20 20 20 20 20 20 20 20  len>=n .        
c370: 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 50      && memcmp(pP
c380: 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c 20 7a 53  reStmt->zSql, zS
c390: 71 6c 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 20 20  ql, n)==0.      
c3a0: 20 20 20 20 20 20 26 26 20 28 7a 53 71 6c 5b 6e        && (zSql[n
c3b0: 5d 3d 3d 30 20 7c 7c 20 7a 53 71 6c 5b 6e 2d 31  ]==0 || zSql[n-1
c3c0: 5d 3d 3d 27 3b 27 29 0a 20 20 20 20 20 20 20 20  ]==';').        
c3d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 53 74  ){.          pSt
c3e0: 6d 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70  mt = pPreStmt->p
c3f0: 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Stmt;.          
c400: 7a 4c 65 66 74 20 3d 20 26 7a 53 71 6c 5b 70 50  zLeft = &zSql[pP
c410: 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 5d 3b 0a 0a  reStmt->nSql];..
c420: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65            /* Whe
c430: 6e 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61  n a prepared sta
c440: 74 65 6d 65 6e 74 20 69 73 20 66 6f 75 6e 64 2c  tement is found,
c450: 20 75 6e 6c 69 6e 6b 20 69 74 20 66 72 6f 6d 20   unlink it from 
c460: 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
c470: 20 63 61 63 68 65 20 6c 69 73 74 2e 20 20 49 74   cache list.  It
c480: 20 77 69 6c 6c 20 6c 61 74 65 72 20 62 65 20 61   will later be a
c490: 64 64 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65  dded back to the
c4a0: 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20   beginning.     
c4b0: 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 63       ** of the c
c4c0: 61 63 68 65 20 6c 69 73 74 20 69 6e 20 6f 72 64  ache list in ord
c4d0: 65 72 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  er to implement 
c4e0: 4c 52 55 20 72 65 70 6c 61 63 65 6d 65 6e 74 2e  LRU replacement.
c4f0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
c500: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65          if( pPre
c510: 53 74 6d 74 2d 3e 70 50 72 65 76 20 29 7b 0a 20  Stmt->pPrev ){. 
c520: 20 20 20 20 20 20 20 20 20 20 20 70 50 72 65 53             pPreS
c530: 74 6d 74 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  tmt->pPrev->pNex
c540: 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e  t = pPreStmt->pN
c550: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ext;.          }
c560: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
c570: 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20    pDb->stmtList 
c580: 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78  = pPreStmt->pNex
c590: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
c5a0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72           if( pPr
c5b0: 65 53 74 6d 74 2d 3e 70 4e 65 78 74 20 29 7b 0a  eStmt->pNext ){.
c5c0: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 72 65              pPre
c5d0: 53 74 6d 74 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  Stmt->pNext->pPr
c5e0: 65 76 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70  ev = pPreStmt->p
c5f0: 50 72 65 76 3b 0a 20 20 20 20 20 20 20 20 20 20  Prev;.          
c600: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
c610: 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74     pDb->stmtLast
c620: 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72   = pPreStmt->pPr
c630: 65 76 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ev;.          }.
c640: 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 6e            pDb->n
c650: 53 74 6d 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20  Stmt--;.        
c660: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
c670: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20   }.      }.  .  
c680: 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 70 72 65      /* If no pre
c690: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
c6a0: 77 61 73 20 66 6f 75 6e 64 2e 20 20 43 6f 6d 70  was found.  Comp
c6b0: 69 6c 65 20 74 68 65 20 53 51 4c 20 74 65 78 74  ile the SQL text
c6c0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
c6d0: 69 66 28 20 70 53 74 6d 74 3d 3d 30 20 29 7b 0a  if( pStmt==0 ){.
c6e0: 20 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49          if( SQLI
c6f0: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 70  TE_OK!=sqlite3_p
c700: 72 65 70 61 72 65 5f 76 32 28 70 44 62 2d 3e 64  repare_v2(pDb->d
c710: 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
c720: 74 6d 74 2c 20 26 7a 4c 65 66 74 29 20 29 7b 0a  tmt, &zLeft) ){.
c730: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65            Tcl_Se
c740: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
c750: 70 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 73  p, dbTextToObj(s
c760: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44  qlite3_errmsg(pD
c770: 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20 20 20  b->db)));.      
c780: 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52      rc = TCL_ERR
c790: 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  OR;.          br
c7a0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
c7b0: 20 20 20 20 20 20 20 69 66 28 20 70 53 74 6d 74         if( pStmt
c7c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
c7d0: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
c7e0: 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
c7f0: 70 44 62 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20  pDb->db) ){.    
c800: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6d          /* A com
c810: 70 69 6c 65 2d 74 69 6d 65 20 65 72 72 6f 72 20  pile-time error 
c820: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
c830: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
c840: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
c850: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
c860: 65 72 70 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a  erp, dbTextToObj
c870: 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28  (sqlite3_errmsg(
c880: 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20  pDb->db)));.    
c890: 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c          rc = TCL
c8a0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
c8b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
c8c0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
c8d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
c8e0: 74 61 74 65 6d 65 6e 74 20 77 61 73 20 61 20 6e  tatement was a n
c8f0: 6f 2d 6f 70 2e 20 20 43 6f 6e 74 69 6e 75 65 20  o-op.  Continue 
c900: 74 6f 20 74 68 65 20 6e 65 78 74 20 73 74 61 74  to the next stat
c910: 65 6d 65 6e 74 0a 20 20 20 20 20 20 20 20 20 20  ement.          
c920: 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c 20    ** in the SQL 
c930: 73 74 72 69 6e 67 2e 0a 20 20 20 20 20 20 20 20  string..        
c940: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
c950: 20 20 20 7a 53 71 6c 20 3d 20 7a 4c 65 66 74 3b     zSql = zLeft;
c960: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
c970: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
c980: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
c990: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72       assert( pPr
c9a0: 65 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20  eStmt==0 );.    
c9b0: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 42 69    }..      /* Bi
c9c0: 6e 64 20 76 61 6c 75 65 73 20 74 6f 20 70 61 72  nd values to par
c9d0: 61 6d 65 74 65 72 73 20 74 68 61 74 20 62 65 67  ameters that beg
c9e0: 69 6e 20 77 69 74 68 20 24 20 6f 72 20 3a 0a 20  in with $ or :. 
c9f0: 20 20 20 20 20 2a 2f 20 20 0a 20 20 20 20 20 20       */  .      
ca00: 6e 56 61 72 20 3d 20 73 71 6c 69 74 65 33 5f 62  nVar = sqlite3_b
ca10: 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f  ind_parameter_co
ca20: 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  unt(pStmt);.    
ca30: 20 20 6e 50 61 72 6d 20 3d 20 30 3b 0a 20 20 20    nParm = 0;.   
ca40: 20 20 20 69 66 28 20 6e 56 61 72 3e 73 69 7a 65     if( nVar>size
ca50: 6f 66 28 61 50 61 72 6d 29 2f 73 69 7a 65 6f 66  of(aParm)/sizeof
ca60: 28 61 50 61 72 6d 5b 30 5d 29 20 29 7b 0a 20 20  (aParm[0]) ){.  
ca70: 20 20 20 20 20 20 61 70 50 61 72 6d 20 3d 20 28        apParm = (
ca80: 54 63 6c 5f 4f 62 6a 2a 2a 29 54 63 6c 5f 41 6c  Tcl_Obj**)Tcl_Al
ca90: 6c 6f 63 28 6e 56 61 72 2a 73 69 7a 65 6f 66 28  loc(nVar*sizeof(
caa0: 61 70 50 61 72 6d 5b 30 5d 29 29 3b 0a 20 20 20  apParm[0]));.   
cab0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
cac0: 20 20 61 70 50 61 72 6d 20 3d 20 61 50 61 72 6d    apParm = aParm
cad0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
cae0: 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 56 61 72  for(i=1; i<=nVar
caf0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
cb00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 72  const char *zVar
cb10: 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
cb20: 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 70  parameter_name(p
cb30: 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Stmt, i);.      
cb40: 20 20 69 66 28 20 7a 56 61 72 21 3d 30 20 26 26    if( zVar!=0 &&
cb50: 20 28 7a 56 61 72 5b 30 5d 3d 3d 27 24 27 20 7c   (zVar[0]=='$' |
cb60: 7c 20 7a 56 61 72 5b 30 5d 3d 3d 27 3a 27 20 7c  | zVar[0]==':' |
cb70: 7c 20 7a 56 61 72 5b 30 5d 3d 3d 27 40 27 29 20  | zVar[0]=='@') 
cb80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  ){.          Tcl
cb90: 5f 4f 62 6a 20 2a 70 56 61 72 20 3d 20 54 63 6c  _Obj *pVar = Tcl
cba0: 5f 47 65 74 56 61 72 32 45 78 28 69 6e 74 65 72  _GetVar2Ex(inter
cbb0: 70 2c 20 26 7a 56 61 72 5b 31 5d 2c 20 30 2c 20  p, &zVar[1], 0, 
cbc0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  0);.          if
cbd0: 28 20 70 56 61 72 20 29 7b 0a 20 20 20 20 20 20  ( pVar ){.      
cbe0: 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
cbf0: 20 20 20 20 20 20 20 20 20 75 38 20 2a 64 61 74           u8 *dat
cc00: 61 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  a;.            c
cc10: 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 70 56 61  har *zType = pVa
cc20: 72 2d 3e 74 79 70 65 50 74 72 20 3f 20 70 56 61  r->typePtr ? pVa
cc30: 72 2d 3e 74 79 70 65 50 74 72 2d 3e 6e 61 6d 65  r->typePtr->name
cc40: 20 3a 20 22 22 3b 0a 20 20 20 20 20 20 20 20 20   : "";.         
cc50: 20 20 20 63 68 61 72 20 63 20 3d 20 7a 54 79 70     char c = zTyp
cc60: 65 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  e[0];.          
cc70: 20 20 69 66 28 20 7a 56 61 72 5b 30 5d 3d 3d 27    if( zVar[0]=='
cc80: 40 27 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  @' ||.          
cc90: 20 20 20 20 20 28 63 3d 3d 27 62 27 20 26 26 20       (c=='b' && 
cca0: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 62 79  strcmp(zType,"by
ccb0: 74 65 61 72 72 61 79 22 29 3d 3d 30 20 26 26 20  tearray")==0 && 
ccc0: 70 56 61 72 2d 3e 62 79 74 65 73 3d 3d 30 29 20  pVar->bytes==0) 
ccd0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
cce0: 20 2f 2a 20 4c 6f 61 64 20 61 20 42 4c 4f 42 20   /* Load a BLOB 
ccf0: 74 79 70 65 20 69 66 20 74 68 65 20 54 63 6c 20  type if the Tcl 
cd00: 76 61 72 69 61 62 6c 65 20 69 73 20 61 20 62 79  variable is a by
cd10: 74 65 61 72 72 61 79 20 61 6e 64 0a 20 20 20 20  tearray and.    
cd20: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20            ** it 
cd30: 68 61 73 20 6e 6f 20 73 74 72 69 6e 67 20 72 65  has no string re
cd40: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 72 20  presentation or 
cd50: 74 68 65 20 68 6f 73 74 0a 20 20 20 20 20 20 20  the host.       
cd60: 20 20 20 20 20 20 20 2a 2a 20 70 61 72 61 6d 65         ** parame
cd70: 74 65 72 20 6e 61 6d 65 20 62 65 67 69 6e 73 20  ter name begins 
cd80: 77 69 74 68 20 22 40 22 2e 20 2a 2f 0a 20 20 20  with "@". */.   
cd90: 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 20             data 
cda0: 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  = Tcl_GetByteArr
cdb0: 61 79 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20  ayFromObj(pVar, 
cdc0: 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  &n);.           
cdd0: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
cde0: 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69 2c 20 64  blob(pStmt, i, d
cdf0: 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 53  ata, n, SQLITE_S
ce00: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20  TATIC);.        
ce10: 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65        Tcl_IncrRe
ce20: 66 43 6f 75 6e 74 28 70 56 61 72 29 3b 0a 20 20  fCount(pVar);.  
ce30: 20 20 20 20 20 20 20 20 20 20 20 20 61 70 50 61              apPa
ce40: 72 6d 5b 6e 50 61 72 6d 2b 2b 5d 20 3d 20 70 56  rm[nParm++] = pV
ce50: 61 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ar;.            
ce60: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 62 27  }else if( c=='b'
ce70: 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65   && strcmp(zType
ce80: 2c 22 62 6f 6f 6c 65 61 6e 22 29 3d 3d 30 20 29  ,"boolean")==0 )
ce90: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
cea0: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
ceb0: 6a 28 69 6e 74 65 72 70 2c 20 70 56 61 72 2c 20  j(interp, pVar, 
cec0: 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  &n);.           
ced0: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
cee0: 69 6e 74 28 70 53 74 6d 74 2c 20 69 2c 20 6e 29  int(pStmt, i, n)
cef0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
cf00: 6c 73 65 20 69 66 28 20 63 3d 3d 27 64 27 20 26  lse if( c=='d' &
cf10: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
cf20: 64 6f 75 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20  double")==0 ){. 
cf30: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 6f 75               dou
cf40: 62 6c 65 20 72 3b 0a 20 20 20 20 20 20 20 20 20  ble r;.         
cf50: 20 20 20 20 20 54 63 6c 5f 47 65 74 44 6f 75 62       Tcl_GetDoub
cf60: 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  leFromObj(interp
cf70: 2c 20 70 56 61 72 2c 20 26 72 29 3b 0a 20 20 20  , pVar, &r);.   
cf80: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
cf90: 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28 70  e3_bind_double(p
cfa0: 53 74 6d 74 2c 20 69 2c 20 72 29 3b 0a 20 20 20  Stmt, i, r);.   
cfb0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
cfc0: 66 28 20 28 63 3d 3d 27 77 27 20 26 26 20 73 74  f( (c=='w' && st
cfd0: 72 63 6d 70 28 7a 54 79 70 65 2c 22 77 69 64 65  rcmp(zType,"wide
cfe0: 49 6e 74 22 29 3d 3d 30 29 20 7c 7c 0a 20 20 20  Int")==0) ||.   
cff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
d000: 63 3d 3d 27 69 27 20 26 26 20 73 74 72 63 6d 70  c=='i' && strcmp
d010: 28 7a 54 79 70 65 2c 22 69 6e 74 22 29 3d 3d 30  (zType,"int")==0
d020: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
d030: 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 76     Tcl_WideInt v
d040: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
d050: 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72  Tcl_GetWideIntFr
d060: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 56  omObj(interp, pV
d070: 61 72 2c 20 26 76 29 3b 0a 20 20 20 20 20 20 20  ar, &v);.       
d080: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
d090: 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c  ind_int64(pStmt,
d0a0: 20 69 2c 20 76 29 3b 0a 20 20 20 20 20 20 20 20   i, v);.        
d0b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d0c0: 20 20 20 20 20 20 20 20 20 64 61 74 61 20 3d 20           data = 
d0d0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
d0e0: 29 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72  )Tcl_GetStringFr
d0f0: 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b  omObj(pVar, &n);
d100: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
d110: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
d120: 28 70 53 74 6d 74 2c 20 69 2c 20 28 63 68 61 72  (pStmt, i, (char
d130: 20 2a 29 64 61 74 61 2c 20 6e 2b 31 2c 20 53 51   *)data, n+1, SQ
d140: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
d150: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
d160: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 56 61  IncrRefCount(pVa
d170: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
d180: 20 20 61 70 50 61 72 6d 5b 6e 50 61 72 6d 2b 2b    apParm[nParm++
d190: 5d 20 3d 20 70 56 61 72 3b 0a 20 20 20 20 20 20  ] = pVar;.      
d1a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d1b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
d1c0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
d1d0: 64 5f 6e 75 6c 6c 28 20 70 53 74 6d 74 2c 20 69  d_null( pStmt, i
d1e0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   );.          }.
d1f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d200: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45 78 65 63  }..      /* Exec
d210: 75 74 65 20 74 68 65 20 53 51 4c 0a 20 20 20 20  ute the SQL.    
d220: 20 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65    */.      while
d230: 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 26 26 20  ( rc==TCL_OK && 
d240: 70 53 74 6d 74 20 26 26 20 53 51 4c 49 54 45 5f  pStmt && SQLITE_
d250: 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
d260: 70 28 70 53 74 6d 74 29 20 29 7b 0a 0a 09 2f 2a  p(pStmt) ){.../*
d270: 20 43 6f 6d 70 75 74 65 20 63 6f 6c 75 6d 6e 20   Compute column 
d280: 6e 61 6d 65 73 2e 20 54 68 69 73 20 6d 75 73 74  names. This must
d290: 20 62 65 20 64 6f 6e 65 20 61 66 74 65 72 20 74   be done after t
d2a0: 68 65 20 66 69 72 73 74 20 73 75 63 63 65 73 73  he first success
d2b0: 66 75 6c 0a 09 2a 2a 20 63 61 6c 6c 20 74 6f 20  ful..** call to 
d2c0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2c 20  sqlite3_step(), 
d2d0: 69 6e 20 63 61 73 65 20 74 68 65 20 71 75 65 72  in case the quer
d2e0: 79 20 69 73 20 72 65 63 6f 6d 70 69 6c 65 64 20  y is recompiled 
d2f0: 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20 20 20  and the.        
d300: 2a 2a 20 6e 75 6d 62 65 72 20 6f 72 20 6e 61 6d  ** number or nam
d310: 65 73 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e  es of the return
d320: 65 64 20 63 6f 6c 75 6d 6e 73 20 63 68 61 6e 67  ed columns chang
d330: 65 73 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a  es. .        */.
d340: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 21          assert(!
d350: 70 41 72 72 61 79 7c 7c 70 53 63 72 69 70 74 29  pArray||pScript)
d360: 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28 6e 43  ;.        if (nC
d370: 6f 6c 20 3c 20 30 29 20 7b 0a 20 20 20 20 20 20  ol < 0) {.      
d380: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 2a 61      Tcl_Obj ***a
d390: 70 20 3d 20 28 70 53 63 72 69 70 74 3f 26 61 70  p = (pScript?&ap
d3a0: 43 6f 6c 4e 61 6d 65 3a 30 29 3b 0a 20 20 20 20  ColName:0);.    
d3b0: 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 63 6f 6d        nCol = com
d3c0: 70 75 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  puteColumnNames(
d3d0: 69 6e 74 65 72 70 2c 20 70 53 74 6d 74 2c 20 61  interp, pStmt, a
d3e0: 70 2c 20 70 41 72 72 61 79 29 3b 0a 20 20 20 20  p, pArray);.    
d3f0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 66      }..        f
d400: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
d410: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
d420: 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b 0a 20  Tcl_Obj *pVal;. 
d430: 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20           .      
d440: 20 20 20 20 2f 2a 20 53 65 74 20 70 56 61 6c 20      /* Set pVal 
d450: 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 69  to contain the i
d460: 27 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  'th column of th
d470: 69 73 20 72 6f 77 2e 20 2a 2f 0a 20 20 20 20 20  is row. */.     
d480: 20 20 20 20 20 73 77 69 74 63 68 28 20 73 71 6c       switch( sql
d490: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65  ite3_column_type
d4a0: 28 70 53 74 6d 74 2c 20 69 29 20 29 7b 0a 20 20  (pStmt, i) ){.  
d4b0: 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53            case S
d4c0: 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20  QLITE_BLOB: {.  
d4d0: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
d4e0: 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f  bytes = sqlite3_
d4f0: 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74  column_bytes(pSt
d500: 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  mt, i);.        
d510: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
d520: 20 2a 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65   *zBlob = sqlite
d530: 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53  3_column_blob(pS
d540: 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  tmt, i);.       
d550: 20 20 20 20 20 20 20 69 66 28 20 21 7a 42 6c 6f         if( !zBlo
d560: 62 20 29 20 62 79 74 65 73 20 3d 20 30 3b 0a 20  b ) bytes = 0;. 
d570: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56 61               pVa
d580: 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41  l = Tcl_NewByteA
d590: 72 72 61 79 4f 62 6a 28 28 75 38 2a 29 7a 42 6c  rrayObj((u8*)zBl
d5a0: 6f 62 2c 20 62 79 74 65 73 29 3b 0a 20 20 20 20  ob, bytes);.    
d5b0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
d5c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
d5d0: 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20             case 
d5e0: 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20  SQLITE_INTEGER: 
d5f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
d600: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 76 20 3d  sqlite_int64 v =
d610: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
d620: 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 69 29 3b  int64(pStmt, i);
d630: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
d640: 66 28 20 76 3e 3d 2d 32 31 34 37 34 38 33 36 34  f( v>=-214748364
d650: 37 20 26 26 20 76 3c 3d 32 31 34 37 34 38 33 36  7 && v<=21474836
d660: 34 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  47 ){.          
d670: 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c        pVal = Tcl
d680: 5f 4e 65 77 49 6e 74 4f 62 6a 28 76 29 3b 0a 20  _NewIntObj(v);. 
d690: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c               }el
d6a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
d6b0: 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e      pVal = Tcl_N
d6c0: 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 76 29 3b  ewWideIntObj(v);
d6d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
d6e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
d6f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
d700: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
d710: 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41  case SQLITE_FLOA
d720: 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  T: {.           
d730: 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 73 71     double r = sq
d740: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75  lite3_column_dou
d750: 62 6c 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20  ble(pStmt, i);. 
d760: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56 61               pVa
d770: 6c 20 3d 20 54 63 6c 5f 4e 65 77 44 6f 75 62 6c  l = Tcl_NewDoubl
d780: 65 4f 62 6a 28 72 29 3b 0a 20 20 20 20 20 20 20  eObj(r);.       
d790: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
d7a0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
d7b0: 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
d7c0: 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  ITE_NULL: {.    
d7d0: 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d            pVal =
d7e0: 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 70 44 62   dbTextToObj(pDb
d7f0: 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  ->zNull);.      
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 64 65 66 61 75 6c 74           default
d830: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  : {.            
d840: 20 20 70 56 61 6c 20 3d 20 64 62 54 65 78 74 54    pVal = dbTextT
d850: 6f 4f 62 6a 28 28 63 68 61 72 20 2a 29 73 71 6c  oObj((char *)sql
d860: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
d870: 28 70 53 74 6d 74 2c 20 69 29 29 3b 0a 20 20 20  (pStmt, i));.   
d880: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
d890: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
d8a0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20            }.  . 
d8b0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 63           if( pSc
d8c0: 72 69 70 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ript ){.        
d8d0: 20 20 20 20 69 66 28 20 70 41 72 72 61 79 3d 3d      if( pArray==
d8e0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
d8f0: 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72     Tcl_ObjSetVar
d900: 32 28 69 6e 74 65 72 70 2c 20 61 70 43 6f 6c 4e  2(interp, apColN
d910: 61 6d 65 5b 69 5d 2c 20 30 2c 20 70 56 61 6c 2c  ame[i], 0, pVal,
d920: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
d930: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
d940: 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74        Tcl_ObjSet
d950: 56 61 72 32 28 69 6e 74 65 72 70 2c 20 70 41 72  Var2(interp, pAr
d960: 72 61 79 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b 69  ray, apColName[i
d970: 5d 2c 20 70 56 61 6c 2c 20 30 29 3b 0a 20 20 20  ], pVal, 0);.   
d980: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
d990: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
d9a0: 68 6f 69 63 65 3d 3d 44 42 5f 4f 4e 45 43 4f 4c  hoice==DB_ONECOL
d9b0: 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  UMN ){.         
d9c0: 20 20 20 61 73 73 65 72 74 28 20 70 52 65 74 3d     assert( pRet=
d9d0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
d9e0: 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 29 7b    if( pRet==0 ){
d9f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
da00: 52 65 74 20 3d 20 70 56 61 6c 3b 0a 20 20 20 20  Ret = pVal;.    
da10: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e            Tcl_In
da20: 63 72 52 65 66 43 6f 75 6e 74 28 70 52 65 74 29  crRefCount(pRet)
da30: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
da40: 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
da50: 20 54 43 4c 5f 42 52 45 41 4b 3b 0a 20 20 20 20   TCL_BREAK;.    
da60: 20 20 20 20 20 20 20 20 69 20 3d 20 6e 43 6f 6c          i = nCol
da70: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
da80: 65 20 69 66 28 20 63 68 6f 69 63 65 3d 3d 44 42  e if( choice==DB
da90: 5f 45 58 49 53 54 53 20 29 7b 0a 20 20 20 20 20  _EXISTS ){.     
daa0: 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52         Tcl_DecrR
dab0: 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20  efCount(pRet);. 
dac0: 20 20 20 20 20 20 20 20 20 20 20 70 52 65 74 20             pRet 
dad0: 3d 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e  = Tcl_NewBoolean
dae0: 4f 62 6a 28 31 29 3b 0a 20 20 20 20 20 20 20 20  Obj(1);.        
daf0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
db00: 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20  ount(pRet);.    
db10: 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c          rc = TCL
db20: 5f 42 52 45 41 4b 3b 0a 20 20 20 20 20 20 20 20  _BREAK;.        
db30: 20 20 20 20 69 20 3d 20 6e 43 6f 6c 3b 0a 20 20      i = nCol;.  
db40: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
db50: 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4c             Tcl_L
db60: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
db70: 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ent(interp, pRet
db80: 2c 20 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 20  , pVal);.       
db90: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
dba0: 20 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53   .        if( pS
dbb0: 63 72 69 70 74 20 29 7b 0a 20 20 20 20 20 20 20  cript ){.       
dbc0: 20 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c     rc = Tcl_Eval
dbd0: 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 70 53  ObjEx(interp, pS
dbe0: 63 72 69 70 74 2c 20 30 29 3b 0a 20 20 20 20 20  cript, 0);.     
dbf0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c       if( rc==TCL
dc00: 5f 43 4f 4e 54 49 4e 55 45 20 29 7b 0a 20 20 20  _CONTINUE ){.   
dc10: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 43           rc = TC
dc20: 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  L_OK;.          
dc30: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
dc40: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
dc50: 3d 3d 54 43 4c 5f 42 52 45 41 4b 20 29 7b 0a 20  ==TCL_BREAK ){. 
dc60: 20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f         rc = TCL_
dc70: 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  OK;.      }..   
dc80: 20 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20 63     /* Free the c
dc90: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6f 62 6a 65 63  olumn name objec
dca0: 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ts */.      if( 
dcb0: 70 53 63 72 69 70 74 20 29 7b 0a 20 20 20 20 20  pScript ){.     
dcc0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65     /* If the que
dcd0: 72 79 20 72 65 74 75 72 6e 65 64 20 6e 6f 20 72  ry returned no r
dce0: 6f 77 73 2c 20 62 75 74 20 61 6e 20 61 72 72 61  ows, but an arra
dcf0: 79 20 76 61 72 69 61 62 6c 65 20 77 61 73 20 0a  y variable was .
dd00: 20 20 20 20 20 20 20 20 2a 2a 20 73 70 65 63 69          ** speci
dd10: 66 69 65 64 2c 20 63 61 6c 6c 20 63 6f 6d 70 75  fied, call compu
dd20: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 20  teColumnNames() 
dd30: 6e 6f 77 20 74 6f 20 70 6f 70 75 6c 61 74 65 20  now to populate 
dd40: 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
dd50: 61 72 72 61 79 6e 61 6d 65 28 2a 29 20 76 61 72  arrayname(*) var
dd60: 69 61 62 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a  iable..        *
dd70: 2f 0a 20 20 20 20 20 20 20 20 69 66 20 28 70 41  /.        if (pA
dd80: 72 72 61 79 20 26 26 20 6e 43 6f 6c 20 3c 20 30  rray && nCol < 0
dd90: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63  ) {.          Tc
dda0: 6c 5f 4f 62 6a 20 2a 2a 2a 61 70 20 3d 20 28 70  l_Obj ***ap = (p
ddb0: 53 63 72 69 70 74 3f 26 61 70 43 6f 6c 4e 61 6d  Script?&apColNam
ddc0: 65 3a 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e:0);.          
ddd0: 6e 43 6f 6c 20 3d 20 63 6f 6d 70 75 74 65 43 6f  nCol = computeCo
dde0: 6c 75 6d 6e 4e 61 6d 65 73 28 69 6e 74 65 72 70  lumnNames(interp
ddf0: 2c 20 70 53 74 6d 74 2c 20 61 70 2c 20 70 41 72  , pStmt, ap, pAr
de00: 72 61 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ray);.        }.
de10: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
de20: 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
de30: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63           Tcl_Dec
de40: 72 52 65 66 43 6f 75 6e 74 28 61 70 43 6f 6c 4e  rRefCount(apColN
de50: 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  ame[i]);.       
de60: 20 7d 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46   }.        Tcl_F
de70: 72 65 65 28 28 63 68 61 72 2a 29 61 70 43 6f 6c  ree((char*)apCol
de80: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  Name);.      }..
de90: 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 74 68        /* Free th
dea0: 65 20 62 6f 75 6e 64 20 73 74 72 69 6e 67 20 61  e bound string a
deb0: 6e 64 20 62 6c 6f 62 20 70 61 72 61 6d 65 74 65  nd blob paramete
dec0: 72 73 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28  rs */.      for(
ded0: 69 3d 30 3b 20 69 3c 6e 50 61 72 6d 3b 20 69 2b  i=0; i<nParm; i+
dee0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  +){.        Tcl_
def0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 61 70 50  DecrRefCount(apP
df00: 61 72 6d 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d  arm[i]);.      }
df10: 0a 20 20 20 20 20 20 69 66 28 20 61 70 50 61 72  .      if( apPar
df20: 6d 21 3d 61 50 61 72 6d 20 29 7b 0a 20 20 20 20  m!=aParm ){.    
df30: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68      Tcl_Free((ch
df40: 61 72 2a 29 61 70 50 61 72 6d 29 3b 0a 20 20 20  ar*)apParm);.   
df50: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 52     }..      /* R
df60: 65 73 65 74 20 74 68 65 20 73 74 61 74 65 6d 65  eset the stateme
df70: 6e 74 2e 20 20 49 66 20 74 68 65 20 72 65 73 75  nt.  If the resu
df80: 6c 74 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54  lt code is SQLIT
df90: 45 5f 53 43 48 45 4d 41 2c 20 74 68 65 6e 0a 20  E_SCHEMA, then. 
dfa0: 20 20 20 20 20 2a 2a 20 66 6c 75 73 68 20 74 68       ** flush th
dfb0: 65 20 73 74 61 74 65 6d 65 6e 74 20 63 61 63 68  e statement cach
dfc0: 65 20 61 6e 64 20 74 72 79 20 74 68 65 20 73 74  e and try the st
dfd0: 61 74 65 6d 65 6e 74 20 61 67 61 69 6e 2e 0a 20  atement again.. 
dfe0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
dff0: 32 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  2 = sqlite3_rese
e000: 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  t(pStmt);.      
e010: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72  if( SQLITE_OK!=r
e020: 63 32 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  c2 ){.        /*
e030: 20 49 66 20 61 20 72 75 6e 2d 74 69 6d 65 20 65   If a run-time e
e040: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 70  rror occurs, rep
e050: 6f 72 74 20 74 68 65 20 65 72 72 6f 72 20 61 6e  ort the error an
e060: 64 20 73 74 6f 70 20 72 65 61 64 69 6e 67 0a 20  d stop reading. 
e070: 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51         ** the SQ
e080: 4c 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  L.        */.   
e090: 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52       Tcl_SetObjR
e0a0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 64 62  esult(interp, db
e0b0: 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65  TextToObj(sqlite
e0c0: 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
e0d0: 29 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  )));.        sql
e0e0: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
e0f0: 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63  tmt);.        rc
e100: 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20   = TCL_ERROR;.  
e110: 20 20 20 20 20 20 69 66 28 20 70 50 72 65 53 74        if( pPreSt
e120: 6d 74 20 29 20 54 63 6c 5f 46 72 65 65 28 28 63  mt ) Tcl_Free((c
e130: 68 61 72 2a 29 70 50 72 65 53 74 6d 74 29 3b 0a  har*)pPreStmt);.
e140: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
e150: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
e160: 44 62 2d 3e 6d 61 78 53 74 6d 74 3c 3d 30 20 29  Db->maxStmt<=0 )
e170: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
e180: 74 68 65 20 63 61 63 68 65 20 69 73 20 74 75 72  the cache is tur
e190: 6e 65 64 20 6f 66 66 2c 20 64 65 61 6c 6c 6f 63  ned off, dealloc
e1a0: 61 74 65 64 20 74 68 65 20 73 74 61 74 65 6d 65  ated the stateme
e1b0: 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  nt */.        if
e1c0: 28 20 70 50 72 65 53 74 6d 74 20 29 20 54 63 6c  ( pPreStmt ) Tcl
e1d0: 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 50 72  _Free((char*)pPr
e1e0: 65 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  eStmt);.        
e1f0: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
e200: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 7d  (pStmt);.      }
e210: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
e220: 20 45 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b   Everything work
e230: 65 64 20 61 6e 64 20 74 68 65 20 63 61 63 68 65  ed and the cache
e240: 20 69 73 20 6f 70 65 72 61 74 69 6f 6e 61 6c 2e   is operational.
e250: 0a 20 20 20 20 20 20 20 20 2a 2a 20 43 72 65 61  .        ** Crea
e260: 74 65 20 61 20 6e 65 77 20 53 71 6c 50 72 65 70  te a new SqlPrep
e270: 61 72 65 64 53 74 6d 74 20 73 74 72 75 63 74 75  aredStmt structu
e280: 72 65 20 69 66 20 77 65 20 6e 65 65 64 20 6f 6e  re if we need on
e290: 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 49  e..        ** (I
e2a0: 66 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76  f we already hav
e2b0: 65 20 6f 6e 65 20 77 65 20 63 61 6e 20 6a 75 73  e one we can jus
e2c0: 74 20 72 65 75 73 65 20 69 74 2e 29 0a 20 20 20  t reuse it.).   
e2d0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
e2e0: 69 66 28 20 70 50 72 65 53 74 6d 74 3d 3d 30 20  if( pPreStmt==0 
e2f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 65 6e  ){.          len
e300: 20 3d 20 7a 4c 65 66 74 20 2d 20 7a 53 71 6c 3b   = zLeft - zSql;
e310: 0a 20 20 20 20 20 20 20 20 20 20 70 50 72 65 53  .          pPreS
e320: 74 6d 74 20 3d 20 28 53 71 6c 50 72 65 70 61 72  tmt = (SqlPrepar
e330: 65 64 53 74 6d 74 2a 29 54 63 6c 5f 41 6c 6c 6f  edStmt*)Tcl_Allo
e340: 63 28 20 73 69 7a 65 6f 66 28 2a 70 50 72 65 53  c( sizeof(*pPreS
e350: 74 6d 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20  tmt) );.        
e360: 20 20 69 66 28 20 70 50 72 65 53 74 6d 74 3d 3d    if( pPreStmt==
e370: 30 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  0 ) return TCL_E
e380: 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20  RROR;.          
e390: 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 20  pPreStmt->pStmt 
e3a0: 3d 20 70 53 74 6d 74 3b 0a 20 20 20 20 20 20 20  = pStmt;.       
e3b0: 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71     pPreStmt->nSq
e3c0: 6c 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 20  l = len;.       
e3d0: 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71     pPreStmt->zSq
e3e0: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 73 71 6c 28  l = sqlite3_sql(
e3f0: 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  pStmt);.        
e400: 20 20 61 73 73 65 72 74 28 20 73 74 72 6c 65 6e    assert( strlen
e410: 28 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 29  (pPreStmt->zSql)
e420: 3d 3d 6c 65 6e 20 29 3b 0a 20 20 20 20 20 20 20  ==len );.       
e430: 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d 6d 65     assert( 0==me
e440: 6d 63 6d 70 28 70 50 72 65 53 74 6d 74 2d 3e 7a  mcmp(pPreStmt->z
e450: 53 71 6c 2c 20 7a 53 71 6c 2c 20 6c 65 6e 29 20  Sql, zSql, len) 
e460: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
e470: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65        /* Add the
e480: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
e490: 65 6e 74 20 74 6f 20 74 68 65 20 62 65 67 69 6e  ent to the begin
e4a0: 6e 69 6e 67 20 6f 66 20 74 68 65 20 63 61 63 68  ning of the cach
e4b0: 65 20 6c 69 73 74 0a 20 20 20 20 20 20 20 20 2a  e list.        *
e4c0: 2f 0a 20 20 20 20 20 20 20 20 70 50 72 65 53 74  /.        pPreSt
e4d0: 6d 74 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d  mt->pNext = pDb-
e4e0: 3e 73 74 6d 74 4c 69 73 74 3b 0a 20 20 20 20 20  >stmtList;.     
e4f0: 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72     pPreStmt->pPr
e500: 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ev = 0;.        
e510: 69 66 28 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73  if( pDb->stmtLis
e520: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 70 44  t ){.         pD
e530: 62 2d 3e 73 74 6d 74 4c 69 73 74 2d 3e 70 50 72  b->stmtList->pPr
e540: 65 76 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20  ev = pPreStmt;. 
e550: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e560: 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d   pDb->stmtList =
e570: 20 70 50 72 65 53 74 6d 74 3b 0a 20 20 20 20 20   pPreStmt;.     
e580: 20 20 20 69 66 28 20 70 44 62 2d 3e 73 74 6d 74     if( pDb->stmt
e590: 4c 61 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Last==0 ){.     
e5a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44 62       assert( pDb
e5b0: 2d 3e 6e 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20  ->nStmt==0 );.  
e5c0: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d          pDb->stm
e5d0: 74 4c 61 73 74 20 3d 20 70 50 72 65 53 74 6d 74  tLast = pPreStmt
e5e0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
e5f0: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
e600: 74 28 20 70 44 62 2d 3e 6e 53 74 6d 74 3e 30 20  t( pDb->nStmt>0 
e610: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
e620: 20 20 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74 2b       pDb->nStmt+
e630: 2b 3b 0a 20 20 20 0a 20 20 20 20 20 20 20 20 2f  +;.   .        /
e640: 2a 20 49 66 20 77 65 20 68 61 76 65 20 74 6f 6f  * If we have too
e650: 20 6d 61 6e 79 20 73 74 61 74 65 6d 65 6e 74 20   many statement 
e660: 69 6e 20 63 61 63 68 65 2c 20 72 65 6d 6f 76 65  in cache, remove
e670: 20 74 68 65 20 73 75 72 70 6c 75 73 20 66 72 6f   the surplus fro
e680: 6d 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  m the.        **
e690: 20 65 6e 64 20 6f 66 20 74 68 65 20 63 61 63 68   end of the cach
e6a0: 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 20 20  e list..        
e6b0: 2a 2f 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  */.        while
e6c0: 28 20 70 44 62 2d 3e 6e 53 74 6d 74 3e 70 44 62  ( pDb->nStmt>pDb
e6d0: 2d 3e 6d 61 78 53 74 6d 74 20 29 7b 0a 20 20 20  ->maxStmt ){.   
e6e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
e6f0: 69 6e 61 6c 69 7a 65 28 70 44 62 2d 3e 73 74 6d  inalize(pDb->stm
e700: 74 4c 61 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20  tLast->pStmt);. 
e710: 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73 74           pDb->st
e720: 6d 74 4c 61 73 74 20 3d 20 70 44 62 2d 3e 73 74  mtLast = pDb->st
e730: 6d 74 4c 61 73 74 2d 3e 70 50 72 65 76 3b 0a 20  mtLast->pPrev;. 
e740: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65           Tcl_Fre
e750: 65 28 28 63 68 61 72 2a 29 70 44 62 2d 3e 73 74  e((char*)pDb->st
e760: 6d 74 4c 61 73 74 2d 3e 70 4e 65 78 74 29 3b 0a  mtLast->pNext);.
e770: 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73            pDb->s
e780: 74 6d 74 4c 61 73 74 2d 3e 70 4e 65 78 74 20 3d  tmtLast->pNext =
e790: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44   0;.          pD
e7a0: 62 2d 3e 6e 53 74 6d 74 2d 2d 3b 0a 20 20 20 20  b->nStmt--;.    
e7b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
e7c0: 20 20 20 20 20 2f 2a 20 50 72 6f 63 65 65 64 20       /* Proceed 
e7d0: 74 6f 20 74 68 65 20 6e 65 78 74 20 73 74 61 74  to the next stat
e7e0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 7a  ement */.      z
e7f0: 53 71 6c 20 3d 20 7a 4c 65 66 74 3b 0a 20 20 20  Sql = zLeft;.   
e800: 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52   }.    Tcl_DecrR
e810: 65 66 43 6f 75 6e 74 28 6f 62 6a 76 5b 32 5d 29  efCount(objv[2])
e820: 3b 0a 0a 20 20 20 20 69 66 28 20 70 52 65 74 20  ;..    if( pRet 
e830: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  ){.      if( rc=
e840: 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  =TCL_OK ){.     
e850: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
e860: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ult(interp, pRet
e870: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
e880: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
e890: 74 28 70 52 65 74 29 3b 0a 20 20 20 20 7d 65 6c  t(pRet);.    }el
e8a0: 73 65 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 4f  se if( rc==TCL_O
e8b0: 4b 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 52  K ){.      Tcl_R
e8c0: 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  esetResult(inter
e8d0: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  p);.    }.    br
e8e0: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
e8f0: 20 2a 2a 20 20 20 20 20 24 64 62 20 66 75 6e 63   **     $db func
e900: 74 69 6f 6e 20 4e 41 4d 45 20 53 43 52 49 50 54  tion NAME SCRIPT
e910: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65 61 74  .  **.  ** Creat
e920: 65 20 61 20 6e 65 77 20 53 51 4c 20 66 75 6e 63  e a new SQL func
e930: 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45  tion called NAME
e940: 2e 20 20 57 68 65 6e 65 76 65 72 20 74 68 61 74  .  Whenever that
e950: 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 20 20 2a   function is.  *
e960: 2a 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65  * called, invoke
e970: 20 53 43 52 49 50 54 20 74 6f 20 65 76 61 6c 75   SCRIPT to evalu
e980: 61 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  ate the function
e990: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
e9a0: 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
e9b0: 20 53 71 6c 46 75 6e 63 20 2a 70 46 75 6e 63 3b   SqlFunc *pFunc;
e9c0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53  .    Tcl_Obj *pS
e9d0: 63 72 69 70 74 3b 0a 20 20 20 20 63 68 61 72 20  cript;.    char 
e9e0: 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20  *zName;.    if( 
e9f0: 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20  objc!=4 ){.     
ea00: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
ea10: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
ea20: 76 2c 20 22 4e 41 4d 45 20 53 43 52 49 50 54 22  v, "NAME SCRIPT"
ea30: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
ea40: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
ea50: 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 54 63 6c  .    zName = Tcl
ea60: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
ea70: 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20  j(objv[2], 0);. 
ea80: 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62 6a     pScript = obj
ea90: 76 5b 33 5d 3b 0a 20 20 20 20 70 46 75 6e 63 20  v[3];.    pFunc 
eaa0: 3d 20 66 69 6e 64 53 71 6c 46 75 6e 63 28 70 44  = findSqlFunc(pD
eab0: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69  b, zName);.    i
eac0: 66 28 20 70 46 75 6e 63 3d 3d 30 20 29 20 72 65  f( pFunc==0 ) re
ead0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
eae0: 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 70      if( pFunc->p
eaf0: 53 63 72 69 70 74 20 29 7b 0a 20 20 20 20 20 20  Script ){.      
eb00: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
eb10: 28 70 46 75 6e 63 2d 3e 70 53 63 72 69 70 74 29  (pFunc->pScript)
eb20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 75 6e  ;.    }.    pFun
eb30: 63 2d 3e 70 53 63 72 69 70 74 20 3d 20 70 53 63  c->pScript = pSc
eb40: 72 69 70 74 3b 0a 20 20 20 20 54 63 6c 5f 49 6e  ript;.    Tcl_In
eb50: 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69  crRefCount(pScri
eb60: 70 74 29 3b 0a 20 20 20 20 70 46 75 6e 63 2d 3e  pt);.    pFunc->
eb70: 75 73 65 45 76 61 6c 4f 62 6a 76 20 3d 20 73 61  useEvalObjv = sa
eb80: 66 65 54 6f 55 73 65 45 76 61 6c 4f 62 6a 76 28  feToUseEvalObjv(
eb90: 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 29  interp, pScript)
eba0: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
ebb0: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
ebc0: 6f 6e 28 70 44 62 2d 3e 64 62 2c 20 7a 4e 61 6d  on(pDb->db, zNam
ebd0: 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  e, -1, SQLITE_UT
ebe0: 46 38 2c 0a 20 20 20 20 20 20 20 20 70 46 75 6e  F8,.        pFun
ebf0: 63 2c 20 74 63 6c 53 71 6c 46 75 6e 63 2c 20 30  c, tclSqlFunc, 0
ec00: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
ec10: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
ec20: 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52       rc = TCL_ER
ec30: 52 4f 52 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53  ROR;.      Tcl_S
ec40: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
ec50: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
ec60: 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29  _errmsg(pDb->db)
ec70: 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b  , TCL_VOLATILE);
ec80: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
ec90: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
eca0: 20 20 20 20 20 24 64 62 20 69 6e 63 72 62 6c 6f       $db incrblo
ecb0: 62 20 3f 2d 72 65 61 64 6f 6e 6c 79 3f 20 3f 44  b ?-readonly? ?D
ecc0: 42 3f 20 54 41 42 4c 45 20 43 4f 4c 55 4d 4e 20  B? TABLE COLUMN 
ecd0: 52 4f 57 49 44 0a 20 20 2a 2f 0a 20 20 63 61 73  ROWID.  */.  cas
ece0: 65 20 44 42 5f 49 4e 43 52 42 4c 4f 42 3a 20 7b  e DB_INCRBLOB: {
ecf0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
ed00: 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20  MIT_INCRBLOB.   
ed10: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
ed20: 74 28 69 6e 74 65 72 70 2c 20 22 69 6e 63 72 62  t(interp, "incrb
ed30: 6c 6f 62 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  lob not availabl
ed40: 65 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64 22  e in this build"
ed50: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
ed60: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73   TCL_ERROR;.#els
ed70: 65 0a 20 20 20 20 69 6e 74 20 69 73 52 65 61 64  e.    int isRead
ed80: 6f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 63 6f  only = 0;.    co
ed90: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20  nst char *zDb = 
eda0: 22 6d 61 69 6e 22 3b 0a 20 20 20 20 63 6f 6e 73  "main";.    cons
edb0: 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 3b 0a  t char *zTable;.
edc0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
edd0: 7a 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71 6c  zColumn;.    sql
ede0: 69 74 65 5f 69 6e 74 36 34 20 69 52 6f 77 3b 0a  ite_int64 iRow;.
edf0: 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  .    /* Check fo
ee00: 72 20 74 68 65 20 2d 72 65 61 64 6f 6e 6c 79 20  r the -readonly 
ee10: 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66  option */.    if
ee20: 28 20 6f 62 6a 63 3e 33 20 26 26 20 73 74 72 63  ( objc>3 && strc
ee30: 6d 70 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  mp(Tcl_GetString
ee40: 28 6f 62 6a 76 5b 32 5d 29 2c 20 22 2d 72 65 61  (objv[2]), "-rea
ee50: 64 6f 6e 6c 79 22 29 3d 3d 30 20 29 7b 0a 20 20  donly")==0 ){.  
ee60: 20 20 20 20 69 73 52 65 61 64 6f 6e 6c 79 20 3d      isReadonly =
ee70: 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69   1;.    }..    i
ee80: 66 28 20 6f 62 6a 63 21 3d 28 35 2b 69 73 52 65  f( objc!=(5+isRe
ee90: 61 64 6f 6e 6c 79 29 20 26 26 20 6f 62 6a 63 21  adonly) && objc!
eea0: 3d 28 36 2b 69 73 52 65 61 64 6f 6e 6c 79 29 20  =(6+isReadonly) 
eeb0: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
eec0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
eed0: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 2d 72 65  , 2, objv, "?-re
eee0: 61 64 6f 6e 6c 79 3f 20 3f 44 42 3f 20 54 41 42  adonly? ?DB? TAB
eef0: 4c 45 20 43 4f 4c 55 4d 4e 20 52 4f 57 49 44 22  LE COLUMN ROWID"
ef00: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
ef10: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
ef20: 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d  ..    if( objc==
ef30: 28 36 2b 69 73 52 65 61 64 6f 6e 6c 79 29 20 29  (6+isReadonly) )
ef40: 7b 0a 20 20 20 20 20 20 7a 44 62 20 3d 20 54 63  {.      zDb = Tc
ef50: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
ef60: 5b 32 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [2]);.    }.    
ef70: 7a 54 61 62 6c 65 20 3d 20 54 63 6c 5f 47 65 74  zTable = Tcl_Get
ef80: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 6f 62 6a 63  String(objv[objc
ef90: 2d 33 5d 29 3b 0a 20 20 20 20 7a 43 6f 6c 75 6d  -3]);.    zColum
efa0: 6e 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  n = Tcl_GetStrin
efb0: 67 28 6f 62 6a 76 5b 6f 62 6a 63 2d 32 5d 29 3b  g(objv[objc-2]);
efc0: 0a 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 47 65  .    rc = Tcl_Ge
efd0: 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28  tWideIntFromObj(
efe0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 6f 62 6a  interp, objv[obj
eff0: 63 2d 31 5d 2c 20 26 69 52 6f 77 29 3b 0a 0a 20  c-1], &iRow);.. 
f000: 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 4f     if( rc==TCL_O
f010: 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
f020: 63 72 65 61 74 65 49 6e 63 72 62 6c 6f 62 43 68  createIncrblobCh
f030: 61 6e 6e 65 6c 28 0a 20 20 20 20 20 20 20 20 20  annel(.         
f040: 20 69 6e 74 65 72 70 2c 20 70 44 62 2c 20 7a 44   interp, pDb, zD
f050: 62 2c 20 7a 54 61 62 6c 65 2c 20 7a 43 6f 6c 75  b, zTable, zColu
f060: 6d 6e 2c 20 69 52 6f 77 2c 20 69 73 52 65 61 64  mn, iRow, isRead
f070: 6f 6e 6c 79 0a 20 20 20 20 20 20 29 3b 0a 20 20  only.      );.  
f080: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 62    }.#endif.    b
f090: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
f0a0: 20 20 2a 2a 20 20 20 20 20 24 64 62 20 69 6e 74    **     $db int
f0b0: 65 72 72 75 70 74 0a 20 20 2a 2a 0a 20 20 2a 2a  errupt.  **.  **
f0c0: 20 49 6e 74 65 72 72 75 70 74 20 74 68 65 20 65   Interrupt the e
f0d0: 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 65 20  xecution of the 
f0e0: 69 6e 6e 65 72 2d 6d 6f 73 74 20 53 51 4c 20 69  inner-most SQL i
f0f0: 6e 74 65 72 70 72 65 74 65 72 2e 20 20 54 68 69  nterpreter.  Thi
f100: 73 0a 20 20 2a 2a 20 63 61 75 73 65 73 20 74 68  s.  ** causes th
f110: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
f120: 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  to return an err
f130: 6f 72 20 6f 66 20 53 51 4c 49 54 45 5f 49 4e 54  or of SQLITE_INT
f140: 45 52 52 55 50 54 2e 0a 20 20 2a 2f 0a 20 20 63  ERRUPT..  */.  c
f150: 61 73 65 20 44 42 5f 49 4e 54 45 52 52 55 50 54  ase DB_INTERRUPT
f160: 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  : {.    sqlite3_
f170: 69 6e 74 65 72 72 75 70 74 28 70 44 62 2d 3e 64  interrupt(pDb->d
f180: 62 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  b);.    break;. 
f190: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
f1a0: 20 20 24 64 62 20 6e 75 6c 6c 76 61 6c 75 65 20    $db nullvalue 
f1b0: 3f 53 54 52 49 4e 47 3f 0a 20 20 2a 2a 0a 20 20  ?STRING?.  **.  
f1c0: 2a 2a 20 43 68 61 6e 67 65 20 74 65 78 74 20 75  ** Change text u
f1d0: 73 65 64 20 77 68 65 6e 20 61 20 4e 55 4c 4c 20  sed when a NULL 
f1e0: 63 6f 6d 65 73 20 62 61 63 6b 20 66 72 6f 6d 20  comes back from 
f1f0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66  the database. If
f200: 20 3f 53 54 52 49 4e 47 3f 0a 20 20 2a 2a 20 69   ?STRING?.  ** i
f210: 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 74  s not present, t
f220: 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  hen the current 
f230: 73 74 72 69 6e 67 20 75 73 65 64 20 66 6f 72 20  string used for 
f240: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
f250: 2e 0a 20 20 2a 2a 20 49 66 20 53 54 52 49 4e 47  ..  ** If STRING
f260: 20 69 73 20 70 72 65 73 65 6e 74 2c 20 74 68 65   is present, the
f270: 6e 20 53 54 52 49 4e 47 20 69 73 20 72 65 74 75  n STRING is retu
f280: 72 6e 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2f 0a  rned..  **.  */.
f290: 20 20 63 61 73 65 20 44 42 5f 4e 55 4c 4c 56 41    case DB_NULLVA
f2a0: 4c 55 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f  LUE: {.    if( o
f2b0: 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d  bjc!=2 && objc!=
f2c0: 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
f2d0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
f2e0: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 55  rp, 2, objv, "NU
f2f0: 4c 4c 56 41 4c 55 45 22 29 3b 0a 20 20 20 20 20  LLVALUE");.     
f300: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
f310: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  R;.    }.    if(
f320: 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20   objc==3 ){.    
f330: 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20    int len;.     
f340: 20 63 68 61 72 20 2a 7a 4e 75 6c 6c 20 3d 20 54   char *zNull = T
f350: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
f360: 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65  Obj(objv[2], &le
f370: 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44  n);.      if( pD
f380: 62 2d 3e 7a 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  b->zNull ){.    
f390: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
f3a0: 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  ->zNull);.      
f3b0: 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 75 6c  }.      if( zNul
f3c0: 6c 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20  l && len>0 ){.  
f3d0: 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c        pDb->zNull
f3e0: 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65   = Tcl_Alloc( le
f3f0: 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20  n + 1 );.       
f400: 20 73 74 72 6e 63 70 79 28 70 44 62 2d 3e 7a 4e   strncpy(pDb->zN
f410: 75 6c 6c 2c 20 7a 4e 75 6c 6c 2c 20 6c 65 6e 29  ull, zNull, len)
f420: 3b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  ;.        pDb->z
f430: 4e 75 6c 6c 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27  Null[len] = '\0'
f440: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
f450: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75 6c         pDb->zNul
f460: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  l = 0;.      }. 
f470: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 53 65 74     }.    Tcl_Set
f480: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
f490: 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 70 44  , dbTextToObj(pD
f4a0: 62 2d 3e 7a 4e 75 6c 6c 29 29 3b 0a 20 20 20 20  b->zNull));.    
f4b0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
f4c0: 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 6c 61  .  **     $db la
f4d0: 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 20  st_insert_rowid 
f4e0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72  .  **.  ** Retur
f4f0: 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  n an integer whi
f500: 63 68 20 69 73 20 74 68 65 20 52 4f 57 49 44 20  ch is the ROWID 
f510: 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63  for the most rec
f520: 65 6e 74 20 69 6e 73 65 72 74 2e 0a 20 20 2a 2f  ent insert..  */
f530: 0a 20 20 63 61 73 65 20 44 42 5f 4c 41 53 54 5f  .  case DB_LAST_
f540: 49 4e 53 45 52 54 5f 52 4f 57 49 44 3a 20 7b 0a  INSERT_ROWID: {.
f550: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65      Tcl_Obj *pRe
f560: 73 75 6c 74 3b 0a 20 20 20 20 54 63 6c 5f 57 69  sult;.    Tcl_Wi
f570: 64 65 49 6e 74 20 72 6f 77 69 64 3b 0a 20 20 20  deInt rowid;.   
f580: 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
f590: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
f5a0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
f5b0: 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20  , objv, "");.   
f5c0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
f5d0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ROR;.    }.    r
f5e0: 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 6c  owid = sqlite3_l
f5f0: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
f600: 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20 70  (pDb->db);.    p
f610: 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74  Result = Tcl_Get
f620: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
f630: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 57 69  );.    Tcl_SetWi
f640: 64 65 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74  deIntObj(pResult
f650: 2c 20 72 6f 77 69 64 29 3b 0a 20 20 20 20 62 72  , rowid);.    br
f660: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
f670: 20 2a 2a 20 54 68 65 20 44 42 5f 4f 4e 45 43 4f   ** The DB_ONECO
f680: 4c 55 4d 4e 20 6d 65 74 68 6f 64 20 69 73 20 69  LUMN method is i
f690: 6d 70 6c 65 6d 65 6e 74 65 64 20 74 6f 67 65 74  mplemented toget
f6a0: 68 65 72 20 77 69 74 68 20 44 42 5f 45 56 41 4c  her with DB_EVAL
f6b0: 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 20 20 20  ..  */..  /*    
f6c0: 24 64 62 20 70 72 6f 67 72 65 73 73 20 3f 4e 20  $db progress ?N 
f6d0: 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 20 0a  CALLBACK?.  ** .
f6e0: 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20    ** Invoke the 
f6f0: 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 65  given callback e
f700: 76 65 72 79 20 4e 20 76 69 72 74 75 61 6c 20 6d  very N virtual m
f710: 61 63 68 69 6e 65 20 6f 70 63 6f 64 65 73 20 77  achine opcodes w
f720: 68 69 6c 65 20 65 78 65 63 75 74 69 6e 67 0a 20  hile executing. 
f730: 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20 2a   ** queries..  *
f740: 2f 0a 20 20 63 61 73 65 20 44 42 5f 50 52 4f 47  /.  case DB_PROG
f750: 52 45 53 53 3a 20 7b 0a 20 20 20 20 69 66 28 20  RESS: {.    if( 
f760: 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20  objc==2 ){.     
f770: 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72   if( pDb->zProgr
f780: 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20 54  ess ){.        T
f790: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
f7a0: 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 50 72  interp, pDb->zPr
f7b0: 6f 67 72 65 73 73 2c 20 30 29 3b 0a 20 20 20 20  ogress, 0);.    
f7c0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
f7d0: 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20  ( objc==4 ){.   
f7e0: 20 20 20 63 68 61 72 20 2a 7a 50 72 6f 67 72 65     char *zProgre
f7f0: 73 73 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65  ss;.      int le
f800: 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 4e 3b 0a  n;.      int N;.
f810: 20 20 20 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b        if( TCL_OK
f820: 21 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  !=Tcl_GetIntFrom
f830: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
f840: 5b 32 5d 2c 20 26 4e 29 20 29 7b 0a 20 20 20 20  [2], &N) ){.    
f850: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
f860: 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 3b 0a 20  RROR;.      };. 
f870: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50       if( pDb->zP
f880: 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20 20  rogress ){.     
f890: 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d     Tcl_Free(pDb-
f8a0: 3e 7a 50 72 6f 67 72 65 73 73 29 3b 0a 20 20 20  >zProgress);.   
f8b0: 20 20 20 7d 0a 20 20 20 20 20 20 7a 50 72 6f 67     }.      zProg
f8c0: 72 65 73 73 20 3d 20 54 63 6c 5f 47 65 74 53 74  ress = Tcl_GetSt
f8d0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
f8e0: 5b 33 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20  [3], &len);.    
f8f0: 20 20 69 66 28 20 7a 50 72 6f 67 72 65 73 73 20    if( zProgress 
f900: 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20  && len>0 ){.    
f910: 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65      pDb->zProgre
f920: 73 73 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20  ss = Tcl_Alloc( 
f930: 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20  len + 1 );.     
f940: 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a     memcpy(pDb->z
f950: 50 72 6f 67 72 65 73 73 2c 20 7a 50 72 6f 67 72  Progress, zProgr
f960: 65 73 73 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20  ess, len+1);.   
f970: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f980: 20 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73    pDb->zProgress
f990: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69   = 0;.      }.#i
f9a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f9b0: 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42  T_PROGRESS_CALLB
f9c0: 41 43 4b 0a 20 20 20 20 20 20 69 66 28 20 70 44  ACK.      if( pD
f9d0: 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a  b->zProgress ){.
f9e0: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74          pDb->int
f9f0: 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20  erp = interp;.  
fa00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72        sqlite3_pr
fa10: 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 70  ogress_handler(p
fa20: 44 62 2d 3e 64 62 2c 20 4e 2c 20 44 62 50 72 6f  Db->db, N, DbPro
fa30: 67 72 65 73 73 48 61 6e 64 6c 65 72 2c 20 70 44  gressHandler, pD
fa40: 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  b);.      }else{
fa50: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
fa60: 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65  _progress_handle
fa70: 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 2c  r(pDb->db, 0, 0,
fa80: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
fa90: 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
faa0: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
fab0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
fac0: 20 6f 62 6a 76 2c 20 22 4e 20 43 41 4c 4c 42 41   objv, "N CALLBA
fad0: 43 4b 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  CK");.      retu
fae0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
faf0: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
fb00: 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20   }..  /*    $db 
fb10: 70 72 6f 66 69 6c 65 20 3f 43 41 4c 4c 42 41 43  profile ?CALLBAC
fb20: 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b  K?.  **.  ** Mak
fb30: 65 20 61 72 72 61 6e 67 65 6d 65 6e 74 73 20 74  e arrangements t
fb40: 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 43 41 4c  o invoke the CAL
fb50: 4c 42 41 43 4b 20 72 6f 75 74 69 6e 65 20 61 66  LBACK routine af
fb60: 74 65 72 20 65 61 63 68 20 53 51 4c 20 73 74 61  ter each SQL sta
fb70: 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 61 74  tement.  ** that
fb80: 20 68 61 73 20 72 75 6e 2e 20 20 54 68 65 20 74   has run.  The t
fb90: 65 78 74 20 6f 66 20 74 68 65 20 53 51 4c 20 61  ext of the SQL a
fba0: 6e 64 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  nd the amount of
fbb0: 20 65 6c 61 70 73 65 20 74 69 6d 65 20 61 72 65   elapse time are
fbc0: 0a 20 20 2a 2a 20 61 70 70 65 6e 64 65 64 20 74  .  ** appended t
fbd0: 6f 20 43 41 4c 4c 42 41 43 4b 20 62 65 66 6f 72  o CALLBACK befor
fbe0: 65 20 74 68 65 20 73 63 72 69 70 74 20 69 73 20  e the script is 
fbf0: 72 75 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  run..  */.  case
fc00: 20 44 42 5f 50 52 4f 46 49 4c 45 3a 20 7b 0a 20   DB_PROFILE: {. 
fc10: 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b     if( objc>3 ){
fc20: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
fc30: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
fc40: 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42  2, objv, "?CALLB
fc50: 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65  ACK?");.      re
fc60: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
fc70: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62      }else if( ob
fc80: 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69  jc==2 ){.      i
fc90: 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65  f( pDb->zProfile
fca0: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
fcb0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
fcc0: 65 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f 66 69  erp, pDb->zProfi
fcd0: 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  le, 0);.      }.
fce0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
fcf0: 20 63 68 61 72 20 2a 7a 50 72 6f 66 69 6c 65 3b   char *zProfile;
fd00: 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  .      int len;.
fd10: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
fd20: 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 20  Profile ){.     
fd30: 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d     Tcl_Free(pDb-
fd40: 3e 7a 50 72 6f 66 69 6c 65 29 3b 0a 20 20 20 20  >zProfile);.    
fd50: 20 20 7d 0a 20 20 20 20 20 20 7a 50 72 6f 66 69    }.      zProfi
fd60: 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  le = Tcl_GetStri
fd70: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
fd80: 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20  ], &len);.      
fd90: 69 66 28 20 7a 50 72 6f 66 69 6c 65 20 26 26 20  if( zProfile && 
fda0: 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  len>0 ){.       
fdb0: 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 3d   pDb->zProfile =
fdc0: 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20   Tcl_Alloc( len 
fdd0: 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d  + 1 );.        m
fde0: 65 6d 63 70 79 28 70 44 62 2d 3e 7a 50 72 6f 66  emcpy(pDb->zProf
fdf0: 69 6c 65 2c 20 7a 50 72 6f 66 69 6c 65 2c 20 6c  ile, zProfile, l
fe00: 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  en+1);.      }el
fe10: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  se{.        pDb-
fe20: 3e 7a 50 72 6f 66 69 6c 65 20 3d 20 30 3b 0a 20  >zProfile = 0;. 
fe30: 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53       }.#ifndef S
fe40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
fe50: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
fe60: 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20  zProfile ){.    
fe70: 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20      pDb->interp 
fe80: 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20  = interp;.      
fe90: 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c    sqlite3_profil
fea0: 65 28 70 44 62 2d 3e 64 62 2c 20 44 62 50 72 6f  e(pDb->db, DbPro
feb0: 66 69 6c 65 48 61 6e 64 6c 65 72 2c 20 70 44 62  fileHandler, pDb
fec0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
fed0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
fee0: 70 72 6f 66 69 6c 65 28 70 44 62 2d 3e 64 62 2c  profile(pDb->db,
fef0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
ff00: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
ff10: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
ff20: 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 72  *.  **     $db r
ff30: 65 6b 65 79 20 4b 45 59 0a 20 20 2a 2a 0a 20 20  ekey KEY.  **.  
ff40: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 65 6e  ** Change the en
ff50: 63 72 79 70 74 69 6f 6e 20 6b 65 79 20 6f 6e 20  cryption key on 
ff60: 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70  the currently op
ff70: 65 6e 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  en database..  *
ff80: 2f 0a 20 20 63 61 73 65 20 44 42 5f 52 45 4b 45  /.  case DB_REKE
ff90: 59 3a 20 7b 0a 20 20 20 20 69 6e 74 20 6e 4b 65  Y: {.    int nKe
ffa0: 79 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65  y;.    void *pKe
ffb0: 79 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  y;.    if( objc!
ffc0: 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =3 ){.      Tcl_
ffd0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
ffe0: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4b  erp, 2, objv, "K
fff0: 45 59 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  EY");.      retu
10000 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
10010 20 20 7d 0a 20 20 20 20 70 4b 65 79 20 3d 20 54    }.    pKey = T
10020 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46  cl_GetByteArrayF
10030 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
10040 26 6e 4b 65 79 29 3b 0a 23 69 66 64 65 66 20 53  &nKey);.#ifdef S
10050 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
10060 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10070 5f 72 65 6b 65 79 28 70 44 62 2d 3e 64 62 2c 20  _rekey(pDb->db, 
10080 70 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 20  pKey, nKey);.   
10090 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
100a0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
100b0 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65  t(interp, sqlite
100c0 33 45 72 72 53 74 72 28 72 63 29 2c 20 30 29 3b  3ErrStr(rc), 0);
100d0 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f  .      rc = TCL_
100e0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e  ERROR;.    }.#en
100f0 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  dif.    break;. 
10100 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
10110 20 20 24 64 62 20 74 69 6d 65 6f 75 74 20 4d 49    $db timeout MI
10120 4c 4c 45 53 45 43 4f 4e 44 53 0a 20 20 2a 2a 0a  LLESECONDS.  **.
10130 20 20 2a 2a 20 44 65 6c 61 79 20 66 6f 72 20 74    ** Delay for t
10140 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c  he number of mil
10150 6c 69 73 65 63 6f 6e 64 73 20 73 70 65 63 69 66  liseconds specif
10160 69 65 64 20 77 68 65 6e 20 61 20 66 69 6c 65 20  ied when a file 
10170 69 73 20 6c 6f 63 6b 65 64 2e 0a 20 20 2a 2f 0a  is locked..  */.
10180 20 20 63 61 73 65 20 44 42 5f 54 49 4d 45 4f 55    case DB_TIMEOU
10190 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20 6d 73 3b  T: {.    int ms;
101a0 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  .    if( objc!=3
101b0 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
101c0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
101d0 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4d 49 4c  p, 2, objv, "MIL
101e0 4c 49 53 45 43 4f 4e 44 53 22 29 3b 0a 20 20 20  LISECONDS");.   
101f0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
10200 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
10210 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
10220 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
10230 76 5b 32 5d 2c 20 26 6d 73 29 20 29 20 72 65 74  v[2], &ms) ) ret
10240 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
10250 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f     sqlite3_busy_
10260 74 69 6d 65 6f 75 74 28 70 44 62 2d 3e 64 62 2c  timeout(pDb->db,
10270 20 6d 73 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b   ms);.    break;
10280 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a  .  }.  .  /*.  *
10290 2a 20 20 20 20 20 24 64 62 20 74 6f 74 61 6c 5f  *     $db total_
102a0 63 68 61 6e 67 65 73 0a 20 20 2a 2a 0a 20 20 2a  changes.  **.  *
102b0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
102c0 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
102d0 20 77 65 72 65 20 6d 6f 64 69 66 69 65 64 2c 20   were modified, 
102e0 69 6e 73 65 72 74 65 64 2c 20 6f 72 20 64 65 6c  inserted, or del
102f0 65 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65  eted .  ** since
10300 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
10310 6e 64 6c 65 20 77 61 73 20 63 72 65 61 74 65 64  ndle was created
10320 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
10330 5f 54 4f 54 41 4c 5f 43 48 41 4e 47 45 53 3a 20  _TOTAL_CHANGES: 
10340 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  {.    Tcl_Obj *p
10350 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 66 28 20  Result;.    if( 
10360 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 20  objc!=2 ){.     
10370 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
10380 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
10390 76 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 72 65  v, "");.      re
103a0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
103b0 20 20 20 20 7d 0a 20 20 20 20 70 52 65 73 75 6c      }.    pResul
103c0 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65  t = Tcl_GetObjRe
103d0 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
103e0 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28    Tcl_SetIntObj(
103f0 70 52 65 73 75 6c 74 2c 20 73 71 6c 69 74 65 33  pResult, sqlite3
10400 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 70  _total_changes(p
10410 44 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20 62 72  Db->db));.    br
10420 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
10430 20 20 24 64 62 20 74 72 61 63 65 20 3f 43 41 4c    $db trace ?CAL
10440 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a  LBACK?.  **.  **
10450 20 4d 61 6b 65 20 61 72 72 61 6e 67 65 6d 65 6e   Make arrangemen
10460 74 73 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65  ts to invoke the
10470 20 43 41 4c 4c 42 41 43 4b 20 72 6f 75 74 69 6e   CALLBACK routin
10480 65 20 66 6f 72 20 65 61 63 68 20 53 51 4c 20 73  e for each SQL s
10490 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68  tatement.  ** th
104a0 61 74 20 69 73 20 65 78 65 63 75 74 65 64 2e 20  at is executed. 
104b0 20 54 68 65 20 74 65 78 74 20 6f 66 20 74 68 65   The text of the
104c0 20 53 51 4c 20 69 73 20 61 70 70 65 6e 64 65 64   SQL is appended
104d0 20 74 6f 20 43 41 4c 4c 42 41 43 4b 20 62 65 66   to CALLBACK bef
104e0 6f 72 65 0a 20 20 2a 2a 20 69 74 20 69 73 20 65  ore.  ** it is e
104f0 78 65 63 75 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  xecuted..  */.  
10500 63 61 73 65 20 44 42 5f 54 52 41 43 45 3a 20 7b  case DB_TRACE: {
10510 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20  .    if( objc>3 
10520 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
10530 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
10540 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c  , 2, objv, "?CAL
10550 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20  LBACK?");.      
10560 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
10570 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
10580 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20  objc==2 ){.     
10590 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65   if( pDb->zTrace
105a0 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
105b0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
105c0 65 72 70 2c 20 70 44 62 2d 3e 7a 54 72 61 63 65  erp, pDb->zTrace
105d0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
105e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
105f0 68 61 72 20 2a 7a 54 72 61 63 65 3b 0a 20 20 20  har *zTrace;.   
10600 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
10610 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63    if( pDb->zTrac
10620 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  e ){.        Tcl
10630 5f 46 72 65 65 28 70 44 62 2d 3e 7a 54 72 61 63  _Free(pDb->zTrac
10640 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
10650 20 20 7a 54 72 61 63 65 20 3d 20 54 63 6c 5f 47    zTrace = Tcl_G
10660 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
10670 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a  objv[2], &len);.
10680 20 20 20 20 20 20 69 66 28 20 7a 54 72 61 63 65        if( zTrace
10690 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20   && len>0 ){.   
106a0 20 20 20 20 20 70 44 62 2d 3e 7a 54 72 61 63 65       pDb->zTrace
106b0 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65   = Tcl_Alloc( le
106c0 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20  n + 1 );.       
106d0 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 54 72   memcpy(pDb->zTr
106e0 61 63 65 2c 20 7a 54 72 61 63 65 2c 20 6c 65 6e  ace, zTrace, len
106f0 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  +1);.      }else
10700 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
10710 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 20  Trace = 0;.     
10720 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
10730 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 20  E_OMIT_TRACE.   
10740 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61     if( pDb->zTra
10750 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  ce ){.        pD
10760 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65  b->interp = inte
10770 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  rp;.        sqli
10780 74 65 33 5f 74 72 61 63 65 28 70 44 62 2d 3e 64  te3_trace(pDb->d
10790 62 2c 20 44 62 54 72 61 63 65 48 61 6e 64 6c 65  b, DbTraceHandle
107a0 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d  r, pDb);.      }
107b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
107c0 6c 69 74 65 33 5f 74 72 61 63 65 28 70 44 62 2d  lite3_trace(pDb-
107d0 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  >db, 0, 0);.    
107e0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
107f0 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
10800 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 74 72 61  .  /*    $db tra
10810 6e 73 61 63 74 69 6f 6e 20 5b 2d 64 65 66 65 72  nsaction [-defer
10820 72 65 64 7c 2d 69 6d 6d 65 64 69 61 74 65 7c 2d  red|-immediate|-
10830 65 78 63 6c 75 73 69 76 65 5d 20 53 43 52 49 50  exclusive] SCRIP
10840 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 74 61 72  T.  **.  ** Star
10850 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  t a new transact
10860 69 6f 6e 20 28 69 66 20 77 65 20 61 72 65 20 6e  ion (if we are n
10870 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  ot already in th
10880 65 20 6d 69 64 73 74 20 6f 66 20 61 0a 20 20 2a  e midst of a.  *
10890 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 20 61  * transaction) a
108a0 6e 64 20 65 78 65 63 75 74 65 20 74 68 65 20 54  nd execute the T
108b0 43 4c 20 73 63 72 69 70 74 20 53 43 52 49 50 54  CL script SCRIPT
108c0 2e 20 20 41 66 74 65 72 20 53 43 52 49 50 54 0a  .  After SCRIPT.
108d0 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 73 2c 20    ** completes, 
108e0 65 69 74 68 65 72 20 63 6f 6d 6d 69 74 20 74 68  either commit th
108f0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72  e transaction or
10900 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 69 66   roll it back if
10910 20 53 43 52 49 50 54 0a 20 20 2a 2a 20 74 68 72   SCRIPT.  ** thr
10920 6f 77 73 20 61 6e 20 65 78 63 65 70 74 69 6f 6e  ows an exception
10930 2e 20 20 4f 72 20 69 66 20 6e 6f 20 6e 65 77 20  .  Or if no new 
10940 74 72 61 6e 73 61 74 69 6f 6e 20 77 61 73 20 73  transation was s
10950 74 61 72 74 65 64 2c 20 64 6f 20 6e 6f 74 68 69  tarted, do nothi
10960 6e 67 2e 0a 20 20 2a 2a 20 70 61 73 73 20 74 68  ng..  ** pass th
10970 65 20 65 78 63 65 70 74 69 6f 6e 20 6f 6e 20 75  e exception on u
10980 70 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a  p the stack..  *
10990 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63 6f 6d 6d  *.  ** This comm
109a0 61 6e 64 20 77 61 73 20 69 6e 73 70 69 72 65 64  and was inspired
109b0 20 62 79 20 44 61 76 65 20 54 68 6f 6d 61 73 27   by Dave Thomas'
109c0 73 20 74 61 6c 6b 20 6f 6e 20 52 75 62 79 20 61  s talk on Ruby a
109d0 74 20 74 68 65 0a 20 20 2a 2a 20 32 30 30 35 20  t the.  ** 2005 
109e0 4f 27 52 65 69 6c 6c 79 20 4f 70 65 6e 20 53 6f  O'Reilly Open So
109f0 75 72 63 65 20 43 6f 6e 76 65 6e 74 69 6f 6e 20  urce Convention 
10a00 28 4f 53 43 4f 4e 29 2e 0a 20 20 2a 2f 0a 20 20  (OSCON)..  */.  
10a10 63 61 73 65 20 44 42 5f 54 52 41 4e 53 41 43 54  case DB_TRANSACT
10a20 49 4f 4e 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69  ION: {.    int i
10a30 6e 54 72 61 6e 73 3b 0a 20 20 20 20 54 63 6c 5f  nTrans;.    Tcl_
10a40 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 0a 20 20  Obj *pScript;.  
10a50 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42    const char *zB
10a60 65 67 69 6e 20 3d 20 22 42 45 47 49 4e 22 3b 0a  egin = "BEGIN";.
10a70 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20      if( objc!=3 
10a80 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  && objc!=4 ){.  
10a90 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
10aa0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
10ab0 6f 62 6a 76 2c 20 22 5b 54 59 50 45 5d 20 53 43  objv, "[TYPE] SC
10ac0 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65  RIPT");.      re
10ad0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
10ae0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62      }.    if( ob
10af0 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 70  jc==3 ){.      p
10b00 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 32 5d  Script = objv[2]
10b10 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ;.    } else {. 
10b20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
10b30 74 20 63 68 61 72 20 2a 54 54 59 50 45 5f 73 74  t char *TTYPE_st
10b40 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  rs[] = {.       
10b50 20 22 64 65 66 65 72 72 65 64 22 2c 20 20 20 22   "deferred",   "
10b60 65 78 63 6c 75 73 69 76 65 22 2c 20 20 22 69 6d  exclusive",  "im
10b70 6d 65 64 69 61 74 65 22 2c 20 30 0a 20 20 20 20  mediate", 0.    
10b80 20 20 7d 3b 0a 20 20 20 20 20 20 65 6e 75 6d 20    };.      enum 
10b90 54 54 59 50 45 5f 65 6e 75 6d 20 7b 0a 20 20 20  TTYPE_enum {.   
10ba0 20 20 20 20 20 54 54 59 50 45 5f 44 45 46 45 52       TTYPE_DEFER
10bb0 52 45 44 2c 20 54 54 59 50 45 5f 45 58 43 4c 55  RED, TTYPE_EXCLU
10bc0 53 49 56 45 2c 20 54 54 59 50 45 5f 49 4d 4d 45  SIVE, TTYPE_IMME
10bd0 44 49 41 54 45 0a 20 20 20 20 20 20 7d 3b 0a 20  DIATE.      };. 
10be0 20 20 20 20 20 69 6e 74 20 74 74 79 70 65 3b 0a       int ttype;.
10bf0 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65        if( Tcl_Ge
10c00 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e  tIndexFromObj(in
10c10 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 54  terp, objv[2], T
10c20 54 59 50 45 5f 73 74 72 73 2c 20 22 74 72 61 6e  TYPE_strs, "tran
10c30 73 61 63 74 69 6f 6e 20 74 79 70 65 22 2c 0a 20  saction type",. 
10c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c50 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
10c60 26 74 74 79 70 65 29 20 29 7b 0a 20 20 20 20 20  &ttype) ){.     
10c70 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
10c80 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
10c90 20 20 20 73 77 69 74 63 68 28 20 28 65 6e 75 6d     switch( (enum
10ca0 20 54 54 59 50 45 5f 65 6e 75 6d 29 74 74 79 70   TTYPE_enum)ttyp
10cb0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73  e ){.        cas
10cc0 65 20 54 54 59 50 45 5f 44 45 46 45 52 52 45 44  e TTYPE_DEFERRED
10cd0 3a 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f  :    /* no-op */
10ce0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10cf0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
10d00 20 63 61 73 65 20 54 54 59 50 45 5f 45 58 43 4c   case TTYPE_EXCL
10d10 55 53 49 56 45 3a 20 20 20 7a 42 65 67 69 6e 20  USIVE:   zBegin 
10d20 3d 20 22 42 45 47 49 4e 20 45 58 43 4c 55 53 49  = "BEGIN EXCLUSI
10d30 56 45 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  VE";  break;.   
10d40 20 20 20 20 20 63 61 73 65 20 54 54 59 50 45 5f       case TTYPE_
10d50 49 4d 4d 45 44 49 41 54 45 3a 20 20 20 7a 42 65  IMMEDIATE:   zBe
10d60 67 69 6e 20 3d 20 22 42 45 47 49 4e 20 49 4d 4d  gin = "BEGIN IMM
10d70 45 44 49 41 54 45 22 3b 20 20 62 72 65 61 6b 3b  EDIATE";  break;
10d80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
10d90 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 33 5d  Script = objv[3]
10da0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e 54 72  ;.    }.    inTr
10db0 61 6e 73 20 3d 20 21 73 71 6c 69 74 65 33 5f 67  ans = !sqlite3_g
10dc0 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 70 44  et_autocommit(pD
10dd0 62 2d 3e 64 62 29 3b 0a 20 20 20 20 69 66 28 20  b->db);.    if( 
10de0 21 69 6e 54 72 61 6e 73 20 29 7b 0a 20 20 20 20  !inTrans ){.    
10df0 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f    (void)sqlite3_
10e00 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a 42  exec(pDb->db, zB
10e10 65 67 69 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  egin, 0, 0, 0);.
10e20 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 54      }.    rc = T
10e30 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74  cl_EvalObjEx(int
10e40 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20 30 29  erp, pScript, 0)
10e50 3b 0a 20 20 20 20 69 66 28 20 21 69 6e 54 72 61  ;.    if( !inTra
10e60 6e 73 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  ns ){.      cons
10e70 74 20 63 68 61 72 20 2a 7a 45 6e 64 3b 0a 20 20  t char *zEnd;.  
10e80 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f      if( rc==TCL_
10e90 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 20  ERROR ){.       
10ea0 20 7a 45 6e 64 20 3d 20 22 52 4f 4c 4c 42 41 43   zEnd = "ROLLBAC
10eb0 4b 22 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  K";.      } else
10ec0 20 7b 0a 20 20 20 20 20 20 20 20 7a 45 6e 64 20   {.        zEnd 
10ed0 3d 20 22 43 4f 4d 4d 49 54 22 3b 0a 20 20 20 20  = "COMMIT";.    
10ee0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 71    }.      if( sq
10ef0 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e  lite3_exec(pDb->
10f00 64 62 2c 20 7a 45 6e 64 2c 20 30 2c 20 30 2c 20  db, zEnd, 0, 0, 
10f10 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  0) ){.        sq
10f20 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e  lite3_exec(pDb->
10f30 64 62 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20  db, "ROLLBACK", 
10f40 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
10f50 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  }.    }.    brea
10f60 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
10f70 2a 20 20 20 20 24 64 62 20 75 70 64 61 74 65 5f  *    $db update_
10f80 68 6f 6f 6b 20 3f 73 63 72 69 70 74 3f 0a 20 20  hook ?script?.  
10f90 2a 2a 20 20 20 20 24 64 62 20 72 6f 6c 6c 62 61  **    $db rollba
10fa0 63 6b 5f 68 6f 6f 6b 20 3f 73 63 72 69 70 74 3f  ck_hook ?script?
10fb0 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
10fc0 55 50 44 41 54 45 5f 48 4f 4f 4b 3a 20 0a 20 20  UPDATE_HOOK: .  
10fd0 63 61 73 65 20 44 42 5f 52 4f 4c 4c 42 41 43 4b  case DB_ROLLBACK
10fe0 5f 48 4f 4f 4b 3a 20 7b 0a 0a 20 20 20 20 2f 2a  _HOOK: {..    /*
10ff0 20 73 65 74 20 70 70 48 6f 6f 6b 20 74 6f 20 70   set ppHook to p
11000 6f 69 6e 74 20 61 74 20 70 55 70 64 61 74 65 48  oint at pUpdateH
11010 6f 6f 6b 20 6f 72 20 70 52 6f 6c 6c 62 61 63 6b  ook or pRollback
11020 48 6f 6f 6b 2c 20 64 65 70 65 6e 64 69 6e 67 20  Hook, depending 
11030 6f 6e 20 0a 20 20 20 20 2a 2a 20 77 68 65 74 68  on .    ** wheth
11040 65 72 20 5b 24 64 62 20 75 70 64 61 74 65 5f 68  er [$db update_h
11050 6f 6f 6b 5d 20 6f 72 20 5b 24 64 62 20 72 6f 6c  ook] or [$db rol
11060 6c 62 61 63 6b 5f 68 6f 6f 6b 5d 20 77 61 73 20  lback_hook] was 
11070 69 6e 76 6f 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a  invoked..    */.
11080 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 70 70      Tcl_Obj **pp
11090 48 6f 6f 6b 3b 20 0a 20 20 20 20 69 66 28 20 63  Hook; .    if( c
110a0 68 6f 69 63 65 3d 3d 44 42 5f 55 50 44 41 54 45  hoice==DB_UPDATE
110b0 5f 48 4f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  _HOOK ){.      p
110c0 70 48 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e 70 55  pHook = &pDb->pU
110d0 70 64 61 74 65 48 6f 6f 6b 3b 0a 20 20 20 20 7d  pdateHook;.    }
110e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 48 6f  else{.      ppHo
110f0 6f 6b 20 3d 20 26 70 44 62 2d 3e 70 52 6f 6c 6c  ok = &pDb->pRoll
11100 62 61 63 6b 48 6f 6f 6b 3b 0a 20 20 20 20 7d 0a  backHook;.    }.
11110 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  .    if( objc!=2
11120 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20   && objc!=3 ){. 
11130 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
11140 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
11150 2c 20 6f 62 6a 76 2c 20 22 3f 53 43 52 49 50 54  , objv, "?SCRIPT
11160 3f 22 29 3b 0a 20 20 20 20 20 20 20 72 65 74 75  ?");.       retu
11170 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
11180 20 20 7d 0a 20 20 20 20 69 66 28 20 2a 70 70 48    }.    if( *ppH
11190 6f 6f 6b 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  ook ){.      Tcl
111a0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
111b0 74 65 72 70 2c 20 2a 70 70 48 6f 6f 6b 29 3b 0a  terp, *ppHook);.
111c0 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d        if( objc==
111d0 33 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  3 ){.        Tcl
111e0 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 2a 70  _DecrRefCount(*p
111f0 70 48 6f 6f 6b 29 3b 0a 20 20 20 20 20 20 20 20  pHook);.        
11200 2a 70 70 48 6f 6f 6b 20 3d 20 30 3b 0a 20 20 20  *ppHook = 0;.   
11210 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
11220 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20  f( objc==3 ){.  
11230 20 20 20 20 61 73 73 65 72 74 28 20 21 28 2a 70      assert( !(*p
11240 70 48 6f 6f 6b 29 20 29 3b 0a 20 20 20 20 20 20  pHook) );.      
11250 69 66 28 20 54 63 6c 5f 47 65 74 43 68 61 72 4c  if( Tcl_GetCharL
11260 65 6e 67 74 68 28 6f 62 6a 76 5b 32 5d 29 3e 30  ength(objv[2])>0
11270 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 70 48   ){.        *ppH
11280 6f 6f 6b 20 3d 20 6f 62 6a 76 5b 32 5d 3b 0a 20  ook = objv[2];. 
11290 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52         Tcl_IncrR
112a0 65 66 43 6f 75 6e 74 28 2a 70 70 48 6f 6f 6b 29  efCount(*ppHook)
112b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
112c0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 75 70 64  .    sqlite3_upd
112d0 61 74 65 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62  ate_hook(pDb->db
112e0 2c 20 28 70 44 62 2d 3e 70 55 70 64 61 74 65 48  , (pDb->pUpdateH
112f0 6f 6f 6b 3f 44 62 55 70 64 61 74 65 48 61 6e 64  ook?DbUpdateHand
11300 6c 65 72 3a 30 29 2c 20 70 44 62 29 3b 0a 20 20  ler:0), pDb);.  
11310 20 20 73 71 6c 69 74 65 33 5f 72 6f 6c 6c 62 61    sqlite3_rollba
11320 63 6b 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c  ck_hook(pDb->db,
11330 28 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48  (pDb->pRollbackH
11340 6f 6f 6b 3f 44 62 52 6f 6c 6c 62 61 63 6b 48 61  ook?DbRollbackHa
11350 6e 64 6c 65 72 3a 30 29 2c 70 44 62 29 3b 0a 0a  ndler:0),pDb);..
11360 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
11370 20 20 2f 2a 20 20 20 20 24 64 62 20 76 65 72 73    /*    $db vers
11380 69 6f 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  ion.  **.  ** Re
11390 74 75 72 6e 20 74 68 65 20 76 65 72 73 69 6f 6e  turn the version
113a0 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68 69 73   string for this
113b0 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
113c0 20 20 63 61 73 65 20 44 42 5f 56 45 52 53 49 4f    case DB_VERSIO
113d0 4e 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  N: {.    Tcl_Set
113e0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
113f0 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6c  char *)sqlite3_l
11400 69 62 76 65 72 73 69 6f 6e 28 29 2c 20 54 43 4c  ibversion(), TCL
11410 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 62 72  _STATIC);.    br
11420 65 61 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 7d 20 2f  eak;.  }...  } /
11430 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 53 57 49  * End of the SWI
11440 54 43 48 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  TCH statement */
11450 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11460 0a 2f 2a 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33  ./*.**   sqlite3
11470 20 44 42 4e 41 4d 45 20 46 49 4c 45 4e 41 4d 45   DBNAME FILENAME
11480 20 3f 2d 76 66 73 20 56 46 53 4e 41 4d 45 3f 20   ?-vfs VFSNAME? 
11490 3f 2d 6b 65 79 20 4b 45 59 3f 20 3f 2d 72 65 61  ?-key KEY? ?-rea
114a0 64 6f 6e 6c 79 20 42 4f 4f 4c 45 41 4e 3f 0a 2a  donly BOOLEAN?.*
114b0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
114c0 20 20 20 20 20 20 20 20 20 20 20 20 3f 2d 63 72              ?-cr
114d0 65 61 74 65 20 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a  eate BOOLEAN?.**
114e0 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
114f0 6d 61 69 6e 20 54 63 6c 20 63 6f 6d 6d 61 6e 64  main Tcl command
11500 2e 20 20 57 68 65 6e 20 74 68 65 20 22 73 71 6c  .  When the "sql
11510 69 74 65 22 20 54 63 6c 20 63 6f 6d 6d 61 6e 64  ite" Tcl command
11520 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2c 20   is.** invoked, 
11530 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e  this routine run
11540 73 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 61  s to process tha
11550 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  t command..**.**
11560 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
11570 65 6e 74 2c 20 44 42 4e 41 4d 45 2c 20 69 73 20  ent, DBNAME, is 
11580 61 6e 20 61 72 62 69 74 72 61 72 79 20 6e 61 6d  an arbitrary nam
11590 65 20 66 6f 72 20 61 20 6e 65 77 0a 2a 2a 20 64  e for a new.** d
115a0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
115b0 6f 6e 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e  on.  This comman
115c0 64 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 20  d creates a new 
115d0 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64 0a 2a 2a  command named.**
115e0 20 44 42 4e 41 4d 45 20 74 68 61 74 20 69 73 20   DBNAME that is 
115f0 75 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20  used to control 
11600 74 68 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  that connection.
11610 20 20 54 68 65 20 64 61 74 61 62 61 73 65 0a 2a    The database.*
11620 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  * connection is 
11630 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65  deleted when the
11640 20 44 42 4e 41 4d 45 20 63 6f 6d 6d 61 6e 64 20   DBNAME command 
11650 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a  is deleted..**.*
11660 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67  * The second arg
11670 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d  ument is the nam
11680 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
11690 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74  e file..**.*/.st
116a0 61 74 69 63 20 69 6e 74 20 44 62 4d 61 69 6e 28  atic int DbMain(
116b0 76 6f 69 64 20 2a 63 64 2c 20 54 63 6c 5f 49 6e  void *cd, Tcl_In
116c0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
116d0 74 20 6f 62 6a 63 2c 54 63 6c 5f 4f 62 6a 20 2a  t objc,Tcl_Obj *
116e0 63 6f 6e 73 74 2a 6f 62 6a 76 29 7b 0a 20 20 53  const*objv){.  S
116f0 71 6c 69 74 65 44 62 20 2a 70 3b 0a 20 20 76 6f  qliteDb *p;.  vo
11700 69 64 20 2a 70 4b 65 79 20 3d 20 30 3b 0a 20 20  id *pKey = 0;.  
11710 69 6e 74 20 6e 4b 65 79 20 3d 20 30 3b 0a 20 20  int nKey = 0;.  
11720 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
11730 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  ;.  char *zErrMs
11740 67 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f  g;.  int i;.  co
11750 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b  nst char *zFile;
11760 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
11770 56 66 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 66  Vfs = 0;.  int f
11780 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50  lags = SQLITE_OP
11790 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53  EN_READWRITE | S
117a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
117b0 45 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  E;.  Tcl_DString
117c0 20 74 72 61 6e 73 6c 61 74 65 64 46 69 6c 65 6e   translatedFilen
117d0 61 6d 65 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3d  ame;.  if( objc=
117e0 3d 32 20 29 7b 0a 20 20 20 20 7a 41 72 67 20 3d  =2 ){.    zArg =
117f0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
11800 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30  omObj(objv[1], 0
11810 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  );.    if( strcm
11820 70 28 7a 41 72 67 2c 22 2d 76 65 72 73 69 6f 6e  p(zArg,"-version
11830 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54  ")==0 ){.      T
11840 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
11850 69 6e 74 65 72 70 2c 73 71 6c 69 74 65 33 5f 76  interp,sqlite3_v
11860 65 72 73 69 6f 6e 2c 30 29 3b 0a 20 20 20 20 20  ersion,0);.     
11870 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
11880 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74      }.    if( st
11890 72 63 6d 70 28 7a 41 72 67 2c 22 2d 68 61 73 2d  rcmp(zArg,"-has-
118a0 63 6f 64 65 63 22 29 3d 3d 30 20 29 7b 0a 23 69  codec")==0 ){.#i
118b0 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
118c0 43 4f 44 45 43 0a 20 20 20 20 20 20 54 63 6c 5f  CODEC.      Tcl_
118d0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
118e0 65 72 70 2c 22 31 22 2c 30 29 3b 0a 23 65 6c 73  erp,"1",0);.#els
118f0 65 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  e.      Tcl_Appe
11900 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
11910 22 30 22 2c 30 29 3b 0a 23 65 6e 64 69 66 0a 20  "0",0);.#endif. 
11920 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
11930 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
11940 66 6f 72 28 69 3d 33 3b 20 69 2b 31 3c 6f 62 6a  for(i=3; i+1<obj
11950 63 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 7a 41  c; i+=2){.    zA
11960 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  rg = Tcl_GetStri
11970 6e 67 28 6f 62 6a 76 5b 69 5d 29 3b 0a 20 20 20  ng(objv[i]);.   
11980 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67   if( strcmp(zArg
11990 2c 22 2d 6b 65 79 22 29 3d 3d 30 20 29 7b 0a 20  ,"-key")==0 ){. 
119a0 20 20 20 20 20 70 4b 65 79 20 3d 20 54 63 6c 5f       pKey = Tcl_
119b0 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d  GetByteArrayFrom
119c0 4f 62 6a 28 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26  Obj(objv[i+1], &
119d0 6e 4b 65 79 29 3b 0a 20 20 20 20 7d 65 6c 73 65  nKey);.    }else
119e0 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67   if( strcmp(zArg
119f0 2c 20 22 2d 76 66 73 22 29 3d 3d 30 20 29 7b 0a  , "-vfs")==0 ){.
11a00 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
11a10 20 7a 56 66 73 20 3d 20 54 63 6c 5f 47 65 74 53   zVfs = Tcl_GetS
11a20 74 72 69 6e 67 28 6f 62 6a 76 5b 69 5d 29 3b 0a  tring(objv[i]);.
11a30 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
11a40 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d 72 65 61  rcmp(zArg, "-rea
11a50 64 6f 6e 6c 79 22 29 3d 3d 30 20 29 7b 0a 20 20  donly")==0 ){.  
11a60 20 20 20 20 69 6e 74 20 62 3b 0a 20 20 20 20 20      int b;.     
11a70 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c   if( Tcl_GetBool
11a80 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
11a90 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 62  p, objv[i+1], &b
11aa0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
11ab0 52 52 4f 52 3b 0a 20 20 20 20 20 20 69 66 28 20  RROR;.      if( 
11ac0 62 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61  b ){.        fla
11ad0 67 73 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f 4f  gs &= ~(SQLITE_O
11ae0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
11af0 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
11b00 29 3b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  );.        flags
11b10 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   |= SQLITE_OPEN_
11b20 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20  READONLY;.      
11b30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
11b40 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
11b50 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  OPEN_READONLY;. 
11b60 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20         flags |= 
11b70 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
11b80 57 52 49 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20  WRITE;.      }. 
11b90 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
11ba0 63 6d 70 28 7a 41 72 67 2c 20 22 2d 63 72 65 61  cmp(zArg, "-crea
11bb0 74 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  te")==0 ){.     
11bc0 20 69 6e 74 20 62 3b 0a 20 20 20 20 20 20 69 66   int b;.      if
11bd0 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  ( Tcl_GetBoolean
11be0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
11bf0 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29  objv[i+1], &b) )
11c00 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
11c10 52 3b 0a 20 20 20 20 20 20 69 66 28 20 62 20 26  R;.      if( b &
11c20 26 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  & (flags & SQLIT
11c30 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29  E_OPEN_READONLY)
11c40 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ==0 ){.        f
11c50 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
11c60 50 45 4e 5f 43 52 45 41 54 45 3b 0a 20 20 20 20  PEN_CREATE;.    
11c70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
11c80 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54   flags &= ~SQLIT
11c90 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b 0a 20  E_OPEN_CREATE;. 
11ca0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
11cb0 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
11cc0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
11cd0 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e   "unknown option
11ce0 3a 20 22 2c 20 7a 41 72 67 2c 20 28 63 68 61 72  : ", zArg, (char
11cf0 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  *)0);.      retu
11d00 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
11d10 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62    }.  }.  if( ob
11d20 6a 63 3c 33 20 7c 7c 20 28 6f 62 6a 63 26 31 29  jc<3 || (objc&1)
11d30 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=1 ){.    Tcl_W
11d40 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
11d50 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 0a 20 20  rp, 1, objv, .  
11d60 20 20 20 20 22 48 41 4e 44 4c 45 20 46 49 4c 45      "HANDLE FILE
11d70 4e 41 4d 45 20 3f 2d 76 66 73 20 56 46 53 4e 41  NAME ?-vfs VFSNA
11d80 4d 45 3f 20 3f 2d 72 65 61 64 6f 6e 6c 79 20 42  ME? ?-readonly B
11d90 4f 4f 4c 45 41 4e 3f 20 3f 2d 63 72 65 61 74 65  OOLEAN? ?-create
11da0 20 42 4f 4f 4c 45 41 4e 3f 22 0a 23 69 66 64 65   BOOLEAN?".#ifde
11db0 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
11dc0 45 43 0a 20 20 20 20 20 20 22 20 3f 2d 6b 65 79  EC.      " ?-key
11dd0 20 43 4f 44 45 43 4b 45 59 3f 22 0a 23 65 6e 64   CODECKEY?".#end
11de0 69 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 65  if.    );.    re
11df0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
11e00 20 20 7d 0a 20 20 7a 45 72 72 4d 73 67 20 3d 20    }.  zErrMsg = 
11e10 30 3b 0a 20 20 70 20 3d 20 28 53 71 6c 69 74 65  0;.  p = (Sqlite
11e20 44 62 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73  Db*)Tcl_Alloc( s
11e30 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69  izeof(*p) );.  i
11e40 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 54  f( p==0 ){.    T
11e50 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
11e60 65 72 70 2c 20 22 6d 61 6c 6c 6f 63 20 66 61 69  erp, "malloc fai
11e70 6c 65 64 22 2c 20 54 43 4c 5f 53 54 41 54 49 43  led", TCL_STATIC
11e80 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
11e90 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 6d  L_ERROR;.  }.  m
11ea0 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65  emset(p, 0, size
11eb0 6f 66 28 2a 70 29 29 3b 0a 20 20 7a 46 69 6c 65  of(*p));.  zFile
11ec0 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
11ed0 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
11ee0 20 30 29 3b 0a 20 20 7a 46 69 6c 65 20 3d 20 54   0);.  zFile = T
11ef0 63 6c 5f 54 72 61 6e 73 6c 61 74 65 46 69 6c 65  cl_TranslateFile
11f00 4e 61 6d 65 28 69 6e 74 65 72 70 2c 20 7a 46 69  Name(interp, zFi
11f10 6c 65 2c 20 26 74 72 61 6e 73 6c 61 74 65 64 46  le, &translatedF
11f20 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  ilename);.  sqli
11f30 74 65 33 5f 6f 70 65 6e 5f 76 32 28 7a 46 69 6c  te3_open_v2(zFil
11f40 65 2c 20 26 70 2d 3e 64 62 2c 20 66 6c 61 67 73  e, &p->db, flags
11f50 2c 20 7a 56 66 73 29 3b 0a 20 20 54 63 6c 5f 44  , zVfs);.  Tcl_D
11f60 53 74 72 69 6e 67 46 72 65 65 28 26 74 72 61 6e  StringFree(&tran
11f70 73 6c 61 74 65 64 46 69 6c 65 6e 61 6d 65 29 3b  slatedFilename);
11f80 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
11f90 21 3d 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  !=sqlite3_errcod
11fa0 65 28 70 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20  e(p->db) ){.    
11fb0 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
11fc0 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  3_mprintf("%s", 
11fd0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
11fe0 2d 3e 64 62 29 29 3b 0a 20 20 20 20 73 71 6c 69  ->db));.    sqli
11ff0 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 29  te3_close(p->db)
12000 3b 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20 30 3b  ;.    p->db = 0;
12010 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
12020 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69  TE_HAS_CODEC.  i
12030 66 28 20 70 2d 3e 64 62 20 29 7b 0a 20 20 20 20  f( p->db ){.    
12040 73 71 6c 69 74 65 33 5f 6b 65 79 28 70 2d 3e 64  sqlite3_key(p->d
12050 62 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a  b, pKey, nKey);.
12060 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
12070 20 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20   p->db==0 ){.   
12080 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
12090 6e 74 65 72 70 2c 20 7a 45 72 72 4d 73 67 2c 20  nterp, zErrMsg, 
120a0 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20  TCL_VOLATILE);. 
120b0 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61     Tcl_Free((cha
120c0 72 2a 29 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  r*)p);.    sqlit
120d0 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29  e3_free(zErrMsg)
120e0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
120f0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 2d  _ERROR;.  }.  p-
12100 3e 6d 61 78 53 74 6d 74 20 3d 20 4e 55 4d 5f 50  >maxStmt = NUM_P
12110 52 45 50 41 52 45 44 5f 53 54 4d 54 53 3b 0a 20  REPARED_STMTS;. 
12120 20 70 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74   p->interp = int
12130 65 72 70 3b 0a 20 20 7a 41 72 67 20 3d 20 54 63  erp;.  zArg = Tc
12140 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
12150 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a  bj(objv[1], 0);.
12160 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
12170 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 7a  ommand(interp, z
12180 41 72 67 2c 20 44 62 4f 62 6a 43 6d 64 2c 20 28  Arg, DbObjCmd, (
12190 63 68 61 72 2a 29 70 2c 20 44 62 44 65 6c 65 74  char*)p, DbDelet
121a0 65 43 6d 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  eCmd);.  return 
121b0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
121c0 20 50 72 6f 76 69 64 65 20 61 20 64 75 6d 6d 79   Provide a dummy
121d0 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 20 69   Tcl_InitStubs i
121e0 66 20 77 65 20 61 72 65 20 75 73 69 6e 67 20 74  f we are using t
121f0 68 69 73 20 61 73 20 61 20 73 74 61 74 69 63 0a  his as a static.
12200 2a 2a 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23  ** library..*/.#
12210 69 66 6e 64 65 66 20 55 53 45 5f 54 43 4c 5f 53  ifndef USE_TCL_S
12220 54 55 42 53 0a 23 20 75 6e 64 65 66 20 20 54 63  TUBS.# undef  Tc
12230 6c 5f 49 6e 69 74 53 74 75 62 73 0a 23 20 64 65  l_InitStubs.# de
12240 66 69 6e 65 20 54 63 6c 5f 49 6e 69 74 53 74 75  fine Tcl_InitStu
12250 62 73 28 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66  bs(a,b,c).#endif
12260 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
12270 65 20 77 65 20 68 61 76 65 20 61 20 50 41 43 4b  e we have a PACK
12280 41 47 45 5f 56 45 52 53 49 4f 4e 20 6d 61 63 72  AGE_VERSION macr
12290 6f 20 64 65 66 69 6e 65 64 2e 20 20 54 68 69 73  o defined.  This
122a0 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 66 69   will be.** defi
122b0 6e 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ned automaticall
122c0 79 20 62 79 20 74 68 65 20 54 45 41 20 6d 61 6b  y by the TEA mak
122d0 65 66 69 6c 65 2e 20 20 42 75 74 20 6f 74 68 65  efile.  But othe
122e0 72 20 6d 61 6b 65 66 69 6c 65 73 0a 2a 2a 20 64  r makefiles.** d
122f0 6f 20 6e 6f 74 20 64 65 66 69 6e 65 20 69 74 2e  o not define it.
12300 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 50 41 43 4b  .*/.#ifndef PACK
12310 41 47 45 5f 56 45 52 53 49 4f 4e 0a 23 20 64 65  AGE_VERSION.# de
12320 66 69 6e 65 20 50 41 43 4b 41 47 45 5f 56 45 52  fine PACKAGE_VER
12330 53 49 4f 4e 20 53 51 4c 49 54 45 5f 56 45 52 53  SION SQLITE_VERS
12340 49 4f 4e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ION.#endif../*.*
12350 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 69  * Initialize thi
12360 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2a 0a 2a 2a 20  s module..**.** 
12370 54 68 69 73 20 54 63 6c 20 6d 6f 64 75 6c 65 20  This Tcl module 
12380 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 61 20  contains only a 
12390 73 69 6e 67 6c 65 20 6e 65 77 20 54 63 6c 20 63  single new Tcl c
123a0 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64 20 22 73 71  ommand named "sq
123b0 6c 69 74 65 22 2e 0a 2a 2a 20 28 48 65 6e 63 65  lite"..** (Hence
123c0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 61 6d   there is no nam
123d0 65 73 70 61 63 65 2e 20 20 54 68 65 72 65 20 69  espace.  There i
123e0 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 75 73  s no point in us
123f0 69 6e 67 20 61 20 6e 61 6d 65 73 70 61 63 65 0a  ing a namespace.
12400 2a 2a 20 69 66 20 74 68 65 20 65 78 74 65 6e 73  ** if the extens
12410 69 6f 6e 20 6f 6e 6c 79 20 73 75 70 70 6c 69 65  ion only supplie
12420 73 20 6f 6e 65 20 6e 65 77 20 6e 61 6d 65 21 29  s one new name!)
12430 20 20 54 68 65 20 22 73 71 6c 69 74 65 22 20 63    The "sqlite" c
12440 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 75 73 65  ommand is.** use
12450 64 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20  d to open a new 
12460 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e  SQLite database.
12470 20 20 53 65 65 20 74 68 65 20 44 62 4d 61 69 6e    See the DbMain
12480 28 29 20 72 6f 75 74 69 6e 65 20 61 62 6f 76 65  () routine above
12490 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .** for addition
124a0 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
124b0 2a 2f 0a 45 58 54 45 52 4e 20 69 6e 74 20 53 71  */.EXTERN int Sq
124c0 6c 69 74 65 33 5f 49 6e 69 74 28 54 63 6c 5f 49  lite3_Init(Tcl_I
124d0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a  nterp *interp){.
124e0 20 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28    Tcl_InitStubs(
124f0 69 6e 74 65 72 70 2c 20 22 38 2e 34 22 2c 20 30  interp, "8.4", 0
12500 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  );.  Tcl_CreateO
12510 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
12520 2c 20 22 73 71 6c 69 74 65 33 22 2c 20 28 54 63  , "sqlite3", (Tc
12530 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a 29 44 62  l_ObjCmdProc*)Db
12540 4d 61 69 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 54  Main, 0, 0);.  T
12550 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e  cl_PkgProvide(in
12560 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33 22 2c  terp, "sqlite3",
12570 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e   PACKAGE_VERSION
12580 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  );.  Tcl_CreateO
12590 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
125a0 2c 20 22 73 71 6c 69 74 65 22 2c 20 28 54 63 6c  , "sqlite", (Tcl
125b0 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a 29 44 62 4d  _ObjCmdProc*)DbM
125c0 61 69 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63  ain, 0, 0);.  Tc
125d0 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74  l_PkgProvide(int
125e0 65 72 70 2c 20 22 73 71 6c 69 74 65 22 2c 20 50  erp, "sqlite", P
125f0 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29 3b  ACKAGE_VERSION);
12600 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
12610 3b 0a 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 54  ;.}.EXTERN int T
12620 63 6c 73 71 6c 69 74 65 33 5f 49 6e 69 74 28 54  clsqlite3_Init(T
12630 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
12640 70 29 7b 20 72 65 74 75 72 6e 20 53 71 6c 69 74  p){ return Sqlit
12650 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  e3_Init(interp);
12660 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 53 71   }.EXTERN int Sq
12670 6c 69 74 65 33 5f 53 61 66 65 49 6e 69 74 28 54  lite3_SafeInit(T
12680 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
12690 70 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  p){ return TCL_O
126a0 4b 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20  K; }.EXTERN int 
126b0 54 63 6c 73 71 6c 69 74 65 33 5f 53 61 66 65 49  Tclsqlite3_SafeI
126c0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
126d0 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20  interp){ return 
126e0 54 43 4c 5f 4f 4b 3b 20 7d 0a 0a 23 69 66 6e 64  TCL_OK; }..#ifnd
126f0 65 66 20 53 51 4c 49 54 45 5f 33 5f 53 55 46 46  ef SQLITE_3_SUFF
12700 49 58 5f 4f 4e 4c 59 0a 45 58 54 45 52 4e 20 69  IX_ONLY.EXTERN i
12710 6e 74 20 53 71 6c 69 74 65 5f 49 6e 69 74 28 54  nt Sqlite_Init(T
12720 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
12730 70 29 7b 20 72 65 74 75 72 6e 20 53 71 6c 69 74  p){ return Sqlit
12740 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  e3_Init(interp);
12750 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63   }.EXTERN int Tc
12760 6c 73 71 6c 69 74 65 5f 49 6e 69 74 28 54 63 6c  lsqlite_Init(Tcl
12770 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
12780 7b 20 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33  { return Sqlite3
12790 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d  _Init(interp); }
127a0 0a 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69  .EXTERN int Sqli
127b0 74 65 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f  te_SafeInit(Tcl_
127c0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
127d0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
127e0 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63 6c  }.EXTERN int Tcl
127f0 73 71 6c 69 74 65 5f 53 61 66 65 49 6e 69 74 28  sqlite_SafeInit(
12800 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
12810 72 70 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f  rp){ return TCL_
12820 4f 4b 3b 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  OK; }.#endif..#i
12830 66 64 65 66 20 54 43 4c 53 48 0a 2f 2a 2a 2a 2a  fdef TCLSH./****
12840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12880 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65  *********.** The
12890 20 63 6f 64 65 20 74 68 61 74 20 66 6f 6c 6c 6f   code that follo
128a0 77 73 20 69 73 20 75 73 65 64 20 74 6f 20 62 75  ws is used to bu
128b0 69 6c 64 20 73 74 61 6e 64 61 6c 6f 6e 65 20 54  ild standalone T
128c0 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 73 0a  CL interpreters.
128d0 2a 2a 20 74 68 61 74 20 61 72 65 20 73 74 61 74  ** that are stat
128e0 69 63 61 6c 6c 79 20 6c 69 6e 6b 65 64 20 77 69  ically linked wi
128f0 74 68 20 53 51 4c 69 74 65 2e 20 20 0a 2a 2f 0a  th SQLite.  .*/.
12900 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61  ./*.** If the ma
12910 63 72 6f 20 54 43 4c 53 48 20 69 73 20 6f 6e 65  cro TCLSH is one
12920 2c 20 74 68 65 6e 20 70 75 74 20 69 6e 20 63 6f  , then put in co
12930 64 65 20 74 68 69 73 20 66 6f 72 20 74 68 65 0a  de this for the.
12940 2a 2a 20 22 6d 61 69 6e 22 20 72 6f 75 74 69 6e  ** "main" routin
12950 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 69 74  e that will init
12960 69 61 6c 69 7a 65 20 54 63 6c 20 61 6e 64 20 74  ialize Tcl and t
12970 61 6b 65 20 69 6e 70 75 74 20 66 72 6f 6d 0a 2a  ake input from.*
12980 2a 20 73 74 61 6e 64 61 72 64 20 69 6e 70 75 74  * standard input
12990 2c 20 6f 72 20 69 66 20 61 20 66 69 6c 65 20 69  , or if a file i
129a0 73 20 6e 61 6d 65 64 20 6f 6e 20 74 68 65 20 63  s named on the c
129b0 6f 6d 6d 61 6e 64 20 6c 69 6e 65 0a 2a 2a 20 74  ommand line.** t
129c0 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
129d0 65 72 20 72 65 61 64 73 20 61 6e 64 20 65 76 61  er reads and eva
129e0 6c 75 61 74 65 73 20 74 68 61 74 20 66 69 6c 65  luates that file
129f0 2e 0a 2a 2f 0a 23 69 66 20 54 43 4c 53 48 3d 3d  ..*/.#if TCLSH==
12a00 31 0a 73 74 61 74 69 63 20 63 68 61 72 20 7a 4d  1.static char zM
12a10 61 69 6e 6c 6f 6f 70 5b 5d 20 3d 0a 20 20 22 73  ainloop[] =.  "s
12a20 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20  et line {}\n".  
12a30 22 77 68 69 6c 65 20 7b 21 5b 65 6f 66 20 73 74  "while {![eof st
12a40 64 69 6e 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 22  din]} {\n".    "
12a50 69 66 20 7b 24 6c 69 6e 65 21 3d 5c 22 5c 22 7d  if {$line!=\"\"}
12a60 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 70 75 74   {\n".      "put
12a70 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22 3e  s -nonewline \">
12a80 20 5c 22 5c 6e 22 0a 20 20 20 20 22 7d 20 65 6c   \"\n".    "} el
12a90 73 65 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 70  se {\n".      "p
12aa0 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c  uts -nonewline \
12ab0 22 25 20 5c 22 5c 6e 22 0a 20 20 20 20 22 7d 5c  "% \"\n".    "}\
12ac0 6e 22 0a 20 20 20 20 22 66 6c 75 73 68 20 73 74  n".    "flush st
12ad0 64 6f 75 74 5c 6e 22 0a 20 20 20 20 22 61 70 70  dout\n".    "app
12ae0 65 6e 64 20 6c 69 6e 65 20 5b 67 65 74 73 20 73  end line [gets s
12af0 74 64 69 6e 5d 5c 6e 22 0a 20 20 20 20 22 69 66  tdin]\n".    "if
12b00 20 7b 5b 69 6e 66 6f 20 63 6f 6d 70 6c 65 74 65   {[info complete
12b10 20 24 6c 69 6e 65 5d 7d 20 7b 5c 6e 22 0a 20 20   $line]} {\n".  
12b20 20 20 20 20 22 69 66 20 7b 5b 63 61 74 63 68 20      "if {[catch 
12b30 7b 75 70 6c 65 76 65 6c 20 23 30 20 24 6c 69 6e  {uplevel #0 $lin
12b40 65 7d 20 72 65 73 75 6c 74 5d 7d 20 7b 5c 6e 22  e} result]} {\n"
12b50 0a 20 20 20 20 20 20 20 20 22 70 75 74 73 20 73  .        "puts s
12b60 74 64 65 72 72 20 5c 22 45 72 72 6f 72 3a 20 24  tderr \"Error: $
12b70 72 65 73 75 6c 74 5c 22 5c 6e 22 0a 20 20 20 20  result\"\n".    
12b80 20 20 22 7d 20 65 6c 73 65 69 66 20 7b 24 72 65    "} elseif {$re
12b90 73 75 6c 74 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22  sult!=\"\"} {\n"
12ba0 0a 20 20 20 20 20 20 20 20 22 70 75 74 73 20 24  .        "puts $
12bb0 72 65 73 75 6c 74 5c 6e 22 0a 20 20 20 20 20 20  result\n".      
12bc0 22 7d 5c 6e 22 0a 20 20 20 20 20 20 22 73 65 74  "}\n".      "set
12bd0 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20 20 20   line {}\n".    
12be0 22 7d 20 65 6c 73 65 20 7b 5c 6e 22 0a 20 20 20  "} else {\n".   
12bf0 20 20 20 22 61 70 70 65 6e 64 20 6c 69 6e 65 20     "append line 
12c00 5c 5c 6e 5c 6e 22 0a 20 20 20 20 22 7d 5c 6e 22  \\n\n".    "}\n"
12c10 0a 20 20 22 7d 5c 6e 22 0a 3b 0a 23 65 6e 64 69  .  "}\n".;.#endi
12c20 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  f../*.** If the 
12c30 6d 61 63 72 6f 20 54 43 4c 53 48 20 69 73 20 74  macro TCLSH is t
12c40 77 6f 2c 20 74 68 65 6e 20 67 65 74 20 74 68 65  wo, then get the
12c50 20 6d 61 69 6e 20 6c 6f 6f 70 20 63 6f 64 65 20   main loop code 
12c60 6f 75 74 20 6f 66 0a 2a 2a 20 74 68 65 20 73 65  out of.** the se
12c70 70 61 72 61 74 65 20 66 69 6c 65 20 22 73 70 61  parate file "spa
12c80 63 65 61 6e 61 6c 5f 74 63 6c 2e 68 22 2e 0a 2a  ceanal_tcl.h"..*
12c90 2f 0a 23 69 66 20 54 43 4c 53 48 3d 3d 32 0a 73  /.#if TCLSH==2.s
12ca0 74 61 74 69 63 20 63 68 61 72 20 7a 4d 61 69 6e  tatic char zMain
12cb0 6c 6f 6f 70 5b 5d 20 3d 20 0a 23 69 6e 63 6c 75  loop[] = .#inclu
12cc0 64 65 20 22 73 70 61 63 65 61 6e 61 6c 5f 74 63  de "spaceanal_tc
12cd0 6c 2e 68 22 0a 3b 0a 23 65 6e 64 69 66 0a 0a 23  l.h".;.#endif..#
12ce0 64 65 66 69 6e 65 20 54 43 4c 53 48 5f 4d 41 49  define TCLSH_MAI
12cf0 4e 20 6d 61 69 6e 20 20 20 2f 2a 20 4e 65 65 64  N main   /* Need
12d00 65 64 20 74 6f 20 66 61 6b 65 20 6f 75 74 20 6d  ed to fake out m
12d10 6b 74 63 6c 61 70 70 20 2a 2f 0a 69 6e 74 20 54  ktclapp */.int T
12d20 43 4c 53 48 5f 4d 41 49 4e 28 69 6e 74 20 61 72  CLSH_MAIN(int ar
12d30 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29  gc, char **argv)
12d40 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  {.  Tcl_Interp *
12d50 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 46 69  interp;.  Tcl_Fi
12d60 6e 64 45 78 65 63 75 74 61 62 6c 65 28 61 72 67  ndExecutable(arg
12d70 76 5b 30 5d 29 3b 0a 20 20 69 6e 74 65 72 70 20  v[0]);.  interp 
12d80 3d 20 54 63 6c 5f 43 72 65 61 74 65 49 6e 74 65  = Tcl_CreateInte
12d90 72 70 28 29 3b 0a 20 20 53 71 6c 69 74 65 33 5f  rp();.  Sqlite3_
12da0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 23 69  Init(interp);.#i
12db0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
12dc0 0a 20 20 7b 0a 20 20 20 20 65 78 74 65 72 6e 20  .  {.    extern 
12dd0 69 6e 74 20 4d 64 35 5f 49 6e 69 74 28 54 63 6c  int Md5_Init(Tcl
12de0 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
12df0 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
12e00 63 6f 6e 66 69 67 5f 49 6e 69 74 28 54 63 6c 5f  config_Init(Tcl_
12e10 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
12e20 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
12e30 65 73 74 31 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  est1_Init(Tcl_In
12e40 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
12e50 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
12e60 74 32 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  t2_Init(Tcl_Inte
12e70 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
12e80 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 33   int Sqlitetest3
12e90 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
12ea0 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
12eb0 6e 74 20 53 71 6c 69 74 65 74 65 73 74 34 5f 49  nt Sqlitetest4_I
12ec0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
12ed0 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
12ee0 20 53 71 6c 69 74 65 74 65 73 74 35 5f 49 6e 69   Sqlitetest5_Ini
12ef0 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
12f00 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
12f10 71 6c 69 74 65 74 65 73 74 36 5f 49 6e 69 74 28  qlitetest6_Init(
12f20 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
12f30 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
12f40 69 74 65 74 65 73 74 37 5f 49 6e 69 74 28 54 63  itetest7_Init(Tc
12f50 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
12f60 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
12f70 65 74 65 73 74 38 5f 49 6e 69 74 28 54 63 6c 5f  etest8_Init(Tcl_
12f80 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
12f90 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
12fa0 65 73 74 39 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  est9_Init(Tcl_In
12fb0 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
12fc0 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
12fd0 74 61 73 79 6e 63 5f 49 6e 69 74 28 54 63 6c 5f  tasync_Init(Tcl_
12fe0 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
12ff0 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
13000 65 73 74 5f 61 75 74 6f 65 78 74 5f 49 6e 69 74  est_autoext_Init
13010 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
13020 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
13030 6c 69 74 65 74 65 73 74 5f 66 75 6e 63 5f 49 6e  litetest_func_In
13040 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
13050 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
13060 53 71 6c 69 74 65 74 65 73 74 5f 68 65 78 69 6f  Sqlitetest_hexio
13070 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
13080 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
13090 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f 6d 61  nt Sqlitetest_ma
130a0 6c 6c 6f 63 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  lloc_Init(Tcl_In
130b0 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
130c0 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
130d0 74 73 63 68 65 6d 61 5f 49 6e 69 74 28 54 63 6c  tschema_Init(Tcl
130e0 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
130f0 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
13100 74 65 73 74 73 73 65 5f 49 6e 69 74 28 54 63 6c  testsse_Init(Tcl
13110 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
13120 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
13130 74 65 73 74 74 63 6c 76 61 72 5f 49 6e 69 74 28  testtclvar_Init(
13140 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
13150 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
13160 69 74 65 74 65 73 74 54 68 72 65 61 64 5f 49 6e  itetestThread_In
13170 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
13180 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
13190 53 71 6c 69 74 65 74 65 73 74 4f 6e 65 66 69 6c  SqlitetestOnefil
131a0 65 5f 49 6e 69 74 28 29 3b 0a 0a 20 20 20 20 4d  e_Init();..    M
131b0 64 35 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  d5_Init(interp);
131c0 0a 20 20 20 20 53 71 6c 69 74 65 63 6f 6e 66 69  .    Sqliteconfi
131d0 67 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  g_Init(interp);.
131e0 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 31 5f      Sqlitetest1_
131f0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
13200 20 20 53 71 6c 69 74 65 74 65 73 74 32 5f 49 6e    Sqlitetest2_In
13210 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
13220 53 71 6c 69 74 65 74 65 73 74 33 5f 49 6e 69 74  Sqlitetest3_Init
13230 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
13240 6c 69 74 65 74 65 73 74 34 5f 49 6e 69 74 28 69  litetest4_Init(i
13250 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
13260 74 65 74 65 73 74 35 5f 49 6e 69 74 28 69 6e 74  tetest5_Init(int
13270 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
13280 74 65 73 74 36 5f 49 6e 69 74 28 69 6e 74 65 72  test6_Init(inter
13290 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
132a0 73 74 37 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  st7_Init(interp)
132b0 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
132c0 38 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  8_Init(interp);.
132d0 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 39 5f      Sqlitetest9_
132e0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
132f0 20 20 53 71 6c 69 74 65 74 65 73 74 61 73 79 6e    Sqlitetestasyn
13300 63 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  c_Init(interp);.
13310 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f 61      Sqlitetest_a
13320 75 74 6f 65 78 74 5f 49 6e 69 74 28 69 6e 74 65  utoext_Init(inte
13330 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
13340 65 73 74 5f 66 75 6e 63 5f 49 6e 69 74 28 69 6e  est_func_Init(in
13350 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
13360 65 74 65 73 74 5f 68 65 78 69 6f 5f 49 6e 69 74  etest_hexio_Init
13370 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
13380 6c 69 74 65 74 65 73 74 5f 6d 61 6c 6c 6f 63 5f  litetest_malloc_
13390 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
133a0 20 20 53 71 6c 69 74 65 74 65 73 74 73 63 68 65    Sqlitetestsche
133b0 6d 61 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  ma_Init(interp);
133c0 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 74  .    Sqlitetestt
133d0 63 6c 76 61 72 5f 49 6e 69 74 28 69 6e 74 65 72  clvar_Init(inter
133e0 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
133f0 73 74 54 68 72 65 61 64 5f 49 6e 69 74 28 69 6e  stThread_Init(in
13400 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
13410 65 74 65 73 74 4f 6e 65 66 69 6c 65 5f 49 6e 69  etestOnefile_Ini
13420 74 28 69 6e 74 65 72 70 29 3b 0a 0a 23 69 66 64  t(interp);..#ifd
13430 65 66 20 53 51 4c 49 54 45 5f 53 53 45 0a 20 20  ef SQLITE_SSE.  
13440 20 20 53 71 6c 69 74 65 74 65 73 74 73 73 65 5f    Sqlitetestsse_
13450 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 23 65  Init(interp);.#e
13460 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ndif.  }.#endif.
13470 20 20 69 66 28 20 61 72 67 63 3e 3d 32 20 7c 7c    if( argc>=2 ||
13480 20 54 43 4c 53 48 3d 3d 32 20 29 7b 0a 20 20 20   TCLSH==2 ){.   
13490 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 68 61 72   int i;.    char
134a0 20 7a 41 72 67 63 5b 33 32 5d 3b 0a 20 20 20 20   zArgc[32];.    
134b0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
134c0 28 73 69 7a 65 6f 66 28 7a 41 72 67 63 29 2c 20  (sizeof(zArgc), 
134d0 7a 41 72 67 63 2c 20 22 25 64 22 2c 20 61 72 67  zArgc, "%d", arg
134e0 63 2d 28 33 2d 54 43 4c 53 48 29 29 3b 0a 20 20  c-(3-TCLSH));.  
134f0 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74    Tcl_SetVar(int
13500 65 72 70 2c 22 61 72 67 63 22 2c 20 7a 41 72 67  erp,"argc", zArg
13510 63 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e  c, TCL_GLOBAL_ON
13520 4c 59 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  LY);.    Tcl_Set
13530 56 61 72 28 69 6e 74 65 72 70 2c 22 61 72 67 76  Var(interp,"argv
13540 30 22 2c 61 72 67 76 5b 31 5d 2c 54 43 4c 5f 47  0",argv[1],TCL_G
13550 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20  LOBAL_ONLY);.   
13560 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65   Tcl_SetVar(inte
13570 72 70 2c 22 61 72 67 76 22 2c 20 22 22 2c 20 54  rp,"argv", "", T
13580 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
13590 0a 20 20 20 20 66 6f 72 28 69 3d 33 2d 54 43 4c  .    for(i=3-TCL
135a0 53 48 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29  SH; i<argc; i++)
135b0 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 56  {.      Tcl_SetV
135c0 61 72 28 69 6e 74 65 72 70 2c 20 22 61 72 67 76  ar(interp, "argv
135d0 22 2c 20 61 72 67 76 5b 69 5d 2c 0a 20 20 20 20  ", argv[i],.    
135e0 20 20 20 20 20 20 54 43 4c 5f 47 4c 4f 42 41 4c        TCL_GLOBAL
135f0 5f 4f 4e 4c 59 20 7c 20 54 43 4c 5f 4c 49 53 54  _ONLY | TCL_LIST
13600 5f 45 4c 45 4d 45 4e 54 20 7c 20 54 43 4c 5f 41  _ELEMENT | TCL_A
13610 50 50 45 4e 44 5f 56 41 4c 55 45 29 3b 0a 20 20  PPEND_VALUE);.  
13620 20 20 7d 0a 20 20 20 20 69 66 28 20 54 43 4c 53    }.    if( TCLS
13630 48 3d 3d 31 20 26 26 20 54 63 6c 5f 45 76 61 6c  H==1 && Tcl_Eval
13640 46 69 6c 65 28 69 6e 74 65 72 70 2c 20 61 72 67  File(interp, arg
13650 76 5b 31 5d 29 21 3d 54 43 4c 5f 4f 4b 20 29 7b  v[1])!=TCL_OK ){
13660 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
13670 72 20 2a 7a 49 6e 66 6f 20 3d 20 54 63 6c 5f 47  r *zInfo = Tcl_G
13680 65 74 56 61 72 28 69 6e 74 65 72 70 2c 20 22 65  etVar(interp, "e
13690 72 72 6f 72 49 6e 66 6f 22 2c 20 54 43 4c 5f 47  rrorInfo", TCL_G
136a0 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20  LOBAL_ONLY);.   
136b0 20 20 20 69 66 28 20 7a 49 6e 66 6f 3d 3d 30 20     if( zInfo==0 
136c0 29 20 7a 49 6e 66 6f 20 3d 20 69 6e 74 65 72 70  ) zInfo = interp
136d0 2d 3e 72 65 73 75 6c 74 3b 0a 20 20 20 20 20 20  ->result;.      
136e0 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
136f0 25 73 3a 20 25 73 5c 6e 22 2c 20 2a 61 72 67 76  %s: %s\n", *argv
13700 2c 20 7a 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  , zInfo);.      
13710 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
13720 20 20 7d 0a 20 20 69 66 28 20 61 72 67 63 3c 3d    }.  if( argc<=
13730 31 20 7c 7c 20 54 43 4c 53 48 3d 3d 32 20 29 7b  1 || TCLSH==2 ){
13740 0a 20 20 20 20 54 63 6c 5f 47 6c 6f 62 61 6c 45  .    Tcl_GlobalE
13750 76 61 6c 28 69 6e 74 65 72 70 2c 20 7a 4d 61 69  val(interp, zMai
13760 6e 6c 6f 6f 70 29 3b 0a 20 20 7d 0a 20 20 72 65  nloop);.  }.  re
13770 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
13780 20 2f 2a 20 54 43 4c 53 48 20 2a 2f 0a            /* TCLSH */.