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

Artifact d42912617d4734b8f9195416badf5b27e512ded2:


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 31 20 32 30 30 38  e.c,v 1.211 2008
0220: 2f 30 33 2f 31 39 20 31 39 3a 30 31 3a 32 32 20  /03/19 19:01:22 
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 71 6c 69 74 65   }.    if(sqlite
a630: 33 53 74 72 49 43 6d 70 28 7a 43 6f 6e 66 6c 69  3StrICmp(zConfli
a640: 63 74 2c 20 22 72 6f 6c 6c 62 61 63 6b 22 29 20  ct, "rollback") 
a650: 21 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20 73  != 0 &&.       s
a660: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 43  qlite3StrICmp(zC
a670: 6f 6e 66 6c 69 63 74 2c 20 22 61 62 6f 72 74 22  onflict, "abort"
a680: 20 20 20 29 20 21 3d 20 30 20 26 26 0a 20 20 20     ) != 0 &&.   
a690: 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 49 43      sqlite3StrIC
a6a0: 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 66  mp(zConflict, "f
a6b0: 61 69 6c 22 20 20 20 20 29 20 21 3d 20 30 20 26  ail"    ) != 0 &
a6c0: 26 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  &.       sqlite3
a6d0: 53 74 72 49 43 6d 70 28 7a 43 6f 6e 66 6c 69 63  StrICmp(zConflic
a6e0: 74 2c 20 22 69 67 6e 6f 72 65 22 20 20 29 20 21  t, "ignore"  ) !
a6f0: 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20 73 71  = 0 &&.       sq
a700: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 43 6f  lite3StrICmp(zCo
a710: 6e 66 6c 69 63 74 2c 20 22 72 65 70 6c 61 63 65  nflict, "replace
a720: 22 20 29 20 21 3d 20 30 20 29 20 7b 0a 20 20 20  " ) != 0 ) {.   
a730: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
a740: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72  ult(interp, "Err
a750: 6f 72 3a 20 5c 22 22 2c 20 7a 43 6f 6e 66 6c 69  or: \"", zConfli
a760: 63 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ct, .           
a770: 20 22 5c 22 2c 20 63 6f 6e 66 6c 69 63 74 2d 61   "\", conflict-a
a780: 6c 67 6f 72 69 74 68 6d 20 6d 75 73 74 20 62 65  lgorithm must be
a790: 20 6f 6e 65 20 6f 66 3a 20 72 6f 6c 6c 62 61 63   one of: rollbac
a7a0: 6b 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  k, ".           
a7b0: 20 22 61 62 6f 72 74 2c 20 66 61 69 6c 2c 20 69   "abort, fail, i
a7c0: 67 6e 6f 72 65 2c 20 6f 72 20 72 65 70 6c 61 63  gnore, or replac
a7d0: 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65  e", 0);.      re
a7e0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
a7f0: 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d      }.    zSql =
a800: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
a810: 28 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  ("SELECT * FROM 
a820: 27 25 71 27 22 2c 20 7a 54 61 62 6c 65 29 3b 0a  '%q'", zTable);.
a830: 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20      if( zSql==0 
a840: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
a850: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
a860: 2c 20 22 45 72 72 6f 72 3a 20 6e 6f 20 73 75 63  , "Error: no suc
a870: 68 20 74 61 62 6c 65 3a 20 22 2c 20 7a 54 61 62  h table: ", zTab
a880: 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65  le, 0);.      re
a890: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
a8a0: 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20      }.    nByte 
a8b0: 3d 20 73 74 72 6c 65 6e 28 7a 53 71 6c 29 3b 0a  = strlen(zSql);.
a8c0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
a8d0: 5f 70 72 65 70 61 72 65 28 70 44 62 2d 3e 64 62  _prepare(pDb->db
a8e0: 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
a8f0: 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  mt, 0);.    sqli
a900: 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
a910: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
a920: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
a930: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72  sult(interp, "Er
a940: 72 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f  ror: ", sqlite3_
a950: 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c  errmsg(pDb->db),
a960: 20 30 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 20   0);.      nCol 
a970: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
a980: 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c        nCol = sql
a990: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
a9a0: 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a  t(pStmt);.    }.
a9b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
a9c0: 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
a9d0: 20 69 66 28 20 6e 43 6f 6c 3d 3d 30 20 29 20 7b   if( nCol==0 ) {
a9e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
a9f0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
aa00: 20 20 20 7a 53 71 6c 20 3d 20 6d 61 6c 6c 6f 63     zSql = malloc
aa10: 28 20 6e 42 79 74 65 20 2b 20 35 30 20 2b 20 6e  ( nByte + 50 + n
aa20: 43 6f 6c 2a 32 20 29 3b 0a 20 20 20 20 69 66 28  Col*2 );.    if(
aa30: 20 7a 53 71 6c 3d 3d 30 20 29 20 7b 0a 20 20 20   zSql==0 ) {.   
aa40: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
aa50: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72  ult(interp, "Err
aa60: 6f 72 3a 20 63 61 6e 27 74 20 6d 61 6c 6c 6f 63  or: can't malloc
aa70: 28 29 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  ()", 0);.      r
aa80: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
aa90: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
aaa0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 79 74  e3_snprintf(nByt
aab0: 65 2b 35 30 2c 20 7a 53 71 6c 2c 20 22 49 4e 53  e+50, zSql, "INS
aac0: 45 52 54 20 4f 52 20 25 71 20 49 4e 54 4f 20 27  ERT OR %q INTO '
aad0: 25 71 27 20 56 41 4c 55 45 53 28 3f 22 2c 0a 20  %q' VALUES(?",. 
aae0: 20 20 20 20 20 20 20 20 7a 43 6f 6e 66 6c 69 63          zConflic
aaf0: 74 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20  t, zTable);.    
ab00: 6a 20 3d 20 73 74 72 6c 65 6e 28 7a 53 71 6c 29  j = strlen(zSql)
ab10: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69  ;.    for(i=1; i
ab20: 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
ab30: 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27     zSql[j++] = '
ab40: 2c 27 3b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a  ,';.      zSql[j
ab50: 2b 2b 5d 20 3d 20 27 3f 27 3b 0a 20 20 20 20 7d  ++] = '?';.    }
ab60: 0a 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d  .    zSql[j++] =
ab70: 20 27 29 27 3b 0a 20 20 20 20 7a 53 71 6c 5b 6a   ')';.    zSql[j
ab80: 5d 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  ] = 0;.    rc = 
ab90: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28  sqlite3_prepare(
aba0: 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  pDb->db, zSql, -
abb0: 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
abc0: 20 20 20 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20     free(zSql);. 
abd0: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
abe0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
abf0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72  ult(interp, "Err
ac00: 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f 65  or: ", sqlite3_e
ac10: 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20  rrmsg(pDb->db), 
ac20: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
ac30: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
ac40: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
ac50: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
ac60: 0a 20 20 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28  .    in = fopen(
ac70: 7a 46 69 6c 65 2c 20 22 72 62 22 29 3b 0a 20 20  zFile, "rb");.  
ac80: 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20    if( in==0 ){. 
ac90: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
aca0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45  esult(interp, "E
acb0: 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65  rror: cannot ope
acc0: 6e 20 66 69 6c 65 3a 20 22 2c 20 7a 46 69 6c 65  n file: ", zFile
acd0: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  , NULL);.      s
ace0: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
acf0: 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 65  pStmt);.      re
ad00: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
ad10: 20 20 20 20 7d 0a 20 20 20 20 61 7a 43 6f 6c 20      }.    azCol 
ad20: 3d 20 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  = malloc( sizeof
ad30: 28 61 7a 43 6f 6c 5b 30 5d 29 2a 28 6e 43 6f 6c  (azCol[0])*(nCol
ad40: 2b 31 29 20 29 3b 0a 20 20 20 20 69 66 28 20 61  +1) );.    if( a
ad50: 7a 43 6f 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20  zCol==0 ) {.    
ad60: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
ad70: 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f  lt(interp, "Erro
ad80: 72 3a 20 63 61 6e 27 74 20 6d 61 6c 6c 6f 63 28  r: can't malloc(
ad90: 29 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 63  )", 0);.      fc
ada0: 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 20 20  lose(in);.      
adb0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
adc0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 76 6f 69  ;.    }.    (voi
add0: 64 29 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  d)sqlite3_exec(p
ade0: 44 62 2d 3e 64 62 2c 20 22 42 45 47 49 4e 22 2c  Db->db, "BEGIN",
adf0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7a   0, 0, 0);.    z
ae00: 43 6f 6d 6d 69 74 20 3d 20 22 43 4f 4d 4d 49 54  Commit = "COMMIT
ae10: 22 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a  ";.    while( (z
ae20: 4c 69 6e 65 20 3d 20 6c 6f 63 61 6c 5f 67 65 74  Line = local_get
ae30: 6c 69 6e 65 28 30 2c 20 69 6e 29 29 21 3d 30 20  line(0, in))!=0 
ae40: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
ae50: 3b 0a 20 20 20 20 20 20 69 20 3d 20 30 3b 0a 20  ;.      i = 0;. 
ae60: 20 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20       lineno++;. 
ae70: 20 20 20 20 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20       azCol[0] = 
ae80: 7a 4c 69 6e 65 3b 0a 20 20 20 20 20 20 66 6f 72  zLine;.      for
ae90: 28 69 3d 30 2c 20 7a 3d 7a 4c 69 6e 65 3b 20 2a  (i=0, z=zLine; *
aea0: 7a 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  z; z++){.       
aeb0: 20 69 66 28 20 2a 7a 3d 3d 7a 53 65 70 5b 30 5d   if( *z==zSep[0]
aec0: 20 26 26 20 73 74 72 6e 63 6d 70 28 7a 2c 20 7a   && strncmp(z, z
aed0: 53 65 70 2c 20 6e 53 65 70 29 3d 3d 30 20 29 7b  Sep, nSep)==0 ){
aee0: 0a 20 20 20 20 20 20 20 20 20 20 2a 7a 20 3d 20  .          *z = 
aef0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 2b 2b  0;.          i++
af00: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
af10: 69 3c 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  i<nCol ){.      
af20: 20 20 20 20 20 20 61 7a 43 6f 6c 5b 69 5d 20 3d        azCol[i] =
af30: 20 26 7a 5b 6e 53 65 70 5d 3b 0a 20 20 20 20 20   &z[nSep];.     
af40: 20 20 20 20 20 20 20 7a 20 2b 3d 20 6e 53 65 70         z += nSep
af50: 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  -1;.          }.
af60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
af70: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 2b 31 21  }.      if( i+1!
af80: 3d 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  =nCol ){.       
af90: 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20   char *zErr;.   
afa0: 20 20 20 20 20 69 6e 74 20 6e 45 72 72 20 3d 20       int nErr = 
afb0: 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29 20 2b 20  strlen(zFile) + 
afc0: 32 30 30 3b 0a 20 20 20 20 20 20 20 20 7a 45 72  200;.        zEr
afd0: 72 20 3d 20 6d 61 6c 6c 6f 63 28 6e 45 72 72 29  r = malloc(nErr)
afe0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 45  ;.        if( zE
aff0: 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rr ){.          
b000: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
b010: 28 6e 45 72 72 2c 20 7a 45 72 72 2c 0a 20 20 20  (nErr, zErr,.   
b020: 20 20 20 20 20 20 20 20 20 20 22 45 72 72 6f 72            "Error
b030: 3a 20 25 73 20 6c 69 6e 65 20 25 64 3a 20 65 78  : %s line %d: ex
b040: 70 65 63 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e  pected %d column
b050: 73 20 6f 66 20 64 61 74 61 20 62 75 74 20 66 6f  s of data but fo
b060: 75 6e 64 20 25 64 22 2c 0a 20 20 20 20 20 20 20  und %d",.       
b070: 20 20 20 20 20 20 7a 46 69 6c 65 2c 20 6c 69 6e        zFile, lin
b080: 65 6e 6f 2c 20 6e 43 6f 6c 2c 20 69 2b 31 29 3b  eno, nCol, i+1);
b090: 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 41  .          Tcl_A
b0a0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
b0b0: 72 70 2c 20 7a 45 72 72 2c 20 30 29 3b 0a 20 20  rp, zErr, 0);.  
b0c0: 20 20 20 20 20 20 20 20 66 72 65 65 28 7a 45 72          free(zEr
b0d0: 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
b0e0: 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20        zCommit = 
b0f0: 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20  "ROLLBACK";.    
b100: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b110: 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30   }.      for(i=0
b120: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
b130: 20 20 20 20 20 20 20 20 2f 2a 20 63 68 65 63 6b          /* check
b140: 20 66 6f 72 20 6e 75 6c 6c 20 64 61 74 61 2c 20   for null data, 
b150: 69 66 20 73 6f 2c 20 62 69 6e 64 20 61 73 20 6e  if so, bind as n
b160: 75 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ull */.        i
b170: 66 20 28 28 6e 4e 75 6c 6c 3e 30 20 26 26 20 73  f ((nNull>0 && s
b180: 74 72 63 6d 70 28 61 7a 43 6f 6c 5b 69 5d 2c 20  trcmp(azCol[i], 
b190: 7a 4e 75 6c 6c 29 3d 3d 30 29 20 7c 7c 20 73 74  zNull)==0) || st
b1a0: 72 6c 65 6e 28 61 7a 43 6f 6c 5b 69 5d 29 3d 3d  rlen(azCol[i])==
b1b0: 30 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0) {.          s
b1c0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c  qlite3_bind_null
b1d0: 28 70 53 74 6d 74 2c 20 69 2b 31 29 3b 0a 20 20  (pStmt, i+1);.  
b1e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
b1f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
b200: 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  ind_text(pStmt, 
b210: 69 2b 31 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 20 2d  i+1, azCol[i], -
b220: 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  1, SQLITE_STATIC
b230: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
b240: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
b250: 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a  e3_step(pStmt);.
b260: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
b270: 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b  e3_reset(pStmt);
b280: 0a 20 20 20 20 20 20 66 72 65 65 28 7a 4c 69 6e  .      free(zLin
b290: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
b2a0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
b2b0: 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
b2c0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22  dResult(interp,"
b2d0: 45 72 72 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65  Error: ", sqlite
b2e0: 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
b2f0: 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7a  ), 0);.        z
b300: 43 6f 6d 6d 69 74 20 3d 20 22 52 4f 4c 4c 42 41  Commit = "ROLLBA
b310: 43 4b 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65  CK";.        bre
b320: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
b330: 7d 0a 20 20 20 20 66 72 65 65 28 61 7a 43 6f 6c  }.    free(azCol
b340: 29 3b 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e  );.    fclose(in
b350: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
b360: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
b370: 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65      (void)sqlite
b380: 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20  3_exec(pDb->db, 
b390: 7a 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 2c 20 30  zCommit, 0, 0, 0
b3a0: 29 3b 0a 0a 20 20 20 20 69 66 28 20 7a 43 6f 6d  );..    if( zCom
b3b0: 6d 69 74 5b 30 5d 20 3d 3d 20 27 43 27 20 29 7b  mit[0] == 'C' ){
b3c0: 0a 20 20 20 20 20 20 2f 2a 20 73 75 63 63 65 73  .      /* succes
b3d0: 73 2c 20 73 65 74 20 72 65 73 75 6c 74 20 61 73  s, set result as
b3e0: 20 6e 75 6d 62 65 72 20 6f 66 20 6c 69 6e 65 73   number of lines
b3f0: 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20   processed */.  
b400: 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63      pResult = Tc
b410: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_GetObjResult(i
b420: 6e 74 65 72 70 29 3b 0a 20 20 20 20 20 20 54 63  nterp);.      Tc
b430: 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52 65 73  l_SetIntObj(pRes
b440: 75 6c 74 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20  ult, lineno);.  
b450: 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b      rc = TCL_OK;
b460: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
b470: 20 20 2f 2a 20 66 61 69 6c 75 72 65 2c 20 61 70    /* failure, ap
b480: 70 65 6e 64 20 6c 69 6e 65 6e 6f 20 77 68 65 72  pend lineno wher
b490: 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20  e failed */.    
b4a0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
b4b0: 74 66 28 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 4e  tf(sizeof(zLineN
b4c0: 75 6d 29 2c 20 7a 4c 69 6e 65 4e 75 6d 2c 22 25  um), zLineNum,"%
b4d0: 64 22 2c 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20  d",lineno);.    
b4e0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
b4f0: 6c 74 28 69 6e 74 65 72 70 2c 22 2c 20 66 61 69  lt(interp,", fai
b500: 6c 65 64 20 77 68 69 6c 65 20 70 72 6f 63 65 73  led while proces
b510: 73 69 6e 67 20 6c 69 6e 65 3a 20 22 2c 7a 4c 69  sing line: ",zLi
b520: 6e 65 4e 75 6d 2c 30 29 3b 0a 20 20 20 20 20 20  neNum,0);.      
b530: 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  rc = TCL_ERROR;.
b540: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
b550: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
b560: 20 20 20 24 64 62 20 65 6e 61 62 6c 65 5f 6c 6f     $db enable_lo
b570: 61 64 5f 65 78 74 65 6e 73 69 6f 6e 20 42 4f 4f  ad_extension BOO
b580: 4c 45 41 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  LEAN.  **.  ** T
b590: 75 72 6e 20 74 68 65 20 65 78 74 65 6e 73 69 6f  urn the extensio
b5a0: 6e 20 6c 6f 61 64 69 6e 67 20 66 65 61 74 75 72  n loading featur
b5b0: 65 20 6f 6e 20 6f 72 20 6f 66 66 2e 20 20 49 74  e on or off.  It
b5c0: 20 69 66 20 6f 66 66 20 62 79 0a 20 20 2a 2a 20   if off by.  ** 
b5d0: 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20  default..  */.  
b5e0: 63 61 73 65 20 44 42 5f 45 4e 41 42 4c 45 5f 4c  case DB_ENABLE_L
b5f0: 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 3a 20 7b  OAD_EXTENSION: {
b600: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
b610: 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
b620: 49 4f 4e 0a 20 20 20 20 69 6e 74 20 6f 6e 6f 66  ION.    int onof
b630: 66 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  f;.    if( objc!
b640: 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =3 ){.      Tcl_
b650: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
b660: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 42  erp, 2, objv, "B
b670: 4f 4f 4c 45 41 4e 22 29 3b 0a 20 20 20 20 20 20  OOLEAN");.      
b680: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
b690: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
b6a0: 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
b6b0: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
b6c0: 6a 76 5b 32 5d 2c 20 26 6f 6e 6f 66 66 29 20 29  jv[2], &onoff) )
b6d0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  {.      return T
b6e0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
b6f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 65 6e 61 62      sqlite3_enab
b700: 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  le_load_extensio
b710: 6e 28 70 44 62 2d 3e 64 62 2c 20 6f 6e 6f 66 66  n(pDb->db, onoff
b720: 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 23 65  );.    break;.#e
b730: 6c 73 65 0a 20 20 20 20 54 63 6c 5f 41 70 70 65  lse.    Tcl_Appe
b740: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
b750: 20 22 65 78 74 65 6e 73 69 6f 6e 20 6c 6f 61 64   "extension load
b760: 69 6e 67 20 69 73 20 74 75 72 6e 65 64 20 6f 66  ing is turned of
b770: 66 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  f at compile-tim
b780: 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e",.            
b790: 20 20 20 20 20 20 20 20 20 30 29 3b 0a 20 20 20           0);.   
b7a0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
b7b0: 52 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20  R;.#endif.  }.. 
b7c0: 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20   /*.  **    $db 
b7d0: 65 72 72 6f 72 63 6f 64 65 0a 20 20 2a 2a 0a 20  errorcode.  **. 
b7e0: 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e   ** Return the n
b7f0: 75 6d 65 72 69 63 20 65 72 72 6f 72 20 63 6f 64  umeric error cod
b800: 65 20 74 68 61 74 20 77 61 73 20 72 65 74 75 72  e that was retur
b810: 6e 65 64 20 62 79 20 74 68 65 20 6d 6f 73 74 20  ned by the most 
b820: 72 65 63 65 6e 74 0a 20 20 2a 2a 20 63 61 6c 6c  recent.  ** call
b830: 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 78 65 63   to sqlite3_exec
b840: 28 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ()..  */.  case 
b850: 44 42 5f 45 52 52 4f 52 43 4f 44 45 3a 20 7b 0a  DB_ERRORCODE: {.
b860: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
b870: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
b880: 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74  _NewIntObj(sqlit
b890: 65 33 5f 65 72 72 63 6f 64 65 28 70 44 62 2d 3e  e3_errcode(pDb->
b8a0: 64 62 29 29 29 3b 0a 20 20 20 20 62 72 65 61 6b  db)));.    break
b8b0: 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 2f 2a 0a 20  ;.  }.   .  /*. 
b8c0: 20 2a 2a 20 20 20 20 24 64 62 20 65 76 61 6c 20   **    $db eval 
b8d0: 24 73 71 6c 20 3f 61 72 72 61 79 3f 20 3f 7b 20  $sql ?array? ?{ 
b8e0: 20 2e 2e 2e 63 6f 64 65 2e 2e 2e 20 7d 3f 0a 20   ...code... }?. 
b8f0: 20 2a 2a 20 20 20 20 24 64 62 20 6f 6e 65 63 6f   **    $db oneco
b900: 6c 75 6d 6e 20 24 73 71 6c 0a 20 20 2a 2a 0a 20  lumn $sql.  **. 
b910: 20 2a 2a 20 54 68 65 20 53 51 4c 20 73 74 61 74   ** The SQL stat
b920: 65 6d 65 6e 74 20 69 6e 20 24 73 71 6c 20 69 73  ement in $sql is
b930: 20 65 76 61 6c 75 61 74 65 64 2e 20 20 46 6f 72   evaluated.  For
b940: 20 65 61 63 68 20 72 6f 77 2c 20 74 68 65 20 76   each row, the v
b950: 61 6c 75 65 73 20 61 72 65 0a 20 20 2a 2a 20 70  alues are.  ** p
b960: 6c 61 63 65 64 20 69 6e 20 65 6c 65 6d 65 6e 74  laced in element
b970: 73 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 6e  s of the array n
b980: 61 6d 65 64 20 22 61 72 72 61 79 22 20 61 6e 64  amed "array" and
b990: 20 2e 2e 2e 63 6f 64 65 2e 2e 2e 20 69 73 20 65   ...code... is e
b9a0: 78 65 63 75 74 65 64 2e 0a 20 20 2a 2a 20 49 66  xecuted..  ** If
b9b0: 20 22 61 72 72 61 79 22 20 61 6e 64 20 22 63 6f   "array" and "co
b9c0: 64 65 22 20 61 72 65 20 6f 6d 69 74 74 65 64 2c  de" are omitted,
b9d0: 20 74 68 65 6e 20 6e 6f 20 63 61 6c 6c 62 61 63   then no callbac
b9e0: 6b 20 69 73 20 65 76 65 72 79 20 69 6e 76 6f 6b  k is every invok
b9f0: 65 64 2e 0a 20 20 2a 2a 20 49 66 20 22 61 72 72  ed..  ** If "arr
ba00: 61 79 22 20 69 73 20 61 6e 20 65 6d 70 74 79 20  ay" is an empty 
ba10: 73 74 72 69 6e 67 2c 20 74 68 65 6e 20 74 68 65  string, then the
ba20: 20 76 61 6c 75 65 73 20 61 72 65 20 70 6c 61 63   values are plac
ba30: 65 64 20 69 6e 20 76 61 72 69 61 62 6c 65 73 0a  ed in variables.
ba40: 20 20 2a 2a 20 74 68 61 74 20 68 61 76 65 20 74    ** that have t
ba50: 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20  he same name as 
ba60: 74 68 65 20 66 69 65 6c 64 73 20 65 78 74 72 61  the fields extra
ba70: 63 74 65 64 20 62 79 20 74 68 65 20 71 75 65 72  cted by the quer
ba80: 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  y..  **.  ** The
ba90: 20 6f 6e 65 63 6f 6c 75 6d 6e 20 6d 65 74 68 6f   onecolumn metho
baa0: 64 20 69 73 20 74 68 65 20 65 71 75 69 76 61 6c  d is the equival
bab0: 65 6e 74 20 6f 66 3a 0a 20 20 2a 2a 20 20 20 20  ent of:.  **    
bac0: 20 6c 69 6e 64 65 78 20 5b 24 64 62 20 65 76 61   lindex [$db eva
bad0: 6c 20 24 73 71 6c 5d 20 30 0a 20 20 2a 2f 0a 20  l $sql] 0.  */. 
bae0: 20 63 61 73 65 20 44 42 5f 4f 4e 45 43 4f 4c 55   case DB_ONECOLU
baf0: 4d 4e 3a 0a 20 20 63 61 73 65 20 44 42 5f 45 56  MN:.  case DB_EV
bb00: 41 4c 3a 0a 20 20 63 61 73 65 20 44 42 5f 45 58  AL:.  case DB_EX
bb10: 49 53 54 53 3a 20 7b 0a 20 20 20 20 63 68 61 72  ISTS: {.    char
bb20: 20 63 6f 6e 73 74 20 2a 7a 53 71 6c 3b 20 20 20   const *zSql;   
bb30: 20 20 20 2f 2a 20 4e 65 78 74 20 53 51 4c 20 73     /* Next SQL s
bb40: 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 78 65 63  tatement to exec
bb50: 75 74 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  ute */.    char 
bb60: 63 6f 6e 73 74 20 2a 7a 4c 65 66 74 3b 20 20 20  const *zLeft;   
bb70: 20 20 2f 2a 20 57 68 61 74 20 69 73 20 6c 65 66    /* What is lef
bb80: 74 20 61 66 74 65 72 20 66 69 72 73 74 20 73 74  t after first st
bb90: 6d 74 20 69 6e 20 7a 53 71 6c 20 2a 2f 0a 20 20  mt in zSql */.  
bba0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
bbb0: 70 53 74 6d 74 3b 20 20 20 2f 2a 20 43 6f 6d 70  pStmt;   /* Comp
bbc0: 69 6c 65 64 20 53 51 4c 20 73 74 61 74 6d 65 6e  iled SQL statmen
bbd0: 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  t */.    Tcl_Obj
bbe0: 20 2a 70 41 72 72 61 79 3b 20 20 20 20 20 20 20   *pArray;       
bbf0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 72 72 61 79  /* Name of array
bc00: 20 69 6e 74 6f 20 77 68 69 63 68 20 72 65 73 75   into which resu
bc10: 6c 74 73 20 61 72 65 20 77 72 69 74 74 65 6e 20  lts are written 
bc20: 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  */.    Tcl_Obj *
bc30: 70 53 63 72 69 70 74 3b 20 20 20 20 20 20 2f 2a  pScript;      /*
bc40: 20 53 63 72 69 70 74 20 74 6f 20 72 75 6e 20 66   Script to run f
bc50: 6f 72 20 65 61 63 68 20 72 65 73 75 6c 74 20 73  or each result s
bc60: 65 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62  et */.    Tcl_Ob
bc70: 6a 20 2a 2a 61 70 50 61 72 6d 3b 20 20 20 20 20  j **apParm;     
bc80: 20 2f 2a 20 50 61 72 61 6d 65 74 65 72 73 20 74   /* Parameters t
bc90: 68 61 74 20 6e 65 65 64 20 61 20 54 63 6c 5f 44  hat need a Tcl_D
bca0: 65 63 72 52 65 66 43 6f 75 6e 74 28 29 20 2a 2f  ecrRefCount() */
bcb0: 0a 20 20 20 20 69 6e 74 20 6e 50 61 72 6d 3b 20  .    int nParm; 
bcc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
bcd0: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
bce0: 20 75 73 65 64 20 69 6e 20 61 70 50 61 72 6d 5b   used in apParm[
bcf0: 5d 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  ] */.    Tcl_Obj
bd00: 20 2a 61 50 61 72 6d 5b 31 30 5d 3b 20 20 20 20   *aParm[10];    
bd10: 2f 2a 20 53 74 61 74 69 63 20 73 70 61 63 65 20  /* Static space 
bd20: 66 6f 72 20 61 70 50 61 72 6d 5b 5d 20 69 6e 20  for apParm[] in 
bd30: 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
bd40: 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  */.    Tcl_Obj *
bd50: 70 52 65 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  pRet;         /*
bd60: 20 56 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74   Value to be ret
bd70: 75 72 6e 65 64 20 2a 2f 0a 20 20 20 20 53 71 6c  urned */.    Sql
bd80: 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70 50  PreparedStmt *pP
bd90: 72 65 53 74 6d 74 3b 20 20 2f 2a 20 50 6f 69 6e  reStmt;  /* Poin
bda0: 74 65 72 20 74 6f 20 61 20 70 72 65 70 61 72 65  ter to a prepare
bdb0: 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  d statement */. 
bdc0: 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20     int rc2;..   
bdd0: 20 69 66 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f   if( choice==DB_
bde0: 45 56 41 4c 20 29 7b 0a 20 20 20 20 20 20 69 66  EVAL ){.      if
bdf0: 28 20 6f 62 6a 63 3c 33 20 7c 7c 20 6f 62 6a 63  ( objc<3 || objc
be00: 3e 35 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  >5 ){.        Tc
be10: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
be20: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
be30: 22 53 51 4c 20 3f 41 52 52 41 59 2d 4e 41 4d 45  "SQL ?ARRAY-NAME
be40: 3f 20 3f 53 43 52 49 50 54 3f 22 29 3b 0a 20 20  ? ?SCRIPT?");.  
be50: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
be60: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
be70: 20 20 20 20 20 20 70 52 65 74 20 3d 20 54 63 6c        pRet = Tcl
be80: 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20 20  _NewObj();.     
be90: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
bea0: 74 28 70 52 65 74 29 3b 0a 20 20 20 20 7d 65 6c  t(pRet);.    }el
beb0: 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 62  se{.      if( ob
bec0: 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20  jc!=3 ){.       
bed0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
bee0: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
bef0: 76 2c 20 22 53 51 4c 22 29 3b 0a 20 20 20 20 20  v, "SQL");.     
bf00: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
bf10: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
bf20: 20 20 20 69 66 28 20 63 68 6f 69 63 65 3d 3d 44     if( choice==D
bf30: 42 5f 45 58 49 53 54 53 20 29 7b 0a 20 20 20 20  B_EXISTS ){.    
bf40: 20 20 20 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e      pRet = Tcl_N
bf50: 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 30 29 3b  ewBooleanObj(0);
bf60: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63  .        Tcl_Inc
bf70: 72 52 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b  rRefCount(pRet);
bf80: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
bf90: 20 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a        pRet = 0;.
bfa0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
bfb0: 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b    if( objc==3 ){
bfc0: 0a 20 20 20 20 20 20 70 41 72 72 61 79 20 3d 20  .      pArray = 
bfd0: 70 53 63 72 69 70 74 20 3d 20 30 3b 0a 20 20 20  pScript = 0;.   
bfe0: 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d   }else if( objc=
bff0: 3d 34 20 29 7b 0a 20 20 20 20 20 20 70 41 72 72  =4 ){.      pArr
c000: 61 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53  ay = 0;.      pS
c010: 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 33 5d 3b  cript = objv[3];
c020: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
c030: 20 20 70 41 72 72 61 79 20 3d 20 6f 62 6a 76 5b    pArray = objv[
c040: 33 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63  3];.      if( Tc
c050: 6c 5f 47 65 74 53 74 72 69 6e 67 28 70 41 72 72  l_GetString(pArr
c060: 61 79 29 5b 30 5d 3d 3d 30 20 29 20 70 41 72 72  ay)[0]==0 ) pArr
c070: 61 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53  ay = 0;.      pS
c080: 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 34 5d 3b  cript = objv[4];
c090: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f  .    }..    Tcl_
c0a0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 6f 62 6a  IncrRefCount(obj
c0b0: 76 5b 32 5d 29 3b 0a 20 20 20 20 7a 53 71 6c 20  v[2]);.    zSql 
c0c0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
c0d0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
c0e0: 30 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72  0);.    while( r
c0f0: 63 3d 3d 54 43 4c 5f 4f 4b 20 26 26 20 7a 53 71  c==TCL_OK && zSq
c100: 6c 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 69 6e  l[0] ){.      in
c110: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
c120: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
c130: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
c140: 20 20 69 6e 74 20 6e 56 61 72 3b 20 20 20 20 20    int nVar;     
c150: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c160: 4e 75 6d 62 65 72 20 6f 66 20 62 69 6e 64 20 70  Number of bind p
c170: 61 72 61 6d 65 74 65 72 73 20 69 6e 20 74 68 65  arameters in the
c180: 20 70 53 74 6d 74 20 2a 2f 0a 20 20 20 20 20 20   pStmt */.      
c190: 69 6e 74 20 6e 43 6f 6c 20 3d 20 2d 31 3b 20 20  int nCol = -1;  
c1a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
c1b0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
c1c0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
c1d0: 74 20 2a 2f 0a 20 20 20 20 20 20 54 63 6c 5f 4f  t */.      Tcl_O
c1e0: 62 6a 20 2a 2a 61 70 43 6f 6c 4e 61 6d 65 20 3d  bj **apColName =
c1f0: 20 30 3b 20 20 20 2f 2a 20 41 72 72 61 79 20 6f   0;   /* Array o
c200: 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a  f column names *
c210: 2f 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b  /.      int len;
c220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c230: 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 6c 65 6e     /* String len
c240: 67 74 68 20 6f 66 20 7a 53 71 6c 20 2a 2f 0a 20  gth of zSql */. 
c250: 20 0a 20 20 20 20 20 20 2f 2a 20 54 72 79 20 74   .      /* Try t
c260: 6f 20 66 69 6e 64 20 61 20 53 51 4c 20 73 74 61  o find a SQL sta
c270: 74 65 6d 65 6e 74 20 74 68 61 74 20 68 61 73 20  tement that has 
c280: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6d  already been com
c290: 70 69 6c 65 64 20 61 6e 64 0a 20 20 20 20 20 20  piled and.      
c2a0: 2a 2a 20 77 68 69 63 68 20 6d 61 74 63 68 65 73  ** which matches
c2b0: 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e   the next sequen
c2c0: 63 65 20 6f 66 20 53 51 4c 2e 0a 20 20 20 20 20  ce of SQL..     
c2d0: 20 2a 2f 0a 20 20 20 20 20 20 70 53 74 6d 74 20   */.      pStmt 
c2e0: 3d 20 30 3b 0a 20 20 20 20 20 20 6c 65 6e 20 3d  = 0;.      len =
c2f0: 20 73 74 72 6c 65 6e 28 7a 53 71 6c 29 3b 0a 20   strlen(zSql);. 
c300: 20 20 20 20 20 66 6f 72 28 70 50 72 65 53 74 6d       for(pPreStm
c310: 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73  t = pDb->stmtLis
c320: 74 3b 20 70 50 72 65 53 74 6d 74 3b 20 70 50 72  t; pPreStmt; pPr
c330: 65 53 74 6d 74 3d 70 50 72 65 53 74 6d 74 2d 3e  eStmt=pPreStmt->
c340: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
c350: 69 6e 74 20 6e 20 3d 20 70 50 72 65 53 74 6d 74  int n = pPreStmt
c360: 2d 3e 6e 53 71 6c 3b 0a 20 20 20 20 20 20 20 20  ->nSql;.        
c370: 69 66 28 20 6c 65 6e 3e 3d 6e 20 0a 20 20 20 20  if( len>=n .    
c380: 20 20 20 20 20 20 20 20 26 26 20 6d 65 6d 63 6d          && memcm
c390: 70 28 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c  p(pPreStmt->zSql
c3a0: 2c 20 7a 53 71 6c 2c 20 6e 29 3d 3d 30 0a 20 20  , zSql, n)==0.  
c3b0: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 7a 53            && (zS
c3c0: 71 6c 5b 6e 5d 3d 3d 30 20 7c 7c 20 7a 53 71 6c  ql[n]==0 || zSql
c3d0: 5b 6e 2d 31 5d 3d 3d 27 3b 27 29 0a 20 20 20 20  [n-1]==';').    
c3e0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
c3f0: 20 70 53 74 6d 74 20 3d 20 70 50 72 65 53 74 6d   pStmt = pPreStm
c400: 74 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20 20 20  t->pStmt;.      
c410: 20 20 20 20 7a 4c 65 66 74 20 3d 20 26 7a 53 71      zLeft = &zSq
c420: 6c 5b 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c  l[pPreStmt->nSql
c430: 5d 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  ];..          /*
c440: 20 57 68 65 6e 20 61 20 70 72 65 70 61 72 65 64   When a prepared
c450: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 66 6f   statement is fo
c460: 75 6e 64 2c 20 75 6e 6c 69 6e 6b 20 69 74 20 66  und, unlink it f
c470: 72 6f 6d 20 74 68 65 0a 20 20 20 20 20 20 20 20  rom the.        
c480: 20 20 2a 2a 20 63 61 63 68 65 20 6c 69 73 74 2e    ** cache list.
c490: 20 20 49 74 20 77 69 6c 6c 20 6c 61 74 65 72 20    It will later 
c4a0: 62 65 20 61 64 64 65 64 20 62 61 63 6b 20 74 6f  be added back to
c4b0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20   the beginning. 
c4c0: 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74           ** of t
c4d0: 68 65 20 63 61 63 68 65 20 6c 69 73 74 20 69 6e  he cache list in
c4e0: 20 6f 72 64 65 72 20 74 6f 20 69 6d 70 6c 65 6d   order to implem
c4f0: 65 6e 74 20 4c 52 55 20 72 65 70 6c 61 63 65 6d  ent LRU replacem
c500: 65 6e 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ent..          *
c510: 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
c520: 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 20  pPreStmt->pPrev 
c530: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
c540: 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 2d 3e  PreStmt->pPrev->
c550: 70 4e 65 78 74 20 3d 20 70 50 72 65 53 74 6d 74  pNext = pPreStmt
c560: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
c570: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c580: 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c        pDb->stmtL
c590: 69 73 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e  ist = pPreStmt->
c5a0: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
c5b0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
c5c0: 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74   pPreStmt->pNext
c5d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
c5e0: 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 2d  pPreStmt->pNext-
c5f0: 3e 70 50 72 65 76 20 3d 20 70 50 72 65 53 74 6d  >pPrev = pPreStm
c600: 74 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20  t->pPrev;.      
c610: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c620: 20 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74         pDb->stmt
c630: 4c 61 73 74 20 3d 20 70 50 72 65 53 74 6d 74 2d  Last = pPreStmt-
c640: 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20 20 20  >pPrev;.        
c650: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 44    }.          pD
c660: 62 2d 3e 6e 53 74 6d 74 2d 2d 3b 0a 20 20 20 20  b->nStmt--;.    
c670: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c680: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
c690: 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f   .      /* If no
c6a0: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
c6b0: 65 6e 74 20 77 61 73 20 66 6f 75 6e 64 2e 20 20  ent was found.  
c6c0: 43 6f 6d 70 69 6c 65 20 74 68 65 20 53 51 4c 20  Compile the SQL 
c6d0: 74 65 78 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  text.      */.  
c6e0: 20 20 20 20 69 66 28 20 70 53 74 6d 74 3d 3d 30      if( pStmt==0
c6f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
c700: 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
c710: 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 44  e3_prepare_v2(pD
c720: 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  b->db, zSql, -1,
c730: 20 26 70 53 74 6d 74 2c 20 26 7a 4c 65 66 74 29   &pStmt, &zLeft)
c740: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63   ){.          Tc
c750: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
c760: 6e 74 65 72 70 2c 20 64 62 54 65 78 74 54 6f 4f  nterp, dbTextToO
c770: 62 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  bj(sqlite3_errms
c780: 67 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20  g(pDb->db)));.  
c790: 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c          rc = TCL
c7a0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
c7b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
c7c0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
c7d0: 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Stmt==0 ){.     
c7e0: 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
c7f0: 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 65 72 72 63  OK!=sqlite3_errc
c800: 6f 64 65 28 70 44 62 2d 3e 64 62 29 20 29 7b 0a  ode(pDb->db) ){.
c810: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
c820: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 65 72   compile-time er
c830: 72 6f 72 20 69 6e 20 74 68 65 20 73 74 61 74 65  ror in the state
c840: 6d 65 6e 74 0a 20 20 20 20 20 20 20 20 20 20 20  ment.           
c850: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
c860: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
c870: 28 69 6e 74 65 72 70 2c 20 64 62 54 65 78 74 54  (interp, dbTextT
c880: 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 72 72  oObj(sqlite3_err
c890: 6d 73 67 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a  msg(pDb->db)));.
c8a0: 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
c8b0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
c8c0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
c8d0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
c8e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
c8f0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73  he statement was
c900: 20 61 20 6e 6f 2d 6f 70 2e 20 20 43 6f 6e 74 69   a no-op.  Conti
c910: 6e 75 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  nue to the next 
c920: 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20  statement.      
c930: 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
c940: 53 51 4c 20 73 74 72 69 6e 67 2e 0a 20 20 20 20  SQL string..    
c950: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
c960: 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 7a 4c         zSql = zL
c970: 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eft;.           
c980: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
c990: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
c9a0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
c9b0: 20 70 50 72 65 53 74 6d 74 3d 3d 30 20 29 3b 0a   pPreStmt==0 );.
c9c0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
c9d0: 2a 20 42 69 6e 64 20 76 61 6c 75 65 73 20 74 6f  * Bind values to
c9e0: 20 70 61 72 61 6d 65 74 65 72 73 20 74 68 61 74   parameters that
c9f0: 20 62 65 67 69 6e 20 77 69 74 68 20 24 20 6f 72   begin with $ or
ca00: 20 3a 0a 20 20 20 20 20 20 2a 2f 20 20 0a 20 20   :.      */  .  
ca10: 20 20 20 20 6e 56 61 72 20 3d 20 73 71 6c 69 74      nVar = sqlit
ca20: 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
ca30: 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a  r_count(pStmt);.
ca40: 20 20 20 20 20 20 6e 50 61 72 6d 20 3d 20 30 3b        nParm = 0;
ca50: 0a 20 20 20 20 20 20 69 66 28 20 6e 56 61 72 3e  .      if( nVar>
ca60: 73 69 7a 65 6f 66 28 61 50 61 72 6d 29 2f 73 69  sizeof(aParm)/si
ca70: 7a 65 6f 66 28 61 50 61 72 6d 5b 30 5d 29 20 29  zeof(aParm[0]) )
ca80: 7b 0a 20 20 20 20 20 20 20 20 61 70 50 61 72 6d  {.        apParm
ca90: 20 3d 20 28 54 63 6c 5f 4f 62 6a 2a 2a 29 54 63   = (Tcl_Obj**)Tc
caa0: 6c 5f 41 6c 6c 6f 63 28 6e 56 61 72 2a 73 69 7a  l_Alloc(nVar*siz
cab0: 65 6f 66 28 61 70 50 61 72 6d 5b 30 5d 29 29 3b  eof(apParm[0]));
cac0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
cad0: 20 20 20 20 20 20 61 70 50 61 72 6d 20 3d 20 61        apParm = a
cae0: 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Parm;.      }.  
caf0: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d      for(i=1; i<=
cb00: 6e 56 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nVar; i++){.    
cb10: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
cb20: 7a 56 61 72 20 3d 20 73 71 6c 69 74 65 33 5f 62  zVar = sqlite3_b
cb30: 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61  ind_parameter_na
cb40: 6d 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20  me(pStmt, i);.  
cb50: 20 20 20 20 20 20 69 66 28 20 7a 56 61 72 21 3d        if( zVar!=
cb60: 30 20 26 26 20 28 7a 56 61 72 5b 30 5d 3d 3d 27  0 && (zVar[0]=='
cb70: 24 27 20 7c 7c 20 7a 56 61 72 5b 30 5d 3d 3d 27  $' || zVar[0]=='
cb80: 3a 27 20 7c 7c 20 7a 56 61 72 5b 30 5d 3d 3d 27  :' || zVar[0]=='
cb90: 40 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  @') ){.         
cba0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 72 20 3d   Tcl_Obj *pVar =
cbb0: 20 54 63 6c 5f 47 65 74 56 61 72 32 45 78 28 69   Tcl_GetVar2Ex(i
cbc0: 6e 74 65 72 70 2c 20 26 7a 56 61 72 5b 31 5d 2c  nterp, &zVar[1],
cbd0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
cbe0: 20 20 69 66 28 20 70 56 61 72 20 29 7b 0a 20 20    if( pVar ){.  
cbf0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b            int n;
cc00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 38 20  .            u8 
cc10: 2a 64 61 74 61 3b 0a 20 20 20 20 20 20 20 20 20  *data;.         
cc20: 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d     char *zType =
cc30: 20 70 56 61 72 2d 3e 74 79 70 65 50 74 72 20 3f   pVar->typePtr ?
cc40: 20 70 56 61 72 2d 3e 74 79 70 65 50 74 72 2d 3e   pVar->typePtr->
cc50: 6e 61 6d 65 20 3a 20 22 22 3b 0a 20 20 20 20 20  name : "";.     
cc60: 20 20 20 20 20 20 20 63 68 61 72 20 63 20 3d 20         char c = 
cc70: 7a 54 79 70 65 5b 30 5d 3b 0a 20 20 20 20 20 20  zType[0];.      
cc80: 20 20 20 20 20 20 69 66 28 20 7a 56 61 72 5b 30        if( zVar[0
cc90: 5d 3d 3d 27 40 27 20 7c 7c 0a 20 20 20 20 20 20  ]=='@' ||.      
cca0: 20 20 20 20 20 20 20 20 20 28 63 3d 3d 27 62 27           (c=='b'
ccb0: 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65   && strcmp(zType
ccc0: 2c 22 62 79 74 65 61 72 72 61 79 22 29 3d 3d 30  ,"bytearray")==0
ccd0: 20 26 26 20 70 56 61 72 2d 3e 62 79 74 65 73 3d   && pVar->bytes=
cce0: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =0) ){.         
ccf0: 20 20 20 20 20 2f 2a 20 4c 6f 61 64 20 61 20 42       /* Load a B
cd00: 4c 4f 42 20 74 79 70 65 20 69 66 20 74 68 65 20  LOB type if the 
cd10: 54 63 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20  Tcl variable is 
cd20: 61 20 62 79 74 65 61 72 72 61 79 20 61 6e 64 0a  a bytearray and.
cd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
cd40: 20 69 74 20 68 61 73 20 6e 6f 20 73 74 72 69 6e   it has no strin
cd50: 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  g representation
cd60: 20 6f 72 20 74 68 65 20 68 6f 73 74 0a 20 20 20   or the host.   
cd70: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61             ** pa
cd80: 72 61 6d 65 74 65 72 20 6e 61 6d 65 20 62 65 67  rameter name beg
cd90: 69 6e 73 20 77 69 74 68 20 22 40 22 2e 20 2a 2f  ins with "@". */
cda0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  .              d
cdb0: 61 74 61 20 3d 20 54 63 6c 5f 47 65 74 42 79 74  ata = Tcl_GetByt
cdc0: 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 70 56  eArrayFromObj(pV
cdd0: 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20  ar, &n);.       
cde0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
cdf0: 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20  ind_blob(pStmt, 
ce00: 69 2c 20 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49  i, data, n, SQLI
ce10: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
ce20: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e            Tcl_In
ce30: 63 72 52 65 66 43 6f 75 6e 74 28 70 56 61 72 29  crRefCount(pVar)
ce40: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
ce50: 61 70 50 61 72 6d 5b 6e 50 61 72 6d 2b 2b 5d 20  apParm[nParm++] 
ce60: 3d 20 70 56 61 72 3b 0a 20 20 20 20 20 20 20 20  = pVar;.        
ce70: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
ce80: 3d 27 62 27 20 26 26 20 73 74 72 63 6d 70 28 7a  ='b' && strcmp(z
ce90: 54 79 70 65 2c 22 62 6f 6f 6c 65 61 6e 22 29 3d  Type,"boolean")=
cea0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
ceb0: 20 20 20 20 54 63 6c 5f 47 65 74 49 6e 74 46 72      Tcl_GetIntFr
cec0: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 56  omObj(interp, pV
ced0: 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20  ar, &n);.       
cee0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
cef0: 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20 69  ind_int(pStmt, i
cf00: 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , n);.          
cf10: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
cf20: 64 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79  d' && strcmp(zTy
cf30: 70 65 2c 22 64 6f 75 62 6c 65 22 29 3d 3d 30 20  pe,"double")==0 
cf40: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
cf50: 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20 20   double r;.     
cf60: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74           Tcl_Get
cf70: 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e  DoubleFromObj(in
cf80: 74 65 72 70 2c 20 70 56 61 72 2c 20 26 72 29 3b  terp, pVar, &r);
cf90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
cfa0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62  qlite3_bind_doub
cfb0: 6c 65 28 70 53 74 6d 74 2c 20 69 2c 20 72 29 3b  le(pStmt, i, r);
cfc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
cfd0: 73 65 20 69 66 28 20 28 63 3d 3d 27 77 27 20 26  se if( (c=='w' &
cfe0: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
cff0: 77 69 64 65 49 6e 74 22 29 3d 3d 30 29 20 7c 7c  wideInt")==0) ||
d000: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d010: 20 20 20 28 63 3d 3d 27 69 27 20 26 26 20 73 74     (c=='i' && st
d020: 72 63 6d 70 28 7a 54 79 70 65 2c 22 69 6e 74 22  rcmp(zType,"int"
d030: 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  )==0) ){.       
d040: 20 20 20 20 20 20 20 54 63 6c 5f 57 69 64 65 49         Tcl_WideI
d050: 6e 74 20 76 3b 0a 20 20 20 20 20 20 20 20 20 20  nt v;.          
d060: 20 20 20 20 54 63 6c 5f 47 65 74 57 69 64 65 49      Tcl_GetWideI
d070: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
d080: 2c 20 70 56 61 72 2c 20 26 76 29 3b 0a 20 20 20  , pVar, &v);.   
d090: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
d0a0: 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53  e3_bind_int64(pS
d0b0: 74 6d 74 2c 20 69 2c 20 76 29 3b 0a 20 20 20 20  tmt, i, v);.    
d0c0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
d0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
d0e0: 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  a = (unsigned ch
d0f0: 61 72 20 2a 29 54 63 6c 5f 47 65 74 53 74 72 69  ar *)Tcl_GetStri
d100: 6e 67 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20  ngFromObj(pVar, 
d110: 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  &n);.           
d120: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
d130: 74 65 78 74 28 70 53 74 6d 74 2c 20 69 2c 20 28  text(pStmt, i, (
d140: 63 68 61 72 20 2a 29 64 61 74 61 2c 20 6e 2c 20  char *)data, n, 
d150: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
d160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
d170: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
d180: 56 61 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Var);.          
d190: 20 20 20 20 61 70 50 61 72 6d 5b 6e 50 61 72 6d      apParm[nParm
d1a0: 2b 2b 5d 20 3d 20 70 56 61 72 3b 0a 20 20 20 20  ++] = pVar;.    
d1b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d1c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d1d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
d1e0: 69 6e 64 5f 6e 75 6c 6c 28 20 70 53 74 6d 74 2c  ind_null( pStmt,
d1f0: 20 69 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20   i );.          
d200: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
d210: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45 78    }..      /* Ex
d220: 65 63 75 74 65 20 74 68 65 20 53 51 4c 0a 20 20  ecute the SQL.  
d230: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 77 68 69      */.      whi
d240: 6c 65 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 26  le( rc==TCL_OK &
d250: 26 20 70 53 74 6d 74 20 26 26 20 53 51 4c 49 54  & pStmt && SQLIT
d260: 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
d270: 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 0a 09  tep(pStmt) ){...
d280: 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 75 6d  /* Compute colum
d290: 6e 20 6e 61 6d 65 73 2e 20 54 68 69 73 20 6d 75  n names. This mu
d2a0: 73 74 20 62 65 20 64 6f 6e 65 20 61 66 74 65 72  st be done after
d2b0: 20 74 68 65 20 66 69 72 73 74 20 73 75 63 63 65   the first succe
d2c0: 73 73 66 75 6c 0a 09 2a 2a 20 63 61 6c 6c 20 74  ssful..** call t
d2d0: 6f 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  o sqlite3_step()
d2e0: 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 71 75  , in case the qu
d2f0: 65 72 79 20 69 73 20 72 65 63 6f 6d 70 69 6c 65  ery is recompile
d300: 64 20 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20  d and the.      
d310: 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 72 20 6e    ** number or n
d320: 61 6d 65 73 20 6f 66 20 74 68 65 20 72 65 74 75  ames of the retu
d330: 72 6e 65 64 20 63 6f 6c 75 6d 6e 73 20 63 68 61  rned columns cha
d340: 6e 67 65 73 2e 20 0a 20 20 20 20 20 20 20 20 2a  nges. .        *
d350: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
d360: 28 21 70 41 72 72 61 79 7c 7c 70 53 63 72 69 70  (!pArray||pScrip
d370: 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28  t);.        if (
d380: 6e 43 6f 6c 20 3c 20 30 29 20 7b 0a 20 20 20 20  nCol < 0) {.    
d390: 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a        Tcl_Obj **
d3a0: 2a 61 70 20 3d 20 28 70 53 63 72 69 70 74 3f 26  *ap = (pScript?&
d3b0: 61 70 43 6f 6c 4e 61 6d 65 3a 30 29 3b 0a 20 20  apColName:0);.  
d3c0: 20 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 63          nCol = c
d3d0: 6f 6d 70 75 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  omputeColumnName
d3e0: 73 28 69 6e 74 65 72 70 2c 20 70 53 74 6d 74 2c  s(interp, pStmt,
d3f0: 20 61 70 2c 20 70 41 72 72 61 79 29 3b 0a 20 20   ap, pArray);.  
d400: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
d410: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
d420: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
d430: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b    Tcl_Obj *pVal;
d440: 0a 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20  .          .    
d450: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 70 56 61        /* Set pVa
d460: 6c 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  l to contain the
d470: 20 69 27 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20   i'th column of 
d480: 74 68 69 73 20 72 6f 77 2e 20 2a 2f 0a 20 20 20  this row. */.   
d490: 20 20 20 20 20 20 20 73 77 69 74 63 68 28 20 73         switch( s
d4a0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79  qlite3_column_ty
d4b0: 70 65 28 70 53 74 6d 74 2c 20 69 29 20 29 7b 0a  pe(pStmt, i) ){.
d4c0: 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65              case
d4d0: 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a   SQLITE_BLOB: {.
d4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
d4f0: 74 20 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65  t bytes = sqlite
d500: 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70  3_column_bytes(p
d510: 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Stmt, i);.      
d520: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
d530: 61 72 20 2a 7a 42 6c 6f 62 20 3d 20 73 71 6c 69  ar *zBlob = sqli
d540: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28  te3_column_blob(
d550: 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20  pStmt, i);.     
d560: 20 20 20 20 20 20 20 20 20 69 66 28 20 21 7a 42           if( !zB
d570: 6c 6f 62 20 29 20 62 79 74 65 73 20 3d 20 30 3b  lob ) bytes = 0;
d580: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
d590: 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74  Val = Tcl_NewByt
d5a0: 65 41 72 72 61 79 4f 62 6a 28 28 75 38 2a 29 7a  eArrayObj((u8*)z
d5b0: 42 6c 6f 62 2c 20 62 79 74 65 73 29 3b 0a 20 20  Blob, bytes);.  
d5c0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
d5d0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
d5e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73  .            cas
d5f0: 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  e SQLITE_INTEGER
d600: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  : {.            
d610: 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 76    sqlite_int64 v
d620: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
d630: 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 69  n_int64(pStmt, i
d640: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
d650: 20 69 66 28 20 76 3e 3d 2d 32 31 34 37 34 38 33   if( v>=-2147483
d660: 36 34 37 20 26 26 20 76 3c 3d 32 31 34 37 34 38  647 && v<=214748
d670: 33 36 34 37 20 29 7b 0a 20 20 20 20 20 20 20 20  3647 ){.        
d680: 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54          pVal = T
d690: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 76 29 3b  cl_NewIntObj(v);
d6a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
d6b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
d6c0: 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c        pVal = Tcl
d6d0: 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 76  _NewWideIntObj(v
d6e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
d6f0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
d700: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
d710: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
d720: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c    case SQLITE_FL
d730: 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  OAT: {.         
d740: 20 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20       double r = 
d750: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
d760: 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20 69 29 3b  ouble(pStmt, i);
d770: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
d780: 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 44 6f 75  Val = Tcl_NewDou
d790: 62 6c 65 4f 62 6a 28 72 29 3b 0a 20 20 20 20 20  bleObj(r);.     
d7a0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
d7b0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
d7c0: 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53            case S
d7d0: 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20  QLITE_NULL: {.  
d7e0: 20 20 20 20 20 20 20 20 20 20 20 20 70 56 61 6c              pVal
d7f0: 20 3d 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 70   = dbTextToObj(p
d800: 44 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20  Db->zNull);.    
d810: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
d820: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
d830: 20 20 20 20 20 20 20 20 20 20 20 64 65 66 61 75             defau
d840: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  lt: {.          
d850: 20 20 20 20 70 56 61 6c 20 3d 20 64 62 54 65 78      pVal = dbTex
d860: 74 54 6f 4f 62 6a 28 28 63 68 61 72 20 2a 29 73  tToObj((char *)s
d870: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
d880: 78 74 28 70 53 74 6d 74 2c 20 69 29 29 3b 0a 20  xt(pStmt, i));. 
d890: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
d8a0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
d8b0: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
d8c0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
d8d0: 53 63 72 69 70 74 20 29 7b 0a 20 20 20 20 20 20  Script ){.      
d8e0: 20 20 20 20 20 20 69 66 28 20 70 41 72 72 61 79        if( pArray
d8f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
d900: 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56       Tcl_ObjSetV
d910: 61 72 32 28 69 6e 74 65 72 70 2c 20 61 70 43 6f  ar2(interp, apCo
d920: 6c 4e 61 6d 65 5b 69 5d 2c 20 30 2c 20 70 56 61  lName[i], 0, pVa
d930: 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  l, 0);.         
d940: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d950: 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53          Tcl_ObjS
d960: 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 70  etVar2(interp, p
d970: 41 72 72 61 79 2c 20 61 70 43 6f 6c 4e 61 6d 65  Array, apColName
d980: 5b 69 5d 2c 20 70 56 61 6c 2c 20 30 29 3b 0a 20  [i], pVal, 0);. 
d990: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
d9a0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
d9b0: 20 63 68 6f 69 63 65 3d 3d 44 42 5f 4f 4e 45 43   choice==DB_ONEC
d9c0: 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20  OLUMN ){.       
d9d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65       assert( pRe
d9e0: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t==0 );.        
d9f0: 20 20 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20      if( pRet==0 
da00: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
da10: 20 70 52 65 74 20 3d 20 70 56 61 6c 3b 0a 20 20   pRet = pVal;.  
da20: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
da30: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 52 65  IncrRefCount(pRe
da40: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
da50: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  }.            rc
da60: 20 3d 20 54 43 4c 5f 42 52 45 41 4b 3b 0a 20 20   = TCL_BREAK;.  
da70: 20 20 20 20 20 20 20 20 20 20 69 20 3d 20 6e 43            i = nC
da80: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ol;.          }e
da90: 6c 73 65 20 69 66 28 20 63 68 6f 69 63 65 3d 3d  lse if( choice==
daa0: 44 42 5f 45 58 49 53 54 53 20 29 7b 0a 20 20 20  DB_EXISTS ){.   
dab0: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63           Tcl_Dec
dac0: 72 52 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b  rRefCount(pRet);
dad0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52 65  .            pRe
dae0: 74 20 3d 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65  t = Tcl_NewBoole
daf0: 61 6e 4f 62 6a 28 31 29 3b 0a 20 20 20 20 20 20  anObj(1);.      
db00: 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65        Tcl_IncrRe
db10: 66 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20  fCount(pRet);.  
db20: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 54            rc = T
db30: 43 4c 5f 42 52 45 41 4b 3b 0a 20 20 20 20 20 20  CL_BREAK;.      
db40: 20 20 20 20 20 20 69 20 3d 20 6e 43 6f 6c 3b 0a        i = nCol;.
db50: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
db60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c  .            Tcl
db70: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
db80: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52  ement(interp, pR
db90: 65 74 2c 20 70 56 61 6c 29 3b 0a 20 20 20 20 20  et, pVal);.     
dba0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
dbb0: 0a 20 20 0a 20 20 20 20 20 20 20 20 69 66 28 20  .  .        if( 
dbc0: 70 53 63 72 69 70 74 20 29 7b 0a 20 20 20 20 20  pScript ){.     
dbd0: 20 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 45 76       rc = Tcl_Ev
dbe0: 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20  alObjEx(interp, 
dbf0: 70 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20 20  pScript, 0);.   
dc00: 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 54         if( rc==T
dc10: 43 4c 5f 43 4f 4e 54 49 4e 55 45 20 29 7b 0a 20  CL_CONTINUE ){. 
dc20: 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
dc30: 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  TCL_OK;.        
dc40: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
dc50: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
dc60: 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20 29 7b  rc==TCL_BREAK ){
dc70: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 43  .        rc = TC
dc80: 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  L_OK;.      }.. 
dc90: 20 20 20 20 20 2f 2a 20 46 72 65 65 20 74 68 65       /* Free the
dca0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6f 62 6a   column name obj
dcb0: 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 66  ects */.      if
dcc0: 28 20 70 53 63 72 69 70 74 20 29 7b 0a 20 20 20  ( pScript ){.   
dcd0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 71       /* If the q
dce0: 75 65 72 79 20 72 65 74 75 72 6e 65 64 20 6e 6f  uery returned no
dcf0: 20 72 6f 77 73 2c 20 62 75 74 20 61 6e 20 61 72   rows, but an ar
dd00: 72 61 79 20 76 61 72 69 61 62 6c 65 20 77 61 73  ray variable was
dd10: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 70 65   .        ** spe
dd20: 63 69 66 69 65 64 2c 20 63 61 6c 6c 20 63 6f 6d  cified, call com
dd30: 70 75 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  puteColumnNames(
dd40: 29 20 6e 6f 77 20 74 6f 20 70 6f 70 75 6c 61 74  ) now to populat
dd50: 65 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  e the .        *
dd60: 2a 20 61 72 72 61 79 6e 61 6d 65 28 2a 29 20 76  * arrayname(*) v
dd70: 61 72 69 61 62 6c 65 2e 0a 20 20 20 20 20 20 20  ariable..       
dd80: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 20 28   */.        if (
dd90: 70 41 72 72 61 79 20 26 26 20 6e 43 6f 6c 20 3c  pArray && nCol <
dda0: 20 30 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20   0) {.          
ddb0: 54 63 6c 5f 4f 62 6a 20 2a 2a 2a 61 70 20 3d 20  Tcl_Obj ***ap = 
ddc0: 28 70 53 63 72 69 70 74 3f 26 61 70 43 6f 6c 4e  (pScript?&apColN
ddd0: 61 6d 65 3a 30 29 3b 0a 20 20 20 20 20 20 20 20  ame:0);.        
dde0: 20 20 6e 43 6f 6c 20 3d 20 63 6f 6d 70 75 74 65    nCol = compute
ddf0: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 69 6e 74 65  ColumnNames(inte
de00: 72 70 2c 20 70 53 74 6d 74 2c 20 61 70 2c 20 70  rp, pStmt, ap, p
de10: 41 72 72 61 79 29 3b 0a 20 20 20 20 20 20 20 20  Array);.        
de20: 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  }.        for(i=
de30: 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
de40: 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 44  .          Tcl_D
de50: 65 63 72 52 65 66 43 6f 75 6e 74 28 61 70 43 6f  ecrRefCount(apCo
de60: 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 20  lName[i]);.     
de70: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54 63 6c     }.        Tcl
de80: 5f 46 72 65 65 28 28 63 68 61 72 2a 29 61 70 43  _Free((char*)apC
de90: 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  olName);.      }
dea0: 0a 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20  ..      /* Free 
deb0: 74 68 65 20 62 6f 75 6e 64 20 73 74 72 69 6e 67  the bound string
dec0: 20 61 6e 64 20 62 6c 6f 62 20 70 61 72 61 6d 65   and blob parame
ded0: 74 65 72 73 20 2a 2f 0a 20 20 20 20 20 20 66 6f  ters */.      fo
dee0: 72 28 69 3d 30 3b 20 69 3c 6e 50 61 72 6d 3b 20  r(i=0; i<nParm; 
def0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 54 63  i++){.        Tc
df00: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 61  l_DecrRefCount(a
df10: 70 50 61 72 6d 5b 69 5d 29 3b 0a 20 20 20 20 20  pParm[i]);.     
df20: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 70 50   }.      if( apP
df30: 61 72 6d 21 3d 61 50 61 72 6d 20 29 7b 0a 20 20  arm!=aParm ){.  
df40: 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28        Tcl_Free((
df50: 63 68 61 72 2a 29 61 70 50 61 72 6d 29 3b 0a 20  char*)apParm);. 
df60: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
df70: 20 52 65 73 65 74 20 74 68 65 20 73 74 61 74 65   Reset the state
df80: 6d 65 6e 74 2e 20 20 49 66 20 74 68 65 20 72 65  ment.  If the re
df90: 73 75 6c 74 20 63 6f 64 65 20 69 73 20 53 51 4c  sult code is SQL
dfa0: 49 54 45 5f 53 43 48 45 4d 41 2c 20 74 68 65 6e  ITE_SCHEMA, then
dfb0: 0a 20 20 20 20 20 20 2a 2a 20 66 6c 75 73 68 20  .      ** flush 
dfc0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 63 61  the statement ca
dfd0: 63 68 65 20 61 6e 64 20 74 72 79 20 74 68 65 20  che and try the 
dfe0: 73 74 61 74 65 6d 65 6e 74 20 61 67 61 69 6e 2e  statement again.
dff0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
e000: 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  rc2 = sqlite3_re
e010: 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  set(pStmt);.    
e020: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
e030: 3d 72 63 32 20 29 7b 0a 20 20 20 20 20 20 20 20  =rc2 ){.        
e040: 2f 2a 20 49 66 20 61 20 72 75 6e 2d 74 69 6d 65  /* If a run-time
e050: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
e060: 65 70 6f 72 74 20 74 68 65 20 65 72 72 6f 72 20  eport the error 
e070: 61 6e 64 20 73 74 6f 70 20 72 65 61 64 69 6e 67  and stop reading
e080: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
e090: 53 51 4c 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  SQL.        */. 
e0a0: 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62         Tcl_SetOb
e0b0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
e0c0: 64 62 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69  dbTextToObj(sqli
e0d0: 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
e0e0: 64 62 29 29 29 3b 0a 20 20 20 20 20 20 20 20 73  db)));.        s
e0f0: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
e100: 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  pStmt);.        
e110: 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  rc = TCL_ERROR;.
e120: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65          if( pPre
e130: 53 74 6d 74 20 29 20 54 63 6c 5f 46 72 65 65 28  Stmt ) Tcl_Free(
e140: 28 63 68 61 72 2a 29 70 50 72 65 53 74 6d 74 29  (char*)pPreStmt)
e150: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
e160: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
e170: 20 70 44 62 2d 3e 6d 61 78 53 74 6d 74 3c 3d 30   pDb->maxStmt<=0
e180: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
e190: 66 20 74 68 65 20 63 61 63 68 65 20 69 73 20 74  f the cache is t
e1a0: 75 72 6e 65 64 20 6f 66 66 2c 20 64 65 61 6c 6c  urned off, deall
e1b0: 6f 63 61 74 65 64 20 74 68 65 20 73 74 61 74 65  ocated the state
e1c0: 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  ment */.        
e1d0: 69 66 28 20 70 50 72 65 53 74 6d 74 20 29 20 54  if( pPreStmt ) T
e1e0: 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70  cl_Free((char*)p
e1f0: 50 72 65 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  PreStmt);.      
e200: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
e210: 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ze(pStmt);.     
e220: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e230: 2f 2a 20 45 76 65 72 79 74 68 69 6e 67 20 77 6f  /* Everything wo
e240: 72 6b 65 64 20 61 6e 64 20 74 68 65 20 63 61 63  rked and the cac
e250: 68 65 20 69 73 20 6f 70 65 72 61 74 69 6f 6e 61  he is operationa
e260: 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 43 72  l..        ** Cr
e270: 65 61 74 65 20 61 20 6e 65 77 20 53 71 6c 50 72  eate a new SqlPr
e280: 65 70 61 72 65 64 53 74 6d 74 20 73 74 72 75 63  eparedStmt struc
e290: 74 75 72 65 20 69 66 20 77 65 20 6e 65 65 64 20  ture if we need 
e2a0: 6f 6e 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  one..        ** 
e2b0: 28 49 66 20 77 65 20 61 6c 72 65 61 64 79 20 68  (If we already h
e2c0: 61 76 65 20 6f 6e 65 20 77 65 20 63 61 6e 20 6a  ave one we can j
e2d0: 75 73 74 20 72 65 75 73 65 20 69 74 2e 29 0a 20  ust reuse it.). 
e2e0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
e2f0: 20 20 69 66 28 20 70 50 72 65 53 74 6d 74 3d 3d    if( pPreStmt==
e300: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c  0 ){.          l
e310: 65 6e 20 3d 20 7a 4c 65 66 74 20 2d 20 7a 53 71  en = zLeft - zSq
e320: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 72  l;.          pPr
e330: 65 53 74 6d 74 20 3d 20 28 53 71 6c 50 72 65 70  eStmt = (SqlPrep
e340: 61 72 65 64 53 74 6d 74 2a 29 54 63 6c 5f 41 6c  aredStmt*)Tcl_Al
e350: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 50 72  loc( sizeof(*pPr
e360: 65 53 74 6d 74 29 20 29 3b 0a 20 20 20 20 20 20  eStmt) );.      
e370: 20 20 20 20 69 66 28 20 70 50 72 65 53 74 6d 74      if( pPreStmt
e380: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ==0 ) return TCL
e390: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
e3a0: 20 20 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d    pPreStmt->pStm
e3b0: 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20 20 20 20  t = pStmt;.     
e3c0: 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 6e       pPreStmt->n
e3d0: 53 71 6c 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20  Sql = len;.     
e3e0: 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 7a       pPreStmt->z
e3f0: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 73 71  Sql = sqlite3_sq
e400: 6c 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  l(pStmt);.      
e410: 20 20 20 20 61 73 73 65 72 74 28 20 73 74 72 6c      assert( strl
e420: 65 6e 28 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71  en(pPreStmt->zSq
e430: 6c 29 3d 3d 6c 65 6e 20 29 3b 0a 20 20 20 20 20  l)==len );.     
e440: 20 20 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d       assert( 0==
e450: 6d 65 6d 63 6d 70 28 70 50 72 65 53 74 6d 74 2d  memcmp(pPreStmt-
e460: 3e 7a 53 71 6c 2c 20 7a 53 71 6c 2c 20 6c 65 6e  >zSql, zSql, len
e470: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  ) );.        }..
e480: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
e490: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
e4a0: 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 62 65 67  ement to the beg
e4b0: 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63 61  inning of the ca
e4c0: 63 68 65 20 6c 69 73 74 0a 20 20 20 20 20 20 20  che list.       
e4d0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 50 72 65   */.        pPre
e4e0: 53 74 6d 74 2d 3e 70 4e 65 78 74 20 3d 20 70 44  Stmt->pNext = pD
e4f0: 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 0a 20 20 20  b->stmtList;.   
e500: 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70       pPreStmt->p
e510: 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20  Prev = 0;.      
e520: 20 20 69 66 28 20 70 44 62 2d 3e 73 74 6d 74 4c    if( pDb->stmtL
e530: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ist ){.         
e540: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 2d 3e 70  pDb->stmtList->p
e550: 50 72 65 76 20 3d 20 70 50 72 65 53 74 6d 74 3b  Prev = pPreStmt;
e560: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e570: 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74     pDb->stmtList
e580: 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20 20 20   = pPreStmt;.   
e590: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 73 74       if( pDb->st
e5a0: 6d 74 4c 61 73 74 3d 3d 30 20 29 7b 0a 20 20 20  mtLast==0 ){.   
e5b0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
e5c0: 44 62 2d 3e 6e 53 74 6d 74 3d 3d 30 20 29 3b 0a  Db->nStmt==0 );.
e5d0: 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73            pDb->s
e5e0: 74 6d 74 4c 61 73 74 20 3d 20 70 50 72 65 53 74  tmtLast = pPreSt
e5f0: 6d 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  mt;.        }els
e600: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  e{.          ass
e610: 65 72 74 28 20 70 44 62 2d 3e 6e 53 74 6d 74 3e  ert( pDb->nStmt>
e620: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  0 );.        }. 
e630: 20 20 20 20 20 20 20 70 44 62 2d 3e 6e 53 74 6d         pDb->nStm
e640: 74 2b 2b 3b 0a 20 20 20 0a 20 20 20 20 20 20 20  t++;.   .       
e650: 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20 74   /* If we have t
e660: 6f 6f 20 6d 61 6e 79 20 73 74 61 74 65 6d 65 6e  oo many statemen
e670: 74 20 69 6e 20 63 61 63 68 65 2c 20 72 65 6d 6f  t in cache, remo
e680: 76 65 20 74 68 65 20 73 75 72 70 6c 75 73 20 66  ve the surplus f
e690: 72 6f 6d 20 74 68 65 0a 20 20 20 20 20 20 20 20  rom the.        
e6a0: 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 63 61  ** end of the ca
e6b0: 63 68 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20  che list..      
e6c0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 77 68 69    */.        whi
e6d0: 6c 65 28 20 70 44 62 2d 3e 6e 53 74 6d 74 3e 70  le( pDb->nStmt>p
e6e0: 44 62 2d 3e 6d 61 78 53 74 6d 74 20 29 7b 0a 20  Db->maxStmt ){. 
e6f0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e700: 5f 66 69 6e 61 6c 69 7a 65 28 70 44 62 2d 3e 73  _finalize(pDb->s
e710: 74 6d 74 4c 61 73 74 2d 3e 70 53 74 6d 74 29 3b  tmtLast->pStmt);
e720: 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e  .          pDb->
e730: 73 74 6d 74 4c 61 73 74 20 3d 20 70 44 62 2d 3e  stmtLast = pDb->
e740: 73 74 6d 74 4c 61 73 74 2d 3e 70 50 72 65 76 3b  stmtLast->pPrev;
e750: 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 46  .          Tcl_F
e760: 72 65 65 28 28 63 68 61 72 2a 29 70 44 62 2d 3e  ree((char*)pDb->
e770: 73 74 6d 74 4c 61 73 74 2d 3e 70 4e 65 78 74 29  stmtLast->pNext)
e780: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d  ;.          pDb-
e790: 3e 73 74 6d 74 4c 61 73 74 2d 3e 70 4e 65 78 74  >stmtLast->pNext
e7a0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
e7b0: 70 44 62 2d 3e 6e 53 74 6d 74 2d 2d 3b 0a 20 20  pDb->nStmt--;.  
e7c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
e7d0: 0a 20 20 20 20 20 20 2f 2a 20 50 72 6f 63 65 65  .      /* Procee
e7e0: 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 74  d to the next st
e7f0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20  atement */.     
e800: 20 7a 53 71 6c 20 3d 20 7a 4c 65 66 74 3b 0a 20   zSql = zLeft;. 
e810: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63     }.    Tcl_Dec
e820: 72 52 65 66 43 6f 75 6e 74 28 6f 62 6a 76 5b 32  rRefCount(objv[2
e830: 5d 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 52 65  ]);..    if( pRe
e840: 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72  t ){.      if( r
e850: 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20  c==TCL_OK ){.   
e860: 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52       Tcl_SetObjR
e870: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52  esult(interp, pR
e880: 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  et);.      }.   
e890: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
e8a0: 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20 7d  unt(pRet);.    }
e8b0: 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 54 43 4c  else if( rc==TCL
e8c0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  _OK ){.      Tcl
e8d0: 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74  _ResetResult(int
e8e0: 65 72 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  erp);.    }.    
e8f0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
e900: 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 66 75  .  **     $db fu
e910: 6e 63 74 69 6f 6e 20 4e 41 4d 45 20 53 43 52 49  nction NAME SCRI
e920: 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65  PT.  **.  ** Cre
e930: 61 74 65 20 61 20 6e 65 77 20 53 51 4c 20 66 75  ate a new SQL fu
e940: 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41  nction called NA
e950: 4d 45 2e 20 20 57 68 65 6e 65 76 65 72 20 74 68  ME.  Whenever th
e960: 61 74 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 20  at function is. 
e970: 20 2a 2a 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f   ** called, invo
e980: 6b 65 20 53 43 52 49 50 54 20 74 6f 20 65 76 61  ke SCRIPT to eva
e990: 6c 75 61 74 65 20 74 68 65 20 66 75 6e 63 74 69  luate the functi
e9a0: 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  on..  */.  case 
e9b0: 44 42 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  DB_FUNCTION: {. 
e9c0: 20 20 20 53 71 6c 46 75 6e 63 20 2a 70 46 75 6e     SqlFunc *pFun
e9d0: 63 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  c;.    Tcl_Obj *
e9e0: 70 53 63 72 69 70 74 3b 0a 20 20 20 20 63 68 61  pScript;.    cha
e9f0: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66  r *zName;.    if
ea00: 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  ( objc!=4 ){.   
ea10: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
ea20: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
ea30: 62 6a 76 2c 20 22 4e 41 4d 45 20 53 43 52 49 50  bjv, "NAME SCRIP
ea40: 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  T");.      retur
ea50: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
ea60: 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 54   }.    zName = T
ea70: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
ea80: 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b  Obj(objv[2], 0);
ea90: 0a 20 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f  .    pScript = o
eaa0: 62 6a 76 5b 33 5d 3b 0a 20 20 20 20 70 46 75 6e  bjv[3];.    pFun
eab0: 63 20 3d 20 66 69 6e 64 53 71 6c 46 75 6e 63 28  c = findSqlFunc(
eac0: 70 44 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  pDb, zName);.   
ead0: 20 69 66 28 20 70 46 75 6e 63 3d 3d 30 20 29 20   if( pFunc==0 ) 
eae0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
eaf0: 3b 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d  ;.    if( pFunc-
eb00: 3e 70 53 63 72 69 70 74 20 29 7b 0a 20 20 20 20  >pScript ){.    
eb10: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
eb20: 6e 74 28 70 46 75 6e 63 2d 3e 70 53 63 72 69 70  nt(pFunc->pScrip
eb30: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46  t);.    }.    pF
eb40: 75 6e 63 2d 3e 70 53 63 72 69 70 74 20 3d 20 70  unc->pScript = p
eb50: 53 63 72 69 70 74 3b 0a 20 20 20 20 54 63 6c 5f  Script;.    Tcl_
eb60: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63  IncrRefCount(pSc
eb70: 72 69 70 74 29 3b 0a 20 20 20 20 70 46 75 6e 63  ript);.    pFunc
eb80: 2d 3e 75 73 65 45 76 61 6c 4f 62 6a 76 20 3d 20  ->useEvalObjv = 
eb90: 73 61 66 65 54 6f 55 73 65 45 76 61 6c 4f 62 6a  safeToUseEvalObj
eba0: 76 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70  v(interp, pScrip
ebb0: 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  t);.    rc = sql
ebc0: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
ebd0: 74 69 6f 6e 28 70 44 62 2d 3e 64 62 2c 20 7a 4e  tion(pDb->db, zN
ebe0: 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  ame, -1, SQLITE_
ebf0: 55 54 46 38 2c 0a 20 20 20 20 20 20 20 20 70 46  UTF8,.        pF
ec00: 75 6e 63 2c 20 74 63 6c 53 71 6c 46 75 6e 63 2c  unc, tclSqlFunc,
ec10: 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
ec20: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
ec30: 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f  .      rc = TCL_
ec40: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 54 63 6c  ERROR;.      Tcl
ec50: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
ec60: 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74  p, (char *)sqlit
ec70: 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64  e3_errmsg(pDb->d
ec80: 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45  b), TCL_VOLATILE
ec90: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  );.    }.    bre
eca0: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
ecb0: 2a 2a 20 20 20 20 20 24 64 62 20 69 6e 63 72 62  **     $db incrb
ecc0: 6c 6f 62 20 3f 2d 72 65 61 64 6f 6e 6c 79 3f 20  lob ?-readonly? 
ecd0: 3f 44 42 3f 20 54 41 42 4c 45 20 43 4f 4c 55 4d  ?DB? TABLE COLUM
ece0: 4e 20 52 4f 57 49 44 0a 20 20 2a 2f 0a 20 20 63  N ROWID.  */.  c
ecf0: 61 73 65 20 44 42 5f 49 4e 43 52 42 4c 4f 42 3a  ase DB_INCRBLOB:
ed00: 20 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   {.#ifdef SQLITE
ed10: 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
ed20: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
ed30: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 69 6e 63  ult(interp, "inc
ed40: 72 62 6c 6f 62 20 6e 6f 74 20 61 76 61 69 6c 61  rblob not availa
ed50: 62 6c 65 20 69 6e 20 74 68 69 73 20 62 75 69 6c  ble in this buil
ed60: 64 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  d", 0);.    retu
ed70: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65  rn TCL_ERROR;.#e
ed80: 6c 73 65 0a 20 20 20 20 69 6e 74 20 69 73 52 65  lse.    int isRe
ed90: 61 64 6f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20  adonly = 0;.    
eda0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
edb0: 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 63 6f  = "main";.    co
edc0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65  nst char *zTable
edd0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
ede0: 20 2a 7a 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73   *zColumn;.    s
edf0: 71 6c 69 74 65 5f 69 6e 74 36 34 20 69 52 6f 77  qlite_int64 iRow
ee00: 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
ee10: 66 6f 72 20 74 68 65 20 2d 72 65 61 64 6f 6e 6c  for the -readonl
ee20: 79 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  y option */.    
ee30: 69 66 28 20 6f 62 6a 63 3e 33 20 26 26 20 73 74  if( objc>3 && st
ee40: 72 63 6d 70 28 54 63 6c 5f 47 65 74 53 74 72 69  rcmp(Tcl_GetStri
ee50: 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 22 2d 72  ng(objv[2]), "-r
ee60: 65 61 64 6f 6e 6c 79 22 29 3d 3d 30 20 29 7b 0a  eadonly")==0 ){.
ee70: 20 20 20 20 20 20 69 73 52 65 61 64 6f 6e 6c 79        isReadonly
ee80: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 1;.    }..   
ee90: 20 69 66 28 20 6f 62 6a 63 21 3d 28 35 2b 69 73   if( objc!=(5+is
eea0: 52 65 61 64 6f 6e 6c 79 29 20 26 26 20 6f 62 6a  Readonly) && obj
eeb0: 63 21 3d 28 36 2b 69 73 52 65 61 64 6f 6e 6c 79  c!=(6+isReadonly
eec0: 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  ) ){.      Tcl_W
eed0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
eee0: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 2d  rp, 2, objv, "?-
eef0: 72 65 61 64 6f 6e 6c 79 3f 20 3f 44 42 3f 20 54  readonly? ?DB? T
ef00: 41 42 4c 45 20 43 4f 4c 55 4d 4e 20 52 4f 57 49  ABLE COLUMN ROWI
ef10: 44 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  D");.      retur
ef20: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
ef30: 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63   }..    if( objc
ef40: 3d 3d 28 36 2b 69 73 52 65 61 64 6f 6e 6c 79 29  ==(6+isReadonly)
ef50: 20 29 7b 0a 20 20 20 20 20 20 7a 44 62 20 3d 20   ){.      zDb = 
ef60: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
ef70: 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  jv[2]);.    }.  
ef80: 20 20 7a 54 61 62 6c 65 20 3d 20 54 63 6c 5f 47    zTable = Tcl_G
ef90: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 6f 62  etString(objv[ob
efa0: 6a 63 2d 33 5d 29 3b 0a 20 20 20 20 7a 43 6f 6c  jc-3]);.    zCol
efb0: 75 6d 6e 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  umn = Tcl_GetStr
efc0: 69 6e 67 28 6f 62 6a 76 5b 6f 62 6a 63 2d 32 5d  ing(objv[objc-2]
efd0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 54 63 6c 5f  );.    rc = Tcl_
efe0: 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62  GetWideIntFromOb
eff0: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 6f  j(interp, objv[o
f000: 62 6a 63 2d 31 5d 2c 20 26 69 52 6f 77 29 3b 0a  bjc-1], &iRow);.
f010: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c  .    if( rc==TCL
f020: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
f030: 3d 20 63 72 65 61 74 65 49 6e 63 72 62 6c 6f 62  = createIncrblob
f040: 43 68 61 6e 6e 65 6c 28 0a 20 20 20 20 20 20 20  Channel(.       
f050: 20 20 20 69 6e 74 65 72 70 2c 20 70 44 62 2c 20     interp, pDb, 
f060: 7a 44 62 2c 20 7a 54 61 62 6c 65 2c 20 7a 43 6f  zDb, zTable, zCo
f070: 6c 75 6d 6e 2c 20 69 52 6f 77 2c 20 69 73 52 65  lumn, iRow, isRe
f080: 61 64 6f 6e 6c 79 0a 20 20 20 20 20 20 29 3b 0a  adonly.      );.
f090: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
f0a0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
f0b0: 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 69  *.  **     $db i
f0c0: 6e 74 65 72 72 75 70 74 0a 20 20 2a 2a 0a 20 20  nterrupt.  **.  
f0d0: 2a 2a 20 49 6e 74 65 72 72 75 70 74 20 74 68 65  ** Interrupt the
f0e0: 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68   execution of th
f0f0: 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 53 51 4c  e inner-most SQL
f100: 20 69 6e 74 65 72 70 72 65 74 65 72 2e 20 20 54   interpreter.  T
f110: 68 69 73 0a 20 20 2a 2a 20 63 61 75 73 65 73 20  his.  ** causes 
f120: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
f130: 74 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65  t to return an e
f140: 72 72 6f 72 20 6f 66 20 53 51 4c 49 54 45 5f 49  rror of SQLITE_I
f150: 4e 54 45 52 52 55 50 54 2e 0a 20 20 2a 2f 0a 20  NTERRUPT..  */. 
f160: 20 63 61 73 65 20 44 42 5f 49 4e 54 45 52 52 55   case DB_INTERRU
f170: 50 54 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  PT: {.    sqlite
f180: 33 5f 69 6e 74 65 72 72 75 70 74 28 70 44 62 2d  3_interrupt(pDb-
f190: 3e 64 62 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  >db);.    break;
f1a0: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
f1b0: 20 20 20 20 24 64 62 20 6e 75 6c 6c 76 61 6c 75      $db nullvalu
f1c0: 65 20 3f 53 54 52 49 4e 47 3f 0a 20 20 2a 2a 0a  e ?STRING?.  **.
f1d0: 20 20 2a 2a 20 43 68 61 6e 67 65 20 74 65 78 74    ** Change text
f1e0: 20 75 73 65 64 20 77 68 65 6e 20 61 20 4e 55 4c   used when a NUL
f1f0: 4c 20 63 6f 6d 65 73 20 62 61 63 6b 20 66 72 6f  L comes back fro
f200: 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
f210: 49 66 20 3f 53 54 52 49 4e 47 3f 0a 20 20 2a 2a  If ?STRING?.  **
f220: 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c   is not present,
f230: 20 74 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e   then the curren
f240: 74 20 73 74 72 69 6e 67 20 75 73 65 64 20 66 6f  t string used fo
f250: 72 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  r NULL is return
f260: 65 64 2e 0a 20 20 2a 2a 20 49 66 20 53 54 52 49  ed..  ** If STRI
f270: 4e 47 20 69 73 20 70 72 65 73 65 6e 74 2c 20 74  NG is present, t
f280: 68 65 6e 20 53 54 52 49 4e 47 20 69 73 20 72 65  hen STRING is re
f290: 74 75 72 6e 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  turned..  **.  *
f2a0: 2f 0a 20 20 63 61 73 65 20 44 42 5f 4e 55 4c 4c  /.  case DB_NULL
f2b0: 56 41 4c 55 45 3a 20 7b 0a 20 20 20 20 69 66 28  VALUE: {.    if(
f2c0: 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63   objc!=2 && objc
f2d0: 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=3 ){.      Tcl
f2e0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
f2f0: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
f300: 4e 55 4c 4c 56 41 4c 55 45 22 29 3b 0a 20 20 20  NULLVALUE");.   
f310: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
f320: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
f330: 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20  f( objc==3 ){.  
f340: 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
f350: 20 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c 20 3d     char *zNull =
f360: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
f370: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26  omObj(objv[2], &
f380: 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  len);.      if( 
f390: 70 44 62 2d 3e 7a 4e 75 6c 6c 20 29 7b 0a 20 20  pDb->zNull ){.  
f3a0: 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70        Tcl_Free(p
f3b0: 44 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20  Db->zNull);.    
f3c0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 4e    }.      if( zN
f3d0: 75 6c 6c 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a  ull && len>0 ){.
f3e0: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75          pDb->zNu
f3f0: 6c 6c 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20  ll = Tcl_Alloc( 
f400: 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20  len + 1 );.     
f410: 20 20 20 73 74 72 6e 63 70 79 28 70 44 62 2d 3e     strncpy(pDb->
f420: 7a 4e 75 6c 6c 2c 20 7a 4e 75 6c 6c 2c 20 6c 65  zNull, zNull, le
f430: 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  n);.        pDb-
f440: 3e 7a 4e 75 6c 6c 5b 6c 65 6e 5d 20 3d 20 27 5c  >zNull[len] = '\
f450: 30 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  0';.      }else{
f460: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e  .        pDb->zN
f470: 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ull = 0;.      }
f480: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 53  .    }.    Tcl_S
f490: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
f4a0: 72 70 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a 28  rp, dbTextToObj(
f4b0: 70 44 62 2d 3e 7a 4e 75 6c 6c 29 29 3b 0a 20 20  pDb->zNull));.  
f4c0: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
f4d0: 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20  /*.  **     $db 
f4e0: 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
f4f0: 64 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74  d .  **.  ** Ret
f500: 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77  urn an integer w
f510: 68 69 63 68 20 69 73 20 74 68 65 20 52 4f 57 49  hich is the ROWI
f520: 44 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72  D for the most r
f530: 65 63 65 6e 74 20 69 6e 73 65 72 74 2e 0a 20 20  ecent insert..  
f540: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 4c 41 53  */.  case DB_LAS
f550: 54 5f 49 4e 53 45 52 54 5f 52 4f 57 49 44 3a 20  T_INSERT_ROWID: 
f560: 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  {.    Tcl_Obj *p
f570: 52 65 73 75 6c 74 3b 0a 20 20 20 20 54 63 6c 5f  Result;.    Tcl_
f580: 57 69 64 65 49 6e 74 20 72 6f 77 69 64 3b 0a 20  WideInt rowid;. 
f590: 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29     if( objc!=2 )
f5a0: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
f5b0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
f5c0: 20 32 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20   2, objv, "");. 
f5d0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
f5e0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
f5f0: 20 72 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33   rowid = sqlite3
f600: 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  _last_insert_row
f610: 69 64 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20 20  id(pDb->db);.   
f620: 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47   pResult = Tcl_G
f630: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
f640: 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  rp);.    Tcl_Set
f650: 57 69 64 65 49 6e 74 4f 62 6a 28 70 52 65 73 75  WideIntObj(pResu
f660: 6c 74 2c 20 72 6f 77 69 64 29 3b 0a 20 20 20 20  lt, rowid);.    
f670: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
f680: 0a 20 20 2a 2a 20 54 68 65 20 44 42 5f 4f 4e 45  .  ** The DB_ONE
f690: 43 4f 4c 55 4d 4e 20 6d 65 74 68 6f 64 20 69 73  COLUMN method is
f6a0: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 74 6f 67   implemented tog
f6b0: 65 74 68 65 72 20 77 69 74 68 20 44 42 5f 45 56  ether with DB_EV
f6c0: 41 4c 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 20  AL..  */..  /*  
f6d0: 20 20 24 64 62 20 70 72 6f 67 72 65 73 73 20 3f    $db progress ?
f6e0: 4e 20 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a  N CALLBACK?.  **
f6f0: 20 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68   .  ** Invoke th
f700: 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b  e given callback
f710: 20 65 76 65 72 79 20 4e 20 76 69 72 74 75 61 6c   every N virtual
f720: 20 6d 61 63 68 69 6e 65 20 6f 70 63 6f 64 65 73   machine opcodes
f730: 20 77 68 69 6c 65 20 65 78 65 63 75 74 69 6e 67   while executing
f740: 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20  .  ** queries.. 
f750: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 50 52   */.  case DB_PR
f760: 4f 47 52 45 53 53 3a 20 7b 0a 20 20 20 20 69 66  OGRESS: {.    if
f770: 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20  ( objc==2 ){.   
f780: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f     if( pDb->zPro
f790: 67 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20  gress ){.       
f7a0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
f7b0: 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a  t(interp, pDb->z
f7c0: 50 72 6f 67 72 65 73 73 2c 20 30 29 3b 0a 20 20  Progress, 0);.  
f7d0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
f7e0: 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20  if( objc==4 ){. 
f7f0: 20 20 20 20 20 63 68 61 72 20 2a 7a 50 72 6f 67       char *zProg
f800: 72 65 73 73 3b 0a 20 20 20 20 20 20 69 6e 74 20  ress;.      int 
f810: 6c 65 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 4e  len;.      int N
f820: 3b 0a 20 20 20 20 20 20 69 66 28 20 54 43 4c 5f  ;.      if( TCL_
f830: 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72  OK!=Tcl_GetIntFr
f840: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
f850: 6a 76 5b 32 5d 2c 20 26 4e 29 20 29 7b 0a 20 20  jv[2], &N) ){.  
f860: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
f870: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 3b  _ERROR;.      };
f880: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
f890: 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20  zProgress ){.   
f8a0: 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44       Tcl_Free(pD
f8b0: 62 2d 3e 7a 50 72 6f 67 72 65 73 73 29 3b 0a 20  b->zProgress);. 
f8c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 50 72       }.      zPr
f8d0: 6f 67 72 65 73 73 20 3d 20 54 63 6c 5f 47 65 74  ogress = Tcl_Get
f8e0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
f8f0: 6a 76 5b 33 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20  jv[3], &len);.  
f900: 20 20 20 20 69 66 28 20 7a 50 72 6f 67 72 65 73      if( zProgres
f910: 73 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20  s && len>0 ){.  
f920: 20 20 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f 67        pDb->zProg
f930: 72 65 73 73 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63  ress = Tcl_Alloc
f940: 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20  ( len + 1 );.   
f950: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d       memcpy(pDb-
f960: 3e 7a 50 72 6f 67 72 65 73 73 2c 20 7a 50 72 6f  >zProgress, zPro
f970: 67 72 65 73 73 2c 20 6c 65 6e 2b 31 29 3b 0a 20  gress, len+1);. 
f980: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f990: 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65      pDb->zProgre
f9a0: 73 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ss = 0;.      }.
f9b0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f9c0: 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c  MIT_PROGRESS_CAL
f9d0: 4c 42 41 43 4b 0a 20 20 20 20 20 20 69 66 28 20  LBACK.      if( 
f9e0: 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29  pDb->zProgress )
f9f0: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69  {.        pDb->i
fa00: 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a  nterp = interp;.
fa10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
fa20: 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72  progress_handler
fa30: 28 70 44 62 2d 3e 64 62 2c 20 4e 2c 20 44 62 50  (pDb->db, N, DbP
fa40: 72 6f 67 72 65 73 73 48 61 6e 64 6c 65 72 2c 20  rogressHandler, 
fa50: 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  pDb);.      }els
fa60: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
fa70: 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64  e3_progress_hand
fa80: 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20  ler(pDb->db, 0, 
fa90: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23  0, 0);.      }.#
faa0: 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
fab0: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
fac0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
fad0: 32 2c 20 6f 62 6a 76 2c 20 22 4e 20 43 41 4c 4c  2, objv, "N CALL
fae0: 42 41 43 4b 22 29 3b 0a 20 20 20 20 20 20 72 65  BACK");.      re
faf0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
fb00: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
fb10: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
fb20: 62 20 70 72 6f 66 69 6c 65 20 3f 43 41 4c 4c 42  b profile ?CALLB
fb30: 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d  ACK?.  **.  ** M
fb40: 61 6b 65 20 61 72 72 61 6e 67 65 6d 65 6e 74 73  ake arrangements
fb50: 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 43   to invoke the C
fb60: 41 4c 4c 42 41 43 4b 20 72 6f 75 74 69 6e 65 20  ALLBACK routine 
fb70: 61 66 74 65 72 20 65 61 63 68 20 53 51 4c 20 73  after each SQL s
fb80: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68  tatement.  ** th
fb90: 61 74 20 68 61 73 20 72 75 6e 2e 20 20 54 68 65  at has run.  The
fba0: 20 74 65 78 74 20 6f 66 20 74 68 65 20 53 51 4c   text of the SQL
fbb0: 20 61 6e 64 20 74 68 65 20 61 6d 6f 75 6e 74 20   and the amount 
fbc0: 6f 66 20 65 6c 61 70 73 65 20 74 69 6d 65 20 61  of elapse time a
fbd0: 72 65 0a 20 20 2a 2a 20 61 70 70 65 6e 64 65 64  re.  ** appended
fbe0: 20 74 6f 20 43 41 4c 4c 42 41 43 4b 20 62 65 66   to CALLBACK bef
fbf0: 6f 72 65 20 74 68 65 20 73 63 72 69 70 74 20 69  ore the script i
fc00: 73 20 72 75 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61  s run..  */.  ca
fc10: 73 65 20 44 42 5f 50 52 4f 46 49 4c 45 3a 20 7b  se DB_PROFILE: {
fc20: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20  .    if( objc>3 
fc30: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
fc40: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
fc50: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c  , 2, objv, "?CAL
fc60: 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20  LBACK?");.      
fc70: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
fc80: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
fc90: 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20  objc==2 ){.     
fca0: 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69   if( pDb->zProfi
fcb0: 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  le ){.        Tc
fcc0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
fcd0: 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f  nterp, pDb->zPro
fce0: 66 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  file, 0);.      
fcf0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
fd00: 20 20 20 63 68 61 72 20 2a 7a 50 72 6f 66 69 6c     char *zProfil
fd10: 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  e;.      int len
fd20: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ;.      if( pDb-
fd30: 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20  >zProfile ){.   
fd40: 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44       Tcl_Free(pD
fd50: 62 2d 3e 7a 50 72 6f 66 69 6c 65 29 3b 0a 20 20  b->zProfile);.  
fd60: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 50 72 6f      }.      zPro
fd70: 66 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  file = Tcl_GetSt
fd80: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
fd90: 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20  [2], &len);.    
fda0: 20 20 69 66 28 20 7a 50 72 6f 66 69 6c 65 20 26    if( zProfile &
fdb0: 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20  & len>0 ){.     
fdc0: 20 20 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65     pDb->zProfile
fdd0: 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65   = Tcl_Alloc( le
fde0: 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20  n + 1 );.       
fdf0: 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 50 72   memcpy(pDb->zPr
fe00: 6f 66 69 6c 65 2c 20 7a 50 72 6f 66 69 6c 65 2c  ofile, zProfile,
fe10: 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d   len+1);.      }
fe20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44  else{.        pD
fe30: 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 3d 20 30 3b  b->zProfile = 0;
fe40: 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  .      }.#ifndef
fe50: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
fe60: 43 45 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  CE.      if( pDb
fe70: 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20  ->zProfile ){.  
fe80: 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72        pDb->inter
fe90: 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20  p = interp;.    
fea0: 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 66      sqlite3_prof
feb0: 69 6c 65 28 70 44 62 2d 3e 64 62 2c 20 44 62 50  ile(pDb->db, DbP
fec0: 72 6f 66 69 6c 65 48 61 6e 64 6c 65 72 2c 20 70  rofileHandler, p
fed0: 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Db);.      }else
fee0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
fef0: 33 5f 70 72 6f 66 69 6c 65 28 70 44 62 2d 3e 64  3_profile(pDb->d
ff00: 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  b, 0, 0);.      
ff10: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
ff20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
ff30: 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62   /*.  **     $db
ff40: 20 72 65 6b 65 79 20 4b 45 59 0a 20 20 2a 2a 0a   rekey KEY.  **.
ff50: 20 20 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20    ** Change the 
ff60: 65 6e 63 72 79 70 74 69 6f 6e 20 6b 65 79 20 6f  encryption key o
ff70: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20  n the currently 
ff80: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 2e 0a 20  open database.. 
ff90: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 52 45   */.  case DB_RE
ffa0: 4b 45 59 3a 20 7b 0a 20 20 20 20 69 6e 74 20 6e  KEY: {.    int n
ffb0: 4b 65 79 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70  Key;.    void *p
ffc0: 4b 65 79 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a  Key;.    if( obj
ffd0: 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=3 ){.      Tc
ffe0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
fff0: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
10000 22 4b 45 59 22 29 3b 0a 20 20 20 20 20 20 72 65  "KEY");.      re
10010 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
10020 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 20 3d      }.    pKey =
10030 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61   Tcl_GetByteArra
10040 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  yFromObj(objv[2]
10050 2c 20 26 6e 4b 65 79 29 3b 0a 23 69 66 64 65 66  , &nKey);.#ifdef
10060 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
10070 43 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  C.    rc = sqlit
10080 65 33 5f 72 65 6b 65 79 28 70 44 62 2d 3e 64 62  e3_rekey(pDb->db
10090 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20  , pKey, nKey);. 
100a0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
100b0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
100c0 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69  ult(interp, sqli
100d0 74 65 33 45 72 72 53 74 72 28 72 63 29 2c 20 30  te3ErrStr(rc), 0
100e0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43  );.      rc = TC
100f0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23  L_ERROR;.    }.#
10100 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b  endif.    break;
10110 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
10120 20 20 20 20 24 64 62 20 74 69 6d 65 6f 75 74 20      $db timeout 
10130 4d 49 4c 4c 45 53 45 43 4f 4e 44 53 0a 20 20 2a  MILLESECONDS.  *
10140 2a 0a 20 20 2a 2a 20 44 65 6c 61 79 20 66 6f 72  *.  ** Delay for
10150 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d   the number of m
10160 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 70 65 63  illiseconds spec
10170 69 66 69 65 64 20 77 68 65 6e 20 61 20 66 69 6c  ified when a fil
10180 65 20 69 73 20 6c 6f 63 6b 65 64 2e 0a 20 20 2a  e is locked..  *
10190 2f 0a 20 20 63 61 73 65 20 44 42 5f 54 49 4d 45  /.  case DB_TIME
101a0 4f 55 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20 6d  OUT: {.    int m
101b0 73 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  s;.    if( objc!
101c0 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =3 ){.      Tcl_
101d0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
101e0 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4d  erp, 2, objv, "M
101f0 49 4c 4c 49 53 45 43 4f 4e 44 53 22 29 3b 0a 20  ILLISECONDS");. 
10200 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
10210 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
10220 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
10230 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
10240 62 6a 76 5b 32 5d 2c 20 26 6d 73 29 20 29 20 72  bjv[2], &ms) ) r
10250 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10260 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73  .    sqlite3_bus
10270 79 5f 74 69 6d 65 6f 75 74 28 70 44 62 2d 3e 64  y_timeout(pDb->d
10280 62 2c 20 6d 73 29 3b 0a 20 20 20 20 62 72 65 61  b, ms);.    brea
10290 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 0a 20  k;.  }.  .  /*. 
102a0 20 2a 2a 20 20 20 20 20 24 64 62 20 74 6f 74 61   **     $db tota
102b0 6c 5f 63 68 61 6e 67 65 73 0a 20 20 2a 2a 0a 20  l_changes.  **. 
102c0 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e   ** Return the n
102d0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
102e0 61 74 20 77 65 72 65 20 6d 6f 64 69 66 69 65 64  at were modified
102f0 2c 20 69 6e 73 65 72 74 65 64 2c 20 6f 72 20 64  , inserted, or d
10300 65 6c 65 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e  eleted .  ** sin
10310 63 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ce the database 
10320 68 61 6e 64 6c 65 20 77 61 73 20 63 72 65 61 74  handle was creat
10330 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ed..  */.  case 
10340 44 42 5f 54 4f 54 41 4c 5f 43 48 41 4e 47 45 53  DB_TOTAL_CHANGES
10350 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  : {.    Tcl_Obj 
10360 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 66  *pResult;.    if
10370 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
10380 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
10390 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
103a0 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 20 20  bjv, "");.      
103b0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
103c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 52 65 73  ;.    }.    pRes
103d0 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a  ult = Tcl_GetObj
103e0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
103f0 20 20 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62      Tcl_SetIntOb
10400 6a 28 70 52 65 73 75 6c 74 2c 20 73 71 6c 69 74  j(pResult, sqlit
10410 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73  e3_total_changes
10420 28 70 44 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20  (pDb->db));.    
10430 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
10440 20 20 20 20 24 64 62 20 74 72 61 63 65 20 3f 43      $db trace ?C
10450 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20  ALLBACK?.  **.  
10460 2a 2a 20 4d 61 6b 65 20 61 72 72 61 6e 67 65 6d  ** Make arrangem
10470 65 6e 74 73 20 74 6f 20 69 6e 76 6f 6b 65 20 74  ents to invoke t
10480 68 65 20 43 41 4c 4c 42 41 43 4b 20 72 6f 75 74  he CALLBACK rout
10490 69 6e 65 20 66 6f 72 20 65 61 63 68 20 53 51 4c  ine for each SQL
104a0 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
104b0 74 68 61 74 20 69 73 20 65 78 65 63 75 74 65 64  that is executed
104c0 2e 20 20 54 68 65 20 74 65 78 74 20 6f 66 20 74  .  The text of t
104d0 68 65 20 53 51 4c 20 69 73 20 61 70 70 65 6e 64  he SQL is append
104e0 65 64 20 74 6f 20 43 41 4c 4c 42 41 43 4b 20 62  ed to CALLBACK b
104f0 65 66 6f 72 65 0a 20 20 2a 2a 20 69 74 20 69 73  efore.  ** it is
10500 20 65 78 65 63 75 74 65 64 2e 0a 20 20 2a 2f 0a   executed..  */.
10510 20 20 63 61 73 65 20 44 42 5f 54 52 41 43 45 3a    case DB_TRACE:
10520 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e   {.    if( objc>
10530 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
10540 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
10550 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43  rp, 2, objv, "?C
10560 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20  ALLBACK?");.    
10570 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
10580 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  OR;.    }else if
10590 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20  ( objc==2 ){.   
105a0 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61     if( pDb->zTra
105b0 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  ce ){.        Tc
105c0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
105d0 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 54 72 61  nterp, pDb->zTra
105e0 63 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ce, 0);.      }.
105f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10600 20 63 68 61 72 20 2a 7a 54 72 61 63 65 3b 0a 20   char *zTrace;. 
10610 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20       int len;.  
10620 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72      if( pDb->zTr
10630 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54  ace ){.        T
10640 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 54 72  cl_Free(pDb->zTr
10650 61 63 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ace);.      }.  
10660 20 20 20 20 7a 54 72 61 63 65 20 3d 20 54 63 6c      zTrace = Tcl
10670 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
10680 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29  j(objv[2], &len)
10690 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 54 72 61  ;.      if( zTra
106a0 63 65 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20  ce && len>0 ){. 
106b0 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 54 72 61         pDb->zTra
106c0 63 65 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20  ce = Tcl_Alloc( 
106d0 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20  len + 1 );.     
106e0 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a     memcpy(pDb->z
106f0 54 72 61 63 65 2c 20 7a 54 72 61 63 65 2c 20 6c  Trace, zTrace, l
10700 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  en+1);.      }el
10710 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  se{.        pDb-
10720 3e 7a 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 20  >zTrace = 0;.   
10730 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
10740 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20  ITE_OMIT_TRACE. 
10750 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54       if( pDb->zT
10760 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  race ){.        
10770 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e  pDb->interp = in
10780 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71  terp;.        sq
10790 6c 69 74 65 33 5f 74 72 61 63 65 28 70 44 62 2d  lite3_trace(pDb-
107a0 3e 64 62 2c 20 44 62 54 72 61 63 65 48 61 6e 64  >db, DbTraceHand
107b0 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20  ler, pDb);.     
107c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
107d0 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28 70 44  sqlite3_trace(pD
107e0 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  b->db, 0, 0);.  
107f0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
10800 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
10810 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 74  }..  /*    $db t
10820 72 61 6e 73 61 63 74 69 6f 6e 20 5b 2d 64 65 66  ransaction [-def
10830 65 72 72 65 64 7c 2d 69 6d 6d 65 64 69 61 74 65  erred|-immediate
10840 7c 2d 65 78 63 6c 75 73 69 76 65 5d 20 53 43 52  |-exclusive] SCR
10850 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 74  IPT.  **.  ** St
10860 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61  art a new transa
10870 63 74 69 6f 6e 20 28 69 66 20 77 65 20 61 72 65  ction (if we are
10880 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20   not already in 
10890 74 68 65 20 6d 69 64 73 74 20 6f 66 20 61 0a 20  the midst of a. 
108a0 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 29   ** transaction)
108b0 20 61 6e 64 20 65 78 65 63 75 74 65 20 74 68 65   and execute the
108c0 20 54 43 4c 20 73 63 72 69 70 74 20 53 43 52 49   TCL script SCRI
108d0 50 54 2e 20 20 41 66 74 65 72 20 53 43 52 49 50  PT.  After SCRIP
108e0 54 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 73  T.  ** completes
108f0 2c 20 65 69 74 68 65 72 20 63 6f 6d 6d 69 74 20  , either commit 
10900 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
10910 6f 72 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20  or roll it back 
10920 69 66 20 53 43 52 49 50 54 0a 20 20 2a 2a 20 74  if SCRIPT.  ** t
10930 68 72 6f 77 73 20 61 6e 20 65 78 63 65 70 74 69  hrows an excepti
10940 6f 6e 2e 20 20 4f 72 20 69 66 20 6e 6f 20 6e 65  on.  Or if no ne
10950 77 20 74 72 61 6e 73 61 74 69 6f 6e 20 77 61 73  w transation was
10960 20 73 74 61 72 74 65 64 2c 20 64 6f 20 6e 6f 74   started, do not
10970 68 69 6e 67 2e 0a 20 20 2a 2a 20 70 61 73 73 20  hing..  ** pass 
10980 74 68 65 20 65 78 63 65 70 74 69 6f 6e 20 6f 6e  the exception on
10990 20 75 70 20 74 68 65 20 73 74 61 63 6b 2e 0a 20   up the stack.. 
109a0 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63 6f   **.  ** This co
109b0 6d 6d 61 6e 64 20 77 61 73 20 69 6e 73 70 69 72  mmand was inspir
109c0 65 64 20 62 79 20 44 61 76 65 20 54 68 6f 6d 61  ed by Dave Thoma
109d0 73 27 73 20 74 61 6c 6b 20 6f 6e 20 52 75 62 79  s's talk on Ruby
109e0 20 61 74 20 74 68 65 0a 20 20 2a 2a 20 32 30 30   at the.  ** 200
109f0 35 20 4f 27 52 65 69 6c 6c 79 20 4f 70 65 6e 20  5 O'Reilly Open 
10a00 53 6f 75 72 63 65 20 43 6f 6e 76 65 6e 74 69 6f  Source Conventio
10a10 6e 20 28 4f 53 43 4f 4e 29 2e 0a 20 20 2a 2f 0a  n (OSCON)..  */.
10a20 20 20 63 61 73 65 20 44 42 5f 54 52 41 4e 53 41    case DB_TRANSA
10a30 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 69 6e 74  CTION: {.    int
10a40 20 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 54 63   inTrans;.    Tc
10a50 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 0a  l_Obj *pScript;.
10a60 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
10a70 7a 42 65 67 69 6e 20 3d 20 22 42 45 47 49 4e 22  zBegin = "BEGIN"
10a80 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
10a90 33 20 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a  3 && objc!=4 ){.
10aa0 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
10ab0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
10ac0 2c 20 6f 62 6a 76 2c 20 22 5b 54 59 50 45 5d 20  , objv, "[TYPE] 
10ad0 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20  SCRIPT");.      
10ae0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
10af0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
10b00 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20  objc==3 ){.     
10b10 20 70 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b   pScript = objv[
10b20 32 5d 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  2];.    } else {
10b30 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
10b40 6e 73 74 20 63 68 61 72 20 2a 54 54 59 50 45 5f  nst char *TTYPE_
10b50 73 74 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  strs[] = {.     
10b60 20 20 20 22 64 65 66 65 72 72 65 64 22 2c 20 20     "deferred",  
10b70 20 22 65 78 63 6c 75 73 69 76 65 22 2c 20 20 22   "exclusive",  "
10b80 69 6d 6d 65 64 69 61 74 65 22 2c 20 30 0a 20 20  immediate", 0.  
10b90 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 65 6e 75      };.      enu
10ba0 6d 20 54 54 59 50 45 5f 65 6e 75 6d 20 7b 0a 20  m TTYPE_enum {. 
10bb0 20 20 20 20 20 20 20 54 54 59 50 45 5f 44 45 46         TTYPE_DEF
10bc0 45 52 52 45 44 2c 20 54 54 59 50 45 5f 45 58 43  ERRED, TTYPE_EXC
10bd0 4c 55 53 49 56 45 2c 20 54 54 59 50 45 5f 49 4d  LUSIVE, TTYPE_IM
10be0 4d 45 44 49 41 54 45 0a 20 20 20 20 20 20 7d 3b  MEDIATE.      };
10bf0 0a 20 20 20 20 20 20 69 6e 74 20 74 74 79 70 65  .      int ttype
10c00 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f  ;.      if( Tcl_
10c10 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28  GetIndexFromObj(
10c20 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
10c30 20 54 54 59 50 45 5f 73 74 72 73 2c 20 22 74 72   TTYPE_strs, "tr
10c40 61 6e 73 61 63 74 69 6f 6e 20 74 79 70 65 22 2c  ansaction type",
10c50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
10c70 2c 20 26 74 74 79 70 65 29 20 29 7b 0a 20 20 20  , &ttype) ){.   
10c80 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
10c90 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
10ca0 20 20 20 20 20 73 77 69 74 63 68 28 20 28 65 6e       switch( (en
10cb0 75 6d 20 54 54 59 50 45 5f 65 6e 75 6d 29 74 74  um TTYPE_enum)tt
10cc0 79 70 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ype ){.        c
10cd0 61 73 65 20 54 54 59 50 45 5f 44 45 46 45 52 52  ase TTYPE_DEFERR
10ce0 45 44 3a 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20  ED:    /* no-op 
10cf0 2a 2f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  */;             
10d00 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
10d10 20 20 20 63 61 73 65 20 54 54 59 50 45 5f 45 58     case TTYPE_EX
10d20 43 4c 55 53 49 56 45 3a 20 20 20 7a 42 65 67 69  CLUSIVE:   zBegi
10d30 6e 20 3d 20 22 42 45 47 49 4e 20 45 58 43 4c 55  n = "BEGIN EXCLU
10d40 53 49 56 45 22 3b 20 20 62 72 65 61 6b 3b 0a 20  SIVE";  break;. 
10d50 20 20 20 20 20 20 20 63 61 73 65 20 54 54 59 50         case TTYP
10d60 45 5f 49 4d 4d 45 44 49 41 54 45 3a 20 20 20 7a  E_IMMEDIATE:   z
10d70 42 65 67 69 6e 20 3d 20 22 42 45 47 49 4e 20 49  Begin = "BEGIN I
10d80 4d 4d 45 44 49 41 54 45 22 3b 20 20 62 72 65 61  MMEDIATE";  brea
10d90 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
10da0 20 70 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b   pScript = objv[
10db0 33 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e  3];.    }.    in
10dc0 54 72 61 6e 73 20 3d 20 21 73 71 6c 69 74 65 33  Trans = !sqlite3
10dd0 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28  _get_autocommit(
10de0 70 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20 69 66  pDb->db);.    if
10df0 28 20 21 69 6e 54 72 61 6e 73 20 29 7b 0a 20 20  ( !inTrans ){.  
10e00 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65      (void)sqlite
10e10 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20  3_exec(pDb->db, 
10e20 7a 42 65 67 69 6e 2c 20 30 2c 20 30 2c 20 30 29  zBegin, 0, 0, 0)
10e30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
10e40 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69   Tcl_EvalObjEx(i
10e50 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20  nterp, pScript, 
10e60 30 29 3b 0a 20 20 20 20 69 66 28 20 21 69 6e 54  0);.    if( !inT
10e70 72 61 6e 73 20 29 7b 0a 20 20 20 20 20 20 63 6f  rans ){.      co
10e80 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e 64 3b 0a  nst char *zEnd;.
10e90 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43        if( rc==TC
10ea0 4c 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20  L_ERROR ){.     
10eb0 20 20 20 7a 45 6e 64 20 3d 20 22 52 4f 4c 4c 42     zEnd = "ROLLB
10ec0 41 43 4b 22 3b 0a 20 20 20 20 20 20 7d 20 65 6c  ACK";.      } el
10ed0 73 65 20 7b 0a 20 20 20 20 20 20 20 20 7a 45 6e  se {.        zEn
10ee0 64 20 3d 20 22 43 4f 4d 4d 49 54 22 3b 0a 20 20  d = "COMMIT";.  
10ef0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
10f00 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62  sqlite3_exec(pDb
10f10 2d 3e 64 62 2c 20 7a 45 6e 64 2c 20 30 2c 20 30  ->db, zEnd, 0, 0
10f20 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
10f30 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62  sqlite3_exec(pDb
10f40 2d 3e 64 62 2c 20 22 52 4f 4c 4c 42 41 43 4b 22  ->db, "ROLLBACK"
10f50 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
10f60 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72    }.    }.    br
10f70 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
10f80 20 2a 2a 20 20 20 20 24 64 62 20 75 70 64 61 74   **    $db updat
10f90 65 5f 68 6f 6f 6b 20 3f 73 63 72 69 70 74 3f 0a  e_hook ?script?.
10fa0 20 20 2a 2a 20 20 20 20 24 64 62 20 72 6f 6c 6c    **    $db roll
10fb0 62 61 63 6b 5f 68 6f 6f 6b 20 3f 73 63 72 69 70  back_hook ?scrip
10fc0 74 3f 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  t?.  */.  case D
10fd0 42 5f 55 50 44 41 54 45 5f 48 4f 4f 4b 3a 20 0a  B_UPDATE_HOOK: .
10fe0 20 20 63 61 73 65 20 44 42 5f 52 4f 4c 4c 42 41    case DB_ROLLBA
10ff0 43 4b 5f 48 4f 4f 4b 3a 20 7b 0a 0a 20 20 20 20  CK_HOOK: {..    
11000 2f 2a 20 73 65 74 20 70 70 48 6f 6f 6b 20 74 6f  /* set ppHook to
11010 20 70 6f 69 6e 74 20 61 74 20 70 55 70 64 61 74   point at pUpdat
11020 65 48 6f 6f 6b 20 6f 72 20 70 52 6f 6c 6c 62 61  eHook or pRollba
11030 63 6b 48 6f 6f 6b 2c 20 64 65 70 65 6e 64 69 6e  ckHook, dependin
11040 67 20 6f 6e 20 0a 20 20 20 20 2a 2a 20 77 68 65  g on .    ** whe
11050 74 68 65 72 20 5b 24 64 62 20 75 70 64 61 74 65  ther [$db update
11060 5f 68 6f 6f 6b 5d 20 6f 72 20 5b 24 64 62 20 72  _hook] or [$db r
11070 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 5d 20 77 61  ollback_hook] wa
11080 73 20 69 6e 76 6f 6b 65 64 2e 0a 20 20 20 20 2a  s invoked..    *
11090 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a  /.    Tcl_Obj **
110a0 70 70 48 6f 6f 6b 3b 20 0a 20 20 20 20 69 66 28  ppHook; .    if(
110b0 20 63 68 6f 69 63 65 3d 3d 44 42 5f 55 50 44 41   choice==DB_UPDA
110c0 54 45 5f 48 4f 4f 4b 20 29 7b 0a 20 20 20 20 20  TE_HOOK ){.     
110d0 20 70 70 48 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e   ppHook = &pDb->
110e0 70 55 70 64 61 74 65 48 6f 6f 6b 3b 0a 20 20 20  pUpdateHook;.   
110f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70   }else{.      pp
11100 48 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e 70 52 6f  Hook = &pDb->pRo
11110 6c 6c 62 61 63 6b 48 6f 6f 6b 3b 0a 20 20 20 20  llbackHook;.    
11120 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  }..    if( objc!
11130 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b  =2 && objc!=3 ){
11140 0a 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  .       Tcl_Wron
11150 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
11160 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 53 43 52 49   2, objv, "?SCRI
11170 50 54 3f 22 29 3b 0a 20 20 20 20 20 20 20 72 65  PT?");.       re
11180 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
11190 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 2a 70      }.    if( *p
111a0 70 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 20 20 54  pHook ){.      T
111b0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
111c0 69 6e 74 65 72 70 2c 20 2a 70 70 48 6f 6f 6b 29  interp, *ppHook)
111d0 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63  ;.      if( objc
111e0 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 54  ==3 ){.        T
111f0 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
11200 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20 20 20  *ppHook);.      
11210 20 20 2a 70 70 48 6f 6f 6b 20 3d 20 30 3b 0a 20    *ppHook = 0;. 
11220 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
11230 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a   if( objc==3 ){.
11240 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28        assert( !(
11250 2a 70 70 48 6f 6f 6b 29 20 29 3b 0a 20 20 20 20  *ppHook) );.    
11260 20 20 69 66 28 20 54 63 6c 5f 47 65 74 43 68 61    if( Tcl_GetCha
11270 72 4c 65 6e 67 74 68 28 6f 62 6a 76 5b 32 5d 29  rLength(objv[2])
11280 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  >0 ){.        *p
11290 70 48 6f 6f 6b 20 3d 20 6f 62 6a 76 5b 32 5d 3b  pHook = objv[2];
112a0 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63  .        Tcl_Inc
112b0 72 52 65 66 43 6f 75 6e 74 28 2a 70 70 48 6f 6f  rRefCount(*ppHoo
112c0 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  k);.      }.    
112d0 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 75  }..    sqlite3_u
112e0 70 64 61 74 65 5f 68 6f 6f 6b 28 70 44 62 2d 3e  pdate_hook(pDb->
112f0 64 62 2c 20 28 70 44 62 2d 3e 70 55 70 64 61 74  db, (pDb->pUpdat
11300 65 48 6f 6f 6b 3f 44 62 55 70 64 61 74 65 48 61  eHook?DbUpdateHa
11310 6e 64 6c 65 72 3a 30 29 2c 20 70 44 62 29 3b 0a  ndler:0), pDb);.
11320 20 20 20 20 73 71 6c 69 74 65 33 5f 72 6f 6c 6c      sqlite3_roll
11330 62 61 63 6b 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64  back_hook(pDb->d
11340 62 2c 28 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63  b,(pDb->pRollbac
11350 6b 48 6f 6f 6b 3f 44 62 52 6f 6c 6c 62 61 63 6b  kHook?DbRollback
11360 48 61 6e 64 6c 65 72 3a 30 29 2c 70 44 62 29 3b  Handler:0),pDb);
11370 0a 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ..    break;.  }
11380 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 76 65  ..  /*    $db ve
11390 72 73 69 6f 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rsion.  **.  ** 
113a0 52 65 74 75 72 6e 20 74 68 65 20 76 65 72 73 69  Return the versi
113b0 6f 6e 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68  on string for th
113c0 69 73 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  is database..  *
113d0 2f 0a 20 20 63 61 73 65 20 44 42 5f 56 45 52 53  /.  case DB_VERS
113e0 49 4f 4e 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 53  ION: {.    Tcl_S
113f0 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
11400 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
11410 5f 6c 69 62 76 65 72 73 69 6f 6e 28 29 2c 20 54  _libversion(), T
11420 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  CL_STATIC);.    
11430 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 7d  break;.  }...  }
11440 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 53   /* End of the S
11450 57 49 54 43 48 20 73 74 61 74 65 6d 65 6e 74 20  WITCH statement 
11460 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  */.  return rc;.
11470 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 73 71 6c 69 74  }../*.**   sqlit
11480 65 33 20 44 42 4e 41 4d 45 20 46 49 4c 45 4e 41  e3 DBNAME FILENA
11490 4d 45 20 3f 2d 76 66 73 20 56 46 53 4e 41 4d 45  ME ?-vfs VFSNAME
114a0 3f 20 3f 2d 6b 65 79 20 4b 45 59 3f 20 3f 2d 72  ? ?-key KEY? ?-r
114b0 65 61 64 6f 6e 6c 79 20 42 4f 4f 4c 45 41 4e 3f  eadonly BOOLEAN?
114c0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
114d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3f 2d                ?-
114e0 63 72 65 61 74 65 20 42 4f 4f 4c 45 41 4e 3f 0a  create BOOLEAN?.
114f0 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  **.** This is th
11500 65 20 6d 61 69 6e 20 54 63 6c 20 63 6f 6d 6d 61  e main Tcl comma
11510 6e 64 2e 20 20 57 68 65 6e 20 74 68 65 20 22 73  nd.  When the "s
11520 71 6c 69 74 65 22 20 54 63 6c 20 63 6f 6d 6d 61  qlite" Tcl comma
11530 6e 64 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b 65 64  nd is.** invoked
11540 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
11550 75 6e 73 20 74 6f 20 70 72 6f 63 65 73 73 20 74  uns to process t
11560 68 61 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  hat command..**.
11570 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67  ** The first arg
11580 75 6d 65 6e 74 2c 20 44 42 4e 41 4d 45 2c 20 69  ument, DBNAME, i
11590 73 20 61 6e 20 61 72 62 69 74 72 61 72 79 20 6e  s an arbitrary n
115a0 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 0a 2a 2a  ame for a new.**
115b0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
115c0 74 69 6f 6e 2e 20 20 54 68 69 73 20 63 6f 6d 6d  tion.  This comm
115d0 61 6e 64 20 63 72 65 61 74 65 73 20 61 20 6e 65  and creates a ne
115e0 77 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64 0a  w command named.
115f0 2a 2a 20 44 42 4e 41 4d 45 20 74 68 61 74 20 69  ** DBNAME that i
11600 73 20 75 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f  s used to contro
11610 6c 20 74 68 61 74 20 63 6f 6e 6e 65 63 74 69 6f  l that connectio
11620 6e 2e 20 20 54 68 65 20 64 61 74 61 62 61 73 65  n.  The database
11630 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  .** connection i
11640 73 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74  s deleted when t
11650 68 65 20 44 42 4e 41 4d 45 20 63 6f 6d 6d 61 6e  he DBNAME comman
11660 64 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  d is deleted..**
11670 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61  .** The second a
11680 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e  rgument is the n
11690 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
116a0 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2f 0a  ase file..**.*/.
116b0 73 74 61 74 69 63 20 69 6e 74 20 44 62 4d 61 69  static int DbMai
116c0 6e 28 76 6f 69 64 20 2a 63 64 2c 20 54 63 6c 5f  n(void *cd, Tcl_
116d0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
116e0 69 6e 74 20 6f 62 6a 63 2c 54 63 6c 5f 4f 62 6a  int objc,Tcl_Obj
116f0 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 29 7b 0a 20   *const*objv){. 
11700 20 53 71 6c 69 74 65 44 62 20 2a 70 3b 0a 20 20   SqliteDb *p;.  
11710 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20 30 3b 0a  void *pKey = 0;.
11720 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 30 3b 0a    int nKey = 0;.
11730 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
11740 72 67 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  rg;.  char *zErr
11750 4d 73 67 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  Msg;.  int i;.  
11760 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
11770 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e;.  const char 
11780 2a 7a 56 66 73 20 3d 20 30 3b 0a 20 20 69 6e 74  *zVfs = 0;.  int
11790 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f   flags = SQLITE_
117a0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
117b0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
117c0 41 54 45 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  ATE;.  Tcl_DStri
117d0 6e 67 20 74 72 61 6e 73 6c 61 74 65 64 46 69 6c  ng translatedFil
117e0 65 6e 61 6d 65 3b 0a 20 20 69 66 28 20 6f 62 6a  ename;.  if( obj
117f0 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a 41 72 67  c==2 ){.    zArg
11800 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
11810 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c  FromObj(objv[1],
11820 20 30 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72   0);.    if( str
11830 63 6d 70 28 7a 41 72 67 2c 22 2d 76 65 72 73 69  cmp(zArg,"-versi
11840 6f 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  on")==0 ){.     
11850 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
11860 74 28 69 6e 74 65 72 70 2c 73 71 6c 69 74 65 33  t(interp,sqlite3
11870 5f 76 65 72 73 69 6f 6e 2c 30 29 3b 0a 20 20 20  _version,0);.   
11880 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
11890 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
118a0 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 68 61  strcmp(zArg,"-ha
118b0 73 2d 63 6f 64 65 63 22 29 3d 3d 30 20 29 7b 0a  s-codec")==0 ){.
118c0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
118d0 53 5f 43 4f 44 45 43 0a 20 20 20 20 20 20 54 63  S_CODEC.      Tc
118e0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
118f0 6e 74 65 72 70 2c 22 31 22 2c 30 29 3b 0a 23 65  nterp,"1",0);.#e
11900 6c 73 65 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  lse.      Tcl_Ap
11910 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
11920 70 2c 22 30 22 2c 30 29 3b 0a 23 65 6e 64 69 66  p,"0",0);.#endif
11930 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
11940 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  L_OK;.    }.  }.
11950 20 20 66 6f 72 28 69 3d 33 3b 20 69 2b 31 3c 6f    for(i=3; i+1<o
11960 62 6a 63 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20  bjc; i+=2){.    
11970 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74  zArg = Tcl_GetSt
11980 72 69 6e 67 28 6f 62 6a 76 5b 69 5d 29 3b 0a 20  ring(objv[i]);. 
11990 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41     if( strcmp(zA
119a0 72 67 2c 22 2d 6b 65 79 22 29 3d 3d 30 20 29 7b  rg,"-key")==0 ){
119b0 0a 20 20 20 20 20 20 70 4b 65 79 20 3d 20 54 63  .      pKey = Tc
119c0 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72  l_GetByteArrayFr
119d0 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 69 2b 31 5d 2c  omObj(objv[i+1],
119e0 20 26 6e 4b 65 79 29 3b 0a 20 20 20 20 7d 65 6c   &nKey);.    }el
119f0 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41  se if( strcmp(zA
11a00 72 67 2c 20 22 2d 76 66 73 22 29 3d 3d 30 20 29  rg, "-vfs")==0 )
11a10 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20  {.      i++;.   
11a20 20 20 20 7a 56 66 73 20 3d 20 54 63 6c 5f 47 65     zVfs = Tcl_Ge
11a30 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69 5d 29  tString(objv[i])
11a40 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
11a50 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d 72  strcmp(zArg, "-r
11a60 65 61 64 6f 6e 6c 79 22 29 3d 3d 30 20 29 7b 0a  eadonly")==0 ){.
11a70 20 20 20 20 20 20 69 6e 74 20 62 3b 0a 20 20 20        int b;.   
11a80 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f     if( Tcl_GetBo
11a90 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
11aa0 65 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20  erp, objv[i+1], 
11ab0 26 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  &b) ) return TCL
11ac0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 69 66  _ERROR;.      if
11ad0 28 20 62 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ( b ){.        f
11ae0 6c 61 67 73 20 26 3d 20 7e 28 53 51 4c 49 54 45  lags &= ~(SQLITE
11af0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
11b00 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
11b10 54 45 29 3b 0a 20 20 20 20 20 20 20 20 66 6c 61  TE);.        fla
11b20 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
11b30 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  N_READONLY;.    
11b40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
11b50 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54   flags &= ~SQLIT
11b60 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b  E_OPEN_READONLY;
11b70 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c  .        flags |
11b80 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
11b90 41 44 57 52 49 54 45 3b 0a 20 20 20 20 20 20 7d  ADWRITE;.      }
11ba0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
11bb0 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d 63 72  trcmp(zArg, "-cr
11bc0 65 61 74 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  eate")==0 ){.   
11bd0 20 20 20 69 6e 74 20 62 3b 0a 20 20 20 20 20 20     int b;.      
11be0 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  if( Tcl_GetBoole
11bf0 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
11c00 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 62 29  , objv[i+1], &b)
11c10 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
11c20 52 4f 52 3b 0a 20 20 20 20 20 20 69 66 28 20 62  ROR;.      if( b
11c30 20 26 26 20 28 66 6c 61 67 73 20 26 20 53 51 4c   && (flags & SQL
11c40 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
11c50 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Y)==0 ){.       
11c60 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45   flags |= SQLITE
11c70 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b 0a 20 20  _OPEN_CREATE;.  
11c80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11c90 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c     flags &= ~SQL
11ca0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b  ITE_OPEN_CREATE;
11cb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
11cc0 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  se{.      Tcl_Ap
11cd0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
11ce0 70 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69  p, "unknown opti
11cf0 6f 6e 3a 20 22 2c 20 7a 41 72 67 2c 20 28 63 68  on: ", zArg, (ch
11d00 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65  ar*)0);.      re
11d10 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
11d20 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
11d30 6f 62 6a 63 3c 33 20 7c 7c 20 28 6f 62 6a 63 26  objc<3 || (objc&
11d40 31 29 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c  1)!=1 ){.    Tcl
11d50 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
11d60 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 0a  terp, 1, objv, .
11d70 20 20 20 20 20 20 22 48 41 4e 44 4c 45 20 46 49        "HANDLE FI
11d80 4c 45 4e 41 4d 45 20 3f 2d 76 66 73 20 56 46 53  LENAME ?-vfs VFS
11d90 4e 41 4d 45 3f 20 3f 2d 72 65 61 64 6f 6e 6c 79  NAME? ?-readonly
11da0 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 63 72 65 61   BOOLEAN? ?-crea
11db0 74 65 20 42 4f 4f 4c 45 41 4e 3f 22 0a 23 69 66  te BOOLEAN?".#if
11dc0 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
11dd0 4f 44 45 43 0a 20 20 20 20 20 20 22 20 3f 2d 6b  ODEC.      " ?-k
11de0 65 79 20 43 4f 44 45 43 4b 45 59 3f 22 0a 23 65  ey CODECKEY?".#e
11df0 6e 64 69 66 0a 20 20 20 20 29 3b 0a 20 20 20 20  ndif.    );.    
11e00 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
11e10 3b 0a 20 20 7d 0a 20 20 7a 45 72 72 4d 73 67 20  ;.  }.  zErrMsg 
11e20 3d 20 30 3b 0a 20 20 70 20 3d 20 28 53 71 6c 69  = 0;.  p = (Sqli
11e30 74 65 44 62 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28  teDb*)Tcl_Alloc(
11e40 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20   sizeof(*p) );. 
11e50 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20   if( p==0 ){.   
11e60 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
11e70 6e 74 65 72 70 2c 20 22 6d 61 6c 6c 6f 63 20 66  nterp, "malloc f
11e80 61 69 6c 65 64 22 2c 20 54 43 4c 5f 53 54 41 54  ailed", TCL_STAT
11e90 49 43 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  IC);.    return 
11ea0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
11eb0 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69   memset(p, 0, si
11ec0 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 7a 46 69  zeof(*p));.  zFi
11ed0 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  le = Tcl_GetStri
11ee0 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
11ef0 5d 2c 20 30 29 3b 0a 20 20 7a 46 69 6c 65 20 3d  ], 0);.  zFile =
11f00 20 54 63 6c 5f 54 72 61 6e 73 6c 61 74 65 46 69   Tcl_TranslateFi
11f10 6c 65 4e 61 6d 65 28 69 6e 74 65 72 70 2c 20 7a  leName(interp, z
11f20 46 69 6c 65 2c 20 26 74 72 61 6e 73 6c 61 74 65  File, &translate
11f30 64 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 73 71  dFilename);.  sq
11f40 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 7a 46  lite3_open_v2(zF
11f50 69 6c 65 2c 20 26 70 2d 3e 64 62 2c 20 66 6c 61  ile, &p->db, fla
11f60 67 73 2c 20 7a 56 66 73 29 3b 0a 20 20 54 63 6c  gs, zVfs);.  Tcl
11f70 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 74 72  _DStringFree(&tr
11f80 61 6e 73 6c 61 74 65 64 46 69 6c 65 6e 61 6d 65  anslatedFilename
11f90 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  );.  if( SQLITE_
11fa0 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 65 72 72 63  OK!=sqlite3_errc
11fb0 6f 64 65 28 70 2d 3e 64 62 29 20 29 7b 0a 20 20  ode(p->db) ){.  
11fc0 20 20 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69    zErrMsg = sqli
11fd0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
11fe0 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
11ff0 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 73 71  (p->db));.    sq
12000 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64  lite3_close(p->d
12010 62 29 3b 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20  b);.    p->db = 
12020 30 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51  0;.  }.#ifdef SQ
12030 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
12040 20 69 66 28 20 70 2d 3e 64 62 20 29 7b 0a 20 20   if( p->db ){.  
12050 20 20 73 71 6c 69 74 65 33 5f 6b 65 79 28 70 2d    sqlite3_key(p-
12060 3e 64 62 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 29  >db, pKey, nKey)
12070 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
12080 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20  f( p->db==0 ){. 
12090 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
120a0 28 69 6e 74 65 72 70 2c 20 7a 45 72 72 4d 73 67  (interp, zErrMsg
120b0 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b  , TCL_VOLATILE);
120c0 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63  .    Tcl_Free((c
120d0 68 61 72 2a 29 70 29 3b 0a 20 20 20 20 73 71 6c  har*)p);.    sql
120e0 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73  ite3_free(zErrMs
120f0 67 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  g);.    return T
12100 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
12110 70 2d 3e 6d 61 78 53 74 6d 74 20 3d 20 4e 55 4d  p->maxStmt = NUM
12120 5f 50 52 45 50 41 52 45 44 5f 53 54 4d 54 53 3b  _PREPARED_STMTS;
12130 0a 20 20 70 2d 3e 69 6e 74 65 72 70 20 3d 20 69  .  p->interp = i
12140 6e 74 65 72 70 3b 0a 20 20 7a 41 72 67 20 3d 20  nterp;.  zArg = 
12150 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
12160 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29  mObj(objv[1], 0)
12170 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62  ;.  Tcl_CreateOb
12180 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
12190 20 7a 41 72 67 2c 20 44 62 4f 62 6a 43 6d 64 2c   zArg, DbObjCmd,
121a0 20 28 63 68 61 72 2a 29 70 2c 20 44 62 44 65 6c   (char*)p, DbDel
121b0 65 74 65 43 6d 64 29 3b 0a 20 20 72 65 74 75 72  eteCmd);.  retur
121c0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
121d0 2a 2a 20 50 72 6f 76 69 64 65 20 61 20 64 75 6d  ** Provide a dum
121e0 6d 79 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73  my Tcl_InitStubs
121f0 20 69 66 20 77 65 20 61 72 65 20 75 73 69 6e 67   if we are using
12200 20 74 68 69 73 20 61 73 20 61 20 73 74 61 74 69   this as a stati
12210 63 0a 2a 2a 20 6c 69 62 72 61 72 79 2e 0a 2a 2f  c.** library..*/
12220 0a 23 69 66 6e 64 65 66 20 55 53 45 5f 54 43 4c  .#ifndef USE_TCL
12230 5f 53 54 55 42 53 0a 23 20 75 6e 64 65 66 20 20  _STUBS.# undef  
12240 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 0a 23 20  Tcl_InitStubs.# 
12250 64 65 66 69 6e 65 20 54 63 6c 5f 49 6e 69 74 53  define Tcl_InitS
12260 74 75 62 73 28 61 2c 62 2c 63 29 0a 23 65 6e 64  tubs(a,b,c).#end
12270 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  if../*.** Make s
12280 75 72 65 20 77 65 20 68 61 76 65 20 61 20 50 41  ure we have a PA
12290 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 20 6d 61  CKAGE_VERSION ma
122a0 63 72 6f 20 64 65 66 69 6e 65 64 2e 20 20 54 68  cro defined.  Th
122b0 69 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65  is will be.** de
122c0 66 69 6e 65 64 20 61 75 74 6f 6d 61 74 69 63 61  fined automatica
122d0 6c 6c 79 20 62 79 20 74 68 65 20 54 45 41 20 6d  lly by the TEA m
122e0 61 6b 65 66 69 6c 65 2e 20 20 42 75 74 20 6f 74  akefile.  But ot
122f0 68 65 72 20 6d 61 6b 65 66 69 6c 65 73 0a 2a 2a  her makefiles.**
12300 20 64 6f 20 6e 6f 74 20 64 65 66 69 6e 65 20 69   do not define i
12310 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 50 41  t..*/.#ifndef PA
12320 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 0a 23 20  CKAGE_VERSION.# 
12330 64 65 66 69 6e 65 20 50 41 43 4b 41 47 45 5f 56  define PACKAGE_V
12340 45 52 53 49 4f 4e 20 53 51 4c 49 54 45 5f 56 45  ERSION SQLITE_VE
12350 52 53 49 4f 4e 0a 23 65 6e 64 69 66 0a 0a 2f 2a  RSION.#endif../*
12360 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
12370 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2a 0a 2a  his module..**.*
12380 2a 20 54 68 69 73 20 54 63 6c 20 6d 6f 64 75 6c  * This Tcl modul
12390 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20  e contains only 
123a0 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 54 63 6c  a single new Tcl
123b0 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64 20 22   command named "
123c0 73 71 6c 69 74 65 22 2e 0a 2a 2a 20 28 48 65 6e  sqlite"..** (Hen
123d0 63 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  ce there is no n
123e0 61 6d 65 73 70 61 63 65 2e 20 20 54 68 65 72 65  amespace.  There
123f0 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20   is no point in 
12400 75 73 69 6e 67 20 61 20 6e 61 6d 65 73 70 61 63  using a namespac
12410 65 0a 2a 2a 20 69 66 20 74 68 65 20 65 78 74 65  e.** if the exte
12420 6e 73 69 6f 6e 20 6f 6e 6c 79 20 73 75 70 70 6c  nsion only suppl
12430 69 65 73 20 6f 6e 65 20 6e 65 77 20 6e 61 6d 65  ies one new name
12440 21 29 20 20 54 68 65 20 22 73 71 6c 69 74 65 22  !)  The "sqlite"
12450 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 75   command is.** u
12460 73 65 64 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65  sed to open a ne
12470 77 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  w SQLite databas
12480 65 2e 20 20 53 65 65 20 74 68 65 20 44 62 4d 61  e.  See the DbMa
12490 69 6e 28 29 20 72 6f 75 74 69 6e 65 20 61 62 6f  in() routine abo
124a0 76 65 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69  ve.** for additi
124b0 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
124c0 2e 0a 2a 2f 0a 45 58 54 45 52 4e 20 69 6e 74 20  ..*/.EXTERN int 
124d0 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 54 63 6c  Sqlite3_Init(Tcl
124e0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
124f0 7b 0a 20 20 54 63 6c 5f 49 6e 69 74 53 74 75 62  {.  Tcl_InitStub
12500 73 28 69 6e 74 65 72 70 2c 20 22 38 2e 34 22 2c  s(interp, "8.4",
12510 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74   0);.  Tcl_Creat
12520 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
12530 72 70 2c 20 22 73 71 6c 69 74 65 33 22 2c 20 28  rp, "sqlite3", (
12540 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a 29  Tcl_ObjCmdProc*)
12550 44 62 4d 61 69 6e 2c 20 30 2c 20 30 29 3b 0a 20  DbMain, 0, 0);. 
12560 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28   Tcl_PkgProvide(
12570 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33  interp, "sqlite3
12580 22 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49  ", PACKAGE_VERSI
12590 4f 4e 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74  ON);.  Tcl_Creat
125a0 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
125b0 72 70 2c 20 22 73 71 6c 69 74 65 22 2c 20 28 54  rp, "sqlite", (T
125c0 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a 29 44  cl_ObjCmdProc*)D
125d0 62 4d 61 69 6e 2c 20 30 2c 20 30 29 3b 0a 20 20  bMain, 0, 0);.  
125e0 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69  Tcl_PkgProvide(i
125f0 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 22 2c  nterp, "sqlite",
12600 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e   PACKAGE_VERSION
12610 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
12620 4f 4b 3b 0a 7d 0a 45 58 54 45 52 4e 20 69 6e 74  OK;.}.EXTERN int
12630 20 54 63 6c 73 71 6c 69 74 65 33 5f 49 6e 69 74   Tclsqlite3_Init
12640 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
12650 65 72 70 29 7b 20 72 65 74 75 72 6e 20 53 71 6c  erp){ return Sql
12660 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70  ite3_Init(interp
12670 29 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20  ); }.EXTERN int 
12680 53 71 6c 69 74 65 33 5f 53 61 66 65 49 6e 69 74  Sqlite3_SafeInit
12690 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
126a0 65 72 70 29 7b 20 72 65 74 75 72 6e 20 54 43 4c  erp){ return TCL
126b0 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e  _OK; }.EXTERN in
126c0 74 20 54 63 6c 73 71 6c 69 74 65 33 5f 53 61 66  t Tclsqlite3_Saf
126d0 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  eInit(Tcl_Interp
126e0 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72   *interp){ retur
126f0 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 0a 23 69 66  n TCL_OK; }..#if
12700 6e 64 65 66 20 53 51 4c 49 54 45 5f 33 5f 53 55  ndef SQLITE_3_SU
12710 46 46 49 58 5f 4f 4e 4c 59 0a 45 58 54 45 52 4e  FFIX_ONLY.EXTERN
12720 20 69 6e 74 20 53 71 6c 69 74 65 5f 49 6e 69 74   int Sqlite_Init
12730 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
12740 65 72 70 29 7b 20 72 65 74 75 72 6e 20 53 71 6c  erp){ return Sql
12750 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70  ite3_Init(interp
12760 29 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20  ); }.EXTERN int 
12770 54 63 6c 73 71 6c 69 74 65 5f 49 6e 69 74 28 54  Tclsqlite_Init(T
12780 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
12790 70 29 7b 20 72 65 74 75 72 6e 20 53 71 6c 69 74  p){ return Sqlit
127a0 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  e3_Init(interp);
127b0 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 53 71   }.EXTERN int Sq
127c0 6c 69 74 65 5f 53 61 66 65 49 6e 69 74 28 54 63  lite_SafeInit(Tc
127d0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
127e0 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  ){ return TCL_OK
127f0 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 54  ; }.EXTERN int T
12800 63 6c 73 71 6c 69 74 65 5f 53 61 66 65 49 6e 69  clsqlite_SafeIni
12810 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
12820 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 54 43  terp){ return TC
12830 4c 5f 4f 4b 3b 20 7d 0a 23 65 6e 64 69 66 0a 0a  L_OK; }.#endif..
12840 23 69 66 64 65 66 20 54 43 4c 53 48 0a 2f 2a 2a  #ifdef TCLSH./**
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 2a 2a 2a 2a 2a 2a 2a  ****************
12890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54  ***********.** T
128a0 68 65 20 63 6f 64 65 20 74 68 61 74 20 66 6f 6c  he code that fol
128b0 6c 6f 77 73 20 69 73 20 75 73 65 64 20 74 6f 20  lows is used to 
128c0 62 75 69 6c 64 20 73 74 61 6e 64 61 6c 6f 6e 65  build standalone
128d0 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
128e0 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 73 74  s.** that are st
128f0 61 74 69 63 61 6c 6c 79 20 6c 69 6e 6b 65 64 20  atically linked 
12900 77 69 74 68 20 53 51 4c 69 74 65 2e 20 20 0a 2a  with SQLite.  .*
12910 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  /../*.** If the 
12920 6d 61 63 72 6f 20 54 43 4c 53 48 20 69 73 20 6f  macro TCLSH is o
12930 6e 65 2c 20 74 68 65 6e 20 70 75 74 20 69 6e 20  ne, then put in 
12940 63 6f 64 65 20 74 68 69 73 20 66 6f 72 20 74 68  code this for th
12950 65 0a 2a 2a 20 22 6d 61 69 6e 22 20 72 6f 75 74  e.** "main" rout
12960 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e  ine that will in
12970 69 74 69 61 6c 69 7a 65 20 54 63 6c 20 61 6e 64  itialize Tcl and
12980 20 74 61 6b 65 20 69 6e 70 75 74 20 66 72 6f 6d   take input from
12990 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20 69 6e 70  .** standard inp
129a0 75 74 2c 20 6f 72 20 69 66 20 61 20 66 69 6c 65  ut, or if a file
129b0 20 69 73 20 6e 61 6d 65 64 20 6f 6e 20 74 68 65   is named on the
129c0 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 0a 2a 2a   command line.**
129d0 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   the TCL interpr
129e0 65 74 65 72 20 72 65 61 64 73 20 61 6e 64 20 65  eter reads and e
129f0 76 61 6c 75 61 74 65 73 20 74 68 61 74 20 66 69  valuates that fi
12a00 6c 65 2e 0a 2a 2f 0a 23 69 66 20 54 43 4c 53 48  le..*/.#if TCLSH
12a10 3d 3d 31 0a 73 74 61 74 69 63 20 63 68 61 72 20  ==1.static char 
12a20 7a 4d 61 69 6e 6c 6f 6f 70 5b 5d 20 3d 0a 20 20  zMainloop[] =.  
12a30 22 73 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a  "set line {}\n".
12a40 20 20 22 77 68 69 6c 65 20 7b 21 5b 65 6f 66 20    "while {![eof 
12a50 73 74 64 69 6e 5d 7d 20 7b 5c 6e 22 0a 20 20 20  stdin]} {\n".   
12a60 20 22 69 66 20 7b 24 6c 69 6e 65 21 3d 5c 22 5c   "if {$line!=\"\
12a70 22 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 70  "} {\n".      "p
12a80 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c  uts -nonewline \
12a90 22 3e 20 5c 22 5c 6e 22 0a 20 20 20 20 22 7d 20  "> \"\n".    "} 
12aa0 65 6c 73 65 20 7b 5c 6e 22 0a 20 20 20 20 20 20  else {\n".      
12ab0 22 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65  "puts -nonewline
12ac0 20 5c 22 25 20 5c 22 5c 6e 22 0a 20 20 20 20 22   \"% \"\n".    "
12ad0 7d 5c 6e 22 0a 20 20 20 20 22 66 6c 75 73 68 20  }\n".    "flush 
12ae0 73 74 64 6f 75 74 5c 6e 22 0a 20 20 20 20 22 61  stdout\n".    "a
12af0 70 70 65 6e 64 20 6c 69 6e 65 20 5b 67 65 74 73  ppend line [gets
12b00 20 73 74 64 69 6e 5d 5c 6e 22 0a 20 20 20 20 22   stdin]\n".    "
12b10 69 66 20 7b 5b 69 6e 66 6f 20 63 6f 6d 70 6c 65  if {[info comple
12b20 74 65 20 24 6c 69 6e 65 5d 7d 20 7b 5c 6e 22 0a  te $line]} {\n".
12b30 20 20 20 20 20 20 22 69 66 20 7b 5b 63 61 74 63        "if {[catc
12b40 68 20 7b 75 70 6c 65 76 65 6c 20 23 30 20 24 6c  h {uplevel #0 $l
12b50 69 6e 65 7d 20 72 65 73 75 6c 74 5d 7d 20 7b 5c  ine} result]} {\
12b60 6e 22 0a 20 20 20 20 20 20 20 20 22 70 75 74 73  n".        "puts
12b70 20 73 74 64 65 72 72 20 5c 22 45 72 72 6f 72 3a   stderr \"Error:
12b80 20 24 72 65 73 75 6c 74 5c 22 5c 6e 22 0a 20 20   $result\"\n".  
12b90 20 20 20 20 22 7d 20 65 6c 73 65 69 66 20 7b 24      "} elseif {$
12ba0 72 65 73 75 6c 74 21 3d 5c 22 5c 22 7d 20 7b 5c  result!=\"\"} {\
12bb0 6e 22 0a 20 20 20 20 20 20 20 20 22 70 75 74 73  n".        "puts
12bc0 20 24 72 65 73 75 6c 74 5c 6e 22 0a 20 20 20 20   $result\n".    
12bd0 20 20 22 7d 5c 6e 22 0a 20 20 20 20 20 20 22 73    "}\n".      "s
12be0 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20  et line {}\n".  
12bf0 20 20 22 7d 20 65 6c 73 65 20 7b 5c 6e 22 0a 20    "} else {\n". 
12c00 20 20 20 20 20 22 61 70 70 65 6e 64 20 6c 69 6e       "append lin
12c10 65 20 5c 5c 6e 5c 6e 22 0a 20 20 20 20 22 7d 5c  e \\n\n".    "}\
12c20 6e 22 0a 20 20 22 7d 5c 6e 22 0a 3b 0a 23 65 6e  n".  "}\n".;.#en
12c30 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  dif../*.** If th
12c40 65 20 6d 61 63 72 6f 20 54 43 4c 53 48 20 69 73  e macro TCLSH is
12c50 20 74 77 6f 2c 20 74 68 65 6e 20 67 65 74 20 74   two, then get t
12c60 68 65 20 6d 61 69 6e 20 6c 6f 6f 70 20 63 6f 64  he main loop cod
12c70 65 20 6f 75 74 20 6f 66 0a 2a 2a 20 74 68 65 20  e out of.** the 
12c80 73 65 70 61 72 61 74 65 20 66 69 6c 65 20 22 73  separate file "s
12c90 70 61 63 65 61 6e 61 6c 5f 74 63 6c 2e 68 22 2e  paceanal_tcl.h".
12ca0 0a 2a 2f 0a 23 69 66 20 54 43 4c 53 48 3d 3d 32  .*/.#if TCLSH==2
12cb0 0a 73 74 61 74 69 63 20 63 68 61 72 20 7a 4d 61  .static char zMa
12cc0 69 6e 6c 6f 6f 70 5b 5d 20 3d 20 0a 23 69 6e 63  inloop[] = .#inc
12cd0 6c 75 64 65 20 22 73 70 61 63 65 61 6e 61 6c 5f  lude "spaceanal_
12ce0 74 63 6c 2e 68 22 0a 3b 0a 23 65 6e 64 69 66 0a  tcl.h".;.#endif.
12cf0 0a 23 64 65 66 69 6e 65 20 54 43 4c 53 48 5f 4d  .#define TCLSH_M
12d00 41 49 4e 20 6d 61 69 6e 20 20 20 2f 2a 20 4e 65  AIN main   /* Ne
12d10 65 64 65 64 20 74 6f 20 66 61 6b 65 20 6f 75 74  eded to fake out
12d20 20 6d 6b 74 63 6c 61 70 70 20 2a 2f 0a 69 6e 74   mktclapp */.int
12d30 20 54 43 4c 53 48 5f 4d 41 49 4e 28 69 6e 74 20   TCLSH_MAIN(int 
12d40 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67  argc, char **arg
12d50 76 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  v){.  Tcl_Interp
12d60 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f   *interp;.  Tcl_
12d70 46 69 6e 64 45 78 65 63 75 74 61 62 6c 65 28 61  FindExecutable(a
12d80 72 67 76 5b 30 5d 29 3b 0a 20 20 69 6e 74 65 72  rgv[0]);.  inter
12d90 70 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 49 6e  p = Tcl_CreateIn
12da0 74 65 72 70 28 29 3b 0a 20 20 53 71 6c 69 74 65  terp();.  Sqlite
12db0 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  3_Init(interp);.
12dc0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
12dd0 53 54 0a 20 20 7b 0a 20 20 20 20 65 78 74 65 72  ST.  {.    exter
12de0 6e 20 69 6e 74 20 4d 64 35 5f 49 6e 69 74 28 54  n int Md5_Init(T
12df0 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
12e00 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
12e10 74 65 63 6f 6e 66 69 67 5f 49 6e 69 74 28 54 63  teconfig_Init(Tc
12e20 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
12e30 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
12e40 65 74 65 73 74 31 5f 49 6e 69 74 28 54 63 6c 5f  etest1_Init(Tcl_
12e50 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
12e60 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
12e70 65 73 74 32 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  est2_Init(Tcl_In
12e80 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
12e90 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
12ea0 74 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  t3_Init(Tcl_Inte
12eb0 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
12ec0 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 34   int Sqlitetest4
12ed0 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
12ee0 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
12ef0 6e 74 20 53 71 6c 69 74 65 74 65 73 74 35 5f 49  nt Sqlitetest5_I
12f00 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
12f10 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
12f20 20 53 71 6c 69 74 65 74 65 73 74 36 5f 49 6e 69   Sqlitetest6_Ini
12f30 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
12f40 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
12f50 71 6c 69 74 65 74 65 73 74 37 5f 49 6e 69 74 28  qlitetest7_Init(
12f60 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
12f70 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
12f80 69 74 65 74 65 73 74 38 5f 49 6e 69 74 28 54 63  itetest8_Init(Tc
12f90 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
12fa0 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
12fb0 65 74 65 73 74 39 5f 49 6e 69 74 28 54 63 6c 5f  etest9_Init(Tcl_
12fc0 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
12fd0 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
12fe0 65 73 74 61 73 79 6e 63 5f 49 6e 69 74 28 54 63  estasync_Init(Tc
12ff0 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
13000 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
13010 65 74 65 73 74 5f 61 75 74 6f 65 78 74 5f 49 6e  etest_autoext_In
13020 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
13030 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
13040 53 71 6c 69 74 65 74 65 73 74 5f 66 75 6e 63 5f  Sqlitetest_func_
13050 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
13060 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
13070 74 20 53 71 6c 69 74 65 74 65 73 74 5f 68 65 78  t Sqlitetest_hex
13080 69 6f 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  io_Init(Tcl_Inte
13090 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
130a0 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f   int Sqlitetest_
130b0 6d 61 6c 6c 6f 63 5f 49 6e 69 74 28 54 63 6c 5f  malloc_Init(Tcl_
130c0 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
130d0 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
130e0 65 73 74 73 63 68 65 6d 61 5f 49 6e 69 74 28 54  estschema_Init(T
130f0 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
13100 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
13110 74 65 74 65 73 74 73 73 65 5f 49 6e 69 74 28 54  tetestsse_Init(T
13120 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
13130 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
13140 74 65 74 65 73 74 74 63 6c 76 61 72 5f 49 6e 69  tetesttclvar_Ini
13150 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
13160 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
13170 71 6c 69 74 65 74 65 73 74 54 68 72 65 61 64 5f  qlitetestThread_
13180 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
13190 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
131a0 74 20 53 71 6c 69 74 65 74 65 73 74 4f 6e 65 66  t SqlitetestOnef
131b0 69 6c 65 5f 49 6e 69 74 28 29 3b 0a 0a 20 20 20  ile_Init();..   
131c0 20 4d 64 35 5f 49 6e 69 74 28 69 6e 74 65 72 70   Md5_Init(interp
131d0 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 63 6f 6e  );.    Sqlitecon
131e0 66 69 67 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  fig_Init(interp)
131f0 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
13200 31 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  1_Init(interp);.
13210 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 32 5f      Sqlitetest2_
13220 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
13230 20 20 53 71 6c 69 74 65 74 65 73 74 33 5f 49 6e    Sqlitetest3_In
13240 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
13250 53 71 6c 69 74 65 74 65 73 74 34 5f 49 6e 69 74  Sqlitetest4_Init
13260 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
13270 6c 69 74 65 74 65 73 74 35 5f 49 6e 69 74 28 69  litetest5_Init(i
13280 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
13290 74 65 74 65 73 74 36 5f 49 6e 69 74 28 69 6e 74  tetest6_Init(int
132a0 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
132b0 74 65 73 74 37 5f 49 6e 69 74 28 69 6e 74 65 72  test7_Init(inter
132c0 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
132d0 73 74 38 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  st8_Init(interp)
132e0 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
132f0 39 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  9_Init(interp);.
13300 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 61 73      Sqlitetestas
13310 79 6e 63 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  ync_Init(interp)
13320 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
13330 5f 61 75 74 6f 65 78 74 5f 49 6e 69 74 28 69 6e  _autoext_Init(in
13340 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
13350 65 74 65 73 74 5f 66 75 6e 63 5f 49 6e 69 74 28  etest_func_Init(
13360 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
13370 69 74 65 74 65 73 74 5f 68 65 78 69 6f 5f 49 6e  itetest_hexio_In
13380 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
13390 53 71 6c 69 74 65 74 65 73 74 5f 6d 61 6c 6c 6f  Sqlitetest_mallo
133a0 63 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  c_Init(interp);.
133b0 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 73 63      Sqlitetestsc
133c0 68 65 6d 61 5f 49 6e 69 74 28 69 6e 74 65 72 70  hema_Init(interp
133d0 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
133e0 74 74 63 6c 76 61 72 5f 49 6e 69 74 28 69 6e 74  ttclvar_Init(int
133f0 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
13400 74 65 73 74 54 68 72 65 61 64 5f 49 6e 69 74 28  testThread_Init(
13410 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
13420 69 74 65 74 65 73 74 4f 6e 65 66 69 6c 65 5f 49  itetestOnefile_I
13430 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 0a 23 69  nit(interp);..#i
13440 66 64 65 66 20 53 51 4c 49 54 45 5f 53 53 45 0a  fdef SQLITE_SSE.
13450 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 73 73      Sqlitetestss
13460 65 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  e_Init(interp);.
13470 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69  #endif.  }.#endi
13480 66 0a 20 20 69 66 28 20 61 72 67 63 3e 3d 32 20  f.  if( argc>=2 
13490 7c 7c 20 54 43 4c 53 48 3d 3d 32 20 29 7b 0a 20  || TCLSH==2 ){. 
134a0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 68     int i;.    ch
134b0 61 72 20 7a 41 72 67 63 5b 33 32 5d 3b 0a 20 20  ar zArgc[32];.  
134c0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
134d0 74 66 28 73 69 7a 65 6f 66 28 7a 41 72 67 63 29  tf(sizeof(zArgc)
134e0 2c 20 7a 41 72 67 63 2c 20 22 25 64 22 2c 20 61  , zArgc, "%d", a
134f0 72 67 63 2d 28 33 2d 54 43 4c 53 48 29 29 3b 0a  rgc-(3-TCLSH));.
13500 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69      Tcl_SetVar(i
13510 6e 74 65 72 70 2c 22 61 72 67 63 22 2c 20 7a 41  nterp,"argc", zA
13520 72 67 63 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f  rgc, TCL_GLOBAL_
13530 4f 4e 4c 59 29 3b 0a 20 20 20 20 54 63 6c 5f 53  ONLY);.    Tcl_S
13540 65 74 56 61 72 28 69 6e 74 65 72 70 2c 22 61 72  etVar(interp,"ar
13550 67 76 30 22 2c 61 72 67 76 5b 31 5d 2c 54 43 4c  gv0",argv[1],TCL
13560 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20  _GLOBAL_ONLY);. 
13570 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e     Tcl_SetVar(in
13580 74 65 72 70 2c 22 61 72 67 76 22 2c 20 22 22 2c  terp,"argv", "",
13590 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59   TCL_GLOBAL_ONLY
135a0 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 33 2d 54  );.    for(i=3-T
135b0 43 4c 53 48 3b 20 69 3c 61 72 67 63 3b 20 69 2b  CLSH; i<argc; i+
135c0 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65  +){.      Tcl_Se
135d0 74 56 61 72 28 69 6e 74 65 72 70 2c 20 22 61 72  tVar(interp, "ar
135e0 67 76 22 2c 20 61 72 67 76 5b 69 5d 2c 0a 20 20  gv", argv[i],.  
135f0 20 20 20 20 20 20 20 20 54 43 4c 5f 47 4c 4f 42          TCL_GLOB
13600 41 4c 5f 4f 4e 4c 59 20 7c 20 54 43 4c 5f 4c 49  AL_ONLY | TCL_LI
13610 53 54 5f 45 4c 45 4d 45 4e 54 20 7c 20 54 43 4c  ST_ELEMENT | TCL
13620 5f 41 50 50 45 4e 44 5f 56 41 4c 55 45 29 3b 0a  _APPEND_VALUE);.
13630 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 54 43      }.    if( TC
13640 4c 53 48 3d 3d 31 20 26 26 20 54 63 6c 5f 45 76  LSH==1 && Tcl_Ev
13650 61 6c 46 69 6c 65 28 69 6e 74 65 72 70 2c 20 61  alFile(interp, a
13660 72 67 76 5b 31 5d 29 21 3d 54 43 4c 5f 4f 4b 20  rgv[1])!=TCL_OK 
13670 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
13680 68 61 72 20 2a 7a 49 6e 66 6f 20 3d 20 54 63 6c  har *zInfo = Tcl
13690 5f 47 65 74 56 61 72 28 69 6e 74 65 72 70 2c 20  _GetVar(interp, 
136a0 22 65 72 72 6f 72 49 6e 66 6f 22 2c 20 54 43 4c  "errorInfo", TCL
136b0 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20  _GLOBAL_ONLY);. 
136c0 20 20 20 20 20 69 66 28 20 7a 49 6e 66 6f 3d 3d       if( zInfo==
136d0 30 20 29 20 7a 49 6e 66 6f 20 3d 20 69 6e 74 65  0 ) zInfo = inte
136e0 72 70 2d 3e 72 65 73 75 6c 74 3b 0a 20 20 20 20  rp->result;.    
136f0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
13700 2c 22 25 73 3a 20 25 73 5c 6e 22 2c 20 2a 61 72  ,"%s: %s\n", *ar
13710 67 76 2c 20 7a 49 6e 66 6f 29 3b 0a 20 20 20 20  gv, zInfo);.    
13720 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
13730 7d 0a 20 20 7d 0a 20 20 69 66 28 20 61 72 67 63  }.  }.  if( argc
13740 3c 3d 31 20 7c 7c 20 54 43 4c 53 48 3d 3d 32 20  <=1 || TCLSH==2 
13750 29 7b 0a 20 20 20 20 54 63 6c 5f 47 6c 6f 62 61  ){.    Tcl_Globa
13760 6c 45 76 61 6c 28 69 6e 74 65 72 70 2c 20 7a 4d  lEval(interp, zM
13770 61 69 6e 6c 6f 6f 70 29 3b 0a 20 20 7d 0a 20 20  ainloop);.  }.  
13780 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
13790 69 66 20 2f 2a 20 54 43 4c 53 48 20 2a 2f 0a     if /* TCLSH */.