/ Hex Artifact Content
Login

Artifact ec69eb9ad56d03fbf7570ca1ca5ea947d1ec4b6f:


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 31 37 39 20 32 30 30 37  e.c,v 1.179 2007
0220: 2f 30 34 2f 30 36 20 31 35 3a 30 32 3a 31 34 20  /04/06 15:02:14 
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 0a 2f  clude "tcl.h"../
0250: 2a 0a 2a 2a 20 53 6f 6d 65 20 61 64 64 69 74 69  *.** Some additi
0260: 6f 6e 61 6c 20 69 6e 63 6c 75 64 65 20 66 69 6c  onal include fil
0270: 65 73 20 61 72 65 20 6e 65 65 64 65 64 20 69 66  es are needed if
0280: 20 74 68 69 73 20 66 69 6c 65 20 69 73 20 6e 6f   this file is no
0290: 74 0a 2a 2a 20 61 70 70 65 6e 64 65 64 20 74 6f  t.** appended to
02a0: 20 74 68 65 20 61 6d 61 6c 67 61 6d 61 74 69 6f   the amalgamatio
02b0: 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  n..*/.#ifndef SQ
02c0: 4c 49 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f  LITE_AMALGAMATIO
02d0: 4e 0a 23 20 69 6e 63 6c 75 64 65 20 22 73 71 6c  N.# include "sql
02e0: 69 74 65 49 6e 74 2e 68 22 0a 23 20 69 6e 63 6c  iteInt.h".# incl
02f0: 75 64 65 20 22 68 61 73 68 2e 68 22 0a 23 20 69  ude "hash.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 68 61 72 20 7a 53  l[] */.  char zS
0b10: 71 6c 5b 31 5d 3b 20 20 20 20 20 20 20 20 20 20  ql[1];          
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 2f 2a 0a 2a 2a 20 54 68 65 72  /.};../*.** Ther
0b50: 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63  e is one instanc
0b60: 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74  e of this struct
0b70: 75 72 65 20 66 6f 72 20 65 61 63 68 20 53 51 4c  ure for each SQL
0b80: 69 74 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ite database.** 
0b90: 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 6f 70  that has been op
0ba0: 65 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 69  ened by the SQLi
0bb0: 74 65 20 54 43 4c 20 69 6e 74 65 72 66 61 63 65  te TCL interface
0bc0: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
0bd0: 75 63 74 20 53 71 6c 69 74 65 44 62 20 53 71 6c  uct SqliteDb Sql
0be0: 69 74 65 44 62 3b 0a 73 74 72 75 63 74 20 53 71  iteDb;.struct Sq
0bf0: 6c 69 74 65 44 62 20 7b 0a 20 20 73 71 6c 69 74  liteDb {.  sqlit
0c00: 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
0c10: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 72 65        /* The "re
0c20: 61 6c 22 20 64 61 74 61 62 61 73 65 20 73 74 72  al" database str
0c30: 75 63 74 75 72 65 2e 20 4d 55 53 54 20 42 45 20  ucture. MUST BE 
0c40: 46 49 52 53 54 20 2a 2f 0a 20 20 54 63 6c 5f 49  FIRST */.  Tcl_I
0c50: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 20 20  nterp *interp;  
0c60: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 74        /* The int
0c70: 65 72 70 72 65 74 65 72 20 75 73 65 64 20 66 6f  erpreter used fo
0c80: 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  r this database 
0c90: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 42 75 73 79  */.  char *zBusy
0ca0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0cb0: 2f 2a 20 54 68 65 20 62 75 73 79 20 63 61 6c 6c  /* The busy call
0cc0: 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a  back routine */.
0cd0: 20 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b    char *zCommit;
0ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0cf0: 54 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20  The commit hook 
0d00: 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65  callback routine
0d10: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 72 61   */.  char *zTra
0d20: 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ce;             
0d30: 20 2f 2a 20 54 68 65 20 74 72 61 63 65 20 63 61   /* The trace ca
0d40: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a  llback routine *
0d50: 2f 0a 20 20 63 68 61 72 20 2a 7a 50 72 6f 66 69  /.  char *zProfi
0d60: 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  le;            /
0d70: 2a 20 54 68 65 20 70 72 6f 66 69 6c 65 20 63 61  * The profile ca
0d80: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a  llback routine *
0d90: 2f 0a 20 20 63 68 61 72 20 2a 7a 50 72 6f 67 72  /.  char *zProgr
0da0: 65 73 73 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ess;           /
0db0: 2a 20 54 68 65 20 70 72 6f 67 72 65 73 73 20 63  * The progress c
0dc0: 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20  allback routine 
0dd0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 75 74 68  */.  char *zAuth
0de0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0df0: 2f 2a 20 54 68 65 20 61 75 74 68 6f 72 69 7a 61  /* The authoriza
0e00: 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 20 72 6f  tion callback ro
0e10: 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20  utine */.  char 
0e20: 2a 7a 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20  *zNull;         
0e30: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 74 6f        /* Text to
0e40: 20 73 75 62 73 74 69 74 75 74 65 20 66 6f 72 20   substitute for 
0e50: 61 6e 20 53 51 4c 20 4e 55 4c 4c 20 76 61 6c 75  an SQL NULL valu
0e60: 65 20 2a 2f 0a 20 20 53 71 6c 46 75 6e 63 20 2a  e */.  SqlFunc *
0e70: 70 46 75 6e 63 3b 20 20 20 20 20 20 20 20 20 20  pFunc;          
0e80: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 53 51 4c    /* List of SQL
0e90: 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20   functions */.  
0ea0: 54 63 6c 5f 4f 62 6a 20 2a 70 55 70 64 61 74 65  Tcl_Obj *pUpdate
0eb0: 48 6f 6f 6b 3b 20 20 20 20 20 20 2f 2a 20 55 70  Hook;      /* Up
0ec0: 64 61 74 65 20 68 6f 6f 6b 20 73 63 72 69 70 74  date hook script
0ed0: 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20 20 54   (if any) */.  T
0ee0: 63 6c 5f 4f 62 6a 20 2a 70 52 6f 6c 6c 62 61 63  cl_Obj *pRollbac
0ef0: 6b 48 6f 6f 6b 3b 20 20 20 20 2f 2a 20 52 6f 6c  kHook;    /* Rol
0f00: 6c 62 61 63 6b 20 68 6f 6f 6b 20 73 63 72 69 70  lback hook scrip
0f10: 74 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20 20  t (if any) */.  
0f20: 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43 6f 6c  SqlCollate *pCol
0f30: 6c 61 74 65 3b 20 20 20 20 20 20 2f 2a 20 4c 69  late;      /* Li
0f40: 73 74 20 6f 66 20 53 51 4c 20 63 6f 6c 6c 61 74  st of SQL collat
0f50: 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ion functions */
0f60: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
0f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0f80: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 6f 66 20   Return code of 
0f90: 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69  most recent sqli
0fa0: 74 65 33 5f 65 78 65 63 28 29 20 2a 2f 0a 20 20  te3_exec() */.  
0fb0: 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f 6c 6c 61 74  Tcl_Obj *pCollat
0fc0: 65 4e 65 65 64 65 64 3b 20 20 20 2f 2a 20 43 6f  eNeeded;   /* Co
0fd0: 6c 6c 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 73  llation needed s
0fe0: 63 72 69 70 74 20 2a 2f 0a 20 20 53 71 6c 50 72  cript */.  SqlPr
0ff0: 65 70 61 72 65 64 53 74 6d 74 20 2a 73 74 6d 74  eparedStmt *stmt
1000: 4c 69 73 74 3b 20 2f 2a 20 4c 69 73 74 20 6f 66  List; /* List of
1010: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
1020: 65 6e 74 73 2a 2f 0a 20 20 53 71 6c 50 72 65 70  ents*/.  SqlPrep
1030: 61 72 65 64 53 74 6d 74 20 2a 73 74 6d 74 4c 61  aredStmt *stmtLa
1040: 73 74 3b 20 2f 2a 20 4c 61 73 74 20 73 74 61 74  st; /* Last stat
1050: 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 6c 69 73  ement in the lis
1060: 74 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 53 74  t */.  int maxSt
1070: 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  mt;             
1080: 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 6d 61    /* The next ma
1090: 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
10a0: 73 74 6d 74 4c 69 73 74 20 2a 2f 0a 20 20 69 6e  stmtList */.  in
10b0: 74 20 6e 53 74 6d 74 3b 20 20 20 20 20 20 20 20  t nStmt;        
10c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
10d0: 65 72 20 6f 66 20 73 74 61 74 65 6d 65 6e 74 73  er of statements
10e0: 20 69 6e 20 73 74 6d 74 4c 69 73 74 20 2a 2f 0a   in stmtList */.
10f0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 61  };../*.** Look a
1100: 74 20 74 68 65 20 73 63 72 69 70 74 20 70 72 65  t the script pre
1110: 66 69 78 20 69 6e 20 70 43 6d 64 2e 20 20 57 65  fix in pCmd.  We
1120: 20 77 69 6c 6c 20 62 65 20 65 78 65 63 75 74 69   will be executi
1130: 6e 67 20 74 68 69 73 20 73 63 72 69 70 74 0a 2a  ng this script.*
1140: 2a 20 61 66 74 65 72 20 66 69 72 73 74 20 61 70  * after first ap
1150: 70 65 6e 64 69 6e 67 20 6f 6e 65 20 6f 72 20 6d  pending one or m
1160: 6f 72 65 20 61 72 67 75 6d 65 6e 74 73 2e 20 20  ore arguments.  
1170: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 61  This routine ana
1180: 6c 79 7a 65 73 0a 2a 2a 20 74 68 65 20 73 63 72  lyzes.** the scr
1190: 69 70 74 20 74 6f 20 73 65 65 20 69 66 20 69 74  ipt to see if it
11a0: 20 69 73 20 73 61 66 65 20 74 6f 20 75 73 65 20   is safe to use 
11b0: 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 6f  Tcl_EvalObjv() o
11c0: 6e 20 74 68 65 20 73 63 72 69 70 74 0a 2a 2a 20  n the script.** 
11d0: 72 61 74 68 65 72 20 74 68 61 6e 20 74 68 65 20  rather than the 
11e0: 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20 54 63 6c  more general Tcl
11f0: 5f 45 76 61 6c 45 78 28 29 2e 20 20 54 63 6c 5f  _EvalEx().  Tcl_
1200: 45 76 61 6c 4f 62 6a 76 28 29 20 69 73 20 6d 75  EvalObjv() is mu
1210: 63 68 0a 2a 2a 20 66 61 73 74 65 72 2e 0a 2a 2a  ch.** faster..**
1220: 0a 2a 2a 20 53 63 72 69 70 74 73 20 74 68 61 74  .** Scripts that
1230: 20 61 72 65 20 73 61 66 65 20 74 6f 20 75 73 65   are safe to use
1240: 20 77 69 74 68 20 54 63 6c 5f 45 76 61 6c 4f 62   with Tcl_EvalOb
1250: 6a 76 28 29 20 63 6f 6e 73 69 73 74 73 20 6f 66  jv() consists of
1260: 20 61 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 20 6e 61   a.** command na
1270: 6d 65 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 7a  me followed by z
1280: 65 72 6f 20 6f 72 20 6d 6f 72 65 20 61 72 67 75  ero or more argu
1290: 6d 65 6e 74 73 20 77 69 74 68 20 6e 6f 20 5b 2e  ments with no [.
12a0: 2e 2e 5d 20 6f 72 20 24 0a 2a 2a 20 6f 72 20 7b  ..] or $.** or {
12b0: 2e 2e 2e 7d 20 6f 72 20 3b 20 74 6f 20 62 65 20  ...} or ; to be 
12c0: 73 65 65 6e 20 61 6e 79 77 68 65 72 65 2e 20 20  seen anywhere.  
12d0: 4d 6f 73 74 20 63 61 6c 6c 62 61 63 6b 20 73 63  Most callback sc
12e0: 72 69 70 74 73 20 63 6f 6e 73 69 73 74 0a 2a 2a  ripts consist.**
12f0: 20 6f 66 20 6a 75 73 74 20 61 20 73 69 6e 67 6c   of just a singl
1300: 65 20 70 72 6f 63 65 64 75 72 65 20 6e 61 6d 65  e procedure name
1310: 20 61 6e 64 20 74 68 65 79 20 6d 65 65 74 20 74   and they meet t
1320: 68 69 73 20 72 65 71 75 69 72 65 6d 65 6e 74 2e  his requirement.
1330: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
1340: 61 66 65 54 6f 55 73 65 45 76 61 6c 4f 62 6a 76  afeToUseEvalObjv
1350: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
1360: 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a 70 43  erp, Tcl_Obj *pC
1370: 6d 64 29 7b 0a 20 20 2f 2a 20 57 65 20 63 6f 75  md){.  /* We cou
1380: 6c 64 20 74 72 79 20 74 6f 20 64 6f 20 73 6f 6d  ld try to do som
1390: 65 74 68 69 6e 67 20 77 69 74 68 20 54 63 6c 5f  ething with Tcl_
13a0: 50 61 72 73 65 28 29 2e 20 20 42 75 74 20 77 65  Parse().  But we
13b0: 20 77 69 6c 6c 20 69 6e 73 74 65 61 64 0a 20 20   will instead.  
13c0: 2a 2a 20 6a 75 73 74 20 64 6f 20 61 20 73 65 61  ** just do a sea
13d0: 72 63 68 20 66 6f 72 20 66 6f 72 62 69 64 64 65  rch for forbidde
13e0: 6e 20 63 68 61 72 61 63 74 65 72 73 2e 20 20 49  n characters.  I
13f0: 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 72  f any of the for
1400: 62 69 64 64 65 6e 0a 20 20 2a 2a 20 63 68 61 72  bidden.  ** char
1410: 61 63 74 65 72 73 20 61 70 70 65 61 72 20 69 6e  acters appear in
1420: 20 70 43 6d 64 2c 20 77 65 20 77 69 6c 6c 20 72   pCmd, we will r
1430: 65 70 6f 72 74 20 74 68 65 20 73 74 72 69 6e 67  eport the string
1440: 20 61 73 20 75 6e 73 61 66 65 2e 0a 20 20 2a 2f   as unsafe..  */
1450: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1460: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 7a 20 3d  ;.  int n;.  z =
1470: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
1480: 6f 6d 4f 62 6a 28 70 43 6d 64 2c 20 26 6e 29 3b  omObj(pCmd, &n);
1490: 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20  .  while( n-- > 
14a0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 20 3d  0 ){.    int c =
14b0: 20 2a 28 7a 2b 2b 29 3b 0a 20 20 20 20 69 66 28   *(z++);.    if(
14c0: 20 63 3d 3d 27 24 27 20 7c 7c 20 63 3d 3d 27 5b   c=='$' || c=='[
14d0: 27 20 7c 7c 20 63 3d 3d 27 3b 27 20 29 20 72 65  ' || c==';' ) re
14e0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65  turn 0;.  }.  re
14f0: 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 1;.}../*.**
1500: 20 46 69 6e 64 20 61 6e 20 53 71 6c 46 75 6e 63   Find an SqlFunc
1510: 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68 20   structure with 
1520: 74 68 65 20 67 69 76 65 6e 20 6e 61 6d 65 2e 20  the given name. 
1530: 20 4f 72 20 63 72 65 61 74 65 20 61 20 6e 65 77   Or create a new
1540: 0a 2a 2a 20 6f 6e 65 20 69 66 20 61 6e 20 65 78  .** one if an ex
1550: 69 73 74 69 6e 67 20 6f 6e 65 20 63 61 6e 6e 6f  isting one canno
1560: 74 20 62 65 20 66 6f 75 6e 64 2e 20 20 52 65 74  t be found.  Ret
1570: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
1580: 20 74 68 65 0a 2a 2a 20 73 74 72 75 63 74 75 72   the.** structur
1590: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 71 6c  e..*/.static Sql
15a0: 46 75 6e 63 20 2a 66 69 6e 64 53 71 6c 46 75 6e  Func *findSqlFun
15b0: 63 28 53 71 6c 69 74 65 44 62 20 2a 70 44 62 2c  c(SqliteDb *pDb,
15c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
15d0: 6d 65 29 7b 0a 20 20 53 71 6c 46 75 6e 63 20 2a  me){.  SqlFunc *
15e0: 70 2c 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  p, *pNew;.  int 
15f0: 69 3b 0a 20 20 70 4e 65 77 20 3d 20 28 53 71 6c  i;.  pNew = (Sql
1600: 46 75 6e 63 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28  Func*)Tcl_Alloc(
1610: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 2b   sizeof(*pNew) +
1620: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 20 2b   strlen(zName) +
1630: 20 31 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 7a 4e   1 );.  pNew->zN
1640: 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e  ame = (char*)&pN
1650: 65 77 5b 31 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  ew[1];.  for(i=0
1660: 3b 20 7a 4e 61 6d 65 5b 69 5d 3b 20 69 2b 2b 29  ; zName[i]; i++)
1670: 7b 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 5b 69 5d  { pNew->zName[i]
1680: 20 3d 20 74 6f 6c 6f 77 65 72 28 7a 4e 61 6d 65   = tolower(zName
1690: 5b 69 5d 29 3b 20 7d 0a 20 20 70 4e 65 77 2d 3e  [i]); }.  pNew->
16a0: 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b 0a 20 20  zName[i] = 0;.  
16b0: 66 6f 72 28 70 3d 70 44 62 2d 3e 70 46 75 6e 63  for(p=pDb->pFunc
16c0: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
16d0: 7b 20 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  { .    if( strcm
16e0: 70 28 70 2d 3e 7a 4e 61 6d 65 2c 20 70 4e 65 77  p(p->zName, pNew
16f0: 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ->zName)==0 ){. 
1700: 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63       Tcl_Free((c
1710: 68 61 72 2a 29 70 4e 65 77 29 3b 0a 20 20 20 20  har*)pNew);.    
1720: 20 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20 20    return p;.    
1730: 7d 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 69 6e  }.  }.  pNew->in
1740: 74 65 72 70 20 3d 20 70 44 62 2d 3e 69 6e 74 65  terp = pDb->inte
1750: 72 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 63 72  rp;.  pNew->pScr
1760: 69 70 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  ipt = 0;.  pNew-
1770: 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 70 46  >pNext = pDb->pF
1780: 75 6e 63 3b 0a 20 20 70 44 62 2d 3e 70 46 75 6e  unc;.  pDb->pFun
1790: 63 20 3d 20 70 4e 65 77 3b 0a 20 20 72 65 74 75  c = pNew;.  retu
17a0: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
17b0: 2a 20 46 69 6e 61 6c 69 7a 65 20 61 6e 64 20 66  * Finalize and f
17c0: 72 65 65 20 61 20 6c 69 73 74 20 6f 66 20 70 72  ree a list of pr
17d0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
17e0: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s.*/.static void
17f0: 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28   flushStmtCache(
1800: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 29   SqliteDb *pDb )
1810: 7b 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64 53  {.  SqlPreparedS
1820: 74 6d 74 20 2a 70 50 72 65 53 74 6d 74 3b 0a 0a  tmt *pPreStmt;..
1830: 20 20 77 68 69 6c 65 28 20 20 70 44 62 2d 3e 73    while(  pDb->s
1840: 74 6d 74 4c 69 73 74 20 29 7b 0a 20 20 20 20 73  tmtList ){.    s
1850: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
1860: 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 2d 3e   pDb->stmtList->
1870: 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 70 50 72  pStmt );.    pPr
1880: 65 53 74 6d 74 20 3d 20 70 44 62 2d 3e 73 74 6d  eStmt = pDb->stm
1890: 74 4c 69 73 74 3b 0a 20 20 20 20 70 44 62 2d 3e  tList;.    pDb->
18a0: 73 74 6d 74 4c 69 73 74 20 3d 20 70 44 62 2d 3e  stmtList = pDb->
18b0: 73 74 6d 74 4c 69 73 74 2d 3e 70 4e 65 78 74 3b  stmtList->pNext;
18c0: 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 20 28  .    Tcl_Free( (
18d0: 63 68 61 72 2a 29 70 50 72 65 53 74 6d 74 20 29  char*)pPreStmt )
18e0: 3b 0a 20 20 7d 0a 20 20 70 44 62 2d 3e 6e 53 74  ;.  }.  pDb->nSt
18f0: 6d 74 20 3d 20 30 3b 0a 20 20 70 44 62 2d 3e 73  mt = 0;.  pDb->s
1900: 74 6d 74 4c 61 73 74 20 3d 20 30 3b 0a 7d 0a 0a  tmtLast = 0;.}..
1910: 2f 2a 0a 2a 2a 20 54 43 4c 20 63 61 6c 6c 73 20  /*.** TCL calls 
1920: 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 77  this procedure w
1930: 68 65 6e 20 61 6e 20 73 71 6c 69 74 65 33 20 64  hen an sqlite3 d
1940: 61 74 61 62 61 73 65 20 63 6f 6d 6d 61 6e 64 20  atabase command 
1950: 69 73 0a 2a 2a 20 64 65 6c 65 74 65 64 2e 0a 2a  is.** deleted..*
1960: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44 62  /.static void Db
1970: 44 65 6c 65 74 65 43 6d 64 28 76 6f 69 64 20 2a  DeleteCmd(void *
1980: 64 62 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20  db){.  SqliteDb 
1990: 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62  *pDb = (SqliteDb
19a0: 2a 29 64 62 3b 0a 20 20 66 6c 75 73 68 53 74 6d  *)db;.  flushStm
19b0: 74 43 61 63 68 65 28 70 44 62 29 3b 0a 20 20 73  tCache(pDb);.  s
19c0: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 44 62  qlite3_close(pDb
19d0: 2d 3e 64 62 29 3b 0a 20 20 77 68 69 6c 65 28 20  ->db);.  while( 
19e0: 70 44 62 2d 3e 70 46 75 6e 63 20 29 7b 0a 20 20  pDb->pFunc ){.  
19f0: 20 20 53 71 6c 46 75 6e 63 20 2a 70 46 75 6e 63    SqlFunc *pFunc
1a00: 20 3d 20 70 44 62 2d 3e 70 46 75 6e 63 3b 0a 20   = pDb->pFunc;. 
1a10: 20 20 20 70 44 62 2d 3e 70 46 75 6e 63 20 3d 20     pDb->pFunc = 
1a20: 70 46 75 6e 63 2d 3e 70 4e 65 78 74 3b 0a 20 20  pFunc->pNext;.  
1a30: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
1a40: 6e 74 28 70 46 75 6e 63 2d 3e 70 53 63 72 69 70  nt(pFunc->pScrip
1a50: 74 29 3b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65  t);.    Tcl_Free
1a60: 28 28 63 68 61 72 2a 29 70 46 75 6e 63 29 3b 0a  ((char*)pFunc);.
1a70: 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 44 62    }.  while( pDb
1a80: 2d 3e 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20  ->pCollate ){.  
1a90: 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43    SqlCollate *pC
1aa0: 6f 6c 6c 61 74 65 20 3d 20 70 44 62 2d 3e 70 43  ollate = pDb->pC
1ab0: 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 70 44 62 2d  ollate;.    pDb-
1ac0: 3e 70 43 6f 6c 6c 61 74 65 20 3d 20 70 43 6f 6c  >pCollate = pCol
1ad0: 6c 61 74 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  late->pNext;.   
1ae0: 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a   Tcl_Free((char*
1af0: 29 70 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 7d 0a  )pCollate);.  }.
1b00: 20 20 69 66 28 20 70 44 62 2d 3e 7a 42 75 73 79    if( pDb->zBusy
1b10: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65   ){.    Tcl_Free
1b20: 28 70 44 62 2d 3e 7a 42 75 73 79 29 3b 0a 20 20  (pDb->zBusy);.  
1b30: 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72  }.  if( pDb->zTr
1b40: 61 63 65 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46  ace ){.    Tcl_F
1b50: 72 65 65 28 70 44 62 2d 3e 7a 54 72 61 63 65 29  ree(pDb->zTrace)
1b60: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d  ;.  }.  if( pDb-
1b70: 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20  >zProfile ){.   
1b80: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
1b90: 50 72 6f 66 69 6c 65 29 3b 0a 20 20 7d 0a 20 20  Profile);.  }.  
1ba0: 69 66 28 20 70 44 62 2d 3e 7a 41 75 74 68 20 29  if( pDb->zAuth )
1bb0: 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70  {.    Tcl_Free(p
1bc0: 44 62 2d 3e 7a 41 75 74 68 29 3b 0a 20 20 7d 0a  Db->zAuth);.  }.
1bd0: 20 20 69 66 28 20 70 44 62 2d 3e 7a 4e 75 6c 6c    if( pDb->zNull
1be0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65   ){.    Tcl_Free
1bf0: 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20 20  (pDb->zNull);.  
1c00: 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 55 70  }.  if( pDb->pUp
1c10: 64 61 74 65 48 6f 6f 6b 20 29 7b 0a 20 20 20 20  dateHook ){.    
1c20: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
1c30: 28 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f  (pDb->pUpdateHoo
1c40: 6b 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44  k);.  }.  if( pD
1c50: 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b  b->pRollbackHook
1c60: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72   ){.    Tcl_Decr
1c70: 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 52  RefCount(pDb->pR
1c80: 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 29 3b 0a 20 20  ollbackHook);.  
1c90: 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 43 6f  }.  if( pDb->pCo
1ca0: 6c 6c 61 74 65 4e 65 65 64 65 64 20 29 7b 0a 20  llateNeeded ){. 
1cb0: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
1cc0: 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74  unt(pDb->pCollat
1cd0: 65 4e 65 65 64 65 64 29 3b 0a 20 20 7d 0a 20 20  eNeeded);.  }.  
1ce0: 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29  Tcl_Free((char*)
1cf0: 70 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  pDb);.}../*.** T
1d00: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1d10: 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 64 61 74  alled when a dat
1d20: 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6c 6f  abase file is lo
1d30: 63 6b 65 64 20 77 68 69 6c 65 20 74 72 79 69 6e  cked while tryin
1d40: 67 0a 2a 2a 20 74 6f 20 65 78 65 63 75 74 65 20  g.** to execute 
1d50: 53 51 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  SQL..*/.static i
1d60: 6e 74 20 44 62 42 75 73 79 48 61 6e 64 6c 65 72  nt DbBusyHandler
1d70: 28 76 6f 69 64 20 2a 63 64 2c 20 69 6e 74 20 6e  (void *cd, int n
1d80: 54 72 69 65 73 29 7b 0a 20 20 53 71 6c 69 74 65  Tries){.  Sqlite
1d90: 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74  Db *pDb = (Sqlit
1da0: 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e 74 20 72  eDb*)cd;.  int r
1db0: 63 3b 0a 20 20 63 68 61 72 20 7a 56 61 6c 5b 33  c;.  char zVal[3
1dc0: 30 5d 3b 0a 0a 20 20 73 70 72 69 6e 74 66 28 7a  0];..  sprintf(z
1dd0: 56 61 6c 2c 20 22 25 64 22 2c 20 6e 54 72 69 65  Val, "%d", nTrie
1de0: 73 29 3b 0a 20 20 72 63 20 3d 20 54 63 6c 5f 56  s);.  rc = Tcl_V
1df0: 61 72 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65  arEval(pDb->inte
1e00: 72 70 2c 20 70 44 62 2d 3e 7a 42 75 73 79 2c 20  rp, pDb->zBusy, 
1e10: 22 20 22 2c 20 7a 56 61 6c 2c 20 28 63 68 61 72  " ", zVal, (char
1e20: 2a 29 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  *)0);.  if( rc!=
1e30: 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28 54  TCL_OK || atoi(T
1e40: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
1e50: 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 29  lt(pDb->interp))
1e60: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
1e70: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  ;.  }.  return 1
1e80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1e90: 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b  routine is invok
1ea0: 65 64 20 61 73 20 74 68 65 20 27 70 72 6f 67 72  ed as the 'progr
1eb0: 65 73 73 20 63 61 6c 6c 62 61 63 6b 27 20 66 6f  ess callback' fo
1ec0: 72 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  r the database..
1ed0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62  */.static int Db
1ee0: 50 72 6f 67 72 65 73 73 48 61 6e 64 6c 65 72 28  ProgressHandler(
1ef0: 76 6f 69 64 20 2a 63 64 29 7b 0a 20 20 53 71 6c  void *cd){.  Sql
1f00: 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71  iteDb *pDb = (Sq
1f10: 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e  liteDb*)cd;.  in
1f20: 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
1f30: 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20   pDb->zProgress 
1f40: 29 3b 0a 20 20 72 63 20 3d 20 54 63 6c 5f 45 76  );.  rc = Tcl_Ev
1f50: 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  al(pDb->interp, 
1f60: 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 29 3b  pDb->zProgress);
1f70: 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f  .  if( rc!=TCL_O
1f80: 4b 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65  K || atoi(Tcl_Ge
1f90: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44  tStringResult(pD
1fa0: 62 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a 20  b->interp)) ){. 
1fb0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1fc0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
1fd0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1fe0: 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20  MIT_TRACE./*.** 
1ff0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2000: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 53 51  called by the SQ
2010: 4c 69 74 65 20 74 72 61 63 65 20 68 61 6e 64 6c  Lite trace handl
2020: 65 72 20 77 68 65 6e 65 76 65 72 20 61 20 6e 65  er whenever a ne
2030: 77 0a 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 53 51  w.** block of SQ
2040: 4c 20 69 73 20 65 78 65 63 75 74 65 64 2e 20 20  L is executed.  
2050: 54 68 65 20 54 43 4c 20 73 63 72 69 70 74 20 69  The TCL script i
2060: 6e 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 69 73  n pDb->zTrace is
2070: 20 65 78 65 63 75 74 65 64 2e 0a 2a 2f 0a 73 74   executed..*/.st
2080: 61 74 69 63 20 76 6f 69 64 20 44 62 54 72 61 63  atic void DbTrac
2090: 65 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63  eHandler(void *c
20a0: 64 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  d, const char *z
20b0: 53 71 6c 29 7b 0a 20 20 53 71 6c 69 74 65 44 62  Sql){.  SqliteDb
20c0: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
20d0: 62 2a 29 63 64 3b 0a 20 20 54 63 6c 5f 44 53 74  b*)cd;.  Tcl_DSt
20e0: 72 69 6e 67 20 73 74 72 3b 0a 0a 20 20 54 63 6c  ring str;..  Tcl
20f0: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74  _DStringInit(&st
2100: 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  r);.  Tcl_DStrin
2110: 67 41 70 70 65 6e 64 28 26 73 74 72 2c 20 70 44  gAppend(&str, pD
2120: 62 2d 3e 7a 54 72 61 63 65 2c 20 2d 31 29 3b 0a  b->zTrace, -1);.
2130: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
2140: 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c  endElement(&str,
2150: 20 7a 53 71 6c 29 3b 0a 20 20 54 63 6c 5f 45 76   zSql);.  Tcl_Ev
2160: 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  al(pDb->interp, 
2170: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65  Tcl_DStringValue
2180: 28 26 73 74 72 29 29 3b 0a 20 20 54 63 6c 5f 44  (&str));.  Tcl_D
2190: 53 74 72 69 6e 67 46 72 65 65 28 26 73 74 72 29  StringFree(&str)
21a0: 3b 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73  ;.  Tcl_ResetRes
21b0: 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29  ult(pDb->interp)
21c0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
21d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
21e0: 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73  TRACE./*.** This
21f0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
2200: 65 64 20 62 79 20 74 68 65 20 53 51 4c 69 74 65  ed by the SQLite
2210: 20 70 72 6f 66 69 6c 65 20 68 61 6e 64 6c 65 72   profile handler
2220: 20 61 66 74 65 72 20 61 20 73 74 61 74 65 6d 65   after a stateme
2230: 6e 74 0a 2a 2a 20 53 51 4c 20 68 61 73 20 65 78  nt.** SQL has ex
2240: 65 63 75 74 65 64 2e 20 20 54 68 65 20 54 43 4c  ecuted.  The TCL
2250: 20 73 63 72 69 70 74 20 69 6e 20 70 44 62 2d 3e   script in pDb->
2260: 7a 50 72 6f 66 69 6c 65 20 69 73 20 65 76 61 6c  zProfile is eval
2270: 75 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  uated..*/.static
2280: 20 76 6f 69 64 20 44 62 50 72 6f 66 69 6c 65 48   void DbProfileH
2290: 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 2c  andler(void *cd,
22a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
22b0: 6c 2c 20 73 71 6c 69 74 65 5f 75 69 6e 74 36 34  l, sqlite_uint64
22c0: 20 74 6d 29 7b 0a 20 20 53 71 6c 69 74 65 44 62   tm){.  SqliteDb
22d0: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
22e0: 62 2a 29 63 64 3b 0a 20 20 54 63 6c 5f 44 53 74  b*)cd;.  Tcl_DSt
22f0: 72 69 6e 67 20 73 74 72 3b 0a 20 20 63 68 61 72  ring str;.  char
2300: 20 7a 54 6d 5b 31 30 30 5d 3b 0a 0a 20 20 73 71   zTm[100];..  sq
2310: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
2320: 69 7a 65 6f 66 28 7a 54 6d 29 2d 31 2c 20 7a 54  izeof(zTm)-1, zT
2330: 6d 2c 20 22 25 6c 6c 64 22 2c 20 74 6d 29 3b 0a  m, "%lld", tm);.
2340: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69    Tcl_DStringIni
2350: 74 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f 44  t(&str);.  Tcl_D
2360: 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 73 74  StringAppend(&st
2370: 72 2c 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65  r, pDb->zProfile
2380: 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74  , -1);.  Tcl_DSt
2390: 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e  ringAppendElemen
23a0: 74 28 26 73 74 72 2c 20 7a 53 71 6c 29 3b 0a 20  t(&str, zSql);. 
23b0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
23c0: 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20  ndElement(&str, 
23d0: 7a 54 6d 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c  zTm);.  Tcl_Eval
23e0: 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 54 63  (pDb->interp, Tc
23f0: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26  l_DStringValue(&
2400: 73 74 72 29 29 3b 0a 20 20 54 63 6c 5f 44 53 74  str));.  Tcl_DSt
2410: 72 69 6e 67 46 72 65 65 28 26 73 74 72 29 3b 0a  ringFree(&str);.
2420: 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c    Tcl_ResetResul
2430: 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b 0a  t(pDb->interp);.
2440: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
2450: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2460: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 74 72  called when a tr
2470: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
2480: 6d 69 74 74 65 64 2e 20 20 54 68 65 0a 2a 2a 20  mitted.  The.** 
2490: 54 43 4c 20 73 63 72 69 70 74 20 69 6e 20 70 44  TCL script in pD
24a0: 62 2d 3e 7a 43 6f 6d 6d 69 74 20 69 73 20 65 78  b->zCommit is ex
24b0: 65 63 75 74 65 64 2e 20 20 49 66 20 69 74 20 72  ecuted.  If it r
24c0: 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20  eturns non-zero 
24d0: 6f 72 0a 2a 2a 20 69 66 20 69 74 20 74 68 72 6f  or.** if it thro
24e0: 77 73 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 2c  ws an exception,
24f0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
2500: 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   is rolled back 
2510: 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20 62 65  instead.** of be
2520: 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a  ing committed..*
2530: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 43  /.static int DbC
2540: 6f 6d 6d 69 74 48 61 6e 64 6c 65 72 28 76 6f 69  ommitHandler(voi
2550: 64 20 2a 63 64 29 7b 0a 20 20 53 71 6c 69 74 65  d *cd){.  Sqlite
2560: 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74  Db *pDb = (Sqlit
2570: 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e 74 20 72  eDb*)cd;.  int r
2580: 63 3b 0a 0a 20 20 72 63 20 3d 20 54 63 6c 5f 45  c;..  rc = Tcl_E
2590: 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  val(pDb->interp,
25a0: 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 29 3b 0a   pDb->zCommit);.
25b0: 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b    if( rc!=TCL_OK
25c0: 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65 74   || atoi(Tcl_Get
25d0: 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62  StringResult(pDb
25e0: 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a 20 20  ->interp)) ){.  
25f0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
2600: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73    return 0;.}..s
2610: 74 61 74 69 63 20 76 6f 69 64 20 44 62 52 6f 6c  tatic void DbRol
2620: 6c 62 61 63 6b 48 61 6e 64 6c 65 72 28 76 6f 69  lbackHandler(voi
2630: 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 29 7b 0a  d *clientData){.
2640: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
2650: 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 6c 69  = (SqliteDb*)cli
2660: 65 6e 74 44 61 74 61 3b 0a 20 20 61 73 73 65 72  entData;.  asser
2670: 74 28 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b  t(pDb->pRollback
2680: 48 6f 6f 6b 29 3b 0a 20 20 69 66 28 20 54 43 4c  Hook);.  if( TCL
2690: 5f 4f 4b 21 3d 54 63 6c 5f 45 76 61 6c 4f 62 6a  _OK!=Tcl_EvalObj
26a0: 45 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  Ex(pDb->interp, 
26b0: 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f  pDb->pRollbackHo
26c0: 6f 6b 2c 20 30 29 20 29 7b 0a 20 20 20 20 54 63  ok, 0) ){.    Tc
26d0: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f  l_BackgroundErro
26e0: 72 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b 0a  r(pDb->interp);.
26f0: 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
2700: 69 64 20 44 62 55 70 64 61 74 65 48 61 6e 64 6c  id DbUpdateHandl
2710: 65 72 28 0a 20 20 76 6f 69 64 20 2a 70 2c 20 0a  er(.  void *p, .
2720: 20 20 69 6e 74 20 6f 70 2c 0a 20 20 63 6f 6e 73    int op,.  cons
2730: 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 0a 20 20  t char *zDb, .  
2740: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62 6c  const char *zTbl
2750: 2c 20 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36  , .  sqlite_int6
2760: 34 20 72 6f 77 69 64 0a 29 7b 0a 20 20 53 71 6c  4 rowid.){.  Sql
2770: 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71  iteDb *pDb = (Sq
2780: 6c 69 74 65 44 62 20 2a 29 70 3b 0a 20 20 54 63  liteDb *)p;.  Tc
2790: 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 0a 20 20  l_Obj *pCmd;..  
27a0: 61 73 73 65 72 74 28 20 70 44 62 2d 3e 70 55 70  assert( pDb->pUp
27b0: 64 61 74 65 48 6f 6f 6b 20 29 3b 0a 20 20 61 73  dateHook );.  as
27c0: 73 65 72 74 28 20 6f 70 3d 3d 53 51 4c 49 54 45  sert( op==SQLITE
27d0: 5f 49 4e 53 45 52 54 20 7c 7c 20 6f 70 3d 3d 53  _INSERT || op==S
27e0: 51 4c 49 54 45 5f 55 50 44 41 54 45 20 7c 7c 20  QLITE_UPDATE || 
27f0: 6f 70 3d 3d 53 51 4c 49 54 45 5f 44 45 4c 45 54  op==SQLITE_DELET
2800: 45 20 29 3b 0a 0a 20 20 70 43 6d 64 20 3d 20 54  E );..  pCmd = T
2810: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28  cl_DuplicateObj(
2820: 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b  pDb->pUpdateHook
2830: 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  );.  Tcl_IncrRef
2840: 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 54  Count(pCmd);.  T
2850: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2860: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c  Element(0, pCmd,
2870: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
2880: 6a 28 0a 20 20 20 20 28 20 28 6f 70 3d 3d 53 51  j(.    ( (op==SQ
2890: 4c 49 54 45 5f 49 4e 53 45 52 54 29 3f 22 49 4e  LITE_INSERT)?"IN
28a0: 53 45 52 54 22 3a 28 6f 70 3d 3d 53 51 4c 49 54  SERT":(op==SQLIT
28b0: 45 5f 55 50 44 41 54 45 29 3f 22 55 50 44 41 54  E_UPDATE)?"UPDAT
28c0: 45 22 3a 22 44 45 4c 45 54 45 22 29 2c 20 2d 31  E":"DELETE"), -1
28d0: 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
28e0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
28f0: 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53  , pCmd, Tcl_NewS
2900: 74 72 69 6e 67 4f 62 6a 28 7a 44 62 2c 20 2d 31  tringObj(zDb, -1
2910: 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
2920: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
2930: 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53  , pCmd, Tcl_NewS
2940: 74 72 69 6e 67 4f 62 6a 28 7a 54 62 6c 2c 20 2d  tringObj(zTbl, -
2950: 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  1));.  Tcl_ListO
2960: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2970: 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77  0, pCmd, Tcl_New
2980: 57 69 64 65 49 6e 74 4f 62 6a 28 72 6f 77 69 64  WideIntObj(rowid
2990: 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62  ));.  Tcl_EvalOb
29a0: 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  jEx(pDb->interp,
29b0: 20 70 43 6d 64 2c 20 54 43 4c 5f 45 56 41 4c 5f   pCmd, TCL_EVAL_
29c0: 44 49 52 45 43 54 29 3b 0a 7d 0a 0a 73 74 61 74  DIRECT);.}..stat
29d0: 69 63 20 76 6f 69 64 20 74 63 6c 43 6f 6c 6c 61  ic void tclColla
29e0: 74 65 4e 65 65 64 65 64 28 0a 20 20 76 6f 69 64  teNeeded(.  void
29f0: 20 2a 70 43 74 78 2c 0a 20 20 73 71 6c 69 74 65   *pCtx,.  sqlite
2a00: 33 20 2a 64 62 2c 0a 20 20 69 6e 74 20 65 6e 63  3 *db,.  int enc
2a10: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
2a20: 7a 4e 61 6d 65 0a 29 7b 0a 20 20 53 71 6c 69 74  zName.){.  Sqlit
2a30: 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69  eDb *pDb = (Sqli
2a40: 74 65 44 62 20 2a 29 70 43 74 78 3b 0a 20 20 54  teDb *)pCtx;.  T
2a50: 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 20  cl_Obj *pScript 
2a60: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
2a70: 62 6a 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65  bj(pDb->pCollate
2a80: 4e 65 65 64 65 64 29 3b 0a 20 20 54 63 6c 5f 49  Needed);.  Tcl_I
2a90: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72  ncrRefCount(pScr
2aa0: 69 70 74 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  ipt);.  Tcl_List
2ab0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
2ac0: 28 30 2c 20 70 53 63 72 69 70 74 2c 20 54 63 6c  (0, pScript, Tcl
2ad0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 4e  _NewStringObj(zN
2ae0: 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  ame, -1));.  Tcl
2af0: 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e  _EvalObjEx(pDb->
2b00: 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c  interp, pScript,
2b10: 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52   0);.  Tcl_DecrR
2b20: 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29  efCount(pScript)
2b30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2b40: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
2b50: 64 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e  d to evaluate an
2b60: 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   SQL collation f
2b70: 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e  unction implemen
2b80: 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20 54 43 4c  ted.** using TCL
2b90: 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 73 74 61 74   script..*/.stat
2ba0: 69 63 20 69 6e 74 20 74 63 6c 53 71 6c 43 6f 6c  ic int tclSqlCol
2bb0: 6c 61 74 65 28 0a 20 20 76 6f 69 64 20 2a 70 43  late(.  void *pC
2bc0: 74 78 2c 0a 20 20 69 6e 74 20 6e 41 2c 0a 20 20  tx,.  int nA,.  
2bd0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 41 2c 0a  const void *zA,.
2be0: 20 20 69 6e 74 20 6e 42 2c 0a 20 20 63 6f 6e 73    int nB,.  cons
2bf0: 74 20 76 6f 69 64 20 2a 7a 42 0a 29 7b 0a 20 20  t void *zB.){.  
2c00: 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 20 3d 20  SqlCollate *p = 
2c10: 28 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 29 70 43  (SqlCollate *)pC
2c20: 74 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  tx;.  Tcl_Obj *p
2c30: 43 6d 64 3b 0a 0a 20 20 70 43 6d 64 20 3d 20 54  Cmd;..  pCmd = T
2c40: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
2c50: 70 2d 3e 7a 53 63 72 69 70 74 2c 20 2d 31 29 3b  p->zScript, -1);
2c60: 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  .  Tcl_IncrRefCo
2c70: 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 54 63 6c  unt(pCmd);.  Tcl
2c80: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
2c90: 65 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c  ement(p->interp,
2ca0: 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74   pCmd, Tcl_NewSt
2cb0: 72 69 6e 67 4f 62 6a 28 7a 41 2c 20 6e 41 29 29  ringObj(zA, nA))
2cc0: 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
2cd0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d 3e  ppendElement(p->
2ce0: 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 63  interp, pCmd, Tc
2cf0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
2d00: 42 2c 20 6e 42 29 29 3b 0a 20 20 54 63 6c 5f 45  B, nB));.  Tcl_E
2d10: 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65  valObjEx(p->inte
2d20: 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c 5f 45 56  rp, pCmd, TCL_EV
2d30: 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20 54 63  AL_DIRECT);.  Tc
2d40: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
2d50: 43 6d 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  Cmd);.  return (
2d60: 61 74 6f 69 28 54 63 6c 5f 47 65 74 53 74 72 69  atoi(Tcl_GetStri
2d70: 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65  ngResult(p->inte
2d80: 72 70 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rp)));.}../*.** 
2d90: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2da0: 63 61 6c 6c 65 64 20 74 6f 20 65 76 61 6c 75 61  called to evalua
2db0: 74 65 20 61 6e 20 53 51 4c 20 66 75 6e 63 74 69  te an SQL functi
2dc0: 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a  on implemented.*
2dd0: 2a 20 75 73 69 6e 67 20 54 43 4c 20 73 63 72 69  * using TCL scri
2de0: 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  pt..*/.static vo
2df0: 69 64 20 74 63 6c 53 71 6c 46 75 6e 63 28 73 71  id tclSqlFunc(sq
2e00: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
2e10: 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
2e20: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  , sqlite3_value*
2e30: 2a 61 72 67 76 29 7b 0a 20 20 53 71 6c 46 75 6e  *argv){.  SqlFun
2e40: 63 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 5f 75  c *p = sqlite3_u
2e50: 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74  ser_data(context
2e60: 29 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43  );.  Tcl_Obj *pC
2e70: 6d 64 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  md;.  int i;.  i
2e80: 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 61 72  nt rc;..  if( ar
2e90: 67 63 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  gc==0 ){.    /* 
2ea0: 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
2eb0: 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65  arguments to the
2ec0: 20 66 75 6e 63 74 69 6f 6e 2c 20 63 61 6c 6c 20   function, call 
2ed0: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 20 6f 6e  Tcl_EvalObjEx on
2ee0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 63 72 69   the.    ** scri
2ef0: 70 74 20 6f 62 6a 65 63 74 20 64 69 72 65 63 74  pt object direct
2f00: 6c 79 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77 73  ly.  This allows
2f10: 20 74 68 65 20 54 43 4c 20 63 6f 6d 70 69 6c 65   the TCL compile
2f20: 72 20 74 6f 20 67 65 6e 65 72 61 74 65 0a 20 20  r to generate.  
2f30: 20 20 2a 2a 20 62 79 74 65 63 6f 64 65 20 66 6f    ** bytecode fo
2f40: 72 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6f 6e  r the command on
2f50: 20 74 68 65 20 66 69 72 73 74 20 69 6e 76 6f 63   the first invoc
2f60: 61 74 69 6f 6e 20 61 6e 64 20 74 68 75 73 20 6d  ation and thus m
2f70: 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 62 73 65  ake.    ** subse
2f80: 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e  quent invocation
2f90: 73 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20 2a  s much faster. *
2fa0: 2f 0a 20 20 20 20 70 43 6d 64 20 3d 20 70 2d 3e  /.    pCmd = p->
2fb0: 70 53 63 72 69 70 74 3b 0a 20 20 20 20 54 63 6c  pScript;.    Tcl
2fc0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43  _IncrRefCount(pC
2fd0: 6d 64 29 3b 0a 20 20 20 20 72 63 20 3d 20 54 63  md);.    rc = Tc
2fe0: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69  l_EvalObjEx(p->i
2ff0: 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 30 29 3b  nterp, pCmd, 0);
3000: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
3010: 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 7d  Count(pCmd);.  }
3020: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
3030: 74 68 65 72 65 20 61 72 65 20 61 72 67 75 6d 65  there are argume
3040: 6e 74 73 20 74 6f 20 74 68 65 20 66 75 6e 63 74  nts to the funct
3050: 69 6f 6e 2c 20 6d 61 6b 65 20 61 20 73 68 61 6c  ion, make a shal
3060: 6c 6f 77 20 63 6f 70 79 20 6f 66 20 74 68 65 0a  low copy of the.
3070: 20 20 20 20 2a 2a 20 73 63 72 69 70 74 20 6f 62      ** script ob
3080: 6a 65 63 74 2c 20 6c 61 70 70 65 6e 64 20 74 68  ject, lappend th
3090: 65 20 61 72 67 75 6d 65 6e 74 73 2c 20 74 68 65  e arguments, the
30a0: 6e 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 63  n evaluate the c
30b0: 6f 70 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  opy..    **.    
30c0: 2a 2a 20 42 79 20 22 73 68 61 6c 6c 6f 77 22 20  ** By "shallow" 
30d0: 63 6f 70 79 2c 20 77 65 20 6d 65 61 6e 20 61 20  copy, we mean a 
30e0: 6f 6e 6c 79 20 74 68 65 20 6f 75 74 65 72 20 6c  only the outer l
30f0: 69 73 74 20 54 63 6c 5f 4f 62 6a 20 69 73 20 64  ist Tcl_Obj is d
3100: 75 70 6c 69 63 61 74 65 64 2e 0a 20 20 20 20 2a  uplicated..    *
3110: 2a 20 54 68 65 20 6e 65 77 20 54 63 6c 5f 4f 62  * The new Tcl_Ob
3120: 6a 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74  j contains point
3130: 65 72 73 20 74 6f 20 74 68 65 20 6f 72 69 67 69  ers to the origi
3140: 6e 61 6c 20 6c 69 73 74 20 65 6c 65 6d 65 6e 74  nal list element
3150: 73 2e 20 0a 20 20 20 20 2a 2a 20 54 68 61 74 20  s. .    ** That 
3160: 77 61 79 2c 20 77 68 65 6e 20 54 63 6c 5f 45 76  way, when Tcl_Ev
3170: 61 6c 4f 62 6a 76 28 29 20 69 73 20 72 75 6e 20  alObjv() is run 
3180: 61 6e 64 20 73 68 69 6d 6d 65 72 73 20 74 68 65  and shimmers the
3190: 20 66 69 72 73 74 20 65 6c 65 6d 65 6e 74 0a 20   first element. 
31a0: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6c 69 73     ** of the lis
31b0: 74 20 74 6f 20 74 63 6c 43 6d 64 4e 61 6d 65 54  t to tclCmdNameT
31c0: 79 70 65 2c 20 74 68 61 74 20 61 6c 74 65 72 6e  ype, that altern
31d0: 61 74 65 20 72 65 70 72 65 73 65 6e 74 61 74 69  ate representati
31e0: 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62  on will.    ** b
31f0: 65 20 70 72 65 73 65 72 76 65 64 20 61 6e 64 20  e preserved and 
3200: 72 65 75 73 65 64 20 6f 6e 20 74 68 65 20 6e 65  reused on the ne
3210: 78 74 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 20  xt invocation.. 
3220: 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62     */.    Tcl_Ob
3230: 6a 20 2a 2a 61 41 72 67 3b 0a 20 20 20 20 69 6e  j **aArg;.    in
3240: 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 66 28 20  t nArg;.    if( 
3250: 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c  Tcl_ListObjGetEl
3260: 65 6d 65 6e 74 73 28 70 2d 3e 69 6e 74 65 72 70  ements(p->interp
3270: 2c 20 70 2d 3e 70 53 63 72 69 70 74 2c 20 26 6e  , p->pScript, &n
3280: 41 72 67 2c 20 26 61 41 72 67 29 20 29 7b 0a 20  Arg, &aArg) ){. 
3290: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
32a0: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
32b0: 74 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  t, Tcl_GetString
32c0: 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70  Result(p->interp
32d0: 29 2c 20 2d 31 29 3b 20 0a 20 20 20 20 20 20 72  ), -1); .      r
32e0: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 20 20 20 20  eturn;.    }    
32f0: 20 0a 20 20 20 20 70 43 6d 64 20 3d 20 54 63 6c   .    pCmd = Tcl
3300: 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 6e 41 72 67  _NewListObj(nArg
3310: 2c 20 61 41 72 67 29 3b 0a 20 20 20 20 54 63 6c  , aArg);.    Tcl
3320: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43  _IncrRefCount(pC
3330: 6d 64 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  md);.    for(i=0
3340: 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a  ; i<argc; i++){.
3350: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61        sqlite3_va
3360: 6c 75 65 20 2a 70 49 6e 20 3d 20 61 72 67 76 5b  lue *pIn = argv[
3370: 69 5d 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62  i];.      Tcl_Ob
3380: 6a 20 2a 70 56 61 6c 3b 0a 20 20 20 20 20 20 20  j *pVal;.       
3390: 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 53       .      /* S
33a0: 65 74 20 70 56 61 6c 20 74 6f 20 63 6f 6e 74 61  et pVal to conta
33b0: 69 6e 20 74 68 65 20 69 27 74 68 20 63 6f 6c 75  in the i'th colu
33c0: 6d 6e 20 6f 66 20 74 68 69 73 20 72 6f 77 2e 20  mn of this row. 
33d0: 2a 2f 0a 20 20 20 20 20 20 73 77 69 74 63 68 28  */.      switch(
33e0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
33f0: 79 70 65 28 70 49 6e 29 20 29 7b 0a 20 20 20 20  ype(pIn) ){.    
3400: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
3410: 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 20 20  BLOB: {.        
3420: 20 20 69 6e 74 20 62 79 74 65 73 20 3d 20 73 71    int bytes = sq
3430: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
3440: 73 28 70 49 6e 29 3b 0a 20 20 20 20 20 20 20 20  s(pIn);.        
3450: 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77    pVal = Tcl_New
3460: 42 79 74 65 41 72 72 61 79 4f 62 6a 28 73 71 6c  ByteArrayObj(sql
3470: 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28  ite3_value_blob(
3480: 70 49 6e 29 2c 20 62 79 74 65 73 29 3b 0a 20 20  pIn), bytes);.  
3490: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
34a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
34b0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54   case SQLITE_INT
34c0: 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 20 20  EGER: {.        
34d0: 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 76    sqlite_int64 v
34e0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
34f0: 5f 69 6e 74 36 34 28 70 49 6e 29 3b 0a 20 20 20  _int64(pIn);.   
3500: 20 20 20 20 20 20 20 69 66 28 20 76 3e 3d 2d 32         if( v>=-2
3510: 31 34 37 34 38 33 36 34 37 20 26 26 20 76 3c 3d  147483647 && v<=
3520: 32 31 34 37 34 38 33 36 34 37 20 29 7b 0a 20 20  2147483647 ){.  
3530: 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d            pVal =
3540: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 76   Tcl_NewIntObj(v
3550: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
3560: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
3570: 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 57 69  pVal = Tcl_NewWi
3580: 64 65 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20  deIntObj(v);.   
3590: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
35a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
35b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65    }.        case
35c0: 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b   SQLITE_FLOAT: {
35d0: 0a 20 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c  .          doubl
35e0: 65 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  e r = sqlite3_va
35f0: 6c 75 65 5f 64 6f 75 62 6c 65 28 70 49 6e 29 3b  lue_double(pIn);
3600: 0a 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20  .          pVal 
3610: 3d 20 54 63 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f  = Tcl_NewDoubleO
3620: 62 6a 28 72 29 3b 0a 20 20 20 20 20 20 20 20 20  bj(r);.         
3630: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
3640: 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  }.        case S
3650: 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20  QLITE_NULL: {.  
3660: 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54          pVal = T
3670: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
3680: 22 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  "", 0);.        
3690: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
36a0: 20 7d 0a 20 20 20 20 20 20 20 20 64 65 66 61 75   }.        defau
36b0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  lt: {.          
36c0: 69 6e 74 20 62 79 74 65 73 20 3d 20 73 71 6c 69  int bytes = sqli
36d0: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
36e0: 70 49 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pIn);.          
36f0: 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74  pVal = Tcl_NewSt
3700: 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29  ringObj((char *)
3710: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
3720: 78 74 28 70 49 6e 29 2c 20 62 79 74 65 73 29 3b  xt(pIn), bytes);
3730: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
3740: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
3750: 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 54    }.      rc = T
3760: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
3770: 45 6c 65 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72  Element(p->inter
3780: 70 2c 20 70 43 6d 64 2c 20 70 56 61 6c 29 3b 0a  p, pCmd, pVal);.
3790: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
37a0: 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72          Tcl_Decr
37b0: 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a  RefCount(pCmd);.
37c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
37d0: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e  result_error(con
37e0: 74 65 78 74 2c 20 54 63 6c 5f 47 65 74 53 74 72  text, Tcl_GetStr
37f0: 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74  ingResult(p->int
3800: 65 72 70 29 2c 20 2d 31 29 3b 20 0a 20 20 20 20  erp), -1); .    
3810: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
3820: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
3830: 28 20 21 70 2d 3e 75 73 65 45 76 61 6c 4f 62 6a  ( !p->useEvalObj
3840: 76 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 63  v ){.      /* Tc
3850: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 29 20 77 69  l_EvalObjEx() wi
3860: 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ll automatically
3870: 20 63 61 6c 6c 20 54 63 6c 5f 45 76 61 6c 4f 62   call Tcl_EvalOb
3880: 6a 76 28 29 20 69 66 20 70 43 6d 64 0a 20 20 20  jv() if pCmd.   
3890: 20 20 20 2a 2a 20 69 73 20 61 20 6c 69 73 74 20     ** is a list 
38a0: 77 69 74 68 6f 75 74 20 61 20 73 74 72 69 6e 67  without a string
38b0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e   representation.
38c0: 20 20 54 6f 20 70 72 65 76 65 6e 74 20 74 68 69    To prevent thi
38d0: 73 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20  s from.      ** 
38e0: 68 61 70 70 65 6e 69 6e 67 2c 20 6d 61 6b 65 20  happening, make 
38f0: 73 75 72 65 20 70 43 6d 64 20 68 61 73 20 61 20  sure pCmd has a 
3900: 76 61 6c 69 64 20 73 74 72 69 6e 67 20 72 65 70  valid string rep
3910: 72 65 73 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20  resentation */. 
3920: 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
3930: 6e 67 28 70 43 6d 64 29 3b 0a 20 20 20 20 7d 0a  ng(pCmd);.    }.
3940: 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61      rc = Tcl_Eva
3950: 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70  lObjEx(p->interp
3960: 2c 20 70 43 6d 64 2c 20 54 43 4c 5f 45 56 41 4c  , pCmd, TCL_EVAL
3970: 5f 44 49 52 45 43 54 29 3b 0a 20 20 20 20 54 63  _DIRECT);.    Tc
3980: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
3990: 43 6d 64 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  Cmd);.  }..  if(
39a0: 20 72 63 20 26 26 20 72 63 21 3d 54 43 4c 5f 52   rc && rc!=TCL_R
39b0: 45 54 55 52 4e 20 29 7b 0a 20 20 20 20 73 71 6c  ETURN ){.    sql
39c0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
39d0: 72 28 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f 47  r(context, Tcl_G
39e0: 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70  etStringResult(p
39f0: 2d 3e 69 6e 74 65 72 70 29 2c 20 2d 31 29 3b 20  ->interp), -1); 
3a00: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63  .  }else{.    Tc
3a10: 6c 5f 4f 62 6a 20 2a 70 56 61 72 20 3d 20 54 63  l_Obj *pVar = Tc
3a20: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 70  l_GetObjResult(p
3a30: 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 69  ->interp);.    i
3a40: 6e 74 20 6e 3b 0a 20 20 20 20 75 38 20 2a 64 61  nt n;.    u8 *da
3a50: 74 61 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54  ta;.    char *zT
3a60: 79 70 65 20 3d 20 70 56 61 72 2d 3e 74 79 70 65  ype = pVar->type
3a70: 50 74 72 20 3f 20 70 56 61 72 2d 3e 74 79 70 65  Ptr ? pVar->type
3a80: 50 74 72 2d 3e 6e 61 6d 65 20 3a 20 22 22 3b 0a  Ptr->name : "";.
3a90: 20 20 20 20 63 68 61 72 20 63 20 3d 20 7a 54 79      char c = zTy
3aa0: 70 65 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20 63  pe[0];.    if( c
3ab0: 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d 70 28  =='b' && strcmp(
3ac0: 7a 54 79 70 65 2c 22 62 79 74 65 61 72 72 61 79  zType,"bytearray
3ad0: 22 29 3d 3d 30 20 26 26 20 70 56 61 72 2d 3e 62  ")==0 && pVar->b
3ae0: 79 74 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ytes==0 ){.     
3af0: 20 2f 2a 20 4f 6e 6c 79 20 72 65 74 75 72 6e 20   /* Only return 
3b00: 61 20 42 4c 4f 42 20 74 79 70 65 20 69 66 20 74  a BLOB type if t
3b10: 68 65 20 54 63 6c 20 76 61 72 69 61 62 6c 65 20  he Tcl variable 
3b20: 69 73 20 61 20 62 79 74 65 61 72 72 61 79 20 61  is a bytearray a
3b30: 6e 64 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20  nd.      ** has 
3b40: 6e 6f 20 73 74 72 69 6e 67 20 72 65 70 72 65 73  no string repres
3b50: 65 6e 74 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20  entation. */.   
3b60: 20 20 20 64 61 74 61 20 3d 20 54 63 6c 5f 47 65     data = Tcl_Ge
3b70: 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62  tByteArrayFromOb
3b80: 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20  j(pVar, &n);.   
3b90: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
3ba0: 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20  t_blob(context, 
3bb0: 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f  data, n, SQLITE_
3bc0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
3bd0: 7d 65 6c 73 65 20 69 66 28 20 28 63 3d 3d 27 62  }else if( (c=='b
3be0: 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70  ' && strcmp(zTyp
3bf0: 65 2c 22 62 6f 6f 6c 65 61 6e 22 29 3d 3d 30 29  e,"boolean")==0)
3c00: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 28 63   ||.          (c
3c10: 3d 3d 27 69 27 20 26 26 20 73 74 72 63 6d 70 28  =='i' && strcmp(
3c20: 7a 54 79 70 65 2c 22 69 6e 74 22 29 3d 3d 30 29  zType,"int")==0)
3c30: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 47 65   ){.      Tcl_Ge
3c40: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 30 2c 20 70  tIntFromObj(0, p
3c50: 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20  Var, &n);.      
3c60: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
3c70: 6e 74 28 63 6f 6e 74 65 78 74 2c 20 6e 29 3b 0a  nt(context, n);.
3c80: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
3c90: 3d 27 64 27 20 26 26 20 73 74 72 63 6d 70 28 7a  ='d' && strcmp(z
3ca0: 54 79 70 65 2c 22 64 6f 75 62 6c 65 22 29 3d 3d  Type,"double")==
3cb0: 30 20 29 7b 0a 20 20 20 20 20 20 64 6f 75 62 6c  0 ){.      doubl
3cc0: 65 20 72 3b 0a 20 20 20 20 20 20 54 63 6c 5f 47  e r;.      Tcl_G
3cd0: 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28  etDoubleFromObj(
3ce0: 30 2c 20 70 56 61 72 2c 20 26 72 29 3b 0a 20 20  0, pVar, &r);.  
3cf0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
3d00: 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78  lt_double(contex
3d10: 74 2c 20 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t, r);.    }else
3d20: 20 69 66 28 20 63 3d 3d 27 77 27 20 26 26 20 73   if( c=='w' && s
3d30: 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 77 69 64  trcmp(zType,"wid
3d40: 65 49 6e 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  eInt")==0 ){.   
3d50: 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 76     Tcl_WideInt v
3d60: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 47 65 74 57  ;.      Tcl_GetW
3d70: 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 30 2c  ideIntFromObj(0,
3d80: 20 70 56 61 72 2c 20 26 76 29 3b 0a 20 20 20 20   pVar, &v);.    
3d90: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
3da0: 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20  _int64(context, 
3db0: 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  v);.    }else{. 
3dc0: 20 20 20 20 20 64 61 74 61 20 3d 20 28 75 6e 73       data = (uns
3dd0: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 54 63 6c  igned char *)Tcl
3de0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
3df0: 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20  j(pVar, &n);.   
3e00: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
3e10: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
3e20: 28 63 68 61 72 20 2a 29 64 61 74 61 2c 20 6e 2c  (char *)data, n,
3e30: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
3e40: 54 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  T);.    }.  }.}.
3e50: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
3e60: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
3e70: 4f 4e 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  ON./*.** This is
3e80: 20 74 68 65 20 61 75 74 68 65 6e 74 69 63 61 74   the authenticat
3e90: 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49  ion function.  I
3ea0: 74 20 61 70 70 65 6e 64 73 20 74 68 65 20 61 75  t appends the au
3eb0: 74 68 65 6e 74 69 63 61 74 69 6f 6e 0a 2a 2a 20  thentication.** 
3ec0: 74 79 70 65 20 63 6f 64 65 20 61 6e 64 20 74 68  type code and th
3ed0: 65 20 74 77 6f 20 61 72 67 75 6d 65 6e 74 73 20  e two arguments 
3ee0: 74 6f 20 7a 43 6d 64 5b 5d 20 74 68 65 6e 20 69  to zCmd[] then i
3ef0: 6e 76 6f 6b 65 73 20 74 68 65 20 72 65 73 75 6c  nvokes the resul
3f00: 74 0a 2a 2a 20 6f 6e 20 74 68 65 20 69 6e 74 65  t.** on the inte
3f10: 72 70 72 65 74 65 72 2e 20 20 54 68 65 20 72 65  rpreter.  The re
3f20: 70 6c 79 20 69 73 20 65 78 61 6d 69 6e 65 64 20  ply is examined 
3f30: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  to determine if 
3f40: 74 68 65 0a 2a 2a 20 61 75 74 68 65 6e 74 69 63  the.** authentic
3f50: 61 74 69 6f 6e 20 66 61 69 6c 73 20 6f 72 20 73  ation fails or s
3f60: 75 63 63 65 65 64 73 2e 0a 2a 2f 0a 73 74 61 74  ucceeds..*/.stat
3f70: 69 63 20 69 6e 74 20 61 75 74 68 5f 63 61 6c 6c  ic int auth_call
3f80: 62 61 63 6b 28 0a 20 20 76 6f 69 64 20 2a 70 41  back(.  void *pA
3f90: 72 67 2c 0a 20 20 69 6e 74 20 63 6f 64 65 2c 0a  rg,.  int code,.
3fa0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
3fb0: 72 67 31 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  rg1,.  const cha
3fc0: 72 20 2a 7a 41 72 67 32 2c 0a 20 20 63 6f 6e 73  r *zArg2,.  cons
3fd0: 74 20 63 68 61 72 20 2a 7a 41 72 67 33 2c 0a 20  t char *zArg3,. 
3fe0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
3ff0: 67 34 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 43  g4.){.  char *zC
4000: 6f 64 65 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  ode;.  Tcl_DStri
4010: 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74 20 72 63  ng str;.  int rc
4020: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
4030: 7a 52 65 70 6c 79 3b 0a 20 20 53 71 6c 69 74 65  zReply;.  Sqlite
4040: 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74  Db *pDb = (Sqlit
4050: 65 44 62 2a 29 70 41 72 67 3b 0a 0a 20 20 73 77  eDb*)pArg;..  sw
4060: 69 74 63 68 28 20 63 6f 64 65 20 29 7b 0a 20 20  itch( code ){.  
4070: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
4080: 50 59 20 20 20 20 20 20 20 20 20 20 20 20 20 20  PY              
4090: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
40a0: 43 4f 50 59 22 3b 20 62 72 65 61 6b 3b 0a 20 20  COPY"; break;.  
40b0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52    case SQLITE_CR
40c0: 45 41 54 45 5f 49 4e 44 45 58 20 20 20 20 20 20  EATE_INDEX      
40d0: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
40e0: 43 52 45 41 54 45 5f 49 4e 44 45 58 22 3b 20 62  CREATE_INDEX"; b
40f0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
4100: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42  QLITE_CREATE_TAB
4110: 4c 45 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d  LE      : zCode=
4120: 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54  "SQLITE_CREATE_T
4130: 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  ABLE"; break;.  
4140: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52    case SQLITE_CR
4150: 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 20  EATE_TEMP_INDEX 
4160: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
4170: 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45  CREATE_TEMP_INDE
4180: 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  X"; break;.    c
4190: 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54  ase SQLITE_CREAT
41a0: 45 5f 54 45 4d 50 5f 54 41 42 4c 45 20 3a 20 7a  E_TEMP_TABLE : z
41b0: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45  Code="SQLITE_CRE
41c0: 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 22 3b  ATE_TEMP_TABLE";
41d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
41e0: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
41f0: 45 4d 50 5f 54 52 49 47 47 45 52 3a 20 7a 43 6f  EMP_TRIGGER: zCo
4200: 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54  de="SQLITE_CREAT
4210: 45 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 22 3b  E_TEMP_TRIGGER";
4220: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
4230: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
4240: 45 4d 50 5f 56 49 45 57 20 20 3a 20 7a 43 6f 64  EMP_VIEW  : zCod
4250: 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45  e="SQLITE_CREATE
4260: 5f 54 45 4d 50 5f 56 49 45 57 22 3b 20 62 72 65  _TEMP_VIEW"; bre
4270: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
4280: 49 54 45 5f 43 52 45 41 54 45 5f 54 52 49 47 47  ITE_CREATE_TRIGG
4290: 45 52 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53  ER    : zCode="S
42a0: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 52 49  QLITE_CREATE_TRI
42b0: 47 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20  GGER"; break;.  
42c0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52    case SQLITE_CR
42d0: 45 41 54 45 5f 56 49 45 57 20 20 20 20 20 20 20  EATE_VIEW       
42e0: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
42f0: 43 52 45 41 54 45 5f 56 49 45 57 22 3b 20 62 72  CREATE_VIEW"; br
4300: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
4310: 4c 49 54 45 5f 44 45 4c 45 54 45 20 20 20 20 20  LITE_DELETE     
4320: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
4330: 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 22 3b 20  SQLITE_DELETE"; 
4340: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
4350: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45  SQLITE_DROP_INDE
4360: 58 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65  X        : zCode
4370: 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e  ="SQLITE_DROP_IN
4380: 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  DEX"; break;.   
4390: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f   case SQLITE_DRO
43a0: 50 5f 54 41 42 4c 45 20 20 20 20 20 20 20 20 3a  P_TABLE        :
43b0: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44   zCode="SQLITE_D
43c0: 52 4f 50 5f 54 41 42 4c 45 22 3b 20 62 72 65 61  ROP_TABLE"; brea
43d0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
43e0: 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44  TE_DROP_TEMP_IND
43f0: 45 58 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51  EX   : zCode="SQ
4400: 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49  LITE_DROP_TEMP_I
4410: 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20  NDEX"; break;.  
4420: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52    case SQLITE_DR
4430: 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 20 20 20  OP_TEMP_TABLE   
4440: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
4450: 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 22  DROP_TEMP_TABLE"
4460: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
4470: 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  e SQLITE_DROP_TE
4480: 4d 50 5f 54 52 49 47 47 45 52 20 3a 20 7a 43 6f  MP_TRIGGER : zCo
4490: 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f  de="SQLITE_DROP_
44a0: 54 45 4d 50 5f 54 52 49 47 47 45 52 22 3b 20 62  TEMP_TRIGGER"; b
44b0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
44c0: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
44d0: 56 49 45 57 20 20 20 20 3a 20 7a 43 6f 64 65 3d  VIEW    : zCode=
44e0: 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d  "SQLITE_DROP_TEM
44f0: 50 5f 56 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a  P_VIEW"; break;.
4500: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
4510: 44 52 4f 50 5f 54 52 49 47 47 45 52 20 20 20 20  DROP_TRIGGER    
4520: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
4530: 45 5f 44 52 4f 50 5f 54 52 49 47 47 45 52 22 3b  E_DROP_TRIGGER";
4540: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
4550: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45   SQLITE_DROP_VIE
4560: 57 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64  W         : zCod
4570: 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56  e="SQLITE_DROP_V
4580: 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  IEW"; break;.   
4590: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 53   case SQLITE_INS
45a0: 45 52 54 20 20 20 20 20 20 20 20 20 20 20 20 3a  ERT            :
45b0: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 49   zCode="SQLITE_I
45c0: 4e 53 45 52 54 22 3b 20 62 72 65 61 6b 3b 0a 20  NSERT"; break;. 
45d0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50     case SQLITE_P
45e0: 52 41 47 4d 41 20 20 20 20 20 20 20 20 20 20 20  RAGMA           
45f0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
4600: 5f 50 52 41 47 4d 41 22 3b 20 62 72 65 61 6b 3b  _PRAGMA"; break;
4610: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
4620: 5f 52 45 41 44 20 20 20 20 20 20 20 20 20 20 20  _READ           
4630: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
4640: 54 45 5f 52 45 41 44 22 3b 20 62 72 65 61 6b 3b  TE_READ"; break;
4650: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
4660: 5f 53 45 4c 45 43 54 20 20 20 20 20 20 20 20 20  _SELECT         
4670: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
4680: 54 45 5f 53 45 4c 45 43 54 22 3b 20 62 72 65 61  TE_SELECT"; brea
4690: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
46a0: 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 20 20  TE_TRANSACTION  
46b0: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
46c0: 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e  LITE_TRANSACTION
46d0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
46e0: 73 65 20 53 51 4c 49 54 45 5f 55 50 44 41 54 45  se SQLITE_UPDATE
46f0: 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43              : zC
4700: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 55 50 44 41  ode="SQLITE_UPDA
4710: 54 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  TE"; break;.    
4720: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 54 54 41  case SQLITE_ATTA
4730: 43 48 20 20 20 20 20 20 20 20 20 20 20 20 3a 20  CH            : 
4740: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 41 54  zCode="SQLITE_AT
4750: 54 41 43 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20  TACH"; break;.  
4760: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 45    case SQLITE_DE
4770: 54 41 43 48 20 20 20 20 20 20 20 20 20 20 20 20  TACH            
4780: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
4790: 44 45 54 41 43 48 22 3b 20 62 72 65 61 6b 3b 0a  DETACH"; break;.
47a0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
47b0: 41 4c 54 45 52 5f 54 41 42 4c 45 20 20 20 20 20  ALTER_TABLE     
47c0: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
47d0: 45 5f 41 4c 54 45 52 5f 54 41 42 4c 45 22 3b 20  E_ALTER_TABLE"; 
47e0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
47f0: 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 20 20  SQLITE_REINDEX  
4800: 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65           : zCode
4810: 3d 22 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58  ="SQLITE_REINDEX
4820: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
4830: 73 65 20 53 51 4c 49 54 45 5f 41 4e 41 4c 59 5a  se SQLITE_ANALYZ
4840: 45 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43  E           : zC
4850: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 41 4e 41 4c  ode="SQLITE_ANAL
4860: 59 5a 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  YZE"; break;.   
4870: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45   case SQLITE_CRE
4880: 41 54 45 5f 56 54 41 42 4c 45 20 20 20 20 20 3a  ATE_VTABLE     :
4890: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43   zCode="SQLITE_C
48a0: 52 45 41 54 45 5f 56 54 41 42 4c 45 22 3b 20 62  REATE_VTABLE"; b
48b0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
48c0: 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54 41 42 4c  QLITE_DROP_VTABL
48d0: 45 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d  E       : zCode=
48e0: 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54 41  "SQLITE_DROP_VTA
48f0: 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  BLE"; break;.   
4900: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 55 4e   case SQLITE_FUN
4910: 43 54 49 4f 4e 20 20 20 20 20 20 20 20 20 20 3a  CTION          :
4920: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 46   zCode="SQLITE_F
4930: 55 4e 43 54 49 4f 4e 22 3b 20 62 72 65 61 6b 3b  UNCTION"; break;
4940: 0a 20 20 20 20 64 65 66 61 75 6c 74 20 20 20 20  .    default    
4950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4960: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 3f 3f 3f 3f     : zCode="????
4970: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20  "; break;.  }.  
4980: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
4990: 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74  &str);.  Tcl_DSt
49a0: 72 69 6e 67 41 70 70 65 6e 64 28 26 73 74 72 2c  ringAppend(&str,
49b0: 20 70 44 62 2d 3e 7a 41 75 74 68 2c 20 2d 31 29   pDb->zAuth, -1)
49c0: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41  ;.  Tcl_DStringA
49d0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74  ppendElement(&st
49e0: 72 2c 20 7a 43 6f 64 65 29 3b 0a 20 20 54 63 6c  r, zCode);.  Tcl
49f0: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c  _DStringAppendEl
4a00: 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41 72 67  ement(&str, zArg
4a10: 31 20 3f 20 7a 41 72 67 31 20 3a 20 22 22 29 3b  1 ? zArg1 : "");
4a20: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70  .  Tcl_DStringAp
4a30: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72  pendElement(&str
4a40: 2c 20 7a 41 72 67 32 20 3f 20 7a 41 72 67 32 20  , zArg2 ? zArg2 
4a50: 3a 20 22 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74  : "");.  Tcl_DSt
4a60: 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e  ringAppendElemen
4a70: 74 28 26 73 74 72 2c 20 7a 41 72 67 33 20 3f 20  t(&str, zArg3 ? 
4a80: 7a 41 72 67 33 20 3a 20 22 22 29 3b 0a 20 20 54  zArg3 : "");.  T
4a90: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
4aa0: 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41  Element(&str, zA
4ab0: 72 67 34 20 3f 20 7a 41 72 67 34 20 3a 20 22 22  rg4 ? zArg4 : ""
4ac0: 29 3b 0a 20 20 72 63 20 3d 20 54 63 6c 5f 47 6c  );.  rc = Tcl_Gl
4ad0: 6f 62 61 6c 45 76 61 6c 28 70 44 62 2d 3e 69 6e  obalEval(pDb->in
4ae0: 74 65 72 70 2c 20 54 63 6c 5f 44 53 74 72 69 6e  terp, Tcl_DStrin
4af0: 67 56 61 6c 75 65 28 26 73 74 72 29 29 3b 0a 20  gValue(&str));. 
4b00: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
4b10: 28 26 73 74 72 29 3b 0a 20 20 7a 52 65 70 6c 79  (&str);.  zReply
4b20: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
4b30: 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65  Result(pDb->inte
4b40: 72 70 29 3b 0a 20 20 69 66 28 20 73 74 72 63 6d  rp);.  if( strcm
4b50: 70 28 7a 52 65 70 6c 79 2c 22 53 51 4c 49 54 45  p(zReply,"SQLITE
4b60: 5f 4f 4b 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  _OK")==0 ){.    
4b70: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
4b80: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
4b90: 6d 70 28 7a 52 65 70 6c 79 2c 22 53 51 4c 49 54  mp(zReply,"SQLIT
4ba0: 45 5f 44 45 4e 59 22 29 3d 3d 30 20 29 7b 0a 20  E_DENY")==0 ){. 
4bb0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
4bc0: 45 4e 59 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ENY;.  }else if(
4bd0: 20 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22   strcmp(zReply,"
4be0: 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 22 29 3d  SQLITE_IGNORE")=
4bf0: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
4c00: 51 4c 49 54 45 5f 49 47 4e 4f 52 45 3b 0a 20 20  QLITE_IGNORE;.  
4c10: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
4c20: 39 39 39 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  999;.  }.  retur
4c30: 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
4c40: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  * SQLITE_OMIT_AU
4c50: 54 48 4f 52 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a  THORIZATION */..
4c60: 2f 2a 0a 2a 2a 20 7a 54 65 78 74 20 69 73 20 61  /*.** zText is a
4c70: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 65 78 74   pointer to text
4c80: 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20 61 6e   obtained via an
4c90: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
4ca0: 74 65 78 74 28 29 0a 2a 2a 20 6f 72 20 73 69 6d  text().** or sim
4cb0: 69 6c 61 72 20 69 6e 74 65 72 66 61 63 65 2e 20  ilar interface. 
4cc0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
4cd0: 75 72 6e 73 20 61 20 54 63 6c 20 73 74 72 69 6e  urns a Tcl strin
4ce0: 67 20 6f 62 6a 65 63 74 2c 20 0a 2a 2a 20 72 65  g object, .** re
4cf0: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 73 65  ference count se
4d00: 74 20 74 6f 20 30 2c 20 63 6f 6e 74 61 69 6e 69  t to 0, containi
4d10: 6e 67 20 74 68 65 20 74 65 78 74 2e 20 49 66 20  ng the text. If 
4d20: 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 0a 2a 2a  a translation.**
4d30: 20 62 65 74 77 65 65 6e 20 69 73 6f 38 38 35 39   between iso8859
4d40: 20 61 6e 64 20 55 54 46 2d 38 20 69 73 20 72 65   and UTF-8 is re
4d50: 71 75 69 72 65 64 2c 20 69 74 20 69 73 20 70 72  quired, it is pr
4d60: 65 66 6f 72 6d 65 64 2e 0a 2a 2f 0a 73 74 61 74  eformed..*/.stat
4d70: 69 63 20 54 63 6c 5f 4f 62 6a 20 2a 64 62 54 65  ic Tcl_Obj *dbTe
4d80: 78 74 54 6f 4f 62 6a 28 63 68 61 72 20 63 6f 6e  xtToObj(char con
4d90: 73 74 20 2a 7a 54 65 78 74 29 7b 0a 20 20 54 63  st *zText){.  Tc
4da0: 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b 0a 23 69 66  l_Obj *pVal;.#if
4db0: 64 65 66 20 55 54 46 5f 54 52 41 4e 53 4c 41 54  def UTF_TRANSLAT
4dc0: 49 4f 4e 5f 4e 45 45 44 45 44 0a 20 20 54 63 6c  ION_NEEDED.  Tcl
4dd0: 5f 44 53 74 72 69 6e 67 20 64 43 6f 6c 3b 0a 20  _DString dCol;. 
4de0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
4df0: 28 26 64 43 6f 6c 29 3b 0a 20 20 54 63 6c 5f 45  (&dCol);.  Tcl_E
4e00: 78 74 65 72 6e 61 6c 54 6f 55 74 66 44 53 74 72  xternalToUtfDStr
4e10: 69 6e 67 28 4e 55 4c 4c 2c 20 7a 54 65 78 74 2c  ing(NULL, zText,
4e20: 20 2d 31 2c 20 26 64 43 6f 6c 29 3b 0a 20 20 70   -1, &dCol);.  p
4e30: 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72  Val = Tcl_NewStr
4e40: 69 6e 67 4f 62 6a 28 54 63 6c 5f 44 53 74 72 69  ingObj(Tcl_DStri
4e50: 6e 67 56 61 6c 75 65 28 26 64 43 6f 6c 29 2c 20  ngValue(&dCol), 
4e60: 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  -1);.  Tcl_DStri
4e70: 6e 67 46 72 65 65 28 26 64 43 6f 6c 29 3b 0a 23  ngFree(&dCol);.#
4e80: 65 6c 73 65 0a 20 20 70 56 61 6c 20 3d 20 54 63  else.  pVal = Tc
4e90: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
4ea0: 54 65 78 74 2c 20 2d 31 29 3b 0a 23 65 6e 64 69  Text, -1);.#endi
4eb0: 66 0a 20 20 72 65 74 75 72 6e 20 70 56 61 6c 3b  f.  return pVal;
4ec0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
4ed0: 6f 75 74 69 6e 65 20 72 65 61 64 73 20 61 20 6c  outine reads a l
4ee0: 69 6e 65 20 6f 66 20 74 65 78 74 20 66 72 6f 6d  ine of text from
4ef0: 20 46 49 4c 45 20 69 6e 2c 20 73 74 6f 72 65 73   FILE in, stores
4f00: 0a 2a 2a 20 74 68 65 20 74 65 78 74 20 69 6e 20  .** the text in 
4f10: 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
4f20: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20 61 6e  from malloc() an
4f30: 64 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  d returns a poin
4f40: 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 74 65  ter.** to the te
4f50: 78 74 2e 20 20 4e 55 4c 4c 20 69 73 20 72 65 74  xt.  NULL is ret
4f60: 75 72 6e 65 64 20 61 74 20 65 6e 64 20 6f 66 20  urned at end of 
4f70: 66 69 6c 65 2c 20 6f 72 20 69 66 20 6d 61 6c 6c  file, or if mall
4f80: 6f 63 28 29 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a  oc().** fails..*
4f90: 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61  *.** The interfa
4fa0: 63 65 20 69 73 20 6c 69 6b 65 20 22 72 65 61 64  ce is like "read
4fb0: 6c 69 6e 65 22 20 62 75 74 20 6e 6f 20 63 6f 6d  line" but no com
4fc0: 6d 61 6e 64 2d 6c 69 6e 65 20 65 64 69 74 69 6e  mand-line editin
4fd0: 67 0a 2a 2a 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a  g.** is done..**
4fe0: 0a 2a 2a 20 63 6f 70 69 65 64 20 66 72 6f 6d 20  .** copied from 
4ff0: 73 68 65 6c 6c 2e 63 20 66 72 6f 6d 20 27 2e 69  shell.c from '.i
5000: 6d 70 6f 72 74 27 20 63 6f 6d 6d 61 6e 64 0a 2a  mport' command.*
5010: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 6c  /.static char *l
5020: 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 63 68 61  ocal_getline(cha
5030: 72 20 2a 7a 50 72 6f 6d 70 74 2c 20 46 49 4c 45  r *zPrompt, FILE
5040: 20 2a 69 6e 29 7b 0a 20 20 63 68 61 72 20 2a 7a   *in){.  char *z
5050: 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 4c 69 6e  Line;.  int nLin
5060: 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e  e;.  int n;.  in
5070: 74 20 65 6f 6c 3b 0a 0a 20 20 6e 4c 69 6e 65 20  t eol;..  nLine 
5080: 3d 20 31 30 30 3b 0a 20 20 7a 4c 69 6e 65 20 3d  = 100;.  zLine =
5090: 20 6d 61 6c 6c 6f 63 28 20 6e 4c 69 6e 65 20 29   malloc( nLine )
50a0: 3b 0a 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d 30  ;.  if( zLine==0
50b0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e   ) return 0;.  n
50c0: 20 3d 20 30 3b 0a 20 20 65 6f 6c 20 3d 20 30 3b   = 0;.  eol = 0;
50d0: 0a 20 20 77 68 69 6c 65 28 20 21 65 6f 6c 20 29  .  while( !eol )
50e0: 7b 0a 20 20 20 20 69 66 28 20 6e 2b 31 30 30 3e  {.    if( n+100>
50f0: 6e 4c 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 6e  nLine ){.      n
5100: 4c 69 6e 65 20 3d 20 6e 4c 69 6e 65 2a 32 20 2b  Line = nLine*2 +
5110: 20 31 30 30 3b 0a 20 20 20 20 20 20 7a 4c 69 6e   100;.      zLin
5120: 65 20 3d 20 72 65 61 6c 6c 6f 63 28 7a 4c 69 6e  e = realloc(zLin
5130: 65 2c 20 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 20  e, nLine);.     
5140: 20 69 66 28 20 7a 4c 69 6e 65 3d 3d 30 20 29 20   if( zLine==0 ) 
5150: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
5160: 20 20 20 20 69 66 28 20 66 67 65 74 73 28 26 7a      if( fgets(&z
5170: 4c 69 6e 65 5b 6e 5d 2c 20 6e 4c 69 6e 65 20 2d  Line[n], nLine -
5180: 20 6e 2c 20 69 6e 29 3d 3d 30 20 29 7b 0a 20 20   n, in)==0 ){.  
5190: 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a      if( n==0 ){.
51a0: 20 20 20 20 20 20 20 20 66 72 65 65 28 7a 4c 69          free(zLi
51b0: 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ne);.        ret
51c0: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
51d0: 20 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20       zLine[n] = 
51e0: 30 3b 0a 20 20 20 20 20 20 65 6f 6c 20 3d 20 31  0;.      eol = 1
51f0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
5200: 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20     }.    while( 
5210: 7a 4c 69 6e 65 5b 6e 5d 20 29 7b 20 6e 2b 2b 3b  zLine[n] ){ n++;
5220: 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26   }.    if( n>0 &
5230: 26 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c  & zLine[n-1]=='\
5240: 6e 27 20 29 7b 0a 20 20 20 20 20 20 6e 2d 2d 3b  n' ){.      n--;
5250: 0a 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20  .      zLine[n] 
5260: 3d 20 30 3b 0a 20 20 20 20 20 20 65 6f 6c 20 3d  = 0;.      eol =
5270: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
5280: 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28  zLine = realloc(
5290: 20 7a 4c 69 6e 65 2c 20 6e 2b 31 20 29 3b 0a 20   zLine, n+1 );. 
52a0: 20 72 65 74 75 72 6e 20 7a 4c 69 6e 65 3b 0a 7d   return zLine;.}
52b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 22 73 71 6c  ../*.** The "sql
52c0: 69 74 65 22 20 63 6f 6d 6d 61 6e 64 20 62 65 6c  ite" command bel
52d0: 6f 77 20 63 72 65 61 74 65 73 20 61 20 6e 65 77  ow creates a new
52e0: 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 66 6f 72   Tcl command for
52f0: 20 65 61 63 68 0a 2a 2a 20 63 6f 6e 6e 65 63 74   each.** connect
5300: 69 6f 6e 20 69 74 20 6f 70 65 6e 73 20 74 6f 20  ion it opens to 
5310: 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  an SQLite databa
5320: 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
5330: 65 20 69 73 20 69 6e 76 6f 6b 65 64 0a 2a 2a 20  e is invoked.** 
5340: 77 68 65 6e 65 76 65 72 20 6f 6e 65 20 6f 66 20  whenever one of 
5350: 74 68 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  those connection
5360: 2d 73 70 65 63 69 66 69 63 20 63 6f 6d 6d 61 6e  -specific comman
5370: 64 73 20 69 73 20 65 78 65 63 75 74 65 64 0a 2a  ds is executed.*
5380: 2a 20 69 6e 20 54 63 6c 2e 20 20 46 6f 72 20 65  * in Tcl.  For e
5390: 78 61 6d 70 6c 65 2c 20 69 66 20 79 6f 75 20 72  xample, if you r
53a0: 75 6e 20 54 63 6c 20 63 6f 64 65 20 6c 69 6b 65  un Tcl code like
53b0: 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
53c0: 20 20 20 73 71 6c 69 74 65 33 20 64 62 31 20 20     sqlite3 db1  
53d0: 22 6d 79 5f 64 61 74 61 62 61 73 65 22 0a 2a 2a  "my_database".**
53e0: 20 20 20 20 20 20 20 64 62 31 20 63 6c 6f 73 65         db1 close
53f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
5400: 20 63 6f 6d 6d 61 6e 64 20 6f 70 65 6e 73 20 61   command opens a
5410: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74   connection to t
5420: 68 65 20 22 6d 79 5f 64 61 74 61 62 61 73 65 22  he "my_database"
5430: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 61 6e 64   database.** and
5440: 20 63 61 6c 6c 73 20 74 68 61 74 20 63 6f 6e 6e   calls that conn
5450: 65 63 74 69 6f 6e 20 22 64 62 31 22 2e 20 20 54  ection "db1".  T
5460: 68 65 20 73 65 63 6f 6e 64 20 63 6f 6d 6d 61 6e  he second comman
5470: 64 20 63 61 75 73 65 73 20 74 68 69 73 0a 2a 2a  d causes this.**
5480: 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 62   subroutine to b
5490: 65 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 73 74  e invoked..*/.st
54a0: 61 74 69 63 20 69 6e 74 20 44 62 4f 62 6a 43 6d  atic int DbObjCm
54b0: 64 28 76 6f 69 64 20 2a 63 64 2c 20 54 63 6c 5f  d(void *cd, Tcl_
54c0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
54d0: 69 6e 74 20 6f 62 6a 63 2c 54 63 6c 5f 4f 62 6a  int objc,Tcl_Obj
54e0: 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 29 7b 0a 20   *const*objv){. 
54f0: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
5500: 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a   (SqliteDb*)cd;.
5510: 20 20 69 6e 74 20 63 68 6f 69 63 65 3b 0a 20 20    int choice;.  
5520: 69 6e 74 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b  int rc = TCL_OK;
5530: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
5540: 63 68 61 72 20 2a 44 42 5f 73 74 72 73 5b 5d 20  char *DB_strs[] 
5550: 3d 20 7b 0a 20 20 20 20 22 61 75 74 68 6f 72 69  = {.    "authori
5560: 7a 65 72 22 2c 20 20 20 20 20 20 20 20 20 22 62  zer",         "b
5570: 75 73 79 22 2c 20 20 20 20 20 20 20 20 20 20 20  usy",           
5580: 20 20 20 22 63 61 63 68 65 22 2c 0a 20 20 20 20     "cache",.    
5590: 22 63 68 61 6e 67 65 73 22 2c 20 20 20 20 20 20  "changes",      
55a0: 20 20 20 20 20 20 22 63 6c 6f 73 65 22 2c 20 20        "close",  
55b0: 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 6c 6c             "coll
55c0: 61 74 65 22 2c 0a 20 20 20 20 22 63 6f 6c 6c 61  ate",.    "colla
55d0: 74 69 6f 6e 5f 6e 65 65 64 65 64 22 2c 20 20 20  tion_needed",   
55e0: 22 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 22 2c 20 20  "commit_hook",  
55f0: 20 20 20 20 20 22 63 6f 6d 70 6c 65 74 65 22 2c       "complete",
5600: 0a 20 20 20 20 22 63 6f 70 79 22 2c 20 20 20 20  .    "copy",    
5610: 20 20 20 20 20 20 20 20 20 20 20 22 65 6e 61 62             "enab
5620: 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  le_load_extensio
5630: 6e 22 2c 22 65 72 72 6f 72 63 6f 64 65 22 2c 0a  n","errorcode",.
5640: 20 20 20 20 22 65 76 61 6c 22 2c 20 20 20 20 20      "eval",     
5650: 20 20 20 20 20 20 20 20 20 20 22 65 78 69 73 74            "exist
5660: 73 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 22  s",            "
5670: 66 75 6e 63 74 69 6f 6e 22 2c 0a 20 20 20 20 22  function",.    "
5680: 69 6e 74 65 72 72 75 70 74 22 2c 20 20 20 20 20  interrupt",     
5690: 20 20 20 20 20 22 6c 61 73 74 5f 69 6e 73 65 72       "last_inser
56a0: 74 5f 72 6f 77 69 64 22 2c 20 22 6e 75 6c 6c 76  t_rowid", "nullv
56b0: 61 6c 75 65 22 2c 0a 20 20 20 20 22 6f 6e 65 63  alue",.    "onec
56c0: 6f 6c 75 6d 6e 22 2c 20 20 20 20 20 20 20 20 20  olumn",         
56d0: 20 22 70 72 6f 66 69 6c 65 22 2c 20 20 20 20 20   "profile",     
56e0: 20 20 20 20 20 20 22 70 72 6f 67 72 65 73 73 22        "progress"
56f0: 2c 0a 20 20 20 20 22 72 65 6b 65 79 22 2c 20 20  ,.    "rekey",  
5700: 20 20 20 20 20 20 20 20 20 20 20 20 22 72 6f 6c              "rol
5710: 6c 62 61 63 6b 5f 68 6f 6f 6b 22 2c 20 20 20 20  lback_hook",    
5720: 20 22 74 69 6d 65 6f 75 74 22 2c 0a 20 20 20 20   "timeout",.    
5730: 22 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 22 2c  "total_changes",
5740: 20 20 20 20 20 20 22 74 72 61 63 65 22 2c 20 20        "trace",  
5750: 20 20 20 20 20 20 20 20 20 20 20 22 74 72 61 6e             "tran
5760: 73 61 63 74 69 6f 6e 22 2c 0a 20 20 20 20 22 75  saction",.    "u
5770: 70 64 61 74 65 5f 68 6f 6f 6b 22 2c 20 20 20 20  pdate_hook",    
5780: 20 20 20 20 22 76 65 72 73 69 6f 6e 22 2c 20 20      "version",  
5790: 20 20 20 20 20 20 20 20 20 30 0a 20 20 7d 3b 0a           0.  };.
57a0: 20 20 65 6e 75 6d 20 44 42 5f 65 6e 75 6d 20 7b    enum DB_enum {
57b0: 0a 20 20 20 20 44 42 5f 41 55 54 48 4f 52 49 5a  .    DB_AUTHORIZ
57c0: 45 52 2c 20 20 20 20 20 20 20 20 44 42 5f 42 55  ER,        DB_BU
57d0: 53 59 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  SY,             
57e0: 44 42 5f 43 41 43 48 45 2c 0a 20 20 20 20 44 42  DB_CACHE,.    DB
57f0: 5f 43 48 41 4e 47 45 53 2c 20 20 20 20 20 20 20  _CHANGES,       
5800: 20 20 20 20 44 42 5f 43 4c 4f 53 45 2c 20 20 20      DB_CLOSE,   
5810: 20 20 20 20 20 20 20 20 20 44 42 5f 43 4f 4c 4c           DB_COLL
5820: 41 54 45 2c 0a 20 20 20 20 44 42 5f 43 4f 4c 4c  ATE,.    DB_COLL
5830: 41 54 49 4f 4e 5f 4e 45 45 44 45 44 2c 20 20 44  ATION_NEEDED,  D
5840: 42 5f 43 4f 4d 4d 49 54 5f 48 4f 4f 4b 2c 20 20  B_COMMIT_HOOK,  
5850: 20 20 20 20 44 42 5f 43 4f 4d 50 4c 45 54 45 2c      DB_COMPLETE,
5860: 0a 20 20 20 20 44 42 5f 43 4f 50 59 2c 20 20 20  .    DB_COPY,   
5870: 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 45 4e             DB_EN
5880: 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  ABLE_LOAD_EXTENS
5890: 49 4f 4e 2c 44 42 5f 45 52 52 4f 52 43 4f 44 45  ION,DB_ERRORCODE
58a0: 2c 0a 20 20 20 20 44 42 5f 45 56 41 4c 2c 20 20  ,.    DB_EVAL,  
58b0: 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 45              DB_E
58c0: 58 49 53 54 53 2c 20 20 20 20 20 20 20 20 20 20  XISTS,          
58d0: 20 44 42 5f 46 55 4e 43 54 49 4f 4e 2c 0a 20 20   DB_FUNCTION,.  
58e0: 20 20 44 42 5f 49 4e 54 45 52 52 55 50 54 2c 20    DB_INTERRUPT, 
58f0: 20 20 20 20 20 20 20 20 44 42 5f 4c 41 53 54 5f          DB_LAST_
5900: 49 4e 53 45 52 54 5f 52 4f 57 49 44 2c 44 42 5f  INSERT_ROWID,DB_
5910: 4e 55 4c 4c 56 41 4c 55 45 2c 0a 20 20 20 20 44  NULLVALUE,.    D
5920: 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 2c 20 20 20 20  B_ONECOLUMN,    
5930: 20 20 20 20 20 44 42 5f 50 52 4f 46 49 4c 45 2c       DB_PROFILE,
5940: 20 20 20 20 20 20 20 20 20 20 44 42 5f 50 52 4f            DB_PRO
5950: 47 52 45 53 53 2c 0a 20 20 20 20 44 42 5f 52 45  GRESS,.    DB_RE
5960: 4b 45 59 2c 20 20 20 20 20 20 20 20 20 20 20 20  KEY,            
5970: 20 44 42 5f 52 4f 4c 4c 42 41 43 4b 5f 48 4f 4f   DB_ROLLBACK_HOO
5980: 4b 2c 20 20 20 20 44 42 5f 54 49 4d 45 4f 55 54  K,    DB_TIMEOUT
5990: 2c 0a 20 20 20 20 44 42 5f 54 4f 54 41 4c 5f 43  ,.    DB_TOTAL_C
59a0: 48 41 4e 47 45 53 2c 20 20 20 20 20 44 42 5f 54  HANGES,     DB_T
59b0: 52 41 43 45 2c 20 20 20 20 20 20 20 20 20 20 20  RACE,           
59c0: 20 44 42 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c   DB_TRANSACTION,
59d0: 0a 20 20 20 20 44 42 5f 55 50 44 41 54 45 5f 48  .    DB_UPDATE_H
59e0: 4f 4f 4b 2c 20 20 20 20 20 20 20 44 42 5f 56 45  OOK,       DB_VE
59f0: 52 53 49 4f 4e 2c 20 20 20 20 20 20 20 20 20 20  RSION,          
5a00: 0a 20 20 7d 3b 0a 20 20 2f 2a 20 64 6f 6e 27 74  .  };.  /* don't
5a10: 20 6c 65 61 76 65 20 74 72 61 69 6c 69 6e 67 20   leave trailing 
5a20: 63 6f 6d 6d 61 73 20 6f 6e 20 44 42 5f 65 6e 75  commas on DB_enu
5a30: 6d 2c 20 69 74 20 63 6f 6e 66 75 73 65 73 20 74  m, it confuses t
5a40: 68 65 20 41 49 58 20 78 6c 63 20 63 6f 6d 70 69  he AIX xlc compi
5a50: 6c 65 72 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62  ler */..  if( ob
5a60: 6a 63 3c 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  jc<2 ){.    Tcl_
5a70: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
5a80: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
5a90: 55 42 43 4f 4d 4d 41 4e 44 20 2e 2e 2e 22 29 3b  UBCOMMAND ...");
5aa0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
5ab0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
5ac0: 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f   Tcl_GetIndexFro
5ad0: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
5ae0: 76 5b 31 5d 2c 20 44 42 5f 73 74 72 73 2c 20 22  v[1], DB_strs, "
5af0: 6f 70 74 69 6f 6e 22 2c 20 30 2c 20 26 63 68 6f  option", 0, &cho
5b00: 69 63 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ice) ){.    retu
5b10: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
5b20: 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 28 65 6e  }..  switch( (en
5b30: 75 6d 20 44 42 5f 65 6e 75 6d 29 63 68 6f 69 63  um DB_enum)choic
5b40: 65 20 29 7b 0a 0a 20 20 2f 2a 20 20 20 20 24 64  e ){..  /*    $d
5b50: 62 20 61 75 74 68 6f 72 69 7a 65 72 20 3f 43 41  b authorizer ?CA
5b60: 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a  LLBACK?.  **.  *
5b70: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76  * Invoke the giv
5b80: 65 6e 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61  en callback to a
5b90: 75 74 68 6f 72 69 7a 65 20 65 61 63 68 20 53 51  uthorize each SQ
5ba0: 4c 20 6f 70 65 72 61 74 69 6f 6e 20 61 73 20 69  L operation as i
5bb0: 74 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 69 6c  t is.  ** compil
5bc0: 65 64 2e 20 20 35 20 61 72 67 75 6d 65 6e 74 73  ed.  5 arguments
5bd0: 20 61 72 65 20 61 70 70 65 6e 64 65 64 20 74 6f   are appended to
5be0: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 62 65   the callback be
5bf0: 66 6f 72 65 20 69 74 20 69 73 0a 20 20 2a 2a 20  fore it is.  ** 
5c00: 69 6e 76 6f 6b 65 64 3a 0a 20 20 2a 2a 0a 20 20  invoked:.  **.  
5c10: 2a 2a 20 20 20 28 31 29 20 54 68 65 20 61 75 74  **   (1) The aut
5c20: 68 6f 72 69 7a 61 74 69 6f 6e 20 74 79 70 65 20  horization type 
5c30: 28 65 78 3a 20 53 51 4c 49 54 45 5f 43 52 45 41  (ex: SQLITE_CREA
5c40: 54 45 5f 54 41 42 4c 45 2c 20 53 51 4c 49 54 45  TE_TABLE, SQLITE
5c50: 5f 49 4e 53 45 52 54 2c 20 2e 2e 2e 29 0a 20 20  _INSERT, ...).  
5c60: 2a 2a 20 20 20 28 32 29 20 46 69 72 73 74 20 64  **   (2) First d
5c70: 65 73 63 72 69 70 74 69 76 65 20 6e 61 6d 65 20  escriptive name 
5c80: 28 64 65 70 65 6e 64 73 20 6f 6e 20 61 75 74 68  (depends on auth
5c90: 6f 72 69 7a 61 74 69 6f 6e 20 74 79 70 65 29 0a  orization type).
5ca0: 20 20 2a 2a 20 20 20 28 33 29 20 53 65 63 6f 6e    **   (3) Secon
5cb0: 64 20 64 65 73 63 72 69 70 74 69 76 65 20 6e 61  d descriptive na
5cc0: 6d 65 0a 20 20 2a 2a 20 20 20 28 34 29 20 4e 61  me.  **   (4) Na
5cd0: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
5ce0: 73 65 20 28 65 78 3a 20 22 6d 61 69 6e 22 2c 20  se (ex: "main", 
5cf0: 22 74 65 6d 70 22 29 0a 20 20 2a 2a 20 20 20 28  "temp").  **   (
5d00: 35 29 20 4e 61 6d 65 20 6f 66 20 74 72 69 67 67  5) Name of trigg
5d10: 65 72 20 74 68 61 74 20 69 73 20 64 6f 69 6e 67  er that is doing
5d20: 20 74 68 65 20 61 63 63 65 73 73 0a 20 20 2a 2a   the access.  **
5d30: 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61  .  ** The callba
5d40: 63 6b 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e  ck should return
5d50: 20 6f 6e 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f   on of the follo
5d60: 77 69 6e 67 20 73 74 72 69 6e 67 73 3a 20 53 51  wing strings: SQ
5d70: 4c 49 54 45 5f 4f 4b 2c 0a 20 20 2a 2a 20 53 51  LITE_OK,.  ** SQ
5d80: 4c 49 54 45 5f 49 47 4e 4f 52 45 2c 20 6f 72 20  LITE_IGNORE, or 
5d90: 53 51 4c 49 54 45 5f 44 45 4e 59 2e 20 20 41 6e  SQLITE_DENY.  An
5da0: 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76  y other return v
5db0: 61 6c 75 65 20 69 73 20 61 6e 20 65 72 72 6f 72  alue is an error
5dc0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
5dd0: 68 69 73 20 6d 65 74 68 6f 64 20 69 73 20 69 6e  his method is in
5de0: 76 6f 6b 65 64 20 77 69 74 68 20 6e 6f 20 61 72  voked with no ar
5df0: 67 75 6d 65 6e 74 73 2c 20 74 68 65 20 63 75 72  guments, the cur
5e00: 72 65 6e 74 20 61 75 74 68 6f 72 69 7a 61 74 69  rent authorizati
5e10: 6f 6e 0a 20 20 2a 2a 20 63 61 6c 6c 62 61 63 6b  on.  ** callback
5e20: 20 73 74 72 69 6e 67 20 69 73 20 72 65 74 75 72   string is retur
5e30: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ned..  */.  case
5e40: 20 44 42 5f 41 55 54 48 4f 52 49 5a 45 52 3a 20   DB_AUTHORIZER: 
5e50: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
5e60: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
5e70: 4f 4e 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ON.    Tcl_Appen
5e80: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
5e90: 22 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 6e  "authorization n
5ea0: 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  ot available in 
5eb0: 74 68 69 73 20 62 75 69 6c 64 22 2c 20 30 29 3b  this build", 0);
5ec0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
5ed0: 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 20  ERROR;.#else.   
5ee0: 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20   if( objc>3 ){. 
5ef0: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
5f00: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
5f10: 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43   objv, "?CALLBAC
5f20: 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  K?");.      retu
5f30: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
5f40: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63    }else if( objc
5f50: 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==2 ){.      if(
5f60: 20 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20   pDb->zAuth ){. 
5f70: 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
5f80: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
5f90: 70 44 62 2d 3e 7a 41 75 74 68 2c 20 30 29 3b 0a  pDb->zAuth, 0);.
5fa0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
5fb0: 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  e{.      char *z
5fc0: 41 75 74 68 3b 0a 20 20 20 20 20 20 69 6e 74 20  Auth;.      int 
5fd0: 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70  len;.      if( p
5fe0: 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20  Db->zAuth ){.   
5ff0: 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44       Tcl_Free(pD
6000: 62 2d 3e 7a 41 75 74 68 29 3b 0a 20 20 20 20 20  b->zAuth);.     
6010: 20 7d 0a 20 20 20 20 20 20 7a 41 75 74 68 20 3d   }.      zAuth =
6020: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
6030: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26  omObj(objv[2], &
6040: 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  len);.      if( 
6050: 7a 41 75 74 68 20 26 26 20 6c 65 6e 3e 30 20 29  zAuth && len>0 )
6060: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
6070: 41 75 74 68 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63  Auth = Tcl_Alloc
6080: 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20  ( len + 1 );.   
6090: 20 20 20 20 20 73 74 72 63 70 79 28 70 44 62 2d       strcpy(pDb-
60a0: 3e 7a 41 75 74 68 2c 20 7a 41 75 74 68 29 3b 0a  >zAuth, zAuth);.
60b0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
60c0: 20 20 20 20 20 70 44 62 2d 3e 7a 41 75 74 68 20       pDb->zAuth 
60d0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
60e0: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74     if( pDb->zAut
60f0: 68 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  h ){.        pDb
6100: 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  ->interp = inter
6110: 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  p;.        sqlit
6120: 65 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65  e3_set_authorize
6130: 72 28 70 44 62 2d 3e 64 62 2c 20 61 75 74 68 5f  r(pDb->db, auth_
6140: 63 61 6c 6c 62 61 63 6b 2c 20 70 44 62 29 3b 0a  callback, pDb);.
6150: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6160: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74       sqlite3_set
6170: 5f 61 75 74 68 6f 72 69 7a 65 72 28 70 44 62 2d  _authorizer(pDb-
6180: 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  >db, 0, 0);.    
6190: 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
61a0: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
61b0: 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 62 75 73  .  /*    $db bus
61c0: 79 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a  y ?CALLBACK?.  *
61d0: 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  *.  ** Invoke th
61e0: 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b  e given callback
61f0: 20 69 66 20 61 6e 20 53 51 4c 20 73 74 61 74 65   if an SQL state
6200: 6d 65 6e 74 20 61 74 74 65 6d 70 74 73 20 74 6f  ment attempts to
6210: 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 6c 6f 63   open.  ** a loc
6220: 6b 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  ked database fil
6230: 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  e..  */.  case D
6240: 42 5f 42 55 53 59 3a 20 7b 0a 20 20 20 20 69 66  B_BUSY: {.    if
6250: 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20  ( objc>3 ){.    
6260: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
6270: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
6280: 6a 76 2c 20 22 43 41 4c 4c 42 41 43 4b 22 29 3b  jv, "CALLBACK");
6290: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
62a0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c  L_ERROR;.    }el
62b0: 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29  se if( objc==2 )
62c0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  {.      if( pDb-
62d0: 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 20 20  >zBusy ){.      
62e0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
62f0: 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e  lt(interp, pDb->
6300: 7a 42 75 73 79 2c 20 30 29 3b 0a 20 20 20 20 20  zBusy, 0);.     
6310: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
6320: 20 20 20 20 63 68 61 72 20 2a 7a 42 75 73 79 3b      char *zBusy;
6330: 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  .      int len;.
6340: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
6350: 42 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Busy ){.        
6360: 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 42  Tcl_Free(pDb->zB
6370: 75 73 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  usy);.      }.  
6380: 20 20 20 20 7a 42 75 73 79 20 3d 20 54 63 6c 5f      zBusy = Tcl_
6390: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
63a0: 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b  (objv[2], &len);
63b0: 0a 20 20 20 20 20 20 69 66 28 20 7a 42 75 73 79  .      if( zBusy
63c0: 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20   && len>0 ){.   
63d0: 20 20 20 20 20 70 44 62 2d 3e 7a 42 75 73 79 20       pDb->zBusy 
63e0: 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e  = Tcl_Alloc( len
63f0: 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20   + 1 );.        
6400: 73 74 72 63 70 79 28 70 44 62 2d 3e 7a 42 75 73  strcpy(pDb->zBus
6410: 79 2c 20 7a 42 75 73 79 29 3b 0a 20 20 20 20 20  y, zBusy);.     
6420: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6430: 70 44 62 2d 3e 7a 42 75 73 79 20 3d 20 30 3b 0a  pDb->zBusy = 0;.
6440: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
6450: 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a  ( pDb->zBusy ){.
6460: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74          pDb->int
6470: 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20  erp = interp;.  
6480: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75        sqlite3_bu
6490: 73 79 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e  sy_handler(pDb->
64a0: 64 62 2c 20 44 62 42 75 73 79 48 61 6e 64 6c 65  db, DbBusyHandle
64b0: 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d  r, pDb);.      }
64c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
64d0: 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c  lite3_busy_handl
64e0: 65 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30  er(pDb->db, 0, 0
64f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
6500: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
6510: 0a 20 20 2f 2a 20 20 20 20 20 24 64 62 20 63 61  .  /*     $db ca
6520: 63 68 65 20 66 6c 75 73 68 0a 20 20 2a 2a 20 20  che flush.  **  
6530: 20 20 20 24 64 62 20 63 61 63 68 65 20 73 69 7a     $db cache siz
6540: 65 20 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6c  e n.  **.  ** Fl
6550: 75 73 68 20 74 68 65 20 70 72 65 70 61 72 65 64  ush the prepared
6560: 20 73 74 61 74 65 6d 65 6e 74 20 63 61 63 68 65   statement cache
6570: 2c 20 6f 72 20 73 65 74 20 74 68 65 20 6d 61 78  , or set the max
6580: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 0a 20  imum number of. 
6590: 20 2a 2a 20 63 61 63 68 65 64 20 73 74 61 74 65   ** cached state
65a0: 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 63 61  ments..  */.  ca
65b0: 73 65 20 44 42 5f 43 41 43 48 45 3a 20 7b 0a 20  se DB_CACHE: {. 
65c0: 20 20 20 63 68 61 72 20 2a 73 75 62 43 6d 64 3b     char *subCmd;
65d0: 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 20  .    int n;..   
65e0: 20 69 66 28 20 6f 62 6a 63 3c 3d 32 20 29 7b 0a   if( objc<=2 ){.
65f0: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
6600: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
6610: 2c 20 6f 62 6a 76 2c 20 22 63 61 63 68 65 20 6f  , objv, "cache o
6620: 70 74 69 6f 6e 20 3f 61 72 67 3f 22 29 3b 0a 20  ption ?arg?");. 
6630: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
6640: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
6650: 20 73 75 62 43 6d 64 20 3d 20 54 63 6c 5f 47 65   subCmd = Tcl_Ge
6660: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 20  tStringFromObj( 
6670: 6f 62 6a 76 5b 32 5d 2c 20 30 20 29 3b 0a 20 20  objv[2], 0 );.  
6680: 20 20 69 66 28 20 2a 73 75 62 43 6d 64 3d 3d 27    if( *subCmd=='
6690: 66 27 20 26 26 20 73 74 72 63 6d 70 28 73 75 62  f' && strcmp(sub
66a0: 43 6d 64 2c 22 66 6c 75 73 68 22 29 3d 3d 30 20  Cmd,"flush")==0 
66b0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a  ){.      if( obj
66c0: 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20  c!=3 ){.        
66d0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
66e0: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
66f0: 2c 20 22 66 6c 75 73 68 22 29 3b 0a 20 20 20 20  , "flush");.    
6700: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
6710: 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RROR;.      }els
6720: 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 75 73 68  e{.        flush
6730: 53 74 6d 74 43 61 63 68 65 28 20 70 44 62 20 29  StmtCache( pDb )
6740: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
6750: 6c 73 65 20 69 66 28 20 2a 73 75 62 43 6d 64 3d  lse if( *subCmd=
6760: 3d 27 73 27 20 26 26 20 73 74 72 63 6d 70 28 73  ='s' && strcmp(s
6770: 75 62 43 6d 64 2c 22 73 69 7a 65 22 29 3d 3d 30  ubCmd,"size")==0
6780: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 62   ){.      if( ob
6790: 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 20  jc!=4 ){.       
67a0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
67b0: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
67c0: 76 2c 20 22 73 69 7a 65 20 6e 22 29 3b 0a 20 20  v, "size n");.  
67d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
67e0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65  _ERROR;.      }e
67f0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28  lse{.        if(
6800: 20 54 43 4c 5f 45 52 52 4f 52 3d 3d 54 63 6c 5f   TCL_ERROR==Tcl_
6810: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
6820: 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
6830: 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  n) ){.          
6840: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
6850: 28 20 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f  ( interp, "canno
6860: 74 20 63 6f 6e 76 65 72 74 20 5c 22 22 2c 20 0a  t convert \"", .
6870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
6880: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
6890: 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 30 29 2c 20  Obj(objv[3],0), 
68a0: 22 5c 22 20 74 6f 20 69 6e 74 65 67 65 72 22 2c  "\" to integer",
68b0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72   0);.          r
68c0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
68d0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
68e0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 3c            if( n<
68f0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
6900: 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28   flushStmtCache(
6910: 20 70 44 62 20 29 3b 0a 20 20 20 20 20 20 20 20   pDb );.        
6920: 20 20 20 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20      n = 0;.     
6930: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
6940: 3e 4d 41 58 5f 50 52 45 50 41 52 45 44 5f 53 54  >MAX_PREPARED_ST
6950: 4d 54 53 20 29 7b 0a 20 20 20 20 20 20 20 20 20  MTS ){.         
6960: 20 20 20 6e 20 3d 20 4d 41 58 5f 50 52 45 50 41     n = MAX_PREPA
6970: 52 45 44 5f 53 54 4d 54 53 3b 0a 20 20 20 20 20  RED_STMTS;.     
6980: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
6990: 20 70 44 62 2d 3e 6d 61 78 53 74 6d 74 20 3d 20   pDb->maxStmt = 
69a0: 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  n;.        }.   
69b0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
69c0: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
69d0: 52 65 73 75 6c 74 28 20 69 6e 74 65 72 70 2c 20  Result( interp, 
69e0: 22 62 61 64 20 6f 70 74 69 6f 6e 20 5c 22 22 2c  "bad option \"",
69f0: 20 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f   .          Tcl_
6a00: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
6a10: 28 6f 62 6a 76 5b 30 5d 2c 30 29 2c 20 22 5c 22  (objv[0],0), "\"
6a20: 3a 20 6d 75 73 74 20 62 65 20 66 6c 75 73 68 20  : must be flush 
6a30: 6f 72 20 73 69 7a 65 22 2c 20 30 29 3b 0a 20 20  or size", 0);.  
6a40: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
6a50: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
6a60: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
6a70: 20 20 20 20 20 24 64 62 20 63 68 61 6e 67 65 73       $db changes
6a80: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72  .  **.  ** Retur
6a90: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
6aa0: 72 6f 77 73 20 74 68 61 74 20 77 65 72 65 20 6d  rows that were m
6ab0: 6f 64 69 66 69 65 64 2c 20 69 6e 73 65 72 74 65  odified, inserte
6ac0: 64 2c 20 6f 72 20 64 65 6c 65 74 65 64 20 62 79  d, or deleted by
6ad0: 0a 20 20 2a 2a 20 74 68 65 20 6d 6f 73 74 20 72  .  ** the most r
6ae0: 65 63 65 6e 74 20 49 4e 53 45 52 54 2c 20 55 50  ecent INSERT, UP
6af0: 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73  DATE or DELETE s
6b00: 74 61 74 65 6d 65 6e 74 2c 20 6e 6f 74 20 69 6e  tatement, not in
6b10: 63 6c 75 64 69 6e 67 20 0a 20 20 2a 2a 20 61 6e  cluding .  ** an
6b20: 79 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62  y changes made b
6b30: 79 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61  y trigger progra
6b40: 6d 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ms..  */.  case 
6b50: 44 42 5f 43 48 41 4e 47 45 53 3a 20 7b 0a 20 20  DB_CHANGES: {.  
6b60: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75    Tcl_Obj *pResu
6b70: 6c 74 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  lt;.    if( objc
6b80: 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=2 ){.      Tcl
6b90: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
6ba0: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
6bb0: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
6bc0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
6bd0: 7d 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20  }.    pResult = 
6be0: 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_GetObjResult
6bf0: 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63  (interp);.    Tc
6c00: 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52 65 73  l_SetIntObj(pRes
6c10: 75 6c 74 2c 20 73 71 6c 69 74 65 33 5f 63 68 61  ult, sqlite3_cha
6c20: 6e 67 65 73 28 70 44 62 2d 3e 64 62 29 29 3b 0a  nges(pDb->db));.
6c30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
6c40: 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6c 6f 73    /*    $db clos
6c50: 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 68 75 74  e.  **.  ** Shut
6c60: 64 6f 77 6e 20 74 68 65 20 64 61 74 61 62 61 73  down the databas
6c70: 65 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  e.  */.  case DB
6c80: 5f 43 4c 4f 53 45 3a 20 7b 0a 20 20 20 20 54 63  _CLOSE: {.    Tc
6c90: 6c 5f 44 65 6c 65 74 65 43 6f 6d 6d 61 6e 64 28  l_DeleteCommand(
6ca0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
6cb0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
6cc0: 76 5b 30 5d 2c 20 30 29 29 3b 0a 20 20 20 20 62  v[0], 0));.    b
6cd0: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
6ce0: 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63 6f 6c    **     $db col
6cf0: 6c 61 74 65 20 4e 41 4d 45 20 53 43 52 49 50 54  late NAME SCRIPT
6d00: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65 61 74  .  **.  ** Creat
6d10: 65 20 61 20 6e 65 77 20 53 51 4c 20 63 6f 6c 6c  e a new SQL coll
6d20: 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 63  ation function c
6d30: 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 57 68 65  alled NAME.  Whe
6d40: 6e 65 76 65 72 0a 20 20 2a 2a 20 74 68 61 74 20  never.  ** that 
6d50: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
6d60: 65 64 2c 20 69 6e 76 6f 6b 65 20 53 43 52 49 50  ed, invoke SCRIP
6d70: 54 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  T to evaluate th
6d80: 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f  e function..  */
6d90: 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 4c 4c 41  .  case DB_COLLA
6da0: 54 45 3a 20 7b 0a 20 20 20 20 53 71 6c 43 6f 6c  TE: {.    SqlCol
6db0: 6c 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65 3b 0a  late *pCollate;.
6dc0: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b      char *zName;
6dd0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 63 72 69  .    char *zScri
6de0: 70 74 3b 0a 20 20 20 20 69 6e 74 20 6e 53 63 72  pt;.    int nScr
6df0: 69 70 74 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a  ipt;.    if( obj
6e00: 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=4 ){.      Tc
6e10: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
6e20: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
6e30: 22 4e 41 4d 45 20 53 43 52 49 50 54 22 29 3b 0a  "NAME SCRIPT");.
6e40: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
6e50: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
6e60: 20 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65    zName = Tcl_Ge
6e70: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
6e80: 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20  bjv[2], 0);.    
6e90: 7a 53 63 72 69 70 74 20 3d 20 54 63 6c 5f 47 65  zScript = Tcl_Ge
6ea0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
6eb0: 62 6a 76 5b 33 5d 2c 20 26 6e 53 63 72 69 70 74  bjv[3], &nScript
6ec0: 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 20  );.    pCollate 
6ed0: 3d 20 28 53 71 6c 43 6f 6c 6c 61 74 65 2a 29 54  = (SqlCollate*)T
6ee0: 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  cl_Alloc( sizeof
6ef0: 28 2a 70 43 6f 6c 6c 61 74 65 29 20 2b 20 6e 53  (*pCollate) + nS
6f00: 63 72 69 70 74 20 2b 20 31 20 29 3b 0a 20 20 20  cript + 1 );.   
6f10: 20 69 66 28 20 70 43 6f 6c 6c 61 74 65 3d 3d 30   if( pCollate==0
6f20: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
6f30: 52 4f 52 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74  ROR;.    pCollat
6f40: 65 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65  e->interp = inte
6f50: 72 70 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65  rp;.    pCollate
6f60: 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 70  ->pNext = pDb->p
6f70: 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 70 43 6f  Collate;.    pCo
6f80: 6c 6c 61 74 65 2d 3e 7a 53 63 72 69 70 74 20 3d  llate->zScript =
6f90: 20 28 63 68 61 72 2a 29 26 70 43 6f 6c 6c 61 74   (char*)&pCollat
6fa0: 65 5b 31 5d 3b 0a 20 20 20 20 70 44 62 2d 3e 70  e[1];.    pDb->p
6fb0: 43 6f 6c 6c 61 74 65 20 3d 20 70 43 6f 6c 6c 61  Collate = pColla
6fc0: 74 65 3b 0a 20 20 20 20 73 74 72 63 70 79 28 70  te;.    strcpy(p
6fd0: 43 6f 6c 6c 61 74 65 2d 3e 7a 53 63 72 69 70 74  Collate->zScript
6fe0: 2c 20 7a 53 63 72 69 70 74 29 3b 0a 20 20 20 20  , zScript);.    
6ff0: 69 66 28 20 73 71 6c 69 74 65 33 5f 63 72 65 61  if( sqlite3_crea
7000: 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 70 44 62  te_collation(pDb
7010: 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c  ->db, zName, SQL
7020: 49 54 45 5f 55 54 46 38 2c 20 0a 20 20 20 20 20  ITE_UTF8, .     
7030: 20 20 20 70 43 6f 6c 6c 61 74 65 2c 20 74 63 6c     pCollate, tcl
7040: 53 71 6c 43 6f 6c 6c 61 74 65 29 20 29 7b 0a 20  SqlCollate) ){. 
7050: 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75       Tcl_SetResu
7060: 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
7070: 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72 6d 73   *)sqlite3_errms
7080: 67 28 70 44 62 2d 3e 64 62 29 2c 20 54 43 4c 5f  g(pDb->db), TCL_
7090: 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 20  VOLATILE);.     
70a0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
70b0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  R;.    }.    bre
70c0: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
70d0: 2a 2a 20 20 20 20 20 24 64 62 20 63 6f 6c 6c 61  **     $db colla
70e0: 74 69 6f 6e 5f 6e 65 65 64 65 64 20 53 43 52 49  tion_needed SCRI
70f0: 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65  PT.  **.  ** Cre
7100: 61 74 65 20 61 20 6e 65 77 20 53 51 4c 20 63 6f  ate a new SQL co
7110: 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  llation function
7120: 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 57   called NAME.  W
7130: 68 65 6e 65 76 65 72 0a 20 20 2a 2a 20 74 68 61  henever.  ** tha
7140: 74 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  t function is ca
7150: 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53 43 52  lled, invoke SCR
7160: 49 50 54 20 74 6f 20 65 76 61 6c 75 61 74 65 20  IPT to evaluate 
7170: 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  the function..  
7180: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 4c  */.  case DB_COL
7190: 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 3a 20 7b  LATION_NEEDED: {
71a0: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  .    if( objc!=3
71b0: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
71c0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
71d0: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 43 52  p, 2, objv, "SCR
71e0: 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74  IPT");.      ret
71f0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
7200: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 44 62     }.    if( pDb
7210: 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64  ->pCollateNeeded
7220: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44 65   ){.      Tcl_De
7230: 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e  crRefCount(pDb->
7240: 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b  pCollateNeeded);
7250: 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 62 2d 3e  .    }.    pDb->
7260: 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 20 3d  pCollateNeeded =
7270: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62   Tcl_DuplicateOb
7280: 6a 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20  j(objv[2]);.    
7290: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
72a0: 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65  (pDb->pCollateNe
72b0: 65 64 65 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  eded);.    sqlit
72c0: 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65  e3_collation_nee
72d0: 64 65 64 28 70 44 62 2d 3e 64 62 2c 20 70 44 62  ded(pDb->db, pDb
72e0: 2c 20 74 63 6c 43 6f 6c 6c 61 74 65 4e 65 65 64  , tclCollateNeed
72f0: 65 64 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  ed);.    break;.
7300: 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62    }..  /*    $db
7310: 20 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 20 3f 43 41   commit_hook ?CA
7320: 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a  LLBACK?.  **.  *
7330: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76  * Invoke the giv
7340: 65 6e 20 63 61 6c 6c 62 61 63 6b 20 6a 75 73 74  en callback just
7350: 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69   before committi
7360: 6e 67 20 65 76 65 72 79 20 53 51 4c 20 74 72 61  ng every SQL tra
7370: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 49  nsaction..  ** I
7380: 66 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 74  f the callback t
7390: 68 72 6f 77 73 20 61 6e 20 65 78 63 65 70 74 69  hrows an excepti
73a0: 6f 6e 20 6f 72 20 72 65 74 75 72 6e 73 20 6e 6f  on or returns no
73b0: 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n-zero, then the
73c0: 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
73d0: 6e 20 69 73 20 61 62 6f 72 74 65 64 2e 20 20 49  n is aborted.  I
73e0: 66 20 43 41 4c 4c 42 41 43 4b 20 69 73 20 61 6e  f CALLBACK is an
73f0: 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 20 74   empty string, t
7400: 68 65 20 63 61 6c 6c 62 61 63 6b 0a 20 20 2a 2a  he callback.  **
7410: 20 69 73 20 64 69 73 61 62 6c 65 64 2e 0a 20 20   is disabled..  
7420: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 4d  */.  case DB_COM
7430: 4d 49 54 5f 48 4f 4f 4b 3a 20 7b 0a 20 20 20 20  MIT_HOOK: {.    
7440: 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20  if( objc>3 ){.  
7450: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
7460: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
7470: 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b  objv, "?CALLBACK
7480: 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ?");.      retur
7490: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
74a0: 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d   }else if( objc=
74b0: 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =2 ){.      if( 
74c0: 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a  pDb->zCommit ){.
74d0: 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
74e0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
74f0: 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 2c 20 30   pDb->zCommit, 0
7500: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
7510: 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72  else{.      char
7520: 20 2a 7a 43 6f 6d 6d 69 74 3b 0a 20 20 20 20 20   *zCommit;.     
7530: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20   int len;.      
7540: 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74  if( pDb->zCommit
7550: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
7560: 46 72 65 65 28 70 44 62 2d 3e 7a 43 6f 6d 6d 69  Free(pDb->zCommi
7570: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
7580: 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 54 63 6c 5f    zCommit = Tcl_
7590: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
75a0: 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b  (objv[2], &len);
75b0: 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6f 6d 6d  .      if( zComm
75c0: 69 74 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20  it && len>0 ){. 
75d0: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 43 6f 6d         pDb->zCom
75e0: 6d 69 74 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28  mit = Tcl_Alloc(
75f0: 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20   len + 1 );.    
7600: 20 20 20 20 73 74 72 63 70 79 28 70 44 62 2d 3e      strcpy(pDb->
7610: 7a 43 6f 6d 6d 69 74 2c 20 7a 43 6f 6d 6d 69 74  zCommit, zCommit
7620: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
7630: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 43 6f          pDb->zCo
7640: 6d 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  mmit = 0;.      
7650: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  }.      if( pDb-
7660: 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  >zCommit ){.    
7670: 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20      pDb->interp 
7680: 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20  = interp;.      
7690: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74    sqlite3_commit
76a0: 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20 44  _hook(pDb->db, D
76b0: 62 43 6f 6d 6d 69 74 48 61 6e 64 6c 65 72 2c 20  bCommitHandler, 
76c0: 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  pDb);.      }els
76d0: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
76e0: 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 70  e3_commit_hook(p
76f0: 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20  Db->db, 0, 0);. 
7700: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
7710: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
7720: 2a 20 20 20 20 24 64 62 20 63 6f 6d 70 6c 65 74  *    $db complet
7730: 65 20 53 51 4c 0a 20 20 2a 2a 0a 20 20 2a 2a 20  e SQL.  **.  ** 
7740: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 53  Return TRUE if S
7750: 51 4c 20 69 73 20 61 20 63 6f 6d 70 6c 65 74 65  QL is a complete
7760: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20   SQL statement. 
7770: 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66   Return FALSE if
7780: 0a 20 20 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c  .  ** additional
7790: 20 6c 69 6e 65 73 20 6f 66 20 69 6e 70 75 74 20   lines of input 
77a0: 61 72 65 20 6e 65 65 64 65 64 2e 20 20 54 68 69  are needed.  Thi
77b0: 73 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20  s is similar to 
77c0: 74 68 65 0a 20 20 2a 2a 20 62 75 69 6c 74 2d 69  the.  ** built-i
77d0: 6e 20 22 69 6e 66 6f 20 63 6f 6d 70 6c 65 74 65  n "info complete
77e0: 22 20 63 6f 6d 6d 61 6e 64 20 6f 66 20 54 63 6c  " command of Tcl
77f0: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
7800: 5f 43 4f 4d 50 4c 45 54 45 3a 20 7b 0a 23 69 66  _COMPLETE: {.#if
7810: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7820: 5f 43 4f 4d 50 4c 45 54 45 0a 20 20 20 20 54 63  _COMPLETE.    Tc
7830: 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a  l_Obj *pResult;.
7840: 20 20 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c 65      int isComple
7850: 74 65 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  te;.    if( objc
7860: 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=3 ){.      Tcl
7870: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
7880: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
7890: 53 51 4c 22 29 3b 0a 20 20 20 20 20 20 72 65 74  SQL");.      ret
78a0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
78b0: 20 20 20 7d 0a 20 20 20 20 69 73 43 6f 6d 70 6c     }.    isCompl
78c0: 65 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  ete = sqlite3_co
78d0: 6d 70 6c 65 74 65 28 20 54 63 6c 5f 47 65 74 53  mplete( Tcl_GetS
78e0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
78f0: 76 5b 32 5d 2c 20 30 29 20 29 3b 0a 20 20 20 20  v[2], 0) );.    
7900: 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65  pResult = Tcl_Ge
7910: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
7920: 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 42  p);.    Tcl_SetB
7930: 6f 6f 6c 65 61 6e 4f 62 6a 28 70 52 65 73 75 6c  ooleanObj(pResul
7940: 74 2c 20 69 73 43 6f 6d 70 6c 65 74 65 29 3b 0a  t, isComplete);.
7950: 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b  #endif.    break
7960: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24  ;.  }..  /*    $
7970: 64 62 20 63 6f 70 79 20 63 6f 6e 66 6c 69 63 74  db copy conflict
7980: 2d 61 6c 67 6f 72 69 74 68 6d 20 74 61 62 6c 65  -algorithm table
7990: 20 66 69 6c 65 6e 61 6d 65 20 3f 53 45 50 41 52   filename ?SEPAR
79a0: 41 54 4f 52 3f 20 3f 4e 55 4c 4c 49 4e 44 49 43  ATOR? ?NULLINDIC
79b0: 41 54 4f 52 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ATOR?.  **.  ** 
79c0: 43 6f 70 79 20 64 61 74 61 20 69 6e 74 6f 20 74  Copy data into t
79d0: 61 62 6c 65 20 66 72 6f 6d 20 66 69 6c 65 6e 61  able from filena
79e0: 6d 65 2c 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 75  me, optionally u
79f0: 73 69 6e 67 20 53 45 50 41 52 41 54 4f 52 0a 20  sing SEPARATOR. 
7a00: 20 2a 2a 20 61 73 20 63 6f 6c 75 6d 6e 20 73 65   ** as column se
7a10: 70 61 72 61 74 6f 72 73 2e 20 20 49 66 20 61 20  parators.  If a 
7a20: 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20  column contains 
7a30: 61 20 6e 75 6c 6c 20 73 74 72 69 6e 67 2c 20 6f  a null string, o
7a40: 72 20 74 68 65 0a 20 20 2a 2a 20 76 61 6c 75 65  r the.  ** value
7a50: 20 6f 66 20 4e 55 4c 4c 49 4e 44 49 43 41 54 4f   of NULLINDICATO
7a60: 52 2c 20 61 20 4e 55 4c 4c 20 69 73 20 69 6e 73  R, a NULL is ins
7a70: 65 72 74 65 64 20 66 6f 72 20 74 68 65 20 63 6f  erted for the co
7a80: 6c 75 6d 6e 2e 0a 20 20 2a 2a 20 63 6f 6e 66 6c  lumn..  ** confl
7a90: 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20 69 73  ict-algorithm is
7aa0: 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 71 6c 69   one of the sqli
7ab0: 74 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67 6f  te conflict algo
7ac0: 72 69 74 68 6d 73 3a 0a 20 20 2a 2a 20 20 20 20  rithms:.  **    
7ad0: 72 6f 6c 6c 62 61 63 6b 2c 20 61 62 6f 72 74 2c  rollback, abort,
7ae0: 20 66 61 69 6c 2c 20 69 67 6e 6f 72 65 2c 20 72   fail, ignore, r
7af0: 65 70 6c 61 63 65 0a 20 20 2a 2a 20 4f 6e 20 73  eplace.  ** On s
7b00: 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20 74  uccess, return t
7b10: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 69 6e  he number of lin
7b20: 65 73 20 70 72 6f 63 65 73 73 65 64 2c 20 6e 6f  es processed, no
7b30: 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 73 61  t necessarily sa
7b40: 6d 65 0a 20 20 2a 2a 20 61 73 20 27 64 62 20 63  me.  ** as 'db c
7b50: 68 61 6e 67 65 73 27 20 64 75 65 20 74 6f 20 63  hanges' due to c
7b60: 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68  onflict-algorith
7b70: 6d 20 73 65 6c 65 63 74 65 64 2e 0a 20 20 2a 2a  m selected..  **
7b80: 0a 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20  .  ** This code 
7b90: 69 73 20 62 61 73 69 63 61 6c 6c 79 20 61 6e 20  is basically an 
7ba0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2f 65  implementation/e
7bb0: 6e 68 61 6e 63 65 6d 65 6e 74 20 6f 66 0a 20 20  nhancement of.  
7bc0: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 20 73  ** the sqlite3 s
7bd0: 68 65 6c 6c 2e 63 20 22 2e 69 6d 70 6f 72 74 22  hell.c ".import"
7be0: 20 63 6f 6d 6d 61 6e 64 2e 0a 20 20 2a 2a 0a 20   command..  **. 
7bf0: 20 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64   ** This command
7c00: 20 75 73 61 67 65 20 69 73 20 65 71 75 69 76 61   usage is equiva
7c10: 6c 65 6e 74 20 74 6f 20 74 68 65 20 73 71 6c 69  lent to the sqli
7c20: 74 65 32 2e 78 20 43 4f 50 59 20 73 74 61 74 65  te2.x COPY state
7c30: 6d 65 6e 74 2c 0a 20 20 2a 2a 20 77 68 69 63 68  ment,.  ** which
7c40: 20 69 6d 70 6f 72 74 73 20 66 69 6c 65 20 64 61   imports file da
7c50: 74 61 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20  ta into a table 
7c60: 75 73 69 6e 67 20 74 68 65 20 50 6f 73 74 67 72  using the Postgr
7c70: 65 53 51 4c 20 43 4f 50 59 20 66 69 6c 65 20 66  eSQL COPY file f
7c80: 6f 72 6d 61 74 3a 0a 20 20 2a 2a 20 20 20 24 64  ormat:.  **   $d
7c90: 62 20 63 6f 70 79 20 24 63 6f 6e 66 6c 69 74 5f  b copy $conflit_
7ca0: 61 6c 67 6f 20 24 74 61 62 6c 65 5f 6e 61 6d 65  algo $table_name
7cb0: 20 24 66 69 6c 65 6e 61 6d 65 20 5c 74 20 5c 5c   $filename \t \\
7cc0: 4e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  N.  */.  case DB
7cd0: 5f 43 4f 50 59 3a 20 7b 0a 20 20 20 20 63 68 61  _COPY: {.    cha
7ce0: 72 20 2a 7a 54 61 62 6c 65 3b 20 20 20 20 20 20  r *zTable;      
7cf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65           /* Inse
7d00: 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68 69  rt data into thi
7d10: 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 63  s table */.    c
7d20: 68 61 72 20 2a 7a 46 69 6c 65 3b 20 20 20 20 20  har *zFile;     
7d30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
7d40: 65 20 66 69 6c 65 20 66 72 6f 6d 20 77 68 69 63  e file from whic
7d50: 68 20 74 6f 20 65 78 74 72 61 63 74 20 64 61 74  h to extract dat
7d60: 61 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  a */.    char *z
7d70: 43 6f 6e 66 6c 69 63 74 3b 20 20 20 20 20 20 20  Conflict;       
7d80: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 66       /* The conf
7d90: 6c 69 63 74 20 61 6c 67 6f 72 69 74 68 6d 20 74  lict algorithm t
7da0: 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 73 71 6c  o use */.    sql
7db0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
7dc0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 74  ;        /* A st
7dd0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69  atement */.    i
7de0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
7df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
7e00: 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 20  sult code */.   
7e10: 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20   int nCol;      
7e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7e30: 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
7e40: 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a  s in the table *
7e50: 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b  /.    int nByte;
7e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e70: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
7e80: 79 74 65 73 20 69 6e 20 61 6e 20 53 51 4c 20 73  ytes in an SQL s
7e90: 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74  tring */.    int
7ea0: 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
7eb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
7ec0: 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 20   counters */.   
7ed0: 20 69 6e 74 20 6e 53 65 70 3b 20 20 20 20 20 20   int nSep;      
7ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7ef0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
7f00: 69 6e 20 7a 53 65 70 5b 5d 20 2a 2f 0a 20 20 20  in zSep[] */.   
7f10: 20 69 6e 74 20 6e 4e 75 6c 6c 3b 20 20 20 20 20   int nNull;     
7f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7f30: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
7f40: 69 6e 20 7a 4e 75 6c 6c 5b 5d 20 2a 2f 0a 20 20  in zNull[] */.  
7f50: 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20    char *zSql;   
7f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7f70: 20 41 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   An SQL statemen
7f80: 74 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  t */.    char *z
7f90: 4c 69 6e 65 3b 20 20 20 20 20 20 20 20 20 20 20  Line;           
7fa0: 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
7fb0: 20 6c 69 6e 65 20 6f 66 20 69 6e 70 75 74 20 66   line of input f
7fc0: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a  rom the file */.
7fd0: 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c      char **azCol
7fe0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7ff0: 2f 2a 20 7a 4c 69 6e 65 5b 5d 20 62 72 6f 6b 65  /* zLine[] broke
8000: 6e 20 75 70 20 69 6e 74 6f 20 63 6f 6c 75 6d 6e  n up into column
8010: 73 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  s */.    char *z
8020: 43 6f 6d 6d 69 74 3b 20 20 20 20 20 20 20 20 20  Commit;         
8030: 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 63       /* How to c
8040: 6f 6d 6d 69 74 20 63 68 61 6e 67 65 73 20 2a 2f  ommit changes */
8050: 0a 20 20 20 20 46 49 4c 45 20 2a 69 6e 3b 20 20  .    FILE *in;  
8060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8070: 20 2f 2a 20 54 68 65 20 69 6e 70 75 74 20 66 69   /* The input fi
8080: 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 69  le */.    int li
8090: 6e 65 6e 6f 20 3d 20 30 3b 20 20 20 20 20 20 20  neno = 0;       
80a0: 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75        /* Line nu
80b0: 6d 62 65 72 20 6f 66 20 69 6e 70 75 74 20 66 69  mber of input fi
80c0: 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 7a  le */.    char z
80d0: 4c 69 6e 65 4e 75 6d 5b 38 30 5d 3b 20 20 20 20  LineNum[80];    
80e0: 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75        /* Line nu
80f0: 6d 62 65 72 20 70 72 69 6e 74 20 62 75 66 66 65  mber print buffe
8100: 72 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  r */.    Tcl_Obj
8110: 20 2a 70 52 65 73 75 6c 74 3b 20 20 20 20 20 20   *pResult;      
8120: 20 20 20 20 20 2f 2a 20 69 6e 74 65 72 70 20 72       /* interp r
8130: 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 20 20 63 68  esult */..    ch
8140: 61 72 20 2a 7a 53 65 70 3b 0a 20 20 20 20 63 68  ar *zSep;.    ch
8150: 61 72 20 2a 7a 4e 75 6c 6c 3b 0a 20 20 20 20 69  ar *zNull;.    i
8160: 66 28 20 6f 62 6a 63 3c 35 20 7c 7c 20 6f 62 6a  f( objc<5 || obj
8170: 63 3e 37 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  c>7 ){.      Tcl
8180: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
8190: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 0a  terp, 2, objv, .
81a0: 20 20 20 20 20 20 20 20 20 22 43 4f 4e 46 4c 49           "CONFLI
81b0: 43 54 2d 41 4c 47 4f 52 49 54 48 4d 20 54 41 42  CT-ALGORITHM TAB
81c0: 4c 45 20 46 49 4c 45 4e 41 4d 45 20 3f 53 45 50  LE FILENAME ?SEP
81d0: 41 52 41 54 4f 52 3f 20 3f 4e 55 4c 4c 49 4e 44  ARATOR? ?NULLIND
81e0: 49 43 41 54 4f 52 3f 22 29 3b 0a 20 20 20 20 20  ICATOR?");.     
81f0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
8200: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  R;.    }.    if(
8210: 20 6f 62 6a 63 3e 3d 36 20 29 7b 0a 20 20 20 20   objc>=6 ){.    
8220: 20 20 7a 53 65 70 20 3d 20 54 63 6c 5f 47 65 74    zSep = Tcl_Get
8230: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
8240: 6a 76 5b 35 5d 2c 20 30 29 3b 0a 20 20 20 20 7d  jv[5], 0);.    }
8250: 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 53 65 70  else{.      zSep
8260: 20 3d 20 22 5c 74 22 3b 0a 20 20 20 20 7d 0a 20   = "\t";.    }. 
8270: 20 20 20 69 66 28 20 6f 62 6a 63 3e 3d 37 20 29     if( objc>=7 )
8280: 7b 0a 20 20 20 20 20 20 7a 4e 75 6c 6c 20 3d 20  {.      zNull = 
8290: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
82a0: 6d 4f 62 6a 28 6f 62 6a 76 5b 36 5d 2c 20 30 29  mObj(objv[6], 0)
82b0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
82c0: 20 20 20 7a 4e 75 6c 6c 20 3d 20 22 22 3b 0a 20     zNull = "";. 
82d0: 20 20 20 7d 0a 20 20 20 20 7a 43 6f 6e 66 6c 69     }.    zConfli
82e0: 63 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  ct = Tcl_GetStri
82f0: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
8300: 5d 2c 20 30 29 3b 0a 20 20 20 20 7a 54 61 62 6c  ], 0);.    zTabl
8310: 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
8320: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d  gFromObj(objv[3]
8330: 2c 20 30 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20  , 0);.    zFile 
8340: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
8350: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 34 5d 2c 20  romObj(objv[4], 
8360: 30 29 3b 0a 20 20 20 20 6e 53 65 70 20 3d 20 73  0);.    nSep = s
8370: 74 72 6c 65 6e 28 7a 53 65 70 29 3b 0a 20 20 20  trlen(zSep);.   
8380: 20 6e 4e 75 6c 6c 20 3d 20 73 74 72 6c 65 6e 28   nNull = strlen(
8390: 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20  zNull);.    if( 
83a0: 6e 53 65 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nSep==0 ){.     
83b0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
83c0: 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 3a  t(interp,"Error:
83d0: 20 6e 6f 6e 2d 6e 75 6c 6c 20 73 65 70 61 72 61   non-null separa
83e0: 74 6f 72 20 72 65 71 75 69 72 65 64 20 66 6f 72  tor required for
83f0: 20 63 6f 70 79 22 2c 30 29 3b 0a 20 20 20 20 20   copy",0);.     
8400: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
8410: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  R;.    }.    if(
8420: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
8430: 43 6f 6e 66 6c 69 63 74 2c 20 22 72 6f 6c 6c 62  Conflict, "rollb
8440: 61 63 6b 22 29 20 21 3d 20 30 20 26 26 0a 20 20  ack") != 0 &&.  
8450: 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 49       sqlite3StrI
8460: 43 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22  Cmp(zConflict, "
8470: 61 62 6f 72 74 22 20 20 20 29 20 21 3d 20 30 20  abort"   ) != 0 
8480: 26 26 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65  &&.       sqlite
8490: 33 53 74 72 49 43 6d 70 28 7a 43 6f 6e 66 6c 69  3StrICmp(zConfli
84a0: 63 74 2c 20 22 66 61 69 6c 22 20 20 20 20 29 20  ct, "fail"    ) 
84b0: 21 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20 73  != 0 &&.       s
84c0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 43  qlite3StrICmp(zC
84d0: 6f 6e 66 6c 69 63 74 2c 20 22 69 67 6e 6f 72 65  onflict, "ignore
84e0: 22 20 20 29 20 21 3d 20 30 20 26 26 0a 20 20 20  "  ) != 0 &&.   
84f0: 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 49 43      sqlite3StrIC
8500: 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 72  mp(zConflict, "r
8510: 65 70 6c 61 63 65 22 20 29 20 21 3d 20 30 20 29  eplace" ) != 0 )
8520: 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70   {.      Tcl_App
8530: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
8540: 2c 20 22 45 72 72 6f 72 3a 20 5c 22 22 2c 20 7a  , "Error: \"", z
8550: 43 6f 6e 66 6c 69 63 74 2c 20 0a 20 20 20 20 20  Conflict, .     
8560: 20 20 20 20 20 20 20 22 5c 22 2c 20 63 6f 6e 66         "\", conf
8570: 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20 6d  lict-algorithm m
8580: 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 3a 20 72  ust be one of: r
8590: 6f 6c 6c 62 61 63 6b 2c 20 22 0a 20 20 20 20 20  ollback, ".     
85a0: 20 20 20 20 20 20 20 22 61 62 6f 72 74 2c 20 66         "abort, f
85b0: 61 69 6c 2c 20 69 67 6e 6f 72 65 2c 20 6f 72 20  ail, ignore, or 
85c0: 72 65 70 6c 61 63 65 22 2c 20 30 29 3b 0a 20 20  replace", 0);.  
85d0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
85e0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
85f0: 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
8600: 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 2a  printf("SELECT *
8610: 20 46 52 4f 4d 20 27 25 71 27 22 2c 20 7a 54 61   FROM '%q'", zTa
8620: 62 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 53  ble);.    if( zS
8630: 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54  ql==0 ){.      T
8640: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
8650: 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20  interp, "Error: 
8660: 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 22  no such table: "
8670: 2c 20 7a 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20  , zTable, 0);.  
8680: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
8690: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
86a0: 6e 42 79 74 65 20 3d 20 73 74 72 6c 65 6e 28 7a  nByte = strlen(z
86b0: 53 71 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  Sql);.    rc = s
86c0: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 70  qlite3_prepare(p
86d0: 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  Db->db, zSql, -1
86e0: 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
86f0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
8700: 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Sql);.    if( rc
8710: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
8720: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
8730: 70 2c 20 22 45 72 72 6f 72 3a 20 22 2c 20 73 71  p, "Error: ", sq
8740: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
8750: 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 20  ->db), 0);.     
8760: 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7d   nCol = 0;.    }
8770: 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 43 6f 6c  else{.      nCol
8780: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
8790: 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a  n_count(pStmt);.
87a0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
87b0: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
87c0: 29 3b 0a 20 20 20 20 69 66 28 20 6e 43 6f 6c 3d  );.    if( nCol=
87d0: 3d 30 20 29 20 7b 0a 20 20 20 20 20 20 72 65 74  =0 ) {.      ret
87e0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
87f0: 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20     }.    zSql = 
8800: 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 2b 20  malloc( nByte + 
8810: 35 30 20 2b 20 6e 43 6f 6c 2a 32 20 29 3b 0a 20  50 + nCol*2 );. 
8820: 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29     if( zSql==0 )
8830: 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70   {.      Tcl_App
8840: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
8850: 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 27 74 20  , "Error: can't 
8860: 6d 61 6c 6c 6f 63 28 29 22 2c 20 30 29 3b 0a 20  malloc()", 0);. 
8870: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
8880: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
8890: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
88a0: 66 28 6e 42 79 74 65 2b 35 30 2c 20 7a 53 71 6c  f(nByte+50, zSql
88b0: 2c 20 22 49 4e 53 45 52 54 20 4f 52 20 25 71 20  , "INSERT OR %q 
88c0: 49 4e 54 4f 20 27 25 71 27 20 56 41 4c 55 45 53  INTO '%q' VALUES
88d0: 28 3f 22 2c 0a 20 20 20 20 20 20 20 20 20 7a 43  (?",.         zC
88e0: 6f 6e 66 6c 69 63 74 2c 20 7a 54 61 62 6c 65 29  onflict, zTable)
88f0: 3b 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c 65 6e  ;.    j = strlen
8900: 28 7a 53 71 6c 29 3b 0a 20 20 20 20 66 6f 72 28  (zSql);.    for(
8910: 69 3d 31 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=1; i<nCol; i++
8920: 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b  ){.      zSql[j+
8930: 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20  +] = ',';.      
8940: 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 3f 27 3b  zSql[j++] = '?';
8950: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 5b  .    }.    zSql[
8960: 6a 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20  j++] = ')';.    
8970: 7a 53 71 6c 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20  zSql[j] = 0;.   
8980: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
8990: 65 70 61 72 65 28 70 44 62 2d 3e 64 62 2c 20 7a  epare(pDb->db, z
89a0: 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
89b0: 20 30 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 53   0);.    free(zS
89c0: 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ql);.    if( rc 
89d0: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
89e0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
89f0: 2c 20 22 45 72 72 6f 72 3a 20 22 2c 20 73 71 6c  , "Error: ", sql
8a00: 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d  ite3_errmsg(pDb-
8a10: 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  >db), 0);.      
8a20: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
8a30: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72  (pStmt);.      r
8a40: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8a50: 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e 20 3d 20  .    }.    in = 
8a60: 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 22 72 62  fopen(zFile, "rb
8a70: 22 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 3d 3d  ");.    if( in==
8a80: 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  0 ){.      Tcl_A
8a90: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
8aa0: 72 70 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e  rp, "Error: cann
8ab0: 6f 74 20 6f 70 65 6e 20 66 69 6c 65 3a 20 22 2c  ot open file: ",
8ac0: 20 7a 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 20   zFile, NULL);. 
8ad0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e       sqlite3_fin
8ae0: 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
8af0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
8b00: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
8b10: 61 7a 43 6f 6c 20 3d 20 6d 61 6c 6c 6f 63 28 20  azCol = malloc( 
8b20: 73 69 7a 65 6f 66 28 61 7a 43 6f 6c 5b 30 5d 29  sizeof(azCol[0])
8b30: 2a 28 6e 43 6f 6c 2b 31 29 20 29 3b 0a 20 20 20  *(nCol+1) );.   
8b40: 20 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 20   if( azCol==0 ) 
8b50: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
8b60: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
8b70: 20 22 45 72 72 6f 72 3a 20 63 61 6e 27 74 20 6d   "Error: can't m
8b80: 61 6c 6c 6f 63 28 29 22 2c 20 30 29 3b 0a 20 20  alloc()", 0);.  
8b90: 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a      fclose(in);.
8ba0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
8bb0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
8bc0: 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f    (void)sqlite3_
8bd0: 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 22 42  exec(pDb->db, "B
8be0: 45 47 49 4e 22 2c 20 30 2c 20 30 2c 20 30 29 3b  EGIN", 0, 0, 0);
8bf0: 0a 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22  .    zCommit = "
8c00: 43 4f 4d 4d 49 54 22 3b 0a 20 20 20 20 77 68 69  COMMIT";.    whi
8c10: 6c 65 28 20 28 7a 4c 69 6e 65 20 3d 20 6c 6f 63  le( (zLine = loc
8c20: 61 6c 5f 67 65 74 6c 69 6e 65 28 30 2c 20 69 6e  al_getline(0, in
8c30: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  ))!=0 ){.      c
8c40: 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 69 20  har *z;.      i 
8c50: 3d 20 30 3b 0a 20 20 20 20 20 20 6c 69 6e 65 6e  = 0;.      linen
8c60: 6f 2b 2b 3b 0a 20 20 20 20 20 20 61 7a 43 6f 6c  o++;.      azCol
8c70: 5b 30 5d 20 3d 20 7a 4c 69 6e 65 3b 0a 20 20 20  [0] = zLine;.   
8c80: 20 20 20 66 6f 72 28 69 3d 30 2c 20 7a 3d 7a 4c     for(i=0, z=zL
8c90: 69 6e 65 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20  ine; *z; z++){. 
8ca0: 20 20 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d 7a         if( *z==z
8cb0: 53 65 70 5b 30 5d 20 26 26 20 73 74 72 6e 63 6d  Sep[0] && strncm
8cc0: 70 28 7a 2c 20 7a 53 65 70 2c 20 6e 53 65 70 29  p(z, zSep, nSep)
8cd0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
8ce0: 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20   *z = 0;.       
8cf0: 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20     i++;.        
8d00: 20 20 69 66 28 20 69 3c 6e 43 6f 6c 20 29 7b 0a    if( i<nCol ){.
8d10: 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 43 6f              azCo
8d20: 6c 5b 69 5d 20 3d 20 26 7a 5b 6e 53 65 70 5d 3b  l[i] = &z[nSep];
8d30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20 2b  .            z +
8d40: 3d 20 6e 53 65 70 2d 31 3b 0a 20 20 20 20 20 20  = nSep-1;.      
8d50: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
8d60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
8d70: 28 20 69 2b 31 21 3d 6e 43 6f 6c 20 29 7b 0a 20  ( i+1!=nCol ){. 
8d80: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 45 72         char *zEr
8d90: 72 3b 0a 20 20 20 20 20 20 20 20 7a 45 72 72 20  r;.        zErr 
8da0: 3d 20 6d 61 6c 6c 6f 63 28 32 30 30 20 2b 20 73  = malloc(200 + s
8db0: 74 72 6c 65 6e 28 7a 46 69 6c 65 29 29 3b 0a 20  trlen(zFile));. 
8dc0: 20 20 20 20 20 20 20 69 66 28 20 7a 45 72 72 20         if( zErr 
8dd0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 70 72  ){.          spr
8de0: 69 6e 74 66 28 7a 45 72 72 2c 0a 20 20 20 20 20  intf(zErr,.     
8df0: 20 20 20 20 20 20 20 20 22 45 72 72 6f 72 3a 20          "Error: 
8e00: 25 73 20 6c 69 6e 65 20 25 64 3a 20 65 78 70 65  %s line %d: expe
8e10: 63 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e 73 20  cted %d columns 
8e20: 6f 66 20 64 61 74 61 20 62 75 74 20 66 6f 75 6e  of data but foun
8e30: 64 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20  d %d",.         
8e40: 20 20 20 20 7a 46 69 6c 65 2c 20 6c 69 6e 65 6e      zFile, linen
8e50: 6f 2c 20 6e 43 6f 6c 2c 20 69 2b 31 29 3b 0a 20  o, nCol, i+1);. 
8e60: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70           Tcl_App
8e70: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
8e80: 2c 20 7a 45 72 72 2c 20 30 29 3b 0a 20 20 20 20  , zErr, 0);.    
8e90: 20 20 20 20 20 20 66 72 65 65 28 7a 45 72 72 29        free(zErr)
8ea0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
8eb0: 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 52      zCommit = "R
8ec0: 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20 20  OLLBACK";.      
8ed0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
8ee0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
8ef0: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
8f00: 20 20 20 20 20 20 2f 2a 20 63 68 65 63 6b 20 66        /* check f
8f10: 6f 72 20 6e 75 6c 6c 20 64 61 74 61 2c 20 69 66  or null data, if
8f20: 20 73 6f 2c 20 62 69 6e 64 20 61 73 20 6e 75 6c   so, bind as nul
8f30: 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 20  l */.        if 
8f40: 28 28 6e 4e 75 6c 6c 3e 30 20 26 26 20 73 74 72  ((nNull>0 && str
8f50: 63 6d 70 28 61 7a 43 6f 6c 5b 69 5d 2c 20 7a 4e  cmp(azCol[i], zN
8f60: 75 6c 6c 29 3d 3d 30 29 20 7c 7c 20 73 74 72 6c  ull)==0) || strl
8f70: 65 6e 28 61 7a 43 6f 6c 5b 69 5d 29 3d 3d 30 29  en(azCol[i])==0)
8f80: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   {.          sql
8f90: 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70  ite3_bind_null(p
8fa0: 53 74 6d 74 2c 20 69 2b 31 29 3b 0a 20 20 20 20  Stmt, i+1);.    
8fb0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8fc0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
8fd0: 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 2b  d_text(pStmt, i+
8fe0: 31 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 20 2d 31 2c  1, azCol[i], -1,
8ff0: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
9000: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9010: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
9020: 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20  _step(pStmt);.  
9030: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
9040: 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20  _reset(pStmt);. 
9050: 20 20 20 20 20 66 72 65 65 28 7a 4c 69 6e 65 29       free(zLine)
9060: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
9070: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
9080: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
9090: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72  esult(interp,"Er
90a0: 72 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f  ror: ", sqlite3_
90b0: 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c  errmsg(pDb->db),
90c0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7a 43 6f   0);.        zCo
90d0: 6d 6d 69 74 20 3d 20 22 52 4f 4c 4c 42 41 43 4b  mmit = "ROLLBACK
90e0: 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ";.        break
90f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9100: 20 20 20 20 66 72 65 65 28 61 7a 43 6f 6c 29 3b      free(azCol);
9110: 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b  .    fclose(in);
9120: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
9130: 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
9140: 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f    (void)sqlite3_
9150: 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a 43  exec(pDb->db, zC
9160: 6f 6d 6d 69 74 2c 20 30 2c 20 30 2c 20 30 29 3b  ommit, 0, 0, 0);
9170: 0a 0a 20 20 20 20 69 66 28 20 7a 43 6f 6d 6d 69  ..    if( zCommi
9180: 74 5b 30 5d 20 3d 3d 20 27 43 27 20 29 7b 0a 20  t[0] == 'C' ){. 
9190: 20 20 20 20 20 2f 2a 20 73 75 63 63 65 73 73 2c       /* success,
91a0: 20 73 65 74 20 72 65 73 75 6c 74 20 61 73 20 6e   set result as n
91b0: 75 6d 62 65 72 20 6f 66 20 6c 69 6e 65 73 20 70  umber of lines p
91c0: 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20  rocessed */.    
91d0: 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f    pResult = Tcl_
91e0: 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  GetObjResult(int
91f0: 65 72 70 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f  erp);.      Tcl_
9200: 53 65 74 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c  SetIntObj(pResul
9210: 74 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20  t, lineno);.    
9220: 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20    rc = TCL_OK;. 
9230: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9240: 2f 2a 20 66 61 69 6c 75 72 65 2c 20 61 70 70 65  /* failure, appe
9250: 6e 64 20 6c 69 6e 65 6e 6f 20 77 68 65 72 65 20  nd lineno where 
9260: 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20  failed */.      
9270: 73 70 72 69 6e 74 66 28 7a 4c 69 6e 65 4e 75 6d  sprintf(zLineNum
9280: 2c 22 25 64 22 2c 6c 69 6e 65 6e 6f 29 3b 0a 20  ,"%d",lineno);. 
9290: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
92a0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 2c 20  esult(interp,", 
92b0: 66 61 69 6c 65 64 20 77 68 69 6c 65 20 70 72 6f  failed while pro
92c0: 63 65 73 73 69 6e 67 20 6c 69 6e 65 3a 20 22 2c  cessing line: ",
92d0: 7a 4c 69 6e 65 4e 75 6d 2c 30 29 3b 0a 20 20 20  zLineNum,0);.   
92e0: 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f     rc = TCL_ERRO
92f0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  R;.    }.    bre
9300: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
9310: 2a 2a 20 20 20 20 24 64 62 20 65 6e 61 62 6c 65  **    $db enable
9320: 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 20  _load_extension 
9330: 42 4f 4f 4c 45 41 4e 0a 20 20 2a 2a 0a 20 20 2a  BOOLEAN.  **.  *
9340: 2a 20 54 75 72 6e 20 74 68 65 20 65 78 74 65 6e  * Turn the exten
9350: 73 69 6f 6e 20 6c 6f 61 64 69 6e 67 20 66 65 61  sion loading fea
9360: 74 75 72 65 20 6f 6e 20 6f 72 20 6f 66 66 2e 20  ture on or off. 
9370: 20 49 74 20 69 66 20 6f 66 66 20 62 79 0a 20 20   It if off by.  
9380: 2a 2a 20 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2f  ** default..  */
9390: 0a 20 20 63 61 73 65 20 44 42 5f 45 4e 41 42 4c  .  case DB_ENABL
93a0: 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  E_LOAD_EXTENSION
93b0: 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  : {.#ifndef SQLI
93c0: 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
93d0: 45 4e 53 49 4f 4e 0a 20 20 20 20 69 6e 74 20 6f  ENSION.    int o
93e0: 6e 6f 66 66 3b 0a 20 20 20 20 69 66 28 20 6f 62  noff;.    if( ob
93f0: 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54  jc!=3 ){.      T
9400: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
9410: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
9420: 20 22 42 4f 4f 4c 45 41 4e 22 29 3b 0a 20 20 20   "BOOLEAN");.   
9430: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
9440: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
9450: 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61  f( Tcl_GetBoolea
9460: 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  nFromObj(interp,
9470: 20 6f 62 6a 76 5b 32 5d 2c 20 26 6f 6e 6f 66 66   objv[2], &onoff
9480: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
9490: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
94a0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65   }.    sqlite3_e
94b0: 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e  nable_load_exten
94c0: 73 69 6f 6e 28 70 44 62 2d 3e 64 62 2c 20 6f 6e  sion(pDb->db, on
94d0: 6f 66 66 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  off);.    break;
94e0: 0a 23 65 6c 73 65 0a 20 20 20 20 54 63 6c 5f 41  .#else.    Tcl_A
94f0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
9500: 72 70 2c 20 22 65 78 74 65 6e 73 69 6f 6e 20 6c  rp, "extension l
9510: 6f 61 64 69 6e 67 20 69 73 20 74 75 72 6e 65 64  oading is turned
9520: 20 6f 66 66 20 61 74 20 63 6f 6d 70 69 6c 65 2d   off at compile-
9530: 74 69 6d 65 22 2c 0a 20 20 20 20 20 20 20 20 20  time",.         
9540: 20 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a              0);.
9550: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
9560: 52 52 4f 52 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  RROR;.#endif.  }
9570: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24  ..  /*.  **    $
9580: 64 62 20 65 72 72 6f 72 63 6f 64 65 0a 20 20 2a  db errorcode.  *
9590: 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68  *.  ** Return th
95a0: 65 20 6e 75 6d 65 72 69 63 20 65 72 72 6f 72 20  e numeric error 
95b0: 63 6f 64 65 20 74 68 61 74 20 77 61 73 20 72 65  code that was re
95c0: 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 6d 6f  turned by the mo
95d0: 73 74 20 72 65 63 65 6e 74 0a 20 20 2a 2a 20 63  st recent.  ** c
95e0: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  all to sqlite3_e
95f0: 78 65 63 28 29 2e 0a 20 20 2a 2f 0a 20 20 63 61  xec()..  */.  ca
9600: 73 65 20 44 42 5f 45 52 52 4f 52 43 4f 44 45 3a  se DB_ERRORCODE:
9610: 20 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62   {.    Tcl_SetOb
9620: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
9630: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71  Tcl_NewIntObj(sq
9640: 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70 44  lite3_errcode(pD
9650: 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20 62 72  b->db)));.    br
9660: 65 61 6b 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 2f  eak;.  }.   .  /
9670: 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 65 76  *.  **    $db ev
9680: 61 6c 20 24 73 71 6c 20 3f 61 72 72 61 79 3f 20  al $sql ?array? 
9690: 3f 7b 20 20 2e 2e 2e 63 6f 64 65 2e 2e 2e 20 7d  ?{  ...code... }
96a0: 3f 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 6f 6e  ?.  **    $db on
96b0: 65 63 6f 6c 75 6d 6e 20 24 73 71 6c 0a 20 20 2a  ecolumn $sql.  *
96c0: 2a 0a 20 20 2a 2a 20 54 68 65 20 53 51 4c 20 73  *.  ** The SQL s
96d0: 74 61 74 65 6d 65 6e 74 20 69 6e 20 24 73 71 6c  tatement in $sql
96e0: 20 69 73 20 65 76 61 6c 75 61 74 65 64 2e 20 20   is evaluated.  
96f0: 46 6f 72 20 65 61 63 68 20 72 6f 77 2c 20 74 68  For each row, th
9700: 65 20 76 61 6c 75 65 73 20 61 72 65 0a 20 20 2a  e values are.  *
9710: 2a 20 70 6c 61 63 65 64 20 69 6e 20 65 6c 65 6d  * placed in elem
9720: 65 6e 74 73 20 6f 66 20 74 68 65 20 61 72 72 61  ents of the arra
9730: 79 20 6e 61 6d 65 64 20 22 61 72 72 61 79 22 20  y named "array" 
9740: 61 6e 64 20 2e 2e 2e 63 6f 64 65 2e 2e 2e 20 69  and ...code... i
9750: 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20 2a 2a  s executed..  **
9760: 20 49 66 20 22 61 72 72 61 79 22 20 61 6e 64 20   If "array" and 
9770: 22 63 6f 64 65 22 20 61 72 65 20 6f 6d 69 74 74  "code" are omitt
9780: 65 64 2c 20 74 68 65 6e 20 6e 6f 20 63 61 6c 6c  ed, then no call
9790: 62 61 63 6b 20 69 73 20 65 76 65 72 79 20 69 6e  back is every in
97a0: 76 6f 6b 65 64 2e 0a 20 20 2a 2a 20 49 66 20 22  voked..  ** If "
97b0: 61 72 72 61 79 22 20 69 73 20 61 6e 20 65 6d 70  array" is an emp
97c0: 74 79 20 73 74 72 69 6e 67 2c 20 74 68 65 6e 20  ty string, then 
97d0: 74 68 65 20 76 61 6c 75 65 73 20 61 72 65 20 70  the values are p
97e0: 6c 61 63 65 64 20 69 6e 20 76 61 72 69 61 62 6c  laced in variabl
97f0: 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 68 61 76  es.  ** that hav
9800: 65 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20  e the same name 
9810: 61 73 20 74 68 65 20 66 69 65 6c 64 73 20 65 78  as the fields ex
9820: 74 72 61 63 74 65 64 20 62 79 20 74 68 65 20 71  tracted by the q
9830: 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  uery..  **.  ** 
9840: 54 68 65 20 6f 6e 65 63 6f 6c 75 6d 6e 20 6d 65  The onecolumn me
9850: 74 68 6f 64 20 69 73 20 74 68 65 20 65 71 75 69  thod is the equi
9860: 76 61 6c 65 6e 74 20 6f 66 3a 0a 20 20 2a 2a 20  valent of:.  ** 
9870: 20 20 20 20 6c 69 6e 64 65 78 20 5b 24 64 62 20      lindex [$db 
9880: 65 76 61 6c 20 24 73 71 6c 5d 20 30 0a 20 20 2a  eval $sql] 0.  *
9890: 2f 0a 20 20 63 61 73 65 20 44 42 5f 4f 4e 45 43  /.  case DB_ONEC
98a0: 4f 4c 55 4d 4e 3a 0a 20 20 63 61 73 65 20 44 42  OLUMN:.  case DB
98b0: 5f 45 56 41 4c 3a 0a 20 20 63 61 73 65 20 44 42  _EVAL:.  case DB
98c0: 5f 45 58 49 53 54 53 3a 20 7b 0a 20 20 20 20 63  _EXISTS: {.    c
98d0: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 53 71 6c 3b  har const *zSql;
98e0: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 53 51        /* Next SQ
98f0: 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 65  L statement to e
9900: 78 65 63 75 74 65 20 2a 2f 0a 20 20 20 20 63 68  xecute */.    ch
9910: 61 72 20 63 6f 6e 73 74 20 2a 7a 4c 65 66 74 3b  ar const *zLeft;
9920: 20 20 20 20 20 2f 2a 20 57 68 61 74 20 69 73 20       /* What is 
9930: 6c 65 66 74 20 61 66 74 65 72 20 66 69 72 73 74  left after first
9940: 20 73 74 6d 74 20 69 6e 20 7a 53 71 6c 20 2a 2f   stmt in zSql */
9950: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
9960: 74 20 2a 70 53 74 6d 74 3b 20 20 20 2f 2a 20 43  t *pStmt;   /* C
9970: 6f 6d 70 69 6c 65 64 20 53 51 4c 20 73 74 61 74  ompiled SQL stat
9980: 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  ment */.    Tcl_
9990: 4f 62 6a 20 2a 70 41 72 72 61 79 3b 20 20 20 20  Obj *pArray;    
99a0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 72     /* Name of ar
99b0: 72 61 79 20 69 6e 74 6f 20 77 68 69 63 68 20 72  ray into which r
99c0: 65 73 75 6c 74 73 20 61 72 65 20 77 72 69 74 74  esults are writt
99d0: 65 6e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62  en */.    Tcl_Ob
99e0: 6a 20 2a 70 53 63 72 69 70 74 3b 20 20 20 20 20  j *pScript;     
99f0: 20 2f 2a 20 53 63 72 69 70 74 20 74 6f 20 72 75   /* Script to ru
9a00: 6e 20 66 6f 72 20 65 61 63 68 20 72 65 73 75 6c  n for each resul
9a10: 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 54 63 6c  t set */.    Tcl
9a20: 5f 4f 62 6a 20 2a 2a 61 70 50 61 72 6d 3b 20 20  _Obj **apParm;  
9a30: 20 20 20 20 2f 2a 20 50 61 72 61 6d 65 74 65 72      /* Parameter
9a40: 73 20 74 68 61 74 20 6e 65 65 64 20 61 20 54 63  s that need a Tc
9a50: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 29  l_DecrRefCount()
9a60: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 72   */.    int nPar
9a70: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  m;             /
9a80: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * Number of entr
9a90: 69 65 73 20 75 73 65 64 20 69 6e 20 61 70 50 61  ies used in apPa
9aa0: 72 6d 5b 5d 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  rm[] */.    Tcl_
9ab0: 4f 62 6a 20 2a 61 50 61 72 6d 5b 31 30 5d 3b 20  Obj *aParm[10]; 
9ac0: 20 20 20 2f 2a 20 53 74 61 74 69 63 20 73 70 61     /* Static spa
9ad0: 63 65 20 66 6f 72 20 61 70 50 61 72 6d 5b 5d 20  ce for apParm[] 
9ae0: 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  in the common ca
9af0: 73 65 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62  se */.    Tcl_Ob
9b00: 6a 20 2a 70 52 65 74 3b 20 20 20 20 20 20 20 20  j *pRet;        
9b10: 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 62 65 20   /* Value to be 
9b20: 72 65 74 75 72 6e 65 64 20 2a 2f 0a 20 20 20 20  returned */.    
9b30: 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20  SqlPreparedStmt 
9b40: 2a 70 50 72 65 53 74 6d 74 3b 20 20 2f 2a 20 50  *pPreStmt;  /* P
9b50: 6f 69 6e 74 65 72 20 74 6f 20 61 20 70 72 65 70  ointer to a prep
9b60: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a  ared statement *
9b70: 2f 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a  /.    int rc2;..
9b80: 20 20 20 20 69 66 28 20 63 68 6f 69 63 65 3d 3d      if( choice==
9b90: 44 42 5f 45 56 41 4c 20 29 7b 0a 20 20 20 20 20  DB_EVAL ){.     
9ba0: 20 69 66 28 20 6f 62 6a 63 3c 33 20 7c 7c 20 6f   if( objc<3 || o
9bb0: 62 6a 63 3e 35 20 29 7b 0a 20 20 20 20 20 20 20  bjc>5 ){.       
9bc0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
9bd0: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
9be0: 76 2c 20 22 53 51 4c 20 3f 41 52 52 41 59 2d 4e  v, "SQL ?ARRAY-N
9bf0: 41 4d 45 3f 20 3f 53 43 52 49 50 54 3f 22 29 3b  AME? ?SCRIPT?");
9c00: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
9c10: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
9c20: 20 7d 0a 20 20 20 20 20 20 70 52 65 74 20 3d 20   }.      pRet = 
9c30: 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20  Tcl_NewObj();.  
9c40: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
9c50: 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20  ount(pRet);.    
9c60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
9c70: 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
9c80: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
9c90: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
9ca0: 6f 62 6a 76 2c 20 22 53 51 4c 22 29 3b 0a 20 20  objv, "SQL");.  
9cb0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
9cc0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
9cd0: 20 20 20 20 20 20 69 66 28 20 63 68 6f 69 63 65        if( choice
9ce0: 3d 3d 44 42 5f 45 58 49 53 54 53 20 29 7b 0a 20  ==DB_EXISTS ){. 
9cf0: 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 54 63         pRet = Tc
9d00: 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28  l_NewBooleanObj(
9d10: 30 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  0);.        Tcl_
9d20: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 52 65  IncrRefCount(pRe
9d30: 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
9d40: 0a 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20  .        pRet = 
9d50: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
9d60: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33  .    if( objc==3
9d70: 20 29 7b 0a 20 20 20 20 20 20 70 41 72 72 61 79   ){.      pArray
9d80: 20 3d 20 70 53 63 72 69 70 74 20 3d 20 30 3b 0a   = pScript = 0;.
9d90: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62      }else if( ob
9da0: 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 70  jc==4 ){.      p
9db0: 41 72 72 61 79 20 3d 20 30 3b 0a 20 20 20 20 20  Array = 0;.     
9dc0: 20 70 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b   pScript = objv[
9dd0: 33 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  3];.    }else{. 
9de0: 20 20 20 20 20 70 41 72 72 61 79 20 3d 20 6f 62       pArray = ob
9df0: 6a 76 5b 33 5d 3b 0a 20 20 20 20 20 20 69 66 28  jv[3];.      if(
9e00: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 70   Tcl_GetString(p
9e10: 41 72 72 61 79 29 5b 30 5d 3d 3d 30 20 29 20 70  Array)[0]==0 ) p
9e20: 41 72 72 61 79 20 3d 20 30 3b 0a 20 20 20 20 20  Array = 0;.     
9e30: 20 70 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b   pScript = objv[
9e40: 34 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54  4];.    }..    T
9e50: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
9e60: 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 7a 53  objv[2]);.    zS
9e70: 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  ql = Tcl_GetStri
9e80: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
9e90: 5d 2c 20 30 29 3b 0a 20 20 20 20 77 68 69 6c 65  ], 0);.    while
9ea0: 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 26 26 20  ( rc==TCL_OK && 
9eb0: 7a 53 71 6c 5b 30 5d 20 29 7b 0a 20 20 20 20 20  zSql[0] ){.     
9ec0: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
9ed0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
9ee0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
9ef0: 20 20 20 20 20 69 6e 74 20 6e 56 61 72 3b 20 20       int nVar;  
9f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f10: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 69 6e  /* Number of bin
9f20: 64 20 70 61 72 61 6d 65 74 65 72 73 20 69 6e 20  d parameters in 
9f30: 74 68 65 20 70 53 74 6d 74 20 2a 2f 0a 20 20 20  the pStmt */.   
9f40: 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20     int nCol;    
9f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9f60: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
9f70: 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
9f80: 20 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 54 63   set */.      Tc
9f90: 6c 5f 4f 62 6a 20 2a 2a 61 70 43 6f 6c 4e 61 6d  l_Obj **apColNam
9fa0: 65 20 3d 20 30 3b 20 20 20 2f 2a 20 41 72 72 61  e = 0;   /* Arra
9fb0: 79 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  y of column name
9fc0: 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6c  s */.      int l
9fd0: 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  en;             
9fe0: 20 20 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20        /* String 
9ff0: 6c 65 6e 67 74 68 20 6f 66 20 7a 53 71 6c 20 2a  length of zSql *
a000: 2f 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 54 72  /.  .      /* Tr
a010: 79 20 74 6f 20 66 69 6e 64 20 61 20 53 51 4c 20  y to find a SQL 
a020: 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 68  statement that h
a030: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
a040: 63 6f 6d 70 69 6c 65 64 20 61 6e 64 0a 20 20 20  compiled and.   
a050: 20 20 20 2a 2a 20 77 68 69 63 68 20 6d 61 74 63     ** which matc
a060: 68 65 73 20 74 68 65 20 6e 65 78 74 20 73 65 71  hes the next seq
a070: 75 65 6e 63 65 20 6f 66 20 53 51 4c 2e 0a 20 20  uence of SQL..  
a080: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 53 74      */.      pSt
a090: 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  mt = 0;.      pP
a0a0: 72 65 53 74 6d 74 20 3d 20 70 44 62 2d 3e 73 74  reStmt = pDb->st
a0b0: 6d 74 4c 69 73 74 3b 0a 20 20 20 20 20 20 6c 65  mtList;.      le
a0c0: 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 53 71 6c 29  n = strlen(zSql)
a0d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65  ;.      if( pPre
a0e0: 53 74 6d 74 20 26 26 20 73 71 6c 69 74 65 33 5f  Stmt && sqlite3_
a0f0: 65 78 70 69 72 65 64 28 70 50 72 65 53 74 6d 74  expired(pPreStmt
a100: 2d 3e 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20  ->pStmt) ){.    
a110: 20 20 20 20 66 6c 75 73 68 53 74 6d 74 43 61 63      flushStmtCac
a120: 68 65 28 70 44 62 29 3b 0a 20 20 20 20 20 20 20  he(pDb);.       
a130: 20 70 50 72 65 53 74 6d 74 20 3d 20 30 3b 0a 20   pPreStmt = 0;. 
a140: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
a150: 28 3b 20 70 50 72 65 53 74 6d 74 3b 20 70 50 72  (; pPreStmt; pPr
a160: 65 53 74 6d 74 3d 70 50 72 65 53 74 6d 74 2d 3e  eStmt=pPreStmt->
a170: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
a180: 69 6e 74 20 6e 20 3d 20 70 50 72 65 53 74 6d 74  int n = pPreStmt
a190: 2d 3e 6e 53 71 6c 3b 0a 20 20 20 20 20 20 20 20  ->nSql;.        
a1a0: 69 66 28 20 6c 65 6e 3e 3d 6e 20 0a 20 20 20 20  if( len>=n .    
a1b0: 20 20 20 20 20 20 20 20 26 26 20 6d 65 6d 63 6d          && memcm
a1c0: 70 28 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c  p(pPreStmt->zSql
a1d0: 2c 20 7a 53 71 6c 2c 20 6e 29 3d 3d 30 0a 20 20  , zSql, n)==0.  
a1e0: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 7a 53            && (zS
a1f0: 71 6c 5b 6e 5d 3d 3d 30 20 7c 7c 20 7a 53 71 6c  ql[n]==0 || zSql
a200: 5b 6e 2d 31 5d 3d 3d 27 3b 27 29 0a 20 20 20 20  [n-1]==';').    
a210: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
a220: 20 70 53 74 6d 74 20 3d 20 70 50 72 65 53 74 6d   pStmt = pPreStm
a230: 74 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20 20 20  t->pStmt;.      
a240: 20 20 20 20 7a 4c 65 66 74 20 3d 20 26 7a 53 71      zLeft = &zSq
a250: 6c 5b 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c  l[pPreStmt->nSql
a260: 5d 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  ];..          /*
a270: 20 57 68 65 6e 20 61 20 70 72 65 70 61 72 65 64   When a prepared
a280: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 66 6f   statement is fo
a290: 75 6e 64 2c 20 75 6e 6c 69 6e 6b 20 69 74 20 66  und, unlink it f
a2a0: 72 6f 6d 20 74 68 65 0a 20 20 20 20 20 20 20 20  rom the.        
a2b0: 20 20 2a 2a 20 63 61 63 68 65 20 6c 69 73 74 2e    ** cache list.
a2c0: 20 20 49 74 20 77 69 6c 6c 20 6c 61 74 65 72 20    It will later 
a2d0: 62 65 20 61 64 64 65 64 20 62 61 63 6b 20 74 6f  be added back to
a2e0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20   the beginning. 
a2f0: 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74           ** of t
a300: 68 65 20 63 61 63 68 65 20 6c 69 73 74 20 69 6e  he cache list in
a310: 20 6f 72 64 65 72 20 74 6f 20 69 6d 70 6c 65 6d   order to implem
a320: 65 6e 74 20 4c 52 55 20 72 65 70 6c 61 63 65 6d  ent LRU replacem
a330: 65 6e 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ent..          *
a340: 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
a350: 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 20  pPreStmt->pPrev 
a360: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
a370: 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 2d 3e  PreStmt->pPrev->
a380: 70 4e 65 78 74 20 3d 20 70 50 72 65 53 74 6d 74  pNext = pPreStmt
a390: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
a3a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a3b0: 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c        pDb->stmtL
a3c0: 69 73 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e  ist = pPreStmt->
a3d0: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
a3e0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
a3f0: 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74   pPreStmt->pNext
a400: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
a410: 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 2d  pPreStmt->pNext-
a420: 3e 70 50 72 65 76 20 3d 20 70 50 72 65 53 74 6d  >pPrev = pPreStm
a430: 74 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20  t->pPrev;.      
a440: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a450: 20 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74         pDb->stmt
a460: 4c 61 73 74 20 3d 20 70 50 72 65 53 74 6d 74 2d  Last = pPreStmt-
a470: 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20 20 20  >pPrev;.        
a480: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 44    }.          pD
a490: 62 2d 3e 6e 53 74 6d 74 2d 2d 3b 0a 20 20 20 20  b->nStmt--;.    
a4a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a4b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
a4c0: 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f   .      /* If no
a4d0: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
a4e0: 65 6e 74 20 77 61 73 20 66 6f 75 6e 64 2e 20 20  ent was found.  
a4f0: 43 6f 6d 70 69 6c 65 20 74 68 65 20 53 51 4c 20  Compile the SQL 
a500: 74 65 78 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  text.      */.  
a510: 20 20 20 20 69 66 28 20 70 53 74 6d 74 3d 3d 30      if( pStmt==0
a520: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
a530: 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
a540: 65 33 5f 70 72 65 70 61 72 65 28 70 44 62 2d 3e  e3_prepare(pDb->
a550: 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
a560: 53 74 6d 74 2c 20 26 7a 4c 65 66 74 29 20 29 7b  Stmt, &zLeft) ){
a570: 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 53  .          Tcl_S
a580: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
a590: 72 70 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a 28  rp, dbTextToObj(
a5a0: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
a5b0: 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20 20  Db->db)));.     
a5c0: 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52       rc = TCL_ER
a5d0: 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ROR;.          b
a5e0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
a5f0: 20 20 20 20 20 20 20 20 69 66 28 20 70 53 74 6d          if( pStm
a600: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
a610: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
a620: 3d 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65  =sqlite3_errcode
a630: 28 70 44 62 2d 3e 64 62 29 20 29 7b 0a 20 20 20  (pDb->db) ){.   
a640: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f           /* A co
a650: 6d 70 69 6c 65 2d 74 69 6d 65 20 65 72 72 6f 72  mpile-time error
a660: 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
a670: 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f  t.            */
a680: 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c  .            Tcl
a690: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
a6a0: 74 65 72 70 2c 20 64 62 54 65 78 74 54 6f 4f 62  terp, dbTextToOb
a6b0: 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  j(sqlite3_errmsg
a6c0: 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20  (pDb->db)));.   
a6d0: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 43           rc = TC
a6e0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  L_ERROR;.       
a6f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a700: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a710: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
a720: 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 61 20  statement was a 
a730: 6e 6f 2d 6f 70 2e 20 20 43 6f 6e 74 69 6e 75 65  no-op.  Continue
a740: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 74 61   to the next sta
a750: 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 20 20 20  tement.         
a760: 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c     ** in the SQL
a770: 20 73 74 72 69 6e 67 2e 0a 20 20 20 20 20 20 20   string..       
a780: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
a790: 20 20 20 20 7a 53 71 6c 20 3d 20 7a 4c 65 66 74      zSql = zLeft
a7a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  ;.            co
a7b0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
a7c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
a7d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a7e0: 72 65 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20  reStmt==0 );.   
a7f0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 42     }..      /* B
a800: 69 6e 64 20 76 61 6c 75 65 73 20 74 6f 20 70 61  ind values to pa
a810: 72 61 6d 65 74 65 72 73 20 74 68 61 74 20 62 65  rameters that be
a820: 67 69 6e 20 77 69 74 68 20 24 20 6f 72 20 3a 0a  gin with $ or :.
a830: 20 20 20 20 20 20 2a 2f 20 20 0a 20 20 20 20 20        */  .     
a840: 20 6e 56 61 72 20 3d 20 73 71 6c 69 74 65 33 5f   nVar = sqlite3_
a850: 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63  bind_parameter_c
a860: 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20  ount(pStmt);.   
a870: 20 20 20 6e 50 61 72 6d 20 3d 20 30 3b 0a 20 20     nParm = 0;.  
a880: 20 20 20 20 69 66 28 20 6e 56 61 72 3e 73 69 7a      if( nVar>siz
a890: 65 6f 66 28 61 50 61 72 6d 29 2f 73 69 7a 65 6f  eof(aParm)/sizeo
a8a0: 66 28 61 50 61 72 6d 5b 30 5d 29 20 29 7b 0a 20  f(aParm[0]) ){. 
a8b0: 20 20 20 20 20 20 20 61 70 50 61 72 6d 20 3d 20         apParm = 
a8c0: 28 54 63 6c 5f 4f 62 6a 2a 2a 29 54 63 6c 5f 41  (Tcl_Obj**)Tcl_A
a8d0: 6c 6c 6f 63 28 6e 56 61 72 2a 73 69 7a 65 6f 66  lloc(nVar*sizeof
a8e0: 28 61 70 50 61 72 6d 5b 30 5d 29 29 3b 0a 20 20  (apParm[0]));.  
a8f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a900: 20 20 20 61 70 50 61 72 6d 20 3d 20 61 50 61 72     apParm = aPar
a910: 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  m;.      }.     
a920: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 56 61   for(i=1; i<=nVa
a930: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
a940: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61   const char *zVa
a950: 72 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  r = sqlite3_bind
a960: 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28  _parameter_name(
a970: 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20  pStmt, i);.     
a980: 20 20 20 69 66 28 20 7a 56 61 72 21 3d 30 20 26     if( zVar!=0 &
a990: 26 20 28 7a 56 61 72 5b 30 5d 3d 3d 27 24 27 20  & (zVar[0]=='$' 
a9a0: 7c 7c 20 7a 56 61 72 5b 30 5d 3d 3d 27 3a 27 29  || zVar[0]==':')
a9b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63   ){.          Tc
a9c0: 6c 5f 4f 62 6a 20 2a 70 56 61 72 20 3d 20 54 63  l_Obj *pVar = Tc
a9d0: 6c 5f 47 65 74 56 61 72 32 45 78 28 69 6e 74 65  l_GetVar2Ex(inte
a9e0: 72 70 2c 20 26 7a 56 61 72 5b 31 5d 2c 20 30 2c  rp, &zVar[1], 0,
a9f0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   0);.          i
aa00: 66 28 20 70 56 61 72 20 29 7b 0a 20 20 20 20 20  f( pVar ){.     
aa10: 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20         int n;.  
aa20: 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 64 61            u8 *da
aa30: 74 61 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ta;.            
aa40: 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 70 56  char *zType = pV
aa50: 61 72 2d 3e 74 79 70 65 50 74 72 20 3f 20 70 56  ar->typePtr ? pV
aa60: 61 72 2d 3e 74 79 70 65 50 74 72 2d 3e 6e 61 6d  ar->typePtr->nam
aa70: 65 20 3a 20 22 22 3b 0a 20 20 20 20 20 20 20 20  e : "";.        
aa80: 20 20 20 20 63 68 61 72 20 63 20 3d 20 7a 54 79      char c = zTy
aa90: 70 65 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 20  pe[0];.         
aaa0: 20 20 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26     if( c=='b' &&
aab0: 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 62   strcmp(zType,"b
aac0: 79 74 65 61 72 72 61 79 22 29 3d 3d 30 20 26 26  ytearray")==0 &&
aad0: 20 70 56 61 72 2d 3e 62 79 74 65 73 3d 3d 30 20   pVar->bytes==0 
aae0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
aaf0: 20 2f 2a 20 4f 6e 6c 79 20 6c 6f 61 64 20 61 20   /* Only load a 
ab00: 42 4c 4f 42 20 74 79 70 65 20 69 66 20 74 68 65  BLOB type if the
ab10: 20 54 63 6c 20 76 61 72 69 61 62 6c 65 20 69 73   Tcl variable is
ab20: 20 61 20 62 79 74 65 61 72 72 61 79 20 61 6e 64   a bytearray and
ab30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
ab40: 2a 20 68 61 73 20 6e 6f 20 73 74 72 69 6e 67 20  * has no string 
ab50: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20  representation. 
ab60: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
ab70: 20 64 61 74 61 20 3d 20 54 63 6c 5f 47 65 74 42   data = Tcl_GetB
ab80: 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28  yteArrayFromObj(
ab90: 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20  pVar, &n);.     
aba0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
abb0: 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d 74  _bind_blob(pStmt
abc0: 2c 20 69 2c 20 64 61 74 61 2c 20 6e 2c 20 53 51  , i, data, n, SQ
abd0: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
abe0: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
abf0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 56 61  IncrRefCount(pVa
ac00: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
ac10: 20 20 61 70 50 61 72 6d 5b 6e 50 61 72 6d 2b 2b    apParm[nParm++
ac20: 5d 20 3d 20 70 56 61 72 3b 0a 20 20 20 20 20 20  ] = pVar;.      
ac30: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
ac40: 28 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d  (c=='b' && strcm
ac50: 70 28 7a 54 79 70 65 2c 22 62 6f 6f 6c 65 61 6e  p(zType,"boolean
ac60: 22 29 3d 3d 30 29 20 7c 7c 0a 20 20 20 20 20 20  ")==0) ||.      
ac70: 20 20 20 20 20 20 20 20 20 20 20 20 28 63 3d 3d              (c==
ac80: 27 69 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54  'i' && strcmp(zT
ac90: 79 70 65 2c 22 69 6e 74 22 29 3d 3d 30 29 20 29  ype,"int")==0) )
aca0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
acb0: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
acc0: 6a 28 69 6e 74 65 72 70 2c 20 70 56 61 72 2c 20  j(interp, pVar, 
acd0: 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  &n);.           
ace0: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
acf0: 69 6e 74 28 70 53 74 6d 74 2c 20 69 2c 20 6e 29  int(pStmt, i, n)
ad00: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
ad10: 6c 73 65 20 69 66 28 20 63 3d 3d 27 64 27 20 26  lse if( c=='d' &
ad20: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
ad30: 64 6f 75 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20  double")==0 ){. 
ad40: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 6f 75               dou
ad50: 62 6c 65 20 72 3b 0a 20 20 20 20 20 20 20 20 20  ble r;.         
ad60: 20 20 20 20 20 54 63 6c 5f 47 65 74 44 6f 75 62       Tcl_GetDoub
ad70: 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  leFromObj(interp
ad80: 2c 20 70 56 61 72 2c 20 26 72 29 3b 0a 20 20 20  , pVar, &r);.   
ad90: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
ada0: 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28 70  e3_bind_double(p
adb0: 53 74 6d 74 2c 20 69 2c 20 72 29 3b 0a 20 20 20  Stmt, i, r);.   
adc0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
add0: 66 28 20 63 3d 3d 27 77 27 20 26 26 20 73 74 72  f( c=='w' && str
ade0: 63 6d 70 28 7a 54 79 70 65 2c 22 77 69 64 65 49  cmp(zType,"wideI
adf0: 6e 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nt")==0 ){.     
ae00: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 57 69 64           Tcl_Wid
ae10: 65 49 6e 74 20 76 3b 0a 20 20 20 20 20 20 20 20  eInt v;.        
ae20: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 57 69 64        Tcl_GetWid
ae30: 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  eIntFromObj(inte
ae40: 72 70 2c 20 70 56 61 72 2c 20 26 76 29 3b 0a 20  rp, pVar, &v);. 
ae50: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
ae60: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
ae70: 70 53 74 6d 74 2c 20 69 2c 20 76 29 3b 0a 20 20  pStmt, i, v);.  
ae80: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
ae90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  .              d
aea0: 61 74 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  ata = (unsigned 
aeb0: 63 68 61 72 20 2a 29 54 63 6c 5f 47 65 74 53 74  char *)Tcl_GetSt
aec0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 56 61 72  ringFromObj(pVar
aed0: 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  , &n);.         
aee0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
aef0: 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 2c  d_text(pStmt, i,
af00: 20 28 63 68 61 72 20 2a 29 64 61 74 61 2c 20 6e   (char *)data, n
af10: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
af20: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
af30: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
af40: 28 70 56 61 72 29 3b 0a 20 20 20 20 20 20 20 20  (pVar);.        
af50: 20 20 20 20 20 20 61 70 50 61 72 6d 5b 6e 50 61        apParm[nPa
af60: 72 6d 2b 2b 5d 20 3d 20 70 56 61 72 3b 0a 20 20  rm++] = pVar;.  
af70: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
af80: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
af90: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
afa0: 5f 62 69 6e 64 5f 6e 75 6c 6c 28 20 70 53 74 6d  _bind_null( pStm
afb0: 74 2c 20 69 20 29 3b 0a 20 20 20 20 20 20 20 20  t, i );.        
afc0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
afd0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
afe0: 43 6f 6d 70 75 74 65 20 63 6f 6c 75 6d 6e 20 6e  Compute column n
aff0: 61 6d 65 73 20 2a 2f 0a 20 20 20 20 20 20 6e 43  ames */.      nC
b000: 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ol = sqlite3_col
b010: 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29  umn_count(pStmt)
b020: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 63 72  ;.      if( pScr
b030: 69 70 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ipt ){.        a
b040: 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 54 63 6c 5f  pColName = (Tcl_
b050: 4f 62 6a 2a 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28  Obj**)Tcl_Alloc(
b060: 20 73 69 7a 65 6f 66 28 54 63 6c 5f 4f 62 6a 2a   sizeof(Tcl_Obj*
b070: 29 2a 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20  )*nCol );.      
b080: 20 20 69 66 28 20 61 70 43 6f 6c 4e 61 6d 65 3d    if( apColName=
b090: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
b0a0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
b0b0: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
b0c0: 20 20 20 20 20 61 70 43 6f 6c 4e 61 6d 65 5b 69       apColName[i
b0d0: 5d 20 3d 20 64 62 54 65 78 74 54 6f 4f 62 6a 28  ] = dbTextToObj(
b0e0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e  sqlite3_column_n
b0f0: 61 6d 65 28 70 53 74 6d 74 2c 69 29 29 3b 0a 20  ame(pStmt,i));. 
b100: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63           Tcl_Inc
b110: 72 52 65 66 43 6f 75 6e 74 28 61 70 43 6f 6c 4e  rRefCount(apColN
b120: 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  ame[i]);.       
b130: 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
b140: 20 20 2f 2a 20 49 66 20 72 65 73 75 6c 74 73 20    /* If results 
b150: 61 72 65 20 62 65 69 6e 67 20 73 74 6f 72 65 64  are being stored
b160: 20 69 6e 20 61 6e 20 61 72 72 61 79 20 76 61 72   in an array var
b170: 69 61 62 6c 65 2c 20 74 68 65 6e 20 63 72 65 61  iable, then crea
b180: 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  te.      ** the 
b190: 61 72 72 61 79 28 2a 29 20 65 6e 74 72 79 20 66  array(*) entry f
b1a0: 6f 72 20 74 68 61 74 20 61 72 72 61 79 0a 20 20  or that array.  
b1b0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
b1c0: 20 70 41 72 72 61 79 20 29 7b 0a 20 20 20 20 20   pArray ){.     
b1d0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f 6c     Tcl_Obj *pCol
b1e0: 4c 69 73 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62  List = Tcl_NewOb
b1f0: 6a 28 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c  j();.        Tcl
b200: 5f 4f 62 6a 20 2a 70 53 74 61 72 20 3d 20 54 63  _Obj *pStar = Tc
b210: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
b220: 2a 22 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20  *", -1);.       
b230: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
b240: 74 28 70 43 6f 6c 4c 69 73 74 29 3b 0a 20 20 20  t(pColList);.   
b250: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
b260: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
b270: 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62        Tcl_ListOb
b280: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
b290: 6e 74 65 72 70 2c 20 70 43 6f 6c 4c 69 73 74 2c  nterp, pColList,
b2a0: 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a   apColName[i]);.
b2b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b2c0: 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32    Tcl_ObjSetVar2
b2d0: 28 69 6e 74 65 72 70 2c 20 70 41 72 72 61 79 2c  (interp, pArray,
b2e0: 20 70 53 74 61 72 2c 20 70 43 6f 6c 4c 69 73 74   pStar, pColList
b2f0: 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c  ,0);.        Tcl
b300: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43  _DecrRefCount(pC
b310: 6f 6c 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20  olList);.       
b320: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
b330: 74 28 70 53 74 61 72 29 3b 0a 20 20 20 20 20 20  t(pStar);.      
b340: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45 78 65 63  }..      /* Exec
b350: 75 74 65 20 74 68 65 20 53 51 4c 0a 20 20 20 20  ute the SQL.    
b360: 20 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65    */.      while
b370: 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 26 26 20  ( rc==TCL_OK && 
b380: 70 53 74 6d 74 20 26 26 20 53 51 4c 49 54 45 5f  pStmt && SQLITE_
b390: 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
b3a0: 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20  p(pStmt) ){.    
b3b0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
b3c0: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
b3d0: 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56       Tcl_Obj *pV
b3e0: 61 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 0a 20  al;.          . 
b3f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
b400: 70 56 61 6c 20 74 6f 20 63 6f 6e 74 61 69 6e 20  pVal to contain 
b410: 74 68 65 20 69 27 74 68 20 63 6f 6c 75 6d 6e 20  the i'th column 
b420: 6f 66 20 74 68 69 73 20 72 6f 77 2e 20 2a 2f 0a  of this row. */.
b430: 20 20 20 20 20 20 20 20 20 20 73 77 69 74 63 68            switch
b440: 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  ( sqlite3_column
b450: 5f 74 79 70 65 28 70 53 74 6d 74 2c 20 69 29 20  _type(pStmt, i) 
b460: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
b470: 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a  ase SQLITE_BLOB:
b480: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
b490: 20 69 6e 74 20 62 79 74 65 73 20 3d 20 73 71 6c   int bytes = sql
b4a0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
b4b0: 73 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20  s(pStmt, i);.   
b4c0: 20 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20             pVal 
b4d0: 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72  = Tcl_NewByteArr
b4e0: 61 79 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f  ayObj(sqlite3_co
b4f0: 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c  lumn_blob(pStmt,
b500: 20 69 29 2c 20 62 79 74 65 73 29 3b 0a 20 20 20   i), bytes);.   
b510: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
b520: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
b530: 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65              case
b540: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a   SQLITE_INTEGER:
b550: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
b560: 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 76 20   sqlite_int64 v 
b570: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
b580: 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 69 29  _int64(pStmt, i)
b590: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
b5a0: 69 66 28 20 76 3e 3d 2d 32 31 34 37 34 38 33 36  if( v>=-21474836
b5b0: 34 37 20 26 26 20 76 3c 3d 32 31 34 37 34 38 33  47 && v<=2147483
b5c0: 36 34 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20  647 ){.         
b5d0: 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63         pVal = Tc
b5e0: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 76 29 3b 0a  l_NewIntObj(v);.
b5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65                }e
b600: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
b610: 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f       pVal = Tcl_
b620: 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 76 29  NewWideIntObj(v)
b630: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
b640: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
b650: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
b660: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
b670: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f   case SQLITE_FLO
b680: 41 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  AT: {.          
b690: 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 73      double r = s
b6a0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f  qlite3_column_do
b6b0: 75 62 6c 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a  uble(pStmt, i);.
b6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56                pV
b6d0: 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 44 6f 75 62  al = Tcl_NewDoub
b6e0: 6c 65 4f 62 6a 28 72 29 3b 0a 20 20 20 20 20 20  leObj(r);.      
b6f0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
b700: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
b710: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51           case SQ
b720: 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20  LITE_NULL: {.   
b730: 20 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20             pVal 
b740: 3d 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 70 44  = dbTextToObj(pD
b750: 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  b->zNull);.     
b760: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
b770: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
b780: 20 20 20 20 20 20 20 20 20 20 64 65 66 61 75 6c            defaul
b790: 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t: {.           
b7a0: 20 20 20 70 56 61 6c 20 3d 20 64 62 54 65 78 74     pVal = dbText
b7b0: 54 6f 4f 62 6a 28 28 63 68 61 72 20 2a 29 73 71  ToObj((char *)sq
b7c0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
b7d0: 74 28 70 53 74 6d 74 2c 20 69 29 29 3b 0a 20 20  t(pStmt, i));.  
b7e0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
b7f0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
b800: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 0a  .          }.  .
b810: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
b820: 63 72 69 70 74 20 29 7b 0a 20 20 20 20 20 20 20  cript ){.       
b830: 20 20 20 20 20 69 66 28 20 70 41 72 72 61 79 3d       if( pArray=
b840: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
b850: 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61      Tcl_ObjSetVa
b860: 72 32 28 69 6e 74 65 72 70 2c 20 61 70 43 6f 6c  r2(interp, apCol
b870: 4e 61 6d 65 5b 69 5d 2c 20 30 2c 20 70 56 61 6c  Name[i], 0, pVal
b880: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
b890: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
b8a0: 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65         Tcl_ObjSe
b8b0: 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 70 41  tVar2(interp, pA
b8c0: 72 72 61 79 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b  rray, apColName[
b8d0: 69 5d 2c 20 70 56 61 6c 2c 20 30 29 3b 0a 20 20  i], pVal, 0);.  
b8e0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
b8f0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
b900: 63 68 6f 69 63 65 3d 3d 44 42 5f 4f 4e 45 43 4f  choice==DB_ONECO
b910: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  LUMN ){.        
b920: 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 74      assert( pRet
b930: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
b940: 20 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 29     if( pRet==0 )
b950: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
b960: 70 52 65 74 20 3d 20 70 56 61 6c 3b 0a 20 20 20  pRet = pVal;.   
b970: 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49             Tcl_I
b980: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 52 65 74  ncrRefCount(pRet
b990: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
b9a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
b9b0: 3d 20 54 43 4c 5f 42 52 45 41 4b 3b 0a 20 20 20  = TCL_BREAK;.   
b9c0: 20 20 20 20 20 20 20 20 20 69 20 3d 20 6e 43 6f           i = nCo
b9d0: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  l;.          }el
b9e0: 73 65 20 69 66 28 20 63 68 6f 69 63 65 3d 3d 44  se if( choice==D
b9f0: 42 5f 45 58 49 53 54 53 20 29 7b 0a 20 20 20 20  B_EXISTS ){.    
ba00: 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72          Tcl_Decr
ba10: 52 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a  RefCount(pRet);.
ba20: 20 20 20 20 20 20 20 20 20 20 20 20 70 52 65 74              pRet
ba30: 20 3d 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61   = Tcl_NewBoolea
ba40: 6e 4f 62 6a 28 31 29 3b 0a 20 20 20 20 20 20 20  nObj(1);.       
ba50: 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66       Tcl_IncrRef
ba60: 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20  Count(pRet);.   
ba70: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 43           rc = TC
ba80: 4c 5f 42 52 45 41 4b 3b 0a 20 20 20 20 20 20 20  L_BREAK;.       
ba90: 20 20 20 20 20 69 20 3d 20 6e 43 6f 6c 3b 0a 20       i = nCol;. 
baa0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
bab0: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
bac0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
bad0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65  ment(interp, pRe
bae0: 74 2c 20 70 56 61 6c 29 3b 0a 20 20 20 20 20 20  t, pVal);.      
baf0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
bb00: 20 20 0a 20 20 20 20 20 20 20 20 69 66 28 20 70    .        if( p
bb10: 53 63 72 69 70 74 20 29 7b 0a 20 20 20 20 20 20  Script ){.      
bb20: 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61      rc = Tcl_Eva
bb30: 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 70  lObjEx(interp, p
bb40: 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20 20 20  Script, 0);.    
bb50: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43        if( rc==TC
bb60: 4c 5f 43 4f 4e 54 49 4e 55 45 20 29 7b 0a 20 20  L_CONTINUE ){.  
bb70: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 54            rc = T
bb80: 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  CL_OK;.         
bb90: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
bba0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
bbb0: 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20 29 7b 0a  c==TCL_BREAK ){.
bbc0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c          rc = TCL
bbd0: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  _OK;.      }..  
bbe0: 20 20 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20      /* Free the 
bbf0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6f 62 6a 65  column name obje
bc00: 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  cts */.      if(
bc10: 20 70 53 63 72 69 70 74 20 29 7b 0a 20 20 20 20   pScript ){.    
bc20: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
bc30: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
bc40: 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
bc50: 43 6f 75 6e 74 28 61 70 43 6f 6c 4e 61 6d 65 5b  Count(apColName[
bc60: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  i]);.        }. 
bc70: 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28         Tcl_Free(
bc80: 28 63 68 61 72 2a 29 61 70 43 6f 6c 4e 61 6d 65  (char*)apColName
bc90: 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
bca0: 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20 62 6f    /* Free the bo
bcb0: 75 6e 64 20 73 74 72 69 6e 67 20 61 6e 64 20 62  und string and b
bcc0: 6c 6f 62 20 70 61 72 61 6d 65 74 65 72 73 20 2a  lob parameters *
bcd0: 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  /.      for(i=0;
bce0: 20 69 3c 6e 50 61 72 6d 3b 20 69 2b 2b 29 7b 0a   i<nParm; i++){.
bcf0: 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72          Tcl_Decr
bd00: 52 65 66 43 6f 75 6e 74 28 61 70 50 61 72 6d 5b  RefCount(apParm[
bd10: 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
bd20: 20 20 20 69 66 28 20 61 70 50 61 72 6d 21 3d 61     if( apParm!=a
bd30: 50 61 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  Parm ){.        
bd40: 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29  Tcl_Free((char*)
bd50: 61 70 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d  apParm);.      }
bd60: 0a 0a 20 20 20 20 20 20 2f 2a 20 52 65 73 65 74  ..      /* Reset
bd70: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20   the statement. 
bd80: 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 20 63   If the result c
bd90: 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f 53 43  ode is SQLITE_SC
bda0: 48 45 4d 41 2c 20 74 68 65 6e 0a 20 20 20 20 20  HEMA, then.     
bdb0: 20 2a 2a 20 66 6c 75 73 68 20 74 68 65 20 73 74   ** flush the st
bdc0: 61 74 65 6d 65 6e 74 20 63 61 63 68 65 20 61 6e  atement cache an
bdd0: 64 20 74 72 79 20 74 68 65 20 73 74 61 74 65 6d  d try the statem
bde0: 65 6e 74 20 61 67 61 69 6e 2e 0a 20 20 20 20 20  ent again..     
bdf0: 20 2a 2f 0a 20 20 20 20 20 20 72 63 32 20 3d 20   */.      rc2 = 
be00: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
be10: 74 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tmt);.      if( 
be20: 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 3d 3d 72  SQLITE_SCHEMA==r
be30: 63 32 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  c2 ){.        /*
be40: 20 41 66 74 65 72 20 61 20 73 63 68 65 6d 61 20   After a schema 
be50: 63 68 61 6e 67 65 2c 20 66 6c 75 73 68 20 74 68  change, flush th
be60: 65 20 63 61 63 68 65 20 61 6e 64 20 74 72 79 20  e cache and try 
be70: 74 6f 20 72 75 6e 20 74 68 65 0a 20 20 20 20 20  to run the.     
be80: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
be90: 61 67 61 69 6e 0a 20 20 20 20 20 20 20 20 2a 2f  again.        */
bea0: 0a 20 20 20 20 20 20 20 20 66 6c 75 73 68 53 74  .        flushSt
beb0: 6d 74 43 61 63 68 65 28 20 70 44 62 20 29 3b 0a  mtCache( pDb );.
bec0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
bed0: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
bee0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72  .        if( pPr
bef0: 65 53 74 6d 74 20 29 20 54 63 6c 5f 46 72 65 65  eStmt ) Tcl_Free
bf00: 28 28 63 68 61 72 2a 29 70 50 72 65 53 74 6d 74  ((char*)pPreStmt
bf10: 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  );.        conti
bf20: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  nue;.      }else
bf30: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
bf40: 72 63 32 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  rc2 ){.        /
bf50: 2a 20 49 66 20 61 20 72 75 6e 2d 74 69 6d 65 20  * If a run-time 
bf60: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
bf70: 70 6f 72 74 20 74 68 65 20 65 72 72 6f 72 20 61  port the error a
bf80: 6e 64 20 73 74 6f 70 20 72 65 61 64 69 6e 67 0a  nd stop reading.
bf90: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53          ** the S
bfa0: 51 4c 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  QL.        */.  
bfb0: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a        Tcl_SetObj
bfc0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 64  Result(interp, d
bfd0: 62 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74  bTextToObj(sqlit
bfe0: 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64  e3_errmsg(pDb->d
bff0: 62 29 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71  b)));.        sq
c000: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
c010: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 72  Stmt);.        r
c020: 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  c = TCL_ERROR;. 
c030: 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65 53         if( pPreS
c040: 74 6d 74 20 29 20 54 63 6c 5f 46 72 65 65 28 28  tmt ) Tcl_Free((
c050: 63 68 61 72 2a 29 70 50 72 65 53 74 6d 74 29 3b  char*)pPreStmt);
c060: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
c070: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
c080: 70 44 62 2d 3e 6d 61 78 53 74 6d 74 3c 3d 30 20  pDb->maxStmt<=0 
c090: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
c0a0: 20 74 68 65 20 63 61 63 68 65 20 69 73 20 74 75   the cache is tu
c0b0: 72 6e 65 64 20 6f 66 66 2c 20 64 65 61 6c 6c 6f  rned off, deallo
c0c0: 63 61 74 65 64 20 74 68 65 20 73 74 61 74 65 6d  cated the statem
c0d0: 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ent */.        i
c0e0: 66 28 20 70 50 72 65 53 74 6d 74 20 29 20 54 63  f( pPreStmt ) Tc
c0f0: 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 50  l_Free((char*)pP
c100: 72 65 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20  reStmt);.       
c110: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
c120: 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  e(pStmt);.      
c130: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
c140: 2a 20 45 76 65 72 79 74 68 69 6e 67 20 77 6f 72  * Everything wor
c150: 6b 65 64 20 61 6e 64 20 74 68 65 20 63 61 63 68  ked and the cach
c160: 65 20 69 73 20 6f 70 65 72 61 74 69 6f 6e 61 6c  e is operational
c170: 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 43 72 65  ..        ** Cre
c180: 61 74 65 20 61 20 6e 65 77 20 53 71 6c 50 72 65  ate a new SqlPre
c190: 70 61 72 65 64 53 74 6d 74 20 73 74 72 75 63 74  paredStmt struct
c1a0: 75 72 65 20 69 66 20 77 65 20 6e 65 65 64 20 6f  ure if we need o
c1b0: 6e 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 28  ne..        ** (
c1c0: 49 66 20 77 65 20 61 6c 72 65 61 64 79 20 68 61  If we already ha
c1d0: 76 65 20 6f 6e 65 20 77 65 20 63 61 6e 20 6a 75  ve one we can ju
c1e0: 73 74 20 72 65 75 73 65 20 69 74 2e 29 0a 20 20  st reuse it.).  
c1f0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
c200: 20 69 66 28 20 70 50 72 65 53 74 6d 74 3d 3d 30   if( pPreStmt==0
c210: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 65   ){.          le
c220: 6e 20 3d 20 7a 4c 65 66 74 20 2d 20 7a 53 71 6c  n = zLeft - zSql
c230: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 72 65  ;.          pPre
c240: 53 74 6d 74 20 3d 20 28 53 71 6c 50 72 65 70 61  Stmt = (SqlPrepa
c250: 72 65 64 53 74 6d 74 2a 29 54 63 6c 5f 41 6c 6c  redStmt*)Tcl_All
c260: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 50 72 65  oc( sizeof(*pPre
c270: 53 74 6d 74 29 20 2b 20 6c 65 6e 20 29 3b 0a 20  Stmt) + len );. 
c280: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72           if( pPr
c290: 65 53 74 6d 74 3d 3d 30 20 29 20 72 65 74 75 72  eStmt==0 ) retur
c2a0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
c2b0: 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d         pPreStmt-
c2c0: 3e 70 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a  >pStmt = pStmt;.
c2d0: 20 20 20 20 20 20 20 20 20 20 70 50 72 65 53 74            pPreSt
c2e0: 6d 74 2d 3e 6e 53 71 6c 20 3d 20 6c 65 6e 3b 0a  mt->nSql = len;.
c2f0: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
c300: 28 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c  (pPreStmt->zSql,
c310: 20 7a 53 71 6c 2c 20 6c 65 6e 29 3b 0a 20 20 20   zSql, len);.   
c320: 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d         pPreStmt-
c330: 3e 7a 53 71 6c 5b 6c 65 6e 5d 20 3d 20 30 3b 0a  >zSql[len] = 0;.
c340: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
c350: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 70 72     /* Add the pr
c360: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
c370: 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   to the beginnin
c380: 67 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 6c  g of the cache l
c390: 69 73 74 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ist.        */. 
c3a0: 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d         pPreStmt-
c3b0: 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 73 74  >pNext = pDb->st
c3c0: 6d 74 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20  mtList;.        
c3d0: 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 20  pPreStmt->pPrev 
c3e0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = 0;.        if(
c3f0: 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 29   pDb->stmtList )
c400: 7b 0a 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e  {.         pDb->
c410: 73 74 6d 74 4c 69 73 74 2d 3e 70 50 72 65 76 20  stmtList->pPrev 
c420: 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20 20 20 20  = pPreStmt;.    
c430: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 44      }.        pD
c440: 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20 70 50  b->stmtList = pP
c450: 72 65 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20  reStmt;.        
c460: 69 66 28 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73  if( pDb->stmtLas
c470: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
c480: 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 6e    assert( pDb->n
c490: 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Stmt==0 );.     
c4a0: 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61       pDb->stmtLa
c4b0: 73 74 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20  st = pPreStmt;. 
c4c0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
c4d0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
c4e0: 70 44 62 2d 3e 6e 53 74 6d 74 3e 30 20 29 3b 0a  pDb->nStmt>0 );.
c4f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c500: 20 20 70 44 62 2d 3e 6e 53 74 6d 74 2b 2b 3b 0a    pDb->nStmt++;.
c510: 20 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 49     .        /* I
c520: 66 20 77 65 20 68 61 76 65 20 74 6f 6f 20 6d 61  f we have too ma
c530: 6e 79 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  ny statement in 
c540: 63 61 63 68 65 2c 20 72 65 6d 6f 76 65 20 74 68  cache, remove th
c550: 65 20 73 75 72 70 6c 75 73 20 66 72 6f 6d 20 74  e surplus from t
c560: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 6e  he.        ** en
c570: 64 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 6c  d of the cache l
c580: 69 73 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ist..        */.
c590: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
c5a0: 44 62 2d 3e 6e 53 74 6d 74 3e 70 44 62 2d 3e 6d  Db->nStmt>pDb->m
c5b0: 61 78 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20  axStmt ){.      
c5c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
c5d0: 6c 69 7a 65 28 70 44 62 2d 3e 73 74 6d 74 4c 61  lize(pDb->stmtLa
c5e0: 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20  st->pStmt);.    
c5f0: 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c        pDb->stmtL
c600: 61 73 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c  ast = pDb->stmtL
c610: 61 73 74 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20  ast->pPrev;.    
c620: 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28        Tcl_Free((
c630: 63 68 61 72 2a 29 70 44 62 2d 3e 73 74 6d 74 4c  char*)pDb->stmtL
c640: 61 73 74 2d 3e 70 4e 65 78 74 29 3b 0a 20 20 20  ast->pNext);.   
c650: 20 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74         pDb->stmt
c660: 4c 61 73 74 2d 3e 70 4e 65 78 74 20 3d 20 30 3b  Last->pNext = 0;
c670: 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e  .          pDb->
c680: 6e 53 74 6d 74 2d 2d 3b 0a 20 20 20 20 20 20 20  nStmt--;.       
c690: 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
c6a0: 20 20 2f 2a 20 50 72 6f 63 65 65 64 20 74 6f 20    /* Proceed to 
c6b0: 74 68 65 20 6e 65 78 74 20 73 74 61 74 65 6d 65  the next stateme
c6c0: 6e 74 20 2a 2f 0a 20 20 20 20 20 20 7a 53 71 6c  nt */.      zSql
c6d0: 20 3d 20 7a 4c 65 66 74 3b 0a 20 20 20 20 7d 0a   = zLeft;.    }.
c6e0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
c6f0: 6f 75 6e 74 28 6f 62 6a 76 5b 32 5d 29 3b 0a 0a  ount(objv[2]);..
c700: 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a      if( pRet ){.
c710: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43        if( rc==TC
c720: 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  L_OK ){.        
c730: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
c740: 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a  (interp, pRet);.
c750: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 63        }.      Tc
c760: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
c770: 52 65 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Ret);.    }else 
c780: 69 66 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29  if( rc==TCL_OK )
c790: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 52 65 73 65  {.      Tcl_Rese
c7a0: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  tResult(interp);
c7b0: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
c7c0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
c7d0: 20 20 20 20 20 24 64 62 20 66 75 6e 63 74 69 6f       $db functio
c7e0: 6e 20 4e 41 4d 45 20 53 43 52 49 50 54 0a 20 20  n NAME SCRIPT.  
c7f0: 2a 2a 0a 20 20 2a 2a 20 43 72 65 61 74 65 20 61  **.  ** Create a
c800: 20 6e 65 77 20 53 51 4c 20 66 75 6e 63 74 69 6f   new SQL functio
c810: 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20  n called NAME.  
c820: 57 68 65 6e 65 76 65 72 20 74 68 61 74 20 66 75  Whenever that fu
c830: 6e 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63  nction is.  ** c
c840: 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53 43  alled, invoke SC
c850: 52 49 50 54 20 74 6f 20 65 76 61 6c 75 61 74 65  RIPT to evaluate
c860: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20   the function.. 
c870: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 46 55   */.  case DB_FU
c880: 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 53 71  NCTION: {.    Sq
c890: 6c 46 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20  lFunc *pFunc;.  
c8a0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69    Tcl_Obj *pScri
c8b0: 70 74 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e  pt;.    char *zN
c8c0: 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a  ame;.    if( obj
c8d0: 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=4 ){.      Tc
c8e0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
c8f0: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
c900: 22 4e 41 4d 45 20 53 43 52 49 50 54 22 29 3b 0a  "NAME SCRIPT");.
c910: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
c920: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
c930: 20 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65    zName = Tcl_Ge
c940: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
c950: 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20  bjv[2], 0);.    
c960: 70 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 33  pScript = objv[3
c970: 5d 3b 0a 20 20 20 20 70 46 75 6e 63 20 3d 20 66  ];.    pFunc = f
c980: 69 6e 64 53 71 6c 46 75 6e 63 28 70 44 62 2c 20  indSqlFunc(pDb, 
c990: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  zName);.    if( 
c9a0: 70 46 75 6e 63 3d 3d 30 20 29 20 72 65 74 75 72  pFunc==0 ) retur
c9b0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
c9c0: 20 69 66 28 20 70 46 75 6e 63 2d 3e 70 53 63 72   if( pFunc->pScr
c9d0: 69 70 74 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  ipt ){.      Tcl
c9e0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 46  _DecrRefCount(pF
c9f0: 75 6e 63 2d 3e 70 53 63 72 69 70 74 29 3b 0a 20  unc->pScript);. 
ca00: 20 20 20 7d 0a 20 20 20 20 70 46 75 6e 63 2d 3e     }.    pFunc->
ca10: 70 53 63 72 69 70 74 20 3d 20 70 53 63 72 69 70  pScript = pScrip
ca20: 74 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  t;.    Tcl_IncrR
ca30: 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29  efCount(pScript)
ca40: 3b 0a 20 20 20 20 70 46 75 6e 63 2d 3e 75 73 65  ;.    pFunc->use
ca50: 45 76 61 6c 4f 62 6a 76 20 3d 20 73 61 66 65 54  EvalObjv = safeT
ca60: 6f 55 73 65 45 76 61 6c 4f 62 6a 76 28 69 6e 74  oUseEvalObjv(int
ca70: 65 72 70 2c 20 70 53 63 72 69 70 74 29 3b 0a 20  erp, pScript);. 
ca80: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
ca90: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
caa0: 70 44 62 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20  pDb->db, zName, 
cab0: 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  -1, SQLITE_UTF8,
cac0: 0a 20 20 20 20 20 20 20 20 70 46 75 6e 63 2c 20  .        pFunc, 
cad0: 74 63 6c 53 71 6c 46 75 6e 63 2c 20 30 2c 20 30  tclSqlFunc, 0, 0
cae0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
caf0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
cb00: 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52    rc = TCL_ERROR
cb10: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52  ;.      Tcl_SetR
cb20: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
cb30: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72  har *)sqlite3_er
cb40: 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 54  rmsg(pDb->db), T
cb50: 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20  CL_VOLATILE);.  
cb60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
cb70: 2a 20 4d 75 73 74 20 66 6c 75 73 68 20 61 6e 79  * Must flush any
cb80: 20 63 61 63 68 65 64 20 73 74 61 74 65 6d 65 6e   cached statemen
cb90: 74 73 20 2a 2f 0a 20 20 20 20 20 20 66 6c 75 73  ts */.      flus
cba0: 68 53 74 6d 74 43 61 63 68 65 28 20 70 44 62 20  hStmtCache( pDb 
cbb0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  );.    }.    bre
cbc0: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
cbd0: 2a 2a 20 20 20 20 20 24 64 62 20 69 6e 74 65 72  **     $db inter
cbe0: 72 75 70 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  rupt.  **.  ** I
cbf0: 6e 74 65 72 72 75 70 74 20 74 68 65 20 65 78 65  nterrupt the exe
cc00: 63 75 74 69 6f 6e 20 6f 66 20 74 68 65 20 69 6e  cution of the in
cc10: 6e 65 72 2d 6d 6f 73 74 20 53 51 4c 20 69 6e 74  ner-most SQL int
cc20: 65 72 70 72 65 74 65 72 2e 20 20 54 68 69 73 0a  erpreter.  This.
cc30: 20 20 2a 2a 20 63 61 75 73 65 73 20 74 68 65 20    ** causes the 
cc40: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  SQL statement to
cc50: 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
cc60: 20 6f 66 20 53 51 4c 49 54 45 5f 49 4e 54 45 52   of SQLITE_INTER
cc70: 52 55 50 54 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  RUPT..  */.  cas
cc80: 65 20 44 42 5f 49 4e 54 45 52 52 55 50 54 3a 20  e DB_INTERRUPT: 
cc90: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  {.    sqlite3_in
cca0: 74 65 72 72 75 70 74 28 70 44 62 2d 3e 64 62 29  terrupt(pDb->db)
ccb0: 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
ccc0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  /*.  **     
ccd0: 24 64 62 20 6e 75 6c 6c 76 61 6c 75 65 20 3f 53  $db nullvalue ?S
cce0: 54 52 49 4e 47 3f 0a 20 20 2a 2a 0a 20 20 2a 2a  TRING?.  **.  **
ccf0: 20 43 68 61 6e 67 65 20 74 65 78 74 20 75 73 65   Change text use
cd00: 64 20 77 68 65 6e 20 61 20 4e 55 4c 4c 20 63 6f  d when a NULL co
cd10: 6d 65 73 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  mes back from th
cd20: 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 3f  e database. If ?
cd30: 53 54 52 49 4e 47 3f 0a 20 20 2a 2a 20 69 73 20  STRING?.  ** is 
cd40: 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 74 68 65  not present, the
cd50: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  n the current st
cd60: 72 69 6e 67 20 75 73 65 64 20 66 6f 72 20 4e 55  ring used for NU
cd70: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  LL is returned..
cd80: 20 20 2a 2a 20 49 66 20 53 54 52 49 4e 47 20 69    ** If STRING i
cd90: 73 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20  s present, then 
cda0: 53 54 52 49 4e 47 20 69 73 20 72 65 74 75 72 6e  STRING is return
cdb0: 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2f 0a 20 20  ed..  **.  */.  
cdc0: 63 61 73 65 20 44 42 5f 4e 55 4c 4c 56 41 4c 55  case DB_NULLVALU
cdd0: 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a  E: {.    if( obj
cde0: 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33 20  c!=2 && objc!=3 
cdf0: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
ce00: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
ce10: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 55 4c 4c  , 2, objv, "NULL
ce20: 56 41 4c 55 45 22 29 3b 0a 20 20 20 20 20 20 72  VALUE");.      r
ce30: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
ce40: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f  .    }.    if( o
ce50: 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc==3 ){.      
ce60: 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 63  int len;.      c
ce70: 68 61 72 20 2a 7a 4e 75 6c 6c 20 3d 20 54 63 6c  har *zNull = Tcl
ce80: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
ce90: 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29  j(objv[2], &len)
cea0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ;.      if( pDb-
ceb0: 3e 7a 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  >zNull ){.      
cec0: 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e    Tcl_Free(pDb->
ced0: 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a  zNull);.      }.
cee0: 20 20 20 20 20 20 69 66 28 20 7a 4e 75 6c 6c 20        if( zNull 
cef0: 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20  && len>0 ){.    
cf00: 20 20 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 3d      pDb->zNull =
cf10: 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20   Tcl_Alloc( len 
cf20: 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 73  + 1 );.        s
cf30: 74 72 6e 63 70 79 28 70 44 62 2d 3e 7a 4e 75 6c  trncpy(pDb->zNul
cf40: 6c 2c 20 7a 4e 75 6c 6c 2c 20 6c 65 6e 29 3b 0a  l, zNull, len);.
cf50: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75          pDb->zNu
cf60: 6c 6c 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a  ll[len] = '\0';.
cf70: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
cf80: 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20       pDb->zNull 
cf90: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
cfa0: 20 7d 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62   }.    Tcl_SetOb
cfb0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
cfc0: 64 62 54 65 78 74 54 6f 4f 62 6a 28 70 44 62 2d  dbTextToObj(pDb-
cfd0: 3e 7a 4e 75 6c 6c 29 29 3b 0a 20 20 20 20 62 72  >zNull));.    br
cfe0: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
cff0: 20 2a 2a 20 20 20 20 20 24 64 62 20 6c 61 73 74   **     $db last
d000: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 20 0a 20  _insert_rowid . 
d010: 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
d020: 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
d030: 20 69 73 20 74 68 65 20 52 4f 57 49 44 20 66 6f   is the ROWID fo
d040: 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  r the most recen
d050: 74 20 69 6e 73 65 72 74 2e 0a 20 20 2a 2f 0a 20  t insert..  */. 
d060: 20 63 61 73 65 20 44 42 5f 4c 41 53 54 5f 49 4e   case DB_LAST_IN
d070: 53 45 52 54 5f 52 4f 57 49 44 3a 20 7b 0a 20 20  SERT_ROWID: {.  
d080: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75    Tcl_Obj *pResu
d090: 6c 74 3b 0a 20 20 20 20 54 63 6c 5f 57 69 64 65  lt;.    Tcl_Wide
d0a0: 49 6e 74 20 72 6f 77 69 64 3b 0a 20 20 20 20 69  Int rowid;.    i
d0b0: 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
d0c0: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
d0d0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
d0e0: 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 20  objv, "");.     
d0f0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
d100: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 6f 77  R;.    }.    row
d110: 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 6c 61 73  id = sqlite3_las
d120: 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 70  t_insert_rowid(p
d130: 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20 70 52 65  Db->db);.    pRe
d140: 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62  sult = Tcl_GetOb
d150: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  jResult(interp);
d160: 0a 20 20 20 20 54 63 6c 5f 53 65 74 57 69 64 65  .    Tcl_SetWide
d170: 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20  IntObj(pResult, 
d180: 72 6f 77 69 64 29 3b 0a 20 20 20 20 62 72 65 61  rowid);.    brea
d190: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
d1a0: 2a 20 54 68 65 20 44 42 5f 4f 4e 45 43 4f 4c 55  * The DB_ONECOLU
d1b0: 4d 4e 20 6d 65 74 68 6f 64 20 69 73 20 69 6d 70  MN method is imp
d1c0: 6c 65 6d 65 6e 74 65 64 20 74 6f 67 65 74 68 65  lemented togethe
d1d0: 72 20 77 69 74 68 20 44 42 5f 45 56 41 4c 2e 0a  r with DB_EVAL..
d1e0: 20 20 2a 2f 0a 0a 20 20 2f 2a 20 20 20 20 24 64    */..  /*    $d
d1f0: 62 20 70 72 6f 67 72 65 73 73 20 3f 4e 20 43 41  b progress ?N CA
d200: 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 20 0a 20 20  LLBACK?.  ** .  
d210: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69  ** Invoke the gi
d220: 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 65 76 65  ven callback eve
d230: 72 79 20 4e 20 76 69 72 74 75 61 6c 20 6d 61 63  ry N virtual mac
d240: 68 69 6e 65 20 6f 70 63 6f 64 65 73 20 77 68 69  hine opcodes whi
d250: 6c 65 20 65 78 65 63 75 74 69 6e 67 0a 20 20 2a  le executing.  *
d260: 2a 20 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a  * queries..  */.
d270: 20 20 63 61 73 65 20 44 42 5f 50 52 4f 47 52 45    case DB_PROGRE
d280: 53 53 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62  SS: {.    if( ob
d290: 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69  jc==2 ){.      i
d2a0: 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73  f( pDb->zProgres
d2b0: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  s ){.        Tcl
d2c0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
d2d0: 74 65 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f 67  terp, pDb->zProg
d2e0: 72 65 73 73 2c 20 30 29 3b 0a 20 20 20 20 20 20  ress, 0);.      
d2f0: 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
d300: 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20  objc==4 ){.     
d310: 20 63 68 61 72 20 2a 7a 50 72 6f 67 72 65 73 73   char *zProgress
d320: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b  ;.      int len;
d330: 0a 20 20 20 20 20 20 69 6e 74 20 4e 3b 0a 20 20  .      int N;.  
d340: 20 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d      if( TCL_OK!=
d350: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
d360: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
d370: 5d 2c 20 26 4e 29 20 29 7b 0a 09 72 65 74 75 72  ], &N) ){..retur
d380: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
d390: 20 20 20 7d 3b 0a 20 20 20 20 20 20 69 66 28 20     };.      if( 
d3a0: 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29  pDb->zProgress )
d3b0: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72  {.        Tcl_Fr
d3c0: 65 65 28 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73  ee(pDb->zProgres
d3d0: 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  s);.      }.    
d3e0: 20 20 7a 50 72 6f 67 72 65 73 73 20 3d 20 54 63    zProgress = Tc
d3f0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
d400: 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6c 65 6e  bj(objv[3], &len
d410: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 72  );.      if( zPr
d420: 6f 67 72 65 73 73 20 26 26 20 6c 65 6e 3e 30 20  ogress && len>0 
d430: 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
d440: 7a 50 72 6f 67 72 65 73 73 20 3d 20 54 63 6c 5f  zProgress = Tcl_
d450: 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29  Alloc( len + 1 )
d460: 3b 0a 20 20 20 20 20 20 20 20 73 74 72 63 70 79  ;.        strcpy
d470: 28 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 2c  (pDb->zProgress,
d480: 20 7a 50 72 6f 67 72 65 73 73 29 3b 0a 20 20 20   zProgress);.   
d490: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d4a0: 20 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73    pDb->zProgress
d4b0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69   = 0;.      }.#i
d4c0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
d4d0: 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42  T_PROGRESS_CALLB
d4e0: 41 43 4b 0a 20 20 20 20 20 20 69 66 28 20 70 44  ACK.      if( pD
d4f0: 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a  b->zProgress ){.
d500: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74          pDb->int
d510: 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20  erp = interp;.  
d520: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72        sqlite3_pr
d530: 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 70  ogress_handler(p
d540: 44 62 2d 3e 64 62 2c 20 4e 2c 20 44 62 50 72 6f  Db->db, N, DbPro
d550: 67 72 65 73 73 48 61 6e 64 6c 65 72 2c 20 70 44  gressHandler, pD
d560: 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  b);.      }else{
d570: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d580: 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65  _progress_handle
d590: 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 2c  r(pDb->db, 0, 0,
d5a0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
d5b0: 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
d5c0: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
d5d0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
d5e0: 20 6f 62 6a 76 2c 20 22 4e 20 43 41 4c 4c 42 41   objv, "N CALLBA
d5f0: 43 4b 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  CK");.      retu
d600: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
d610: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
d620: 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20   }..  /*    $db 
d630: 70 72 6f 66 69 6c 65 20 3f 43 41 4c 4c 42 41 43  profile ?CALLBAC
d640: 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b  K?.  **.  ** Mak
d650: 65 20 61 72 72 61 6e 67 65 6d 65 6e 74 73 20 74  e arrangements t
d660: 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 43 41 4c  o invoke the CAL
d670: 4c 42 41 43 4b 20 72 6f 75 74 69 6e 65 20 61 66  LBACK routine af
d680: 74 65 72 20 65 61 63 68 20 53 51 4c 20 73 74 61  ter each SQL sta
d690: 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 61 74  tement.  ** that
d6a0: 20 68 61 73 20 72 75 6e 2e 20 20 54 68 65 20 74   has run.  The t
d6b0: 65 78 74 20 6f 66 20 74 68 65 20 53 51 4c 20 61  ext of the SQL a
d6c0: 6e 64 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  nd the amount of
d6d0: 20 65 6c 61 70 73 65 20 74 69 6d 65 20 61 72 65   elapse time are
d6e0: 0a 20 20 2a 2a 20 61 70 70 65 6e 64 65 64 20 74  .  ** appended t
d6f0: 6f 20 43 41 4c 4c 42 41 43 4b 20 62 65 66 6f 72  o CALLBACK befor
d700: 65 20 74 68 65 20 73 63 72 69 70 74 20 69 73 20  e the script is 
d710: 72 75 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  run..  */.  case
d720: 20 44 42 5f 50 52 4f 46 49 4c 45 3a 20 7b 0a 20   DB_PROFILE: {. 
d730: 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b     if( objc>3 ){
d740: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
d750: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
d760: 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42  2, objv, "?CALLB
d770: 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65  ACK?");.      re
d780: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
d790: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62      }else if( ob
d7a0: 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69  jc==2 ){.      i
d7b0: 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65  f( pDb->zProfile
d7c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
d7d0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
d7e0: 65 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f 66 69  erp, pDb->zProfi
d7f0: 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  le, 0);.      }.
d800: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d810: 20 63 68 61 72 20 2a 7a 50 72 6f 66 69 6c 65 3b   char *zProfile;
d820: 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  .      int len;.
d830: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
d840: 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 20  Profile ){.     
d850: 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d     Tcl_Free(pDb-
d860: 3e 7a 50 72 6f 66 69 6c 65 29 3b 0a 20 20 20 20  >zProfile);.    
d870: 20 20 7d 0a 20 20 20 20 20 20 7a 50 72 6f 66 69    }.      zProfi
d880: 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  le = Tcl_GetStri
d890: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
d8a0: 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20  ], &len);.      
d8b0: 69 66 28 20 7a 50 72 6f 66 69 6c 65 20 26 26 20  if( zProfile && 
d8c0: 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  len>0 ){.       
d8d0: 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 3d   pDb->zProfile =
d8e0: 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20   Tcl_Alloc( len 
d8f0: 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 73  + 1 );.        s
d900: 74 72 63 70 79 28 70 44 62 2d 3e 7a 50 72 6f 66  trcpy(pDb->zProf
d910: 69 6c 65 2c 20 7a 50 72 6f 66 69 6c 65 29 3b 0a  ile, zProfile);.
d920: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d930: 20 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f 66 69       pDb->zProfi
d940: 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  le = 0;.      }.
d950: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d960: 4d 49 54 5f 54 52 41 43 45 0a 20 20 20 20 20 20  MIT_TRACE.      
d970: 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c  if( pDb->zProfil
d980: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  e ){.        pDb
d990: 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  ->interp = inter
d9a0: 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  p;.        sqlit
d9b0: 65 33 5f 70 72 6f 66 69 6c 65 28 70 44 62 2d 3e  e3_profile(pDb->
d9c0: 64 62 2c 20 44 62 50 72 6f 66 69 6c 65 48 61 6e  db, DbProfileHan
d9d0: 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20  dler, pDb);.    
d9e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
d9f0: 20 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65   sqlite3_profile
da00: 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b  (pDb->db, 0, 0);
da10: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
da20: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
da30: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
da40: 20 20 20 20 24 64 62 20 72 65 6b 65 79 20 4b 45      $db rekey KE
da50: 59 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 68 61 6e  Y.  **.  ** Chan
da60: 67 65 20 74 68 65 20 65 6e 63 72 79 70 74 69 6f  ge the encryptio
da70: 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 63 75 72  n key on the cur
da80: 72 65 6e 74 6c 79 20 6f 70 65 6e 20 64 61 74 61  rently open data
da90: 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  base..  */.  cas
daa0: 65 20 44 42 5f 52 45 4b 45 59 3a 20 7b 0a 20 20  e DB_REKEY: {.  
dab0: 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20    int nKey;.    
dac0: 76 6f 69 64 20 2a 70 4b 65 79 3b 0a 20 20 20 20  void *pKey;.    
dad0: 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
dae0: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
daf0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
db00: 20 6f 62 6a 76 2c 20 22 4b 45 59 22 29 3b 0a 20   objv, "KEY");. 
db10: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
db20: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
db30: 20 70 4b 65 79 20 3d 20 54 63 6c 5f 47 65 74 42   pKey = Tcl_GetB
db40: 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28  yteArrayFromObj(
db50: 6f 62 6a 76 5b 32 5d 2c 20 26 6e 4b 65 79 29 3b  objv[2], &nKey);
db60: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
db70: 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 72 63 20  AS_CODEC.    rc 
db80: 3d 20 73 71 6c 69 74 65 33 5f 72 65 6b 65 79 28  = sqlite3_rekey(
db90: 70 44 62 2d 3e 64 62 2c 20 70 4b 65 79 2c 20 6e  pDb->db, pKey, n
dba0: 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Key);.    if( rc
dbb0: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
dbc0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
dbd0: 70 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  p, sqlite3ErrStr
dbe0: 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  (rc), 0);.      
dbf0: 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  rc = TCL_ERROR;.
dc00: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
dc10: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
dc20: 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 74  *.  **     $db t
dc30: 69 6d 65 6f 75 74 20 4d 49 4c 4c 45 53 45 43 4f  imeout MILLESECO
dc40: 4e 44 53 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 65  NDS.  **.  ** De
dc50: 6c 61 79 20 66 6f 72 20 74 68 65 20 6e 75 6d 62  lay for the numb
dc60: 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e  er of millisecon
dc70: 64 73 20 73 70 65 63 69 66 69 65 64 20 77 68 65  ds specified whe
dc80: 6e 20 61 20 66 69 6c 65 20 69 73 20 6c 6f 63 6b  n a file is lock
dc90: 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ed..  */.  case 
dca0: 44 42 5f 54 49 4d 45 4f 55 54 3a 20 7b 0a 20 20  DB_TIMEOUT: {.  
dcb0: 20 20 69 6e 74 20 6d 73 3b 0a 20 20 20 20 69 66    int ms;.    if
dcc0: 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
dcd0: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
dce0: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
dcf0: 62 6a 76 2c 20 22 4d 49 4c 4c 49 53 45 43 4f 4e  bjv, "MILLISECON
dd00: 44 53 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  DS");.      retu
dd10: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
dd20: 20 20 7d 0a 20 20 20 20 69 66 28 20 54 63 6c 5f    }.    if( Tcl_
dd30: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
dd40: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
dd50: 6d 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ms) ) return TCL
dd60: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69  _ERROR;.    sqli
dd70: 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74  te3_busy_timeout
dd80: 28 70 44 62 2d 3e 64 62 2c 20 6d 73 29 3b 0a 20  (pDb->db, ms);. 
dd90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20     break;.  }.  
dda0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24  .  /*.  **     $
ddb0: 64 62 20 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73  db total_changes
ddc0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72  .  **.  ** Retur
ddd0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
dde0: 72 6f 77 73 20 74 68 61 74 20 77 65 72 65 20 6d  rows that were m
ddf0: 6f 64 69 66 69 65 64 2c 20 69 6e 73 65 72 74 65  odified, inserte
de00: 64 2c 20 6f 72 20 64 65 6c 65 74 65 64 20 0a 20  d, or deleted . 
de10: 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 20 64 61   ** since the da
de20: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 77 61  tabase handle wa
de30: 73 20 63 72 65 61 74 65 64 2e 0a 20 20 2a 2f 0a  s created..  */.
de40: 20 20 63 61 73 65 20 44 42 5f 54 4f 54 41 4c 5f    case DB_TOTAL_
de50: 43 48 41 4e 47 45 53 3a 20 7b 0a 20 20 20 20 54  CHANGES: {.    T
de60: 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b  cl_Obj *pResult;
de70: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  .    if( objc!=2
de80: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
de90: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
dea0: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22 29 3b  p, 2, objv, "");
deb0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
dec0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
ded0: 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c     pResult = Tcl
dee0: 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _GetObjResult(in
def0: 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53  terp);.    Tcl_S
df00: 65 74 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74  etIntObj(pResult
df10: 2c 20 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f  , sqlite3_total_
df20: 63 68 61 6e 67 65 73 28 70 44 62 2d 3e 64 62 29  changes(pDb->db)
df30: 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
df40: 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 74  }..  /*    $db t
df50: 72 61 63 65 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a  race ?CALLBACK?.
df60: 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 61    **.  ** Make a
df70: 72 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20 69  rrangements to i
df80: 6e 76 6f 6b 65 20 74 68 65 20 43 41 4c 4c 42 41  nvoke the CALLBA
df90: 43 4b 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 65  CK routine for e
dfa0: 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ach SQL statemen
dfb0: 74 0a 20 20 2a 2a 20 74 68 61 74 20 69 73 20 65  t.  ** that is e
dfc0: 78 65 63 75 74 65 64 2e 20 20 54 68 65 20 74 65  xecuted.  The te
dfd0: 78 74 20 6f 66 20 74 68 65 20 53 51 4c 20 69 73  xt of the SQL is
dfe0: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 43 41 4c   appended to CAL
dff0: 4c 42 41 43 4b 20 62 65 66 6f 72 65 0a 20 20 2a  LBACK before.  *
e000: 2a 20 69 74 20 69 73 20 65 78 65 63 75 74 65 64  * it is executed
e010: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
e020: 5f 54 52 41 43 45 3a 20 7b 0a 20 20 20 20 69 66  _TRACE: {.    if
e030: 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20  ( objc>3 ){.    
e040: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
e050: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
e060: 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22  jv, "?CALLBACK?"
e070: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
e080: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
e090: 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32  else if( objc==2
e0a0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44   ){.      if( pD
e0b0: 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20 20  b->zTrace ){.   
e0c0: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
e0d0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44  esult(interp, pD
e0e0: 62 2d 3e 7a 54 72 61 63 65 2c 20 30 29 3b 0a 20  b->zTrace, 0);. 
e0f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
e100: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54  {.      char *zT
e110: 72 61 63 65 3b 0a 20 20 20 20 20 20 69 6e 74 20  race;.      int 
e120: 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70  len;.      if( p
e130: 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20  Db->zTrace ){.  
e140: 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70        Tcl_Free(p
e150: 44 62 2d 3e 7a 54 72 61 63 65 29 3b 0a 20 20 20  Db->zTrace);.   
e160: 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 72 61 63     }.      zTrac
e170: 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
e180: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
e190: 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69  , &len);.      i
e1a0: 66 28 20 7a 54 72 61 63 65 20 26 26 20 6c 65 6e  f( zTrace && len
e1b0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  >0 ){.        pD
e1c0: 62 2d 3e 7a 54 72 61 63 65 20 3d 20 54 63 6c 5f  b->zTrace = Tcl_
e1d0: 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29  Alloc( len + 1 )
e1e0: 3b 0a 20 20 20 20 20 20 20 20 73 74 72 63 70 79  ;.        strcpy
e1f0: 28 70 44 62 2d 3e 7a 54 72 61 63 65 2c 20 7a 54  (pDb->zTrace, zT
e200: 72 61 63 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  race);.      }el
e210: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  se{.        pDb-
e220: 3e 7a 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 20  >zTrace = 0;.   
e230: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
e240: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20  ITE_OMIT_TRACE. 
e250: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54       if( pDb->zT
e260: 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  race ){.        
e270: 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e  pDb->interp = in
e280: 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71  terp;.        sq
e290: 6c 69 74 65 33 5f 74 72 61 63 65 28 70 44 62 2d  lite3_trace(pDb-
e2a0: 3e 64 62 2c 20 44 62 54 72 61 63 65 48 61 6e 64  >db, DbTraceHand
e2b0: 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20  ler, pDb);.     
e2c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e2d0: 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28 70 44  sqlite3_trace(pD
e2e0: 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  b->db, 0, 0);.  
e2f0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
e300: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
e310: 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 74  }..  /*    $db t
e320: 72 61 6e 73 61 63 74 69 6f 6e 20 5b 2d 64 65 66  ransaction [-def
e330: 65 72 72 65 64 7c 2d 69 6d 6d 65 64 69 61 74 65  erred|-immediate
e340: 7c 2d 65 78 63 6c 75 73 69 76 65 5d 20 53 43 52  |-exclusive] SCR
e350: 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 74  IPT.  **.  ** St
e360: 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61  art a new transa
e370: 63 74 69 6f 6e 20 28 69 66 20 77 65 20 61 72 65  ction (if we are
e380: 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20   not already in 
e390: 74 68 65 20 6d 69 64 73 74 20 6f 66 20 61 0a 20  the midst of a. 
e3a0: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 29   ** transaction)
e3b0: 20 61 6e 64 20 65 78 65 63 75 74 65 20 74 68 65   and execute the
e3c0: 20 54 43 4c 20 73 63 72 69 70 74 20 53 43 52 49   TCL script SCRI
e3d0: 50 54 2e 20 20 41 66 74 65 72 20 53 43 52 49 50  PT.  After SCRIP
e3e0: 54 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 73  T.  ** completes
e3f0: 2c 20 65 69 74 68 65 72 20 63 6f 6d 6d 69 74 20  , either commit 
e400: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
e410: 6f 72 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20  or roll it back 
e420: 69 66 20 53 43 52 49 50 54 0a 20 20 2a 2a 20 74  if SCRIPT.  ** t
e430: 68 72 6f 77 73 20 61 6e 20 65 78 63 65 70 74 69  hrows an excepti
e440: 6f 6e 2e 20 20 4f 72 20 69 66 20 6e 6f 20 6e 65  on.  Or if no ne
e450: 77 20 74 72 61 6e 73 61 74 69 6f 6e 20 77 61 73  w transation was
e460: 20 73 74 61 72 74 65 64 2c 20 64 6f 20 6e 6f 74   started, do not
e470: 68 69 6e 67 2e 0a 20 20 2a 2a 20 70 61 73 73 20  hing..  ** pass 
e480: 74 68 65 20 65 78 63 65 70 74 69 6f 6e 20 6f 6e  the exception on
e490: 20 75 70 20 74 68 65 20 73 74 61 63 6b 2e 0a 20   up the stack.. 
e4a0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63 6f   **.  ** This co
e4b0: 6d 6d 61 6e 64 20 77 61 73 20 69 6e 73 70 69 72  mmand was inspir
e4c0: 65 64 20 62 79 20 44 61 76 65 20 54 68 6f 6d 61  ed by Dave Thoma
e4d0: 73 27 73 20 74 61 6c 6b 20 6f 6e 20 52 75 62 79  s's talk on Ruby
e4e0: 20 61 74 20 74 68 65 0a 20 20 2a 2a 20 32 30 30   at the.  ** 200
e4f0: 35 20 4f 27 52 65 69 6c 6c 79 20 4f 70 65 6e 20  5 O'Reilly Open 
e500: 53 6f 75 72 63 65 20 43 6f 6e 76 65 6e 74 69 6f  Source Conventio
e510: 6e 20 28 4f 53 43 4f 4e 29 2e 0a 20 20 2a 2f 0a  n (OSCON)..  */.
e520: 20 20 63 61 73 65 20 44 42 5f 54 52 41 4e 53 41    case DB_TRANSA
e530: 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 69 6e 74  CTION: {.    int
e540: 20 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 54 63   inTrans;.    Tc
e550: 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 0a  l_Obj *pScript;.
e560: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
e570: 7a 42 65 67 69 6e 20 3d 20 22 42 45 47 49 4e 22  zBegin = "BEGIN"
e580: 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
e590: 33 20 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a  3 && objc!=4 ){.
e5a0: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
e5b0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
e5c0: 2c 20 6f 62 6a 76 2c 20 22 5b 54 59 50 45 5d 20  , objv, "[TYPE] 
e5d0: 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20  SCRIPT");.      
e5e0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
e5f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
e600: 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20  objc==3 ){.     
e610: 20 70 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b   pScript = objv[
e620: 32 5d 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  2];.    } else {
e630: 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
e640: 6e 73 74 20 63 68 61 72 20 2a 54 54 59 50 45 5f  nst char *TTYPE_
e650: 73 74 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  strs[] = {.     
e660: 20 20 20 22 64 65 66 65 72 72 65 64 22 2c 20 20     "deferred",  
e670: 20 22 65 78 63 6c 75 73 69 76 65 22 2c 20 20 22   "exclusive",  "
e680: 69 6d 6d 65 64 69 61 74 65 22 2c 20 30 0a 20 20  immediate", 0.  
e690: 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 65 6e 75      };.      enu
e6a0: 6d 20 54 54 59 50 45 5f 65 6e 75 6d 20 7b 0a 20  m TTYPE_enum {. 
e6b0: 20 20 20 20 20 20 20 54 54 59 50 45 5f 44 45 46         TTYPE_DEF
e6c0: 45 52 52 45 44 2c 20 54 54 59 50 45 5f 45 58 43  ERRED, TTYPE_EXC
e6d0: 4c 55 53 49 56 45 2c 20 54 54 59 50 45 5f 49 4d  LUSIVE, TTYPE_IM
e6e0: 4d 45 44 49 41 54 45 0a 20 20 20 20 20 20 7d 3b  MEDIATE.      };
e6f0: 0a 20 20 20 20 20 20 69 6e 74 20 74 74 79 70 65  .      int ttype
e700: 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f  ;.      if( Tcl_
e710: 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28  GetIndexFromObj(
e720: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
e730: 20 54 54 59 50 45 5f 73 74 72 73 2c 20 22 74 72   TTYPE_strs, "tr
e740: 61 6e 73 61 63 74 69 6f 6e 20 74 79 70 65 22 2c  ansaction type",
e750: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
e770: 2c 20 26 74 74 79 70 65 29 20 29 7b 0a 20 20 20  , &ttype) ){.   
e780: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
e790: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
e7a0: 20 20 20 20 20 73 77 69 74 63 68 28 20 28 65 6e       switch( (en
e7b0: 75 6d 20 54 54 59 50 45 5f 65 6e 75 6d 29 74 74  um TTYPE_enum)tt
e7c0: 79 70 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ype ){.        c
e7d0: 61 73 65 20 54 54 59 50 45 5f 44 45 46 45 52 52  ase TTYPE_DEFERR
e7e0: 45 44 3a 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20  ED:    /* no-op 
e7f0: 2a 2f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  */;             
e800: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
e810: 20 20 20 63 61 73 65 20 54 54 59 50 45 5f 45 58     case TTYPE_EX
e820: 43 4c 55 53 49 56 45 3a 20 20 20 7a 42 65 67 69  CLUSIVE:   zBegi
e830: 6e 20 3d 20 22 42 45 47 49 4e 20 45 58 43 4c 55  n = "BEGIN EXCLU
e840: 53 49 56 45 22 3b 20 20 62 72 65 61 6b 3b 0a 20  SIVE";  break;. 
e850: 20 20 20 20 20 20 20 63 61 73 65 20 54 54 59 50         case TTYP
e860: 45 5f 49 4d 4d 45 44 49 41 54 45 3a 20 20 20 7a  E_IMMEDIATE:   z
e870: 42 65 67 69 6e 20 3d 20 22 42 45 47 49 4e 20 49  Begin = "BEGIN I
e880: 4d 4d 45 44 49 41 54 45 22 3b 20 20 62 72 65 61  MMEDIATE";  brea
e890: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
e8a0: 20 70 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b   pScript = objv[
e8b0: 33 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e  3];.    }.    in
e8c0: 54 72 61 6e 73 20 3d 20 21 73 71 6c 69 74 65 33  Trans = !sqlite3
e8d0: 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28  _get_autocommit(
e8e0: 70 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20 69 66  pDb->db);.    if
e8f0: 28 20 21 69 6e 54 72 61 6e 73 20 29 7b 0a 20 20  ( !inTrans ){.  
e900: 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65      (void)sqlite
e910: 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20  3_exec(pDb->db, 
e920: 7a 42 65 67 69 6e 2c 20 30 2c 20 30 2c 20 30 29  zBegin, 0, 0, 0)
e930: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
e940: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69   Tcl_EvalObjEx(i
e950: 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20  nterp, pScript, 
e960: 30 29 3b 0a 20 20 20 20 69 66 28 20 21 69 6e 54  0);.    if( !inT
e970: 72 61 6e 73 20 29 7b 0a 20 20 20 20 20 20 63 6f  rans ){.      co
e980: 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e 64 3b 0a  nst char *zEnd;.
e990: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43        if( rc==TC
e9a0: 4c 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20  L_ERROR ){.     
e9b0: 20 20 20 7a 45 6e 64 20 3d 20 22 52 4f 4c 4c 42     zEnd = "ROLLB
e9c0: 41 43 4b 22 3b 0a 20 20 20 20 20 20 7d 20 65 6c  ACK";.      } el
e9d0: 73 65 20 7b 0a 20 20 20 20 20 20 20 20 7a 45 6e  se {.        zEn
e9e0: 64 20 3d 20 22 43 4f 4d 4d 49 54 22 3b 0a 20 20  d = "COMMIT";.  
e9f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 28 76 6f 69      }.      (voi
ea00: 64 29 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  d)sqlite3_exec(p
ea10: 44 62 2d 3e 64 62 2c 20 7a 45 6e 64 2c 20 30 2c  Db->db, zEnd, 0,
ea20: 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
ea30: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
ea40: 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 75  /*.  **    $db u
ea50: 70 64 61 74 65 5f 68 6f 6f 6b 20 3f 73 63 72 69  pdate_hook ?scri
ea60: 70 74 3f 0a 20 20 2a 2a 20 20 20 20 24 64 62 20  pt?.  **    $db 
ea70: 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 20 3f 73  rollback_hook ?s
ea80: 63 72 69 70 74 3f 0a 20 20 2a 2f 0a 20 20 63 61  cript?.  */.  ca
ea90: 73 65 20 44 42 5f 55 50 44 41 54 45 5f 48 4f 4f  se DB_UPDATE_HOO
eaa0: 4b 3a 20 0a 20 20 63 61 73 65 20 44 42 5f 52 4f  K: .  case DB_RO
eab0: 4c 4c 42 41 43 4b 5f 48 4f 4f 4b 3a 20 7b 0a 0a  LLBACK_HOOK: {..
eac0: 20 20 20 20 2f 2a 20 73 65 74 20 70 70 48 6f 6f      /* set ppHoo
ead0: 6b 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 70 55  k to point at pU
eae0: 70 64 61 74 65 48 6f 6f 6b 20 6f 72 20 70 52 6f  pdateHook or pRo
eaf0: 6c 6c 62 61 63 6b 48 6f 6f 6b 2c 20 64 65 70 65  llbackHook, depe
eb00: 6e 64 69 6e 67 20 6f 6e 20 0a 20 20 20 20 2a 2a  nding on .    **
eb10: 20 77 68 65 74 68 65 72 20 5b 24 64 62 20 75 70   whether [$db up
eb20: 64 61 74 65 5f 68 6f 6f 6b 5d 20 6f 72 20 5b 24  date_hook] or [$
eb30: 64 62 20 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b  db rollback_hook
eb40: 5d 20 77 61 73 20 69 6e 76 6f 6b 65 64 2e 0a 20  ] was invoked.. 
eb50: 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62     */.    Tcl_Ob
eb60: 6a 20 2a 2a 70 70 48 6f 6f 6b 3b 20 0a 20 20 20  j **ppHook; .   
eb70: 20 69 66 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f   if( choice==DB_
eb80: 55 50 44 41 54 45 5f 48 4f 4f 4b 20 29 7b 0a 20  UPDATE_HOOK ){. 
eb90: 20 20 20 20 20 70 70 48 6f 6f 6b 20 3d 20 26 70       ppHook = &p
eba0: 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 3b  Db->pUpdateHook;
ebb0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
ebc0: 20 20 70 70 48 6f 6f 6b 20 3d 20 26 70 44 62 2d    ppHook = &pDb-
ebd0: 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3b 0a  >pRollbackHook;.
ebe0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f      }..    if( o
ebf0: 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d  bjc!=2 && objc!=
ec00: 33 20 29 7b 0a 20 20 20 20 20 20 20 54 63 6c 5f  3 ){.       Tcl_
ec10: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
ec20: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f  erp, 2, objv, "?
ec30: 53 43 52 49 50 54 3f 22 29 3b 0a 20 20 20 20 20  SCRIPT?");.     
ec40: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
ec50: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
ec60: 28 20 2a 70 70 48 6f 6f 6b 20 29 7b 0a 20 20 20  ( *ppHook ){.   
ec70: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
ec80: 75 6c 74 28 69 6e 74 65 72 70 2c 20 2a 70 70 48  ult(interp, *ppH
ec90: 6f 6f 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ook);.      if( 
eca0: 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20  objc==3 ){.     
ecb0: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
ecc0: 75 6e 74 28 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20  unt(*ppHook);.  
ecd0: 20 20 20 20 20 20 2a 70 70 48 6f 6f 6b 20 3d 20        *ppHook = 
ece0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
ecf0: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33  .    if( objc==3
ed00: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
ed10: 28 20 21 28 2a 70 70 48 6f 6f 6b 29 20 29 3b 0a  ( !(*ppHook) );.
ed20: 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65        if( Tcl_Ge
ed30: 74 43 68 61 72 4c 65 6e 67 74 68 28 6f 62 6a 76  tCharLength(objv
ed40: 5b 32 5d 29 3e 30 20 29 7b 0a 20 20 20 20 20 20  [2])>0 ){.      
ed50: 20 20 2a 70 70 48 6f 6f 6b 20 3d 20 6f 62 6a 76    *ppHook = objv
ed60: 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20 54 63 6c  [2];.        Tcl
ed70: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 2a 70  _IncrRefCount(*p
ed80: 70 48 6f 6f 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  pHook);.      }.
ed90: 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74      }..    sqlit
eda0: 65 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28 70  e3_update_hook(p
edb0: 44 62 2d 3e 64 62 2c 20 28 70 44 62 2d 3e 70 55  Db->db, (pDb->pU
edc0: 70 64 61 74 65 48 6f 6f 6b 3f 44 62 55 70 64 61  pdateHook?DbUpda
edd0: 74 65 48 61 6e 64 6c 65 72 3a 30 29 2c 20 70 44  teHandler:0), pD
ede0: 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  b);.    sqlite3_
edf0: 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28 70 44  rollback_hook(pD
ee00: 62 2d 3e 64 62 2c 28 70 44 62 2d 3e 70 52 6f 6c  b->db,(pDb->pRol
ee10: 6c 62 61 63 6b 48 6f 6f 6b 3f 44 62 52 6f 6c 6c  lbackHook?DbRoll
ee20: 62 61 63 6b 48 61 6e 64 6c 65 72 3a 30 29 2c 70  backHandler:0),p
ee30: 44 62 29 3b 0a 0a 20 20 20 20 62 72 65 61 6b 3b  Db);..    break;
ee40: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
ee50: 62 20 76 65 72 73 69 6f 6e 0a 20 20 2a 2a 0a 20  b version.  **. 
ee60: 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76   ** Return the v
ee70: 65 72 73 69 6f 6e 20 73 74 72 69 6e 67 20 66 6f  ersion string fo
ee80: 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65 2e  r this database.
ee90: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
eea0: 56 45 52 53 49 4f 4e 3a 20 7b 0a 20 20 20 20 54  VERSION: {.    T
eeb0: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
eec0: 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c  erp, (char *)sql
eed0: 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28  ite3_libversion(
eee0: 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  ), TCL_STATIC);.
eef0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
ef00: 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 6f 66 20 74  .  } /* End of t
ef10: 68 65 20 53 57 49 54 43 48 20 73 74 61 74 65 6d  he SWITCH statem
ef20: 65 6e 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ent */.  return 
ef30: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 73  rc;.}../*.**   s
ef40: 71 6c 69 74 65 33 20 44 42 4e 41 4d 45 20 46 49  qlite3 DBNAME FI
ef50: 4c 45 4e 41 4d 45 20 3f 4d 4f 44 45 3f 20 3f 2d  LENAME ?MODE? ?-
ef60: 6b 65 79 20 4b 45 59 3f 0a 2a 2a 0a 2a 2a 20 54  key KEY?.**.** T
ef70: 68 69 73 20 69 73 20 74 68 65 20 6d 61 69 6e 20  his is the main 
ef80: 54 63 6c 20 63 6f 6d 6d 61 6e 64 2e 20 20 57 68  Tcl command.  Wh
ef90: 65 6e 20 74 68 65 20 22 73 71 6c 69 74 65 22 20  en the "sqlite" 
efa0: 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a  Tcl command is.*
efb0: 2a 20 69 6e 76 6f 6b 65 64 2c 20 74 68 69 73 20  * invoked, this 
efc0: 72 6f 75 74 69 6e 65 20 72 75 6e 73 20 74 6f 20  routine runs to 
efd0: 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 6f 6d  process that com
efe0: 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  mand..**.** The 
eff0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2c 20  first argument, 
f000: 44 42 4e 41 4d 45 2c 20 69 73 20 61 6e 20 61 72  DBNAME, is an ar
f010: 62 69 74 72 61 72 79 20 6e 61 6d 65 20 66 6f 72  bitrary name for
f020: 20 61 20 6e 65 77 0a 2a 2a 20 64 61 74 61 62 61   a new.** databa
f030: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20  se connection.  
f040: 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 63 72 65  This command cre
f050: 61 74 65 73 20 61 20 6e 65 77 20 63 6f 6d 6d 61  ates a new comma
f060: 6e 64 20 6e 61 6d 65 64 0a 2a 2a 20 44 42 4e 41  nd named.** DBNA
f070: 4d 45 20 74 68 61 74 20 69 73 20 75 73 65 64 20  ME that is used 
f080: 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 61 74 20  to control that 
f090: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 54 68 65  connection.  The
f0a0: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e   database.** con
f0b0: 6e 65 63 74 69 6f 6e 20 69 73 20 64 65 6c 65 74  nection is delet
f0c0: 65 64 20 77 68 65 6e 20 74 68 65 20 44 42 4e 41  ed when the DBNA
f0d0: 4d 45 20 63 6f 6d 6d 61 6e 64 20 69 73 20 64 65  ME command is de
f0e0: 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  leted..**.** The
f0f0: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
f100: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
f110: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 68  the directory th
f120: 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74  at contains.** t
f130: 68 65 20 73 71 6c 69 74 65 20 64 61 74 61 62 61  he sqlite databa
f140: 73 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65  se that is to be
f150: 20 61 63 63 65 73 73 65 64 2e 0a 2a 2a 0a 2a 2a   accessed..**.**
f160: 20 46 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72   For testing pur
f170: 70 6f 73 65 73 2c 20 77 65 20 61 6c 73 6f 20 73  poses, we also s
f180: 75 70 70 6f 72 74 20 74 68 65 20 66 6f 6c 6c 6f  upport the follo
f190: 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 73 71 6c  wing:.**.**  sql
f1a0: 69 74 65 33 20 2d 65 6e 63 6f 64 69 6e 67 0a 2a  ite3 -encoding.*
f1b0: 2a 0a 2a 2a 20 20 20 20 20 20 20 52 65 74 75 72  *.**       Retur
f1c0: 6e 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 75  n the encoding u
f1d0: 73 65 64 20 62 79 20 4c 49 4b 45 20 61 6e 64 20  sed by LIKE and 
f1e0: 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 73 2e 20  GLOB operators. 
f1f0: 20 43 68 6f 69 63 65 73 0a 2a 2a 20 20 20 20 20   Choices.**     
f200: 20 20 61 72 65 20 55 54 46 2d 38 20 61 6e 64 20    are UTF-8 and 
f210: 69 73 6f 38 38 35 39 2e 0a 2a 2a 0a 2a 2a 20 20  iso8859..**.**  
f220: 73 71 6c 69 74 65 33 20 2d 76 65 72 73 69 6f 6e  sqlite3 -version
f230: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 52 65 74  .**.**       Ret
f240: 75 72 6e 20 74 68 65 20 76 65 72 73 69 6f 6e 20  urn the version 
f250: 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 53 51  number of the SQ
f260: 4c 69 74 65 20 6c 69 62 72 61 72 79 2e 0a 2a 2a  Lite library..**
f270: 0a 2a 2a 20 20 73 71 6c 69 74 65 33 20 2d 74 63  .**  sqlite3 -tc
f280: 6c 2d 75 73 65 73 2d 75 74 66 0a 2a 2a 0a 2a 2a  l-uses-utf.**.**
f290: 20 20 20 20 20 20 20 52 65 74 75 72 6e 20 22 31         Return "1
f2a0: 22 20 69 66 20 63 6f 6d 70 69 6c 65 64 20 77 69  " if compiled wi
f2b0: 74 68 20 61 20 54 63 6c 20 75 73 65 73 20 55 54  th a Tcl uses UT
f2c0: 46 2d 38 2e 20 20 52 65 74 75 72 6e 20 22 30 22  F-8.  Return "0"
f2d0: 20 69 66 0a 2a 2a 20 20 20 20 20 20 20 6e 6f 74   if.**       not
f2e0: 2e 20 20 55 73 65 64 20 62 79 20 74 65 73 74 73  .  Used by tests
f2f0: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
f300: 65 20 6c 69 62 72 61 72 79 20 77 61 73 20 63 6f  e library was co
f310: 6d 70 69 6c 65 64 20 0a 2a 2a 20 20 20 20 20 20  mpiled .**      
f320: 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73   correctly..*/.s
f330: 74 61 74 69 63 20 69 6e 74 20 44 62 4d 61 69 6e  tatic int DbMain
f340: 28 76 6f 69 64 20 2a 63 64 2c 20 54 63 6c 5f 49  (void *cd, Tcl_I
f350: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
f360: 6e 74 20 6f 62 6a 63 2c 54 63 6c 5f 4f 62 6a 20  nt objc,Tcl_Obj 
f370: 2a 63 6f 6e 73 74 2a 6f 62 6a 76 29 7b 0a 20 20  *const*objv){.  
f380: 53 71 6c 69 74 65 44 62 20 2a 70 3b 0a 20 20 76  SqliteDb *p;.  v
f390: 6f 69 64 20 2a 70 4b 65 79 20 3d 20 30 3b 0a 20  oid *pKey = 0;. 
f3a0: 20 69 6e 74 20 6e 4b 65 79 20 3d 20 30 3b 0a 20   int nKey = 0;. 
f3b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
f3c0: 67 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  g;.  char *zErrM
f3d0: 73 67 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  sg;.  const char
f3e0: 20 2a 7a 46 69 6c 65 3b 0a 20 20 54 63 6c 5f 44   *zFile;.  Tcl_D
f3f0: 53 74 72 69 6e 67 20 74 72 61 6e 73 6c 61 74 65  String translate
f400: 64 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 69 66 28  dFilename;.  if(
f410: 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20   objc==2 ){.    
f420: 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74  zArg = Tcl_GetSt
f430: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
f440: 5b 31 5d 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  [1], 0);.    if(
f450: 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 76   strcmp(zArg,"-v
f460: 65 72 73 69 6f 6e 22 29 3d 3d 30 20 29 7b 0a 20  ersion")==0 ){. 
f470: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
f480: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 73 71 6c  esult(interp,sql
f490: 69 74 65 33 5f 76 65 72 73 69 6f 6e 2c 30 29 3b  ite3_version,0);
f4a0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
f4b0: 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  L_OK;.    }.    
f4c0: 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c  if( strcmp(zArg,
f4d0: 22 2d 68 61 73 2d 63 6f 64 65 63 22 29 3d 3d 30  "-has-codec")==0
f4e0: 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
f4f0: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20  E_HAS_CODEC.    
f500: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
f510: 6c 74 28 69 6e 74 65 72 70 2c 22 31 22 2c 30 29  lt(interp,"1",0)
f520: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 54 63  ;.#else.      Tc
f530: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
f540: 6e 74 65 72 70 2c 22 30 22 2c 30 29 3b 0a 23 65  nterp,"0",0);.#e
f550: 6e 64 69 66 0a 20 20 20 20 20 20 72 65 74 75 72  ndif.      retur
f560: 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  n TCL_OK;.    }.
f570: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
f580: 41 72 67 2c 22 2d 74 63 6c 2d 75 73 65 73 2d 75  Arg,"-tcl-uses-u
f590: 74 66 22 29 3d 3d 30 20 29 7b 0a 23 69 66 64 65  tf")==0 ){.#ifde
f5a0: 66 20 54 43 4c 5f 55 54 46 5f 4d 41 58 0a 20 20  f TCL_UTF_MAX.  
f5b0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
f5c0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 31 22 2c  sult(interp,"1",
f5d0: 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  0);.#else.      
f5e0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
f5f0: 28 69 6e 74 65 72 70 2c 22 30 22 2c 30 29 3b 0a  (interp,"0",0);.
f600: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 65 74  #endif.      ret
f610: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20  urn TCL_OK;.    
f620: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63  }.  }.  if( objc
f630: 3d 3d 35 20 7c 7c 20 6f 62 6a 63 3d 3d 36 20 29  ==5 || objc==6 )
f640: 7b 0a 20 20 20 20 7a 41 72 67 20 3d 20 54 63 6c  {.    zArg = Tcl
f650: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
f660: 6a 28 6f 62 6a 76 5b 6f 62 6a 63 2d 32 5d 2c 20  j(objv[objc-2], 
f670: 30 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63  0);.    if( strc
f680: 6d 70 28 7a 41 72 67 2c 22 2d 6b 65 79 22 29 3d  mp(zArg,"-key")=
f690: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4b 65 79  =0 ){.      pKey
f6a0: 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72   = Tcl_GetByteAr
f6b0: 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  rayFromObj(objv[
f6c0: 6f 62 6a 63 2d 31 5d 2c 20 26 6e 4b 65 79 29 3b  objc-1], &nKey);
f6d0: 0a 20 20 20 20 20 20 6f 62 6a 63 20 2d 3d 20 32  .      objc -= 2
f6e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
f6f0: 28 20 6f 62 6a 63 21 3d 33 20 26 26 20 6f 62 6a  ( objc!=3 && obj
f700: 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=4 ){.    Tcl_
f710: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
f720: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 0a 23  erp, 1, objv, .#
f730: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
f740: 5f 43 4f 44 45 43 0a 20 20 20 20 20 20 22 48 41  _CODEC.      "HA
f750: 4e 44 4c 45 20 46 49 4c 45 4e 41 4d 45 20 3f 2d  NDLE FILENAME ?-
f760: 6b 65 79 20 43 4f 44 45 43 2d 4b 45 59 3f 22 0a  key CODEC-KEY?".
f770: 23 65 6c 73 65 0a 20 20 20 20 20 20 22 48 41 4e  #else.      "HAN
f780: 44 4c 45 20 46 49 4c 45 4e 41 4d 45 20 3f 4d 4f  DLE FILENAME ?MO
f790: 44 45 3f 22 0a 23 65 6e 64 69 66 0a 20 20 20 20  DE?".#endif.    
f7a0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
f7b0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a  L_ERROR;.  }.  z
f7c0: 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 20  ErrMsg = 0;.  p 
f7d0: 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 54 63 6c  = (SqliteDb*)Tcl
f7e0: 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  _Alloc( sizeof(*
f7f0: 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  p) );.  if( p==0
f800: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52   ){.    Tcl_SetR
f810: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6d  esult(interp, "m
f820: 61 6c 6c 6f 63 20 66 61 69 6c 65 64 22 2c 20 54  alloc failed", T
f830: 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  CL_STATIC);.    
f840: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
f850: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70  ;.  }.  memset(p
f860: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  , 0, sizeof(*p))
f870: 3b 0a 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f  ;.  zFile = Tcl_
f880: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
f890: 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20  (objv[2], 0);.  
f8a0: 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 54 72 61 6e  zFile = Tcl_Tran
f8b0: 73 6c 61 74 65 46 69 6c 65 4e 61 6d 65 28 69 6e  slateFileName(in
f8c0: 74 65 72 70 2c 20 7a 46 69 6c 65 2c 20 26 74 72  terp, zFile, &tr
f8d0: 61 6e 73 6c 61 74 65 64 46 69 6c 65 6e 61 6d 65  anslatedFilename
f8e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65  );.  sqlite3_ope
f8f0: 6e 28 7a 46 69 6c 65 2c 20 26 70 2d 3e 64 62 29  n(zFile, &p->db)
f900: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46  ;.  Tcl_DStringF
f910: 72 65 65 28 26 74 72 61 6e 73 6c 61 74 65 64 46  ree(&translatedF
f920: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ilename);.  if( 
f930: 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
f940: 65 33 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62  e3_errcode(p->db
f950: 29 20 29 7b 0a 20 20 20 20 7a 45 72 72 4d 73 67  ) ){.    zErrMsg
f960: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
f970: 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33  tf("%s", sqlite3
f980: 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b  _errmsg(p->db));
f990: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f  .    sqlite3_clo
f9a0: 73 65 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 70  se(p->db);.    p
f9b0: 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 7d 0a 23 69  ->db = 0;.  }.#i
f9c0: 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
f9d0: 43 4f 44 45 43 0a 20 20 73 71 6c 69 74 65 33 5f  CODEC.  sqlite3_
f9e0: 6b 65 79 28 70 2d 3e 64 62 2c 20 70 4b 65 79 2c  key(p->db, pKey,
f9f0: 20 6e 4b 65 79 29 3b 0a 23 65 6e 64 69 66 0a 20   nKey);.#endif. 
fa00: 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29 7b   if( p->db==0 ){
fa10: 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
fa20: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72 4d  lt(interp, zErrM
fa30: 73 67 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45  sg, TCL_VOLATILE
fa40: 29 3b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28  );.    Tcl_Free(
fa50: 28 63 68 61 72 2a 29 70 29 3b 0a 20 20 20 20 73  (char*)p);.    s
fa60: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
fa70: 4d 73 67 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Msg);.    return
fa80: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
fa90: 20 20 70 2d 3e 6d 61 78 53 74 6d 74 20 3d 20 4e    p->maxStmt = N
faa0: 55 4d 5f 50 52 45 50 41 52 45 44 5f 53 54 4d 54  UM_PREPARED_STMT
fab0: 53 3b 0a 20 20 70 2d 3e 69 6e 74 65 72 70 20 3d  S;.  p->interp =
fac0: 20 69 6e 74 65 72 70 3b 0a 20 20 7a 41 72 67 20   interp;.  zArg 
fad0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
fae0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20  romObj(objv[1], 
faf0: 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65  0);.  Tcl_Create
fb00: 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
fb10: 70 2c 20 7a 41 72 67 2c 20 44 62 4f 62 6a 43 6d  p, zArg, DbObjCm
fb20: 64 2c 20 28 63 68 61 72 2a 29 70 2c 20 44 62 44  d, (char*)p, DbD
fb30: 65 6c 65 74 65 43 6d 64 29 3b 0a 0a 20 20 2f 2a  eleteCmd);..  /*
fb40: 20 49 66 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   If compiled wit
fb50: 68 20 53 51 4c 49 54 45 5f 54 45 53 54 20 74 75  h SQLITE_TEST tu
fb60: 72 6e 65 64 20 6f 6e 2c 20 74 68 65 6e 20 72 65  rned on, then re
fb70: 67 69 73 74 65 72 20 74 68 65 20 22 6d 64 35 73  gister the "md5s
fb80: 75 6d 22 0a 20 20 2a 2a 20 53 51 4c 20 66 75 6e  um".  ** SQL fun
fb90: 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64  ction..  */.#ifd
fba0: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
fbb0: 20 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 76 6f   {.    extern vo
fbc0: 69 64 20 4d 64 35 5f 52 65 67 69 73 74 65 72 28  id Md5_Register(
fbd0: 73 71 6c 69 74 65 33 2a 29 3b 0a 23 69 66 64 65  sqlite3*);.#ifde
fbe0: 66 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55  f SQLITE_MEMDEBU
fbf0: 47 0a 20 20 20 20 69 6e 74 20 6d 61 6c 6c 6f 63  G.    int malloc
fc00: 66 61 69 6c 20 3d 20 73 71 6c 69 74 65 33 5f 69  fail = sqlite3_i
fc10: 4d 61 6c 6c 6f 63 46 61 69 6c 3b 0a 20 20 20 20  MallocFail;.    
fc20: 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46  sqlite3_iMallocF
fc30: 61 69 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ail = 0;.#endif.
fc40: 20 20 20 20 4d 64 35 5f 52 65 67 69 73 74 65 72      Md5_Register
fc50: 28 70 2d 3e 64 62 29 3b 0a 23 69 66 64 65 66 20  (p->db);.#ifdef 
fc60: 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47 0a  SQLITE_MEMDEBUG.
fc70: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c      sqlite3_iMal
fc80: 6c 6f 63 46 61 69 6c 20 3d 20 6d 61 6c 6c 6f 63  locFail = malloc
fc90: 66 61 69 6c 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  fail;.#endif.  }
fca0: 0a 23 65 6e 64 69 66 20 20 0a 20 20 72 65 74 75  .#endif  .  retu
fcb0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
fcc0: 0a 2a 2a 20 50 72 6f 76 69 64 65 20 61 20 64 75  .** Provide a du
fcd0: 6d 6d 79 20 54 63 6c 5f 49 6e 69 74 53 74 75 62  mmy Tcl_InitStub
fce0: 73 20 69 66 20 77 65 20 61 72 65 20 75 73 69 6e  s if we are usin
fcf0: 67 20 74 68 69 73 20 61 73 20 61 20 73 74 61 74  g this as a stat
fd00: 69 63 0a 2a 2a 20 6c 69 62 72 61 72 79 2e 0a 2a  ic.** library..*
fd10: 2f 0a 23 69 66 6e 64 65 66 20 55 53 45 5f 54 43  /.#ifndef USE_TC
fd20: 4c 5f 53 54 55 42 53 0a 23 20 75 6e 64 65 66 20  L_STUBS.# undef 
fd30: 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 0a 23   Tcl_InitStubs.#
fd40: 20 64 65 66 69 6e 65 20 54 63 6c 5f 49 6e 69 74   define Tcl_Init
fd50: 53 74 75 62 73 28 61 2c 62 2c 63 29 0a 23 65 6e  Stubs(a,b,c).#en
fd60: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  dif../*.** Make 
fd70: 73 75 72 65 20 77 65 20 68 61 76 65 20 61 20 50  sure we have a P
fd80: 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 20 6d  ACKAGE_VERSION m
fd90: 61 63 72 6f 20 64 65 66 69 6e 65 64 2e 20 20 54  acro defined.  T
fda0: 68 69 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64  his will be.** d
fdb0: 65 66 69 6e 65 64 20 61 75 74 6f 6d 61 74 69 63  efined automatic
fdc0: 61 6c 6c 79 20 62 79 20 74 68 65 20 54 45 41 20  ally by the TEA 
fdd0: 6d 61 6b 65 66 69 6c 65 2e 20 20 42 75 74 20 6f  makefile.  But o
fde0: 74 68 65 72 20 6d 61 6b 65 66 69 6c 65 73 0a 2a  ther makefiles.*
fdf0: 2a 20 64 6f 20 6e 6f 74 20 64 65 66 69 6e 65 20  * do not define 
fe00: 69 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 50  it..*/.#ifndef P
fe10: 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 0a 23  ACKAGE_VERSION.#
fe20: 20 64 65 66 69 6e 65 20 50 41 43 4b 41 47 45 5f   define PACKAGE_
fe30: 56 45 52 53 49 4f 4e 20 53 51 4c 49 54 45 5f 56  VERSION SQLITE_V
fe40: 45 52 53 49 4f 4e 0a 23 65 6e 64 69 66 0a 0a 2f  ERSION.#endif../
fe50: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
fe60: 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2a 0a  this module..**.
fe70: 2a 2a 20 54 68 69 73 20 54 63 6c 20 6d 6f 64 75  ** This Tcl modu
fe80: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79  le contains only
fe90: 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 54 63   a single new Tc
fea0: 6c 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64 20  l command named 
feb0: 22 73 71 6c 69 74 65 22 2e 0a 2a 2a 20 28 48 65  "sqlite"..** (He
fec0: 6e 63 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20  nce there is no 
fed0: 6e 61 6d 65 73 70 61 63 65 2e 20 20 54 68 65 72  namespace.  Ther
fee0: 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e  e is no point in
fef0: 20 75 73 69 6e 67 20 61 20 6e 61 6d 65 73 70 61   using a namespa
ff00: 63 65 0a 2a 2a 20 69 66 20 74 68 65 20 65 78 74  ce.** if the ext
ff10: 65 6e 73 69 6f 6e 20 6f 6e 6c 79 20 73 75 70 70  ension only supp
ff20: 6c 69 65 73 20 6f 6e 65 20 6e 65 77 20 6e 61 6d  lies one new nam
ff30: 65 21 29 20 20 54 68 65 20 22 73 71 6c 69 74 65  e!)  The "sqlite
ff40: 22 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20  " command is.** 
ff50: 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 61 20 6e  used to open a n
ff60: 65 77 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ew SQLite databa
ff70: 73 65 2e 20 20 53 65 65 20 74 68 65 20 44 62 4d  se.  See the DbM
ff80: 61 69 6e 28 29 20 72 6f 75 74 69 6e 65 20 61 62  ain() routine ab
ff90: 6f 76 65 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74  ove.** for addit
ffa0: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
ffb0: 6e 2e 0a 2a 2f 0a 45 58 54 45 52 4e 20 69 6e 74  n..*/.EXTERN int
ffc0: 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 54 63   Sqlite3_Init(Tc
ffd0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
ffe0: 29 7b 0a 20 20 54 63 6c 5f 49 6e 69 74 53 74 75  ){.  Tcl_InitStu
fff0: 62 73 28 69 6e 74 65 72 70 2c 20 22 38 2e 34 22  bs(interp, "8.4"
10000 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61  , 0);.  Tcl_Crea
10010 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
10020 65 72 70 2c 20 22 73 71 6c 69 74 65 33 22 2c 20  erp, "sqlite3", 
10030 28 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a  (Tcl_ObjCmdProc*
10040 29 44 62 4d 61 69 6e 2c 20 30 2c 20 30 29 3b 0a  )DbMain, 0, 0);.
10050 20 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65    Tcl_PkgProvide
10060 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
10070 33 22 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53  3", PACKAGE_VERS
10080 49 4f 4e 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61  ION);.  Tcl_Crea
10090 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
100a0 65 72 70 2c 20 22 73 71 6c 69 74 65 22 2c 20 28  erp, "sqlite", (
100b0 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a 29  Tcl_ObjCmdProc*)
100c0 44 62 4d 61 69 6e 2c 20 30 2c 20 30 29 3b 0a 20  DbMain, 0, 0);. 
100d0 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28   Tcl_PkgProvide(
100e0 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 22  interp, "sqlite"
100f0 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f  , PACKAGE_VERSIO
10100 4e 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  N);.  return TCL
10110 5f 4f 4b 3b 0a 7d 0a 45 58 54 45 52 4e 20 69 6e  _OK;.}.EXTERN in
10120 74 20 54 63 6c 73 71 6c 69 74 65 33 5f 49 6e 69  t Tclsqlite3_Ini
10130 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
10140 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 53 71  terp){ return Sq
10150 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72  lite3_Init(inter
10160 70 29 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74  p); }.EXTERN int
10170 20 53 71 6c 69 74 65 33 5f 53 61 66 65 49 6e 69   Sqlite3_SafeIni
10180 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
10190 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 54 43  terp){ return TC
101a0 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e 20 69  L_OK; }.EXTERN i
101b0 6e 74 20 54 63 6c 73 71 6c 69 74 65 33 5f 53 61  nt Tclsqlite3_Sa
101c0 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  feInit(Tcl_Inter
101d0 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75  p *interp){ retu
101e0 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 0a 23 69  rn TCL_OK; }..#i
101f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 33 5f 53  fndef SQLITE_3_S
10200 55 46 46 49 58 5f 4f 4e 4c 59 0a 45 58 54 45 52  UFFIX_ONLY.EXTER
10210 4e 20 69 6e 74 20 53 71 6c 69 74 65 5f 49 6e 69  N int Sqlite_Ini
10220 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
10230 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 53 71  terp){ return Sq
10240 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72  lite3_Init(inter
10250 70 29 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74  p); }.EXTERN int
10260 20 54 63 6c 73 71 6c 69 74 65 5f 49 6e 69 74 28   Tclsqlite_Init(
10270 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
10280 72 70 29 7b 20 72 65 74 75 72 6e 20 53 71 6c 69  rp){ return Sqli
10290 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  te3_Init(interp)
102a0 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 53  ; }.EXTERN int S
102b0 71 6c 69 74 65 5f 53 61 66 65 49 6e 69 74 28 54  qlite_SafeInit(T
102c0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
102d0 70 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  p){ return TCL_O
102e0 4b 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20  K; }.EXTERN int 
102f0 54 63 6c 73 71 6c 69 74 65 5f 53 61 66 65 49 6e  Tclsqlite_SafeIn
10300 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
10310 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 54  nterp){ return T
10320 43 4c 5f 4f 4b 3b 20 7d 0a 23 65 6e 64 69 66 0a  CL_OK; }.#endif.
10330 0a 23 69 66 64 65 66 20 54 43 4c 53 48 0a 2f 2a  .#ifdef TCLSH./*
10340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
10390 54 68 65 20 63 6f 64 65 20 74 68 61 74 20 66 6f  The code that fo
103a0 6c 6c 6f 77 73 20 69 73 20 75 73 65 64 20 74 6f  llows is used to
103b0 20 62 75 69 6c 64 20 73 74 61 6e 64 61 6c 6f 6e   build standalon
103c0 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
103d0 72 73 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  rs.*/../*.** If 
103e0 74 68 65 20 6d 61 63 72 6f 20 54 43 4c 53 48 20  the macro TCLSH 
103f0 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 70 75 74  is one, then put
10400 20 69 6e 20 63 6f 64 65 20 74 68 69 73 20 66 6f   in code this fo
10410 72 20 74 68 65 0a 2a 2a 20 22 6d 61 69 6e 22 20  r the.** "main" 
10420 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c  routine that wil
10430 6c 20 69 6e 69 74 69 61 6c 69 7a 65 20 54 63 6c  l initialize Tcl
10440 20 61 6e 64 20 74 61 6b 65 20 69 6e 70 75 74 20   and take input 
10450 66 72 6f 6d 0a 2a 2a 20 73 74 61 6e 64 61 72 64  from.** standard
10460 20 69 6e 70 75 74 2e 0a 2a 2f 0a 23 69 66 20 54   input..*/.#if T
10470 43 4c 53 48 3d 3d 31 0a 73 74 61 74 69 63 20 63  CLSH==1.static c
10480 68 61 72 20 7a 4d 61 69 6e 6c 6f 6f 70 5b 5d 20  har zMainloop[] 
10490 3d 0a 20 20 22 73 65 74 20 6c 69 6e 65 20 7b 7d  =.  "set line {}
104a0 5c 6e 22 0a 20 20 22 77 68 69 6c 65 20 7b 21 5b  \n".  "while {![
104b0 65 6f 66 20 73 74 64 69 6e 5d 7d 20 7b 5c 6e 22  eof stdin]} {\n"
104c0 0a 20 20 20 20 22 69 66 20 7b 24 6c 69 6e 65 21  .    "if {$line!
104d0 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20 20  =\"\"} {\n".    
104e0 20 20 22 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69    "puts -nonewli
104f0 6e 65 20 5c 22 3e 20 5c 22 5c 6e 22 0a 20 20 20  ne \"> \"\n".   
10500 20 22 7d 20 65 6c 73 65 20 7b 5c 6e 22 0a 20 20   "} else {\n".  
10510 20 20 20 20 22 70 75 74 73 20 2d 6e 6f 6e 65 77      "puts -nonew
10520 6c 69 6e 65 20 5c 22 25 20 5c 22 5c 6e 22 0a 20  line \"% \"\n". 
10530 20 20 20 22 7d 5c 6e 22 0a 20 20 20 20 22 66 6c     "}\n".    "fl
10540 75 73 68 20 73 74 64 6f 75 74 5c 6e 22 0a 20 20  ush stdout\n".  
10550 20 20 22 61 70 70 65 6e 64 20 6c 69 6e 65 20 5b    "append line [
10560 67 65 74 73 20 73 74 64 69 6e 5d 5c 6e 22 0a 20  gets stdin]\n". 
10570 20 20 20 22 69 66 20 7b 5b 69 6e 66 6f 20 63 6f     "if {[info co
10580 6d 70 6c 65 74 65 20 24 6c 69 6e 65 5d 7d 20 7b  mplete $line]} {
10590 5c 6e 22 0a 20 20 20 20 20 20 22 69 66 20 7b 5b  \n".      "if {[
105a0 63 61 74 63 68 20 7b 75 70 6c 65 76 65 6c 20 23  catch {uplevel #
105b0 30 20 24 6c 69 6e 65 7d 20 72 65 73 75 6c 74 5d  0 $line} result]
105c0 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20 22  } {\n".        "
105d0 70 75 74 73 20 73 74 64 65 72 72 20 5c 22 45 72  puts stderr \"Er
105e0 72 6f 72 3a 20 24 72 65 73 75 6c 74 5c 22 5c 6e  ror: $result\"\n
105f0 22 0a 20 20 20 20 20 20 22 7d 20 65 6c 73 65 69  ".      "} elsei
10600 66 20 7b 24 72 65 73 75 6c 74 21 3d 5c 22 5c 22  f {$result!=\"\"
10610 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20 22  } {\n".        "
10620 70 75 74 73 20 24 72 65 73 75 6c 74 5c 6e 22 0a  puts $result\n".
10630 20 20 20 20 20 20 22 7d 5c 6e 22 0a 20 20 20 20        "}\n".    
10640 20 20 22 73 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e    "set line {}\n
10650 22 0a 20 20 20 20 22 7d 20 65 6c 73 65 20 7b 5c  ".    "} else {\
10660 6e 22 0a 20 20 20 20 20 20 22 61 70 70 65 6e 64  n".      "append
10670 20 6c 69 6e 65 20 5c 5c 6e 5c 6e 22 0a 20 20 20   line \\n\n".   
10680 20 22 7d 5c 6e 22 0a 20 20 22 7d 5c 6e 22 0a 3b   "}\n".  "}\n".;
10690 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
106a0 66 20 74 68 65 20 6d 61 63 72 6f 20 54 43 4c 53  f the macro TCLS
106b0 48 20 69 73 20 74 77 6f 2c 20 74 68 65 6e 20 67  H is two, then g
106c0 65 74 20 74 68 65 20 6d 61 69 6e 20 6c 6f 6f 70  et the main loop
106d0 20 63 6f 64 65 20 6f 75 74 20 6f 66 0a 2a 2a 20   code out of.** 
106e0 74 68 65 20 73 65 70 61 72 61 74 65 20 66 69 6c  the separate fil
106f0 65 20 22 73 70 61 63 65 61 6e 61 6c 5f 74 63 6c  e "spaceanal_tcl
10700 2e 68 22 2e 0a 2a 2f 0a 23 69 66 20 54 43 4c 53  .h"..*/.#if TCLS
10710 48 3d 3d 32 0a 73 74 61 74 69 63 20 63 68 61 72  H==2.static char
10720 20 7a 4d 61 69 6e 6c 6f 6f 70 5b 5d 20 3d 20 0a   zMainloop[] = .
10730 23 69 6e 63 6c 75 64 65 20 22 73 70 61 63 65 61  #include "spacea
10740 6e 61 6c 5f 74 63 6c 2e 68 22 0a 3b 0a 23 65 6e  nal_tcl.h".;.#en
10750 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 54 43 4c  dif..#define TCL
10760 53 48 5f 4d 41 49 4e 20 6d 61 69 6e 20 20 20 2f  SH_MAIN main   /
10770 2a 20 4e 65 65 64 65 64 20 74 6f 20 66 61 6b 65  * Needed to fake
10780 20 6f 75 74 20 6d 6b 74 63 6c 61 70 70 20 2a 2f   out mktclapp */
10790 0a 69 6e 74 20 54 43 4c 53 48 5f 4d 41 49 4e 28  .int TCLSH_MAIN(
107a0 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a  int argc, char *
107b0 2a 61 72 67 76 29 7b 0a 20 20 54 63 6c 5f 49 6e  *argv){.  Tcl_In
107c0 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20  terp *interp;.  
107d0 54 63 6c 5f 46 69 6e 64 45 78 65 63 75 74 61 62  Tcl_FindExecutab
107e0 6c 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69  le(argv[0]);.  i
107f0 6e 74 65 72 70 20 3d 20 54 63 6c 5f 43 72 65 61  nterp = Tcl_Crea
10800 74 65 49 6e 74 65 72 70 28 29 3b 0a 20 20 53 71  teInterp();.  Sq
10810 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72  lite3_Init(inter
10820 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  p);.#ifdef SQLIT
10830 45 5f 54 45 53 54 0a 20 20 7b 0a 20 20 20 20 65  E_TEST.  {.    e
10840 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
10850 74 65 73 74 31 5f 49 6e 69 74 28 54 63 6c 5f 49  test1_Init(Tcl_I
10860 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
10870 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
10880 73 74 32 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  st2_Init(Tcl_Int
10890 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
108a0 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
108b0 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  3_Init(Tcl_Inter
108c0 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
108d0 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 34 5f  int Sqlitetest4_
108e0 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
108f0 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
10900 74 20 53 71 6c 69 74 65 74 65 73 74 35 5f 49 6e  t Sqlitetest5_In
10910 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
10920 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
10930 53 71 6c 69 74 65 74 65 73 74 36 5f 49 6e 69 74  Sqlitetest6_Init
10940 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
10950 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
10960 6c 69 74 65 74 65 73 74 37 5f 49 6e 69 74 28 54  litetest7_Init(T
10970 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
10980 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
10990 74 65 74 65 73 74 38 5f 49 6e 69 74 28 54 63 6c  tetest8_Init(Tcl
109a0 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
109b0 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
109c0 74 65 73 74 39 5f 49 6e 69 74 28 54 63 6c 5f 49  test9_Init(Tcl_I
109d0 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
109e0 65 72 6e 20 69 6e 74 20 4d 64 35 5f 49 6e 69 74  ern int Md5_Init
109f0 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
10a00 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
10a10 6c 69 74 65 74 65 73 74 73 73 65 5f 49 6e 69 74  litetestsse_Init
10a20 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
10a30 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
10a40 6c 69 74 65 74 65 73 74 61 73 79 6e 63 5f 49 6e  litetestasync_In
10a50 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
10a60 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
10a70 53 71 6c 69 74 65 74 65 73 74 74 63 6c 76 61 72  Sqlitetesttclvar
10a80 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
10a90 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
10aa0 6e 74 20 53 71 6c 69 74 65 74 65 73 74 73 63 68  nt Sqlitetestsch
10ab0 65 6d 61 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  ema_Init(Tcl_Int
10ac0 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
10ad0 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
10ae0 5f 61 75 74 6f 65 78 74 5f 49 6e 69 74 28 54 63  _autoext_Init(Tc
10af0 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
10b00 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
10b10 65 74 65 73 74 5f 68 65 78 69 6f 5f 49 6e 69 74  etest_hexio_Init
10b20 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 0a  (Tcl_Interp*);..
10b30 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 31 5f      Sqlitetest1_
10b40 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
10b50 20 20 53 71 6c 69 74 65 74 65 73 74 32 5f 49 6e    Sqlitetest2_In
10b60 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
10b70 53 71 6c 69 74 65 74 65 73 74 33 5f 49 6e 69 74  Sqlitetest3_Init
10b80 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
10b90 6c 69 74 65 74 65 73 74 34 5f 49 6e 69 74 28 69  litetest4_Init(i
10ba0 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
10bb0 74 65 74 65 73 74 35 5f 49 6e 69 74 28 69 6e 74  tetest5_Init(int
10bc0 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
10bd0 74 65 73 74 36 5f 49 6e 69 74 28 69 6e 74 65 72  test6_Init(inter
10be0 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
10bf0 73 74 37 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  st7_Init(interp)
10c00 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
10c10 38 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  8_Init(interp);.
10c20 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 39 5f      Sqlitetest9_
10c30 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
10c40 20 20 53 71 6c 69 74 65 74 65 73 74 61 73 79 6e    Sqlitetestasyn
10c50 63 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  c_Init(interp);.
10c60 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 74 63      Sqlitetesttc
10c70 6c 76 61 72 5f 49 6e 69 74 28 69 6e 74 65 72 70  lvar_Init(interp
10c80 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
10c90 74 73 63 68 65 6d 61 5f 49 6e 69 74 28 69 6e 74  tschema_Init(int
10ca0 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
10cb0 74 65 73 74 5f 61 75 74 6f 65 78 74 5f 49 6e 69  test_autoext_Ini
10cc0 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
10cd0 71 6c 69 74 65 74 65 73 74 5f 68 65 78 69 6f 5f  qlitetest_hexio_
10ce0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
10cf0 20 20 4d 64 35 5f 49 6e 69 74 28 69 6e 74 65 72    Md5_Init(inter
10d00 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  p);.#ifdef SQLIT
10d10 45 5f 53 53 45 0a 20 20 20 20 53 71 6c 69 74 65  E_SSE.    Sqlite
10d20 74 65 73 74 73 73 65 5f 49 6e 69 74 28 69 6e 74  testsse_Init(int
10d30 65 72 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  erp);.#endif.  }
10d40 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 61 72  .#endif.  if( ar
10d50 67 63 3e 3d 32 20 7c 7c 20 54 43 4c 53 48 3d 3d  gc>=2 || TCLSH==
10d60 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  2 ){.    int i;.
10d70 20 20 20 20 63 68 61 72 20 7a 41 72 67 63 5b 33      char zArgc[3
10d80 32 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  2];.    sqlite3_
10d90 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
10da0 7a 41 72 67 63 29 2c 20 7a 41 72 67 63 2c 20 22  zArgc), zArgc, "
10db0 25 64 22 2c 20 61 72 67 63 2d 28 33 2d 54 43 4c  %d", argc-(3-TCL
10dc0 53 48 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  SH));.    Tcl_Se
10dd0 74 56 61 72 28 69 6e 74 65 72 70 2c 22 61 72 67  tVar(interp,"arg
10de0 63 22 2c 20 7a 41 72 67 63 2c 20 54 43 4c 5f 47  c", zArgc, TCL_G
10df0 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20  LOBAL_ONLY);.   
10e00 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65   Tcl_SetVar(inte
10e10 72 70 2c 22 61 72 67 76 30 22 2c 61 72 67 76 5b  rp,"argv0",argv[
10e20 31 5d 2c 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e  1],TCL_GLOBAL_ON
10e30 4c 59 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  LY);.    Tcl_Set
10e40 56 61 72 28 69 6e 74 65 72 70 2c 22 61 72 67 76  Var(interp,"argv
10e50 22 2c 20 22 22 2c 20 54 43 4c 5f 47 4c 4f 42 41  ", "", TCL_GLOBA
10e60 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 66 6f 72  L_ONLY);.    for
10e70 28 69 3d 33 2d 54 43 4c 53 48 3b 20 69 3c 61 72  (i=3-TCLSH; i<ar
10e80 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  gc; i++){.      
10e90 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72  Tcl_SetVar(inter
10ea0 70 2c 20 22 61 72 67 76 22 2c 20 61 72 67 76 5b  p, "argv", argv[
10eb0 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 54 43  i],.          TC
10ec0 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 20 7c 20  L_GLOBAL_ONLY | 
10ed0 54 43 4c 5f 4c 49 53 54 5f 45 4c 45 4d 45 4e 54  TCL_LIST_ELEMENT
10ee0 20 7c 20 54 43 4c 5f 41 50 50 45 4e 44 5f 56 41   | TCL_APPEND_VA
10ef0 4c 55 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  LUE);.    }.    
10f00 69 66 28 20 54 43 4c 53 48 3d 3d 31 20 26 26 20  if( TCLSH==1 && 
10f10 54 63 6c 5f 45 76 61 6c 46 69 6c 65 28 69 6e 74  Tcl_EvalFile(int
10f20 65 72 70 2c 20 61 72 67 76 5b 31 5d 29 21 3d 54  erp, argv[1])!=T
10f30 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 63  CL_OK ){.      c
10f40 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 66 6f  onst char *zInfo
10f50 20 3d 20 54 63 6c 5f 47 65 74 56 61 72 28 69 6e   = Tcl_GetVar(in
10f60 74 65 72 70 2c 20 22 65 72 72 6f 72 49 6e 66 6f  terp, "errorInfo
10f70 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e  ", TCL_GLOBAL_ON
10f80 4c 59 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  LY);.      if( z
10f90 49 6e 66 6f 3d 3d 30 20 29 20 7a 49 6e 66 6f 20  Info==0 ) zInfo 
10fa0 3d 20 69 6e 74 65 72 70 2d 3e 72 65 73 75 6c 74  = interp->result
10fb0 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  ;.      fprintf(
10fc0 73 74 64 65 72 72 2c 22 25 73 3a 20 25 73 5c 6e  stderr,"%s: %s\n
10fd0 22 2c 20 2a 61 72 67 76 2c 20 7a 49 6e 66 6f 29  ", *argv, zInfo)
10fe0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
10ff0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
11000 28 20 61 72 67 63 3c 3d 31 20 7c 7c 20 54 43 4c  ( argc<=1 || TCL
11010 53 48 3d 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  SH==2 ){.    Tcl
11020 5f 47 6c 6f 62 61 6c 45 76 61 6c 28 69 6e 74 65  _GlobalEval(inte
11030 72 70 2c 20 7a 4d 61 69 6e 6c 6f 6f 70 29 3b 0a  rp, zMainloop);.
11040 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
11050 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 54 43 4c 53  }.#endif /* TCLS
11060 48 20 2a 2f 0a                                   H */.